test/langtools/tools/javac/processing/model/completionfailure/NoAbortForBadClassFile.java
author jlahoda
Fri, 09 Mar 2018 09:42:10 +0100
changeset 49197 cc2673fa8c20
parent 47216 71c04702a3d5
child 50712 df7094f72869
permissions -rw-r--r--
8187950: javax.lang.model APIs throws CompletionFailure or a subtype of CompletionFailure. Summary: Catching CompletionFailures that would be thrown to API clients, and re-completing the symbols again when javac itself needs it. Reviewed-by: cushon, jjg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45910
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
     1
/*
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
     2
 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
     4
 *
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
     7
 * published by the Free Software Foundation.
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
     8
 *
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    13
 * accompanied this code).
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    14
 *
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    18
 *
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    21
 * questions.
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    22
 */
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    23
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    24
/**
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    25
 * @test
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    26
 * @bug 8182450
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    27
 * @summary Bad classfiles should not abort compilations
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    28
 * @library /tools/lib
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    29
 * @modules
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    30
 *      jdk.compiler/com.sun.tools.javac.api
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    31
 *      jdk.compiler/com.sun.tools.javac.code
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    32
 *      jdk.compiler/com.sun.tools.javac.comp
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    33
 *      jdk.compiler/com.sun.tools.javac.jvm
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    34
 *      jdk.compiler/com.sun.tools.javac.main
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    35
 *      jdk.compiler/com.sun.tools.javac.processing
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    36
 *      jdk.compiler/com.sun.tools.javac.util
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    37
 * @build toolbox.ToolBox toolbox.JavacTask
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    38
 * @run main NoAbortForBadClassFile
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    39
 */
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    40
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    41
import java.nio.file.Files;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    42
import java.nio.file.Path;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    43
import java.nio.file.Paths;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    44
import java.util.ArrayList;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    45
import java.util.Arrays;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    46
import java.util.Collections;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    47
import java.util.List;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    48
import java.util.stream.Collectors;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    49
import java.util.stream.Stream;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    50
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    51
import com.sun.tools.javac.api.JavacTaskImpl;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    52
import com.sun.tools.javac.api.JavacTool;
49197
cc2673fa8c20 8187950: javax.lang.model APIs throws CompletionFailure or a subtype of CompletionFailure.
jlahoda
parents: 47216
diff changeset
    53
import com.sun.tools.javac.code.DeferredCompletionFailureHandler;
45910
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    54
import com.sun.tools.javac.code.Flags;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    55
import com.sun.tools.javac.code.Symbol.ClassSymbol;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    56
import com.sun.tools.javac.code.Symbol.CompletionFailure;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    57
import com.sun.tools.javac.code.Symtab;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    58
import com.sun.tools.javac.jvm.ClassReader;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    59
import com.sun.tools.javac.util.Context;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    60
import com.sun.tools.javac.util.Context.Factory;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    61
import com.sun.tools.javac.util.Names;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    62
import com.sun.tools.javac.util.Options;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    63
import toolbox.Task;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    64
import toolbox.Task.Expect;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    65
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    66
import toolbox.TestRunner;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    67
import toolbox.ToolBox;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    68
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    69
public class NoAbortForBadClassFile extends TestRunner {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    70
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    71
    private ToolBox tb = new ToolBox();
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    72
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    73
    public NoAbortForBadClassFile() {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    74
        super(System.out);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    75
    }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    76
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    77
    public static void main(String... args) throws Exception {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    78
        new NoAbortForBadClassFile().runTests(m -> new Object[] { Paths.get(m.getName()) });
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    79
    }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    80
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    81
    @Test
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    82
    public void testBrokenClassFile(Path base) throws Exception {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    83
        Path classes = base.resolve("classes");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    84
        Path brokenClassFile = classes.resolve("test").resolve("Broken.class");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    85
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    86
        Files.createDirectories(brokenClassFile.getParent());
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    87
        Files.newOutputStream(brokenClassFile).close();
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    88
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    89
        Path src = base.resolve("src");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    90
        tb.writeJavaFiles(src,
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    91
                          "package test; public class Test { private void test() { Broken b; String.unknown(); } }");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    92
        Path out = base.resolve("out");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    93
        tb.createDirectories(out);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    94
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    95
        List<String> log = new toolbox.JavacTask(tb)
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    96
                .options("-classpath", classes.toString(),
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    97
                         "-XDrawDiagnostics")
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    98
                .outdir(out)
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
    99
                .files(tb.findJavaFiles(src))
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   100
                .run(Expect.FAIL)
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   101
                .writeAll()
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   102
                .getOutputLines(Task.OutputKind.DIRECT);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   103
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   104
        List<String> expectedOut = Arrays.asList(
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   105
                "Test.java:1:57: compiler.err.cant.access: test.Broken, (compiler.misc.bad.class.file.header: Broken.class, (compiler.misc.class.file.wrong.class: java.lang.AutoCloseable))",
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   106
                 "Test.java:1:73: compiler.err.cant.resolve.location.args: kindname.method, unknown, , , (compiler.misc.location: kindname.class, java.lang.String, null)",
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   107
                 "2 errors"
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   108
        );
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   109
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   110
        if (!expectedOut.equals(log))
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   111
            throw new Exception("expected output not found: " + log);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   112
    }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   113
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   114
    @Test
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   115
    public void testLoading(Path base) throws Exception {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   116
        Path src = base.resolve("src");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   117
        tb.writeJavaFiles(src,
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   118
                          "public class Test { static { new Object() {}; } public static class I { public static class II { } } }");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   119
        Path out = base.resolve("out");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   120
        tb.createDirectories(out);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   121
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   122
        new toolbox.JavacTask(tb)
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   123
                .outdir(out)
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   124
                .files(tb.findJavaFiles(src))
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   125
                .run(Expect.SUCCESS)
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   126
                .writeAll()
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   127
                .getOutputLines(Task.OutputKind.DIRECT);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   128
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   129
        List<Path> files;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   130
        try (Stream<Path> dir = Files.list(out)) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   131
            files = dir.collect(Collectors.toList());
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   132
        }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   133
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   134
        List<List<Path>> result = new ArrayList<>();
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   135
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   136
        permutations(files, Collections.emptyList(), result);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   137
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   138
        for (List<Path> order : result) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   139
            for (Path missing : order) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   140
                Path test = base.resolve("test");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   141
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   142
                if (Files.exists(test)) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   143
                    tb.cleanDirectory(test);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   144
                } else {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   145
                    tb.createDirectories(test);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   146
                }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   147
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   148
                for (Path p : order) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   149
                    Files.copy(p, test.resolve(p.getFileName()));
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   150
                }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   151
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   152
                List<String> actual = complete(test, order, missing, true);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   153
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   154
                Files.delete(test.resolve(missing.getFileName()));
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   155
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   156
                List<String> expected = complete(test, order, missing, false);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   157
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   158
                if (!actual.equals(expected)) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   159
                    throw new AssertionError("Unexpected state, actual=\n" + actual + "\nexpected=\n" + expected + "\norder=" + order + "\nmissing=" + missing);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   160
                }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   161
            }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   162
        }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   163
    }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   164
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   165
    private static void permutations(List<Path> todo, List<Path> currentList, List<List<Path>> result) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   166
        if (todo.isEmpty()) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   167
            result.add(currentList);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   168
            return ;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   169
        }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   170
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   171
        for (Path p : todo) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   172
            List<Path> nextTODO = new ArrayList<>(todo);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   173
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   174
            nextTODO.remove(p);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   175
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   176
            List<Path> nextList = new ArrayList<>(currentList);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   177
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   178
            nextList.add(p);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   179
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   180
            permutations(nextTODO, nextList, result);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   181
        }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   182
    }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   183
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   184
    private List<String> complete(Path test, List<Path> order, Path missing, boolean badClassFile) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   185
        Context context = new Context();
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   186
        if (badClassFile) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   187
            TestClassReader.preRegister(context);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   188
        }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   189
        JavacTool tool = JavacTool.create();
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   190
        JavacTaskImpl task = (JavacTaskImpl) tool.getTask(null, null, null, List.of("-classpath", test.toString(), "-XDblockClass=" + flatName(missing)), null, null, context);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   191
        Symtab syms = Symtab.instance(context);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   192
        Names names = Names.instance(context);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   193
