From 79cd2757f52647d61ed2c6e743bcc80f8435d2d8 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Thu, 12 Sep 2013 16:04:05 -0700 Subject: [PATCH] Bug 417143 - Organize Includes removes include of the header declaring a variable. --- .../includes/BindingClassifierTest.java | 5 +++-- .../includes/IncludeOrganizerTest.java | 17 +++++++++++++++++ .../refactoring/includes/BindingClassifier.java | 16 +++++++++------- .../refactoring/includes/IncludeOrganizer.java | 9 +++++++-- 4 files changed, 36 insertions(+), 11 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 56ca50d774f..b96ff39abdc 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 @@ -349,7 +349,8 @@ public class BindingClassifierTest extends OneSourceMultipleHeadersTestCase { assertDeclared("B"); } - // int a; + // typedef unsigned int size_t; + // size_t a; // void test() { // void* x = &a; @@ -362,7 +363,7 @@ public class BindingClassifierTest extends OneSourceMultipleHeadersTestCase { // struct A { // void operator()(int p); // }; - // const A& a; + // A a; // void test() { // a(1); 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 9cbef47f08a..8e43052550d 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 @@ -456,6 +456,23 @@ public class IncludeOrganizerTest extends IncludesTestBase { assertExpectedResults(); } + //h1.h + //typedef int int32; + + //h2.h + //#include "h1.h" + //extern int32 var; + + //source.cpp + //int a = var; + //==================== + //#include "h2.h" + // + //int a = var; + public void testVariableReference() throws Exception { + assertExpectedResults(); + } + //h1.h //namespace ns3 { //class C {}; 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 88a53084615..6a7087fdf21 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 @@ -314,8 +314,6 @@ public class BindingClassifier { } else { bindings.add(binding); } - // Resolve the type of the variable. - binding = getTypeBinding(((IVariable) binding).getType()); } else if (binding instanceof IType) { // Resolve the type. binding = getTypeBinding((IType) binding); @@ -392,12 +390,14 @@ public class BindingClassifier { if (fAst.getDeclarationsInAST(binding).length != 0) return; // Declared locally. - if (!canForwardDeclare(binding)) - defineBinding(binding); - if (!fProcessedDeclaredBindings.add(binding)) return; + if (!canForwardDeclare(binding)) { + defineBinding(binding); + return; + } + List requiredBindings = getRequiredBindings(binding); for (IBinding requiredBinding : requiredBindings) { @@ -1050,8 +1050,10 @@ public class BindingClassifier { IBinding binding = ((IASTIdExpression) functionNameExpression).getName().resolveBinding(); if (binding instanceof IFunction) { declareFunction((IFunction) binding, functionCallExpression); - } else if (binding instanceof IType) { - defineBinding(binding); + } else { + if (binding instanceof IType) + defineBinding(binding); + if (functionCallExpression instanceof IASTImplicitNameOwner) { IASTImplicitName[] implicitNames = ((IASTImplicitNameOwner) functionCallExpression).getImplicitNames(); for (IASTName name : implicitNames) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/includes/IncludeOrganizer.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/includes/IncludeOrganizer.java index b2dd84b589a..ad3d44f23fc 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/includes/IncludeOrganizer.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/includes/IncludeOrganizer.java @@ -1008,12 +1008,17 @@ public class IncludeOrganizer { indexNames[indexNames.length - 1] = indexName; } } - } else if (allowDeclarations || binding instanceof IFunction) { - // For functions we need to include the declaration. + } else if (allowDeclarations || binding instanceof IFunction || binding instanceof IVariable) { + // For functions and variables we need to include a declaration. indexNames = index.findDeclarations(binding); } else { // For all other bindings we need to include the definition. indexNames = index.findDefinitions(binding); + if (indexNames.length == 0) { + // If we could not find any definitions, there is still a chance that + // a declaration would be sufficient. + indexNames = index.findDeclarations(binding); + } } if (indexNames.length != 0) {