mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Pratt cleanup: per-parser registry
This commit is contained in:
@@ -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<IElementType> myLeftSiblings = new LinkedList<IElementType>();
|
||||
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<Integer, PathPattern, TokenParser> trinity : PrattRegistry.getParsers(tokenType)) {
|
||||
for (final Trinity<Integer, PathPattern, TokenParser> trinity : myRegistry.getParsers(tokenType)) {
|
||||
if (trinity.first > myPriority && trinity.second.accepts(this)) {
|
||||
return trinity.third;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -27,18 +27,18 @@ import java.util.Collection;
|
||||
* @author peter
|
||||
*/
|
||||
public class PrattRegistry {
|
||||
private static final MultiMap<IElementType, Trinity<Integer, PathPattern, TokenParser>> ourMap = new MultiMap<IElementType, Trinity<Integer, PathPattern, TokenParser>>();
|
||||
private final MultiMap<IElementType, Trinity<Integer, PathPattern, TokenParser>> myMap = new MultiMap<IElementType, Trinity<Integer, PathPattern, TokenParser>>();
|
||||
|
||||
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<Integer, PathPattern, TokenParser>(priority, pattern, parser));
|
||||
public void registerParser(@NotNull final IElementType type, final int priority, final PathPattern pattern, final TokenParser parser) {
|
||||
myMap.putValue(type, new Trinity<Integer, PathPattern, TokenParser>(priority, pattern, parser));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static Collection<Trinity<Integer, PathPattern, TokenParser>> getParsers(@Nullable final IElementType type) {
|
||||
return ourMap.get(type);
|
||||
public Collection<Trinity<Integer, PathPattern, TokenParser>> getParsers(@Nullable final IElementType type) {
|
||||
return myMap.get(type);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user