Skip to content

Commit fb479e7

Browse files
committed
Improvements for ExpectedTypes
1 parent 82c0364 commit fb479e7

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/codeassist/DOMCompletionUtil.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ public static boolean findInSupers(ITypeBinding root, String keyOfTypeToFind) {
131131
toCheck.add(root.getErasure());
132132
while (!toCheck.isEmpty()) {
133133
ITypeBinding current = toCheck.poll();
134+
if (current == null) {
135+
continue;
136+
}
134137
String currentKey = current.getErasure().getKey();
135138
if (alreadyChecked.contains(currentKey)) {
136139
continue;

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/codeassist/ExpectedTypes.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,17 @@ private void computeExpectedTypes(){
106106
}
107107
if (parent2 instanceof MethodInvocation method && this.offset > method.getName().getStartPosition() + method.getName().getLength()) {
108108
if (method.arguments().size() == 1 && ((ASTNode)method.arguments().get(0)).getLength() == 0) {
109+
if (method.getExpression() != null) {
110+
var receiverType = method.getExpression().resolveTypeBinding();
111+
if (receiverType != null) {
112+
Arrays.stream(receiverType.getDeclaredMethods())
113+
.filter(decl -> Objects.equals(decl.getName(), method.getName()))
114+
.filter(decl -> decl.getParameterTypes().length > 0)
115+
.map(decl -> decl.getParameterTypes()[0])
116+
.forEach(this.expectedTypes::add);
117+
break;
118+
}
119+
}
109120
// just methodName( => consider type of requestor
110121
// continue
111122
} else {
@@ -575,7 +586,6 @@ else if (scope instanceof ClassScope)
575586
// if((this.expectedTypesPtr > -1) && ((this.expectedTypesPtr + 1) != this.expectedTypes.length)) {
576587
// System.arraycopy(this.expectedTypes, 0, this.expectedTypes = new TypeBinding[this.expectedTypesPtr + 1], 0, this.expectedTypesPtr + 1);
577588
// }
578-
this.isReady = true;
579589
}
580590

581591
private void computeExpectedTypesForAllocationExpression(
@@ -739,6 +749,8 @@ private LinkedHashSet<IMethodBinding> avaiableMethods(ITypeBinding typeBinding)
739749
public List<ITypeBinding> getExpectedTypes() {
740750
if (!this.isReady) {
741751
computeExpectedTypes();
752+
this.expectedTypes.removeIf(binding -> binding.isNullType());
753+
this.isReady = true;
742754
}
743755
return new ArrayList<>(this.expectedTypes);
744756
}

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/javac/dom/JavacErrorTypeBinding.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
import org.eclipse.jdt.core.dom.ITypeBinding;
1414
import org.eclipse.jdt.core.dom.JavacBindingResolver;
1515

16+
import com.sun.tools.javac.code.Type;
1617
import com.sun.tools.javac.code.Symbol.ClassSymbol;
1718
import com.sun.tools.javac.code.Symbol.TypeSymbol;
18-
import com.sun.tools.javac.code.Type;
1919

2020
/**
2121
* Represents a binding for a type that javac struggles to recover,
@@ -52,6 +52,7 @@ private String getKeyImpl() {
5252
typeName = typeName.substring(packageName.length() + 1);
5353
}
5454
if (typeName.indexOf(".") < 0
55+
&& ((ClassSymbol) originatingSymbol).sourcefile != null
5556
&& !((ClassSymbol) originatingSymbol).sourcefile.getName().endsWith(typeName + ".java")) {
5657
String fileName = ((ClassSymbol) originatingSymbol).sourcefile.toUri().getPath();
5758
int lastSlash = fileName.lastIndexOf('/');

0 commit comments

Comments
 (0)