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

Fixed Bug 93123 - No way to determine if an IASTName is a definition

This commit is contained in:
John Camelon 2005-05-02 20:15:51 +00:00
parent 8468711bac
commit d2e2b4f4b1
17 changed files with 314 additions and 132 deletions

View file

@ -69,7 +69,14 @@ public interface IASTName extends IASTNode {
/** /**
* Is this name being used in the AST as a reference rather than a declaration? * Is this name being used in the AST as a reference rather than a declaration?
* @return * @return boolean
*/ */
public boolean isReference(); public boolean isReference();
/**
* Is this name being used in the AST as a reference rather than a declaration?
* @return boolean
*/
public boolean isDefinition();
} }

View file

@ -16,10 +16,15 @@ public interface IASTNameOwner {
* Role of name in this construct is a reference. * Role of name in this construct is a reference.
*/ */
public static final int r_reference = 1; public static final int r_reference = 1;
/**
* Role of name in this construct is a definition.
*/
public static final int r_definition = 2;
/** /**
* Role is unclear. * Role is unclear.
*/ */
public static final int r_unclear = 2; public static final int r_unclear = 3;
/** /**
* Get the role for the name. * Get the role for the name.

View file

@ -113,7 +113,7 @@ public class CASTCompositeTypeSpecifier extends CASTBaseDeclSpecifier implements
*/ */
public int getRoleForName(IASTName n) { public int getRoleForName(IASTName n) {
if( n == this.name ) if( n == this.name )
return r_declaration; return r_definition;
return r_unclear; return r_unclear;
} }
} }

View file

@ -10,12 +10,15 @@
package org.eclipse.cdt.internal.core.dom.parser.c; package org.eclipse.cdt.internal.core.dom.parser.c;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; 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.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
@ -125,7 +128,19 @@ public class CASTDeclarator extends CASTNode implements IASTDeclarator {
{ {
IASTNode getParent = getParent(); IASTNode getParent = getParent();
if( getParent instanceof IASTDeclaration ) if( getParent instanceof IASTDeclaration )
return r_declaration; {
if( getParent instanceof IASTFunctionDefinition )
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_declaration;
}
return r_definition;
}
if( getParent instanceof IASTTypeId ) if( getParent instanceof IASTTypeId )
return r_reference; return r_reference;
if( getParent instanceof IASTDeclarator ) if( getParent instanceof IASTDeclarator )
@ -134,7 +149,19 @@ public class CASTDeclarator extends CASTNode implements IASTDeclarator {
while ( t instanceof IASTDeclarator ) while ( t instanceof IASTDeclarator )
t = t.getParent(); t = t.getParent();
if( t instanceof IASTDeclaration ) if( t instanceof IASTDeclaration )
return r_declaration; {
if( getParent instanceof IASTFunctionDefinition )
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;
}
return r_definition;
}
if( t instanceof IASTTypeId ) if( t instanceof IASTTypeId )
return r_reference; return r_reference;
} }

View file

@ -81,7 +81,7 @@ public class CASTEnumerationSpecifier extends CASTBaseDeclSpecifier implements
*/ */
public int getRoleForName(IASTName n ) { public int getRoleForName(IASTName n ) {
if( this.name == n ) if( this.name == n )
return r_declaration; return r_definition;
return r_unclear; return r_unclear;
} }

View file

@ -69,7 +69,7 @@ public class CASTEnumerator extends CASTNode implements IASTEnumerator, IASTAmbi
* @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName)
*/ */
public int getRoleForName(IASTName n) { public int getRoleForName(IASTName n) {
if( n == name )return r_declaration; if( n == name )return r_definition;
return r_unclear; return r_unclear;
} }

View file

