diff --git a/core/org.eclipse.cdt.core.tests/ChangeLog b/core/org.eclipse.cdt.core.tests/ChangeLog index 4a271be4ba5..74a7371dbbc 100644 --- a/core/org.eclipse.cdt.core.tests/ChangeLog +++ b/core/org.eclipse.cdt.core.tests/ChangeLog @@ -5,6 +5,9 @@ Moved testErrorHandling_1() from failed tests to CompleteParseASTTest. Moved testBug44340() from failed tests to CompleteParseASTTest. +2004-02-06 Andrew Niefer + Added CompletionParseTest.testBug51260 + 2004-02-04 John Camelon Added preliminary SelectionParseTests to test SELECTION_PARSE clients. Added SelectionParseTests to ParserTestSuite. 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 5f10ceddab3..3ab446335a4 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 @@ -601,4 +601,42 @@ public class CompletionParseTest extends CompleteParseBaseTest { IASTField field = (IASTField) result.getNodes().next(); assertEquals( field.getName(), "aPrivate" ); } + + public void testBug51260() throws Exception{ + StringWriter writer = new StringWriter(); + writer.write( " class A { public: void a(); }; " ); + writer.write( " class B : public virtual A { public: void b(); };" ); + writer.write( " class C : public virtual A { public: void c(); };" ); + writer.write( " class D : public B, C { public: void d(); };" ); + + writer.write( " void A::a(){} "); + writer.write( " void B::b(){} "); + writer.write( " void C::c(){} "); + writer.write( " void D::d(){ SP }" ); + + String code = writer.toString(); + int index = code.indexOf( "SP" ); + IASTCompletionNode node = parse( code, index ); + + ILookupResult result = node.getCompletionScope().lookup( node.getCompletionPrefix(), + new IASTNode.LookupKind[]{ IASTNode.LookupKind.THIS }, + node.getCompletionContext() ); + + assertEquals( result.getResultsSize(), 4 ); + + Iterator iter = result.getNodes(); + IASTMethod d = (IASTMethod) iter.next(); + IASTMethod b = (IASTMethod) iter.next(); + IASTMethod a = (IASTMethod) iter.next(); + IASTMethod c = (IASTMethod) iter.next(); + + assertFalse( iter.hasNext() ); + + assertEquals( a.getName(), "a" ); + assertEquals( b.getName(), "b" ); + assertEquals( c.getName(), "c" ); + assertEquals( d.getName(), "d" ); + + } + } diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog-parser b/core/org.eclipse.cdt.core/parser/ChangeLog-parser index 5873078d813..e81b535110c 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog-parser +++ b/core/org.eclipse.cdt.core/parser/ChangeLog-parser @@ -3,6 +3,10 @@ Fixed Bug 44340 - Inline functions fail to resolve references Fixed Bug 51243 - Content Assist in an empty document causes a NPE +2004-02-06 Andrew Niefer + fixed bug51260 - Content Assist: Completion inside a class method silently fails with a ClassCastException + filter symbols without attached AST nodes out of the completion results so the iterator doesn't sometimes return null. + 2004-02-04 John Camelon Added preliminary (crude) bSelectionParser IParser implementation for SELECTION_PARSE clients. 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 7d5d617e336..613729c5bc4 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 @@ -99,10 +99,14 @@ public class ASTNode implements IASTNode { if(lookupResults == null) return null; + //filter out things that are not visible and things that don't have AST nodes attached ListIterator iter = lookupResults.listIterator(); while( iter.hasNext() ){ ISymbol s = (ISymbol) iter.next(); - if( !thisContainer.isVisible( s, qualification ) ){ + if( !thisContainer.isVisible( s, qualification ) || + s.getASTExtension() == null || + s.getASTExtension().getPrimaryDeclaration() == null ) + { iter.remove(); } } 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 a26381c5e60..6264c9ae74f 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 @@ -611,16 +611,26 @@ public class ParserSymbolTable { while( iter.hasNext() ){ key = iter.next(); if( symbol.containsKey( key ) ){ - ISymbol sym = (ISymbol) symbol.get( key ); - if( !checkAmbiguity( sym, temp.get( key ) ) ){ - if( data.mode == LookupMode.PREFIX ){ - if( data.ambiguities == null ){ - data.ambiguities = new HashSet(); - } - data.ambiguities.add( sym.getName() ); + Object obj = symbol.get( key ); + Iterator objIter = ( obj instanceof List ) ? ((List)obj).iterator() : null; + ISymbol sym = (ISymbol) (( objIter != null && objIter.hasNext() ) ? objIter.next() : obj); + while( sym != null ){ + if( !checkAmbiguity( sym, temp.get( key ) ) ){ + if( data.mode == LookupMode.PREFIX ){ + if( data.ambiguities == null ){ + data.ambiguities = new HashSet(); + } + data.ambiguities.add( sym.getName() ); + } else { + throw new ParserSymbolTableException( ParserSymbolTableException.r_Ambiguous ); + } + } + + if( objIter != null && objIter.hasNext() ){ + sym = (ISymbol) objIter.next(); } else { - throw new ParserSymbolTableException( ParserSymbolTableException.r_Ambiguous ); - } + sym = null; + } } } else { symbol.put( key, temp.get( key ) );