From c9b8e806990c88018db7e06884fa6a939251e1ff Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 30 Jul 2008 09:24:24 +0000 Subject: [PATCH] Removes forced instantiation of constructors and conversion operators, see bug 201174. --- .../core/index/IndexCPPSignatureUtil.java | 38 ++++++-- .../core/pdom/dom/cpp/PDOMCPPLinkage.java | 20 ----- .../pdom/dom/cpp/PDOMCPPSpecialization.java | 86 +++++++++++-------- .../core/pdom/dom/cpp/PDOMInstanceCache.java | 45 +++++----- 4 files changed, 101 insertions(+), 88 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexCPPSignatureUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexCPPSignatureUtil.java index b54e5fc9797..a26ff0ad73b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexCPPSignatureUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexCPPSignatureUtil.java @@ -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: * - * - * @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('<'); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 89d177ee9d3..06611e6031e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -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()) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java index 7293a7fab65..d62d410a0c4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java @@ -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); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMInstanceCache.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMInstanceCache.java index ee88c1fa1ad..b9fb1b23154 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMInstanceCache.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMInstanceCache.java @@ -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 fList; + private final HashMap fMap; public PDOMInstanceCache() { - fList= new ArrayList(); + fMap= new HashMap(); } 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()]); } }