From 9640ac4917bf601f4860a1fd522c236856a3125d Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Mon, 12 Dec 2016 13:35:23 -0500 Subject: [PATCH] Bug 455797 - Show template parameter list for alias template completions Change-Id: I138861d305a02927014eebe882065e9c7fa877c8 --- .../text/contentassist2/CompletionTests.java | 16 +++++++++++--- .../DOMCompletionProposalComputer.java | 21 ++++++++++++++++--- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java index 050f055d8a5..8a3b515e188 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java @@ -728,9 +728,19 @@ public class CompletionTests extends AbstractContentAssistTest { // class BaseTest : Alias/*cursor*/ public void testBaseClassIsTemplateAlias_434446() throws Exception { - // TODO Bug 455797, proposals are currently not presented as templates. - final String[] expected = { "AliasForSpecialization", - "AliasForTemplateAlias" }; + final String[] expected = { + "AliasForSpecialization", + "AliasForTemplateAlias" + }; + assertCompletionResults(fCursorOffset, expected, ID); + } + + // struct S {}; + // template + // using waldo = S; + // class B : wald/*cursor*/ + public void testAliasTemplate_455797() throws Exception { + final String[] expected = { "waldo" }; assertCompletionResults(fCursorOffset, expected, ID); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionProposalComputer.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionProposalComputer.java index 3f75bb26a20..c61d27bf32d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionProposalComputer.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionProposalComputer.java @@ -68,6 +68,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICFunctionScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; @@ -81,6 +82,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; @@ -354,6 +356,8 @@ public class DOMCompletionProposalComputer extends ParsingBasedProposalComputer final int baseRelevance= computeBaseRelevance(prefix, name); if (binding instanceof ICPPClassType) { handleClass((ICPPClassType) binding, astContext, cContext, baseRelevance, proposals); + } else if (binding instanceof ICPPAliasTemplate) { + handleAliasTemplate((ICPPAliasTemplate) binding, cContext, baseRelevance, proposals); } else if (binding instanceof IFunction) { handleFunction((IFunction) binding, cContext, baseRelevance, proposals); } else if (binding instanceof IVariable) { @@ -382,10 +386,15 @@ public class DOMCompletionProposalComputer extends ParsingBasedProposalComputer char[] name= binding.getNameCharArray(); return name.length == 0 || name[0] == '{'; } - + private void addProposalForClassTemplate(ICPPClassTemplate templateType, CContentAssistInvocationContext context, int baseRelevance, List proposals) { int relevance = getClassTypeRelevance(templateType); + addProposalForTemplateDefinition(templateType, context, baseRelevance + relevance, proposals); + } + + private void addProposalForTemplateDefinition(ICPPTemplateDefinition templateType, + CContentAssistInvocationContext context, int relevance, List proposals) { StringBuilder representation = new StringBuilder(templateType.getName()); boolean inUsingDeclaration = context.isInUsingDirective(); String templateParameterRepresentation = ""; //$NON-NLS-1$ @@ -398,7 +407,7 @@ public class DOMCompletionProposalComputer extends ParsingBasedProposalComputer String representationString = MessageFormat.format(representation.toString(), ""); //$NON-NLS-1$ String displayString = MessageFormat.format(representation.toString(), templateParameterRepresentation); CCompletionProposal proposal = createProposal(representationString, displayString, getImage(templateType), - baseRelevance + relevance, context); + relevance, context); if (!inUsingDeclaration) { CProposalContextInformation info = new CProposalContextInformation( @@ -412,7 +421,7 @@ public class DOMCompletionProposalComputer extends ParsingBasedProposalComputer proposals.add(proposal); } - private String buildTemplateParameters(ICPPClassTemplate templateType, CContentAssistInvocationContext context) { + private String buildTemplateParameters(ICPPTemplateDefinition templateType, CContentAssistInvocationContext context) { ICPPTemplateParameter[] parameters = templateType.getTemplateParameters(); StringBuilder representation = new StringBuilder(); @@ -480,6 +489,12 @@ public class DOMCompletionProposalComputer extends ParsingBasedProposalComputer baseRelevance + RelevanceConstants.CLASS_TYPE_RELEVANCE, context)); } } + + private void handleAliasTemplate(ICPPAliasTemplate aliasTemplate, + CContentAssistInvocationContext context, int baseRelevance, List proposals) { + addProposalForTemplateDefinition(aliasTemplate, context, + baseRelevance + RelevanceConstants.TYPEDEF_TYPE_RELEVANCE, proposals); + } private void addProposalsForConstructors(ICPPClassType classType, CContentAssistInvocationContext context, int baseRelevance, List proposals) {