Reduce allocations in lastDotAfterReceiver (parsing)

This commit is contained in:
Ivan Kochurkin
2022-08-01 00:44:48 +02:00
committed by teamcity
parent cf190f0cf2
commit 1d73d4cfbf
3 changed files with 40 additions and 35 deletions
@@ -40,5 +40,9 @@ public abstract class AbstractTokenStreamPattern implements TokenStreamPattern {
public boolean handleUnmatchedClosing(IElementType token) { public boolean handleUnmatchedClosing(IElementType token) {
return false; return false;
} }
public void reset() {
lastOccurrence = -1;
}
} }
@@ -133,6 +133,33 @@ public class KotlinParsing extends AbstractKotlinParsing {
private KotlinExpressionParsing myExpressionParsing; private KotlinExpressionParsing myExpressionParsing;
private final FirstBefore lastDotAfterReceiverLParPattern = new FirstBefore(
new AtSet(RECEIVER_TYPE_TERMINATORS),
new AbstractTokenStreamPredicate() {
@Override
public boolean matching(boolean topLevel) {
if (topLevel && atSet(definitelyOutOfReceiverSet)) {
return true;
}
return topLevel && !at(QUEST) && !at(LPAR) && !at(RPAR);
}
}
);
private final LastBefore lastDotAfterReceiverNotLParPattern = new LastBefore(
new AtSet(RECEIVER_TYPE_TERMINATORS),
new AbstractTokenStreamPredicate() {
@Override
public boolean matching(boolean topLevel) {
if (topLevel && (atSet(definitelyOutOfReceiverSet) || at(LPAR))) return true;
if (topLevel && at(IDENTIFIER)) {
IElementType lookahead = lookahead(1);
return lookahead != LT && lookahead != DOT && lookahead != SAFE_ACCESS && lookahead != QUEST;
}
return false;
}
});
private KotlinParsing(SemanticWhitespaceAwarePsiBuilder builder) { private KotlinParsing(SemanticWhitespaceAwarePsiBuilder builder) {
super(builder); super(builder);
} }
@@ -1848,41 +1875,9 @@ public class KotlinParsing extends AbstractKotlinParsing {
} }
private int lastDotAfterReceiver() { private int lastDotAfterReceiver() {
if (at(LPAR)) { AbstractTokenStreamPattern pattern = at(LPAR) ? lastDotAfterReceiverLParPattern : lastDotAfterReceiverNotLParPattern;
return matchTokenStreamPredicate( pattern.reset();
new FirstBefore( return matchTokenStreamPredicate(pattern);
new AtSet(RECEIVER_TYPE_TERMINATORS),
new AbstractTokenStreamPredicate() {
@Override
public boolean matching(boolean topLevel) {
if (topLevel && definitelyOutOfReceiver()) {
return true;
}
return topLevel && !at(QUEST) && !at(LPAR) && !at(RPAR);
}
}
));
}
else {
return matchTokenStreamPredicate(
new LastBefore(
new AtSet(RECEIVER_TYPE_TERMINATORS),
new AbstractTokenStreamPredicate() {
@Override
public boolean matching(boolean topLevel) {
if (topLevel && (definitelyOutOfReceiver() || at(LPAR))) return true;
if (topLevel && at(IDENTIFIER)) {
IElementType lookahead = lookahead(1);
return lookahead != LT && lookahead != DOT && lookahead != SAFE_ACCESS && lookahead != QUEST;
}
return false;
}
}));
}
}
private boolean definitelyOutOfReceiver() {
return atSet(definitelyOutOfReceiverSet);
} }
/* /*
@@ -47,4 +47,10 @@ public class LastBefore extends AbstractTokenStreamPattern {
previousLookForResult = lookForResult; previousLookForResult = lookForResult;
return false; return false;
} }
@Override
public void reset() {
super.reset();
previousLookForResult = false;
}
} }