From 10a5054abeaba887c020a18d96808bc8465f086b Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Wed, 2 Feb 2005 22:18:42 +0000 Subject: [PATCH] fixing bug 84186 --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 23 +++++++++++++++++++ .../core/dom/parser/c/CStructure.java | 18 +++++++++++++-- .../internal/core/dom/parser/c/CVisitor.java | 20 ++++++++++++++-- 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index e66464ba54f..81646e0ed29 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -2718,4 +2718,27 @@ public class AST2Tests extends AST2BaseTest { public void testBug84250() throws Exception { assertTrue( ((IASTDeclarationStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) parse( "void f() { int (*p) [2]; }", ParserLanguage.C ).getDeclarations()[0]).getBody()).getStatements()[0]).getDeclaration() instanceof IASTSimpleDeclaration ); //$NON-NLS-1$ } + + public void testBug84186() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "struct s1 { struct s2 *s2p; /* ... */ }; // D1 \n"); //$NON-NLS-1$ + buffer.append( "struct s2 { struct s1 *s1p; /* ... */ }; // D2 \n"); //$NON-NLS-1$ + + IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C); + CNameCollector col = new CNameCollector(); + CVisitor.visitTranslationUnit(tu, col); + + assertEquals(col.size(), 6); + + ICompositeType s_ref = (ICompositeType) col.getName(1).resolveBinding(); + ICompositeType s_decl = (ICompositeType) col.getName(3).resolveBinding(); + + assertSame( s_ref, s_decl ); + CVisitor.clearBindings( tu ); + + s_decl = (ICompositeType) col.getName(3).resolveBinding(); + s_ref = (ICompositeType) col.getName(1).resolveBinding(); + + assertSame( s_ref, s_decl ); + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CStructure.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CStructure.java index 8b63ca2719f..9146778a7a0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CStructure.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CStructure.java @@ -11,6 +11,7 @@ **********************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.c; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; @@ -26,6 +27,7 @@ import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.c.ICASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.c.ICCompositeTypeScope; /** * Created on Nov 8, 2004 @@ -75,9 +77,13 @@ public class CStructure implements ICompositeType, ICBinding { /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IBinding#getScope() */ - public IScope getScope() { + public IScope getScope() throws DOMException { IASTDeclSpecifier declSpec = (IASTDeclSpecifier) ( ( definition != null ) ? (IASTNode)definition : declarations[0] ); - return CVisitor.getContainingScope( declSpec ); + IScope scope = CVisitor.getContainingScope( declSpec ); + while( scope instanceof ICCompositeTypeScope ){ + scope = scope.getParent(); + } + return scope; } /* (non-Javadoc) @@ -168,4 +174,12 @@ public class CStructure implements ICompositeType, ICBinding { } return t; } + + /** + * @param compositeTypeSpec + */ + public void addDefinition(ICASTCompositeTypeSpecifier compositeTypeSpec) { + definition = compositeTypeSpec; + ((CASTName)compositeTypeSpec.getName()).setBinding( this ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java index 9555be8c4af..2b1b7ad0be9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java @@ -92,6 +92,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTPointer; import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICASTTypeIdInitializerExpression; import org.eclipse.cdt.core.dom.ast.c.ICASTTypedefNameSpecifier; +import org.eclipse.cdt.core.dom.ast.c.ICCompositeTypeScope; import org.eclipse.cdt.core.dom.ast.c.ICFunctionScope; import org.eclipse.cdt.core.dom.ast.c.ICScope; import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression; @@ -770,8 +771,23 @@ public class CVisitor { private static IBinding createBinding( ICASTCompositeTypeSpecifier compositeTypeSpec ){ - ICompositeType binding = new CStructure( compositeTypeSpec ); - ICScope scope; + ICScope scope = null; + IBinding binding = null; + try { + scope = (ICScope) getContainingScope( compositeTypeSpec ); + while( scope instanceof ICCompositeTypeScope ) + scope = (ICScope) scope.getParent(); + + binding = scope.getBinding( ICScope.NAMESPACE_TYPE_TAG, compositeTypeSpec.getName().toCharArray() ); + if( binding != null ){ + ((CStructure)binding).addDefinition( compositeTypeSpec ); + return binding; + } + } catch (DOMException e2) { + } + + binding = new CStructure( compositeTypeSpec ); + try { scope = (ICScope) binding.getScope(); scope.addBinding( binding );