Bug 98344 smart completion for anonymous inner type of abstract inner class missing methods
I'm using Eclipse 3.1 RC1. First I input the following class into Eclipse: public class Test { abstract class Foo { abstract void doSomething(); } void bar() { Foo f = new Foo(); } } The class does not compile because Foo is abstract. If I put the cursor between the parens of the Foo() constructor call and hit CTRL+SPACE, it brings up an "Override/Implement Methods" dialog box, but in that dialog box I only see the methods for java.lang.Object, not the expected Foo.doSomething() method. If Foo is a separate top-level class and not an inner class, the Foo.doSomething() method shows up in the dialog as expected. It also works if I add an open and close curly brace before the semicolon, and then go to the Source menu and choose Override/Implement Methods.
org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/AnonymousTypeCompletionProposal.java
private IType fDeclaringType;
	public AnonymousTypeCompletionProposal(IJavaProject jproject, ICompilationUnit cu, int start, int length, String constructorCompletion, String displayName, String declaringTypeName, int relevance) {
		super(constructorCompletion, cu, start, length, null, displayName, relevance);
		Assert.isNotNull(declaringTypeName);
		Assert.isNotNull(jproject);
		Assert.isNotNull(cu);
		fDeclaringType= getDeclaringType(jproject, declaringTypeName);
		setImage(getImageForType(fDeclaringType));
		setCursorPosition(constructorCompletion.indexOf('(') + 1);
	}
	private boolean createStubs(StringBuffer buf, ImportsStructure structure) throws CoreException {
		if (structure == null)
			return false;
		if (fDeclaringType == null)
			return true;
		ICompilationUnit workingCopy= null;
		try {
			final IType currentType= fCompilationUnit.getTypes()[0];
			String dummyName= currentType.getElementName();
			workingCopy= WorkingCopyUtil.getNewWorkingCopy(fCompilationUnit);
			StringBuffer buffer= new StringBuffer();
			String lineDelim= "\n"; 
			final IPackageFragment dummyPackage= currentType.getPackageFragment();
			if (!dummyPackage.isDefaultPackage()) {
				buffer.append("package "); 
				buffer.append(dummyPackage.getElementName());
				buffer.append(";"); 
				buffer.append(lineDelim);
			}