1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 08:55:25 +02:00

Bug 455797 - Show template parameter list for alias template completions

Change-Id: I138861d305a02927014eebe882065e9c7fa877c8
This commit is contained in:
Nathan Ridge 2016-12-12 13:35:23 -05:00
parent 2706699543
commit 9640ac4917
2 changed files with 31 additions and 6 deletions

View file

@ -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<typename T1, typename T2>",
"AliasForTemplateAlias<typename T1, typename T2>"
};
assertCompletionResults(fCursorOffset, expected, ID);
}
// struct S {};
// template <typename T>
// using waldo = S;
// class B : wald/*cursor*/
public void testAliasTemplate_455797() throws Exception {
final String[] expected = { "waldo<typename T>" };
assertCompletionResults(fCursorOffset, expected, ID);
}

View file

@ -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<ICompletionProposal> proposals) {
int relevance = getClassTypeRelevance(templateType);
addProposalForTemplateDefinition(templateType, context, baseRelevance + relevance, proposals);
}
private void addProposalForTemplateDefinition(ICPPTemplateDefinition templateType,
CContentAssistInvocationContext context, int relevance, List<ICompletionProposal> 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<ICompletionProposal> proposals) {
addProposalForTemplateDefinition(aliasTemplate, context,
baseRelevance + RelevanceConstants.TYPEDEF_TYPE_RELEVANCE, proposals);
}
private void addProposalsForConstructors(ICPPClassType classType,
CContentAssistInvocationContext context, int baseRelevance, List<ICompletionProposal> proposals) {