1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-01 13:25:45 +02:00

- add isStatic to IVariable

- fix bug 85824
- fix problems with implicit scopes
This commit is contained in:
Andrew Niefer 2005-02-18 21:36:59 +00:00
parent 7a4aed4b37
commit 5cafbaec9b
11 changed files with 227 additions and 56 deletions

View file

@ -1884,5 +1884,19 @@ public class AST2CPPTests extends AST2BaseTest {
assertInstances( col, f1, 2 ); assertInstances( col, f1, 2 );
assertInstances( col, f2, 1 ); assertInstances( col, f2, 1 );
} }
public void testBug85824() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append( "extern int g; \n "); //$NON-NLS-1$
buffer.append( "int g; \n "); //$NON-NLS-1$
buffer.append( "void f() { g = 1; }\n "); //$NON-NLS-1$
IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
CPPVisitor.visitTranslationUnit(tu, col);
IVariable g = (IVariable) col.getName(3).resolveBinding();
assertInstances( col, g, 3 );
}
} }

View file

@ -19,4 +19,7 @@ public interface IVariable extends IBinding {
* @return the type of the variable * @return the type of the variable
*/ */
public IType getType() throws DOMException; public IType getType() throws DOMException;
public boolean isStatic() throws DOMException;
} }

View file

@ -62,4 +62,11 @@ public class CExternalVariable implements ICExternalBinding, IVariable {
public IType getType() { public IType getType() {
return null; return null;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#isStatic()
*/
public boolean isStatic() {
return false;
}
} }

View file

@ -82,4 +82,11 @@ public class CKnRParameter implements IParameter {
return declaration; return declaration;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#isStatic()
*/
public boolean isStatic() {
return false;
}
} }

View file

@ -36,6 +36,10 @@ public class CParameter implements IParameter {
public IType getType() throws DOMException { public IType getType() throws DOMException {
throw new DOMException( this ); throw new DOMException( this );
} }
public boolean isStatic() throws DOMException {
throw new DOMException( this );
}
} }
private IASTName [] declarations; private IASTName [] declarations;
@ -100,4 +104,11 @@ public class CParameter implements IParameter {
declarations = tmp; declarations = tmp;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#isStatic()
*/
public boolean isStatic(){
return false;
}
} }

View file

