From 3400d211101aa3860c0dfaf0b4fd21e041c06dcb Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Tue, 31 Jul 2012 20:32:36 -0700 Subject: [PATCH] Bug 299911. Added ICPPClassSpecialization.getBases(IASTNode point) method to avoid loss of instantiation context. --- .../cdt/core/dom/ast/cpp/ICPPClassSpecialization.java | 7 +++++++ .../parser/cpp/AbstractCPPClassSpecializationScope.java | 3 +-- .../core/dom/parser/cpp/CPPClassSpecialization.java | 7 ++++++- .../dom/parser/cpp/ICPPClassSpecializationScope.java | 3 ++- .../core/dom/parser/cpp/semantics/BaseClassLookup.java | 7 ++++++- .../composite/cpp/CompositeCPPClassSpecialization.java | 7 ++++++- .../cpp/CompositeCPPClassSpecializationScope.java | 5 +++-- .../core/pdom/dom/cpp/PDOMCPPClassSpecialization.java | 9 +++++++-- 8 files changed, 38 insertions(+), 10 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassSpecialization.java index b71a4e4aa15..8f77959f00b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassSpecialization.java @@ -36,4 +36,11 @@ public interface ICPPClassSpecialization extends ICPPSpecialization, ICPPClassTy * @since 5.5 */ IBinding specializeMember(IBinding binding, IASTNode point); + + /** + * Similar to {@link ICPPClassType#getBases()} but a accepts a starting point for template + * instantiation. + * @since 5.5 + */ + public ICPPBase[] getBases(IASTNode point); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java index 560c545e08e..82af915cf26 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java @@ -124,14 +124,13 @@ public class AbstractCPPClassSpecializationScope implements ICPPClassSpecializat } @Override - public ICPPBase[] getBases() { + public ICPPBase[] getBases(IASTNode point) { if (fBases == null) { ICPPBase[] result = null; ICPPBase[] bases = specialClass.getSpecializedBinding().getBases(); if (bases.length == 0) { fBases= bases; } else { - IASTNode point= null; // Instantiation of dependent expression may not work. final ICPPTemplateParameterMap tpmap = specialClass.getTemplateParameterMap(); for (ICPPBase base : bases) { IBinding origClass = base.getBaseClass(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java index c1e5df4ee23..1f3c24d52f5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java @@ -122,11 +122,16 @@ public class CPPClassSpecialization extends CPPSpecialization @Override public ICPPBase[] getBases() { + return getBases(null); + } + + @Override + public ICPPBase[] getBases(IASTNode point) { ICPPClassSpecializationScope scope= getSpecializationScope(); if (scope == null) return ClassTypeHelper.getBases(this); - return scope.getBases(); + return scope.getBases(point); } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPClassSpecializationScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPClassSpecializationScope.java index 4dd8464e8fd..eb4bbffc704 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPClassSpecializationScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPClassSpecializationScope.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; @@ -39,7 +40,7 @@ public interface ICPPClassSpecializationScope extends ICPPClassScope { /** * Computes the bases via the original class. */ - ICPPBase[] getBases(); + ICPPBase[] getBases(IASTNode point); /** * Computes the methods via the original class. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/BaseClassLookup.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/BaseClassLookup.java index 8579ae27553..def3ed540db 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/BaseClassLookup.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/BaseClassLookup.java @@ -24,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember; import org.eclipse.cdt.core.parser.util.ArrayUtil; @@ -182,7 +183,11 @@ class BaseClassLookup { ICPPClassType baseClass= result.getClassType(); if (baseClass != null) { ICPPBase[] grandBases= null; - grandBases= baseClass.getBases(); + if (baseClass instanceof ICPPClassSpecialization) { + grandBases = ((ICPPClassSpecialization) baseClass).getBases(data.getLookupPoint()); + } else { + grandBases= baseClass.getBases(); + } if (grandBases != null && grandBases.length > 0) { HashSet grandBaseBindings= null; BitSet selectedBases= null; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java index dc3851e7285..618de5509f2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java @@ -129,9 +129,14 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple @Override public final ICPPBase[] getBases() { + return getBases(null); + } + + @Override + public final ICPPBase[] getBases(IASTNode point) { IScope scope= getCompositeScope(); if (scope instanceof ICPPClassSpecializationScope) { - return ((ICPPClassSpecializationScope) scope).getBases(); + return ((ICPPClassSpecializationScope) scope).getBases(point); } return super.getBases(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecializationScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecializationScope.java index 4776ac8bdf6..671ba7884b8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecializationScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecializationScope.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.EScopeKind; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; @@ -108,9 +109,9 @@ public class CompositeCPPClassSpecializationScope extends CompositeScope impleme } @Override - public ICPPBase[] getBases() { + public ICPPBase[] getBases(IASTNode point) { createDelegate(); - return fDelegate.getBases(); + return fDelegate.getBases(point); } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java index d153b3fac5b..b3fea4a1fca 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java @@ -207,10 +207,15 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements @Override public ICPPBase[] getBases() { + return getBases(null); + } + + @Override + public ICPPBase[] getBases(IASTNode point) { IScope scope= getCompositeScope(); if (scope instanceof ICPPClassSpecializationScope) { - return ((ICPPClassSpecializationScope) scope).getBases(); - } + return ((ICPPClassSpecializationScope) scope).getBases(point); + } // This is an explicit specialization Long key= record + PDOMCPPLinkage.CACHE_BASES;