Lines 49-54
Link Here
|
49 |
import com.sun.tools.javac.util.Name; |
49 |
import com.sun.tools.javac.util.Name; |
50 |
import com.sun.tools.javac.util.Names; |
50 |
import com.sun.tools.javac.util.Names; |
51 |
import com.sun.tools.javac.code.Scope; |
51 |
import com.sun.tools.javac.code.Scope; |
|
|
52 |
import com.sun.tools.javac.code.Source; |
52 |
import com.sun.tools.javac.code.Symbol; |
53 |
import com.sun.tools.javac.code.Symbol; |
53 |
import com.sun.tools.javac.code.Symbol.ClassSymbol; |
54 |
import com.sun.tools.javac.code.Symbol.ClassSymbol; |
54 |
import com.sun.tools.javac.code.Symbol.MethodSymbol; |
55 |
import com.sun.tools.javac.code.Symbol.MethodSymbol; |
Lines 58-63
Link Here
|
58 |
import com.sun.tools.javac.model.JavacTypes; |
59 |
import com.sun.tools.javac.model.JavacTypes; |
59 |
import com.sun.tools.javac.util.Context; |
60 |
import com.sun.tools.javac.util.Context; |
60 |
import com.sun.tools.javac.util.ListBuffer; |
61 |
import com.sun.tools.javac.util.ListBuffer; |
|
|
62 |
import java.util.ArrayList; |
63 |
import java.util.Collection; |
64 |
import java.util.Collections; |
61 |
import javax.lang.model.element.*; |
65 |
import javax.lang.model.element.*; |
62 |
import static javax.lang.model.element.ElementKind.*; |
66 |
import static javax.lang.model.element.ElementKind.*; |
63 |
import javax.lang.model.type.*; |
67 |
import javax.lang.model.type.*; |
Lines 70-75
Link Here
|
70 |
private com.sun.tools.javac.code.Types jctypes; |
74 |
private com.sun.tools.javac.code.Types jctypes; |
71 |
private Names names; |
75 |
private Names names; |
72 |
private Types types; |
76 |
private Types types; |
|
|
77 |
private final boolean allowDefaultMethods; |
73 |
|
78 |
|
74 |
private static final Context.Key<ElementsService> KEY = |
79 |
private static final Context.Key<ElementsService> KEY = |
75 |
new Context.Key<ElementsService>(); |
80 |
new Context.Key<ElementsService>(); |
Lines 86-91
Link Here
|
86 |
jctypes = com.sun.tools.javac.code.Types.instance(context); |
91 |
jctypes = com.sun.tools.javac.code.Types.instance(context); |
87 |
names = Names.instance(context); |
92 |
names = Names.instance(context); |
88 |
types = JavacTypes.instance(context); |
93 |
types = JavacTypes.instance(context); |
|
|
94 |
allowDefaultMethods = Source.instance(context).allowDefaultMethods(); |
89 |
} |
95 |
} |
90 |
|
96 |
|
91 |
/** |
97 |
/** |
Lines 214-220
Link Here
|
214 |
} |
220 |
} |
215 |
|
221 |
|
216 |
public Element getImplementationOf(ExecutableElement method, TypeElement origin) { |
222 |
public Element getImplementationOf(ExecutableElement method, TypeElement origin) { |
217 |
return ((MethodSymbol)method).implementation((TypeSymbol)origin, jctypes, true); |
223 |
MethodSymbol implmethod = ((MethodSymbol)method).implementation((TypeSymbol)origin, jctypes, true); |
|
|
224 |
if (implmethod == null || implmethod == method) { |
225 |
//look for default implementations |
226 |
if (allowDefaultMethods) { |
227 |
MethodSymbol prov = jctypes.interfaceCandidates(((TypeSymbol) origin).type, (MethodSymbol) method).head; |
228 |
if (prov != null && prov.overrides((MethodSymbol) method, (TypeSymbol) origin, jctypes, true)) { |
229 |
implmethod = prov; |
230 |
} |
231 |
} |
232 |
} |
233 |
return implmethod; |
218 |
} |
234 |
} |
219 |
|
235 |
|
220 |
public boolean isSynthetic(Element e) { |
236 |
public boolean isSynthetic(Element e) { |
Lines 225-234
Link Here
|
225 |
MethodSymbol m = (MethodSymbol)method; |
241 |
MethodSymbol m = (MethodSymbol)method; |
226 |
ClassSymbol origin = (ClassSymbol)m.owner; |
242 |
ClassSymbol origin = (ClassSymbol)m.owner; |
227 |
MethodSymbol bridgeCandidate = null; |
243 |
MethodSymbol bridgeCandidate = null; |
228 |
for (Type t = jctypes.supertype(origin.type); t.hasTag(TypeTag.CLASS); t = jctypes.supertype(t)) { |
244 |
for (Type t = jctypes.supertype(origin.type); t.hasTag(TypeTag.CLASS); t = jctypes.supertype(t)) { |
229 |
TypeSymbol c = t.tsym; |
245 |
TypeSymbol c = t.tsym; |
230 |
for (Symbol sym : c.members().getSymbolsByName(m.name)) { |
246 |
for (Symbol sym : c.members().getSymbolsByName(m.name)) { |
231 |
if (m.overrides(sym, origin, jctypes, false)) { |
247 |
if (m.overrides(sym, origin, jctypes, false)) { |
232 |
if ((sym.flags() & Flags.BRIDGE) > 0) { |
248 |
if ((sym.flags() & Flags.BRIDGE) > 0) { |
233 |
if (bridgeCandidate == null) { |
249 |
if (bridgeCandidate == null) { |
234 |
bridgeCandidate = (MethodSymbol)sym; |
250 |
bridgeCandidate = (MethodSymbol)sym; |
Lines 237-244
Link Here
|
237 |
return (MethodSymbol)sym; |
253 |
return (MethodSymbol)sym; |
238 |
} |
254 |
} |
239 |
} |
255 |
} |
240 |
} |
256 |
} |
241 |
} |
257 |
} |
|
|
258 |
if (allowDefaultMethods) { |
259 |
MethodSymbol prov = jctypes.interfaceCandidates(((TypeSymbol) origin).type, (MethodSymbol) method).head; |
260 |
if (prov != null && m.overrides(prov, origin, jctypes, true)) { |
261 |
if ((prov.flags() & Flags.BRIDGE) > 0) { |
262 |
if (bridgeCandidate == null) { |
263 |
bridgeCandidate = (MethodSymbol)prov; |
264 |
} |
265 |
} else { |
266 |
return (MethodSymbol)prov; |
267 |
} |
268 |
} |
269 |
} |
242 |
return bridgeCandidate; |
270 |
return bridgeCandidate; |
243 |
} |
271 |
} |
244 |
} |
272 |
} |