1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 299911. Added ICPPClassSpecialization.getBases(IASTNode point)

method to avoid loss of instantiation context.
This commit is contained in:
Sergey Prigogin 2012-07-31 20:32:36 -07:00
parent a86fdeca46
commit 3400d21110
8 changed files with 38 additions and 10 deletions

View file

@ -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);
}

View file

@ -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();

View file

@ -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

View file

@ -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.

View file

@ -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<IBinding> grandBaseBindings= null;
BitSet selectedBases= null;

View file

@ -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();
}

View file

@ -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

View file

@ -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;