diff --git a/core/org.eclipse.cdt.core.tests/ChangeLog b/core/org.eclipse.cdt.core.tests/ChangeLog index f7045331929..e8c5e0bec19 100644 --- a/core/org.eclipse.cdt.core.tests/ChangeLog +++ b/core/org.eclipse.cdt.core.tests/ChangeLog @@ -1,3 +1,6 @@ +2004-04-04 John Camelon + Added CompleteParseASTTest::testBug56516() && CompleteParseASTTests::testBug53786(). + 2004-04-02 Andrew Niefer - created CompleteParseASTTemplateTest, added it to the ParserTestSuite and moved all the template tests from CompleteParseASTTest to it. diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java index ccaf7864438..cf19ccdc259 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java @@ -37,8 +37,6 @@ import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.parser.ast.IASTReference; import org.eclipse.cdt.core.parser.ast.IASTScope; import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier; -import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration; -import org.eclipse.cdt.core.parser.ast.IASTTemplateParameter; import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration; import org.eclipse.cdt.core.parser.ast.IASTUsingDeclaration; import org.eclipse.cdt.core.parser.ast.IASTUsingDirective; @@ -1352,4 +1350,28 @@ public class CompleteParseASTTest extends CompleteParseBaseTest assertEquals( thePointer.getName(), "pA" ); assertFalse( i.hasNext() ); } + + public void testBug56516() throws Exception + { + Iterator i = parse( "typedef struct blah sb;").getDeclarations(); + IASTTypedefDeclaration sb = (IASTTypedefDeclaration) i.next(); + assertEquals( sb.getName(), "sb"); + assertFalse( i.hasNext() ); + IASTElaboratedTypeSpecifier elab = ((IASTElaboratedTypeSpecifier)sb.getAbstractDeclarator().getTypeSpecifier()); + assertEquals( elab.getName(), "blah"); + assertEquals( elab.getClassKind(), ASTClassKind.STRUCT ); + } + + public void testBug53786() throws Exception + { + Iterator i = parse( "struct Example { struct Data * data; };").getDeclarations(); + IASTClassSpecifier Example = (IASTClassSpecifier) ((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier(); + assertFalse( i.hasNext() ); + assertEquals( Example.getName(), "Example"); + assertEquals( Example.getClassKind(), ASTClassKind.STRUCT ); + Iterator j = getDeclarations( Example ); + IASTField data = (IASTField) j.next(); + assertFalse( j.hasNext() ); + assertEquals( data.getName(), "data" ); + } } diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog-parser b/core/org.eclipse.cdt.core/parser/ChangeLog-parser index 3671630e255..0ae5e0b1cd7 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog-parser +++ b/core/org.eclipse.cdt.core/parser/ChangeLog-parser @@ -1,3 +1,7 @@ +2004-04-04 John Camelon + Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=56516 + Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=53786 + 2004-04-02 Andrew Niefer - partial handling template explicit instantiations - bug 56834 - Symbols not available until end of parameter list, fixed for templates using temporary code block 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 637c480ef37..65618ea8398 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 @@ -2783,119 +2783,123 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto public IASTElaboratedTypeSpecifier createElaboratedTypeSpecifier(IASTScope scope, ASTClassKind kind, ITokenDuple name, int startingOffset, int startingLine, int endOffset, int endingLine, boolean isForewardDecl, boolean isFriend) throws ASTSemanticException { IContainerSymbol currentScopeSymbol = scopeToSymbol(scope); - TypeInfo.eType pstType = classKindToTypeInfo(kind); + TypeInfo.eType pstType = classKindToTypeInfo(kind); List references = new ArrayList(); - IToken nameToken = name.getFirstToken(); - String newSymbolName = ""; //$NON-NLS-1$ List templateIdArgList = null; boolean isTemplateId = false; - - if( name.getSegmentCount() != 1 ) // qualified name + if (name.getSegmentCount() != 1) // qualified name { - ITokenDuple containerSymbolName = name.getLeadingSegments(); - currentScopeSymbol = (IContainerSymbol)lookupQualifiedName( currentScopeSymbol, containerSymbolName, references, true); - if( currentScopeSymbol == null ) - handleProblem( IProblem.SEMANTIC_NAME_NOT_FOUND, containerSymbolName.toString(), containerSymbolName.getFirstToken().getOffset(), containerSymbolName.getLastToken().getEndOffset(), containerSymbolName.getLastToken().getLineNumber() ); - + ITokenDuple containerSymbolName = name.getLeadingSegments(); + currentScopeSymbol = (IContainerSymbol) lookupQualifiedName( + currentScopeSymbol, containerSymbolName, references, true); + if (currentScopeSymbol == null) + handleProblem(IProblem.SEMANTIC_NAME_NOT_FOUND, + containerSymbolName.toString(), containerSymbolName + .getFirstToken().getOffset(), + containerSymbolName.getLastToken().getEndOffset(), + containerSymbolName.getLastToken().getLineNumber()); nameToken = name.getLastSegment().getFirstToken(); } - //template-id - List [] array = name.getTemplateIdArgLists(); - if( array != null ){ + List[] array = name.getTemplateIdArgLists(); + if (array != null) { isTemplateId = true; - templateIdArgList = array[ array.length - 1 ]; + templateIdArgList = array[array.length - 1]; } - newSymbolName = nameToken.getImage(); - ISymbol checkSymbol = null; - if( !isTemplateId ){ - try - { - if( isFriend ){ - checkSymbol = ((IDerivableContainerSymbol)currentScopeSymbol).lookupForFriendship( newSymbolName ); - } else { - checkSymbol = currentScopeSymbol.elaboratedLookup( pstType, newSymbolName); + if (!isTemplateId) { + try { + if (isFriend) { + checkSymbol = ((IDerivableContainerSymbol) currentScopeSymbol) + .lookupForFriendship(newSymbolName); + } else { + checkSymbol = currentScopeSymbol.elaboratedLookup(pstType, + newSymbolName); } - } - catch (ParserSymbolTableException e) - { - handleProblem(e.createProblemID(),nameToken.getImage(), nameToken.getOffset(), nameToken.getEndOffset(), nameToken.getLineNumber() ); - + } catch (ParserSymbolTableException e) { + handleProblem(e.createProblemID(), nameToken.getImage(), + nameToken.getOffset(), nameToken.getEndOffset(), + nameToken.getLineNumber()); } } - List args = null; - if( isTemplateId ){ - args = getTemplateArgList( templateIdArgList ); + if (isTemplateId) { + args = getTemplateArgList(templateIdArgList); } - - if( isForewardDecl ) - { - if( scope instanceof IASTTemplateInstantiation ) - { - if( isTemplateId ){ - checkSymbol = pst.newDerivableContainerSymbol( newSymbolName, pstType ); - try { - currentScopeSymbol.addTemplateId( checkSymbol, args ); - } catch (ParserSymbolTableException e) { - handleProblem(e.createProblemID(),nameToken.getImage(), nameToken.getOffset(), nameToken.getEndOffset(), nameToken.getLineNumber() ); - } - } else { - handleProblem( IProblem.SEMANTIC_INVALID_TEMPLATE, nameToken.getImage() ); - } - checkSymbol = ((ASTTemplateInstantiation)scope).getInstanceSymbol(); - } - else if( checkSymbol == null ) - { - checkSymbol = pst.newDerivableContainerSymbol( newSymbolName, pstType ); - checkSymbol.setIsForwardDeclaration( true ); - try - { - if( isFriend ){ - ((IDerivableContainerSymbol)currentScopeSymbol).addFriend( checkSymbol ); - } else { - if( !isTemplateId ) - currentScopeSymbol.addSymbol( checkSymbol ); - else - currentScopeSymbol.addTemplateId( checkSymbol, args ); - } - } - catch (ParserSymbolTableException e1) - { - handleProblem(e1.createProblemID(),nameToken.getImage(), nameToken.getOffset(), nameToken.getEndOffset(), nameToken.getLineNumber() ); - } - - ASTElaboratedTypeSpecifier elab = - new ASTElaboratedTypeSpecifier( checkSymbol, kind, startingOffset, startingLine, name.getFirstToken().getOffset(), name.getLastToken().getEndOffset(), name.getLastToken().getLineNumber(), endOffset, endingLine, references, isForewardDecl ); - - attachSymbolExtension( checkSymbol, elab, isForewardDecl ); - } else if( isFriend ){ - ((IDerivableContainerSymbol)currentScopeSymbol).addFriend( checkSymbol ); + if (scope instanceof IASTTemplateInstantiation) { + if (isTemplateId) { + checkSymbol = pst.newDerivableContainerSymbol(newSymbolName, + pstType); + try { + currentScopeSymbol.addTemplateId(checkSymbol, args); + } catch (ParserSymbolTableException e) { + handleProblem(e.createProblemID(), nameToken.getImage(), + nameToken.getOffset(), nameToken.getEndOffset(), + nameToken.getLineNumber()); + } + } else { + handleProblem(IProblem.SEMANTIC_INVALID_TEMPLATE, nameToken + .getImage()); } - } - - if( checkSymbol != null ){ - if( scope instanceof IASTTemplateInstantiation ){ - addReference( references, createReference( checkSymbol, newSymbolName, nameToken.getOffset() )); - } - if( checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTClassSpecifier || - checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTEnumerationSpecifier - ) - { - ASTElaboratedTypeSpecifier elab = new ASTElaboratedTypeSpecifier( checkSymbol, kind, startingOffset, startingLine, name.getFirstToken().getOffset(), name.getLastToken().getEndOffset(), name.getLastToken().getLineNumber(), endOffset, endingLine, references, isForewardDecl ); - attachSymbolExtension( checkSymbol, elab, isForewardDecl ); + checkSymbol = ((ASTTemplateInstantiation) scope) + .getInstanceSymbol(); + } else if (checkSymbol == null) { + checkSymbol = pst.newDerivableContainerSymbol(newSymbolName, + pstType); + checkSymbol.setIsForwardDeclaration(true); + try { + if (isFriend) { + ((IDerivableContainerSymbol) currentScopeSymbol) + .addFriend(checkSymbol); + } else { + if (!isTemplateId) + currentScopeSymbol.addSymbol(checkSymbol); + else + currentScopeSymbol.addTemplateId(checkSymbol, args); + } + } catch (ParserSymbolTableException e1) { + handleProblem(e1.createProblemID(), nameToken.getImage(), + nameToken.getOffset(), nameToken.getEndOffset(), + nameToken.getLineNumber()); + } + ASTElaboratedTypeSpecifier elab = new ASTElaboratedTypeSpecifier( + checkSymbol, kind, startingOffset, startingLine, name + .getFirstToken().getOffset(), name.getLastToken() + .getEndOffset(), name.getLastToken() + .getLineNumber(), endOffset, endingLine, + references, isForewardDecl); + attachSymbolExtension(checkSymbol, elab, !isForewardDecl); + } else if (isFriend) { + ((IDerivableContainerSymbol) currentScopeSymbol) + .addFriend(checkSymbol); + } + if (checkSymbol != null) { + if (scope instanceof IASTTemplateInstantiation) { + addReference(references, createReference(checkSymbol, + newSymbolName, nameToken.getOffset())); + } + if (checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTClassSpecifier + || checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTEnumerationSpecifier) { + ASTElaboratedTypeSpecifier elab = new ASTElaboratedTypeSpecifier( + checkSymbol, kind, startingOffset, startingLine, name + .getFirstToken().getOffset(), name + .getLastToken().getEndOffset(), name + .getLastToken().getLineNumber(), endOffset, + endingLine, references, isForewardDecl); + attachSymbolExtension(checkSymbol, elab, !isForewardDecl); return elab; } - - if( checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTElaboratedTypeSpecifier ) - return (IASTElaboratedTypeSpecifier)checkSymbol.getASTExtension().getPrimaryDeclaration(); - } else { - handleProblem(IProblem.SEMANTIC_NAME_NOT_FOUND, newSymbolName, nameToken.getOffset(), nameToken.getEndOffset(), nameToken.getLineNumber() ); - } + if (checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTElaboratedTypeSpecifier) + return (IASTElaboratedTypeSpecifier) checkSymbol + .getASTExtension().getPrimaryDeclaration(); + } else { + handleProblem(IProblem.SEMANTIC_NAME_NOT_FOUND, newSymbolName, + nameToken.getOffset(), nameToken.getEndOffset(), nameToken + .getLineNumber()); + } // assert false : this; @@ -2905,9 +2909,13 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto protected ParserSymbolTable pst; - /* (non-Javadoc) - * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createNamespaceAlias(org.eclipse.cdt.core.parser.ast.IASTScope, java.lang.String, org.eclipse.cdt.core.parser.ITokenDuple, int, int, int) - */ + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.parser.ast.IASTFactory#createNamespaceAlias(org.eclipse.cdt.core.parser.ast.IASTScope, + * java.lang.String, org.eclipse.cdt.core.parser.ITokenDuple, int, int, + * int) + */ public IASTNamespaceAlias createNamespaceAlias(IASTScope scope, String identifier, ITokenDuple alias, int startingOffset, int startingLine, int nameOffset, int nameEndOffset, int nameLine, int endOffset, int endingLine) throws ASTSemanticException { IContainerSymbol startingSymbol = scopeToSymbol(scope);