diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionTestBase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionTestBase.java index 21959d233df..46d2e40f8da 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionTestBase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionTestBase.java @@ -16,6 +16,7 @@ import java.io.IOException; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMManager; +import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNodeSelector; @@ -38,7 +39,6 @@ import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.core.testplugin.util.TestSourceReader; import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences; import org.eclipse.cdt.internal.pdom.tests.PDOMPrettyPrinter; @@ -155,15 +155,11 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { } protected static void assertQNEquals(String expectedQN, IBinding b) { - try { - assertInstance(b, IBinding.class); - if (b instanceof ICPPBinding) { - assertEquals(expectedQN, CPPVisitor.renderQualifiedName(((ICPPBinding)b).getQualifiedName())); - } else { - assertEquals(expectedQN, b.getName()); - } - } catch (DOMException de) { - fail(de.getMessage()); + assertInstance(b, IBinding.class); + if (b instanceof ICPPBinding) { + assertEquals(expectedQN, ASTTypeUtil.getQualifiedName((ICPPBinding)b)); + } else { + assertEquals(expectedQN, b.getName()); } } @@ -190,7 +186,7 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { IFunctionType ft = (IFunctionType) function; assertTrue(ICPPClassType.class.isInstance((ft.getParameterTypes()[index]))); assertEquals(compositeTypeKey, ((ICPPClassType)ft.getParameterTypes()[index]).getKey()); - assertEquals(qn, CPPVisitor.renderQualifiedName(((ICPPClassType)ft.getParameterTypes()[index]).getQualifiedName())); + assertEquals(qn, ASTTypeUtil.getQualifiedName((ICPPClassType)ft.getParameterTypes()[index])); } protected static T assertInstance(Object o, Class clazz, Class ... cs) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java index 186c322cfb8..e65c1f82ab6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java @@ -340,13 +340,13 @@ public class ASTTypeUtil { break; } } else if (type instanceof ICPPTemplateParameter) { - appendCppName((ICPPTemplateParameter) type, normalize, true, result); + appendCppName((ICPPTemplateParameter) type, normalize, normalize, result); } else if (type instanceof ICPPBinding) { if (type instanceof IEnumeration) { result.append(Keywords.ENUM); result.append(SPACE); } - appendCppName((ICPPBinding) type, normalize, true, result); + appendCppName((ICPPBinding) type, normalize, normalize, result); } else if (type instanceof ICompositeType) { // 101114 fix, do not display class, and for consistency don't display struct/union as well appendNameCheckAnonymous((ICompositeType) type, result); @@ -694,16 +694,27 @@ public class ASTTypeUtil { } } - private static void appendCppName(IBinding binding, boolean normalize, boolean addTemplateArgs, StringBuilder result) { + /** + * Returns the qualified name for the given binding including template arguments. + * If there are template arguments the arguments are neither normalized nor qualified. + * @since 5.3 + */ + public static String getQualifiedName(ICPPBinding binding) { + StringBuilder buf= new StringBuilder(); + appendCppName(binding, false, true, buf); + return buf.toString(); + } + + private static void appendCppName(IBinding binding, boolean normalize, boolean qualify, StringBuilder result) { ICPPTemplateParameter tpar= getTemplateParameter(binding); if (tpar != null) { appendTemplateParameter(tpar, normalize, result); } else { - if (normalize) { + if (qualify) { IBinding owner= binding.getOwner(); if (owner instanceof ICPPNamespace || owner instanceof IType) { int pos= result.length(); - appendCppName(owner, normalize, normalize, result); + appendCppName(owner, normalize, qualify, result); if (result.length() > pos) result.append("::"); //$NON-NLS-1$ } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java index 39d7862d36f..958224b7540 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ILinkage; +import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTName; @@ -189,7 +190,7 @@ public class CPPTypedef extends PlatformObject implements ITypedef, ITypeContain @Override public String toString() { - return getName(); + return ASTTypeUtil.getQualifiedName(this) + " -> " + ASTTypeUtil.getType(this, true); //$NON-NLS-1$ } public IBinding getOwner() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java index ef5ee68083d..d2f2dbcbf70 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java @@ -21,7 +21,7 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.List; -import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; @@ -64,7 +64,6 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ASTQueries; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; -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.core.runtime.CoreException; @@ -627,12 +626,11 @@ public class ClassTypeHelper { } private static void getSubClasses(IIndex index, ICPPBinding classOrTypedef, List result, HashSet handled) throws CoreException { - try { - final String key = CPPVisitor.renderQualifiedName(classOrTypedef.getQualifiedName()); - if (!handled.add(key)) { - return; - } - } catch (DOMException e) { + if (!(classOrTypedef instanceof IType)) + return; + + final String key = ASTTypeUtil.getType((IType) classOrTypedef, true); + if (!handled.add(key)) { return; } 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 152a373b7ec..1608df88b48 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 @@ -433,6 +433,7 @@ public class CPPTemplates { if (defaultArg == null) return null; arg= instantiateArgument(defaultArg, map, -1, null); + arg= SemanticUtil.getSimplifiedArgument(arg); if (!isValidArgument(arg)) { return null; } @@ -645,6 +646,7 @@ public class CPPTemplates { IBinding owner= template.getOwner(); if (owner instanceof ICPPUnknownBinding) { ICPPTemplateArgument[] args= createTemplateArgumentArray(id); + args= SemanticUtil.getSimplifiedArguments(args); return new CPPUnknownClassInstance((ICPPUnknownBinding) template.getOwner(), id.getSimpleID(), args); } } @@ -2186,6 +2188,7 @@ public class CPPTemplates { final ICPPTemplateArgument[] arguments = ucli.getArguments(); ICPPTemplateArgument[] newArgs = CPPTemplates.instantiateArguments(arguments, tpMap, packOffset, within); if (!t.equals(owner) && newArgs != arguments) { + newArgs= SemanticUtil.getSimplifiedArguments(newArgs); result= new CPPUnknownClassInstance((ICPPUnknownBinding) t, ucli.getNameCharArray(), newArgs); } } else if (!t.equals(owner)) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 83171bc1303..2cc76611529 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -2093,20 +2093,6 @@ public class CPPVisitor extends ASTQueries { return found; } - /** - * Return the qualified name by concatenating component names with the - * Scope resolution operator :: - * @param qn the component names - * @return the qualified name - */ - public static String renderQualifiedName(String[] qn) { - StringBuilder result = new StringBuilder(); - for (int i = 0; i < qn.length; i++) { - result.append(qn[i] + (i + 1 < qn.length ? "::" : "")); //$NON-NLS-1$//$NON-NLS-2$ - } - return result.toString(); - } - public static String[] getQualifiedName(IBinding binding) { String[] ns = null; for (IBinding owner= binding.getOwner(); owner != null; owner= owner.getOwner()) { 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 98e9afe9e55..120387c5939 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 @@ -34,7 +34,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; -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.IIndexType; import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; @@ -64,7 +63,7 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPSpecialization implements ICPP throws CoreException { super(linkage, parent, classType, instantiated); - final ICPPTemplateArgument[] args= SemanticUtil.getSimplifiedArguments(classType.getTemplateArguments()); + final ICPPTemplateArgument[] args= classType.getTemplateArguments(); final long argListRec= PDOMCPPArgumentList.putArguments(this, args); getDB().putRecPtr(record+ARGUMENTS, argListRec); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java index fb455928789..86207fd474d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IType; @@ -131,7 +132,7 @@ class PDOMCPPTypedef extends PDOMCPPBinding implements ITypedef, ITypeContainer, @Override protected String toStringBase() { - return getName() + ": " + super.toStringBase(); //$NON-NLS-1$ + return ASTTypeUtil.getQualifiedName(this) + " -> " + super.toStringBase(); //$NON-NLS-1$ } public void setType(IType type) { 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 84fb44bcecb..f0b0e49545e 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 @@ -19,7 +19,6 @@ import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; -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.IndexCPPSignatureUtil; import org.eclipse.cdt.internal.core.pdom.db.Database; @@ -46,7 +45,7 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICP throws CoreException { super(linkage, parent, classInstance); - final ICPPTemplateArgument[] args= SemanticUtil.getSimplifiedArguments(classInstance.getArguments()); + final ICPPTemplateArgument[] args= classInstance.getArguments(); long rec= PDOMCPPArgumentList.putArguments(this, args); final Database db = getDB(); db.putRecPtr(record + ARGUMENTS, rec); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AddIncludeOnSelectionAction.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AddIncludeOnSelectionAction.java index 70c4b781c64..f1564244fbf 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AddIncludeOnSelectionAction.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/AddIncludeOnSelectionAction.java @@ -78,6 +78,7 @@ import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.IScannerInfo; import org.eclipse.cdt.core.parser.IScannerInfoProvider; +import org.eclipse.cdt.core.parser.Keywords; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.IFunctionSummary; import org.eclipse.cdt.ui.IRequiredInclude; @@ -85,7 +86,6 @@ import org.eclipse.cdt.ui.text.ICHelpInvocationContext; import org.eclipse.cdt.ui.text.SharedASTJob; import org.eclipse.cdt.utils.PathUtil; -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.resources.ResourceLookup; import org.eclipse.cdt.internal.corext.codemanipulation.AddIncludesOperation; @@ -648,7 +648,15 @@ public class AddIncludeOnSelectionAction extends TextEditorAction { */ private static String getBindingQualifiedName(IIndexBinding binding) throws CoreException { String[] qname= binding.getQualifiedName(); - return CPPVisitor.renderQualifiedName(qname); + StringBuilder result = new StringBuilder(); + boolean needSep= false; + for (String element : qname) { + if (needSep) + result.append(Keywords.cpCOLONCOLON); + result.append(element); + needSep= true; + } + return result.toString(); } /** diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassWizardUtil.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassWizardUtil.java index 8c51ecdaad0..c0589297fed 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassWizardUtil.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/wizards/classwizard/NewClassWizardUtil.java @@ -58,10 +58,9 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ISourceRoot; import org.eclipse.cdt.core.parser.IScannerInfo; import org.eclipse.cdt.core.parser.IScannerInfoProvider; +import org.eclipse.cdt.core.parser.Keywords; import org.eclipse.cdt.ui.CUIPlugin; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; - import org.eclipse.cdt.internal.ui.editor.CEditor; import org.eclipse.cdt.internal.ui.viewsupport.IViewPartInputProvider; import org.eclipse.cdt.internal.ui.wizards.filewizard.NewSourceFileGenerator; @@ -429,7 +428,7 @@ public class NewClassWizardUtil { ICPPBinding binding = (ICPPBinding)bindings[i]; //get the fully qualified name of this binding - String bindingFullName = CPPVisitor.renderQualifiedName(binding.getQualifiedName()); + String bindingFullName = renderQualifiedName(binding.getQualifiedName()); Class currentNodeType = binding.getClass(); // full binding if (queryType.isAssignableFrom(currentNodeType)) { @@ -475,4 +474,16 @@ public class NewClassWizardUtil { index.releaseReadLock(); } } + + private static String renderQualifiedName(String[] qn) { + StringBuilder result = new StringBuilder(); + boolean needSep= false; + for (String element : qn) { + if (needSep) + result.append(Keywords.cpCOLONCOLON); + result.append(element); + needSep= true; + } + return result.toString(); + } }