changeset 54856:fff84ca16810 sealed

adding regression tests, plus bug fixing
author vromero
date Wed, 13 Feb 2019 16:07:19 -0500
parents f99466fd6759
children 2e83af66670a
files src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java test/langtools/tools/javac/sealed/SealedTest01.out test/langtools/tools/javac/sealed/separate/TestSeparate_Neg.out
diffstat 4 files changed, 84 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java	Tue Feb 12 18:35:32 2019 -0500
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java	Wed Feb 13 16:07:19 2019 -0500
@@ -4836,29 +4836,33 @@
 
         Type st = types.supertype(c.type);
         boolean anyParentIsSealed = false;
-        ListBuffer<ClassType> sealedParents = new ListBuffer<>();
+        ListBuffer<Pair<ClassType, JCExpression>> potentiallySealedParents = new ListBuffer<>();
         if (st != Type.noType && (st.tsym.isSealed() || st.tsym.isFinal())) {
-            sealedParents.add((ClassType)st);
+            potentiallySealedParents.add(new Pair<>((ClassType)st, tree.extending));
             anyParentIsSealed = true;
         }
 
         if (tree.implementing != null) {
             for (JCExpression expr : tree.implementing) {
                 if (expr.type.tsym.isSealed() || expr.type.tsym.isFinal()) {
-                    sealedParents.add((ClassType)expr.type);
+                    potentiallySealedParents.add(new Pair<>((ClassType)expr.type, expr));
                     anyParentIsSealed = true;
                 }
             }
         }
 
