mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-23 08:55:25 +02:00
Removes forced instantiation of constructors and conversion operators, see bug 201174.
This commit is contained in:
parent
3d97393bad
commit
c9b8e80699
4 changed files with 101 additions and 88 deletions
|
@ -12,6 +12,7 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.index;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
@ -19,14 +20,18 @@ import java.util.List;
|
|||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IBasicType;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunctionType;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
|
@ -67,14 +72,8 @@ public class IndexCPPSignatureUtil {
|
|||
/**
|
||||
* Constructs a string in the format:
|
||||
* <typeName1,typeName2,...>
|
||||
*
|
||||
* @param types
|
||||
* @param qualifyTemplateParameters
|
||||
* @return
|
||||
* @throws CoreException
|
||||
* @throws DOMException
|
||||
*/
|
||||
private static String getTemplateArgString(IType[] types, boolean qualifyTemplateParameters) throws CoreException, DOMException {
|
||||
public static String getTemplateArgString(IType[] types, boolean qualifyTemplateParameters) throws CoreException, DOMException {
|
||||
StringBuilder buffer = new StringBuilder();
|
||||
buffer.append('<');
|
||||
for (int i = 0; i < types.length; i++) {
|
||||
|
@ -102,6 +101,13 @@ public class IndexCPPSignatureUtil {
|
|||
}
|
||||
}
|
||||
buffer.append(((ICPPTemplateParameter)type).getName());
|
||||
} else if (type instanceof ICPPBasicType){
|
||||
IASTExpression expr= ((ICPPBasicType) type).getValue();
|
||||
if (expr != null) {
|
||||
buffer.append(getValueString(expr));
|
||||
} else {
|
||||
buffer.append(ASTTypeUtil.getType(type));
|
||||
}
|
||||
} else {
|
||||
buffer.append(ASTTypeUtil.getType(type));
|
||||
}
|
||||
|
@ -110,6 +116,24 @@ public class IndexCPPSignatureUtil {
|
|||
return buffer.toString();
|
||||
}
|
||||
|
||||
private static String getValueString(IASTExpression e) {
|
||||
e= CPPVisitor.reverseConstantPropogationLookup(e);
|
||||
if (e instanceof IASTLiteralExpression) {
|
||||
IType t1= e.getExpressionType();
|
||||
try {
|
||||
if(t1 instanceof ICPPBasicType) {
|
||||
BigInteger i1= CPPVisitor.parseIntegral(e.toString());
|
||||
return i1.toString();
|
||||
}
|
||||
} catch(NumberFormatException nfe) {
|
||||
/* fall through */
|
||||
}
|
||||
return e.toString();
|
||||
}
|
||||
return "?"; //$NON-NLS-1$
|
||||
}
|
||||
|
||||
|
||||
private static void appendTemplateArgs(Object[] values, StringBuilder buffer) {
|
||||
boolean needcomma= false;
|
||||
buffer.append('<');
|
||||
|
|
|
@ -71,7 +71,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
|
|||
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants;
|
||||
import org.eclipse.cdt.internal.core.index.composite.CompositeIndexBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
|
@ -261,13 +260,6 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
|
|||
if (pdomBinding != null) {
|
||||
pdom.putCachedResult(inputBinding, pdomBinding);
|
||||
}
|
||||
|
||||
if (binding instanceof ICPPClassType && (pdomBinding instanceof PDOMCPPClassInstance
|
||||
|| pdomBinding instanceof PDOMCPPDeferredClassInstance)) {
|
||||
// Add instantiated constructors to the index (bug 201174).
|
||||
addConstructors(pdomBinding, (ICPPClassType) binding);
|
||||
addConversionOperators(pdomBinding, (ICPPClassType) binding);
|
||||
}
|
||||
} catch (DOMException e) {
|
||||
throw new CoreException(Util.createStatus(e));
|
||||
}
|
||||
|
@ -281,18 +273,6 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
|
|||
return pdomBinding;
|
||||
}
|
||||
|
||||
private void addConstructors(PDOMBinding pdomBinding, ICPPClassType binding)
|
||||
throws DOMException, CoreException {
|
||||
for(ICPPConstructor ctr : binding.getConstructors())
|
||||
addBinding(ctr, null);
|
||||
}
|
||||
|
||||
private void addConversionOperators(PDOMBinding pdomBinding, ICPPClassType binding)
|
||||
throws DOMException, CoreException {
|
||||
for(ICPPMethod conv : SemanticUtil.getDeclaredConversionOperators(binding))
|
||||
addBinding(conv, null);
|
||||
}
|
||||
|
||||
private boolean shouldUpdate(PDOMBinding pdomBinding, IASTName fromName) throws CoreException {
|
||||
if (fromName != null) {
|
||||
if (fromName.isReference()) {
|
||||
|
|
|
@ -22,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
|
|||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
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.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
|
@ -57,35 +58,38 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements ICPPSpeci
|
|||
super(pdom, parent, spec.getNameCharArray());
|
||||
pdom.getDB().putInt(record + SPECIALIZED, specialized.getRecord());
|
||||
|
||||
PDOMNodeLinkedList paramList = new PDOMNodeLinkedList(pdom, record + ARGMAP_PARAMS, getLinkageImpl());
|
||||
PDOMNodeLinkedList argList = new PDOMNodeLinkedList(pdom, record + ARGMAP_ARGS, getLinkageImpl());
|
||||
ObjectMap argMap = spec.getArgumentMap();
|
||||
if (argMap != null) {
|
||||
for (int i = 0; i < argMap.size(); i++) {
|
||||
Object param = argMap.keyAt(i);
|
||||
Object arg = argMap.getAt(i);
|
||||
|
||||
// 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);
|
||||
// specializations that are no instances have the same argmap as their owner.
|
||||
if (this instanceof ICPPTemplateInstance) {
|
||||
PDOMNodeLinkedList paramList = new PDOMNodeLinkedList(pdom, record + ARGMAP_PARAMS, getLinkageImpl());
|
||||
PDOMNodeLinkedList argList = new PDOMNodeLinkedList(pdom, record + ARGMAP_ARGS, getLinkageImpl());
|
||||
ObjectMap argMap = spec.getArgumentMap();
|
||||
if (argMap != null) {
|
||||
for (int i = 0; i < argMap.size(); i++) {
|
||||
Object param = argMap.keyAt(i);
|
||||
Object arg = argMap.getAt(i);
|
||||
|
||||
// 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) {
|
||||
PDOMNode paramNode = getLinkageImpl().addType(this, (IType) param);
|
||||
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) {
|
||||
PDOMNode paramNode = getLinkageImpl().addType(this, (IType) param);
|
||||
PDOMNode argNode = getLinkageImpl().addType(this, (IType) arg);
|
||||
if (paramNode != null && argNode != null) {
|
||||
paramList.addMember(paramNode);
|
||||
argList.addMember(argNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -129,20 +133,28 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements ICPPSpeci
|
|||
public ObjectMap getArgumentMap() {
|
||||
if (fArgMap == null) {
|
||||
try {
|
||||
PDOMNodeLinkedList paramList = new PDOMNodeLinkedList(pdom, record + ARGMAP_PARAMS, getLinkageImpl());
|
||||
PDOMNodeLinkedList argList = new PDOMNodeLinkedList(pdom, record + ARGMAP_ARGS, getLinkageImpl());
|
||||
NodeCollector paramVisitor = new NodeCollector();
|
||||
paramList.accept(paramVisitor);
|
||||
IPDOMNode[] paramNodes = paramVisitor.getNodes();
|
||||
NodeCollector argVisitor = new NodeCollector();
|
||||
argList.accept(argVisitor);
|
||||
IPDOMNode[] argNodes = argVisitor.getNodes();
|
||||
if (this instanceof ICPPTemplateInstance) {
|
||||
PDOMNodeLinkedList paramList = new PDOMNodeLinkedList(pdom, record + ARGMAP_PARAMS, getLinkageImpl());
|
||||
PDOMNodeLinkedList argList = new PDOMNodeLinkedList(pdom, record + ARGMAP_ARGS, getLinkageImpl());
|
||||
NodeCollector paramVisitor = new NodeCollector();
|
||||
paramList.accept(paramVisitor);
|
||||
IPDOMNode[] paramNodes = paramVisitor.getNodes();
|
||||
NodeCollector argVisitor = new NodeCollector();
|
||||
argList.accept(argVisitor);
|
||||
IPDOMNode[] argNodes = argVisitor.getNodes();
|
||||
|
||||
ObjectMap map = new ObjectMap(paramNodes.length);
|
||||
for (int i = 0; i < paramNodes.length; i++) {
|
||||
map.put(paramNodes[i], argNodes[i]);
|
||||
ObjectMap map = new ObjectMap(paramNodes.length);
|
||||
for (int i = 0; i < paramNodes.length; i++) {
|
||||
map.put(paramNodes[i], argNodes[i]);
|
||||
}
|
||||
fArgMap= map;
|
||||
} else {
|
||||
// specializations that are no instances have the same argmap as their owner.
|
||||
IBinding owner= getOwner();
|
||||
if (owner instanceof ICPPSpecialization) {
|
||||
fArgMap= ((ICPPSpecialization) owner).getArgumentMap();
|
||||
}
|
||||
}
|
||||
fArgMap= map;
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
|
|
|
@ -10,12 +10,13 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
|
||||
import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.NamedNodeCollector;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
|
@ -49,28 +50,29 @@ public class PDOMInstanceCache {
|
|||
return newCache;
|
||||
}
|
||||
|
||||
private final ArrayList<Object> fList;
|
||||
private final HashMap<String, ICPPTemplateInstance> fMap;
|
||||
|
||||
public PDOMInstanceCache() {
|
||||
fList= new ArrayList<Object>();
|
||||
fMap= new HashMap<String, ICPPTemplateInstance>();
|
||||
}
|
||||
|
||||
synchronized public final void addInstance(IType[] arguments, ICPPTemplateInstance instance) {
|
||||
fList.add(arguments);
|
||||
fList.add(instance);
|
||||
try {
|
||||
String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true);
|
||||
fMap.put(key, instance);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
} catch (DOMException e) {
|
||||
}
|
||||
}
|
||||
|
||||
synchronized public final ICPPTemplateInstance getInstance(IType[] arguments) {
|
||||
loop: for (int i=0; i < fList.size(); i+=2) {
|
||||
final IType[] args = (IType[]) fList.get(i);
|
||||
if (args.length == arguments.length) {
|
||||
for (int j=0; j < args.length; j++) {
|
||||
if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) {
|
||||
continue loop;
|
||||
}
|
||||
}
|
||||
return (ICPPTemplateInstance) fList.get(i+1);
|
||||
}
|
||||
synchronized public final ICPPTemplateInstance getInstance(IType[] arguments) {
|
||||
try {
|
||||
String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true);
|
||||
return fMap.get(key);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
} catch (DOMException e) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
@ -88,18 +90,13 @@ public class PDOMInstanceCache {
|
|||
ICPPTemplateInstance inst= (ICPPTemplateInstance) node;
|
||||
if (binding.equals(inst.getTemplateDefinition())) {
|
||||
IType[] args= inst.getArguments();
|
||||
fList.add(args);
|
||||
fList.add(inst);
|
||||
addInstance(args, inst);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
synchronized public ICPPTemplateInstance[] getAllInstances() {
|
||||
ICPPTemplateInstance[] result= new ICPPTemplateInstance[fList.size()/2];
|
||||
for (int i=0; i < fList.size(); i+=2) {
|
||||
result[i/2]= (ICPPTemplateInstance) fList.get(i+1);
|
||||
}
|
||||
return result;
|
||||
return fMap.values().toArray(new ICPPTemplateInstance[fMap.size()]);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue