1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

org.eclipse.cdt.core

Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=56516  
	Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=53786

org.eclipse.cdt.core.tests
	Added CompleteParseASTTest::testBug56516() && CompleteParseASTTests::testBug53786().
This commit is contained in:
John Camelon 2004-04-05 03:50:41 +00:00
parent 45cf3d9fb2
commit 91571bd2e5
4 changed files with 134 additions and 97 deletions

View file

@ -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.

View file

@ -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" );
}
}

View file

@ -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

View file

@ -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);