1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 17:56:01 +02:00

-some javadoc for IScope interfaces

-implement the assorted get field & method functions on ICPPClassType
This commit is contained in:
Andrew Niefer 2005-03-10 21:40:15 +00:00
parent 122a949f09
commit a656f70b4d
19 changed files with 386 additions and 106 deletions

View file

@ -53,6 +53,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTWhileStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTWhileStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPCompositeBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPCompositeBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
@ -2781,5 +2782,73 @@ public class AST2CPPTests extends AST2BaseTest {
assertSame( bs[1], f1 ); assertSame( bs[1], f1 );
assertSame( bs[2], f2 ); assertSame( bs[2], f2 );
} }
public void testGets() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("class A { \n"); //$NON-NLS-1$
buffer.append(" int a; \n"); //$NON-NLS-1$
buffer.append(" void fa(); \n"); //$NON-NLS-1$
buffer.append("}; \n"); //$NON-NLS-1$
buffer.append("class B : public A { \n"); //$NON-NLS-1$
buffer.append(" int b; \n"); //$NON-NLS-1$
buffer.append(" void fb(); \n"); //$NON-NLS-1$
buffer.append("}; \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
ICPPClassType B = (ICPPClassType) col.getName(3).resolveBinding();
ICPPField a = (ICPPField) col.getName(1).resolveBinding();
ICPPMethod fa = (ICPPMethod) col.getName(2).resolveBinding();
ICPPField b = (ICPPField) col.getName(5).resolveBinding();
ICPPMethod fb = (ICPPMethod) col.getName(6).resolveBinding();
Object [] result = B.getDeclaredFields();
assertEquals( result.length, 1 );
assertSame( result[0], b );
result = B.getFields();
assertEquals( result.length, 2 );
assertSame( result[0], b );
assertSame( result[1], a );
result = B.getDeclaredMethods();
assertEquals( result.length, 1 );
assertSame( result[0], fb );
result = B.getAllDeclaredMethods();
assertEquals( result.length, 2 );
assertSame( result[0], fb );
assertSame( result[1], fa );
ICPPMethod [] B_implicit = ((ICPPClassScope)B.getCompositeScope()).getImplicitMethods();
assertEquals( B_implicit.length, 4 );
assertTrue( B_implicit[0].getName().equals( "B" ) ); //$NON-NLS-1$
assertTrue( B_implicit[1].getName().equals( "B" ) ); //$NON-NLS-1$
assertTrue( B_implicit[2].getName().equals( "operator =" ) ); //$NON-NLS-1$
assertTrue( B_implicit[3].getName().equals( "~B" ) ); //$NON-NLS-1$
ICPPMethod [] A_implicit = ((ICPPClassScope)A.getCompositeScope()).getImplicitMethods();
assertEquals( A_implicit.length, 4 );
assertTrue( A_implicit[0].getName().equals( "A" ) ); //$NON-NLS-1$
assertTrue( A_implicit[1].getName().equals( "A" ) ); //$NON-NLS-1$
assertTrue( A_implicit[2].getName().equals( "operator =" ) ); //$NON-NLS-1$
assertTrue( A_implicit[3].getName().equals( "~A" ) ); //$NON-NLS-1$
result = B.getMethods();
assertEquals( result.length, 10 );
assertSame( result[0], fb );
assertSame( result[1], B_implicit[0] );
assertSame( result[2], B_implicit[1] );
assertSame( result[3], B_implicit[2] );
assertSame( result[4], B_implicit[3] );
assertSame( result[5], fa );
assertSame( result[6], A_implicit[0] );
assertSame( result[7], A_implicit[1] );
assertSame( result[8], A_implicit[2] );
assertSame( result[9], A_implicit[3] );
}
} }

View file

@ -40,5 +40,10 @@ public interface ICompositeType extends IBinding, IType {
*/ */
public IField findField( String name ) throws DOMException; public IField findField( String name ) throws DOMException;
/**
* get the IScope object that is associated with this composite type
* @return
* @throws DOMException
*/
public IScope getCompositeScope() throws DOMException; public IScope getCompositeScope() throws DOMException;
} }

View file

