From e86d9d4a94086c6bdf76b04d9a2d060f26428d4d Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Wed, 5 May 2004 19:06:01 +0000 Subject: [PATCH] bug 60298 - fix prefix lookup of constructors --- .../cdt/core/parser/tests/CompletionParseTest.java | 14 ++++++++++++++ .../internal/core/parser/ast/complete/ASTNode.java | 1 + .../internal/core/parser/pst/ContainerSymbol.java | 14 +++++++++++++- .../cdt/internal/core/parser/pst/TypeFilter.java | 5 +++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java index badd3212b3b..38839de87f0 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java @@ -981,5 +981,19 @@ public class CompletionParseTest extends CompletionParseBaseTest { assertEquals( result.getResultsSize(), ( i == 0 ) ? 2 : 1 ); } } + + public void testConstructors() throws Exception + { + String code = "class Foo{ public: Foo(); }; Foo::SP "; + + IASTCompletionNode node = parse( code, code.indexOf( "SP" ) ); + + ILookupResult result = node.getCompletionScope().lookup( node.getCompletionPrefix(), + new IASTNode.LookupKind[]{ IASTNode.LookupKind.CONSTRUCTORS }, + node.getCompletionContext() ); + assertEquals( result.getResultsSize(), 1 ); + IASTMethod constructor = (IASTMethod) result.getNodes().next(); + assertEquals( constructor.getName(), "Foo" ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNode.java index 511f0ed4d81..bd625dd6d86 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNode.java @@ -82,6 +82,7 @@ public class ASTNode implements IASTNode { s.getASTExtension().getPrimaryDeclaration() == null ) { iter.remove(); + continue; } if( context != null && ((ASTNode)context).shouldFilterLookupResult( s ) ) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java index d34554cedf7..54d53c42ad4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java @@ -816,8 +816,17 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { ParserSymbolTable.lookup( data, this ); + List constructors = null; + if( filter != null && filter.willAccept( TypeInfo.t_constructor ) && (this instanceof IDerivableContainerSymbol) ){ + if( getName().startsWith( prefix ) ) + constructors = ((IDerivableContainerSymbol)this).getConstructors(); + } + if( data.foundItems == null || data.foundItems.isEmpty() ){ - return null; + if( constructors != null ) + return new LinkedList( constructors ); + else + return null; } else { //remove any ambiguous symbols if( data.ambiguities != null && !data.ambiguities.isEmpty() ){ @@ -840,6 +849,9 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { list.add( obj ); } } + + if( constructors != null ) + list.addAll( constructors ); return list; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeFilter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeFilter.java index 74e87e8d01f..8bde96f5595 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeFilter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeFilter.java @@ -46,6 +46,11 @@ public class TypeFilter { acceptedKinds.add( kind ); } + public boolean willAccept( TypeInfo.eType type ){ + return( acceptedTypes.contains( TypeInfo.t_any ) || + acceptedTypes.contains( type ) ); + } + public boolean shouldAccept( ISymbol symbol ){ return shouldAccept( symbol, symbol.getTypeInfo() ); }