diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index a697bb57fce..c35e7839d78 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -241,6 +241,8 @@ public class AST2Tests extends AST2BaseTest { assertEquals(IASTDeclSpecifier.sc_typedef, type.getStorageClass()); // this an anonymous struct IASTName name_struct = type.getName(); + assertTrue( name_struct.isDeclaration() ); + assertFalse( name_struct.isReference() ); assertNull("", name_struct.toString()); //$NON-NLS-1$ // member - x IASTSimpleDeclaration decl_x = (IASTSimpleDeclaration) type @@ -1707,6 +1709,7 @@ public class AST2Tests extends AST2BaseTest { .getDeclSpecifier(); ICompositeType A = (ICompositeType) elabSpec.getName().resolveBinding(); IASTName name_A1 = elabSpec.getName(); + assertTrue( name_A1.isDeclaration() ); decl = (IASTSimpleDeclaration) tu.getDeclarations()[1]; IFunction f = (IFunction) decl.getDeclarators()[0].getName() diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTCompositeTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTCompositeTypeSpecifier.java index 647ae3d7315..0975461053c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTCompositeTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTCompositeTypeSpecifier.java @@ -16,7 +16,7 @@ package org.eclipse.cdt.core.dom.ast; * * @author Doug Schaefer */ -public interface IASTCompositeTypeSpecifier extends IASTDeclSpecifier { +public interface IASTCompositeTypeSpecifier extends IASTDeclSpecifier , IASTNameOwner { /** * TYPE_NAME represents the relationship between an diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTDeclarator.java index a0ae526d75e..fdb0121e51e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTDeclarator.java @@ -15,7 +15,7 @@ package org.eclipse.cdt.core.dom.ast; * * @author Doug Schaefer */ -public interface IASTDeclarator extends IASTNode { +public interface IASTDeclarator extends IASTNode, IASTNameOwner { /** * Constant - empty declarator array diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTElaboratedTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTElaboratedTypeSpecifier.java index 397f64ee5f2..14912ad34ee 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTElaboratedTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTElaboratedTypeSpecifier.java @@ -14,7 +14,7 @@ package org.eclipse.cdt.core.dom.ast; * * @author jcamelon */ -public interface IASTElaboratedTypeSpecifier extends IASTDeclSpecifier { +public interface IASTElaboratedTypeSpecifier extends IASTDeclSpecifier, IASTNameOwner { /** * Enumeration. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTEnumerationSpecifier.java index 234607ab19d..7de836cf0bf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTEnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTEnumerationSpecifier.java @@ -14,14 +14,14 @@ package org.eclipse.cdt.core.dom.ast; * * @author jcamelon */ -public interface IASTEnumerationSpecifier extends IASTDeclSpecifier { +public interface IASTEnumerationSpecifier extends IASTDeclSpecifier, IASTNameOwner { /** * This interface represents an enumerator member of an enum specifier. * * @author jcamelon */ - public interface IASTEnumerator extends IASTNode { + public interface IASTEnumerator extends IASTNode, IASTNameOwner { /** * Empty array (constant). */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTFieldReference.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTFieldReference.java index ab8854e661d..93216e6e033 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTFieldReference.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTFieldReference.java @@ -17,7 +17,7 @@ package org.eclipse.cdt.core.dom.ast; * * @author Doug Schaefer */ -public interface IASTFieldReference extends IASTExpression { +public interface IASTFieldReference extends IASTExpression, IASTNameOwner { /** * FIELD_OWNER represents the relationship between a diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTGotoStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTGotoStatement.java index 675057c89e9..3ced79dbb17 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTGotoStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTGotoStatement.java @@ -15,7 +15,7 @@ package org.eclipse.cdt.core.dom.ast; * * @author Doug Schaefer */ -public interface IASTGotoStatement extends IASTStatement { +public interface IASTGotoStatement extends IASTStatement, IASTNameOwner { public static final ASTNodeProperty NAME = new ASTNodeProperty("name"); //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTIdExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTIdExpression.java index eb2912dcadf..8d10e70beef 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTIdExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTIdExpression.java @@ -15,7 +15,7 @@ package org.eclipse.cdt.core.dom.ast; * * @author Doug Schaefer */ -public interface IASTIdExpression extends IASTExpression { +public interface IASTIdExpression extends IASTExpression, IASTNameOwner { /** * ID_NAME represents the relationship between an diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTLabelStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTLabelStatement.java index 9828164b1ff..7304a487e4f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTLabelStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTLabelStatement.java @@ -15,7 +15,7 @@ package org.eclipse.cdt.core.dom.ast; * * @author Doug Schaefer */ -public interface IASTLabelStatement extends IASTStatement { +public interface IASTLabelStatement extends IASTStatement, IASTNameOwner { public static final ASTNodeProperty NAME = new ASTNodeProperty("name"); //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java index eaec685b3e0..e38d71b1724 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java @@ -47,4 +47,16 @@ public interface IASTName extends IASTNode { * @return ~ toString().toCharArray() */ public char[] toCharArray(); + + /** + * Is this name being used in the AST as the introduction of a declaration? + * @return boolean + */ + public boolean isDeclaration(); + + /** + * Is this name being used in the AST as a reference rather than a declaration? + * @return + */ + public boolean isReference(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNameOwner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNameOwner.java new file mode 100644 index 00000000000..b6f9de1c996 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNameOwner.java @@ -0,0 +1,32 @@ +package org.eclipse.cdt.core.dom.ast; + +/** + * This interface repesents a mechanism for a name to discover more information about it's parent. + * All interfaces that claim ownership/residence of a name should extend this interface. + * + * @author jcamelon + */ +public interface IASTNameOwner { + + /** + * Role of name in this context is a declaration. + */ + public static final int r_declaration = 0; + /** + * Role of name in this construct is a reference. + */ + public static final int r_reference = 1; + /** + * Role is unclear. + */ + public static final int r_unclear = 2; + + /** + * Get the role for the name. + * + * @param name IASTName + * @return r_declaration, r_reference or r_unclear. + */ + public int getRoleForName( IASTName n ); + +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNamedTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNamedTypeSpecifier.java index 6edc9090447..3ab51c38e53 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNamedTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTNamedTypeSpecifier.java @@ -16,7 +16,7 @@ package org.eclipse.cdt.core.dom.ast; * * @author Doug Schaefer */ -public interface IASTNamedTypeSpecifier extends IASTDeclSpecifier { +public interface IASTNamedTypeSpecifier extends IASTDeclSpecifier, IASTNameOwner { /** * NAME describes the relationship between an diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorMacroDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorMacroDefinition.java index c7053c8f88c..655914507f2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorMacroDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorMacroDefinition.java @@ -16,7 +16,7 @@ package org.eclipse.cdt.core.dom.ast; * @author Doug Schaefer */ public interface IASTPreprocessorMacroDefinition extends - IASTPreprocessorStatement { + IASTPreprocessorStatement, IASTNameOwner { /** * MACRO_NAME describes the relationship between a macro diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTCompositeTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTCompositeTypeSpecifier.java index 5c591dc0836..fd381c24050 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTCompositeTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTCompositeTypeSpecifier.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNameOwner; import org.eclipse.cdt.core.dom.ast.IASTNode; /** @@ -50,7 +51,7 @@ public interface ICPPASTCompositeTypeSpecifier extends * * @author jcamelon */ - public static interface ICPPASTBaseSpecifier extends IASTNode { + public static interface ICPPASTBaseSpecifier extends IASTNode, IASTNameOwner { /** * Constant. */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTConstructorChainInitializer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTConstructorChainInitializer.java index c75c6161ba0..2e53ec4eddc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTConstructorChainInitializer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTConstructorChainInitializer.java @@ -13,12 +13,13 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNameOwner; import org.eclipse.cdt.core.dom.ast.IASTNode; /** * @author jcamelon */ -public interface ICPPASTConstructorChainInitializer extends IASTNode { +public interface ICPPASTConstructorChainInitializer extends IASTNode, IASTNameOwner { /** * Constant. */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTNamespaceAlias.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTNamespaceAlias.java index f17c99c19b0..9e6a240c4aa 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTNamespaceAlias.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTNamespaceAlias.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNameOwner; /** * This interface represents a namespace alias in C++. e.g. namespace ABC { int @@ -20,7 +21,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName; * * @author jcamelon */ -public interface ICPPASTNamespaceAlias extends IASTDeclaration { +public interface ICPPASTNamespaceAlias extends IASTDeclaration, IASTNameOwner { /** * ALIAS_NAME represents the new namespace name being diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTNamespaceDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTNamespaceDefinition.java index b9f67547606..be1a0c79f64 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTNamespaceDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTNamespaceDefinition.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNameOwner; import org.eclipse.cdt.core.dom.ast.IScope; /** @@ -20,7 +21,7 @@ import org.eclipse.cdt.core.dom.ast.IScope; * * @author jcamelon */ -public interface ICPPASTNamespaceDefinition extends IASTDeclaration { +public interface ICPPASTNamespaceDefinition extends IASTDeclaration, IASTNameOwner { /** * OWNED_DECLARATION is the role served by all the nested diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTPointerToMember.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTPointerToMember.java index 87f1e89285c..0966fba8623 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTPointerToMember.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTPointerToMember.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNameOwner; import org.eclipse.cdt.core.dom.ast.IASTPointer; /** @@ -19,7 +20,7 @@ import org.eclipse.cdt.core.dom.ast.IASTPointer; * * @author Doug Schaefer */ -public interface ICPPASTPointerToMember extends IASTPointer { +public interface ICPPASTPointerToMember extends IASTPointer, IASTNameOwner { /** * This property refers to the nested name. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTQualifiedName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTQualifiedName.java index c9edefe5227..83c48ad1027 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTQualifiedName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTQualifiedName.java @@ -12,13 +12,14 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNameOwner; /** * This interface is a qualified name in C++. * * @author jcamelon */ -public interface ICPPASTQualifiedName extends IASTName { +public interface ICPPASTQualifiedName extends IASTName, IASTNameOwner { /** * Each IASTName segment has property being SEGMENT_NAME. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTSimpleTypeTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTSimpleTypeTemplateParameter.java index 877d3e07eac..0b57725be7c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTSimpleTypeTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTSimpleTypeTemplateParameter.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNameOwner; import org.eclipse.cdt.core.dom.ast.IASTTypeId; /** @@ -20,7 +21,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeId; * @author jcamelon */ public interface ICPPASTSimpleTypeTemplateParameter extends - ICPPASTTemplateParameter { + ICPPASTTemplateParameter, IASTNameOwner { /** * st_class represents a class. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTTemplateId.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTTemplateId.java index 0fc65f0e297..4bcdf2b7449 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTTemplateId.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTTemplateId.java @@ -13,13 +13,14 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTExpression; 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.IASTTypeId; /** * @author jcamelon */ -public interface ICPPASTTemplateId extends IASTName { +public interface ICPPASTTemplateId extends IASTName, IASTNameOwner { /** * TEMPLATE_NAME is the IASTName. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTTemplatedTypeTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTTemplatedTypeTemplateParameter.java index 36f2918830c..4baf7781f7f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTTemplatedTypeTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTTemplatedTypeTemplateParameter.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNameOwner; /** * This is a templated template parameter. @@ -20,7 +21,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName; * @author jcamelon */ public interface ICPPASTTemplatedTypeTemplateParameter extends - ICPPASTTemplateParameter { + ICPPASTTemplateParameter, IASTNameOwner { /** * PARAMETER diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTTypenameExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTTypenameExpression.java index 4c2f055d2f0..7ff1bc8bf07 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTTypenameExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTTypenameExpression.java @@ -13,11 +13,12 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNameOwner; /** * @author jcamelon */ -public interface ICPPASTTypenameExpression extends IASTExpression { +public interface ICPPASTTypenameExpression extends IASTExpression, IASTNameOwner { /** * Was template token consumed? diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTUsingDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTUsingDeclaration.java index 75b736679eb..89eb2491000 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTUsingDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTUsingDeclaration.java @@ -13,13 +13,14 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNameOwner; /** * This interface represents a using declaration. * * @author jcamelon */ -public interface ICPPASTUsingDeclaration extends IASTDeclaration { +public interface ICPPASTUsingDeclaration extends IASTDeclaration, IASTNameOwner { /** * NAME is the qualified name brought into scope. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTUsingDirective.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTUsingDirective.java index e6a3cf3eb8a..eacedc2bf88 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTUsingDirective.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTUsingDirective.java @@ -13,13 +13,14 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNameOwner; /** * This interface represents a C++ using directive. * * @author jcamelon */ -public interface ICPPASTUsingDirective extends IASTDeclaration { +public interface ICPPASTUsingDirective extends IASTDeclaration, IASTNameOwner { /** * Constant. */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/ICASTKnRFunctionDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/ICASTKnRFunctionDeclarator.java index b03a51cb7d9..969bac750e8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/ICASTKnRFunctionDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/ICASTKnRFunctionDeclarator.java @@ -15,13 +15,14 @@ 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.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNameOwner; /** * This is the declarator for a K&R C Function. * * @author dsteffle */ -public interface ICASTKnRFunctionDeclarator extends IASTFunctionDeclarator { +public interface ICASTKnRFunctionDeclarator extends IASTFunctionDeclarator, IASTNameOwner { /** * PARAMETER_NAME refers to the names qualified in a K&R C diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTCompositeTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTCompositeTypeSpecifier.java index c3911fecde9..0339244acc8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTCompositeTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTCompositeTypeSpecifier.java @@ -135,4 +135,13 @@ public class CASTCompositeTypeSpecifier extends CASTBaseDeclSpecifier implements return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName name) { + if( name == this.name ) + return r_declaration; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDeclarator.java index 9caff255089..cfb63acf738 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTDeclarator.java @@ -10,9 +10,11 @@ package org.eclipse.cdt.internal.core.dom.parser.c; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; 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.IASTPointerOperator; import org.eclipse.cdt.core.dom.ast.IASTTypeId; @@ -140,4 +142,29 @@ public class CASTDeclarator extends CASTNode implements IASTDeclarator { if( initializer != null ) if( !initializer.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName name) { + if( name == this.name ) + { + IASTNode getParent = getParent(); + if( getParent instanceof IASTDeclaration ) + return r_declaration; + 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 ) + return r_declaration; + if( t instanceof IASTTypeId ) + return r_reference; + } + } + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTElaboratedTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTElaboratedTypeSpecifier.java index 7ae6a3c152a..9c645804e93 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTElaboratedTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTElaboratedTypeSpecifier.java @@ -61,4 +61,13 @@ public class CASTElaboratedTypeSpecifier extends CASTBaseDeclSpecifier implement if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName name) { + if( this.name == name ) + return r_declaration; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerationSpecifier.java index 53b967041eb..433c6eaed93 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerationSpecifier.java @@ -104,4 +104,13 @@ public class CASTEnumerationSpecifier extends CASTBaseDeclSpecifier implements return true; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName name) { + if( this.name == name ) + return r_declaration; + return r_unclear; + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerator.java index 701c76b3bdf..6a8ec2816c8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerator.java @@ -63,4 +63,12 @@ public class CASTEnumerator extends CASTNode implements IASTEnumerator { return true; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name )return r_declaration; + return r_unclear; + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFieldReference.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFieldReference.java index 2fa97e16917..eaf6f2c06c5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFieldReference.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFieldReference.java @@ -78,4 +78,13 @@ public class CASTFieldReference extends CASTNode implements IASTFieldReference { if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName name) { + if( name == this.name ) + return r_reference; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTGotoStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTGotoStatement.java index bf2f270e260..ace7c8944b6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTGotoStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTGotoStatement.java @@ -45,4 +45,12 @@ public class CASTGotoStatement extends CASTNode implements IASTGotoStatement { if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) return r_reference; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTIdExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTIdExpression.java index 5b57aa52dd2..b834b80e908 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTIdExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTIdExpression.java @@ -46,4 +46,12 @@ public class CASTIdExpression extends CASTNode implements IASTIdExpression { if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) return r_reference; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTKnRFunctionDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTKnRFunctionDeclarator.java index 54494f14293..5841fdf2fce 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTKnRFunctionDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTKnRFunctionDeclarator.java @@ -91,4 +91,14 @@ public class CASTKnRFunctionDeclarator extends CASTDeclarator implements ICASTKn return null; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.c.CASTDeclarator#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName name) { + IASTName [] n = getParameterNames(); + for( int i = 0; i < n.length; ++i ) + if( n[i] == name ) return r_unclear; + return super.getRoleForName(name); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTLabelStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTLabelStatement.java index 3fa5add9d30..84883b21f80 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTLabelStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTLabelStatement.java @@ -45,4 +45,12 @@ public class CASTLabelStatement extends CASTNode implements IASTLabelStatement { if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) return r_declaration; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java index e1513a5529d..5b2d4e6d101 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java @@ -11,6 +11,8 @@ package org.eclipse.cdt.internal.core.dom.parser.c; import org.eclipse.cdt.core.dom.ast.ASTVisitor; 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.IBinding; /** @@ -82,4 +84,30 @@ public class CASTName extends CASTNode implements IASTName { 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() + */ + public boolean isReference() { + IASTNode parent = getParent(); + if (parent instanceof IASTNameOwner) { + int role = ((IASTNameOwner) parent).getRoleForName(this); + if( role == IASTNameOwner.r_reference ) return true; + return false; + } + return false; + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTypedefNameSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTypedefNameSpecifier.java index c494fd6a597..7760c980bc1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTypedefNameSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTypedefNameSpecifier.java @@ -46,4 +46,12 @@ public class CASTTypedefNameSpecifier extends CASTBaseDeclSpecifier implements return true; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) return r_reference; + return r_unclear; + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java index 140a1beb775..e439c998728 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java @@ -81,4 +81,12 @@ public class CPPASTBaseSpecifier extends CPPASTNode implements return true; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( name == n ) return r_reference; + return r_unclear; + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCompositeTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCompositeTypeSpecifier.java index fda2fcf517f..c9b6df7d940 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCompositeTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCompositeTypeSpecifier.java @@ -186,4 +186,13 @@ public class CPPASTCompositeTypeSpecifier extends CPPASTBaseDeclSpecifier return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName name) { + if( name == this.n ) + return r_declaration; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTConstructorChainInitializer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTConstructorChainInitializer.java index f5bfb398fd4..20155fb37df 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTConstructorChainInitializer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTConstructorChainInitializer.java @@ -57,4 +57,12 @@ public class CPPASTConstructorChainInitializer extends CPPASTNode implements if( value != null ) if( !value.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( name == n ) return r_reference; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeclarator.java index 0e234f4ae9a..4175c83a26e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeclarator.java @@ -141,4 +141,16 @@ public class CPPASTDeclarator extends CPPASTNode implements IASTDeclarator { if( initializer != null ) if( !initializer.accept( action ) ) return false; return true; } + + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( name == n ) + { + + } + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTElaboratedTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTElaboratedTypeSpecifier.java index bd21298aea0..eb525779a5c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTElaboratedTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTElaboratedTypeSpecifier.java @@ -62,4 +62,12 @@ public class CPPASTElaboratedTypeSpecifier extends CPPASTBaseDeclSpecifier if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) return r_reference; //TODO is this right? + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java index c787a0e2089..d08d5d6de1e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java @@ -19,90 +19,119 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier; * @author jcamelon */ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier - implements IASTEnumerationSpecifier, ICPPASTDeclSpecifier { + implements IASTEnumerationSpecifier, ICPPASTDeclSpecifier { - private IASTName name; + private IASTName name; - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier#addEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator) - */ - public void addEnumerator(IASTEnumerator enumerator) { - if( enumerators == null ) - { - enumerators = new IASTEnumerator[ DEFAULT_ENUMERATORS_LIST_SIZE ]; - currentIndex = 0; - } - if( enumerators.length == currentIndex ) - { - IASTEnumerator [] old = enumerators; - enumerators = new IASTEnumerator[ old.length * 2 ]; - for( int i = 0; i < old.length; ++i ) - enumerators[i] = old[i]; - } - enumerators[ currentIndex++ ] = enumerator; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier#getEnumerators() - */ - public IASTEnumerator[] getEnumerators() { - if( enumerators == null ) return IASTEnumerator.EMPTY_ENUMERATOR_ARRAY; - removeNullEnumerators(); - return enumerators; - } - - private void removeNullEnumerators() { - int nullCount = 0; - for( int i = 0; i < enumerators.length; ++i ) - if( enumerators[i] == null ) - ++nullCount; - if( nullCount == 0 ) return; - IASTEnumerator [] old = enumerators; - int newSize = old.length - nullCount; - enumerators = new IASTEnumerator[ newSize ]; - for( int i = 0; i < newSize; ++i ) - enumerators[i] = old[i]; - currentIndex = newSize; - } - - private int currentIndex = 0; - private IASTEnumerator [] enumerators = null; - private static final int DEFAULT_ENUMERATORS_LIST_SIZE = 4; - - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier#setName(org.eclipse.cdt.core.dom.ast.IASTName) - */ - public void setName(IASTName name) { - this.name = name; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier#getName() - */ - public IASTName getName() { - return name; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier#getUnpreprocessedSignature() - */ - public String getUnpreprocessedSignature() { - return getName().toString() == null ? "" : getName().toString(); //$NON-NLS-1$ - } - - public boolean accept( ASTVisitor action ){ - if( action.shouldVisitDeclSpecifiers ){ - switch( action.visit( this ) ){ - case ASTVisitor.PROCESS_ABORT : return false; - case ASTVisitor.PROCESS_SKIP : return true; - default : break; - } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier#addEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator) + */ + public void addEnumerator(IASTEnumerator enumerator) { + if (enumerators == null) { + enumerators = new IASTEnumerator[DEFAULT_ENUMERATORS_LIST_SIZE]; + currentIndex = 0; } - if( name != null ) if( !name.accept( action ) ) return false; - IASTEnumerator[] enums = getEnumerators(); - for( int i = 0; i < enums.length; i++ ) - if( !enums[i].accept( action ) ) return false; - - return true; - } + if (enumerators.length == currentIndex) { + IASTEnumerator[] old = enumerators; + enumerators = new IASTEnumerator[old.length * 2]; + for (int i = 0; i < old.length; ++i) + enumerators[i] = old[i]; + } + enumerators[currentIndex++] = enumerator; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier#getEnumerators() + */ + public IASTEnumerator[] getEnumerators() { + if (enumerators == null) + return IASTEnumerator.EMPTY_ENUMERATOR_ARRAY; + removeNullEnumerators(); + return enumerators; + } + + private void removeNullEnumerators() { + int nullCount = 0; + for (int i = 0; i < enumerators.length; ++i) + if (enumerators[i] == null) + ++nullCount; + if (nullCount == 0) + return; + IASTEnumerator[] old = enumerators; + int newSize = old.length - nullCount; + enumerators = new IASTEnumerator[newSize]; + for (int i = 0; i < newSize; ++i) + enumerators[i] = old[i]; + currentIndex = newSize; + } + + private int currentIndex = 0; + + private IASTEnumerator[] enumerators = null; + + private static final int DEFAULT_ENUMERATORS_LIST_SIZE = 4; + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier#setName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public void setName(IASTName name) { + this.name = name; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier#getName() + */ + public IASTName getName() { + return name; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier#getUnpreprocessedSignature() + */ + public String getUnpreprocessedSignature() { + return getName().toString() == null ? "" : getName().toString(); //$NON-NLS-1$ + } + + public boolean accept(ASTVisitor action) { + if (action.shouldVisitDeclSpecifiers) { + switch (action.visit(this)) { + case ASTVisitor.PROCESS_ABORT: + return false; + case ASTVisitor.PROCESS_SKIP: + return true; + default: + break; + } + } + if (name != null) + if (!name.accept(action)) + return false; + IASTEnumerator[] enums = getEnumerators(); + for (int i = 0; i < enums.length; i++) + if (!enums[i].accept(action)) + return false; + + return true; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if (name == n) + return r_declaration; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerator.java index b3d1b906a88..6c4754c64bb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerator.java @@ -62,4 +62,13 @@ public class CPPASTEnumerator extends CPPASTNode implements IASTEnumerator { if( value != null ) if( !value.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( name == n ) + return r_declaration; + return r_reference; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java index fb097c062b8..c309ce26a8a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java @@ -96,5 +96,14 @@ public class CPPASTFieldReference extends CPPASTNode implements return true; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) + return r_reference; + return r_unclear; + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTGotoStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTGotoStatement.java index f12bc7683f4..f443b869e9d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTGotoStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTGotoStatement.java @@ -46,4 +46,12 @@ public class CPPASTGotoStatement extends CPPASTNode implements if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( name == n ) return r_reference; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIdExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIdExpression.java index b64dc2aa78c..a45c63c733b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIdExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIdExpression.java @@ -46,4 +46,12 @@ public class CPPASTIdExpression extends CPPASTNode implements IASTIdExpression { if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( name == n )return r_reference; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLabelStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLabelStatement.java index 0f48c1481d1..8add8118424 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLabelStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLabelStatement.java @@ -46,4 +46,12 @@ public class CPPASTLabelStatement extends CPPASTNode implements if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) return r_declaration; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java index 05ead751ebe..9c4e017c044 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java @@ -12,6 +12,8 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.ASTVisitor; 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.IBinding; /** @@ -85,4 +87,30 @@ public class CPPASTName extends CPPASTNode implements IASTName { } 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() + */ + public boolean isReference() { + IASTNode parent = getParent(); + if (parent instanceof IASTNameOwner) { + int role = ((IASTNameOwner) parent).getRoleForName(this); + if( role == IASTNameOwner.r_reference ) return true; + return false; + } + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamedTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamedTypeSpecifier.java index da74b7113bc..d61d3ae6101 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamedTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamedTypeSpecifier.java @@ -62,4 +62,13 @@ public class CPPASTNamedTypeSpecifier extends CPPASTBaseDeclSpecifier implements if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) + return r_reference; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceAlias.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceAlias.java index 92ebc9f189c..b006725f2a7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceAlias.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceAlias.java @@ -65,4 +65,13 @@ public class CPPASTNamespaceAlias extends CPPASTNode implements return true; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( alias == n ) return r_declaration; + if( qualifiedName == n ) return r_reference; + return r_unclear; + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java index ea5d487790b..d94c2b07193 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java @@ -116,4 +116,12 @@ public class CPPASTNamespaceDefinition extends CPPASTNode implements return true; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( name == n ) return r_declaration; + return r_unclear; + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTPointerToMember.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTPointerToMember.java index 5fc24586443..2f9b48b2ba9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTPointerToMember.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTPointerToMember.java @@ -40,4 +40,13 @@ public class CPPASTPointerToMember extends CPPASTPointer implements if( n != null ) if( !n.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName name ) { + if( name == this.n ) + return r_declaration; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java index 2d48f90a619..d012c8b05a1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java @@ -12,6 +12,8 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.ASTVisitor; 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.IBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; @@ -19,171 +21,226 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; * @author jcamelon */ public class CPPASTQualifiedName extends CPPASTNode implements - ICPPASTQualifiedName { + ICPPASTQualifiedName { - /** - * @param duple - */ - public CPPASTQualifiedName() { - } + /** + * @param duple + */ + public CPPASTQualifiedName() { + } - /* - * (non-Javadoc) - * - * @see org.eclipse.cdt.core.dom.ast.IASTName#resolveBinding() - */ - public IBinding resolveBinding() { - //The full qualified name resolves to the same thing as the last name - removeNullNames(); - return names[names.length - 1].resolveBinding(); - } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTName#resolveBinding() + */ + public IBinding resolveBinding() { + // The full qualified name resolves to the same thing as the last name + removeNullNames(); + return names[names.length - 1].resolveBinding(); + } - public IBinding[] resolvePrefix() { - removeNullNames(); - return names[names.length - 1].resolvePrefix(); - } - - /* - * (non-Javadoc) - * - * @see java.lang.Object#toString() - */ - public String toString() { - if( signature == null ) return ""; //$NON-NLS-1$ - return signature; - } + public IBinding[] resolvePrefix() { + removeNullNames(); + return names[names.length - 1].resolvePrefix(); + } - /* - * (non-Javadoc) - * - * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName#addName(org.eclipse.cdt.core.dom.ast.IASTName) - */ - public void addName(IASTName name) { - if (names == null) { - names = new IASTName[DEFAULT_NAMES_LIST_SIZE]; - currentIndex = 0; - } - if (names.length == currentIndex) { - IASTName[] old = names; - names = new IASTName[old.length * 2]; - for (int i = 0; i < old.length; ++i) - names[i] = old[i]; - } - names[currentIndex++] = name; - } + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + public String toString() { + if (signature == null) + return ""; //$NON-NLS-1$ + return signature; + } - /** - * @param decls2 - */ - private void removeNullNames() { - int nullCount = 0; - for (int i = 0; i < names.length; ++i) - if (names[i] == null) - ++nullCount; - if (nullCount == 0) - return; - IASTName[] old = names; - int newSize = old.length - nullCount; - names = new IASTName[newSize]; - for (int i = 0; i < newSize; ++i) - names[i] = old[i]; - currentIndex = newSize; - } - - private int currentIndex = 0; - private IASTName[] names = null; - private static final int DEFAULT_NAMES_LIST_SIZE = 4; - private boolean value; - private String signature; - - /* - * (non-Javadoc) - * - * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName#getNames() - */ - public IASTName[] getNames() { - if (names == null) - return IASTName.EMPTY_NAME_ARRAY; - removeNullNames(); - return names; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.cdt.core.dom.ast.IASTName#toCharArray() - */ - public char[] toCharArray() { - if (names == null) - return "".toCharArray(); //$NON-NLS-1$ - removeNullNames(); - - //count first - int len = 0; - for (int i = 0; i < names.length; ++i) { - char[] n = names[i].toCharArray(); - if (n == null) - return null; - len += n.length; - if (i != names.length - 1) - len += 2; - } - - char[] nameArray = new char[len]; - int pos = 0; - for (int i = 0; i < names.length; i++) { - char[] n = names[i].toCharArray(); - System.arraycopy(n, 0, nameArray, pos, n.length); - pos += n.length; - if (i != names.length - 1) { - nameArray[pos++] = ':'; - nameArray[pos++] = ':'; - } - } - return nameArray; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName#isFullyQualified() - */ - public boolean isFullyQualified() { - return value; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName#setFullyQualified(boolean) - */ - public void setFullyQualified(boolean value) { - this.value = value; - } - - /** - * @param string - */ - public void setValue(String string) { - this.signature = string; - - } - - public boolean accept( ASTVisitor action ){ - if( action.shouldVisitNames ){ - switch( action.visit( this ) ){ - case ASTVisitor.PROCESS_ABORT : return false; - case ASTVisitor.PROCESS_SKIP : return true; - default : break; - } + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName#addName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public void addName(IASTName name) { + if (names == null) { + names = new IASTName[DEFAULT_NAMES_LIST_SIZE]; + currentIndex = 0; } - IASTName [] ns = getNames(); - for ( int i = 0; i < ns.length; i++ ) { - if( i == names.length - 1 ){ - if( names[i].toCharArray().length > 0 && !names[i].accept( action ) ) return false; - } else if( !names[i].accept( action ) ) return false; - } - return true; - } + if (names.length == currentIndex) { + IASTName[] old = names; + names = new IASTName[old.length * 2]; + for (int i = 0; i < old.length; ++i) + names[i] = old[i]; + } + names[currentIndex++] = name; + } + + /** + * @param decls2 + */ + private void removeNullNames() { + int nullCount = 0; + for (int i = 0; i < names.length; ++i) + if (names[i] == null) + ++nullCount; + if (nullCount == 0) + return; + IASTName[] old = names; + int newSize = old.length - nullCount; + names = new IASTName[newSize]; + for (int i = 0; i < newSize; ++i) + names[i] = old[i]; + currentIndex = newSize; + } + + private int currentIndex = 0; + + private IASTName[] names = null; + + private static final int DEFAULT_NAMES_LIST_SIZE = 4; + + private boolean value; + + private String signature; + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName#getNames() + */ + public IASTName[] getNames() { + if (names == null) + return IASTName.EMPTY_NAME_ARRAY; + removeNullNames(); + return names; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.IASTName#toCharArray() + */ + public char[] toCharArray() { + if (names == null) + return "".toCharArray(); //$NON-NLS-1$ + removeNullNames(); + + // count first + int len = 0; + for (int i = 0; i < names.length; ++i) { + char[] n = names[i].toCharArray(); + if (n == null) + return null; + len += n.length; + if (i != names.length - 1) + len += 2; + } + + char[] nameArray = new char[len]; + int pos = 0; + for (int i = 0; i < names.length; i++) { + char[] n = names[i].toCharArray(); + System.arraycopy(n, 0, nameArray, pos, n.length); + pos += n.length; + if (i != names.length - 1) { + nameArray[pos++] = ':'; + nameArray[pos++] = ':'; + } + } + return nameArray; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName#isFullyQualified() + */ + public boolean isFullyQualified() { + return value; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName#setFullyQualified(boolean) + */ + public void setFullyQualified(boolean value) { + this.value = value; + } + + /** + * @param string + */ + public void setValue(String string) { + this.signature = string; + + } + + public boolean accept(ASTVisitor action) { + if (action.shouldVisitNames) { + switch (action.visit(this)) { + case ASTVisitor.PROCESS_ABORT: + return false; + case ASTVisitor.PROCESS_SKIP: + return true; + default: + break; + } + } + IASTName[] ns = getNames(); + for (int i = 0; i < ns.length; i++) { + if (i == names.length - 1) { + if (names[i].toCharArray().length > 0 + && !names[i].accept(action)) + return false; + } else if (!names[i].accept(action)) + return false; + } + 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() + */ + public boolean isReference() { + IASTNode parent = getParent(); + if (parent instanceof IASTNameOwner) { + int role = ((IASTNameOwner) parent).getRoleForName(this); + if( role == IASTNameOwner.r_reference ) return true; + return false; + } + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + IASTName [] namez = getNames(); + for( int i = 0; i < names.length; ++i ) + if( namez[i] == n ) + { + if( i < names.length - 1 ) + return r_reference; + IASTNode p = getParent(); + if( i == names.length - 1 && p instanceof IASTNameOwner ) + return ((IASTNameOwner)p).getRoleForName(this); + return r_unclear; + } + return r_unclear; + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleTypeTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleTypeTemplateParameter.java index 7f925e1877b..070dca41c16 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleTypeTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleTypeTemplateParameter.java @@ -81,4 +81,13 @@ public class CPPASTSimpleTypeTemplateParameter extends CPPASTNode implements if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) + return r_declaration; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java index 9aa3ee8b8a6..3d2a126bd39 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java @@ -145,4 +145,27 @@ public class CPPASTTemplateId extends CPPASTNode implements ICPPASTTemplateId { } return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTName#isDeclaration() + */ + public boolean isDeclaration() { + return false; //for now this seems to be true + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTName#isReference() + */ + public boolean isReference() { + return true; //for now this seems to be true + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == templateName ) + return r_reference; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplatedTypeTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplatedTypeTemplateParameter.java index 9aba5cf5934..7a223a88f68 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplatedTypeTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplatedTypeTemplateParameter.java @@ -110,4 +110,13 @@ public class CPPASTTemplatedTypeTemplateParameter extends CPPASTNode implements if( defaultValue != null ) if( !defaultValue.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) + return r_declaration; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTypenameExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTypenameExpression.java index 0d322fdabc6..6d0ae15d063 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTypenameExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTypenameExpression.java @@ -80,4 +80,13 @@ public class CPPASTTypenameExpression extends CPPASTNode implements if( init != null ) if( !init.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) + return r_reference; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDeclaration.java index 1c5bc44226e..cac78684eef 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDeclaration.java @@ -63,4 +63,13 @@ public class CPPASTUsingDeclaration extends CPPASTNode implements if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) + return r_reference; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDirective.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDirective.java index b2ad37e2af3..5324fc1873f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDirective.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDirective.java @@ -48,4 +48,13 @@ public class CPPASTUsingDirective extends CPPASTNode implements if( name != null ) if( !name.accept( action ) ) return false; return true; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( n == name ) + return r_reference; + return r_unclear; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java index 679962c79f2..6ba1e9eabb8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java @@ -495,6 +495,13 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { public void setExpansion(String exp) { this.expansion = exp; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( name == n ) return r_declaration; + return r_unclear; + } } @@ -617,6 +624,22 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { public String toString() { return new String(name); } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTName#isDeclaration() + */ + public boolean isDeclaration() { + if (getParent() instanceof IASTPreprocessorMacroDefinition && getPropertyInParent() == IASTPreprocessorMacroDefinition.MACRO_NAME ) + return true; + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTName#isReference() + */ + public boolean isReference() { + return !isDeclaration(); + } } /** @@ -626,6 +649,13 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { IASTPreprocessorObjectStyleMacroDefinition { private IASTName name; + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTNameOwner#getRoleForName(org.eclipse.cdt.core.dom.ast.IASTName) + */ + public int getRoleForName(IASTName n) { + if( name == n ) return r_declaration; + return r_unclear; + } private String expansion;