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:
parent
45cf3d9fb2
commit
91571bd2e5
4 changed files with 134 additions and 97 deletions
|
@ -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.
|
||||
|
|
|
@ -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" );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue