Embedding Ruby code into Slim.
authorAndrey Vokin <andrey.vokin@jetbrains.com>
Wed, 7 May 2014 15:38:02 +0000 (19:38 +0400)
committerAndrey Vokin <andrey.vokin@jetbrains.com>
Thu, 15 May 2014 11:23:20 +0000 (15:23 +0400)
platform/core-impl/src/com/intellij/indentation/IndentationParser.java
platform/core-impl/src/com/intellij/psi/impl/source/resolve/ResolveCache.java

index dc46db89f5f6b3c56ead52eaf5b34631075cfbb7..92b51cb2756538b3f60218c954d13642d38addb1 100644 (file)
@@ -23,6 +23,9 @@ import com.intellij.util.containers.Stack;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @author oleg
  */
@@ -35,17 +38,29 @@ public abstract class IndentationParser implements PsiParser {
   private final IElementType myBlockElementType;
   @NotNull
   private final IElementType myDocumentType;
+  private final List<IElementType> myContainerTypes;
 
   public IndentationParser(
     @NotNull IElementType documentType,
     @NotNull final IElementType blockElementType,
     @NotNull final IElementType eolTokenType,
-    @NotNull final IElementType indentTokenType)
+    @NotNull final IElementType indentTokenType,
+    final List<IElementType> containerTypes)
   {
     myDocumentType = documentType;
     myBlockElementType = blockElementType;
     myEolTokenType = eolTokenType;
     myIndentTokenType = indentTokenType;
+    myContainerTypes = containerTypes;
+  }
+
+  public IndentationParser(
+    @NotNull IElementType documentType,
+    @NotNull final IElementType blockElementType,
+    @NotNull final IElementType eolTokenType,
+    @NotNull final IElementType indentTokenType)
+  {
+    this(documentType, blockElementType, eolTokenType, indentTokenType, null);
   }
 
   @Override
@@ -53,6 +68,13 @@ public abstract class IndentationParser implements PsiParser {
   public final ASTNode parse(final IElementType root, final PsiBuilder builder) {
     final PsiBuilder.Marker fileMarker = builder.mark();
     final PsiBuilder.Marker documentMarker = builder.mark();
+    final ArrayList<PsiBuilder.Marker> containerMarkers = new ArrayList<PsiBuilder.Marker>();
+    if (myContainerTypes != null) {
+      for (IElementType ignored : myContainerTypes) {
+        final PsiBuilder.Marker containerMarker = builder.mark();
+        containerMarkers.add(containerMarker);
+      }
+    }
 
     while (builder.getTokenType() == myEolTokenType) {
       advanceLexer(builder);
@@ -124,6 +146,13 @@ public abstract class IndentationParser implements PsiParser {
       closeBlock(builder, blockInfo.getMarker(), blockInfo.getStartTokenType());
     }
 
+    if (myContainerTypes != null) {
+      for (int i = containerMarkers.size() - 1; i >= 0; i--) {
+        final PsiBuilder.Marker marker = containerMarkers.get(i);
+        marker.done(myContainerTypes.get(i));
+      }
+    }
+
     documentMarker.done(myDocumentType);
     fileMarker.done(root);
     return builder.getTreeBuilt();
index 859a6046957f306507338c6c0519d6ebd96c3962..b3498f317a545e3d9152742f80590ddf98ad392b 100644 (file)
@@ -100,7 +100,7 @@ public class ResolveCache {
     Getter<TResult> reference = map.get(ref);
     TResult result = reference == null ? null : reference.get();
     if (result != null) {
-      return result;
+      //return result;
     }
 
     RecursionGuard.StackStamp stamp = myGuard.markStack();