| Summary: | NPE hovering in half broken program | ||
|---|---|---|---|
| Product: | [Tools] AJDT | Reporter: | Andrew Clement <aclement> |
| Component: | UI | Assignee: | AJDT-inbox <AJDT-inbox> |
| Status: | RESOLVED FIXED | QA Contact: | |
| Severity: | normal | ||
| Priority: | P3 | ||
| Version: | 2.1.2 | ||
| Target Milestone: | 2.1.3 | ||
| Hardware: | PC | ||
| OS: | Mac OS X - Carbon (unsup.) | ||
| Whiteboard: | |||
Looks like there are several problems here.
First, this class still has 'this' with a spurious error:
import java.util.Iterator;
class C implements Iterable<String> {
public Iterator<String> iterator() {
return null;
}
}
abstract aspect IterableAspect {
public void C.map() {
for (String value : this) {
}
}
}
Second, the NPE that you are seeing is happening because AJDT is getting tripped up in some code that is looking for ITITs. This is easy enough to fix.
Third, it doesn't look like the type parameters in the ITD are being applied to Iterable.
The NPE has now been fixed, but I am keeping this bug open because of the other problems that it has uncovered. OK. For the spurious error, I have a solution. We will ignore all type errors when the target expression is 'this' and we are inside ITDs. Ignoring these errors in these situations is narrow enough that we shouldn't get into trouble. I have the implementaiton locally, but need to write some tests before I commit. Now fixed. Committed with regression tests. |
Hovering over 'Fun1' in the map ITD, i get: java.lang.NullPointerException at org.eclipse.ajdt.core.text.ITDAwareSelectionRequestor.acceptType(ITDAwareSelectionRequestor.java:286) at org.eclipse.jdt.internal.codeassist.SelectionEngine.selectFrom(SelectionEngine.java:1098) at org.eclipse.jdt.internal.codeassist.SelectionEngine.select(SelectionEngine.java:938) at org.eclipse.ajdt.core.text.ITDCodeSelection.findJavaElement(ITDCodeSelection.java:97) at org.eclipse.ajdt.internal.core.contentassist.ContentAssistProvider.doCodeSelect(ContentAssistProvider.java:167) at org.eclipse.jdt.internal.core.CompilationUnit.codeSelect_aroundBody1$advice(CompilationUnit.java:317) at org.eclipse.jdt.internal.core.CompilationUnit.codeSelect(CompilationUnit.java:1) at org.eclipse.jdt.internal.ui.text.java.hover.AbstractJavaEditorTextHover.getJavaElementsAt(AbstractJavaEditorTextHover.java:115) at org.codehaus.groovy.eclipse.editor.GroovyExtraInformationHover.getHoverInfo2(GroovyExtraInformationHover.java:39) at org.eclipse.jdt.internal.ui.text.java.hover.BestMatchHover.getHoverInfo2(BestMatchHover.java:141) at org.eclipse.jdt.internal.ui.text.java.hover.JavaEditorTextHoverProxy.getHoverInfo2(JavaEditorTextHoverProxy.java:82) at org.eclipse.jface.text.TextViewerHoverManager$4.run(TextViewerHoverManager.java:166) This is IterableAspect.aj: === import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; class C implements Iterable<String> { @Override public Iterator<String> iterator() { return null; } } abstract aspect IterableAspect<T> pertypewithin(Iterable<T>+){ interface Fun1<T,R> { R apply(T param); } public <R> Collection<R> Iterable.map(Fun1<T,R> fun) { Collection<R> result=new ArrayList<R>(); for (T value : this) { result.add(fun.apply(value)); } return result; } } ===