[fleet] lift missing members to PsiBuilder.Marker interface to reduce the number of downcasts to PsiBuilderImpl

It is needed for fleet-parser-collection to be more compatible with platform code, as it has its own PsiBuilder implementation.
Updates the api dump, however, according to api watcher no harm done.

GitOrigin-RevId: edbbc42a48e406fc8e22295f7b78eadd523b5cf2
This commit is contained in:
Andrey Zaytsev
2024-06-02 15:40:58 +02:00
committed by intellij-monorepo-bot
parent 9b5b7f47f4
commit 9d0a07d90c
8 changed files with 164 additions and 38 deletions

View File

@@ -399,7 +399,7 @@ public class GeneratedParserUtilBase {
}
public static boolean isWhitespaceOrComment(@NotNull PsiBuilder builder, @Nullable IElementType type) {
return ((PsiBuilderImpl)((Builder)builder).getDelegate()).whitespaceOrComment(type);
return builder.isWhitespaceOrComment(type);
}
private static boolean wasAutoSkipped(@NotNull PsiBuilder builder, int steps) {
@@ -550,7 +550,7 @@ public class GeneratedParserUtilBase {
final boolean eatMoreFlagOnce = !builder.eof() && eatMore.parse(builder, frame.level + 1);
boolean eatMoreFlag = eatMoreFlagOnce || !result && frame.position == initialPos && lastErrorPos > frame.position;
PsiBuilderImpl.ProductionMarker latestDoneMarker =
PsiBuilder.Marker latestDoneMarker =
(pinned || result) && (state.altMode || elementType != null) &&
eatMoreFlagOnce ? getLatestExtensibleDoneMarker(builder) : null;
// advance to the last error pos
@@ -638,7 +638,7 @@ public class GeneratedParserUtilBase {
if (elementType != null && marker != null) {
if (result || pinned) {
if ((frame.modifiers & _COLLAPSE_) != 0) {
PsiBuilderImpl.ProductionMarker last = (PsiBuilderImpl.ProductionMarker)builder.getLatestDoneMarker();
PsiBuilder.Marker last = (PsiBuilder.Marker)builder.getLatestDoneMarker();
if (last != null &&
last.getStartIndex() == frame.position &&
state.typeExtends(last.getTokenType(), elementType) &&
@@ -685,9 +685,9 @@ public class GeneratedParserUtilBase {
private static void extend_marker_impl(PsiBuilder.Marker marker) {
PsiBuilder.Marker precede = marker.precede();
IElementType elementType = ((LighterASTNode)marker).getTokenType();
IElementType elementType = marker.getTokenType();
if (elementType == TokenType.ERROR_ELEMENT) {
precede.error(notNullize(PsiBuilderImpl.getErrorMessage((LighterASTNode)marker)));
precede.error(notNullize(marker.getErrorMessage()));
}
else {
precede.done(elementType);
@@ -707,7 +707,7 @@ public class GeneratedParserUtilBase {
}
else {
if (frame != null) {
int position = ((PsiBuilderImpl.ProductionMarker)marker).getStartIndex();
int position = marker.getStartIndex();
if (frame.errorReportedAt > position) {
frame.errorReportedAt = frame.parentFrame == null ? -1 : frame.parentFrame.errorReportedAt;
}
@@ -748,11 +748,10 @@ public class GeneratedParserUtilBase {
}
}
private static @Nullable PsiBuilderImpl.ProductionMarker getLatestExtensibleDoneMarker(@NotNull PsiBuilder builder) {
Builder b = (Builder)builder;
PsiBuilderImpl.ProductionMarker marker = ContainerUtil.getLastItem(b.getProductions());
if (marker == null || ((PsiBuilderImpl)b.getDelegate()).isCollapsed(marker)) return null;
return marker.getTokenType() != null && marker instanceof PsiBuilder.Marker ? marker : null;
private static @Nullable PsiBuilder.Marker getLatestExtensibleDoneMarker(@NotNull PsiBuilder builder) {
SyntaxTreeBuilder.Production marker = ContainerUtil.getLastItem(builder.getProductions());
if (marker == null || marker.isCollapsed()) return null;
return marker.getTokenType() != null && marker instanceof PsiBuilder.Marker ? (PsiBuilder.Marker)marker : null;
}
private static boolean reportError(PsiBuilder builder,
@@ -788,7 +787,7 @@ public class GeneratedParserUtilBase {
mark.error(message);
}
else if (inner) {
PsiBuilderImpl.ProductionMarker latestDoneMarker = getLatestExtensibleDoneMarker(builder);
PsiBuilder.Marker latestDoneMarker = getLatestExtensibleDoneMarker(builder);
builder.error(message);
if (latestDoneMarker != null &&
frame.position >= latestDoneMarker.getStartIndex() &&
@@ -810,8 +809,8 @@ public class GeneratedParserUtilBase {
int pos = builder.rawTokenIndex();
if (frame.errorReportedAt > pos) {
// report error for previous unsuccessful frame
LighterASTNode marker = builder.getLatestDoneMarker();
int endOffset = marker != null ? ((PsiBuilderImpl.ProductionMarker)marker).getEndIndex() : pos + 1;
PsiBuilder.Marker marker = (PsiBuilder.Marker)builder.getLatestDoneMarker();
int endOffset = marker != null ? marker.getEndIndex() : pos + 1;
while (endOffset <= pos && isWhitespaceOrComment(builder, builder.rawLookup(endOffset - pos))) endOffset ++;
boolean inner = endOffset == pos;
builder.eof();
@@ -897,6 +896,7 @@ public class GeneratedParserUtilBase {
return ((PsiBuilderImpl)myDelegate).getLexer();
}
@Override
public @NotNull List<PsiBuilderImpl.ProductionMarker> getProductions() {
return ((PsiBuilderImpl)myDelegate).getProductions();
}

View File

@@ -680,6 +680,7 @@ com.intellij.lang.SyntaxTreeBuilder
- a:getCurrentOffset():I
- a:getLatestDoneMarker():com.intellij.lang.LighterASTNode
- a:getOriginalText():java.lang.CharSequence
- getProductions():java.util.List
- a:getTokenText():java.lang.String
- a:getTokenType():com.intellij.psi.tree.IElementType
- isWhitespaceOrComment(com.intellij.psi.tree.IElementType):Z
@@ -694,6 +695,7 @@ com.intellij.lang.SyntaxTreeBuilder
- a:setTokenTypeRemapper(com.intellij.lang.ITokenTypeRemapper):V
- a:setWhitespaceSkippedCallback(com.intellij.lang.WhitespaceSkippedCallback):V
com.intellij.lang.SyntaxTreeBuilder$Marker
- com.intellij.lang.SyntaxTreeBuilder$Production
- a:collapse(com.intellij.psi.tree.IElementType):V
- a:done(com.intellij.psi.tree.IElementType):V
- a:doneBefore(com.intellij.psi.tree.IElementType,com.intellij.lang.SyntaxTreeBuilder$Marker):V
@@ -704,6 +706,15 @@ com.intellij.lang.SyntaxTreeBuilder$Marker
- a:precede():com.intellij.lang.SyntaxTreeBuilder$Marker
- a:rollbackTo():V
- a:setCustomEdgeTokenBinders(com.intellij.lang.WhitespacesAndCommentsBinder,com.intellij.lang.WhitespacesAndCommentsBinder):V
com.intellij.lang.SyntaxTreeBuilder$Production
- com.intellij.lang.LighterASTNode
- getEndIndex():I
- getEndOffset():I
- getErrorMessage():java.lang.String
- getStartIndex():I
- getStartOffset():I
- getTokenType():com.intellij.psi.tree.IElementType
- isCollapsed():Z
com.intellij.lang.TokenSeparatorGenerator
- a:generateWhitespaceBetweenTokens(com.intellij.lang.ASTNode,com.intellij.lang.ASTNode):com.intellij.lang.ASTNode
c:com.intellij.lang.TreeBackedLighterAST

View File

@@ -8,6 +8,8 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public interface SyntaxTreeBuilder {
/**
* Returns the complete text being parsed.
@@ -161,19 +163,56 @@ public interface SyntaxTreeBuilder {
/**
* @return latest left done node for context dependent parsing.
*/
@Nullable
LighterASTNode getLatestDoneMarker();
@Nullable LighterASTNode getLatestDoneMarker();
@NotNull default List<? extends Production> getProductions() {
throw new UnsupportedOperationException("not implemented for this kind of Builder");
}
default boolean isWhitespaceOrComment(@NotNull IElementType elementType) {
return false;
}
interface Production extends LighterASTNode {
@Override
default IElementType getTokenType() {
throw new UnsupportedOperationException("not implemented for this kind of markers");
}
@Override
default int getStartOffset() {
throw new UnsupportedOperationException("not implemented for this kind of markers");
}
@Override
default int getEndOffset() {
throw new UnsupportedOperationException("not implemented for this kind of markers");
}
default int getStartIndex() {
throw new UnsupportedOperationException("not implemented for this kind of markers");
};
default int getEndIndex() {
throw new UnsupportedOperationException("not implemented for this kind of markers");
}
@NlsContexts.DetailedDescription
@Nullable default String getErrorMessage() {
return null;
};
default boolean isCollapsed() {
return false;
}
}
/**
* A marker defines a range in the document text which becomes a node in the AST
* tree. The ranges defined by markers within the text range of the current marker
* become child nodes of the node defined by the current marker.
*/
interface Marker {
interface Marker extends Production {
/**
* Creates and returns a new marker starting immediately before the start of
* this marker and extending after its end. Can be called on a completed or

View File

@@ -759,7 +759,7 @@ f:com.intellij.lang.WhitespacesBinders
f:com.intellij.lang.folding.NamedFoldingDescriptor
- com.intellij.lang.folding.FoldingDescriptor
- <init>(com.intellij.lang.ASTNode,com.intellij.openapi.util.TextRange,com.intellij.openapi.editor.FoldingGroup,java.lang.String):V
a:com.intellij.lang.impl.DelegateMarker
c:com.intellij.lang.impl.DelegateMarker
- com.intellij.lang.PsiBuilder$Marker
- <init>(com.intellij.lang.PsiBuilder$Marker):V
- collapse(com.intellij.psi.tree.IElementType):V
@@ -770,6 +770,13 @@ a:com.intellij.lang.impl.DelegateMarker
- error(java.lang.String):V
- errorBefore(java.lang.String,com.intellij.lang.PsiBuilder$Marker):V
- getDelegate():com.intellij.lang.PsiBuilder$Marker
- getEndIndex():I
- getEndOffset():I
- getErrorMessage():java.lang.String
- getStartIndex():I
- getStartOffset():I
- getTokenType():com.intellij.psi.tree.IElementType
- isCollapsed():Z
- precede():com.intellij.lang.PsiBuilder$Marker
- rollbackTo():V
- setCustomEdgeTokenBinders(com.intellij.lang.WhitespacesAndCommentsBinder,com.intellij.lang.WhitespacesAndCommentsBinder):V
@@ -786,16 +793,19 @@ c:com.intellij.lang.impl.PsiBuilderAdapter
- getLatestDoneMarker():com.intellij.lang.LighterASTNode
- getLightTree():com.intellij.util.diff.FlyweightCapableTreeStructure
- getOriginalText():java.lang.CharSequence
- getProductions():java.util.List
- getProject():com.intellij.openapi.project.Project
- getTokenText():java.lang.String
- getTokenType():com.intellij.psi.tree.IElementType
- getTreeBuilt():com.intellij.lang.ASTNode
- getUserData(com.intellij.openapi.util.Key):java.lang.Object
- getUserDataUnprotected(com.intellij.openapi.util.Key):java.lang.Object
- isWhitespaceOrComment(com.intellij.psi.tree.IElementType):Z
- lookAhead(I):com.intellij.psi.tree.IElementType
- mark():com.intellij.lang.PsiBuilder$Marker
- putUserData(com.intellij.openapi.util.Key,java.lang.Object):V
- putUserDataUnprotected(com.intellij.openapi.util.Key,java.lang.Object):V
- rawAdvanceLexer(I):V
- rawLookup(I):com.intellij.psi.tree.IElementType
- rawTokenIndex():I
- rawTokenTypeStart(I):I
@@ -859,6 +869,7 @@ c:com.intellij.lang.impl.PsiBuilderImpl
- whitespaceOrComment(com.intellij.psi.tree.IElementType):Z
a:com.intellij.lang.impl.PsiBuilderImpl$ProductionMarker
- com.intellij.lang.LighterASTNode
- com.intellij.lang.SyntaxTreeBuilder$Production
- pf:myBuilder:com.intellij.lang.impl.PsiBuilderImpl
- p:myLexemeIndex:I
- p:myNext:com.intellij.lang.impl.PsiBuilderImpl$ProductionMarker
@@ -866,6 +877,7 @@ a:com.intellij.lang.impl.PsiBuilderImpl$ProductionMarker
- getEndIndex():I
- getStartIndex():I
- getStartOffset():I
- isCollapsed():Z
- remapTokenType(com.intellij.psi.tree.IElementType):V
- a:tokenTextMatches(java.lang.CharSequence):Z
*c:com.intellij.lang.impl.TokenSequence

View File

@@ -8,7 +8,7 @@ import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public abstract class DelegateMarker implements PsiBuilder.Marker {
public class DelegateMarker implements PsiBuilder.Marker {
private final @NotNull PsiBuilder.Marker myDelegate;
public DelegateMarker(@NotNull PsiBuilder.Marker delegate) {
@@ -68,4 +68,39 @@ public abstract class DelegateMarker implements PsiBuilder.Marker {
public void setCustomEdgeTokenBinders(@Nullable WhitespacesAndCommentsBinder left, @Nullable WhitespacesAndCommentsBinder right) {
myDelegate.setCustomEdgeTokenBinders(left, right);
}
@Override
public int getStartIndex() {
return myDelegate.getStartIndex();
}
@Override
public int getEndIndex() {
return myDelegate.getEndIndex();
}
@Override
public @Nullable String getErrorMessage() {
return myDelegate.getErrorMessage();
}
@Override
public boolean isCollapsed() {
return myDelegate.isCollapsed();
}
@Override
public IElementType getTokenType() {
return myDelegate.getTokenType();
}
@Override
public int getStartOffset() {
return myDelegate.getStartOffset();
}
@Override
public int getEndOffset() {
return myDelegate.getEndOffset();
}
}

View File

@@ -11,6 +11,8 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class PsiBuilderAdapter implements PsiBuilder {
protected final PsiBuilder myDelegate;
@@ -112,6 +114,16 @@ public class PsiBuilderAdapter implements PsiBuilder {
return myDelegate.getLightTree();
}
@Override
public boolean isWhitespaceOrComment(@NotNull IElementType token) {
return myDelegate.isWhitespaceOrComment(token);
}
@Override
public void rawAdvanceLexer(int steps) {
myDelegate.rawAdvanceLexer(steps);
}
@Override
public void setDebugMode(final boolean dbgMode) {
myDelegate.setDebugMode(dbgMode);
@@ -127,6 +139,11 @@ public class PsiBuilderAdapter implements PsiBuilder {
return myDelegate.getLatestDoneMarker();
}
@Override
public @NotNull List<? extends Production> getProductions() {
return myDelegate.getProductions();
}
@Override
public @Nullable <T> T getUserData(final @NotNull Key<T> key) {
return myDelegate.getUserData(key);

View File

@@ -225,6 +225,7 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
return null;
}
@Override
public @NotNull List<ProductionMarker> getProductions() {
return new AbstractList<ProductionMarker>() {
@Override
@@ -243,7 +244,7 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
boolean tokenTextMatches(@NotNull CharSequence chars);
}
public abstract static class ProductionMarker implements Node {
public abstract static class ProductionMarker implements Node, Production {
final int markerId;
protected final PsiBuilderImpl myBuilder;
protected int myLexemeIndex = -1;
@@ -265,14 +266,21 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
return myBuilder.myLexStarts[myLexemeIndex] + myBuilder.myOffset;
}
@Override
public boolean isCollapsed() {
return myBuilder.myOptionalData.isCollapsed(markerId);
}
public void remapTokenType(@NotNull IElementType type) {
throw new UnsupportedOperationException("Shall not be called on this kind of markers");
}
@Override
public int getStartIndex() {
return myLexemeIndex;
}
@Override
public int getEndIndex() {
throw new UnsupportedOperationException("Shall not be called on this kind of markers");
}
@@ -320,6 +328,11 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
return myDoneLexeme;
}
@Override
public @Nullable String getErrorMessage() {
return myType == TokenType.ERROR_ELEMENT ? myBuilder.myOptionalData.getDoneError(markerId) : null;
}
@Override
void setLexemeIndex(int lexemeIndex, boolean done) {
if (done) myDoneLexeme = lexemeIndex;
@@ -664,6 +677,11 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
return getStartIndex();
}
@Override
public @Nullable String getErrorMessage() {
return myMessage;
}
@Override
public @NotNull IElementType getTokenType() {
return TokenType.ERROR_ELEMENT;
@@ -738,7 +756,7 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
}
private int shiftOverWhitespaceForward(int lexIndex) {
while (lexIndex < myLexemeCount && whitespaceOrComment(myLexTypes[lexIndex])) {
while (lexIndex < myLexemeCount && isWhitespaceOrComment(myLexTypes[lexIndex])) {
lexIndex++;
}
return lexIndex;
@@ -797,7 +815,7 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
}
private void skipWhitespace() {
while (myCurrentLexeme < myLexemeCount && whitespaceOrComment(remapCurrentToken())) {
while (myCurrentLexeme < myLexemeCount && isWhitespaceOrComment(remapCurrentToken())) {
onSkip(myLexTypes[myCurrentLexeme], myLexStarts[myCurrentLexeme], myCurrentLexeme + 1 < myLexemeCount ? myLexStarts[myCurrentLexeme + 1] : myText.length());
myCurrentLexeme++;
clearCachedTokenType();
@@ -826,8 +844,9 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
return myText.subSequence(myLexStarts[myCurrentLexeme], myLexStarts[myCurrentLexeme + 1]).toString();
}
@Deprecated
public boolean whitespaceOrComment(IElementType token) {
return myWhitespaces.contains(token) || myComments.contains(token);
return isWhitespaceOrComment(token);
}
@Override
@@ -898,7 +917,7 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
private boolean isEmpty(int startIdx, int endIdx) {
for (int i = startIdx; i < endIdx; i++) {
IElementType token = myLexTypes[i];
if (!whitespaceOrComment(token)) return false;
if (!isWhitespaceOrComment(token)) return false;
}
return true;
}
@@ -1159,7 +1178,7 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
prevProductionLexIndex = pool.get(Math.abs(prevId)).getLexemeIndex(prevId < 0);
}
int wsStartIndex = Math.max(lexemeIndex, lastIndex);
while (wsStartIndex > prevProductionLexIndex && whitespaceOrComment(myLexTypes[wsStartIndex - 1])) wsStartIndex--;
while (wsStartIndex > prevProductionLexIndex && isWhitespaceOrComment(myLexTypes[wsStartIndex - 1])) wsStartIndex--;
int wsEndIndex = shiftOverWhitespaceForward(lexemeIndex);
@@ -1250,7 +1269,7 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
item = marker.myNext;
itemDone = false;
}
else if (!isCollapsed(marker)) {
else if (!marker.isCollapsed()) {
curMarker = marker;
CompositeElement childNode = createComposite(marker, astFactory);
@@ -1279,8 +1298,9 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
}
}
@Deprecated
public boolean isCollapsed(@NotNull ProductionMarker marker) {
return myOptionalData.isCollapsed(marker.markerId);
return marker.isCollapsed();
}
private int insertLeaves(int curToken, int lastIdx, @NotNull CompositeElement curNode) {
@@ -1353,15 +1373,7 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
}
public static @Nullable @NlsContexts.DetailedDescription String getErrorMessage(@NotNull LighterASTNode node) {
if (node instanceof ErrorItem) return ((ErrorItem)node).myMessage;
if (node instanceof StartMarker) {
StartMarker marker = (StartMarker)node;
if (marker.myType == TokenType.ERROR_ELEMENT) {
return marker.myBuilder.myOptionalData.getDoneError(marker.markerId);
}
}
return null;
return node instanceof Production ? ((Production)node).getErrorMessage() : null;
}
private static final class MyComparator implements ShallowNodeComparator<ASTNode, LighterASTNode> {
@@ -1574,7 +1586,7 @@ public class PsiBuilderImpl extends UnprotectedUserDataHolder implements PsiBuil
while (child != null) {
lexIndex = insertLeaves(lexIndex, child.myLexemeIndex, marker.myBuilder, marker);
if (child instanceof StartMarker && child.myBuilder.isCollapsed(child)) {
if (child instanceof StartMarker && child.isCollapsed()) {
int lastIndex = child.getEndIndex();
insertLeaf(child.getTokenType(), marker.myBuilder, child.myLexemeIndex, lastIndex, true, marker);
}

View File

@@ -241,7 +241,7 @@ public class MasqueradingPsiBuilderAdapter extends PsiBuilderAdapter {
}
private boolean isWhiteSpaceOnPos(int pos) {
return myBuilderDelegate.whitespaceOrComment(myShrunkSequence.get(pos).elementType);
return myBuilderDelegate.isWhitespaceOrComment(myShrunkSequence.get(pos).elementType);
}
protected void initShrunkSequence() {