[java-rd] IDEA-333104 fix cases when highlighting get null in parents

- fix comments
- BasicJavaTokenSet is renamed to ParentAwareTokenSet and move to core
- method `toTokenSet` is deleted, because it was the reason a lot of mistakes

GitOrigin-RevId: b776be4f067d99e4a531d3622dfa9b9e8078c543
This commit is contained in:
Mikhail Pyltsin
2023-09-28 10:40:09 +02:00
committed by intellij-monorepo-bot
parent 7b31275d08
commit 4cf2e16167
27 changed files with 259 additions and 201 deletions

View File

@@ -2,12 +2,12 @@
package com.intellij;
import com.intellij.lang.xml.XmlTokenElementMarkTypes;
import com.intellij.psi.impl.source.BasicJavaTokenSet;
import com.intellij.psi.tree.ParentAwareTokenSet;
import com.intellij.psi.tree.TokenSet;
public interface BaseJavaJspElementType {
BasicJavaTokenSet WHITE_SPACE_BIT_SET = BasicJavaTokenSet.orSet(
BasicJavaTokenSet.create(TokenSet.WHITE_SPACE),
BasicJavaTokenSet.create(XmlTokenElementMarkTypes.XML_WHITE_SPACE_MARK));
ParentAwareTokenSet WHITE_SPACE_BIT_SET = ParentAwareTokenSet.orSet(
ParentAwareTokenSet.create(TokenSet.WHITE_SPACE),
ParentAwareTokenSet.create(XmlTokenElementMarkTypes.XML_WHITE_SPACE_MARK));
}

View File