@ -21,13 +21,15 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
public class CASTName extends CASTNode implements IASTName { public class CASTName extends CASTNode implements IASTName {
private final char[] name; private final char[] name;
private static final char[] EMPTY_CHAR_ARRAY = { };
private static final char[] EMPTY_CHAR_ARRAY = {};
private IBinding binding = null; private IBinding binding = null;
/** /**
* @param name * @param name
*/ */
public CASTName(char [] name ) { public CASTName(char[] name) {
this.name = name; this.name = name;
} }
@ -38,74 +40,110 @@ public class CASTName extends CASTNode implements IASTName {
name = EMPTY_CHAR_ARRAY; name = EMPTY_CHAR_ARRAY;
} }
/* (non-Javadoc) /*
* (non-Javadoc)
*
* @see org.eclipse.cdt.core.dom.ast.IASTName#resolveBinding() * @see org.eclipse.cdt.core.dom.ast.IASTName#resolveBinding()
*/ */
public IBinding resolveBinding() { public IBinding resolveBinding() {
if( binding == null ) if (binding == null)
CVisitor.createBinding( this ); CVisitor.createBinding(this);
return binding; return binding;
} }
public IBinding getBinding(){
return binding; public IBinding getBinding() {
} return binding;
public IBinding[] resolvePrefix() {
return CVisitor.prefixLookup(this);
}
public void setBinding( IBinding binding ){
this.binding = binding;
} }
/* (non-Javadoc) public IBinding[] resolvePrefix() {
return CVisitor.prefixLookup(this);
}
public void setBinding(IBinding binding) {
this.binding = binding;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */
public String toString() { public String toString() {
if( name == EMPTY_CHAR_ARRAY ) return null; if (name == EMPTY_CHAR_ARRAY)
return new String( name ); return null;
return new String(name);
} }
public char[] toCharArray() { public char[] toCharArray() {
return name; return name;
} }
public boolean accept( ASTVisitor action ){ public boolean accept(ASTVisitor action) {
if( action.shouldVisitNames ){ if (action.shouldVisitNames) {
switch( action.visit( this ) ){ switch (action.visit(this)) {
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT:
case ASTVisitor.PROCESS_SKIP : return true; return false;
default : break; case ASTVisitor.PROCESS_SKIP:
} return true;
} default:
break;
}
}
return true; return true;
} }
/* (non-Javadoc) /*
* @see org.eclipse.cdt.core.dom.ast.IASTName#isDeclaration() * (non-Javadoc)
*/ *
public boolean isDeclaration() { * @see org.eclipse.cdt.core.dom.ast.IASTName#isDeclaration()
IASTNode parent = getParent(); */
if (parent instanceof IASTNameOwner) { public boolean isDeclaration() {
int role = ((IASTNameOwner) parent).getRoleForName(this); IASTNode parent = getParent();
if( role == IASTNameOwner.r_reference ) return false; if (parent instanceof IASTNameOwner) {
return true; int role = ((IASTNameOwner) parent).getRoleForName(this);
} switch (role) {
return false; case IASTNameOwner.r_reference:
} case IASTNameOwner.r_unclear:
return false;
default:
return true;
}
}
return false;
}
/* (non-Javadoc) /*
* @see org.eclipse.cdt.core.dom.ast.IASTName#isReference() * (non-Javadoc)
*/ *
public boolean isReference() { * @see org.eclipse.cdt.core.dom.ast.IASTName#isReference()
IASTNode parent = getParent(); */
if (parent instanceof IASTNameOwner) { public boolean isReference() {
int role = ((IASTNameOwner) parent).getRoleForName(this); IASTNode parent = getParent();
if( role == IASTNameOwner.r_reference ) return true; if (parent instanceof IASTNameOwner) {
return false; int role = ((IASTNameOwner) parent).getRoleForName(this);
} switch (role) {
return false; case IASTNameOwner.r_reference:
} return true;
default:
return false;
}
}
return false;
}
public boolean isDefinition() {
IASTNode parent = getParent();
if (parent instanceof IASTNameOwner) {
int role = ((IASTNameOwner) parent).getRoleForName(this);
switch (role) {
case IASTNameOwner.r_definition:
return true;
default:
return false;
}
}
return false;
}
} }

View file

@ -136,7 +136,7 @@ public class CPPASTCompositeTypeSpecifier extends CPPASTBaseDeclSpecifier
*/ */
public int getRoleForName(IASTName name) { public int getRoleForName(IASTName name) {
if( name == this.n ) if( name == this.n )
return r_declaration; return r_definition;
return r_unclear; return r_unclear;
} }
} }

