diff options
author | Sergey Prigogin | 2013-08-24 04:44:21 +0000 |
---|---|---|
committer | Sergey Prigogin | 2013-08-24 04:52:01 +0000 |
commit | 4bf5b9a3d8d5dd447c7f14f46b81484dd1208544 (patch) | |
tree | 0dfa778b3296a81995c8766a794890ea35715497 | |
parent | 17336298b327c20f9cbceb71ed2da005f1631ef8 (diff) | |
download | org.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
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); |