From d7664718ae3a1367ab87d76cd75ee2612046c2de Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Wed, 7 Apr 2004 21:24:40 +0000 Subject: [PATCH] fix lookup in parents while doing content assist on list out of --- core/org.eclipse.cdt.core.tests/ChangeLog | 3 +++ .../parser/tests/CompletionParseTest.java | 23 +++++++++++++++++++ .../parser/ChangeLog-parser | 3 +++ .../core/parser/pst/ContainerSymbol.java | 2 ++ .../core/parser/pst/ParserSymbolTable.java | 18 ++++++++++++++- 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/ChangeLog b/core/org.eclipse.cdt.core.tests/ChangeLog index 273bec357de..aac1ae7d1f2 100644 --- a/core/org.eclipse.cdt.core.tests/ChangeLog +++ b/core/org.eclipse.cdt.core.tests/ChangeLog @@ -1,3 +1,6 @@ +2004-04-07 Andrew Niefer + added CompletionParseTest.testCompletionWithTemplateInstanceAsParent() + 2004-04-07 Andrew Niefer fix bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=44338 - added parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.testBug44338() 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 d78ab9c073d..71b386e5676 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 @@ -807,4 +807,27 @@ public class CompletionParseTest extends CompleteParseBaseTest { } + public void testCompletionWithTemplateInstanceAsParent() throws Exception + { + StringWriter writer = new StringWriter(); + writer.write( "template < class T > class A { public : int a_member; }; "); + writer.write( "template < class T > class B : public A< T > { public : int b_member; }; "); + writer.write( "void f() { "); + writer.write( " B< int > b; "); + writer.write( " b.SP "); + + String code = writer.toString(); + IASTCompletionNode node = parse( code, code.indexOf( "SP" ) ); + + ILookupResult result = node.getCompletionScope().lookup( "", + new IASTNode.LookupKind[]{ IASTNode.LookupKind.ALL }, + node.getCompletionContext() ); + assertEquals( result.getResultsSize(), 2 ); + + Iterator i = result.getNodes(); + + IASTField bmember = (IASTField) i.next(); + IASTField amember = (IASTField) i.next(); + } + } diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog-parser b/core/org.eclipse.cdt.core/parser/ChangeLog-parser index b9d38929175..62e594dad1d 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog-parser +++ b/core/org.eclipse.cdt.core/parser/ChangeLog-parser @@ -1,3 +1,6 @@ +2004-04-07 Andrew Niefer + fix lookup in parents when the parent is a deferred template instance, enables content assist on list (from ) + 2004-04-07 Andrew Niefer fix bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=44338 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 398c37a61a6..8062568d8e7 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 @@ -850,6 +850,8 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { ASTAccessVisibility visibility; visibility = ParserSymbolTable.getVisibility( symbol, qualifyingSymbol ); + if( visibility == null ) + return false; if( visibility == ASTAccessVisibility.PUBLIC ){ return true; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java index c8e4fec1081..97112412844 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java @@ -650,6 +650,11 @@ public class ParserSymbolTable { //is circular inheritance if( ! data.inheritanceChain.contains( parent ) ){ //is this name define in this scope? + if( parent instanceof IDeferredTemplateInstance ){ + parent = ((IDeferredTemplateInstance)parent).getTemplate().getTemplatedSymbol(); + } else if( parent instanceof ITemplateSymbol ){ + parent = ((ITemplateSymbol)parent).getTemplatedSymbol(); + } if( parent instanceof IDerivableContainerSymbol ){ temp = lookupInContained( data, (IDerivableContainerSymbol) parent ); } else { @@ -2275,7 +2280,18 @@ public class ParserSymbolTable { while( iter.hasNext() ){ parent = (IParentSymbol) iter.next(); parentAccess = parent.getAccess(); - symbolAccess = getVisibility( symbol, (IContainerSymbol) parent.getParent() ); + + ISymbol tmp = parent.getParent(); + if( tmp instanceof IDeferredTemplateInstance ) + tmp = ((IDeferredTemplateInstance)tmp).getTemplate().getTemplatedSymbol(); + else if( tmp instanceof ITemplateSymbol ){ + tmp = ((ITemplateSymbol)tmp).getTemplatedSymbol(); + } + + if( !( tmp instanceof IContainerSymbol ) ) + return null; + + symbolAccess = getVisibility( symbol, (IContainerSymbol) tmp ); if( symbolAccess != null ){ symbolAccess = ( parentAccess.isGreaterThan( symbolAccess ) ) ? parentAccess : symbolAccess;