mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
207840: PDOM non type template parameters (fix)
This commit is contained in:
parent
457b9eae1d
commit
642e523cf3
5 changed files with 33 additions and 12 deletions
|
@ -40,6 +40,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
|
||||||
|
@ -1187,6 +1188,7 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa
|
||||||
ICPPClassType b1= getBindingFromASTName("A<y>", 1, ICPPClassType.class, ICPPTemplateDefinition.class);
|
ICPPClassType b1= getBindingFromASTName("A<y>", 1, ICPPClassType.class, ICPPTemplateDefinition.class);
|
||||||
ICPPTemplateInstance b2= getBindingFromASTName("A<y>", 4, ICPPTemplateInstance.class, ICPPClassType.class);
|
ICPPTemplateInstance b2= getBindingFromASTName("A<y>", 4, ICPPTemplateInstance.class, ICPPClassType.class);
|
||||||
ObjectMap args= b2.getArgumentMap();
|
ObjectMap args= b2.getArgumentMap();
|
||||||
|
assertInstance(args.keyAt(0), ICPPTemplateNonTypeParameter.class);
|
||||||
assertEquals(1, args.size());
|
assertEquals(1, args.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
|
||||||
|
@ -239,6 +240,14 @@ public class CPPCompositesFactory extends AbstractCompositeFactory {
|
||||||
} else {
|
} else {
|
||||||
throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$
|
throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
}
|
}
|
||||||
|
} else if(binding instanceof ICPPTemplateParameter) {
|
||||||
|
if (binding instanceof ICPPTemplateTypeParameter) {
|
||||||
|
result = new CompositeCPPTemplateTypeParameter(this, (ICPPTemplateTypeParameter) binding);
|
||||||
|
} else if (binding instanceof ICPPTemplateNonTypeParameter) {
|
||||||
|
result = new CompositeCPPTemplateNonTypeParameter(this, (ICPPTemplateNonTypeParameter) binding);
|
||||||
|
} else {
|
||||||
|
throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
}
|
||||||
} else if (binding instanceof ICPPParameter) {
|
} else if (binding instanceof ICPPParameter) {
|
||||||
result = new CompositeCPPParameter(this, (ICPPParameter) binding);
|
result = new CompositeCPPParameter(this, (ICPPParameter) binding);
|
||||||
} else if (binding instanceof ICPPField) {
|
} else if (binding instanceof ICPPField) {
|
||||||
|
@ -272,10 +281,6 @@ public class CPPCompositesFactory extends AbstractCompositeFactory {
|
||||||
result = new CompositeCPPEnumerator(this, (IEnumerator) binding);
|
result = new CompositeCPPEnumerator(this, (IEnumerator) binding);
|
||||||
} else if (binding instanceof ITypedef) {
|
} else if (binding instanceof ITypedef) {
|
||||||
result = new CompositeCPPTypedef(this, (ICPPBinding) binding);
|
result = new CompositeCPPTypedef(this, (ICPPBinding) binding);
|
||||||
} else if (binding instanceof ICPPTemplateTypeParameter) {
|
|
||||||
result = new CompositeCPPTemplateTypeParameter(this, (ICPPTemplateTypeParameter) binding);
|
|
||||||
} else if (binding instanceof ICPPTemplateNonTypeParameter) {
|
|
||||||
result = new CompositeCPPTemplateNonTypeParameter(this, (ICPPTemplateNonTypeParameter) binding);
|
|
||||||
} else if (binding instanceof IIndexMacroContainer) {
|
} else if (binding instanceof IIndexMacroContainer) {
|
||||||
result= new CompositeMacroContainer(this, binding);
|
result= new CompositeMacroContainer(this, binding);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -311,7 +311,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private PDOMBinding createBinding(PDOMNode parent, IBinding binding) throws CoreException, DOMException {
|
PDOMBinding createBinding(PDOMNode parent, IBinding binding) throws CoreException, DOMException {
|
||||||
PDOMBinding pdomBinding= null;
|
PDOMBinding pdomBinding= null;
|
||||||
|
|
||||||
if (binding instanceof ICPPSpecialization) {
|
if (binding instanceof ICPPSpecialization) {
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||||
import org.eclipse.cdt.internal.core.index.IIndexScope;
|
import org.eclipse.cdt.internal.core.index.IIndexScope;
|
||||||
|
@ -54,10 +55,10 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements
|
||||||
protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 16;
|
protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 16;
|
||||||
|
|
||||||
public PDOMCPPSpecialization(PDOM pdom, PDOMNode parent, ICPPSpecialization spec, PDOMNamedNode specialized)
|
public PDOMCPPSpecialization(PDOM pdom, PDOMNode parent, ICPPSpecialization spec, PDOMNamedNode specialized)
|
||||||
throws CoreException {
|
throws CoreException {
|
||||||
super(pdom, parent, spec.getNameCharArray());
|
super(pdom, parent, spec.getNameCharArray());
|
||||||
pdom.getDB().putInt(record + SPECIALIZED, specialized.getRecord());
|
pdom.getDB().putInt(record + SPECIALIZED, specialized.getRecord());
|
||||||
|
|
||||||
PDOMNodeLinkedList paramList = new PDOMNodeLinkedList(pdom, record + ARGMAP_PARAMS, getLinkageImpl());
|
PDOMNodeLinkedList paramList = new PDOMNodeLinkedList(pdom, record + ARGMAP_PARAMS, getLinkageImpl());
|
||||||
PDOMNodeLinkedList argList = new PDOMNodeLinkedList(pdom, record + ARGMAP_ARGS, getLinkageImpl());
|
PDOMNodeLinkedList argList = new PDOMNodeLinkedList(pdom, record + ARGMAP_ARGS, getLinkageImpl());
|
||||||
ObjectMap argMap = spec.getArgumentMap();
|
ObjectMap argMap = spec.getArgumentMap();
|
||||||
|
@ -65,9 +66,22 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements
|
||||||
for (int i = 0; i < argMap.size(); i++) {
|
for (int i = 0; i < argMap.size(); i++) {
|
||||||
Object param = argMap.keyAt(i);
|
Object param = argMap.keyAt(i);
|
||||||
Object arg = argMap.getAt(i);
|
Object arg = argMap.getAt(i);
|
||||||
/* TODO: allow template non-type parameters once they have been
|
|
||||||
* implemented in the PDOM
|
// TODO - non-type template arguments still needs attention
|
||||||
*/
|
if (param instanceof ICPPTemplateNonTypeParameter && arg instanceof IType) {
|
||||||
|
try {
|
||||||
|
ICPPTemplateNonTypeParameter nontype= (ICPPTemplateNonTypeParameter) param;
|
||||||
|
PDOMNode paramNode= ((PDOMCPPLinkage)getLinkageImpl()).createBinding(this, nontype);
|
||||||
|
PDOMNode argNode= getLinkageImpl().addType(this, (IType) arg);
|
||||||
|
if (paramNode != null && argNode != null) {
|
||||||
|
paramList.addMember(paramNode);
|
||||||
|
argList.addMember(argNode);
|
||||||
|
}
|
||||||
|
} catch(DOMException de) {
|
||||||
|
CCorePlugin.log(de);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (param instanceof IType && arg instanceof IType) {
|
if (param instanceof IType && arg instanceof IType) {
|
||||||
PDOMNode paramNode = getLinkageImpl().addType(this, (IType) param);
|
PDOMNode paramNode = getLinkageImpl().addType(this, (IType) param);
|
||||||
PDOMNode argNode = getLinkageImpl().addType(this, (IType) arg);
|
PDOMNode argNode = getLinkageImpl().addType(this, (IType) arg);
|
||||||
|
@ -175,7 +189,7 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/*
|
||||||
* For debug purposes only
|
* For debug purposes only
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -65,7 +65,7 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getNodeType() {
|
public int getNodeType() {
|
||||||
return IIndexCPPBindingConstants.CPP_TEMPLATE_TYPE_PARAMETER;
|
return IIndexCPPBindingConstants.CPP_TEMPLATE_NON_TYPE_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Add table
Reference in a new issue