From 22d59f21f52be023ac0eca044a4cd09665dbea84 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Tue, 25 Jan 2005 23:20:28 +0000 Subject: [PATCH] C++ bindings: - namespace aliases - constructor chain references --- .../core/parser/tests/ast2/AST2CPPTests.java | 18 ++++++++ .../tests/ast2/CompleteParser2Tests.java | 46 +++++++++++++++++-- .../dom/parser/cpp/CPPImplicitMethod.java | 1 + .../core/dom/parser/cpp/CPPSemantics.java | 13 +++++- .../core/dom/parser/cpp/CPPVisitor.java | 9 ++++ 5 files changed, 83 insertions(+), 4 deletions(-) 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 d67f88df8ed..bbd447322f8 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 @@ -953,5 +953,23 @@ public class AST2CPPTests extends AST2BaseTest { assertTrue( qt.isConst() ); assertSame( qt.getType(), A ); } + + public void testNamespaceAlias() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "namespace A { int x; } \n" ); //$NON-NLS-1$ + buffer.append( "namespace B = A; \n" ); //$NON-NLS-1$ + buffer.append( "int f(){ B::x; } \n" ); //$NON-NLS-1$ + + IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + CPPNameCollector col = new CPPNameCollector(); + CPPVisitor.visitTranslationUnit( tu, col ); + + assertEquals( col.size(), 8 ); + ICPPNamespace A = (ICPPNamespace) col.getName(0).resolveBinding(); + IVariable x = (IVariable) col.getName(1).resolveBinding(); + + assertInstances( col, A, 4 ); + assertInstances( col, x, 3 ); + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CompleteParser2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CompleteParser2Tests.java index d28c73d028a..3906978ad9d 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CompleteParser2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CompleteParser2Tests.java @@ -1314,10 +1314,20 @@ public class CompleteParser2Tests extends TestCase { public void testBug44510() throws Exception { - parse( "int initialize(); " + //$NON-NLS-1$ + IASTTranslationUnit tu = parse( "int initialize(); " + //$NON-NLS-1$ "int initialize( char ){} " + //$NON-NLS-1$ "int initialize(){ return 1; } " + //$NON-NLS-1$ "void main(){ int i = initialize(); }" ); //$NON-NLS-1$ + + CPPNameCollector col = new CPPNameCollector(); + CPPVisitor.visitTranslationUnit( tu, col ); + + assertEquals( col.size(), 7 ); + IFunction init1 = (IFunction) col.getName(0).resolveBinding(); + IFunction init2 = (IFunction) col.getName(1).resolveBinding(); + + assertInstances( col, init1, 3 ); + assertInstances( col, init2, 1 ); } public void testBug44925() throws Exception @@ -1327,7 +1337,23 @@ public class CompleteParser2Tests extends TestCase { buffer.append( "class MyClass myObj1;"); //$NON-NLS-1$ buffer.append( "enum MyEnum { Item1 };"); //$NON-NLS-1$ buffer.append( "enum MyEnum myObj2;"); //$NON-NLS-1$ - parse( buffer.toString() ); + IASTTranslationUnit tu = parse( buffer.toString() ); + + CPPNameCollector col = new CPPNameCollector(); + CPPVisitor.visitTranslationUnit( tu, col ); + + assertEquals( col.size(), 7 ); + ICPPClassType myClass = (ICPPClassType) col.getName(0).resolveBinding(); + IVariable obj1 = (IVariable) col.getName(2).resolveBinding(); + IEnumeration myEnum = (IEnumeration) col.getName(3).resolveBinding(); + IEnumerator item = (IEnumerator) col.getName(4).resolveBinding(); + IVariable obj2 = (IVariable)col.getName(6).resolveBinding(); + + assertInstances( col, myClass, 2 ); + assertInstances( col, myEnum, 2 ); + assertSame( obj1.getType(), myClass ); + assertSame( obj2.getType(), myEnum ); + assertSame( item.getType(), myEnum ); } public void testBug44838() throws Exception @@ -1335,7 +1361,21 @@ public class CompleteParser2Tests extends TestCase { StringBuffer buffer = new StringBuffer(); buffer.append( "class A { int myX; A( int x ); };\n"); //$NON-NLS-1$ buffer.append( "A::A( int x ) : myX( x ) { if( x == 5 ) myX++; }\n"); //$NON-NLS-1$ - parse( buffer.toString() ); + IASTTranslationUnit tu = parse( buffer.toString() ); + + CPPNameCollector col = new CPPNameCollector(); + CPPVisitor.visitTranslationUnit( tu, col ); + + assertEquals( col.size(), 12 ); + ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding(); + ICPPField myX = (ICPPField) col.getName(1).resolveBinding(); + ICPPConstructor ctor = (ICPPConstructor) col.getName(2).resolveBinding(); + IParameter x = (IParameter) col.getName(3).resolveBinding(); + + assertInstances( col, A, 2 ); + assertInstances( col, myX, 3 ); + assertInstances( col, ctor, 3 ); + assertInstances( col, x, 4 ); } public void testBug46165() throws Exception diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPImplicitMethod.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPImplicitMethod.java index aff73356543..c5495a3edf7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPImplicitMethod.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPImplicitMethod.java @@ -39,6 +39,7 @@ public class CPPImplicitMethod extends CPPMethod { this.implicitName = name; this.parameters = params; this.returnType = returnType; + this.scope = scope; } /** diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java index 3e472af0b3f..502ef134054 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java @@ -54,10 +54,12 @@ import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldReference; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; @@ -372,7 +374,12 @@ public class CPPSemantics { } else if( parent instanceof ICPPASTBaseSpecifier ) { IASTNode n = CPPVisitor.getContainingBlockItem( parent ); return (ICPPScope) CPPVisitor.getContainingScope( n ); - } + } else if( parent instanceof ICPPASTConstructorChainInitializer ){ + ICPPASTConstructorChainInitializer initializer = (ICPPASTConstructorChainInitializer) parent; + IASTFunctionDeclarator dtor = (IASTFunctionDeclarator) initializer.getParent(); + return (ICPPScope) dtor.getName().resolveBinding().getScope(); + + } return (ICPPScope) CPPVisitor.getContainingScope( name ); } @@ -800,6 +807,10 @@ public class CPPSemantics { IASTName namespaceName = ((ICPPASTNamespaceDefinition) declaration).getName(); if( CharArrayUtils.equals( namespaceName.toCharArray(), data.name ) ) return namespaceName; + } else if( declaration instanceof ICPPASTNamespaceAlias ){ + IASTName alias = ((ICPPASTNamespaceAlias) declaration).getAlias(); + if( CharArrayUtils.equals( alias.toCharArray(), data.name ) ) + return alias; } return null; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index fec0b73608b..45b3d88b4a1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -259,6 +259,9 @@ public class CPPVisitor { return binding; } else if( declaration instanceof ICPPASTUsingDirective ){ return CPPSemantics.resolveBinding( ((ICPPASTUsingDirective) declaration).getQualifiedName() ); + } else if( declaration instanceof ICPPASTNamespaceAlias ) { + ICPPASTNamespaceAlias alias = (ICPPASTNamespaceAlias) declaration; + return CPPSemantics.resolveBinding( alias.getQualifiedName() ); } @@ -387,6 +390,12 @@ public class CPPVisitor { return ((IASTForStatement)parent).getScope(); } else if( parent instanceof IASTCompoundStatement ){ return ((IASTCompoundStatement)parent).getScope(); + } else if( parent instanceof ICPPASTConstructorChainInitializer ){ + IASTNode node = getContainingBlockItem( parent ); + if( node instanceof IASTFunctionDefinition ){ + IASTCompoundStatement body = (IASTCompoundStatement) ((IASTFunctionDefinition)node).getBody(); + return body.getScope(); + } } return getContainingScope( parent ); }