Skip to content

Commit 3aaa7bc

Browse files
In-corporated code review changes and added more unit tests
1 parent 8df4662 commit 3aaa7bc

File tree

4 files changed

+41
-9
lines changed

4 files changed

+41
-9
lines changed

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ExtraCompilerModifiers.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@ public interface ExtraCompilerModifiers { // modifier constant
4545
final int AccUnresolved = ASTNode.Bit26;
4646
final int AccBlankFinal = ASTNode.Bit27; // for blank final variables
4747
final int AccIsDefaultConstructor = ASTNode.Bit27; // for default constructor
48-
final int AccNonSealed = ASTNode.Bit27; // for class/interface
48+
final int AccNonSealed = ASTNode.Bit29; // for class/interface
4949
final int AccLocallyUsed = ASTNode.Bit28; // used to diagnose unused (a) private/local members or (b) members of private classes
5050
// generally set when actual usage has been detected
5151
// or, (b) when member of a private class is exposed via a non-private subclass
5252
// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=328281
5353
final int AccVisibilityMASK = ClassFileConstants.AccPublic | ClassFileConstants.AccProtected | ClassFileConstants.AccPrivate;
5454

55-
final int AccSealed = ASTNode.Bit29; // used for class/interface to set sealed
55+
final int AccSealed = ASTNode.Bit26; // used for class/interface to set sealed
5656
final int AccOverriding = ASTNode.Bit29; // record fact a method overrides another one
5757
final int AccImplementing = ASTNode.Bit30; // record fact a method implements another one (it is concrete and overrides an abstract one)
5858
final int AccImplicitlyDeclared = ASTNode.Bit30; // used for implicitly declared classes

org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,10 @@ public final int getAccessFlags() {
10831083
return this.modifiers & ExtraCompilerModifiers.AccJustFlag;
10841084
}
10851085

1086+
public final int getAccessFlagsForSealedAndNonSealed() {
1087+
return ((this.modifiers >>> 16) & 0xFFFF) & ExtraCompilerModifiers.AccJustFlag;
1088+
}
1089+
10861090
/**
10871091
* @return the JSR 175 annotations for this type.
10881092
*/

org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter_23Test.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,35 @@ non-sealed class C extends A {}
187187
ITypeBinding aBinding = a.resolveBinding();
188188
assertEquals("'non-sealed' modifier is not set in binding", Modifier.isNonSealed(aBinding.getModifiers()), true);
189189
}
190+
191+
public void test003_c() throws CoreException {
192+
ASTParser astParser = ASTParser.newParser(getAST23());
193+
Map<String, String> options = new HashMap<>();
194+
options.put(JavaCore.COMPILER_COMPLIANCE, "23");
195+
options.put(JavaCore.COMPILER_SOURCE, "23");
196+
197+
astParser.setCompilerOptions(options);
198+
astParser.setEnvironment(new String[] {}, new String[] {}, new String[] {}, true);
199+
astParser.setUnitName("Example.java");
200+
astParser.setResolveBindings(true);
201+
astParser.setBindingsRecovery(true);
202+
203+
String source ="""
204+
public sealed class A permits B, C {}
205+
final class B extends A {}
206+
non-sealed class C extends A {}
207+
""";
208+
209+
astParser.setSource(source.toCharArray());
210+
211+
CompilationUnit compilationUnit = (CompilationUnit) astParser.createAST(null);
212+
TypeDeclaration a = (TypeDeclaration) compilationUnit.types().get(0);
213+
214+
assertEquals("Modifier is not present in AST", Modifier.isSealed(a.getModifiers()), true);
215+
216+
assertEquals("permitted types are not present in AST", a.permittedTypes().size(), 2);
217+
218+
ITypeBinding aBinding = a.resolveBinding();
219+
assertEquals("'sealed' modifier is not set in binding", Modifier.isSealed(aBinding.getModifiers()), true);
220+
}
190221
}

org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -588,16 +588,13 @@ public int getKind() {
588588
public int getModifiers() {
589589
if (isClass()) {
590590
ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;
591-
int k = referenceBinding.getAccessFlags();
592-
final int accessFlags = k & VALID_MODIFIERS;
591+
if (referenceBinding.isSealed() || referenceBinding.isNonSealed()) {
592+
return referenceBinding.getAccessFlagsForSealedAndNonSealed();
593+
}
594+
final int accessFlags = referenceBinding.getAccessFlags() & VALID_MODIFIERS;
593595
if (referenceBinding.isAnonymousType()) {
594596
return accessFlags & ~Modifier.FINAL;
595-
} else if (referenceBinding.isSealed()) {
596-
return Modifier.SEALED;
597-
} else if (referenceBinding.isNonSealed()) {
598-
return Modifier.NON_SEALED;
599597
}
600-
601598
return accessFlags;
602599
} else if (isAnnotation()) {
603600
ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;

0 commit comments

Comments
 (0)