8187978: javac can show overload error messages that include non-valid candidates
Reviewed-by: mcimadamore
This commit is contained in:
parent
870b0834fe
commit
47e2972a64
@ -59,6 +59,7 @@ import java.util.EnumSet;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.BiFunction;
|
||||
@ -4040,14 +4041,35 @@ public class Resolve {
|
||||
}
|
||||
//where
|
||||
private Map<Symbol, JCDiagnostic> mapCandidates() {
|
||||
Map<Symbol, JCDiagnostic> candidates = new LinkedHashMap<>();
|
||||
MostSpecificMap candidates = new MostSpecificMap();
|
||||
for (Candidate c : resolveContext.candidates) {
|
||||
if (c.isApplicable()) continue;
|
||||
candidates.put(c.sym, c.details);
|
||||
candidates.put(c);
|
||||
}
|
||||
return candidates;
|
||||
}
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
private class MostSpecificMap extends LinkedHashMap<Symbol, JCDiagnostic> {
|
||||
private void put(Candidate c) {
|
||||
ListBuffer<Symbol> overridden = new ListBuffer<>();
|
||||
for (Symbol s : keySet()) {
|
||||
if (s == c.sym) {
|
||||
continue;
|
||||
}
|
||||
if (c.sym.overrides(s, (TypeSymbol)s.owner, types, false)) {
|
||||
overridden.add(s);
|
||||
} else if (s.overrides(c.sym, (TypeSymbol)c.sym.owner, types, false)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
for (Symbol s : overridden) {
|
||||
remove(s);
|
||||
}
|
||||
put(c.sym, c.details);
|
||||
}
|
||||
}
|
||||
|
||||
Map<Symbol, JCDiagnostic> filterCandidates(Map<Symbol, JCDiagnostic> candidatesMap) {
|
||||
Map<Symbol, JCDiagnostic> candidates = new LinkedHashMap<>();
|
||||
for (Map.Entry<Symbol, JCDiagnostic> _entry : candidatesMap.entrySet()) {
|
||||
|
@ -0,0 +1,18 @@
|
||||
/*
|
||||
* @test /nodynamiccopyright/
|
||||
* @bug 8187978
|
||||
* @summary javac can show overload error messages that include non-valid candidates
|
||||
* @compile/fail/ref=FilterOutCandidatesForDiagnosticsTest.out -XDrawDiagnostics FilterOutCandidatesForDiagnosticsTest.java
|
||||
*/
|
||||
|
||||
import java.util.*;
|
||||
|
||||
class FilterOutCandidatesForDiagnosticsTest {
|
||||
void test() {
|
||||
make(new ArrayList<String>(), new ArrayList<Integer>()).add("");
|
||||
}
|
||||
|
||||
<Z> Z make(Z z1, Z z2) {
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
FilterOutCandidatesForDiagnosticsTest.java:12:64: compiler.err.cant.apply.symbols: kindname.method, add, java.lang.String,{(compiler.misc.inapplicable.method: kindname.method, java.util.ArrayList, add(compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>,java.lang.Object[],int), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.method, java.util.ArrayList, add(compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>))),(compiler.misc.inapplicable.method: kindname.method, java.util.ArrayList, add(int,compiler.misc.type.captureof: 1, ? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>), (compiler.misc.arg.length.mismatch))}
|
||||
1 error
|
@ -1,2 +1,2 @@
|
||||
Martin.java:15:11: compiler.err.cant.apply.symbols: kindname.method, addAll, java.util.List<compiler.misc.type.captureof: 1, ?>,{(compiler.misc.inapplicable.method: kindname.method, java.util.Collection, addAll(java.util.Collection<? extends compiler.misc.type.captureof: 2, ?>), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.util.List<compiler.misc.type.captureof: 1, ?>, java.util.Collection<? extends compiler.misc.type.captureof: 2, ?>))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, addAll(java.util.Collection<? extends compiler.misc.type.captureof: 2, ?>), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.util.List<compiler.misc.type.captureof: 1, ?>, java.util.Collection<? extends compiler.misc.type.captureof: 2, ?>))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, addAll(int,java.util.Collection<? extends compiler.misc.type.captureof: 2, ?>), (compiler.misc.arg.length.mismatch))}
|
||||
Martin.java:15:11: compiler.err.cant.apply.symbols: kindname.method, addAll, java.util.List<compiler.misc.type.captureof: 1, ?>,{(compiler.misc.inapplicable.method: kindname.method, java.util.List, addAll(java.util.Collection<? extends compiler.misc.type.captureof: 2, ?>), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.util.List<compiler.misc.type.captureof: 1, ?>, java.util.Collection<? extends compiler.misc.type.captureof: 2, ?>))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, addAll(int,java.util.Collection<? extends compiler.misc.type.captureof: 2, ?>), (compiler.misc.arg.length.mismatch))}
|
||||
1 error
|
||||
|
@ -1,3 +1,3 @@
|
||||
T8019480.java:21:34: compiler.err.cant.apply.symbols: kindname.method, add, java.lang.Object,{(compiler.misc.inapplicable.method: kindname.method, java.util.Collection, add(U), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.Object, U))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, add(U), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.Object, U))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, add(int,U), (compiler.misc.arg.length.mismatch))}
|
||||
T8019480.java:21:34: compiler.err.cant.apply.symbols: kindname.method, add, java.lang.Object,{(compiler.misc.inapplicable.method: kindname.method, java.util.List, add(U), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.Object, U))),(compiler.misc.inapplicable.method: kindname.method, java.util.List, add(int,U), (compiler.misc.arg.length.mismatch))}
|
||||
T8019480.java:21:46: compiler.err.report.access: clone(), protected, java.lang.Object
|
||||
2 errors
|
||||
|
Loading…
x
Reference in New Issue
Block a user