Reduce allocations in lastDotAfterReceiver (parsing)
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user