IDEA-359853 introduce JavaBinaryOperations

GitOrigin-RevId: 8c4cd1a8fb76a7c79bce882a669af0a057045ab0
This commit is contained in:
Max Medvedev
2025-04-01 00:38:44 +00:00
committed by intellij-monorepo-bot
parent 33f7af38d9
commit c4d2a83d30
13 changed files with 56 additions and 29 deletions
@@ -21,7 +21,7 @@ import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.java.codeserver.highlighting.JavaErrorCollector;
import com.intellij.java.codeserver.highlighting.errors.JavaCompilationError;
import com.intellij.java.codeserver.highlighting.errors.JavaErrorKinds;
import com.intellij.lang.java.parser.BasicExpressionParser;
import com.intellij.lang.java.parser.JavaBinaryOperations;
import com.intellij.lang.jvm.JvmModifier;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
@@ -626,7 +626,7 @@ public final class EvaluatorBuilderImpl implements EvaluatorBuilder {
}
}
// unary numeric promotion if applicable
else if (BasicExpressionParser.SHIFT_OPS.contains(operation)) {
else if (JavaBinaryOperations.SHIFT_OPS.contains(operation)) {
lResult = handleUnaryNumericPromotion(lType, lResult);
rResult = handleUnaryNumericPromotion(rType, rResult);
}
@@ -17,7 +17,7 @@ package com.siyeh.ig.bitwise;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.options.OptPane;
import com.intellij.lang.java.parser.BasicExpressionParser;
import com.intellij.lang.java.parser.JavaBinaryOperations;
import com.intellij.modcommand.ModPsiUpdater;
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
import com.intellij.openapi.project.Project;
@@ -93,11 +93,11 @@ public final class PointlessBitwiseExpressionInspection extends BaseInspection {
for (int i = 0, length = operands.length; i < length; i++) {
final PsiExpression operand = operands[i];
if (isZero(operand)) {
if (tokenType.equals(AND) || BasicExpressionParser.SHIFT_OPS.contains(tokenType) && previousOperand == null) {
if (tokenType.equals(AND) || JavaBinaryOperations.SHIFT_OPS.contains(tokenType) && previousOperand == null) {
return getText(expression, operands[0], operands[length - 1], PsiTypes.longType().equals(expression.getType()) ? "0L" : "0", ct);
}
else if (tokenType.equals(OR) || tokenType.equals(XOR) ||
BasicExpressionParser.SHIFT_OPS.contains(tokenType) && previousOperand != null) {
JavaBinaryOperations.SHIFT_OPS.contains(tokenType) && previousOperand != null) {
return getText(expression, i == length - 1 ? expression.getTokenBeforeOperand(operand) : operand, ct);
}
}
@@ -261,7 +261,7 @@ public final class PointlessBitwiseExpressionInspection extends BaseInspection {
if (sign.equals(AND) || sign.equals(OR) || sign.equals(XOR)) {
isPointless = booleanExpressionIsPointless(operands);
}
else if (BasicExpressionParser.SHIFT_OPS.contains(sign)) {
else if (JavaBinaryOperations.SHIFT_OPS.contains(sign)) {
isPointless = shiftExpressionIsPointless(operands);
}
else {
@@ -19,7 +19,7 @@ import com.intellij.codeInspection.CommonQuickFixBundle;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.dataFlow.CommonDataflow;
import com.intellij.codeInspection.dataFlow.rangeSet.LongRangeSet;
import com.intellij.lang.java.parser.BasicExpressionParser;
import com.intellij.lang.java.parser.JavaBinaryOperations;
import com.intellij.modcommand.ModPsiUpdater;
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
import com.intellij.openapi.project.Project;
@@ -108,7 +108,7 @@ public final class ShiftOutOfRangeInspection extends BaseInspection {
super.visitBinaryExpression(expression);
final PsiJavaToken sign = expression.getOperationSign();
final IElementType tokenType = sign.getTokenType();
if (!BasicExpressionParser.SHIFT_OPS.contains(tokenType)) return;
if (!JavaBinaryOperations.SHIFT_OPS.contains(tokenType)) return;
final PsiExpression rhs = expression.getROperand();
if (rhs == null) return;
final PsiType expressionType = expression.getType();
@@ -21,7 +21,7 @@ import com.intellij.codeInspection.dataFlow.CommonDataflow;
import com.intellij.codeInspection.dataFlow.rangeSet.LongRangeSet;
import com.intellij.codeInspection.dataFlow.types.DfLongType;
import com.intellij.codeInspection.options.OptPane;
import com.intellij.lang.java.parser.BasicExpressionParser;
import com.intellij.lang.java.parser.JavaBinaryOperations;
import com.intellij.modcommand.ModPsiUpdater;
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
import com.intellij.openapi.project.Project;
@@ -144,7 +144,7 @@ public final class IntegerMultiplicationImplicitCastToLongInspection extends Bas
}
private static boolean isShiftToken(IElementType tokenType) {
return BasicExpressionParser.SHIFT_OPS.contains(tokenType);
return JavaBinaryOperations.SHIFT_OPS.contains(tokenType);
}
private static boolean isShiftEqToken(@NotNull IElementType tokenType) {
@@ -3,7 +3,7 @@ package com.siyeh.ig.numeric;
import com.intellij.codeInspection.CleanupLocalInspectionTool;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.lang.java.parser.BasicExpressionParser;
import com.intellij.lang.java.parser.JavaBinaryOperations;
import com.intellij.modcommand.ModPsiUpdater;
import com.intellij.modcommand.PsiUpdateModCommandQuickFix;
import com.intellij.openapi.project.Project;
@@ -171,7 +171,7 @@ public final class UnnecessaryExplicitNumericCastInspection extends BaseInspecti
}
}
}
else if (BasicExpressionParser.SHIFT_OPS.contains(tokenType)) {
else if (JavaBinaryOperations.SHIFT_OPS.contains(tokenType)) {
final PsiExpression firstOperand = polyadicExpression.getOperands()[0];
if (!PsiTreeUtil.isAncestor(firstOperand, expression, false)) {
return true;
@@ -16,7 +16,7 @@
package com.siyeh.ig.psiutils;
import com.intellij.codeInsight.ExceptionUtil;
import com.intellij.lang.java.parser.BasicExpressionParser;
import com.intellij.lang.java.parser.JavaBinaryOperations;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.infos.MethodCandidateInfo;
@@ -605,7 +605,7 @@ public final class ExpectedTypeUtils {
}
private static boolean isShiftOperation(@NotNull IElementType sign) {
return BasicExpressionParser.SHIFT_OPS.contains(sign);
return JavaBinaryOperations.SHIFT_OPS.contains(sign);
}
private static boolean isOperatorAssignmentOperation(@NotNull IElementType sign) {
@@ -1,7 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.editorActions;
import com.intellij.lang.java.parser.BasicExpressionParser;
import com.intellij.lang.java.parser.JavaBinaryOperations;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.tree.TokenSet;
@@ -16,11 +16,11 @@ public final class JavaTypingTokenSets {
JavaTokenType.STRING_LITERAL, JavaTokenType.TEXT_BLOCK_LITERAL);
public static final TokenSet UNWANTED_TOKEN_BEFORE_QUESTION =
TokenSet.orSet(BasicExpressionParser.ASSIGNMENT_OPS, TokenSet.create(JavaTokenType.QUEST, JavaTokenType.COLON));
TokenSet.orSet(JavaBinaryOperations.ASSIGNMENT_OPS, TokenSet.create(JavaTokenType.QUEST, JavaTokenType.COLON));
public static final TokenSet WANTED_TOKEN_BEFORE_QUESTION =
// Tokens that may appear before ?: in polyadic expression that may have non-boolean result
TokenSet.orSet(
TokenSet.create(JavaTokenType.OR, JavaTokenType.XOR, JavaTokenType.AND),
BasicExpressionParser.SHIFT_OPS, BasicExpressionParser.ADDITIVE_OPS, BasicExpressionParser.MULTIPLICATIVE_OPS);
JavaBinaryOperations.SHIFT_OPS, JavaBinaryOperations.ADDITIVE_OPS, JavaBinaryOperations.MULTIPLICATIVE_OPS);
}
@@ -0,0 +1,17 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.lang.java.parser
import com.intellij.java.frontback.psi.impl.syntax.BasicJavaElementTypeConverter
import com.intellij.java.syntax.parser.ExpressionParser
import com.intellij.platform.syntax.psi.asTokenSet
import com.intellij.psi.tree.TokenSet
import org.jetbrains.annotations.ApiStatus
@ApiStatus.Internal
object JavaBinaryOperations {
// todo replace BasicJavaElementTypeConverter with another Converter when parsers are merged
@JvmField val ASSIGNMENT_OPS: TokenSet = ExpressionParser.ASSIGNMENT_OPS.asTokenSet(BasicJavaElementTypeConverter)
@JvmField val SHIFT_OPS: TokenSet = ExpressionParser.SHIFT_OPS.asTokenSet(BasicJavaElementTypeConverter)
@JvmField val ADDITIVE_OPS: TokenSet = ExpressionParser.ADDITIVE_OPS.asTokenSet(BasicJavaElementTypeConverter)
@JvmField val MULTIPLICATIVE_OPS: TokenSet = ExpressionParser.MULTIPLICATIVE_OPS.asTokenSet(BasicJavaElementTypeConverter)
}
@@ -3,7 +3,7 @@ package com.intellij.psi.impl.source;
import com.intellij.lang.ASTNode;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.lang.java.parser.BasicExpressionParser;
import com.intellij.lang.java.parser.JavaBinaryOperations;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.tree.TreeUtil;
@@ -19,6 +19,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
@@ -143,6 +144,10 @@ public final class BasicJavaAstTreeUtil {
return findChildByType(astNode, ParentAwareTokenSet.create(targets));
}
public static @Nullable ASTNode findChildByType(@Nullable ASTNode astNode, Collection<IElementType> targets) {
return findChildByType(astNode, ParentAwareTokenSet.create(targets));
}
public static @Nullable ASTNode findChildByType(@Nullable ASTNode astNode, ParentAwareTokenSet targets) {
if (astNode == null) {
return null;
@@ -668,7 +673,7 @@ public final class BasicJavaAstTreeUtil {
if (expr == null) {
return null;
}
ASTNode ASTNode = findChildByType(expr, BasicExpressionParser.ASSIGNMENT_OPS.getTypes());
ASTNode ASTNode = findChildByType(expr, JavaBinaryOperations.ASSIGNMENT_OPS.getTypes());
if (ASTNode == null) {
return null;
}
@@ -6,7 +6,7 @@ import com.intellij.formatting.Spacing;
import com.intellij.lang.ASTNode;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.lang.java.JavaParserDefinition;
import com.intellij.lang.java.parser.BasicExpressionParser;
import com.intellij.lang.java.parser.JavaBinaryOperations;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
@@ -1110,13 +1110,13 @@ public final class JavaSpacePropertyProcessor extends JavaElementVisitor {
else if (i == JavaTokenType.GT || i == JavaTokenType.LT || i == JavaTokenType.GE || i == JavaTokenType.LE) {
createSpaceInCode(mySettings.SPACE_AROUND_RELATIONAL_OPERATORS);
}
else if (BasicExpressionParser.ADDITIVE_OPS.contains(i)) {
else if (JavaBinaryOperations.ADDITIVE_OPS.contains(i)) {
createSpaceInCode(mySettings.SPACE_AROUND_ADDITIVE_OPERATORS);
}
else if (BasicExpressionParser.MULTIPLICATIVE_OPS.contains(i)) {
else if (JavaBinaryOperations.MULTIPLICATIVE_OPS.contains(i)) {
createSpaceInCode(mySettings.SPACE_AROUND_MULTIPLICATIVE_OPERATORS);
}
else if (BasicExpressionParser.SHIFT_OPS.contains(i)) {
else if (JavaBinaryOperations.SHIFT_OPS.contains(i)) {
createSpaceInCode(mySettings.SPACE_AROUND_SHIFT_OPERATORS);
}
else {
@@ -2,7 +2,7 @@
package com.intellij.psi.impl.source.tree.java;
import com.intellij.lang.ASTNode;
import com.intellij.lang.java.parser.BasicExpressionParser;
import com.intellij.lang.java.parser.JavaBinaryOperations;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil;
@@ -95,7 +95,7 @@ public class PsiAssignmentExpressionImpl extends ExpressionPsiElement implements
}
}
private static final TokenSet OUR_OPERATIONS_BIT_SET = BasicExpressionParser.ASSIGNMENT_OPS;
private static final TokenSet OUR_OPERATIONS_BIT_SET = JavaBinaryOperations.ASSIGNMENT_OPS;
@Override
public void accept(@NotNull PsiElementVisitor visitor) {
@@ -2,7 +2,7 @@
package com.intellij.psi.impl.source.tree.java;
import com.intellij.lang.ASTNode;
import com.intellij.lang.java.parser.BasicExpressionParser;
import com.intellij.lang.java.parser.JavaBinaryOperations;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.JavaTokenType;
import com.intellij.psi.PsiElement;
@@ -117,13 +117,13 @@ public final class ReplaceExpressionUtil {
else if (opType == JavaTokenType.LT || opType == JavaTokenType.GT || opType == JavaTokenType.LE || opType == JavaTokenType.GE) {
return 8;
}
else if (BasicExpressionParser.SHIFT_OPS.contains(opType)) {
else if (JavaBinaryOperations.SHIFT_OPS.contains(opType)) {
return 9;
}
else if (BasicExpressionParser.ADDITIVE_OPS.contains(opType)) {
else if (JavaBinaryOperations.ADDITIVE_OPS.contains(opType)) {
return 10;
}
else if (BasicExpressionParser.MULTIPLICATIVE_OPS.contains(opType)) {
else if (JavaBinaryOperations.MULTIPLICATIVE_OPS.contains(opType)) {
return 11;
}
return 8;
@@ -229,6 +229,11 @@ public class FrontBackElementTypeTest extends AbstractBasicJavaParsingTestCase {
if (path.toString().endsWith("BasicJavaParserUtil.java")) {
continue;
}
// exclude, contains refs to `BasicJavaElementTypeConverter` which is mixed up with `BasicJavaElementType`
if (path.toString().endsWith("JavaBinaryOperations.kt")) {
continue;
}
String content = FileUtil.loadFile(path.toFile());
int start = 0;
int find = content.indexOf(target, start);