@@ -17,7 +17,7 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.impl.source.BasicJavaAstTreeUtil;
import com.intellij.psi.impl.source.BasicJavaTokenSet;
import com.intellij.psi.tree.ParentAwareTokenSet;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.NotNull;
@@ -139,7 +139,7 @@ public abstract class AbstractBasicJavaTypedHandler extends TypedHandlerDelegate
PsiDocumentManager.getInstance(project).commitDocument(doc);
final PsiElement leaf = file.findElementAt(offset);
if (BasicJavaAstTreeUtil.getParentOfType(leaf, BASIC_ARRAY_INITIALIZER_EXPRESSION, false,
BasicJavaTokenSet.orSet(BasicJavaTokenSet.create(BASIC_CODE_BLOCK), MEMBER_SET)) != null) {
ParentAwareTokenSet.orSet(ParentAwareTokenSet.create(BASIC_CODE_BLOCK), MEMBER_SET)) != null) {
return Result.CONTINUE;
}
PsiElement st = leaf != null ? leaf.getParent() : null;
@@ -168,7 +168,7 @@ public abstract class AbstractBasicJavaTypedHandler extends TypedHandlerDelegate
// lambda
if (prevLeaf != null && prevLeaf.getNode().getElementType() == JavaTokenType.ARROW) return true;
// anonymous class
BasicJavaTokenSet stopAt = BasicJavaTokenSet.orSet(MEMBER_SET, BasicJavaTokenSet.create(BASIC_CODE_BLOCK));
ParentAwareTokenSet stopAt = ParentAwareTokenSet.orSet(MEMBER_SET, ParentAwareTokenSet.create(BASIC_CODE_BLOCK));
if (BasicJavaAstTreeUtil.getParentOfType(prevLeaf, BASIC_NEW_EXPRESSION, true, stopAt) != null) return true;
// local class
if (prevLeaf != null && prevLeaf.getParent() != null && BasicJavaAstTreeUtil.is(prevLeaf.getNode(), JavaTokenType.IDENTIFIER) &&

View File

@@ -9,7 +9,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.BasicJavaAstTreeUtil;
import com.intellij.psi.impl.source.BasicJavaTokenSet;
import com.intellij.psi.tree.ParentAwareTokenSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -177,7 +177,7 @@ public abstract class AbstractBasicJavadocTypedHandler extends TypedHandlerDeleg
// The contents of inline tags is not HTML, so the paired tag completion isn't appropriate there.
if (BasicJavaAstTreeUtil.is(astNode, DOC_INLINE_TAG, DOC_SNIPPET_TAG) ||
BasicJavaAstTreeUtil.getParentOfType(astNode, BasicJavaTokenSet.create(DOC_INLINE_TAG, DOC_SNIPPET_TAG)) != null) {
BasicJavaAstTreeUtil.getParentOfType(astNode, ParentAwareTokenSet.create(DOC_INLINE_TAG, DOC_SNIPPET_TAG)) != null) {
return false;
}

View File

@@ -11,8 +11,8 @@ import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.impl.source.BasicJavaAstTreeUtil;
import com.intellij.psi.impl.source.BasicJavaTokenSet;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.ParentAwareTokenSet;
import com.intellij.psi.tree.TokenSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -23,15 +23,15 @@ import static com.intellij.psi.impl.source.BasicJavaElementType.BASIC_LITERAL_EX
import static com.intellij.psi.impl.source.BasicJavaElementType.REFERENCE_EXPRESSION_SET;
public class JavaQuoteHandler extends SimpleTokenSetQuoteHandler implements JavaLikeQuoteHandler, MultiCharQuoteHandler {
private final BasicJavaTokenSet myConcatenableStrings = BasicJavaTokenSet.create(JavaTokenType.STRING_LITERAL);
private final BasicJavaTokenSet myAppropriateElementTypeForLiteral = BasicJavaTokenSet.orSet(
BasicJavaTokenSet.create(JavaDocTokenType.ALL_JAVADOC_TOKENS),
BASIC_JAVA_COMMENT_OR_WHITESPACE_BIT_SET, BasicJavaTokenSet.create(BASIC_TEXT_LITERALS),
BasicJavaTokenSet.create(JavaTokenType.SEMICOLON, JavaTokenType.COMMA, JavaTokenType.RPARENTH, JavaTokenType.RBRACKET,
JavaTokenType.RBRACE));
private final TokenSet myConcatenableStrings = TokenSet.create(JavaTokenType.STRING_LITERAL);
private final ParentAwareTokenSet myAppropriateElementTypeForLiteral = ParentAwareTokenSet.orSet(
ParentAwareTokenSet.create(JavaDocTokenType.ALL_JAVADOC_TOKENS),
BASIC_JAVA_COMMENT_OR_WHITESPACE_BIT_SET, ParentAwareTokenSet.create(BASIC_TEXT_LITERALS),
ParentAwareTokenSet.create(JavaTokenType.SEMICOLON, JavaTokenType.COMMA, JavaTokenType.RPARENTH, JavaTokenType.RBRACKET,
JavaTokenType.RBRACE));
public JavaQuoteHandler() {
super(BasicJavaTokenSet.orSet(BasicJavaTokenSet.create(BASIC_TEXT_LITERALS), BasicJavaTokenSet.create(JavaDocTokenType.DOC_TAG_VALUE_QUOTE)).toTokenSet());
super(TokenSet.orSet(BASIC_TEXT_LITERALS, TokenSet.create(JavaDocTokenType.DOC_TAG_VALUE_QUOTE)));
}
@Override
@@ -73,7 +73,7 @@ public class JavaQuoteHandler extends SimpleTokenSetQuoteHandler implements Java
@NotNull
@Override
public TokenSet getConcatenatableStringTokenTypes() {
return myConcatenableStrings.toTokenSet();
return myConcatenableStrings;
}
@Override

View File

@@ -26,15 +26,15 @@ import com.intellij.psi.JavaTokenType;
import com.intellij.psi.PsiElement;
import com.intellij.psi.impl.source.BasicElementTypes;
import com.intellij.psi.impl.source.BasicJavaAstTreeUtil;
import com.intellij.psi.impl.source.BasicJavaTokenSet;
import com.intellij.psi.tree.ParentAwareTokenSet;
import org.jetbrains.annotations.NotNull;
import static com.intellij.psi.impl.source.BasicJavaDocElementType.DOC_COMMENT;
public class CommentBreakerEnterProcessor implements ASTNodeEnterProcessor {
private final BasicJavaTokenSet myCommentTypes = BasicJavaTokenSet.orSet(
BasicJavaTokenSet.create(BasicElementTypes.BASIC_JAVA_PLAIN_COMMENT_BIT_SET), BasicJavaTokenSet.create(DOC_COMMENT)
private final ParentAwareTokenSet myCommentTypes = ParentAwareTokenSet.orSet(
ParentAwareTokenSet.create(BasicElementTypes.BASIC_JAVA_PLAIN_COMMENT_BIT_SET), ParentAwareTokenSet.create(DOC_COMMENT)
);
@Override

View File

@@ -9,7 +9,7 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.openapi.editor.actionSystem.EditorActionManager;
import com.intellij.psi.impl.source.BasicJavaAstTreeUtil;
import com.intellij.psi.impl.source.BasicJavaTokenSet;
import com.intellij.psi.tree.ParentAwareTokenSet;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -17,9 +17,9 @@ import org.jetbrains.annotations.Nullable;
import static com.intellij.psi.impl.source.BasicJavaElementType.*;
public class LeaveCodeBlockEnterProcessor implements ASTNodeEnterProcessor {
private final BasicJavaTokenSet CONTROL_FLOW_ELEMENT_TYPES =
BasicJavaTokenSet.create(BASIC_IF_STATEMENT, BASIC_WHILE_STATEMENT, BASIC_DO_WHILE_STATEMENT, BASIC_FOR_STATEMENT,
BASIC_FOREACH_STATEMENT);
private final ParentAwareTokenSet CONTROL_FLOW_ELEMENT_TYPES =
ParentAwareTokenSet.create(BASIC_IF_STATEMENT, BASIC_WHILE_STATEMENT, BASIC_DO_WHILE_STATEMENT, BASIC_FOR_STATEMENT,
BASIC_FOREACH_STATEMENT);
@Override

View File

@@ -21,7 +21,7 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiWhiteSpace;
import com.intellij.psi.impl.source.BasicJavaAstTreeUtil;
import com.intellij.psi.impl.source.BasicJavaTokenSet;
import com.intellij.psi.tree.ParentAwareTokenSet;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.ObjectUtils;
@@ -58,9 +58,9 @@ public class MissingLoopBodyFixer implements Fixer {
}
private static ASTNode getLoopParent(@NotNull ASTNode element) {
ASTNode statement = BasicJavaAstTreeUtil.getParentOfType(element, BasicJavaTokenSet.create(BASIC_FOREACH_STATEMENT,
BASIC_FOR_STATEMENT,
BASIC_WHILE_STATEMENT));
ASTNode statement = BasicJavaAstTreeUtil.getParentOfType(element, ParentAwareTokenSet.create(BASIC_FOREACH_STATEMENT,
BASIC_FOR_STATEMENT,
BASIC_WHILE_STATEMENT));
if (statement == null) return null;
if (BasicJavaAstTreeUtil.is(statement, BASIC_FOREACH_STATEMENT)) {
return isForEachApplicable(statement, element) ? statement : null;

View File

@@ -8,7 +8,7 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiJavaToken;
import com.intellij.psi.TokenType;
import com.intellij.psi.impl.source.BasicJavaAstTreeUtil;
import com.intellij.psi.impl.source.BasicJavaTokenSet;
import com.intellij.psi.tree.ParentAwareTokenSet;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -35,7 +35,7 @@ public class MissingReturnExpressionFixer implements Fixer {
return;
}
ASTNode parent = BasicJavaAstTreeUtil.getParentOfType(astNode, BasicJavaTokenSet.create(BASIC_CLASS_INITIALIZER, BASIC_METHOD));
ASTNode parent = BasicJavaAstTreeUtil.getParentOfType(astNode, ParentAwareTokenSet.create(BASIC_CLASS_INITIALIZER, BASIC_METHOD));
if (BasicJavaAstTreeUtil.is(parent, BASIC_METHOD)) {
ASTNode type = BasicJavaAstTreeUtil.findChildByType(parent, BASIC_TYPE);
if (type != null && !type.getText().equals("void")) {
@@ -68,7 +68,7 @@ public class MissingReturnExpressionFixer implements Fixer {
int offset = returnStatement.getTextRange().getEndOffset();
final PsiElement psiMethod =
BasicJavaAstTreeUtil.getParentOfType(BasicJavaAstTreeUtil.toPsi(returnStatement), BASIC_METHOD, true,
BasicJavaTokenSet.create(BASIC_LAMBDA_EXPRESSION));
ParentAwareTokenSet.create(BASIC_LAMBDA_EXPRESSION));
ASTNode method = BasicJavaAstTreeUtil.toNode(psiMethod);
ASTNode type = BasicJavaAstTreeUtil.findChildByType(method, BASIC_TYPE);
if (method != null && type != null && type.getText().equals("void")) {

View File

@@ -5,24 +5,24 @@ import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.impl.source.BasicElementTypes;
import com.intellij.psi.impl.source.BasicJavaTokenSet;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.ParentAwareTokenSet;
import org.jetbrains.annotations.NotNull;
public class JavaPairedBraceMatcher extends PairedBraceAndAnglesMatcher {
private static class Holder {
private static final BasicJavaTokenSet TYPE_TOKENS =
BasicJavaTokenSet.orSet(BaseJavaJspElementType.WHITE_SPACE_BIT_SET,
BasicElementTypes.BASIC_JAVA_COMMENT_BIT_SET,
BasicJavaTokenSet.create(JavaTokenType.IDENTIFIER, JavaTokenType.COMMA,
JavaTokenType.AT,//anno
JavaTokenType.RBRACKET, JavaTokenType.LBRACKET, //arrays
JavaTokenType.QUEST, JavaTokenType.EXTENDS_KEYWORD, JavaTokenType.SUPER_KEYWORD));//wildcards
private static final ParentAwareTokenSet TYPE_TOKENS =
ParentAwareTokenSet.orSet(BaseJavaJspElementType.WHITE_SPACE_BIT_SET,
BasicElementTypes.BASIC_JAVA_COMMENT_BIT_SET,
ParentAwareTokenSet.create(JavaTokenType.IDENTIFIER, JavaTokenType.COMMA,
JavaTokenType.AT,//anno
JavaTokenType.RBRACKET, JavaTokenType.LBRACKET, //arrays
JavaTokenType.QUEST, JavaTokenType.EXTENDS_KEYWORD, JavaTokenType.SUPER_KEYWORD));//wildcards
}
public JavaPairedBraceMatcher() {
super(new JavaBraceMatcher(), JavaLanguage.INSTANCE, JavaFileType.INSTANCE, Holder.TYPE_TOKENS.toTokenSet());
super(new JavaBraceMatcher(), JavaLanguage.INSTANCE, JavaFileType.INSTANCE, Holder.TYPE_TOKENS);
}
@Override

View File

@@ -8,11 +8,13 @@ import com.intellij.openapi.editor.highlighter.HighlighterIterator;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.LanguageFileType;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.ParentAwareTokenSet;
import com.intellij.psi.tree.TokenSet;
import org.jetbrains.annotations.NotNull;
public abstract class PairedBraceAndAnglesMatcher extends PairedBraceMatcherAdapter {
private final TokenSet myTokenSetAllowedInsideAngleBrackets;
private final ParentAwareTokenSet myBasicTokenSetAllowedInsideAngleBrackets;
private final LanguageFileType myFileType;
public PairedBraceAndAnglesMatcher(@NotNull PairedBraceMatcher matcher,
@@ -21,6 +23,17 @@ public abstract class PairedBraceAndAnglesMatcher extends PairedBraceMatcherAdap
@NotNull TokenSet tokenSetAllowedInsideAngleBrackets) {
super(matcher, language);
myTokenSetAllowedInsideAngleBrackets = tokenSetAllowedInsideAngleBrackets;
myBasicTokenSetAllowedInsideAngleBrackets = null;
myFileType = fileType;
}
public PairedBraceAndAnglesMatcher(@NotNull PairedBraceMatcher matcher,
@NotNull Language language,
@NotNull LanguageFileType fileType,
@NotNull ParentAwareTokenSet basicTokenSetAllowedInsideAngleBrackets) {
super(matcher, language);
myTokenSetAllowedInsideAngleBrackets = null;
myBasicTokenSetAllowedInsideAngleBrackets = basicTokenSetAllowedInsideAngleBrackets;
myFileType = fileType;
}
@@ -75,7 +88,9 @@ public abstract class PairedBraceAndAnglesMatcher extends PairedBraceMatcherAdap
continue;
}
if (!myTokenSetAllowedInsideAngleBrackets.contains(tokenType)) {
if (
(myTokenSetAllowedInsideAngleBrackets == null || !myTokenSetAllowedInsideAngleBrackets.contains(tokenType)) &&
(myBasicTokenSetAllowedInsideAngleBrackets == null || !myBasicTokenSetAllowedInsideAngleBrackets.contains(tokenType))) {
return false;
}
}

View File

@@ -12,8 +12,8 @@ import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.BasicJavaAstTreeUtil;
import com.intellij.psi.impl.source.BasicJavaTokenSet;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.ParentAwareTokenSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -29,9 +29,9 @@ public abstract class AbstractBasicJavadocHelper {
public static final Pair<JavadocParameterInfo, List<JavadocParameterInfo>> EMPTY
= new Pair<>(null, Collections.emptyList());
private static final @NotNull BasicJavaTokenSet TAG_TOKEN_SET = BasicJavaTokenSet.create(DOC_TAG,
DOC_SNIPPET_TAG,
DOC_INLINE_TAG);
private static final @NotNull ParentAwareTokenSet TAG_TOKEN_SET = ParentAwareTokenSet.create(DOC_TAG,
DOC_SNIPPET_TAG,
DOC_INLINE_TAG);
protected AbstractBasicJavadocHelper() {
}