From a1cc0b1d0712560b671c3e3e66ea23cb9f6708a5 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Sat, 25 Jul 2015 17:23:46 -0400 Subject: [PATCH] Bug 447431 - Have ICPPASTSimpleTypeConstructorExpression reference the called constructor via an implicit name Change-Id: I8c1baf0bbe71d748e3849619613a74ea892db6ee Signed-off-by: Nathan Ridge --- .../core/parser/tests/ast2/AST2CPPTests.java | 16 ++++++++++ ...CPPASTSimpleTypeConstructorExpression.java | 32 ++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index b09f9037b91..339c2210eb6 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -11655,4 +11655,20 @@ public class AST2CPPTests extends AST2TestBase { assertEquals(dCtor, implicitNames[2].resolveBinding()); assertEquals(eCtor, implicitNames[3].resolveBinding()); } + + // struct A { + // A(int, int); + // }; + // void a(A); + // int main() { + // a(A{3, 4}); + // } + public void testImplicitConstructorNameInTypeConstructorExpression_447431() throws Exception { + BindingAssertionHelper helper = getAssertionHelper(); + ICPPConstructor ctor = helper.assertNonProblem("A(int, int)", "A"); + ICPPASTSimpleTypeConstructorExpression typeConstructorExpr = helper.assertNode("A{3, 4}"); + IASTImplicitName[] implicitNames = ((IASTImplicitNameOwner) typeConstructorExpr).getImplicitNames(); + assertEquals(1, implicitNames.length); + assertEquals(ctor, implicitNames[0].resolveBinding()); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleTypeConstructorExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleTypeConstructorExpression.java index c7ef0dcae70..99fc41b15e2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleTypeConstructorExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleTypeConstructorExpression.java @@ -15,6 +15,8 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTImplicitDestructorName; +import org.eclipse.cdt.core.dom.ast.IASTImplicitName; +import org.eclipse.cdt.core.dom.ast.IASTImplicitNameOwner; import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTInitializerClause; import org.eclipse.cdt.core.dom.ast.IBasicType.Kind; @@ -25,6 +27,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTInitializerClause; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTInitializerList; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeConstructorExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.DestructorCallCollector; @@ -32,11 +35,12 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFixed; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalTypeId; public class CPPASTSimpleTypeConstructorExpression extends ASTNode - implements ICPPASTSimpleTypeConstructorExpression { + implements ICPPASTSimpleTypeConstructorExpression, IASTImplicitNameOwner { private ICPPASTDeclSpecifier fDeclSpec; private IASTInitializer fInitializer; private ICPPEvaluation fEvaluation; private IASTImplicitDestructorName[] fImplicitDestructorNames; + private IASTImplicitName[] fImplicitNames; // for class types: the constructor being called public CPPASTSimpleTypeConstructorExpression() { } @@ -147,6 +151,14 @@ public class CPPASTSimpleTypeConstructorExpression extends ASTNode if (fDeclSpec != null && !fDeclSpec.accept(action)) return false; + + if (action.shouldVisitImplicitNames) { + for (IASTImplicitName implicitName : getImplicitNames()) { + if (!implicitName.accept(action)) { + return false; + } + } + } if (fInitializer != null && !fInitializer.accept(action)) return false; @@ -266,4 +278,22 @@ public class CPPASTSimpleTypeConstructorExpression extends ASTNode init.setExpression(expression); setInitializer(init); } + + @Override + public IASTImplicitName[] getImplicitNames() { + if (fImplicitNames == null) { + fImplicitNames = IASTImplicitName.EMPTY_NAME_ARRAY; + ICPPEvaluation eval = getEvaluation(); + if (eval instanceof EvalTypeId) { + ICPPFunction constructor = ((EvalTypeId) eval).getConstructor(this); + if (constructor != null) { + CPPASTImplicitName name = new CPPASTImplicitName(constructor.getNameCharArray(), this); + name.setOffsetAndLength((ASTNode) fDeclSpec); + name.setBinding(constructor); + fImplicitNames = new IASTImplicitName[] { name }; + } + } + } + return fImplicitNames; + } }