Skip to content

Commit d5f9151

Browse files
Added more test & handled the upper 16 bits for sealed and non-sealed
1 parent 3aaa7bc commit d5f9151

File tree

5 files changed

+226
-11
lines changed

5 files changed

+226
-11
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.Bit29; // for class/interface
48+
final int AccNonSealed = ASTNode.Bit27; // 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.Bit26; // used for class/interface to set sealed
55+
final int AccSealed = ASTNode.Bit29; // 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: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,10 +1083,6 @@ 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-
10901086
/**
10911087
* @return the JSR 175 annotations for this type.
10921088
*/

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

Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ non-sealed class C extends A {}
188188
assertEquals("'non-sealed' modifier is not set in binding", Modifier.isNonSealed(aBinding.getModifiers()), true);
189189
}
190190

191+
//public sealed
191192
public void test003_c() throws CoreException {
192193
ASTParser astParser = ASTParser.newParser(getAST23());
193194
Map<String, String> options = new HashMap<>();
@@ -212,10 +213,222 @@ non-sealed class C extends A {}
212213
TypeDeclaration a = (TypeDeclaration) compilationUnit.types().get(0);
213214

214215
assertEquals("Modifier is not present in AST", Modifier.isSealed(a.getModifiers()), true);
216+
assertEquals("Modifier is not present in AST", Modifier.isPublic(a.getModifiers()), true);
215217

216218
assertEquals("permitted types are not present in AST", a.permittedTypes().size(), 2);
217219

218220
ITypeBinding aBinding = a.resolveBinding();
219221
assertEquals("'sealed' modifier is not set in binding", Modifier.isSealed(aBinding.getModifiers()), true);
222+
assertEquals("'public' modifier is not set in binding", Modifier.isPublic(aBinding.getModifiers()), true);
223+
}
224+
225+
//abstract final
226+
public void test003_d() throws CoreException {
227+
ASTParser astParser = ASTParser.newParser(getAST23());
228+
Map<String, String> options = new HashMap<>();
229+
options.put(JavaCore.COMPILER_COMPLIANCE, "23");
230+
options.put(JavaCore.COMPILER_SOURCE, "23");
231+
232+
astParser.setCompilerOptions(options);
233+
astParser.setEnvironment(new String[] {}, new String[] {}, new String[] {}, true);
234+
astParser.setUnitName("Example.java");
235+
astParser.setResolveBindings(true);
236+
astParser.setBindingsRecovery(true);
237+
238+
String source = """
239+
abstract final class A {}
240+
""";
241+
astParser.setSource(source.toCharArray());
242+
243+
CompilationUnit compilationUnit = (CompilationUnit) astParser.createAST(null);
244+
TypeDeclaration a = (TypeDeclaration) compilationUnit.types().get(0);
245+
246+
assertEquals("Modifier is not present in AST", Modifier.isAbstract(a.getModifiers()), true);
247+
assertEquals("Modifier is not present in AST", Modifier.isFinal(a.getModifiers()), true);
248+
249+
ITypeBinding aBinding = a.resolveBinding();
250+
251+
assertEquals("'abstract' modifier is not set in binding", Modifier.isAbstract(aBinding.getModifiers()), true);
252+
assertEquals("'final' modifier is not set in binding", Modifier.isFinal(aBinding.getModifiers()), true);
253+
}
254+
255+
//abstract non-sealed
256+
public void test003_e() throws CoreException {
257+
ASTParser astParser = ASTParser.newParser(getAST23());
258+
Map<String, String> options = new HashMap<>();
259+
options.put(JavaCore.COMPILER_COMPLIANCE, "23");
260+
options.put(JavaCore.COMPILER_SOURCE, "23");
261+
262+
astParser.setCompilerOptions(options);
263+
astParser.setEnvironment(new String[] {}, new String[] {}, new String[] {}, true);
264+
astParser.setUnitName("Example.java");
265+
astParser.setResolveBindings(true);
266+
astParser.setBindingsRecovery(true);
267+
268+
String source = """
269+
abstract non-sealed class A {}
270+
""";
271+
astParser.setSource(source.toCharArray());
272+
273+
CompilationUnit compilationUnit = (CompilationUnit) astParser.createAST(null);
274+
TypeDeclaration a = (TypeDeclaration) compilationUnit.types().get(0);
275+
276+
assertEquals("Modifier is not present in AST", Modifier.isAbstract(a.getModifiers()), true);
277+
assertEquals("Modifier is not present in AST", Modifier.isNonSealed(a.getModifiers()), true);
278+
279+
ITypeBinding aBinding = a.resolveBinding();
280+
281+
assertEquals("'abstract' modifier is not set in binding", Modifier.isAbstract(aBinding.getModifiers()), true);
282+
assertEquals("'non-sealed' modifier is not set in binding", Modifier.isNonSealed(aBinding.getModifiers()), true);
283+
}
284+
285+
//public final
286+
public void test003_f() throws CoreException {
287+
ASTParser astParser = ASTParser.newParser(getAST23());
288+
Map<String, String> options = new HashMap<>();
289+
options.put(JavaCore.COMPILER_COMPLIANCE, "23");
290+
options.put(JavaCore.COMPILER_SOURCE, "23");
291+
292+
astParser.setCompilerOptions(options);
293+
astParser.setEnvironment(new String[] {}, new String[] {}, new String[] {}, true);
294+
astParser.setUnitName("Example.java");
295+
astParser.setResolveBindings(true);
296+
astParser.setBindingsRecovery(true);
297+
298+
String source = """
299+
public final class A {}
300+
""";
301+
astParser.setSource(source.toCharArray());
302+
303+
CompilationUnit compilationUnit = (CompilationUnit) astParser.createAST(null);
304+
TypeDeclaration a = (TypeDeclaration) compilationUnit.types().get(0);
305+
306+
assertEquals("Modifier is not present in AST", Modifier.isPublic(a.getModifiers()), true);
307+
assertEquals("Modifier is not present in AST", Modifier.isFinal(a.getModifiers()), true);
308+
309+
ITypeBinding aBinding = a.resolveBinding();
310+
311+
assertEquals("'public' modifier is not set in binding", Modifier.isPublic(aBinding.getModifiers()), true);
312+
assertEquals("'final' modifier is not set in binding", Modifier.isFinal(aBinding.getModifiers()), true);
313+
}
314+
315+
//public non-sealed
316+
public void test003_g() throws CoreException {
317+
ASTParser astParser = ASTParser.newParser(getAST23());
318+
Map<String, String> options = new HashMap<>();
319+
options.put(JavaCore.COMPILER_COMPLIANCE, "23");
320+
options.put(JavaCore.COMPILER_SOURCE, "23");
321+
322+
astParser.setCompilerOptions(options);
323+
astParser.setEnvironment(new String[] {}, new String[] {}, new String[] {}, true);
324+
astParser.setUnitName("Example.java");
325+
astParser.setResolveBindings(true);
326+
astParser.setBindingsRecovery(true);
327+
328+
String source = """
329+
public non-sealed class A {}
330+
""";
331+
astParser.setSource(source.toCharArray());
332+
333+
CompilationUnit compilationUnit = (CompilationUnit) astParser.createAST(null);
334+
TypeDeclaration a = (TypeDeclaration) compilationUnit.types().get(0);
335+
336+
assertEquals("Modifier is not present in AST", Modifier.isPublic(a.getModifiers()), true);
337+
assertEquals("Modifier is not present in AST", Modifier.isNonSealed(a.getModifiers()), true);
338+
339+
ITypeBinding aBinding = a.resolveBinding();
340+
341+
assertEquals("'public' modifier is not set in binding", Modifier.isPublic(aBinding.getModifiers()), true);
342+
assertEquals("'final' modifier is not set in binding", Modifier.isNonSealed(aBinding.getModifiers()), true);
343+
}
344+
345+
//protected non-sealed
346+
public void test003_h() throws CoreException {
347+
ASTParser astParser = ASTParser.newParser(getAST23());
348+
Map<String, String> options = new HashMap<>();
349+
options.put(JavaCore.COMPILER_COMPLIANCE, "23");
350+
options.put(JavaCore.COMPILER_SOURCE, "23");
351+
352+
astParser.setCompilerOptions(options);
353+
astParser.setEnvironment(new String[] {}, new String[] {}, new String[] {}, true);
354+
astParser.setUnitName("Example.java");
355+
astParser.setResolveBindings(true);
356+
astParser.setBindingsRecovery(true);
357+
358+
String source = """
359+
protected non-sealed class A {}
360+
""";
361+
astParser.setSource(source.toCharArray());
362+
363+
CompilationUnit compilationUnit = (CompilationUnit) astParser.createAST(null);
364+
TypeDeclaration a = (TypeDeclaration) compilationUnit.types().get(0);
365+
366+
assertEquals("Modifier is not present in AST", Modifier.isProtected(a.getModifiers()), true);
367+
assertEquals("Modifier is not present in AST", Modifier.isNonSealed(a.getModifiers()), true);
368+
369+
ITypeBinding aBinding = a.resolveBinding();
370+
371+
assertEquals("'public' modifier is not set in binding", Modifier.isProtected(aBinding.getModifiers()), true);
372+
assertEquals("'final' modifier is not set in binding", Modifier.isNonSealed(aBinding.getModifiers()), true);
373+
}
374+
375+
//private non-sealed
376+
public void test003_i() throws CoreException {
377+
ASTParser astParser = ASTParser.newParser(getAST23());
378+
Map<String, String> options = new HashMap<>();
379+
options.put(JavaCore.COMPILER_COMPLIANCE, "23");
380+
options.put(JavaCore.COMPILER_SOURCE, "23");
381+
382+
astParser.setCompilerOptions(options);
383+
astParser.setEnvironment(new String[] {}, new String[] {}, new String[] {}, true);
384+
astParser.setUnitName("Example.java");
385+
astParser.setResolveBindings(true);
386+
astParser.setBindingsRecovery(true);
387+
388+
String source = """
389+
private non-sealed class A {}
390+
""";
391+
astParser.setSource(source.toCharArray());
392+
393+
CompilationUnit compilationUnit = (CompilationUnit) astParser.createAST(null);
394+
TypeDeclaration a = (TypeDeclaration) compilationUnit.types().get(0);
395+
396+
assertEquals("Modifier is not present in AST", Modifier.isPrivate(a.getModifiers()), true);
397+
assertEquals("Modifier is not present in AST", Modifier.isNonSealed(a.getModifiers()), true);
398+
399+
ITypeBinding aBinding = a.resolveBinding();
400+
401+
assertEquals("'public' modifier is not set in binding", Modifier.isPrivate(aBinding.getModifiers()), true);
402+
assertEquals("'final' modifier is not set in binding", Modifier.isNonSealed(aBinding.getModifiers()), true);
403+
}
404+
405+
//protected abstract
406+
public void test003_j() throws CoreException {
407+
ASTParser astParser = ASTParser.newParser(getAST23());
408+
Map<String, String> options = new HashMap<>();
409+
options.put(JavaCore.COMPILER_COMPLIANCE, "23");
410+
options.put(JavaCore.COMPILER_SOURCE, "23");
411+
412+
astParser.setCompilerOptions(options);
413+
astParser.setEnvironment(new String[] {}, new String[] {}, new String[] {}, true);
414+
astParser.setUnitName("Example.java");
415+
astParser.setResolveBindings(true);
416+
astParser.setBindingsRecovery(true);
417+
418+
String source = """
419+
protected abstract class A {}
420+
""";
421+
astParser.setSource(source.toCharArray());
422+
423+
CompilationUnit compilationUnit = (CompilationUnit) astParser.createAST(null);
424+
TypeDeclaration a = (TypeDeclaration) compilationUnit.types().get(0);
425+
426+
assertEquals("Modifier is not present in AST", Modifier.isProtected(a.getModifiers()), true);
427+
assertEquals("Modifier is not present in AST", Modifier.isAbstract(a.getModifiers()), true);
428+
429+
ITypeBinding aBinding = a.resolveBinding();
430+
431+
assertEquals("'public' modifier is not set in binding", Modifier.isProtected(aBinding.getModifiers()), true);
432+
assertEquals("'final' modifier is not set in binding", Modifier.isAbstract(aBinding.getModifiers()), true);
220433
}
221434
}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,14 +336,14 @@ public String toString() {
336336
* Applicable only to types.
337337
* @since 3.24
338338
*/
339-
public static final int SEALED = 0x0200;
339+
public static final int SEALED = 0x1000;
340340

341341
/**
342342
* "non-sealed" modifier constant (bit mask).
343343
* Applicable only to types.
344344
* @since 3.24
345345
*/
346-
public static final int NON_SEALED = 0x1000;
346+
public static final int NON_SEALED = 0x400;
347347

348348
/**
349349
* "module" modifier constant (bit mask).
@@ -537,6 +537,9 @@ public static boolean isDefault(int flags) {
537537
* @since 3.24
538538
*/
539539
public static boolean isSealed(int flags) {
540+
if(flags < -32768 || flags > 32767) {
541+
return((flags >>> 16 ) & SEALED ) != 0;
542+
}
540543
return (flags & SEALED) != 0;
541544
}
542545

@@ -550,6 +553,9 @@ public static boolean isSealed(int flags) {
550553
* @since 3.24
551554
*/
552555
public static boolean isNonSealed(int flags) {
556+
if(flags < -32768 || flags > 32767) {
557+
return ((flags >>> 16 ) & NON_SEALED ) != 0;
558+
}
553559
return (flags & NON_SEALED) != 0;
554560
}
555561

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -588,13 +588,13 @@ public int getKind() {
588588
public int getModifiers() {
589589
if (isClass()) {
590590
ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;
591-
if (referenceBinding.isSealed() || referenceBinding.isNonSealed()) {
592-
return referenceBinding.getAccessFlagsForSealedAndNonSealed();
593-
}
594591
final int accessFlags = referenceBinding.getAccessFlags() & VALID_MODIFIERS;
595592
if (referenceBinding.isAnonymousType()) {
596593
return accessFlags & ~Modifier.FINAL;
597594
}
595+
if((referenceBinding.modifiers < -32768 || referenceBinding.modifiers > 32767) && (referenceBinding.isSealed() || referenceBinding.isNonSealed())) {//checks the modifiers has upper 16 bits
596+
return referenceBinding.modifiers;
597+
}
598598
return accessFlags;
599599
} else if (isAnnotation()) {
600600
ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;

0 commit comments

Comments
 (0)