From 0e66f0b5368d230072976420690b05efea80aa79 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 11 Jul 2022 16:41:31 +0200 Subject: [PATCH] [java-highlighting] IDEA-160446 Java. "Array type has too many dimensions" error is not highlighted GitOrigin-RevId: 40ae7025e52f6be0486ad2e1cf3bf4a85e9904ea --- .../daemon/impl/analysis/HighlightUtil.java | 15 +++++++++++++++ .../impl/analysis/HighlightVisitorImpl.java | 1 + .../src/messages/JavaErrorBundle.properties | 3 ++- .../advHighlighting/TooManyArrayDimensions.java | 6 ++++++ .../daemon/LightAdvHighlightingTest.java | 2 ++ 5 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/TooManyArrayDimensions.java 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 8c3e4c86d632..74c82585b0ef 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 @@ -2873,6 +2873,21 @@ public final class HighlightUtil { .navigationShift(navigationShift).create(); } + public static HighlightInfo checkArrayType(PsiTypeElement type) { + int dimensions = 0; + for (PsiElement child = type.getFirstChild(); child != null; child = child.getNextSibling()) { + if (PsiUtil.isJavaToken(child, JavaTokenType.LBRACKET)) { + dimensions++; + } + } + if (dimensions > 255) { + // JVM Specification, 4.3.2: no more than 255 dimensions allowed + return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(type.getTextRange()) + .description(JavaErrorBundle.message("too.many.array.dimensions")).create(); + } + return null; + } + @FunctionalInterface interface IncompatibleTypesTooltipComposer { @NotNull @NlsContexts.Tooltip diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 9b04c850dba7..1dabe8246812 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -1751,6 +1751,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkVarTypeApplicability(type)); if (!myHolder.hasErrorResults()) myHolder.add(GenericsHighlightUtil.checkReferenceTypeUsedAsTypeArgument(type, myLanguageLevel)); if (!myHolder.hasErrorResults()) myHolder.add(GenericsHighlightUtil.checkWildcardUsage(type)); + if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkArrayType(type)); if (!myHolder.hasErrorResults()) type.accept(myPreviewFeatureVisitor); } diff --git a/java/java-psi-impl/src/messages/JavaErrorBundle.properties b/java/java-psi-impl/src/messages/JavaErrorBundle.properties index 3095fc1459a3..8a16209c9603 100644 --- a/java/java-psi-impl/src/messages/JavaErrorBundle.properties +++ b/java/java-psi-impl/src/messages/JavaErrorBundle.properties @@ -541,4 +541,5 @@ text.class.is.not.accessible={0} is not accessible in current context text.class.cannot.access=Cannot access {0} auto.closeable.resource=auto-closeable resource annotation.type.permits=No permits clause allowed for annotation type -safevararg.annotation.cannot.be.applied.for.record.component=@SafeVarargs annotation cannot be applied for a record component \ No newline at end of file +safevararg.annotation.cannot.be.applied.for.record.component=@SafeVarargs annotation cannot be applied for a record component +too.many.array.dimensions=Too many array dimensions \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/TooManyArrayDimensions.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/TooManyArrayDimensions.java new file mode 100644 index 000000000000..83e193c1c991 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/TooManyArrayDimensions.java @@ -0,0 +1,6 @@ +class C { + void t() { + byte[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] b1; + byte[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] b2; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingTest.java index 4f58a79bcdd6..478377a02bc8 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingTest.java @@ -409,6 +409,8 @@ public class LightAdvHighlightingTest extends LightDaemonAnalyzerTestCase { doTest(false); } + public void testTooManyArrayDimensions() { doTest(false);} + public void testInsane() { configureFromFileText("x.java", "class X { \nx_x_x_x\n }"); List infos = highlightErrors();