diff options
Diffstat (limited to 'org.eclipse.jdt.core/compiler/org/eclipse/jdt')
7 files changed, 54 insertions, 10 deletions
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java index d514c153d3..677ee71272 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java @@ -2352,6 +2352,9 @@ void setSourceStart(int sourceStart); /** @since 3.23 * @noreference preview feature error */ int RecordMissingExplicitConstructorCallInNonCanonicalConstructor= PreviewRelated + 1760; + /** @since 3.23 + * @noreference preview feature error */ + int RecordIllegalStaticModifierForLocalClassOrInterface = PreviewRelated + 1761; /* records - end */ /* instanceof pattern: */ /** @since 3.22 diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java index 9acea3d9fb..b67ac849d0 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/TypeDeclaration.java @@ -95,7 +95,6 @@ public class TypeDeclaration extends Statement implements ProblemSeverities, Ref // 14 Records preview support public RecordComponent[] recordComponents; public int nRecordComponents; - public boolean isLocalRecord; public static Set<String> disallowedComponentNames; // 15 Sealed Type preview support diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java index f423dd2e43..3e94497257 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java @@ -564,6 +564,8 @@ public class ClassScope extends Scope { private void checkAndSetModifiers() { SourceTypeBinding sourceType = this.referenceContext.binding; int modifiers = sourceType.modifiers; + boolean isPreviewEnabled = compilerOptions().sourceLevel == ClassFileConstants.getLatestJDKLevel() && + compilerOptions().enablePreviewFeatures; if (sourceType.isRecord()) { /* JLS 14 Records Sec 8.10 - A record declaration is implicitly final. */ modifiers |= ClassFileConstants.AccFinal; @@ -592,14 +594,26 @@ public class ClassScope extends Scope { } } else if (sourceType.isLocalType()) { if (sourceType.isEnum()) { - problemReporter().illegalLocalTypeDeclaration(this.referenceContext); - sourceType.modifiers = 0; - return; + if (!isPreviewEnabled) { + problemReporter().illegalLocalTypeDeclaration(this.referenceContext); + sourceType.modifiers = 0; + return; + } + if ((modifiers & ClassFileConstants.AccStatic) != 0) { + problemReporter().recordIllegalStaticModifierForLocalClassOrInterface(sourceType); + return; + } + modifiers |= ClassFileConstants.AccStatic; } else if (sourceType.isRecord()) { if (enclosingType != null && enclosingType.isLocalType()) { problemReporter().illegalLocalTypeDeclaration(this.referenceContext); return; } + if ((modifiers & ClassFileConstants.AccStatic) != 0) { + problemReporter().recordIllegalStaticModifierForLocalClassOrInterface(sourceType); + return; + } + modifiers |= ClassFileConstants.AccStatic; } if (sourceType.isAnonymousType()) { if (compilerOptions().complianceLevel < ClassFileConstants.JDK9) @@ -681,6 +695,12 @@ public class ClassScope extends Scope { else problemReporter().illegalModifierForInterface(sourceType); } + if (isPreviewEnabled && sourceType.isLocalType()) { +// if ((modifiers & ClassFileConstants.AccStatic) != 0) { +// problemReporter().recordIllegalStaticModifierForLocalClassOrInterface(sourceType); +// } + modifiers |= ClassFileConstants.AccStatic; + } } /* * AccSynthetic must be set if the target is greater than 1.5. 1.5 VM don't support AccSynthetics flag. @@ -690,8 +710,6 @@ public class ClassScope extends Scope { } modifiers |= ClassFileConstants.AccAbstract; } else if ((realModifiers & ClassFileConstants.AccEnum) != 0) { - boolean isPreviewEnabled = compilerOptions().sourceLevel >= ClassFileConstants.JDK15 && - compilerOptions().enablePreviewFeatures; boolean flagSealedNonModifiers = isPreviewEnabled && (modifiers & (ExtraCompilerModifiers.AccSealed | ExtraCompilerModifiers.AccNonSealed)) != 0; // detect abnormal cases for enums diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java index 90f7a9beef..15462264d4 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/NestedTypeBinding.java @@ -82,7 +82,8 @@ public SyntheticArgumentBinding addSyntheticArgument(LocalVariableBinding actual public SyntheticArgumentBinding addSyntheticArgument(ReferenceBinding targetEnclosingType) { if (!isPrototype()) throw new IllegalStateException(); if (isStatic()) { - assert this.isRecord();// a local record is implicitly static; no other local type can be static + // Ref JLS 6.1 due to record preview add-on doc: Local Static Interfaces and Enum Classes + // a local record, enum and interface allowed, and will be implicitly static return null; } SyntheticArgumentBinding synthLocal = null; diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java index d7730f5afe..9baa6f99fa 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java @@ -973,6 +973,7 @@ protected boolean parsingJava8Plus; protected boolean parsingJava9Plus; protected boolean parsingJava14Plus; protected boolean parsingJava15Plus; +protected boolean previewEnabled; protected boolean parsingJava11Plus; protected int unstackedAct = ERROR_ACTION; private boolean haltOnSyntaxError = false; @@ -997,6 +998,7 @@ public Parser(ProblemReporter problemReporter, boolean optimizeStringLiterals) { this.parsingJava11Plus = this.options.sourceLevel >= ClassFileConstants.JDK11; this.parsingJava14Plus = this.options.sourceLevel >= ClassFileConstants.JDK14; this.parsingJava15Plus = this.options.sourceLevel >= ClassFileConstants.JDK15; + this.previewEnabled = this.options.sourceLevel == ClassFileConstants.getLatestJDKLevel() && this.options.enablePreviewFeatures; this.astLengthStack = new int[50]; this.patternLengthStack = new int[20]; this.expressionLengthStack = new int[30]; @@ -4875,6 +4877,13 @@ protected void consumeInvalidConstructorDeclaration(boolean hasBody) { } protected void consumeInvalidEnumDeclaration() { // BlockStatement ::= EnumDeclaration + if (this.previewEnabled) { + /* JLS 15 Local Static Interfaces and Enum Classes - Records preview - Sec 6.1 + * A local class or interface (14.3), declared in one of the following: A class declaration, An enum declaration, + * An interface declaration + */ + return; + } TypeDeclaration typeDecl = (TypeDeclaration) this.astStack[this.astPtr]; if(!this.statementRecoveryActivated) problemReporter().illegalLocalTypeDeclaration(typeDecl); // remove the ast node created in interface header @@ -4885,6 +4894,13 @@ protected void consumeInvalidEnumDeclaration() { protected void consumeInvalidInterfaceDeclaration() { // BlockStatement ::= InvalidInterfaceDeclaration //InterfaceDeclaration ::= Modifiersopt 'interface' 'Identifier' ExtendsInterfacesopt InterfaceHeader InterfaceBody + if (this.previewEnabled) { + /* JLS 15 Local Static Interfaces and Enum Classes - Records preview - Sec 6.1 + * A local class or interface (14.3), declared in one of the following: A class declaration, An enum declaration, + * An interface declaration + */ + return; + } TypeDeclaration typeDecl = (TypeDeclaration) this.astStack[this.astPtr]; if(!this.statementRecoveryActivated) problemReporter().illegalLocalTypeDeclaration(typeDecl); // remove the ast node created in interface header @@ -10917,9 +10933,6 @@ protected void consumeRecordComponentHeaderRightParen() { this.astPtr -= length; TypeDeclaration typeDecl = (TypeDeclaration) this.astStack[this.astPtr]; int nestedMethodLevel = this.nestedMethod[this.nestedType]; - typeDecl.isLocalRecord = nestedMethodLevel > 0; - if (typeDecl.isLocalRecord) - typeDecl.modifiers |= ClassFileConstants.AccStatic; // JLS 14 Sec 14.3 this.recordNestedMethodLevels.put(typeDecl, new Integer[] {this.nestedType, nestedMethodLevel}); this.astStack[this.astPtr] = typeDecl; // rd.sourceEnd = this.rParenPos; diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java index 2ea3d0d547..b472255352 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java @@ -11864,6 +11864,15 @@ public void recordMissingExplicitConstructorCallInNonCanonicalConstructor(ASTNod location.sourceStart, location.sourceEnd); } +public void recordIllegalStaticModifierForLocalClassOrInterface(SourceTypeBinding type) { + String[] arguments = new String[] {new String(type.sourceName())}; + this.handle( + IProblem.RecordIllegalStaticModifierForLocalClassOrInterface, + arguments, + arguments, + type.sourceStart(), + type.sourceEnd()); +} private void sealedMissingModifier(int problem, SourceTypeBinding type, TypeDeclaration typeDecl, TypeBinding superTypeBinding) { if (!this.options.enablePreviewFeatures) return; diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties index 6f180f2ea2..d0a0e3da7c 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties @@ -1059,6 +1059,7 @@ 1758 = Illegal parameter name {0} in canonical constructor, expected {1}, the corresponding component name 1759 = Illegal explicit assignment of a final field {0} in compact constructor 1760 = A non-canonical constructor must start with an explicit invocation to a constructor +1761 = A local interface, enum or record {0} is implicitly static; cannot have explicit static declaration 1780 = The pattern variable {0} is not in scope in this location |