From d03bee7bc7e4fb46d27a9354386de29172c75685 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 11 Oct 2010 10:44:33 +0000 Subject: [PATCH] Bug 223660: Parameter help for constructor-style initializers. --- .../tests/prefix/BasicCompletionTest.java | 10 +++ .../core/dom/parser/cpp/CPPASTName.java | 18 ++++-- .../contentassist2/ParameterHintTests.java | 61 +++++++++++-------- .../DOMCompletionProposalComputer.java | 30 ++++++++- 4 files changed, 86 insertions(+), 33 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/prefix/BasicCompletionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/prefix/BasicCompletionTest.java index 4938dd819bf..ddeafdc6bf3 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/prefix/BasicCompletionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/prefix/BasicCompletionTest.java @@ -286,4 +286,14 @@ public class BasicCompletionTest extends CompletionTestBase { String[] expected= {"A"}; checkNonPrefixCompletion(code, true, expected); } + + // struct S {}; + // void foo() { + // S b + public void testCompletionInCtorOfVariable_223660() throws Exception { + String code = getAboveComment(); + String[] expected= {"b"}; + checkNonPrefixCompletion(code, true, expected); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java index 759dc7c5efc..2012f2dfc9a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java @@ -85,13 +85,19 @@ public class CPPASTName extends CPPASTNameBase implements ICPPASTCompletionConte } IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); return filterByElaboratedTypeSpecifier(kind, bindings); - } - else if (parent instanceof IASTDeclarator) { + } else if (parent instanceof IASTDeclarator) { IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); - for (int i = 0; i < bindings.length; i++) { - if (bindings[i] instanceof ICPPNamespace || bindings[i] instanceof ICPPClassType) { - } else { - bindings[i] = null; + if (!isPrefix) { + // The lookup does not find the binding, that is defined by this name + if (bindings.length == 0) { + bindings= new IBinding[] {n.resolveBinding()}; + } + } else { + for (int i = 0; i < bindings.length; i++) { + if (bindings[i] instanceof ICPPNamespace || bindings[i] instanceof ICPPClassType) { + } else { + bindings[i] = null; + } } } return (IBinding[])ArrayUtil.removeNulls(IBinding.class, bindings); diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/ParameterHintTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/ParameterHintTests.java index d212d14f809..6b0408e943a 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/ParameterHintTests.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/ParameterHintTests.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2008 QNX Software Systems and others. + * Copyright (c) 2007, 2010 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -8,6 +8,7 @@ * Contributors: * Bryan Wilkinson (QNX) - Initial API and implementation * Anton Leherbauer (Wind River Systems) + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.ui.tests.text.contentassist2; @@ -23,25 +24,25 @@ public class ParameterHintTests extends AbstractContentAssistTest { private static final String HEADER_FILE_NAME = "PHTest.h"; private static final String SOURCE_FILE_NAME = "PHTest.cpp"; -//{PHTest.h} -//class aClass { -//public: -// int aField; -// void aMethod(char c); -// void aMethod(char c, int x); -//}; -//class bClass { -//public: -// bClass(int x); -// bClass(int x, int y); -//}; -//void aFunc(int i); -//int anotherFunc(int i, int j); -//int pi(aClass a); -//int pie(aClass a); -//int pies(aClass a); -//templateclass tClass {public:tClass(T t);}; -//templatevoid tFunc(T x, T y); + // {PHTest.h} + // class aClass { + // public: + // int aField; + // void aMethod(char c); + // void aMethod(char c, int x); + // }; + // class bClass { + // public: + // bClass(int x); + // bClass(int x, int y); + // }; + // void aFunc(int i); + // int anotherFunc(int i, int j); + // int pi(aClass a); + // int pie(aClass a); + // int pies(aClass a); + // templateclass tClass {public:tClass(T t);}; + // templatevoid tFunc(T x, T y); public ParameterHintTests(String name) { super(name, true); @@ -129,7 +130,7 @@ public class ParameterHintTests extends AbstractContentAssistTest { } //void foo(){bClass b( - public void _testConstructor2_Bug223660() throws Exception { + public void testConstructor2_Bug223660() throws Exception { // http://bugs.eclipse.org/223660 assertParameterHints(new String[] { "bClass(int x)", @@ -138,6 +139,18 @@ public class ParameterHintTests extends AbstractContentAssistTest { }); } + // struct D { + // bClass b; + // D() : b( + public void testConstructor3_Bug327064() throws Exception { + // http://bugs.eclipse.org/327064 + assertParameterHints(new String[] { + "bClass(int x)", + "bClass(int x,int y)", + "bClass(const bClass &)" + }); + } + //void foo(){tClass t=new tClass( public void testTemplateConstructor() throws Exception { assertParameterHints(new String[] { @@ -147,11 +160,11 @@ public class ParameterHintTests extends AbstractContentAssistTest { } //void foo(){tClass t( - public void _testTemplateConstructor2_Bug223660() throws Exception { + public void testTemplateConstructor2_Bug223660() throws Exception { // http://bugs.eclipse.org/223660 assertParameterHints(new String[] { - "tClass(T t)", - "tClass(const tClass &)" + "tClass(int t)", + "tClass(const tClass &)" }); } 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 23472d496e1..faf07027c8a 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 @@ -302,10 +302,10 @@ public class DOMCompletionProposalComputer extends ParsingBasedProposalComputer handleClass((ICPPClassType) binding, astContext, cContext, baseRelevance, proposals); } else if (binding instanceof IFunction) { handleFunction((IFunction)binding, cContext, baseRelevance, proposals); + } else if (binding instanceof IVariable) { + handleVariable((IVariable) binding, cContext, baseRelevance, proposals); } else if (!cContext.isContextInformationStyle()) { - if (binding instanceof IVariable) { - handleVariable((IVariable) binding, cContext, baseRelevance, proposals); - } else if (binding instanceof ITypedef) { + if (binding instanceof ITypedef) { proposals.add(createProposal(name, name, getImage(binding), baseRelevance + RelevanceConstants.TYPEDEF_TYPE_RELEVANCE, cContext)); } else if (binding instanceof ICPPNamespace) { @@ -456,6 +456,23 @@ public class DOMCompletionProposalComputer extends ParsingBasedProposalComputer private void handleVariable(IVariable variable, CContentAssistInvocationContext context, int baseRelevance, List proposals) { + if (context.isContextInformationStyle()) { + // Handle the case where a variable is initialized with a constructor + try { + IType t = variable.getType(); + t= unwindTypedefs(t); + if (t instanceof ICPPClassType) { + ICPPClassType classType= (ICPPClassType) t; + ICPPConstructor[] constructors = classType.getConstructors(); + for (ICPPConstructor constructor : constructors) { + handleFunction(constructor, context, baseRelevance, proposals); + } + } + } catch (DOMException e) { + } + return; + } + StringBuilder repStringBuff = new StringBuilder(); repStringBuff.append(variable.getName()); @@ -490,6 +507,13 @@ public class DOMCompletionProposalComputer extends ParsingBasedProposalComputer proposals.add(proposal); } + private IType unwindTypedefs(final IType t) { + IType r= t; + while (r instanceof ITypedef) + r= ((ITypedef) r).getType(); + return r != null ? r : t; + } + private static boolean isField(IVariable variable) { return variable instanceof IField; }