From ec941362f49b2313c2a75f3f1bd17b6194ea1ece Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Fri, 10 Aug 2012 12:54:58 -0700 Subject: [PATCH] Bug 299911. Improved propagation of template instantiation context. --- .../ClassMembersInitializationChecker.java | 3 ++- .../ui/editor/OverrideIndicatorManager.java | 23 +++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ClassMembersInitializationChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ClassMembersInitializationChecker.java index 2b7ba944fcf..a22cc9c15ba 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ClassMembersInitializationChecker.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/ClassMembersInitializationChecker.java @@ -46,6 +46,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVariableReadWriteFlags; import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; @@ -84,7 +85,7 @@ public class ClassMembersInitializationChecker extends AbstractIndexAstChecker { Set fieldsInConstructor = constructorsStack.push(new HashSet()); // Add all class fields - for (IField field : constructor.getClassOwner().getDeclaredFields()) { + for (IField field : ClassTypeHelper.getDeclaredFields(constructor.getClassOwner(), declaration)) { if (isSimpleType(field.getType()) && !field.isStatic()) { fieldsInConstructor.add(field); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/OverrideIndicatorManager.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/OverrideIndicatorManager.java index 117fc21ec08..93f338dbb21 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/OverrideIndicatorManager.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/OverrideIndicatorManager.java @@ -241,7 +241,8 @@ public class OverrideIndicatorManager implements ICReconcilingListener { overridenMethods.clear(); shadowedMethods.clear(); - handleBaseClass(testedClass, testedOverride, overridenMethods, shadowedMethods, alreadyTestedBases); + handleBaseClass(testedClass, testedOverride, overridenMethods, shadowedMethods, + alreadyTestedBases, node); for (ICPPMethod overriddenMethod : overridenMethods) { if (sb.length() > 0) { @@ -296,25 +297,26 @@ public class OverrideIndicatorManager implements ICReconcilingListener { } /** - * If the class directly has a valid override for testedOverride, it is added to foundBindings. Otherwise - * each base class is added to handleBaseClass. + * If the class directly has a valid override for testedOverride, it is added to foundBindings. + * Otherwise each base class is added to handleBaseClass. * * @param shadowedMethods * @param alreadyTestedBases + * @param point * * @throws DOMException */ - private static void handleBaseClass(ICPPClassType aClass, ICPPMethod testedOverride, + private static void handleBaseClass(ICPPClassType classType, ICPPMethod testedOverride, Set foundMethods, Set shadowedMethods, - Set alreadyTestedBases) throws DOMException { - if (alreadyTestedBases.contains(aClass)) { + Set alreadyTestedBases, IASTNode point) throws DOMException { + if (alreadyTestedBases.contains(classType)) { return; } else { - alreadyTestedBases.add(aClass); + alreadyTestedBases.add(classType); } Vector validOverrides = new Vector(); - for (ICPPMethod method : aClass.getDeclaredMethods()) { + for (ICPPMethod method : ClassTypeHelper.getDeclaredMethods(classType, point)) { if (testedOverride.getName().equals(method.getName())) { if (ClassTypeHelper.isOverrider(testedOverride, method)) { validOverrides.add(method); @@ -331,12 +333,13 @@ public class OverrideIndicatorManager implements ICReconcilingListener { return; } - for (ICPPBase b : aClass.getBases()) { + for (ICPPBase b : ClassTypeHelper.getBases(classType, point)) { if (!(b.getBaseClass() instanceof ICPPClassType)) { continue; } ICPPClassType baseClass = (ICPPClassType) b.getBaseClass(); - handleBaseClass(baseClass, testedOverride, foundMethods, shadowedMethods, alreadyTestedBases); + handleBaseClass(baseClass, testedOverride, foundMethods, shadowedMethods, + alreadyTestedBases, point); } }