@ -12,12 +12,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.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
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.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
/** /**
@ -33,24 +36,30 @@ public class CVariable implements IVariable, ICBinding {
public IType getType() throws DOMException { public IType getType() throws DOMException {
throw new DOMException( this ); throw new DOMException( this );
} }
public boolean isStatic() throws DOMException {
throw new DOMException( this );
}
} }
final IASTName name; private IASTName [] declarations = null;
private IType type = null; private IType type = null;
public CVariable( IASTName name ){ public CVariable( IASTName name ){
this.name = name; declarations = new IASTName [] { name };
} }
public IASTNode getPhysicalNode(){ public IASTNode getPhysicalNode(){
return name; return declarations[0];
} }
public void addDeclaration( IASTName name ){
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#getType() * @see org.eclipse.cdt.core.dom.ast.IVariable#getType()
*/ */
public IType getType() { public IType getType() {
if (type == null) if (type == null)
type = CVisitor.createType(name); type = CVisitor.createType(declarations[0]);
return type; return type;
} }
@ -58,17 +67,29 @@ public class CVariable implements IVariable, ICBinding {
* @see org.eclipse.cdt.core.dom.ast.IBinding#getName() * @see org.eclipse.cdt.core.dom.ast.IBinding#getName()
*/ */
public String getName() { public String getName() {
return name.toString(); return declarations[0].toString();
} }
public char[]getNameCharArray(){ public char[]getNameCharArray(){
return ((CASTName)name).toCharArray(); return declarations[0].toCharArray();
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope() * @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
*/ */
public IScope getScope() { public IScope getScope() {
IASTDeclarator declarator = (IASTDeclarator) name.getParent(); IASTDeclarator declarator = (IASTDeclarator) declarations[0].getParent();
return CVisitor.getContainingScope( declarator.getParent() ); return CVisitor.getContainingScope( declarator.getParent() );
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#isStatic()
*/
public boolean isStatic() {
IASTDeclarator dtor = (IASTDeclarator) declarations[0].getParent();
while( dtor.getParent() instanceof IASTDeclarator )
dtor = (IASTDeclarator) dtor.getParent();
IASTSimpleDeclaration simple = (IASTSimpleDeclaration) dtor.getParent();
IASTDeclSpecifier declSpec = simple.getDeclSpecifier();
return ( declSpec.getStorageClass() == IASTDeclSpecifier.sc_static );
}
} }

View file

@ -736,6 +736,15 @@ public class CVisitor {
} }
ICScope scope = (ICScope) getContainingScope( parent ); ICScope scope = (ICScope) getContainingScope( parent );
ASTNodeProperty prop = parent.getPropertyInParent();
if( prop == IASTDeclarationStatement.DECLARATION ){
//implicit scope, see 6.8.4-3
prop = parent.getParent().getPropertyInParent();
if( prop != IASTCompoundStatement.NESTED_STATEMENT )
scope = null;
}
IBinding binding = null; IBinding binding = null;
try { try {
binding = ( scope != null ) ? scope.getBinding( ICScope.NAMESPACE_TYPE_OTHER, declarator.getName().toCharArray() ) : null; binding = ( scope != null ) ? scope.getBinding( ICScope.NAMESPACE_TYPE_OTHER, declarator.getName().toCharArray() ) : null;
@ -767,11 +776,23 @@ public class CVisitor {
IASTSimpleDeclaration simpleDecl = (IASTSimpleDeclaration) parent; IASTSimpleDeclaration simpleDecl = (IASTSimpleDeclaration) parent;
if( simpleDecl.getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_typedef ){ if( simpleDecl.getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_typedef ){
binding = new CTypeDef( declarator.getName() ); binding = new CTypeDef( declarator.getName() );
} else {
IType t1 = null, t2 = null;
if( binding != null && binding instanceof IVariable ){
t1 = createType( declarator.getName() );
try {
t2 = ((IVariable)binding).getType();
} catch ( DOMException e1 ) {
}
}
if( t1 != null && t2 != null && t1.equals( t2 ) ){
((CVariable)binding).addDeclaration( declarator.getName() );
} else if( simpleDecl.getParent() instanceof ICASTCompositeTypeSpecifier ){ } else if( simpleDecl.getParent() instanceof ICASTCompositeTypeSpecifier ){
binding = new CField( declarator.getName() ); binding = new CField( declarator.getName() );
} else { } else {
binding = new CVariable( declarator.getName() ); binding = new CVariable( declarator.getName() );
} }
}
} else if( parent instanceof IASTParameterDeclaration ){ } else if( parent instanceof IASTParameterDeclaration ){
IASTFunctionDeclarator fdtor = (IASTFunctionDeclarator) parent.getParent(); IASTFunctionDeclarator fdtor = (IASTFunctionDeclarator) parent.getParent();
IBinding temp = fdtor.getName().resolveBinding(); IBinding temp = fdtor.getName().resolveBinding();

View file

@ -14,11 +14,7 @@
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.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
/** /**
@ -42,8 +38,8 @@ public class CPPField extends CPPVariable implements ICPPField, ICPPBinding {
} }
} }
public CPPField( IASTDeclarator declarator ){ public CPPField( IASTName name ){
super( declarator ); super( name );
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -53,20 +49,4 @@ public class CPPField extends CPPVariable implements ICPPField, ICPPBinding {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return 0; return 0;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPMember#isStatic()
*/
public boolean isStatic() {
IASTDeclarator dtor = (IASTDeclarator) getPhysicalNode();
while( dtor.getPropertyInParent() == IASTDeclarator.NESTED_DECLARATOR )
dtor = (IASTDeclarator) dtor.getParent();
IASTNode node = dtor.getParent();
if( node instanceof IASTSimpleDeclaration ){
ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) ((IASTSimpleDeclaration)node).getDeclSpecifier();
return (declSpec.getStorageClass() == IASTDeclSpecifier.sc_static );
}
return false;
}
} }

View file

@ -111,4 +111,11 @@ public class CPPParameter implements IParameter, ICPPBinding {
return type; return type;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#isStatic()
*/
public boolean isStatic() {
return false;
}
} }

View file

@ -14,11 +14,17 @@
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.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
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.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
/** /**
@ -34,34 +40,71 @@ public class CPPVariable implements IVariable, ICPPBinding {
throw new DOMException( this ); throw new DOMException( this );
} }
public boolean isStatic() throws DOMException {
throw new DOMException( this );
} }
private IASTDeclarator declarator = null; }
private IASTName declarations[] = null;
private IASTName definition = null;
private IType type = null; private IType type = null;
public CPPVariable( IASTDeclarator dtor ){ public CPPVariable( IASTName name ){
declarator = dtor; if( isDefinition( name ) )
definition = name;
else
declarations = new IASTName [] { name };
} }
protected boolean isDefinition( IASTName name ){
IASTDeclarator dtor = (IASTDeclarator) name.getParent();
while( dtor.getParent() instanceof IASTDeclarator )
dtor = (IASTDeclarator) dtor.getParent();
IASTSimpleDeclaration simpleDecl = (IASTSimpleDeclaration) dtor.getParent();
IASTDeclSpecifier declSpec = simpleDecl.getDeclSpecifier();
//(3.1-1) A declaration is a definition unless ...
//it contains the extern specifier or a linkage-spec and does not contain an initializer
if( dtor.getInitializer() == null && declSpec.getStorageClass() == IASTDeclSpecifier.sc_extern )
return false;
//or it declares a static data member in a class declaration
if( simpleDecl.getParent() instanceof ICPPASTCompositeTypeSpecifier &&
declSpec.getStorageClass() == IASTDeclSpecifier.sc_static )
{
return false;
}
return true;
}
public void addDeclaration( IASTName name ) {
if( isDefinition( name ) )
definition = name;
else
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPBinding#getDeclarations() * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPBinding#getDeclarations()
*/ */
public IASTNode[] getDeclarations() { public IASTNode[] getDeclarations() {
return null; return declarations;
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPBinding#getDefinition() * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPBinding#getDefinition()
*/ */
public IASTNode getDefinition() { public IASTNode getDefinition() {
return declarator; return definition;
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IVariable#getType() * @see org.eclipse.cdt.core.dom.ast.IVariable#getType()
*/ */
public IType getType() { public IType getType() {
if( type == null ) if( type == null ){
type = CPPVisitor.createType( declarator ); IASTDeclarator dtor = (IASTDeclarator) ( (definition != null) ? definition.getParent() : declarations[0].getParent() );
type = CPPVisitor.createType( dtor );
}
return type; return type;
} }
@ -69,28 +112,63 @@ public class CPPVariable implements IVariable, ICPPBinding {
* @see org.eclipse.cdt.core.dom.ast.IBinding#getName() * @see org.eclipse.cdt.core.dom.ast.IBinding#getName()
*/ */
public String getName() { public String getName() {
return declarator.getName().toString(); if( declarations != null ){
return declarations[0].toString();
}
IASTName name = definition;
if( name instanceof ICPPASTQualifiedName ){
IASTName [] ns = ((ICPPASTQualifiedName)name).getNames();
name = ns[ ns.length - 1 ];
}
return name.toString();
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getNameCharArray() * @see org.eclipse.cdt.core.dom.ast.IBinding#getNameCharArray()
*/ */
public char[] getNameCharArray() { public char[] getNameCharArray() {
return declarator.getName().toCharArray(); if( declarations != null ){
return declarations[0].toCharArray();
}
IASTName name = definition;
if( name instanceof ICPPASTQualifiedName ){
IASTName [] ns = ((ICPPASTQualifiedName)name).getNames();
name = ns[ ns.length - 1 ];
}
return name.toCharArray();
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope() * @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
*/ */
public IScope getScope() { public IScope getScope() {
return CPPVisitor.getContainingScope( declarator ); return CPPVisitor.getContainingScope( definition != null ? definition : declarations[0] );
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getPhysicalNode() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPMember#isStatic()
*/ */
public IASTNode getPhysicalNode() { public boolean isStatic() {
return declarator; IASTDeclarator dtor = null;
if( declarations != null )
dtor = (IASTDeclarator) declarations[0].getParent();
else {
//definition of a static field doesn't necessarily say static
if( definition instanceof ICPPASTQualifiedName )
return true;
dtor = (IASTDeclarator) definition.getParent();
} }
while( dtor.getPropertyInParent() == IASTDeclarator.NESTED_DECLARATOR )
dtor = (IASTDeclarator) dtor.getParent();
IASTNode node = dtor.getParent();
if( node instanceof IASTSimpleDeclaration ){
IASTDeclSpecifier declSpec = ((IASTSimpleDeclaration)node).getDeclSpecifier();
return (declSpec.getStorageClass() == IASTDeclSpecifier.sc_static );
}
return false;
}
} }

View file

@ -371,9 +371,8 @@ public class CPPVisitor {
if( parent instanceof IASTTypeId ) if( parent instanceof IASTTypeId )
return CPPSemantics.resolveBinding( declarator.getName() ); return CPPSemantics.resolveBinding( declarator.getName() );
if( declarator.getNestedDeclarator() != null ) while( declarator.getNestedDeclarator() != null )
return createBinding( declarator.getNestedDeclarator() ); declarator = declarator.getNestedDeclarator();
while( parent instanceof IASTDeclarator ){ while( parent instanceof IASTDeclarator ){
parent = parent.getParent(); parent = parent.getParent();
@ -389,6 +388,15 @@ public class CPPVisitor {
} }
} }
} }
ASTNodeProperty prop = parent.getPropertyInParent();
if( prop == IASTDeclarationStatement.DECLARATION ){
//implicit scope, see 6.4-1
prop = parent.getParent().getPropertyInParent();
if( prop != IASTCompoundStatement.NESTED_STATEMENT )
scope = null;
}
IBinding binding; IBinding binding;
try { try {
binding = ( scope != null ) ? scope.getBinding( declarator.getName() ) : null; binding = ( scope != null ) ? scope.getBinding( declarator.getName() ) : null;
@ -433,13 +441,27 @@ public class CPPVisitor {
binding = function.resolveParameter( param ); binding = function.resolveParameter( param );
} }
} else if( parent instanceof IASTSimpleDeclaration ){ } else if( parent instanceof IASTSimpleDeclaration ){
IASTSimpleDeclaration simpleDecl = (IASTSimpleDeclaration) parent; IASTSimpleDeclaration simpleDecl = (IASTSimpleDeclaration) parent;
if( simpleDecl.getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_typedef ){ if( simpleDecl.getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_typedef ){
binding = new CPPTypedef( declarator ); binding = new CPPTypedef( declarator );
} else if( simpleDecl.getParent() instanceof ICPPASTCompositeTypeSpecifier ){
binding = new CPPField( declarator );
} else { } else {
binding = new CPPVariable( declarator ); IType t1 = null, t2 = null;
if( binding != null && binding instanceof IVariable ){
t1 = createType( declarator );
try {
t2 = ((IVariable)binding).getType();
} catch ( DOMException e1 ) {
}
}
if( t1 != null && t2 != null && t1.equals( t2 ) ){
((CPPVariable)binding).addDeclaration( declarator.getName() );
} else if( simpleDecl.getParent() instanceof ICPPASTCompositeTypeSpecifier ){
binding = new CPPField( declarator.getName() );
} else {
binding = new CPPVariable( declarator.getName() );
}
} }
} }