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;