@ -35,80 +35,63 @@ public interface IProblemBinding extends IBinding, IScope, IType {
/* /*
* Parser Semantic Problems * Parser Semantic Problems
* All Semantic problems take a char[] as an argument
*/ */
/**
* Attempt to add a unique symbol, yet the value was already defined.
* Require attributes: A_SYMBOL_NAME
* @see #A_SYMBOL_NAME
*/
public final static int SEMANTIC_UNIQUE_NAME_PREDEFINED = 0x001;
/** /**
* Attempt to use a symbol that was not found. * Attempt to use a symbol that was not found.
* Require attributes: A_SYMBOL_NAME * Require attributes: A_SYMBOL_NAME
* @see #A_SYMBOL_NAME * @see #A_SYMBOL_NAME
*/ */
public final static int SEMANTIC_NAME_NOT_FOUND = 0x002; public final static int SEMANTIC_NAME_NOT_FOUND = 0x001;
/**
* Name not provided in context that it was required.
* Require attributes: none
*/
public final static int SEMANTIC_NAME_NOT_PROVIDED = 0x003;
/** /**
* Invalid overload of a particular name. * Invalid overload of a particular name.
* Required attributes: A_SYMBOL_NAME * Required attributes: A_SYMBOL_NAME
* @see #A_SYMBOL_NAME * @see #A_SYMBOL_NAME
*/ */
public static final int SEMANTIC_INVALID_OVERLOAD = 0x004; public static final int SEMANTIC_INVALID_OVERLOAD = 0x002;
/** /**
* Invalid using directive. * Invalid using directive.
* Required attributes: A_NAMESPACE_NAME * Required attributes: A_NAMESPACE_NAME
* @see #A_NAMESPACE_NAME * @see #A_NAMESPACE_NAME
*/ */
public static final int SEMANTIC_INVALID_USING = 0x005; public static final int SEMANTIC_INVALID_USING = 0x003;
/** /**
* Ambiguous lookup for given name. * Ambiguous lookup for given name.
* Required attributes: A_SYMBOL_NAME * Required attributes: A_SYMBOL_NAME
* @see #A_SYMBOL_NAME * @see #A_SYMBOL_NAME
*/ */
public static final int SEMANTIC_AMBIGUOUS_LOOKUP = 0x006; public static final int SEMANTIC_AMBIGUOUS_LOOKUP = 0x004;
/** /**
* Invalid type provided * Invalid type provided
* Required attribugtes: A_TYPE_NAME * Required attribugtes: A_TYPE_NAME
* @see #A_TYPE_NAME * @see #A_TYPE_NAME
*/ */
public static final int SEMANTIC_INVALID_TYPE = 0x007; public static final int SEMANTIC_INVALID_TYPE = 0x005;
public static final int SEMANTIC_CIRCULAR_INHERITANCE = 0x008; /**
* circular inheritance was detected for a class
*/
public static final int SEMANTIC_CIRCULAR_INHERITANCE = 0x006;
public static final int SEMANTIC_INVALID_TEMPLATE = 0x009; /**
* the definition for the class/function can not be found
public static final int SEMANTIC_BAD_VISIBILITY = 0x00A; */
public static final int SEMANTIC_DEFINITION_NOT_FOUND = 0x007;
public static final int SEMANTIC_UNABLE_TO_RESOLVE_FUNCTION = 0x00B;
public static final int SEMANTIC_INVALID_TEMPLATE_ARGUMENT = 0x00C;
public static final int SEMANTIC_INVALID_TEMPLATE_PARAMETER = 0x00D;
public static final int SEMANTIC_REDECLARED_TEMPLATE_PARAMETER = 0x00E;
public static final int SEMANTIC_INVALID_CONVERSION_TYPE = 0x00F;
public static final int SEMANTIC_MALFORMED_EXPRESSION = 0x010;
public static final int SEMANTIC_ILLFORMED_FRIEND = 0x011;
public static final int SEMANTIC_RECURSIVE_TEMPLATE_INSTANTIATION = 0x012; /**
* the declaration for the K&R style function parameter can not be found
*/
public static final int SEMANTIC_KNR_PARAMETER_DECLARATION_NOT_FOUND = 0x008;
/**
* a label statement can not be found to match a goto statement
*/
public static final int SEMANTIC_LABEL_STATEMENT_NOT_FOUND = 0x009;
public static final int SEMANTIC_DEFINITION_NOT_FOUND = 0x013;
public static final int SEMANTIC_KNR_PARAMETER_DECLARATION_NOT_FOUND = 0x014;
public static final int SEMANTIC_LABEL_STATEMENT_NOT_FOUND = 0x015;
public static final int LAST_PROBLEM = SEMANTIC_LABEL_STATEMENT_NOT_FOUND; public static final int LAST_PROBLEM = SEMANTIC_LABEL_STATEMENT_NOT_FOUND;
} }

View file

