diff --git a/platform/lang-impl/src/com/intellij/lang/pratt/PrattBuilderImpl.java b/platform/lang-impl/src/com/intellij/lang/pratt/PrattBuilderImpl.java index 13235e2d2895..50aded773739 100644 --- a/platform/lang-impl/src/com/intellij/lang/pratt/PrattBuilderImpl.java +++ b/platform/lang-impl/src/com/intellij/lang/pratt/PrattBuilderImpl.java @@ -32,21 +32,23 @@ import java.util.List; * @author peter */ public class PrattBuilderImpl extends PrattBuilder { - private final PrattBuilder myParentBuilder; private final PsiBuilder myBuilder; + private final PrattBuilder myParentBuilder; + private final PrattRegistry myRegistry; private final LinkedList myLeftSiblings = new LinkedList(); private boolean myParsingStarted; private String myExpectedMessage; private int myPriority = Integer.MIN_VALUE; private MutableMarker myStartMarker; - private PrattBuilderImpl(final PsiBuilder builder, final PrattBuilder parent) { + private PrattBuilderImpl(final PsiBuilder builder, final PrattBuilder parent, final PrattRegistry registry) { myBuilder = builder; myParentBuilder = parent; + myRegistry = registry; } - public static PrattBuilder createBuilder(final PsiBuilder builder) { - return new PrattBuilderImpl(builder, null); + public static PrattBuilder createBuilder(final PsiBuilder builder, final PrattRegistry registry) { + return new PrattBuilderImpl(builder, null, registry); } public PrattBuilder expecting(final String expectedMessage) { @@ -79,7 +81,7 @@ public class PrattBuilderImpl extends PrattBuilder { protected PrattBuilder createChildBuilder() { assert myParsingStarted; - return new PrattBuilderImpl(myBuilder, this) { + return new PrattBuilderImpl(myBuilder, this, myRegistry) { protected void doParse() { super.doParse(); PrattBuilderImpl.this.myLeftSiblings.addAll(getResultTypes()); @@ -116,7 +118,7 @@ public class PrattBuilderImpl extends PrattBuilder { @Nullable private TokenParser findParser() { final IElementType tokenType = getTokenType(); - for (final Trinity trinity : PrattRegistry.getParsers(tokenType)) { + for (final Trinity trinity : myRegistry.getParsers(tokenType)) { if (trinity.first > myPriority && trinity.second.accepts(this)) { return trinity.third; } diff --git a/platform/lang-impl/src/com/intellij/lang/pratt/PrattParser.java b/platform/lang-impl/src/com/intellij/lang/pratt/PrattParser.java index 29b9e3d467b4..b9c0f57a1126 100644 --- a/platform/lang-impl/src/com/intellij/lang/pratt/PrattParser.java +++ b/platform/lang-impl/src/com/intellij/lang/pratt/PrattParser.java @@ -25,9 +25,11 @@ import org.jetbrains.annotations.NotNull; * @author peter */ public abstract class PrattParser implements PsiParser { + protected abstract PrattRegistry getRegistry(); + @NotNull public final ASTNode parse(final IElementType root, final PsiBuilder builder) { - final PrattBuilder prattBuilder = PrattBuilderImpl.createBuilder(builder); + final PrattBuilder prattBuilder = PrattBuilderImpl.createBuilder(builder, getRegistry()); final MutableMarker marker = prattBuilder.mark(); parse(prattBuilder); marker.finish(root); diff --git a/platform/lang-impl/src/com/intellij/lang/pratt/PrattRegistry.java b/platform/lang-impl/src/com/intellij/lang/pratt/PrattRegistry.java index 0cc3d60b4e8f..f42086b3b4a7 100644 --- a/platform/lang-impl/src/com/intellij/lang/pratt/PrattRegistry.java +++ b/platform/lang-impl/src/com/intellij/lang/pratt/PrattRegistry.java @@ -27,18 +27,18 @@ import java.util.Collection; * @author peter */ public class PrattRegistry { - private static final MultiMap> ourMap = new MultiMap>(); + private final MultiMap> myMap = new MultiMap>(); - public static void registerParser(@NotNull final IElementType type, final int priority, final TokenParser parser) { + public void registerParser(@NotNull final IElementType type, final int priority, final TokenParser parser) { registerParser(type, priority, PathPattern.path(), parser); } - public static void registerParser(@NotNull final IElementType type, final int priority, final PathPattern pattern, final TokenParser parser) { - ourMap.putValue(type, new Trinity(priority, pattern, parser)); + public void registerParser(@NotNull final IElementType type, final int priority, final PathPattern pattern, final TokenParser parser) { + myMap.putValue(type, new Trinity(priority, pattern, parser)); } @NotNull - public static Collection> getParsers(@Nullable final IElementType type) { - return ourMap.get(type); + public Collection> getParsers(@Nullable final IElementType type) { + return myMap.get(type); } }