49197
cc2673fa8c20 8187950: javax.lang.model APIs throws CompletionFailure or a subtype of CompletionFailure.
jlahoda
parents: 47216
diff changeset
   194
        DeferredCompletionFailureHandler dcfh = DeferredCompletionFailureHandler.instance(context);
cc2673fa8c20 8187950: javax.lang.model APIs throws CompletionFailure or a subtype of CompletionFailure.
jlahoda
parents: 47216
diff changeset
   195
cc2673fa8c20 8187950: javax.lang.model APIs throws CompletionFailure or a subtype of CompletionFailure.
jlahoda
parents: 47216
diff changeset
   196
        dcfh.setHandler(dcfh.javacCodeHandler);
cc2673fa8c20 8187950: javax.lang.model APIs throws CompletionFailure or a subtype of CompletionFailure.
jlahoda
parents: 47216
diff changeset
   197
45910
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   198
        task.getElements().getTypeElement("java.lang.Object");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   199
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   200
        if (!badClassFile) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   201
            //to ensure the same paths taken in ClassFinder.completeEnclosing in case the file is missing:
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   202
            syms.enterClass(syms.unnamedModule, names.fromString(flatName(missing)));
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   203
        }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   204
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   205
        List<String> result = new ArrayList<>();
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   206
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   207
        for (Path toCheck : order) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   208
            ClassSymbol sym = syms.enterClass(syms.unnamedModule, names.fromString(flatName(toCheck)));
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   209
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   210
            try {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   211
                sym.complete();
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   212
            } catch (CompletionFailure ignore) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   213
            }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   214
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   215
            long flags = sym.flags_field;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   216
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   217
            flags &= ~(Flags.CLASS_SEEN | Flags.SOURCE_SEEN);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   218
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   219
            result.add("sym: " + sym.flatname + ", " + sym.owner.flatName() +
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   220
                       ", " + sym.type + ", " + sym.members_field + ", " + flags);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   221
        }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   222
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   223
        return result;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   224
    }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   225
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   226
    private String flatName(Path p) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   227
        return p.getFileName().toString().replace(".class", "");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   228
    }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   229
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   230
    private static class TestClassReader extends ClassReader {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   231
        public static void preRegister(Context ctx) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   232
            ctx.put(classReaderKey, (Factory<ClassReader>) c -> new TestClassReader(ctx));
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   233
        }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   234
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   235
        private final String block;
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   236
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   237
        public TestClassReader(Context context) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   238
            super(context);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   239
            block = Options.instance(context).get("blockClass");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   240
        }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   241
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   242
        @Override
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   243
        public void readClassFile(ClassSymbol c) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   244
            super.readClassFile(c);
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   245
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   246
            if (c.flatname.contentEquals(block)) {
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   247
                throw badClassFile("blocked");
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   248
            }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   249
        }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   250
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   251
    }
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   252
c7092e4591b2 8182450: javac aborts when generating ct.sym intermittently
jlahoda
parents:
diff changeset
   253
}