8296789: <TAB>-completion in jshell fails to expose synthetic bridge methods

Reviewed-by: jlahoda
This commit is contained in:
Adam Sotona 2023-01-11 09:21:28 +00:00
parent 030e88d638
commit 257f667afb
2 changed files with 24 additions and 5 deletions

View File

@ -52,6 +52,7 @@ import com.sun.source.util.TreePathScanner;
import com.sun.source.util.Trees;
import com.sun.tools.javac.api.JavacScope;
import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Symbol.CompletionFailure;
import com.sun.tools.javac.code.Symbol.VarSymbol;
import com.sun.tools.javac.code.Symtab;
@ -1031,7 +1032,14 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis {
case DECLARED: {
TypeElement element = (TypeElement) at.getTypes().asElement(site);
List<Element> result = new ArrayList<>();
result.addAll(at.getElements().getAllMembers(element));
at.getElements().getAllMembers(element).forEach(m -> result.add(
element.equals(m.getEnclosingElement())
? m
: (m instanceof Symbol.MethodSymbol ms)
? ms.clone((Symbol)element)
: (m instanceof Symbol.VarSymbol vs)
? vs.clone((Symbol)element)
: m));
if (shouldGenerateDotClassItem) {
result.add(createDotClassSymbol(at, site));
}
@ -1680,6 +1688,11 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis {
return availableSources = result;
}
private Element getOriginalEnclosingElement(Element el) {
if (el instanceof Symbol s) el = s.baseSymbol();
return el.getEnclosingElement();
}
private String elementHeader(AnalyzeTask at, Element el, boolean includeParameterNames, boolean useFQN) {
switch (el.getKind()) {
case ANNOTATION_TYPE: case CLASS: case ENUM: case INTERFACE, RECORD: {
@ -1730,9 +1743,9 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis {
.collect(joining(" & "));
}
case FIELD:
return appendDot(elementHeader(at, el.getEnclosingElement(), includeParameterNames, false)) + el.getSimpleName() + ":" + el.asType();
return appendDot(elementHeader(at, getOriginalEnclosingElement(el), includeParameterNames, false)) + el.getSimpleName() + ":" + el.asType();
case ENUM_CONSTANT:
return appendDot(elementHeader(at, el.getEnclosingElement(), includeParameterNames, false)) + el.getSimpleName();
return appendDot(elementHeader(at, getOriginalEnclosingElement(el), includeParameterNames, false)) + el.getSimpleName();
case EXCEPTION_PARAMETER: case LOCAL_VARIABLE: case PARAMETER: case RESOURCE_VARIABLE:
return el.getSimpleName() + ":" + el.asType();
case CONSTRUCTOR: case METHOD: {
@ -1753,7 +1766,7 @@ class SourceCodeAnalysisImpl extends SourceCodeAnalysis {
}
// receiver type
String clazz = elementHeader(at, el.getEnclosingElement(), includeParameterNames, false);
String clazz = elementHeader(at, getOriginalEnclosingElement(el), includeParameterNames, false);
header.append(clazz);
if (isMethod) {

View File

@ -23,7 +23,7 @@
/*
* @test
* @bug 8131025 8141092 8153761 8145263 8131019 8175886 8176184 8176241 8176110 8177466 8197439 8221759 8234896 8240658 8278039 8286206
* @bug 8131025 8141092 8153761 8145263 8131019 8175886 8176184 8176241 8176110 8177466 8197439 8221759 8234896 8240658 8278039 8286206 8296789
* @summary Test Completion and Documentation
* @library /tools/lib
* @modules jdk.compiler/com.sun.tools.javac.api
@ -791,4 +791,10 @@ public class CompletionSuggestionTest extends KullaTesting {
public void testRecord() {
assertCompletion("record R() implements Ru|", true, "Runnable");
}
//JDK-8296789
public void testParentMembers() {
assertEval("var sb=new StringBuilder();");
assertCompletionIncludesExcludes("sb.|", true, Set.of("capacity()", "setLength("), Set.of("maybeLatin1"));
}
}