View file

@ -11,10 +11,15 @@
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; 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.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
@ -121,10 +126,45 @@ public class CPPASTDeclarator extends CPPASTNode implements IASTDeclarator {
* @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName)
*/ */
public int getRoleForName(IASTName n) { public int getRoleForName(IASTName n) {
if( name == n ) IASTNode getParent = getParent();
{ if( getParent instanceof IASTDeclaration )
{
} if( getParent instanceof IASTFunctionDefinition )
return r_unclear; 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_declaration;
}
return r_definition;
}
if( getParent instanceof IASTTypeId )
return r_reference;
if( getParent instanceof IASTDeclarator )
{
IASTNode t = getParent;
while ( t instanceof IASTDeclarator )
t = t.getParent();
if( t instanceof IASTDeclaration )
{
if( getParent instanceof IASTFunctionDefinition )
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;
}
return r_definition;
}
if( t instanceof IASTTypeId )
return r_reference;
}
return r_unclear;
} }
} }

View file

@ -103,7 +103,7 @@ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier
*/ */
public int getRoleForName(IASTName n) { public int getRoleForName(IASTName n) {
if (name == n) if (name == n)
return r_declaration; return r_definition;
return r_unclear; return r_unclear;
} }
} }

View file

@ -70,7 +70,7 @@ public class CPPASTEnumerator extends CPPASTNode implements IASTEnumerator, IAST
*/ */
public int getRoleForName(IASTName n) { public int getRoleForName(IASTName n) {
if( name == n ) if( name == n )
return r_declaration; return r_definition;
return r_reference; return r_reference;
} }

View file

