# HG changeset patch # Parent f59960ebed2030cd6db78fb5ddd586aa0d5d3a07 diff -r f59960ebed20 src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java Mon Oct 22 11:51:17 2018 +0200 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/ClassFinder.java Mon Oct 29 15:58:03 2018 +0100 @@ -432,7 +432,10 @@ try { c.complete(); } catch (CompletionFailure ex) { - if (absent) syms.removeClass(ps.modle, flatname); + if (absent) { + syms.removeClass(ps.modle, flatname); + ex.dcfh.classSymbolRemoved(c); + } throw ex; } } diff -r f59960ebed20 src/jdk.compiler/share/classes/com/sun/tools/javac/code/DeferredCompletionFailureHandler.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/DeferredCompletionFailureHandler.java Mon Oct 22 11:51:17 2018 +0200 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/DeferredCompletionFailureHandler.java Mon Oct 29 15:58:03 2018 +0100 @@ -24,6 +24,7 @@ */ package com.sun.tools.javac.code; +import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; @@ -62,7 +63,7 @@ } public final Handler userCodeHandler = new Handler() { - private final Map class2Flip = new WeakHashMap<>(); + private final Map class2Flip = new HashMap<>(); public void install() { class2Flip.values().forEach(f -> f.flip()); @@ -78,6 +79,9 @@ } })); } + public void classSymbolRemoved(ClassSymbol sym) { + class2Flip.remove(sym); + } public void uninstall() { class2Flip.values().forEach(f -> f.flip()); } @@ -90,6 +94,7 @@ throw cf; } public void classSymbolCompleteFailed(ClassSymbol sym, Completer origCompleter) {} + public void classSymbolRemoved(ClassSymbol sym) {} public void uninstall() { } }; @@ -118,6 +123,10 @@ handler.classSymbolCompleteFailed(sym, origCompleter); } + public void classSymbolRemoved(ClassSymbol sym) { + handler.classSymbolRemoved(sym); + } + public boolean isDeferredCompleter(Completer c) { return c instanceof DeferredCompleter; } @@ -126,6 +135,7 @@ public void install(); public void handleAPICompletionFailure(CompletionFailure cf); public void classSymbolCompleteFailed(ClassSymbol sym, Completer origCompleter); + public void classSymbolRemoved(ClassSymbol sym); public void uninstall(); } @@ -173,5 +183,10 @@ this.members = prevMembers; } + @Override + public String toString() { + return "FlipSymbolDescription{" + "sym=" + sym.flatName() + '}'; + } + } } diff -r f59960ebed20 test/langtools/tools/javac/processing/model/completionfailure/SymbolsDontCumulate.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/processing/model/completionfailure/SymbolsDontCumulate.java Mon Oct 29 15:58:03 2018 +0100 @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 9999999 + * @summary XXX + * @library /tools/javac/lib /tools/lib + * @modules jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.code:+open + * @build JavacTestingAbstractProcessor SymbolsDontCumulate + * @run main SymbolsDontCumulate + */ + +import java.lang.reflect.Field; +import java.util.*; + +import javax.tools.JavaCompiler; +import javax.tools.StandardJavaFileManager; +import javax.tools.ToolProvider; + +import toolbox.*; +import com.sun.tools.javac.api.JavacTaskImpl; +import com.sun.tools.javac.code.DeferredCompletionFailureHandler; + +public class SymbolsDontCumulate { + ToolBox tb = new ToolBox(); + + void testSymbolsCumulate() throws Exception { + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + List errors = new ArrayList<>(); + + try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) { + com.sun.source.util.JavacTask task = (com.sun.source.util.JavacTask) + compiler.getTask(null, + fm, + d -> errors.add(d.getCode()), + Arrays.asList("-proc:none"), + Arrays.asList("java.lang.Object"), + null); + assertNotNull(task.getElements().getTypeElement("java.lang.Object")); + assertNull(task.getElements().getTypeElement("undef.Undef")); + assertNotNull(task.getElements().getTypeElement("java.lang.String")); + assertNull(task.getElements().getTypeElement("undef2.Undef2")); + DeferredCompletionFailureHandler h = DeferredCompletionFailureHandler.instance(((JavacTaskImpl) task).getContext()); + Field class2Flip = h.userCodeHandler.getClass().getDeclaredField("class2Flip"); + class2Flip.setAccessible(true); + int size = ((Map) class2Flip.get(h.userCodeHandler)).size(); + assertEquals(0, size); + } + } + + private static void assertEquals(Object expected, Object actual) { + if (!Objects.equals(expected, actual)) { + throw new AssertionError("Unexpected value, expected: " + expected + ", actual: " + actual); + } + } + + private static void assertNotNull(Object obj) { + if (obj == null) { + throw new AssertionError("Unexpected value, object: " + obj); + } + } + + private static void assertNull(Object obj) { + if (obj != null) { + throw new AssertionError("Unexpected value, object: " + obj); + } + } + + public static void main(String... args) throws Exception { + SymbolsDontCumulate t = new SymbolsDontCumulate(); + t.testSymbolsCumulate(); + } + +}