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();