@ -22,13 +22,15 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
public class CPPASTName extends CPPASTNode implements IASTName { public class CPPASTName extends CPPASTNode implements IASTName {
private char[] name; private char[] name;
private static final char[] EMPTY_CHAR_ARRAY = { };
private static final char[] EMPTY_CHAR_ARRAY = {};
private IBinding binding = null; private IBinding binding = null;
/** /**
* @param name * @param name
*/ */
public CPPASTName(char [] name ) { public CPPASTName(char[] name) {
this.name = name; this.name = name;
} }
@ -39,78 +41,114 @@ public class CPPASTName extends CPPASTNode implements IASTName {
name = EMPTY_CHAR_ARRAY; name = EMPTY_CHAR_ARRAY;
} }
/* (non-Javadoc) /*
* (non-Javadoc)
*
* @see org.eclipse.cdt.core.dom.ast.IASTName#resolveBinding() * @see org.eclipse.cdt.core.dom.ast.IASTName#resolveBinding()
*/ */
public IBinding resolveBinding() { public IBinding resolveBinding() {
if( binding == null ) if (binding == null)
binding = CPPVisitor.createBinding( this ); binding = CPPVisitor.createBinding(this);
return binding; return binding;
} }
public IBinding[] resolvePrefix() { public IBinding[] resolvePrefix() {
return CPPSemantics.prefixLookup(this); return CPPSemantics.prefixLookup(this);
}
public void setBinding( IBinding binding ){
this.binding = binding;
}
public IBinding getBinding(){
return binding;
} }
/* (non-Javadoc) public void setBinding(IBinding binding) {
this.binding = binding;
}
public IBinding getBinding() {
return binding;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */
public String toString() { public String toString() {
if( name == EMPTY_CHAR_ARRAY ) return null; if (name == EMPTY_CHAR_ARRAY)
return new String( name ); return null;
return new String(name);
} }
public char[] toCharArray() { public char[] toCharArray() {
return name; return name;
} }
public void setName( char [] name ) public void setName(char[] name) {
{
this.name = name; this.name = name;
} }
public boolean accept( ASTVisitor action ){ public boolean accept(ASTVisitor action) {
if( action.shouldVisitNames ){ if (action.shouldVisitNames) {
switch( action.visit( this ) ){ switch (action.visit(this)) {
case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_ABORT:
case ASTVisitor.PROCESS_SKIP : return true; return false;
default : break; case ASTVisitor.PROCESS_SKIP:
} return true;
} default:
break;
}
}
return true; return true;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IASTName#isDeclaration()
*/
public boolean isDeclaration() {
IASTNode parent = getParent();
if (parent instanceof IASTNameOwner) {
int role = ((IASTNameOwner) parent).getRoleForName(this);
if( role == IASTNameOwner.r_reference ) return false;
return true;
}
return false;
}
/* (non-Javadoc) /*
* @see org.eclipse.cdt.core.dom.ast.IASTName#isReference() * (non-Javadoc)
*/ *
public boolean isReference() { * @see org.eclipse.cdt.core.dom.ast.IASTName#isDeclaration()
IASTNode parent = getParent(); */
if (parent instanceof IASTNameOwner) { public boolean isDeclaration() {
int role = ((IASTNameOwner) parent).getRoleForName(this); IASTNode parent = getParent();
if( role == IASTNameOwner.r_reference ) return true; if (parent instanceof IASTNameOwner) {
return false; int role = ((IASTNameOwner) parent).getRoleForName(this);
} switch (role) {
return false; case IASTNameOwner.r_reference:
} case IASTNameOwner.r_unclear:
return false;
default:
return true;
}
}
return false;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.cdt.core.dom.ast.IASTName#isReference()
*/
public boolean isReference() {
IASTNode parent = getParent();
if (parent instanceof IASTNameOwner) {
int role = ((IASTNameOwner) parent).getRoleForName(this);
switch (role) {
case IASTNameOwner.r_reference:
return true;
default:
return false;
}
}
return false;
}
public boolean isDefinition() {
IASTNode parent = getParent();
if (parent instanceof IASTNameOwner) {
int role = ((IASTNameOwner) parent).getRoleForName(this);
switch (role) {
case IASTNameOwner.r_definition:
return true;
default:
return false;
}
}
return false;
}
} }

View file

@ -91,7 +91,7 @@ public class CPPASTNamespaceDefinition extends CPPASTNode implements
* @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName)
*/ */
public int getRoleForName(IASTName n) { public int getRoleForName(IASTName n) {
if( name == n ) return r_declaration; if( name == n ) return r_definition;
return r_unclear; return r_unclear;
} }

View file

@ -46,7 +46,7 @@ public class CPPASTPointerToMember extends CPPASTPointer implements
*/ */
public int getRoleForName(IASTName name ) { public int getRoleForName(IASTName name ) {
if( name == this.n ) if( name == this.n )
return r_declaration; return r_reference;
return r_unclear; return r_unclear;
} }
} }

View file

@ -254,5 +254,16 @@ public class CPPASTQualifiedName extends CPPASTNode implements
return false; return false;
} }
public boolean isDefinition() {
IASTNode parent = getParent();
if (parent instanceof IASTNameOwner) {
int role = ((IASTNameOwner) parent).getRoleForName(this);
if( role == IASTNameOwner.r_definition ) return true;
return false;
}
return false;
}
} }

View file

@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNameOwner;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
@ -154,4 +155,15 @@ public class CPPASTTemplateId extends CPPASTNode implements ICPPASTTemplateId, I
} }
} }
} }
public boolean isDefinition() {
IASTNode parent = getParent();
if (parent instanceof IASTNameOwner) {
int role = ((IASTNameOwner) parent).getRoleForName(this);
if( role == IASTNameOwner.r_definition ) return true;
return false;
}
return false;
}
} }

View file

@ -575,7 +575,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
*/ */
public int getRoleForName(IASTName n) { public int getRoleForName(IASTName n) {
if (name == n) if (name == n)
return r_declaration; return r_definition;
return r_unclear; return r_unclear;
} }
@ -740,6 +740,10 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
return true; return true;
return false; return false;
} }
public boolean isDefinition() {
return isDeclaration();
}
/* /*
* (non-Javadoc) * (non-Javadoc)
@ -784,7 +788,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
*/ */
public int getRoleForName(IASTName n) { public int getRoleForName(IASTName n) {
if (name == n) if (name == n)
return r_declaration; return r_definition;
return r_unclear; return r_unclear;
} }