OpenJDK / amber / amber
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