-        for (ClassType sealedParent: sealedParents) {
-            if (!sealedParent.permitted.map(t -> t.tsym).contains(c.type.tsym)) {
-                boolean areNestmates = sealedParent.tsym.outermostClass() == tree.sym.outermostClass();
-                boolean isSealed = sealedParent.tsym.isSealed();
-                if (areNestmates && !sealedParent.tsym.isSealed()) {
-                    sealedParent.permitted = sealedParent.permitted.prepend(tree.sym.type);
+        for (Pair<ClassType, JCExpression> sealedParentPair: potentiallySealedParents) {
+            if (!sealedParentPair.fst.permitted.map(t -> t.tsym).contains(c.type.tsym)) {
+                boolean areNestmates = sealedParentPair.fst.tsym.outermostClass() == tree.sym.outermostClass();
+                boolean isSealed = sealedParentPair.fst.tsym.isSealed();
+                if (areNestmates) {
+                    if (!sealedParentPair.fst.tsym.isSealed()) {
+                        sealedParentPair.fst.permitted = sealedParentPair.fst.permitted.prepend(tree.sym.type);
+                    } else if (!dontErrorIfSealedExtended) {
+                        log.error(sealedParentPair.snd, Errors.CantInheritFromSealed(sealedParentPair.fst.tsym));
+                    }
                 } else if (!dontErrorIfSealedExtended) {
-                    log.error(tree, Errors.CantInheritFromSealed(sealedParent.tsym));
+                    log.error(sealedParentPair.snd, Errors.CantInheritFromSealed(sealedParentPair.fst.tsym));
                 }
             }
         }
--- a/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java	Tue Feb 12 18:35:32 2019 -0500
+++ b/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java	Wed Feb 13 16:07:19 2019 -0500
@@ -101,6 +101,33 @@
         checkSubtypeClassFile(out, "Test$Sub2.class", "Test$Sealed");
     }
 
+    @Test
+    public void testSameCompilationUnitPos2(Path base) throws Exception {
+        Path src = base.resolve("src");
+        Path test = src.resolve("Test");
+
+        tb.writeJavaFiles(test,
+                "class Test {\n" +
+                        "    final class Sealed {}\n" +
+                        "    class Sub1 extends Sealed {}\n" +
+                        "    class Sub2 extends Sealed {}\n" +
+                        "}");
+
+        Path out = base.resolve("out");
+
+        Files.createDirectories(out);
+
+        new JavacTask(tb)
+                .outdir(out)
+                .files(findJavaFiles(test))
+                .run()
+                .writeAll();
+
+        checkSealedClassFile(out, "Test$Sealed.class", List.of("Test$Sub1", "Test$Sub2"));
+        checkSubtypeClassFile(out, "Test$Sub1.class", "Test$Sealed");
+        checkSubtypeClassFile(out, "Test$Sub2.class", "Test$Sealed");
+    }
+
     private void checkSealedClassFile(Path out, String cfName, List<String> expectedSubTypeNames) throws ConstantPoolException, Exception {
         ClassFile sealedCF = ClassFile.read(out.resolve(cfName));
         Assert.check((sealedCF.access_flags.flags & Flags.FINAL) != 0, String.format("class at file %s must be final", cfName));
@@ -225,7 +252,7 @@
                 .getOutputLines(OutputKind.DIRECT);
 
         List<String> expected = List.of(
-                "Test.java:4:5: compiler.err.cant.inherit.from.sealed: Test.Sealed",
+                "Test.java:4:24: compiler.err.cant.inherit.from.sealed: Test.Sealed",
                 "1 error");
         if (!error.containsAll(expected)) {
             throw new AssertionError("Expected output not found. Expected: " + expected);
@@ -264,7 +291,40 @@
                 .getOutputLines(OutputKind.DIRECT);
 
         List<String> expected = List.of(
-                "Sub2.java:3:1: compiler.err.cant.inherit.from.sealed: pkg.Sealed",
+                "Sub2.java:3:20: compiler.err.cant.inherit.from.sealed: pkg.Sealed",
+                "1 error");
+        if (!error.containsAll(expected)) {
+            throw new AssertionError("Expected output not found. Expected: " + expected);
+        }
+    }
+
+    @Test
+    public void testSamePackageNeg2(Path base) throws Exception {
+        Path src = base.resolve("src");
+        Path pkg = src.resolve("pkg");
+        Path sealed = pkg.resolve("Sealed");
+        Path sub1 = pkg.resolve("Sub1");
+
+        tb.writeJavaFiles(sealed,
+                "package pkg;\n" +
+                        "\n" +
+                        "final class Sealed {\n" +
+                        "}");
+        tb.writeJavaFiles(sub1,
+                "package pkg;\n" +
+                        "\n" +
+                        "class Sub1 extends Sealed {\n" +
+                        "}");
+
+        List<String> error = new JavacTask(tb)
+                .options("-XDrawDiagnostics")
+                .files(findJavaFiles(pkg))
+                .run(Task.Expect.FAIL)
+                .writeAll()
+                .getOutputLines(OutputKind.DIRECT);
+
+        List<String> expected = List.of(
+                "Sub1.java:3:20: compiler.err.cant.inherit.from.final: pkg.Sealed",
                 "1 error");
         if (!error.containsAll(expected)) {
             throw new AssertionError("Expected output not found. Expected: " + expected);
--- a/test/langtools/tools/javac/sealed/SealedTest01.out	Tue Feb 12 18:35:32 2019 -0500
+++ b/test/langtools/tools/javac/sealed/SealedTest01.out	Wed Feb 13 16:07:19 2019 -0500
@@ -1,5 +1,5 @@
-SealedTest01.java:19:12: compiler.err.cant.inherit.from.sealed: SealedTest01.SC
-SealedTest01.java:20:12: compiler.err.cant.inherit.from.sealed: SealedTest01.SAC
-SealedTest01.java:21:12: compiler.err.cant.inherit.from.sealed: SealedTest01.SI
-SealedTest01.java:22:12: compiler.err.cant.inherit.from.sealed: SealedTest01.SI
+SealedTest01.java:19:43: compiler.err.cant.inherit.from.sealed: SealedTest01.SC
+SealedTest01.java:20:44: compiler.err.cant.inherit.from.sealed: SealedTest01.SAC
+SealedTest01.java:21:46: compiler.err.cant.inherit.from.sealed: SealedTest01.SI
+SealedTest01.java:22:47: compiler.err.cant.inherit.from.sealed: SealedTest01.SI
 4 errors
--- a/test/langtools/tools/javac/sealed/separate/TestSeparate_Neg.out	Tue Feb 12 18:35:32 2019 -0500
+++ b/test/langtools/tools/javac/sealed/separate/TestSeparate_Neg.out	Wed Feb 13 16:07:19 2019 -0500
@@ -1,5 +1,5 @@
-TestSeparate_Neg.java:8:12: compiler.err.cant.inherit.from.sealed: SealedClasses.SC
-TestSeparate_Neg.java:9:12: compiler.err.cant.inherit.from.sealed: SealedClasses.SAC
-TestSeparate_Neg.java:10:12: compiler.err.cant.inherit.from.sealed: SealedClasses.SI
-TestSeparate_Neg.java:11:12: compiler.err.cant.inherit.from.sealed: SealedClasses.SI
+TestSeparate_Neg.java:8:45: compiler.err.cant.inherit.from.sealed: SealedClasses.SC
+TestSeparate_Neg.java:9:46: compiler.err.cant.inherit.from.sealed: SealedClasses.SAC
+TestSeparate_Neg.java:10:48: compiler.err.cant.inherit.from.sealed: SealedClasses.SI
+TestSeparate_Neg.java:11:49: compiler.err.cant.inherit.from.sealed: SealedClasses.SI
 4 errors