From fd77ff4e643d7f2ad9a95e315564ac716f299542 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 14 May 2008 09:26:08 +0000 Subject: [PATCH] Correct CPPTemplates.instantiateTypes(..) and use it where possible. --- .../parser/cpp/CPPDeferredClassInstance.java | 11 +++++---- .../parser/cpp/CPPUnknownClassInstance.java | 3 +++ .../parser/cpp/semantics/CPPTemplates.java | 23 ++++++++++--------- .../CompositeCPPDeferredClassInstance.java | 10 ++++---- .../dom/cpp/PDOMCPPDeferredClassInstance.java | 3 +++ .../dom/cpp/PDOMCPPUnknownClassInstance.java | 3 +-- .../pdom/dom/cpp/PDOMCPPUnknownClassType.java | 7 ++---- 7 files changed, 31 insertions(+), 29 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java index 4cf089e94d9..ffd4f879a29 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java @@ -93,17 +93,18 @@ public class CPPDeferredClassInstance extends CPPUnknownClass implements ICPPDef @Override public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap, ICPPScope instantiationScope) { IType[] arguments = getArguments(); - IType[] newArgs = new IType[arguments.length]; - int size = arguments.length; - for (int i = 0; i < size; i++) { - newArgs[i] = CPPTemplates.instantiateType(arguments[i], argMap, instantiationScope); - } + IType[] newArgs = CPPTemplates.instantiateTypes(arguments, argMap, instantiationScope); + boolean changed= arguments != newArgs; ICPPClassTemplate classTemplate = getClassTemplate(); if (argMap.containsKey(classTemplate)) { classTemplate = (ICPPClassTemplate) argMap.get(classTemplate); + changed= true; } + if (!changed) { + return this; + } return ((ICPPInternalTemplateInstantiator) classTemplate).instantiate(newArgs); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java index ef14476b51b..4cc7a835f1d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java @@ -38,6 +38,9 @@ public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPUnkn @Override public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap, ICPPScope instantiationScope) { IType[] newArgs = CPPTemplates.instantiateTypes(arguments, argMap, instantiationScope); + if (parentBinding == unknownContainerBinding && newArgs == arguments) { + return this; + } return new CPPUnknownClassInstance(parentBinding, name, newArgs); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index e99638da67a..318c5408549 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -692,11 +692,12 @@ public class CPPTemplates { IType ret = null; IType[] params = null; try { - ret = instantiateType(((IFunctionType) type).getReturnType(), argMap, instantiationScope); + final IType r = ((IFunctionType) type).getReturnType(); + ret = instantiateType(r, argMap, instantiationScope); IType[] ps = ((IFunctionType) type).getParameterTypes(); - params = new IType[ps.length]; - for (int i = 0; i < params.length; i++) { - params[i]= instantiateType(ps[i], argMap, instantiationScope); + params = instantiateTypes(ps, argMap, (ICPPScope) instantiationScope); + if (ret == r && params == ps) { + return type; } } catch (DOMException e) { } @@ -809,14 +810,14 @@ public class CPPTemplates { IType[] result = types; for (int i = 0; i < types.length; i++) { IType type = CPPTemplates.instantiateType(types[i], argMap, instantiationScope); - if (type != types[i]) { - if (result == types) { - result = new IType[types.length]; - if (i > 0) { - System.arraycopy(types, 0, result, 0, i); - } + if (result != types) { + result[i]= type; + } else if (type != types[i]) { + result = new IType[types.length]; + if (i > 0) { + System.arraycopy(types, 0, result, 0, i); } - result[i] = type; + result[i]= type; } } return result; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java index 9cee44bd6fd..f5e0a9142ea 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java @@ -68,13 +68,11 @@ public class CompositeCPPDeferredClassInstance extends CompositeCPPClassType imp public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap, ICPPScope instantiationScope) { IType[] arguments = getArguments(); - - IType [] newArgs = new IType[ arguments.length ]; - int size = arguments.length; - for( int i = 0; i < size; i++ ){ - newArgs[i] = CPPTemplates.instantiateType( arguments[i], argMap, instantiationScope); + IType[] newArgs = CPPTemplates.instantiateTypes(arguments, argMap, instantiationScope); + if (arguments == newArgs) { + return this; } - + return ((ICPPInternalTemplateInstantiator)getTemplateDefinition()).instantiate( newArgs ); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java index ec20d199197..5d231328108 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java @@ -156,6 +156,9 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPInstance implements ICPPDeferr public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap, ICPPScope instantiationScope) { IType[] arguments = getArguments(); IType[] newArgs = CPPTemplates.instantiateTypes(arguments, argMap, instantiationScope); + if (arguments == newArgs) { + return this; + } return ((ICPPInternalTemplateInstantiator) getTemplateDefinition()).instantiate(newArgs); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java index 1de31d4c428..0fe38f47d2f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassInstance.java @@ -12,7 +12,6 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import org.eclipse.cdt.core.CCorePlugin; @@ -108,7 +107,7 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICP IType[] arguments = getArguments(); IType[] newArgs = CPPTemplates.instantiateTypes(arguments, argMap, instantiationScope); if (parentBinding instanceof PDOMNode && isChildOf((PDOMNode) parentBinding) && - Arrays.equals(newArgs, arguments)) { + newArgs == arguments) { return this; } IASTName name = new CPPASTName(getNameCharArray()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java index b0a7a7b6c7f..074f17a5c06 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java @@ -247,11 +247,8 @@ class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope, } public IBinding resolvePartially(ICPPUnknownBinding parentBinding, ObjectMap argMap, ICPPScope instantiationScope) { - try { - if (parentBinding == getParentBinding()) { - return this; - } - } catch (CoreException e) { + if (parentBinding instanceof PDOMNode && isChildOf((PDOMNode) parentBinding)) { + return this; } return new CPPUnknownClass(parentBinding, getUnknownName()); }