Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergey Prigogin2013-08-24 04:44:21 +0000
committerSergey Prigogin2013-08-24 04:52:01 +0000
commit4bf5b9a3d8d5dd447c7f14f46b81484dd1208544 (patch)
tree0dfa778b3296a81995c8766a794890ea35715497
parent17336298b327c20f9cbceb71ed2da005f1631ef8 (diff)
downloadorg.eclipse.cdt-4bf5b9a3d8d5dd447c7f14f46b81484dd1208544.tar.gz
org.eclipse.cdt-4bf5b9a3d8d5dd447c7f14f46b81484dd1208544.tar.xz
org.eclipse.cdt-4bf5b9a3d8d5dd447c7f14f46b81484dd1208544.zip
Bug 415808 - Organize Includes command doesn't add includes for template
arguments
-rw-r--r--core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/includes/BindingClassifierTest.java4
-rw-r--r--core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/includes/IncludeOrganizerTest.java3
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/includes/BindingClassifier.java28
3 files changed, 25 insertions, 10 deletions
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/includes/BindingClassifierTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/includes/BindingClassifierTest.java
index 9f1ee71eea1..4442c29f66f 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/includes/BindingClassifierTest.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/includes/BindingClassifierTest.java
@@ -347,8 +347,8 @@ public class BindingClassifierTest extends OneSourceMultipleHeadersTestCase {
// struct D : public C<A> {};
public void testTemplate_1() throws Exception {
- assertDefined("C");
- assertDeclared("A");
+ assertDefined("A", "C");
+ assertDeclared();
}
// struct A {};
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/includes/IncludeOrganizerTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/includes/IncludeOrganizerTest.java
index b5dea2c41c7..60f456fc59e 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/includes/IncludeOrganizerTest.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/refactoring/includes/IncludeOrganizerTest.java
@@ -168,8 +168,7 @@ public class IncludeOrganizerTest extends IncludesTestBase {
//#pragma once
//
//#include "B.h"
- //
- //class C;
+ //#include "C.h"
//
//namespace ns {
//// Comment line 1
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/includes/BindingClassifier.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/includes/BindingClassifier.java
index 6e9dba71aba..444fdfebcf5 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/includes/BindingClassifier.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/includes/BindingClassifier.java
@@ -82,6 +82,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTypeId;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumeration;
@@ -103,6 +105,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunction;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.Conversions;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.LookupData;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil;
@@ -1114,13 +1117,18 @@ public class BindingClassifier {
IBinding binding = name.resolveBinding();
if (binding != null) {
- IBinding owner = binding.getOwner();
- if (owner instanceof IType) {
- defineBinding(owner); // Member access requires definition of the containing type.
- if (binding instanceof IProblemBinding)
- declareBinding(binding);
+ if (isInTemplateArgument(name)) {
+ // The name is part of a template argument - define the corresponding binding.
+ defineBinding(binding);
} else {
- declareBinding(binding); // Declare the binding of this name.
+ IBinding owner = binding.getOwner();
+ if (owner instanceof IType) {
+ defineBinding(owner); // Member access requires definition of the containing type.
+ if (binding instanceof IProblemBinding)
+ declareBinding(binding);
+ } else {
+ declareBinding(binding); // Declare the binding of this name.
+ }
}
}
return PROCESS_CONTINUE;
@@ -1155,6 +1163,14 @@ public class BindingClassifier {
return null;
}
+ /**
+ * Checks if the given name is part of a template argument.
+ */
+ public boolean isInTemplateArgument(IASTName name) {
+ ICPPASTTypeId typeId = CPPVisitor.findAncestorWithType(name, ICPPASTTypeId.class);
+ return typeId != null && typeId.getPropertyInParent() == ICPPASTTemplateId.TEMPLATE_ID_ARGUMENT;
+ }
+
private static boolean isEnumerationWithoutFixedUnderlyingType(IBinding typeBinding) {
return typeBinding instanceof IEnumeration
&& (!(typeBinding instanceof ICPPEnumeration) || ((ICPPEnumeration) typeBinding).getFixedType() == null);

Back to the top