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) {
return false;
}
public void reset() {
lastOccurrence = -1;
}
}
@@ -133,6 +133,33 @@ public class KotlinParsing extends AbstractKotlinParsing {
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) {
super(builder);
}
@@ -1848,41 +1875,9 @@ public class KotlinParsing extends AbstractKotlinParsing {
}
private int lastDotAfterReceiver() {
if (at(LPAR)) {
return matchTokenStreamPredicate(
new FirstBefore(
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);
AbstractTokenStreamPattern pattern = at(LPAR) ? lastDotAfterReceiverLParPattern : lastDotAfterReceiverNotLParPattern;
pattern.reset();
return matchTokenStreamPredicate(pattern);
}
/*
@@ -47,4 +47,10 @@ public class LastBefore extends AbstractTokenStreamPattern {
previousLookForResult = lookForResult;
return false;
}
@Override
public void reset() {
super.reset();
previousLookForResult = false;
}
}