Java: sensibly parse non-sealed modifier on local class and provide better error message (IDEA-342500)

GitOrigin-RevId: 574a5d9c31e5823127227622adaefaaea224b247
This commit is contained in:
Bas Leijdekkers
2024-01-09 14:59:15 +01:00
committed by intellij-monorepo-bot
parent 98d3ab7fec
commit 3e0ed000da
11 changed files with 190 additions and 16 deletions

View File

@@ -420,7 +420,7 @@ public class BasicDeclarationParser {
PsiKeyword.SEALED.equals(builder.getTokenText());
}
private static boolean isNonSealedToken(PsiBuilder builder, IElementType tokenType) {
static boolean isNonSealedToken(PsiBuilder builder, IElementType tokenType) {
if (!getLanguageLevel(builder).isAtLeast(LanguageLevel.JDK_17) ||
tokenType != JavaTokenType.IDENTIFIER ||
!"non".equals(builder.getTokenText()) ||

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 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.core.JavaPsiBundle;
@@ -180,12 +180,13 @@ public class BasicStatementParser {
}
else if (tokenType == JavaTokenType.IDENTIFIER || tokenType == JavaTokenType.AT) {
PsiBuilder.Marker refPos = builder.mark();
boolean nonSealed = BasicDeclarationParser.isNonSealedToken(builder, tokenType);
myParser.getDeclarationParser().parseAnnotations(builder);
skipQualifiedName(builder);
IElementType suspectedLT = builder.getTokenType(), next = builder.lookAhead(1);
IElementType current = builder.getTokenType(), next = builder.lookAhead(1);
refPos.rollbackTo();
if (suspectedLT == JavaTokenType.LT || suspectedLT == JavaTokenType.DOT && next == JavaTokenType.AT) {
if (current == JavaTokenType.LT || current == JavaTokenType.DOT && next == JavaTokenType.AT || nonSealed) {
PsiBuilder.Marker declStatement = builder.mark();
if (myParser.getDeclarationParser().parse(builder, BasicDeclarationParser.BaseContext.CODE_BLOCK) != null) {
@@ -194,7 +195,7 @@ public class BasicStatementParser {
}
BasicReferenceParser.TypeInfo type = myParser.getReferenceParser().parseTypeInfo(builder, 0);
if (suspectedLT == JavaTokenType.LT && (type == null || !type.isParameterized)) {
if (current == JavaTokenType.LT && (type == null || !type.isParameterized)) {
declStatement.rollbackTo();
}
else if (type == null || builder.getTokenType() != JavaTokenType.DOUBLE_COLON) {