diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 3e78666e1b5e..aa56e61307ee 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -59,6 +59,7 @@ import org.jetbrains.annotations.PropertyKey; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Stream; public class HighlightUtil extends HighlightUtilBase { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil"); @@ -419,42 +420,54 @@ public class HighlightUtil extends HighlightUtilBase { static HighlightInfo checkVarTypeApplicability(@NotNull PsiVariable variable) { PsiTypeElement typeElement = variable.getTypeElement(); - if (typeElement != null && typeElement.isInferredType() && variable instanceof PsiLocalVariable) { - PsiExpression initializer = variable.getInitializer(); - if (initializer == null) { - String message = JavaErrorMessages.message("lvti.no.initializer"); - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(message).range(typeElement).create(); - } - if (initializer instanceof PsiFunctionalExpression) { - boolean lambda = initializer instanceof PsiLambdaExpression; - String message = JavaErrorMessages.message(lambda ? "lvti.lambda" : "lvti.method.ref"); - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(message).range(typeElement).create(); - } + if (typeElement != null && typeElement.isInferredType()) { + if (variable instanceof PsiLocalVariable) { + PsiExpression initializer = variable.getInitializer(); + if (initializer == null) { + String message = JavaErrorMessages.message("lvti.no.initializer"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(message).range(typeElement).create(); + } + if (initializer instanceof PsiFunctionalExpression) { + boolean lambda = initializer instanceof PsiLambdaExpression; + String message = JavaErrorMessages.message(lambda ? "lvti.lambda" : "lvti.method.ref"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(message).range(typeElement).create(); + } - PsiElement parent = variable.getParent(); - if (parent instanceof PsiDeclarationStatement && ((PsiDeclarationStatement)parent).getDeclaredElements().length > 1) { - String message = JavaErrorMessages.message("lvti.compound"); - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(message).range(variable).create(); - } + PsiElement parent = variable.getParent(); + if (parent instanceof PsiDeclarationStatement && ((PsiDeclarationStatement)parent).getDeclaredElements().length > 1) { + String message = JavaErrorMessages.message("lvti.compound"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(message).range(variable).create(); + } - PsiType lType = variable.getType(); - if (lType instanceof PsiArrayType && !lType.equals(typeElement.getType())) { + if (isArray(variable)) { + String message = JavaErrorMessages.message("lvti.array"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(message).range(typeElement).create(); + } + + PsiType lType = variable.getType(); + if (PsiType.NULL.equals(lType)) { + String message = JavaErrorMessages.message("lvti.null"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(message).range(typeElement).create(); + } + if (PsiType.VOID.equals(lType)) { + String message = JavaErrorMessages.message("lvti.void"); + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(message).range(typeElement).create(); + } + } + else if (variable instanceof PsiParameter && variable.getParent() instanceof PsiParameterList && isArray(variable)) { String message = JavaErrorMessages.message("lvti.array"); return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(message).range(typeElement).create(); } - if (PsiType.NULL.equals(lType)) { - String message = JavaErrorMessages.message("lvti.null"); - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(message).range(typeElement).create(); - } - if (PsiType.VOID.equals(lType)) { - String message = JavaErrorMessages.message("lvti.void"); - return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).descriptionAndTooltip(message).range(typeElement).create(); - } } return null; } + private static boolean isArray(PsiVariable variable) { + // Java-style 'var' arrays are prohibited by the parser; for C-style ones, looking for a bracket is enough + return Stream.of(variable.getChildren()).anyMatch(e -> PsiUtil.isJavaToken(e, JavaTokenType.LBRACKET)); + } + @Nullable static HighlightInfo checkAssignability(@Nullable PsiType lType, @Nullable PsiType rType, diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/SimpleAvailability.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/SimpleAvailability.java index c840246a3986..3ee2fe4e1568 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/SimpleAvailability.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/SimpleAvailability.java @@ -38,24 +38,24 @@ class Main { } private void forEachType(String[] strs, Iterable it, Iterable raw) { - for (var str : strs) { + for (var str: strs) { String s = str; } - for (var str : it) { + for (var str: it) { String s = str; str = s; } - for (var o : raw) { + for (var o: raw) { Object obj = o; } for (var v: ) {} - for (var v: null) {} + for (var v: null) {} - for (var v : (v)) {} + for (var v: (v)) {} } private void tryWithResources(AutoCloseable c) throws Exception { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/VarInLambdaParameters.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/VarInLambdaParameters.java index f2bcf7951f20..09627856749f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/VarInLambdaParameters.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advLVTI/VarInLambdaParameters.java @@ -2,6 +2,8 @@ import java.util.function.Function; class C { void m() { - Function f = (var var) -> var; + Function f1 = (var var) -> var; + Function f2 = (var arr[]) -> ""; + Function f3 = (var arr) -> ""; } } \ No newline at end of file