1
0
Fork 0
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:
Markus Schorn 2008-07-30 09:24:24 +00:00
parent 3d97393bad
commit c9b8e80699
4 changed files with 101 additions and 88 deletions

View file

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

View file

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

View file

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

View file

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