diff --git a/core/org.eclipse.cdt.core.tests/ChangeLog b/core/org.eclipse.cdt.core.tests/ChangeLog index 7da0c22488f..ba27bcc31bd 100644 --- a/core/org.eclipse.cdt.core.tests/ChangeLog +++ b/core/org.eclipse.cdt.core.tests/ChangeLog @@ -1,3 +1,6 @@ +2004-04-15 Andrew Niefer + added parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.testBug58492() + 2004-04-15 John Camelon Added CompleteParseASTTest::testBug39697(). 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 08ee5b28a5c..2e03648358b 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 @@ -74,6 +74,28 @@ public class CompletionParseTest extends CompleteParseBaseTest { } + protected IASTCompletionNode parse(String code, int offset, ParserLanguage lang ) throws Exception { + callback = new FullParseCallback(); + IParser parser = null; + + parser = + ParserFactory.createParser( + ParserFactory.createScanner( + new StringReader(code), + "completion-test", + new ScannerInfo(), + ParserMode.COMPLETION_PARSE, + lang, + callback, + new NullLogService(), null), + callback, + ParserMode.COMPLETION_PARSE, + lang, + null); + + return parser.parse( offset ); + + } public void testBaseCase_SimpleDeclaration() throws Exception { StringWriter writer = new StringWriter(); @@ -862,4 +884,27 @@ public class CompletionParseTest extends CompleteParseBaseTest { } + public void testBug58492() throws Exception + { + Writer writer = new StringWriter(); + writer.write("struct Cube { "); + writer.write(" int nLen; "); + writer.write(" int nWidth; "); + writer.write(" int nHeight; "); + writer.write("}; "); + writer.write("int volume( struct Cube * pCube ) { "); + writer.write(" pCube->SP "); + + String code = writer.toString(); + IASTCompletionNode node = parse( code, code.indexOf("SP"), ParserLanguage.C ); + + ILookupResult result = node.getCompletionScope().lookup( node.getCompletionPrefix(), + new IASTNode.LookupKind[] {IASTNode.LookupKind.ALL }, + node.getCompletionContext() ); + assertEquals( result.getResultsSize(), 3 ); + Iterator i = result.getNodes(); + assertTrue( i.next() instanceof IASTField ); + assertTrue( i.next() instanceof IASTField ); + assertTrue( i.next() instanceof IASTField ); + } } diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog-parser b/core/org.eclipse.cdt.core/parser/ChangeLog-parser index 814d3ee614e..f2cf6cbd029 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-15 Andrew Niefer + fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=58492 + 2004-04-15 John Camelon Partial fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=39697 diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java index b6bbe13e5c8..0cecab75dc9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java @@ -2018,33 +2018,18 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto } else if( absDecl.getTypeSpecifier() instanceof IASTClassSpecifier ) { - ASTClassKind kind = ((IASTClassSpecifier)absDecl.getTypeSpecifier()).getClassKind(); - if( kind == ASTClassKind.CLASS ) - type.setType(TypeInfo.t_class); - else if( kind == ASTClassKind.STRUCT ) - type.setType(TypeInfo.t_struct); - else if( kind == ASTClassKind.UNION ) - type.setType(TypeInfo.t_union); -// else -// assert false : this; + type.setType( TypeInfo.t_type ); + type.setTypeSymbol( ((ASTClassSpecifier)absDecl.getTypeSpecifier()).getSymbol() ); } else if( absDecl.getTypeSpecifier() instanceof IASTEnumerationSpecifier ) { - type.setType(TypeInfo.t_enumeration); + type.setType( TypeInfo.t_type ); + type.setTypeSymbol( ((ASTEnumerationSpecifier)absDecl.getTypeSpecifier()).getSymbol() ); } else if( absDecl.getTypeSpecifier() instanceof IASTElaboratedTypeSpecifier ) { - ASTClassKind kind = ((IASTElaboratedTypeSpecifier)absDecl.getTypeSpecifier()).getClassKind(); - if( kind == ASTClassKind.CLASS ) - type.setType(TypeInfo.t_class); - else if( kind == ASTClassKind.STRUCT ) - type.setType(TypeInfo.t_struct); - else if( kind == ASTClassKind.UNION ) - type.setType(TypeInfo.t_union); - else if( kind == ASTClassKind.ENUM ) - type.setType(TypeInfo.t_enumeration); -// else -// assert false : this; + type.setType( TypeInfo.t_type ); + type.setTypeSymbol( ((ASTElaboratedTypeSpecifier)absDecl.getTypeSpecifier()).getSymbol() ); } // else // assert false : this; @@ -2072,10 +2057,11 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto if (absDecl.getTypeSpecifier() == null) return; - // now determined by another function - TypeInfo.eType type = getParameterTypeInfo(absDecl).getType(); + // now determined by another function + TypeInfo info = getParameterTypeInfo( absDecl ); + TypeInfo.eType type = info.getType(); - ISymbol xrefSymbol = null; + ISymbol xrefSymbol = info.getTypeSymbol(); List newReferences = null; int infoBits = 0; if( absDecl.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier ) @@ -2104,8 +2090,12 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto } ISymbol paramSymbol = pst.newSymbol( paramName, type ); - if( xrefSymbol != null ) - paramSymbol.setTypeSymbol( xrefSymbol.getTypeSymbol() ); + if( xrefSymbol != null ){ + if( absDecl.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier ) + paramSymbol.setTypeSymbol( xrefSymbol.getTypeSymbol() ); + else + paramSymbol.setTypeSymbol( xrefSymbol ); + } paramSymbol.getTypeInfo().setTypeInfo( infoBits ); paramSymbol.getTypeInfo().setBit( absDecl.isConst(), TypeInfo.isConst );