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

IASTName.isDefinition() fixes

This commit is contained in:
Andrew Niefer 2005-05-10 16:46:37 +00:00
parent ed7f696045
commit db56813b0a
2 changed files with 63 additions and 8 deletions

View file

@ -3986,4 +3986,42 @@ public class AST2CPPTests extends AST2BaseTest {
assertInstances( col, n, 3 );
}
public void testDeclDefn() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("int a; \n"); //$NON-NLS-1$
buffer.append("extern int b; \n"); //$NON-NLS-1$
buffer.append("extern int c = 1; \n"); //$NON-NLS-1$
buffer.append("int f( ); \n"); //$NON-NLS-1$
buffer.append("int f( int p ){} \n"); //$NON-NLS-1$
buffer.append("struct S; \n"); //$NON-NLS-1$
buffer.append("struct S { int d; }; \n"); //$NON-NLS-1$
buffer.append("struct X { \n"); //$NON-NLS-1$
buffer.append(" static int y; \n"); //$NON-NLS-1$
buffer.append("}; \n"); //$NON-NLS-1$
buffer.append("namespace N {} \n"); //$NON-NLS-1$
buffer.append("int X::y = 1; \n"); //$NON-NLS-1$
buffer.append("int ( *g(int) )(int); \n"); //$NON-NLS-1$
buffer.append("int ( *pf)(int); \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertTrue( col.getName(0).isDefinition() ); //a
assertFalse( col.getName(1).isDefinition() ); //b
assertTrue( col.getName(2).isDefinition() ); //c
assertFalse( col.getName(3).isDefinition() ); //f ()
assertTrue( col.getName(4).isDefinition() ); //f () {}
assertTrue( col.getName(5).isDefinition() ); //p
assertFalse( col.getName(6).isDefinition() ); //struct S;
assertTrue( col.getName(7).isDefinition() ); //struct S {}
assertTrue( col.getName(8).isDefinition() ); //d
assertTrue( col.getName(9).isDefinition() ); //X
assertFalse( col.getName(10).isDefinition() ); //y
assertTrue( col.getName(11).isDefinition() ); //N
assertTrue( col.getName(12).isDefinition() ); //X::y
assertFalse( col.getName(15).isDefinition() ); //g
assertTrue( col.getName(18).isDefinition() ); //pf
}
}

View file

@ -14,10 +14,12 @@ import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
@ -127,19 +129,26 @@ public class CPPASTDeclarator extends CPPASTNode implements IASTDeclarator {
*/
public int getRoleForName(IASTName n) {
IASTNode getParent = getParent();
boolean fnDtor = ( this instanceof IASTFunctionDeclarator );
if( getParent instanceof IASTDeclaration )
{
if( getParent instanceof IASTFunctionDefinition )
return r_definition;
if( getParent instanceof IASTSimpleDeclaration )
{
if( getInitializer() != null )
return r_definition;
IASTSimpleDeclaration sd = (IASTSimpleDeclaration) getParent;
if( sd.getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_extern )
return r_declaration;
if( getInitializer() == null )
int storage = sd.getDeclSpecifier().getStorageClass();
if( storage == IASTDeclSpecifier.sc_extern ||
storage == IASTDeclSpecifier.sc_typedef ||
storage == IASTDeclSpecifier.sc_static )
{
return r_declaration;
}
}
return r_definition;
return fnDtor ? r_declaration : r_definition;
}
if( getParent instanceof IASTTypeId )
return r_reference;
@ -154,17 +163,25 @@ public class CPPASTDeclarator extends CPPASTNode implements IASTDeclarator {
return r_definition;
if( getParent instanceof IASTSimpleDeclaration )
{
IASTSimpleDeclaration sd = (IASTSimpleDeclaration) getParent;
if( sd.getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_extern )
return r_declaration;
if( getInitializer() != null )
return r_definition;
IASTSimpleDeclaration sd = (IASTSimpleDeclaration) getParent;
int storage = sd.getDeclSpecifier().getStorageClass();
if( storage == IASTDeclSpecifier.sc_extern ||
storage == IASTDeclSpecifier.sc_typedef ||
storage == IASTDeclSpecifier.sc_static )
{
return r_declaration;
}
}
return r_definition;
return fnDtor ? r_declaration : r_definition;
}
if( t instanceof IASTTypeId )
return r_reference;
}
if( getParent instanceof IASTParameterDeclaration )
return ( n.toCharArray().length > 0 ) ? r_definition : r_declaration;
return r_unclear;
}
}