@ -37,6 +37,7 @@ public interface IScope {
public IBinding[] find(String name) throws DOMException; public IBinding[] find(String name) throws DOMException;
/** /**
* Return the physical IASTNode that this scope was created for
* @return * @return
*/ */
public IASTNode getPhysicalNode() throws DOMException; public IASTNode getPhysicalNode() throws DOMException;

View file

@ -21,5 +21,12 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
* @author aniefer * @author aniefer
*/ */
public interface ICCompositeTypeScope extends ICScope { public interface ICCompositeTypeScope extends ICScope {
/**
* get the binding for the member that has been previous added to this scope
* and that matches the given name.
* @param name
* @return
* @throws DOMException
*/
public IBinding getBinding( char[] name ) throws DOMException; public IBinding getBinding( char[] name ) throws DOMException;
} }

View file

@ -22,7 +22,22 @@ import org.eclipse.cdt.core.dom.ast.IScope;
* @author aniefer * @author aniefer
*/ */
public interface ICFunctionScope extends ICScope { public interface ICFunctionScope extends ICScope {
/**
* Get the scope representing the function body .
* returns null if there is no function definition
* @return
* @throws DOMException
*/
public IScope getBodyScope() throws DOMException; public IScope getBodyScope() throws DOMException;
/**
* return the ILabel binding in this scope that matches the given name
*
* @param name
* @return
* @throws DOMException
*/
public IBinding getBinding( char[] name ) throws DOMException; public IBinding getBinding( char[] name ) throws DOMException;
} }

View file

@ -22,10 +22,38 @@ import org.eclipse.cdt.core.dom.ast.IScope;
* @author aniefer * @author aniefer
*/ */
public interface ICScope extends IScope { public interface ICScope extends IScope {
/**
* ISO C:99 6.2.3
* there are seperate namespaces for various categories of identifiers:
* - label names ( labels have ICFunctionScope )
* - tags of structures or unions : NAMESPACE_TYPE_TAG
* - members of structures or unions ( members have ICCompositeTypeScope )
* - all other identifiers : NAMESPACE_TYPE_OTHER
*/
public static final int NAMESPACE_TYPE_TAG = 0; public static final int NAMESPACE_TYPE_TAG = 0;
public static final int NAMESPACE_TYPE_OTHER = 1; public static final int NAMESPACE_TYPE_OTHER = 1;
/**
* add a binding to this scope
* @param binding
* @throws DOMException
*/
void addBinding( IBinding binding ) throws DOMException; void addBinding( IBinding binding ) throws DOMException;
/**
* remove the given binding from this scope
* @param binding
* @throws DOMException
*/
void removeBinding( IBinding binding ) throws DOMException; void removeBinding( IBinding binding ) throws DOMException;
/**
* Get the binding that has previously been added to this scope that matches
* the given name and is in the appropriate namespace
* @param namespaceType : either NAMESPACE_TYPE_TAG or NAMESPACE_TYPE_OTHER
* @param name
* @return
* @throws DOMException
*/
public IBinding getBinding( int namespaceType, char [] name ) throws DOMException; public IBinding getBinding( int namespaceType, char [] name ) throws DOMException;
} }

View file

@ -17,5 +17,18 @@ package org.eclipse.cdt.core.dom.ast.cpp;
* @author aniefer * @author aniefer
*/ */
public interface ICPPClassScope extends ICPPScope { public interface ICPPClassScope extends ICPPScope {
/**
* Get the binding for the class this scope is associated with
* @return
*/
ICPPClassType getClassType(); ICPPClassType getClassType();
/**
* Returns an array of methods that were implicitly added to this class scope.
* These methods may or may not have been explicitly declared in the code.
* The methods that will be implicitly declared are: the default constructor,
* copy constructor, copy assignment operator, and destructor
* @return
*/
public ICPPMethod [] getImplicitMethods();
} }

View file

@ -10,8 +10,6 @@
**********************************************************************/ **********************************************************************/
package org.eclipse.cdt.core.dom.ast.cpp; package org.eclipse.cdt.core.dom.ast.cpp;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.ICompositeType;
@ -39,13 +37,23 @@ public interface ICPPClassType extends ICompositeType {
*/ */
public IField[] getFields() throws DOMException; public IField[] getFields() throws DOMException;
/**
* findField is restated here to point out that this method looks through the
* inheritance tree of this class while looking for a field with the given name
* If no field is found, null is returned, if the name is found to be ambiguous
* a IProblemBinding is returned.
* @param name
* @return
*/
public IField findField( String name ) throws DOMException;
/** /**
* Returns a list of ICPPField objects representing fields declared in this * Returns a list of ICPPField objects representing fields declared in this
* class. It does not include fields inherited from base classes. * class. It does not include fields inherited from base classes.
* *
* @return List of ICPPField * @return List of ICPPField
*/ */
public List getDeclaredFields() throws DOMException; public ICPPField[] getDeclaredFields() throws DOMException;
/** /**
* Returns a list of ICPPMethod objects representing all methods defined for * Returns a list of ICPPMethod objects representing all methods defined for
@ -54,7 +62,7 @@ public interface ICPPClassType extends ICompositeType {
* *
* @return List of ICPPMethod * @return List of ICPPMethod
*/ */
public List getMethods() throws DOMException; public ICPPMethod[] getMethods() throws DOMException;
/** /**
* Returns a list of ICPPMethod objects representing all method explicitly * Returns a list of ICPPMethod objects representing all method explicitly
@ -63,7 +71,7 @@ public interface ICPPClassType extends ICompositeType {
* *
* @return List of ICPPMethod * @return List of ICPPMethod
*/ */
public List getAllDeclaredMethods() throws DOMException; public ICPPMethod[] getAllDeclaredMethods() throws DOMException;
/** /**
* Returns a list of ICPPMethod objects representing all methods explicitly * Returns a list of ICPPMethod objects representing all methods explicitly
@ -72,7 +80,7 @@ public interface ICPPClassType extends ICompositeType {
* *
* @return List of ICPPMethod * @return List of ICPPMethod
*/ */
public List getDeclaredMethods() throws DOMException; public ICPPMethod[] getDeclaredMethods() throws DOMException;
/** /**
* @return * @return

View file

@ -13,9 +13,19 @@
*/ */
package org.eclipse.cdt.core.dom.ast.cpp; package org.eclipse.cdt.core.dom.ast.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IScope;
/** /**
* @author aniefer * @author aniefer
*/ */
public interface ICPPFunctionScope extends ICPPScope { public interface ICPPFunctionScope extends ICPPScope {
/**
* Get the scope representing the function body.
* returns null if there is no function definition
* @return
* @throws DOMException
*/
public IScope getBodyScope() throws DOMException;
} }

View file

@ -55,6 +55,15 @@ public class ObjectSet extends ObjectTable {
add( set.keyAt( i ) ); add( set.keyAt( i ) );
} }
} }
public void addAll( Object[] objs ){
if( objs == null )
return;
for (int i = 0; i < objs.length; i++) {
if( objs[i] != null ) add( objs[i] );
}
}
public boolean remove( Object key ) { public boolean remove( Object key ) {
int i = lookup(key); int i = lookup(key);

View file

@ -43,31 +43,23 @@ public class ProblemBinding implements IProblemBinding, IType, IScope {
protected static final String [] errorMessages; protected static final String [] errorMessages;
static { static {
errorMessages = new String [ IProblemBinding.LAST_PROBLEM ]; errorMessages = new String [ IProblemBinding.LAST_PROBLEM ];
errorMessages[SEMANTIC_UNIQUE_NAME_PREDEFINED - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.uniqueNamePredefined"); //$NON-NLS-1$
errorMessages[SEMANTIC_NAME_NOT_FOUND - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.nameNotFound"); //$NON-NLS-1$ errorMessages[SEMANTIC_NAME_NOT_FOUND - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.nameNotFound"); //$NON-NLS-1$
errorMessages[SEMANTIC_NAME_NOT_PROVIDED - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.nameNotProvided"); //$NON-NLS-1$
errorMessages[SEMANTIC_INVALID_CONVERSION_TYPE - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.invalidConversionType"); //$NON-NLS-1$
errorMessages[SEMANTIC_MALFORMED_EXPRESSION - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.malformedExpression"); //$NON-NLS-1$
errorMessages[SEMANTIC_AMBIGUOUS_LOOKUP - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.ambiguousLookup"); //$NON-NLS-1$ errorMessages[SEMANTIC_AMBIGUOUS_LOOKUP - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.ambiguousLookup"); //$NON-NLS-1$
errorMessages[SEMANTIC_INVALID_TYPE - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.invalidType"); //$NON-NLS-1$ errorMessages[SEMANTIC_INVALID_TYPE - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.invalidType"); //$NON-NLS-1$
errorMessages[SEMANTIC_CIRCULAR_INHERITANCE - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.circularInheritance"); //$NON-NLS-1$ errorMessages[SEMANTIC_CIRCULAR_INHERITANCE - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.circularInheritance"); //$NON-NLS-1$
errorMessages[SEMANTIC_INVALID_OVERLOAD - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.invalidOverload"); //$NON-NLS-1$ errorMessages[SEMANTIC_INVALID_OVERLOAD - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.invalidOverload"); //$NON-NLS-1$
errorMessages[SEMANTIC_INVALID_TEMPLATE - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.invalidTemplate"); //$NON-NLS-1$
errorMessages[SEMANTIC_INVALID_USING - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.invalidUsing"); //$NON-NLS-1$ errorMessages[SEMANTIC_INVALID_USING - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.invalidUsing"); //$NON-NLS-1$
errorMessages[SEMANTIC_BAD_VISIBILITY - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.badVisibility"); //$NON-NLS-1$ errorMessages[SEMANTIC_DEFINITION_NOT_FOUND - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.dom.definitionNotFound"); //$NON-NLS-1$
errorMessages[SEMANTIC_UNABLE_TO_RESOLVE_FUNCTION - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.unableToResolveFunction"); //$NON-NLS-1$ errorMessages[SEMANTIC_KNR_PARAMETER_DECLARATION_NOT_FOUND - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.dom.knrParameterDeclarationNotFound"); //$NON-NLS-1$
errorMessages[SEMANTIC_INVALID_TEMPLATE_ARGUMENT - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.invalidTemplateArgument"); //$NON-NLS-1$ errorMessages[SEMANTIC_LABEL_STATEMENT_NOT_FOUND - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.dom.labelStatementNotFound"); //$NON-NLS-1$
errorMessages[SEMANTIC_INVALID_TEMPLATE_PARAMETER - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.invalidTemplateParameter"); //$NON-NLS-1$
errorMessages[SEMANTIC_REDECLARED_TEMPLATE_PARAMETER - 1] = ParserMessages.getString("ASTProblemFactory.error.semantic.pst.redeclaredTemplateParameter"); //$NON-NLS-1$
errorMessages[SEMANTIC_RECURSIVE_TEMPLATE_INSTANTIATION - 1]= ParserMessages.getString("ASTProblemFactory.error.semantic.pst.recursiveTemplateInstantiation"); //$NON-NLS-1$
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IProblemBinding#getID() * @see org.eclipse.cdt.core.dom.ast.IProblemBinding#getID()
*/ */
public int getID() { public int getID() {
return id; return id;
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IProblemBinding#getMessage() * @see org.eclipse.cdt.core.dom.ast.IProblemBinding#getMessage()

View file

@ -22,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
@ -29,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArrayObjectMap; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
@ -40,6 +42,7 @@ import org.eclipse.cdt.core.parser.util.ObjectSet;
public class CPPClassScope extends CPPScope implements ICPPClassScope { public class CPPClassScope extends CPPScope implements ICPPClassScope {
private ObjectSet constructorBindings = ObjectSet.EMPTY_SET; private ObjectSet constructorBindings = ObjectSet.EMPTY_SET;
private ObjectSet constructorNames = ObjectSet.EMPTY_SET; private ObjectSet constructorNames = ObjectSet.EMPTY_SET;
private ICPPMethod[] implicits = null;
public CPPClassScope( ICPPASTCompositeTypeSpecifier physicalNode ) { public CPPClassScope( ICPPASTCompositeTypeSpecifier physicalNode ) {
super( physicalNode ); super( physicalNode );
@ -69,25 +72,35 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope {
IBinding binding = compTypeSpec.getName().resolveBinding(); IBinding binding = compTypeSpec.getName().resolveBinding();
if( !(binding instanceof ICPPClassType ) ) if( !(binding instanceof ICPPClassType ) )
return; return;
implicits = new ICPPMethod[4];
ICPPClassType clsType = (ICPPClassType) binding; ICPPClassType clsType = (ICPPClassType) binding;
char [] className = name.toCharArray(); char [] className = name.toCharArray();
//default constructor: A() //default constructor: A()
addBinding( new CPPImplicitConstructor( this, className, IParameter.EMPTY_PARAMETER_ARRAY ) ); ICPPMethod m = new CPPImplicitConstructor( this, className, IParameter.EMPTY_PARAMETER_ARRAY );
implicits[0] = m;
addBinding( m );
//copy constructor: A( const A & ) //copy constructor: A( const A & )
IType pType = new CPPReferenceType( new CPPQualifierType( clsType, true, false ) ); IType pType = new CPPReferenceType( new CPPQualifierType( clsType, true, false ) );
IParameter [] ps = new IParameter [] { new CPPParameter( pType ) }; IParameter [] ps = new IParameter [] { new CPPParameter( pType ) };
addBinding( new CPPImplicitConstructor( this, className, ps ) ); m = new CPPImplicitConstructor( this, className, ps );
implicits[1] = m;
addBinding( m );
//copy assignment operator: A& operator = ( const A & ) //copy assignment operator: A& operator = ( const A & )
IType refType = new CPPReferenceType( clsType ); IType refType = new CPPReferenceType( clsType );
addBinding( new CPPImplicitMethod( this, "operator =".toCharArray(), refType, ps ) ); //$NON-NLS-1$ m = new CPPImplicitMethod( this, "operator =".toCharArray(), refType, ps ); //$NON-NLS-1$
implicits[2] = m;
addBinding( m );
//destructor: ~A() //destructor: ~A()
char [] dtorName = CharArrayUtils.concat( "~".toCharArray(), className ); //$NON-NLS-1$ char [] dtorName = CharArrayUtils.concat( "~".toCharArray(), className ); //$NON-NLS-1$
addBinding( new CPPImplicitMethod( this, dtorName, new CPPBasicType( IBasicType.t_unspecified, 0 ), IParameter.EMPTY_PARAMETER_ARRAY ) ); m = new CPPImplicitMethod( this, dtorName, new CPPBasicType( IBasicType.t_unspecified, 0 ), IParameter.EMPTY_PARAMETER_ARRAY );
implicits[3] = m;
addBinding( m );
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -217,4 +230,13 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope {
return (ICPPClassType) compSpec.getName().resolveBinding(); return (ICPPClassType) compSpec.getName().resolveBinding();
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope#getImplicitMethods()
*/
public ICPPMethod[] getImplicitMethods() {
if( implicits == null )
implicits = new ICPPMethod[] { new CPPMethod.CPPMethodProblem( IProblemBinding.SEMANTIC_INVALID_TYPE, CPPSemantics.EMPTY_NAME_ARRAY ) };
return implicits;
}
} }

View file

@ -13,8 +13,6 @@
*/ */
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
@ -36,11 +34,15 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPCompositeBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
@ -63,16 +65,16 @@ public class CPPClassType implements ICPPClassType, ICPPBinding {
public IField[] getFields() throws DOMException { public IField[] getFields() throws DOMException {
throw new DOMException( this ); throw new DOMException( this );
} }
public List getDeclaredFields() throws DOMException { public ICPPField[] getDeclaredFields() throws DOMException {
throw new DOMException( this ); throw new DOMException( this );
} }
public List getMethods() throws DOMException { public ICPPMethod[] getMethods() throws DOMException {
throw new DOMException( this ); throw new DOMException( this );
} }
public List getAllDeclaredMethods() throws DOMException { public ICPPMethod[] getAllDeclaredMethods() throws DOMException {
throw new DOMException( this ); throw new DOMException( this );
} }
public List getDeclaredMethods() throws DOMException { public ICPPMethod[] getDeclaredMethods() throws DOMException {
throw new DOMException( this ); throw new DOMException( this );
} }
public ICPPConstructor[] getConstructors() throws DOMException { public ICPPConstructor[] getConstructors() throws DOMException {
@ -192,41 +194,37 @@ public class CPPClassType implements ICPPClassType, ICPPBinding {
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.ICompositeType#getFields() * @see org.eclipse.cdt.core.dom.ast.ICompositeType#getFields()
*/ */
public IField[] getFields() { public IField[] getFields() throws DOMException {
if( definition == null ){ if( definition == null ){
checkForDefinition(); checkForDefinition();
if( definition == null ) if( definition == null )
return new IField [] { new CPPField.CPPFieldProblem( IProblemBinding.SEMANTIC_DEFINITION_NOT_FOUND, getNameCharArray() ) }; return new IField [] { new CPPField.CPPFieldProblem( IProblemBinding.SEMANTIC_DEFINITION_NOT_FOUND, getNameCharArray() ) };
} }
IASTDeclaration[] members = getCompositeTypeSpecifier().getMembers(); IField[] fields = getDeclaredFields();
int size = members.length; ICPPBase [] bases = getBases();
IField[] fields = null; for ( int i = 0; i < bases.length; i++ ) {
if( size > 0 ){ fields = (IField[]) ArrayUtil.addAll( IField.class, fields, bases[i].getBaseClass().getFields() );
}
for( int i = 0; i < size; i++ ){
IASTNode node = members[i];
if( node instanceof IASTSimpleDeclaration ){
IASTDeclarator[] declarators = ((IASTSimpleDeclaration)node).getDeclarators();
for( int j = 0; j < declarators.length; j++ ){
IASTDeclarator declarator = declarators[i];
IBinding binding = declarator.getName().resolveBinding();
if( binding != null && binding instanceof IField )
fields = (IField[]) ArrayUtil.append( IField.class, fields, binding );
}
}
}
}
return (IField[]) ArrayUtil.trim( IField.class, fields ); return (IField[]) ArrayUtil.trim( IField.class, fields );
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.ICompositeType#findField(java.lang.String) * @see org.eclipse.cdt.core.dom.ast.ICompositeType#findField(java.lang.String)
*/ */
public IField findField(String name) { public IField findField(String name) throws DOMException {
// TODO Auto-generated method stub IBinding [] bindings = CPPSemantics.findBindings( getCompositeScope(), name, true );
return null; IField field = null;
for ( int i = 0; i < bindings.length; i++ ) {
if( bindings[i] instanceof IField ){
if( field == null )
field = (IField) bindings[i];
else {
return new CPPField.CPPFieldProblem( IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, name.toCharArray() );
}
}
}
return field;
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -337,33 +335,120 @@ public class CPPClassType implements ICPPClassType, ICPPBinding {
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getDeclaredFields() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getDeclaredFields()
*/ */
public List getDeclaredFields() { public ICPPField[] getDeclaredFields() throws DOMException {
// TODO Auto-generated method stub if( definition == null ){
return null; checkForDefinition();
if( definition == null ){
return new ICPPField[] { new CPPField.CPPFieldProblem( IProblemBinding.SEMANTIC_DEFINITION_NOT_FOUND, getNameCharArray() ) };
}
}
IBinding binding = null;
ICPPField [] result = null;
IASTDeclaration [] decls = getCompositeTypeSpecifier().getMembers();
for ( int i = 0; i < decls.length; i++ ) {
if( decls[i] instanceof IASTSimpleDeclaration ){
IASTDeclarator [] dtors = ((IASTSimpleDeclaration)decls[i]).getDeclarators();
for ( int j = 0; j < dtors.length; j++ ) {
binding = dtors[j].getName().resolveBinding();
if( binding instanceof ICPPField )
result = (ICPPField[]) ArrayUtil.append( ICPPField.class, result, binding );
}
} else if( decls[i] instanceof ICPPASTUsingDeclaration ){
IASTName n = ((ICPPASTUsingDeclaration)decls[i]).getName();
binding = n.resolveBinding();
if( binding instanceof ICPPCompositeBinding ){
IBinding [] bs = ((ICPPCompositeBinding)binding).getBindings();
for ( int j = 0; j < bs.length; j++ ) {
if( bs[j] instanceof ICPPField )
result = (ICPPField[]) ArrayUtil.append( ICPPField.class, result, bs[j] );
}
} else if( binding instanceof ICPPField ) {
result = (ICPPField[]) ArrayUtil.append( ICPPField.class, result, binding );
}
}
}
return (ICPPField[]) ArrayUtil.trim( ICPPField.class, result );
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getMethods() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getMethods()
*/ */
public List getMethods() { public ICPPMethod[] getMethods() throws DOMException {
// TODO Auto-generated method stub ObjectSet set = new ObjectSet(2);
return null; ICPPMethod [] ms = getDeclaredMethods();
set.addAll( ms );
ICPPClassScope scope = (ICPPClassScope) getCompositeScope();
set.addAll( scope.getImplicitMethods() );
ICPPBase [] bases = getBases();
for ( int i = 0; i < bases.length; i++ ) {
set.addAll( bases[i].getBaseClass().getMethods() );
}
return (ICPPMethod[]) ArrayUtil.trim( ICPPMethod.class, set.keyArray(), true );
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getAllDeclaredMethods() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getAllDeclaredMethods()
*/ */
public List getAllDeclaredMethods() { public ICPPMethod[] getAllDeclaredMethods() throws DOMException {
// TODO Auto-generated method stub if( definition == null ){
return null; checkForDefinition();
if( definition == null )
return new ICPPMethod [] { new CPPMethod.CPPMethodProblem( IProblemBinding.SEMANTIC_DEFINITION_NOT_FOUND, getNameCharArray() ) };
}
ICPPMethod[] methods = getDeclaredMethods();
ICPPBase [] bases = getBases();
for ( int i = 0; i < bases.length; i++ ) {
methods = (ICPPMethod[]) ArrayUtil.addAll( ICPPMethod.class, methods, bases[i].getBaseClass().getAllDeclaredMethods() );
}
return (ICPPMethod[]) ArrayUtil.trim( ICPPMethod.class, methods );
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getDeclaredMethods() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getDeclaredMethods()
*/ */
public List getDeclaredMethods() { public ICPPMethod[] getDeclaredMethods() throws DOMException {
// TODO Auto-generated method stub if( definition == null ){
return null; checkForDefinition();
if( definition == null ){
return new ICPPMethod[] { new CPPMethod.CPPMethodProblem( IProblemBinding.SEMANTIC_DEFINITION_NOT_FOUND, getNameCharArray() ) };
}
}
IBinding binding = null;
ICPPMethod [] result = null;
IASTDeclaration [] decls = getCompositeTypeSpecifier().getMembers();
for ( int i = 0; i < decls.length; i++ ) {
if( decls[i] instanceof IASTSimpleDeclaration ){
IASTDeclarator [] dtors = ((IASTSimpleDeclaration)decls[i]).getDeclarators();
for ( int j = 0; j < dtors.length; j++ ) {
binding = dtors[j].getName().resolveBinding();
if( binding instanceof ICPPMethod)
result = (ICPPMethod[]) ArrayUtil.append( ICPPMethod.class, result, binding );
}
} else if( decls[i] instanceof IASTFunctionDefinition ){
IASTDeclarator dtor = ((IASTFunctionDefinition)decls[i]).getDeclarator();
dtor = CPPVisitor.getMostNestedDeclarator( dtor );
binding = dtor.getName().resolveBinding();
if( binding instanceof ICPPMethod ){
result = (ICPPMethod[]) ArrayUtil.append( ICPPMethod.class, result, binding );
}
} else if( decls[i] instanceof ICPPASTUsingDeclaration ){
IASTName n = ((ICPPASTUsingDeclaration)decls[i]).getName();
binding = n.resolveBinding();
if( binding instanceof ICPPCompositeBinding ){
IBinding [] bs = ((ICPPCompositeBinding)binding).getBindings();
for ( int j = 0; j < bs.length; j++ ) {
if( bs[j] instanceof ICPPMethod )
result = (ICPPMethod[]) ArrayUtil.append( ICPPMethod.class, result, bs[j] );
}
} else if( binding instanceof ICPPMethod ) {
result = (ICPPMethod[]) ArrayUtil.append( ICPPMethod.class, result, binding );
}
}
}
return (ICPPMethod[]) ArrayUtil.trim( ICPPMethod.class, result );
} }
public Object clone(){ public Object clone(){

View file

@ -14,8 +14,12 @@
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.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
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.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ILabel; import org.eclipse.cdt.core.dom.ast.ILabel;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
@ -92,4 +96,19 @@ public class CPPFunctionScope extends CPPScope implements ICPPFunctionScope {
return CPPVisitor.getContainingScope( fdtor ); return CPPVisitor.getContainingScope( fdtor );
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionScope#getBodyScope()
*/
public IScope getBodyScope() throws DOMException {
IASTFunctionDeclarator fnDtor = (IASTFunctionDeclarator) getPhysicalNode();
IASTNode parent = fnDtor.getParent();
if( parent instanceof IASTFunctionDefinition ){
IASTStatement body = ((IASTFunctionDefinition)parent).getBody();
if( body instanceof IASTCompoundStatement )
return ((IASTCompoundStatement)body).getScope();
}
return null;
}
} }

View file

@ -159,6 +159,6 @@ abstract public class CPPScope implements ICPPScope{
* @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String)
*/ */
public IBinding[] find(String name) throws DOMException { public IBinding[] find(String name) throws DOMException {
return CPPSemantics.findBindings( this, name ); return CPPSemantics.findBindings( this, name, false );
} }
} }

View file

@ -2275,13 +2275,14 @@ public class CPPSemantics {
return -1; return -1;
} }
public static IBinding[] findBindings( IScope scope, String name ) throws DOMException{ public static IBinding[] findBindings( IScope scope, String name, boolean qualified ) throws DOMException{
CPPASTName astName = new CPPASTName(); CPPASTName astName = new CPPASTName();
astName.setName( name.toCharArray() ); astName.setName( name.toCharArray() );
astName.setParent( scope.getPhysicalNode() ); astName.setParent( scope.getPhysicalNode() );
astName.setPropertyInParent( STRING_LOOKUP_PROPERTY ); astName.setPropertyInParent( STRING_LOOKUP_PROPERTY );
LookupData data = new LookupData( astName ); LookupData data = new LookupData( astName );
data.forceQualified = qualified;
try { try {
lookup( data, scope ); lookup( data, scope );

View file

@ -1410,6 +1410,15 @@ public class CPPVisitor {
return null; return null;
} }
public static IASTDeclarator getMostNestedDeclarator( IASTDeclarator dtor ){
if( dtor == null ) return null;
IASTDeclarator nested = null;
while( (nested = dtor.getNestedDeclarator()) != null ){
dtor = nested;
}
return dtor;
}
public static IASTProblem[] getProblems(IASTTranslationUnit tu) { public static IASTProblem[] getProblems(IASTTranslationUnit tu) {
CollectProblemsAction action = new CollectProblemsAction(); CollectProblemsAction action = new CollectProblemsAction();
tu.accept(action); tu.accept(action);

View file

@ -76,3 +76,7 @@ ASTProblemFactory.error.semantic.pst.invalidTemplateArgument=Invalid template ar
ASTProblemFactory.error.semantic.pst.invalidTemplateParameter=Invalid template parameter: {0} ASTProblemFactory.error.semantic.pst.invalidTemplateParameter=Invalid template parameter: {0}
ASTProblemFactory.error.semantic.pst.redeclaredTemplateParameter=Redeclaration of template parameter: {0} ASTProblemFactory.error.semantic.pst.redeclaredTemplateParameter=Redeclaration of template parameter: {0}
ASTProblemFactory.error.semantic.pst.recursiveTemplateInstantiation=Possible infinite recursive loop encountered while instantiating {0} ASTProblemFactory.error.semantic.pst.recursiveTemplateInstantiation=Possible infinite recursive loop encountered while instantiating {0}
ASTProblemFactory.error.semantic.dom.definitionNotFound=A definition was not found for {0}
ASTProblemFactory.error.semantic.dom.knrParameterDeclarationNotFound=A declaration was not found for the k&r parameter {0}
ASTProblemFactory.error.semantic.dom.labelStatementNotFound=A label statement was not found for the name {0}