1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 351009: Content assist for member-initializer outside of class body.

This commit is contained in:
Markus Schorn 2011-07-05 13:37:38 +02:00
parent 5b93048496
commit a938fee083
2 changed files with 26 additions and 7 deletions

View file

@ -288,6 +288,19 @@ public class BasicCompletionTest extends CompletionTestBase {
checkNonPrefixCompletion(code, true, expected); checkNonPrefixCompletion(code, true, expected);
} }
// struct A {
// A(int, char, int){}
// };
// struct B : A {
// B();
// };
// B::B() : A
public void testCompletionInCtorOfMemberInitializer_351009() throws Exception {
String code = getAboveComment();
String[] expected= {"A"};
checkNonPrefixCompletion(code, true, expected);
}
// struct S {}; // struct S {};
// void foo() { // void foo() {
// S b // S b

View file

@ -21,14 +21,15 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICPPASTCompletionContext; import org.eclipse.cdt.core.dom.ast.ICPPASTCompletionContext;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArraySet; import org.eclipse.cdt.core.parser.util.CharArraySet;
@ -160,10 +161,15 @@ public class CPPASTConstructorChainInitializer extends ASTNode implements
private CharArraySet getBaseClasses(IASTName name) { private CharArraySet getBaseClasses(IASTName name) {
CharArraySet result= new CharArraySet(2); CharArraySet result= new CharArraySet(2);
for (IASTNode parent = name.getParent(); parent != null; parent = parent.getParent()) { for (IASTNode parent = name.getParent(); parent != null; parent = parent.getParent()) {
if (parent instanceof ICPPASTCompositeTypeSpecifier) { if (parent instanceof ICPPASTFunctionDefinition) {
ICPPASTCompositeTypeSpecifier specifier = (ICPPASTCompositeTypeSpecifier) parent; ICPPASTFunctionDefinition fdef= (ICPPASTFunctionDefinition) parent;
for (ICPPASTBaseSpecifier bs : specifier.getBaseSpecifiers()) { IBinding method= fdef.getDeclarator().getName().resolveBinding();
result.put(bs.getName().getLastName().getSimpleID()); if (method instanceof ICPPMethod) {
ICPPClassType cls= ((ICPPMethod) method).getClassOwner();
for (ICPPBase base : cls.getBases()) {
result.put(base.getBaseClassSpecifierName().getSimpleID());
}
return result;
} }
} }
} }