From 3e388658d9e1c0e777f457d06b13799580dc9c4f Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Wed, 7 Jul 2004 21:54:23 +0000 Subject: [PATCH] Bug 61800: Lookup failing on definition of static field fix problems with forward declarations of static fields/variables. --- .../failedTests/SelectionParseFailedTest.java | 18 +---------------- .../tests/CompleteParseASTTemplateTest.java | 2 +- .../core/parser/tests/SelectionParseTest.java | 16 +++++++++++++++ .../core/suite/AutomatedIntegrationSuite.java | 2 -- .../ast/complete/CompleteParseASTFactory.java | 20 +++++++++++++++---- .../core/parser/pst/BasicTypeInfo.java | 5 ++++- .../core/parser/pst/ParserSymbolTable.java | 6 +++++- .../core/parser/token/BasicTokenDuple.java | 3 +++ 8 files changed, 46 insertions(+), 26 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/SelectionParseFailedTest.java b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/SelectionParseFailedTest.java index 8a0f63b4d44..7d0b8a9bb7d 100644 --- a/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/SelectionParseFailedTest.java +++ b/core/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/SelectionParseFailedTest.java @@ -9,10 +9,6 @@ * IBM Rational Software - Initial API and implementation */ package org.eclipse.cdt.core.parser.failedTests; -import java.io.StringWriter; -import java.io.Writer; - -import org.eclipse.cdt.core.parser.ast.IASTNode; import org.eclipse.cdt.core.parser.tests.SelectionParseBaseTest; /** @@ -21,18 +17,6 @@ import org.eclipse.cdt.core.parser.tests.SelectionParseBaseTest; */ public class SelectionParseFailedTest extends SelectionParseBaseTest { - public void testBug61800() throws Exception - { - Writer writer = new StringWriter(); - writer.write( "class ABCDEF {\n"); //$NON-NLS-1$ - writer.write( " static int stInt; };\n"); //$NON-NLS-1$ - writer.write( "int ABCDEF::stInt = 5;\n"); //$NON-NLS-1$ - String code = writer.toString(); - int startIndex = code.indexOf( "::stInt") + 2; //$NON-NLS-1$ - IASTNode node = parse( code, startIndex, startIndex+ 5, false ); -// IASTNode node = parse( code, startIndex, startIndex+ 5 ); -// assertTrue( node instanceof IASTField ); -// assertEquals( ((IASTField)node).getName(), "stInt" ); //$NON-NLS-1$ - } + } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.java index 9066ad93674..0569a844195 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTemplateTest.java @@ -532,7 +532,7 @@ public class CompleteParseASTTemplateTest extends CompleteParseBaseTest { Writer writer = new StringWriter(); writer.write( "template< class T > class A{ \n" ); //$NON-NLS-1$ writer.write( " typedef T * PT; \n" ); //$NON-NLS-1$ - writer.write( " static T member; \n" ); //$NON-NLS-1$ + writer.write( " static T * member; \n" ); //$NON-NLS-1$ writer.write( "}; \n" ); //$NON-NLS-1$ writer.write( "template< class T> A::PT A::member = null; \n" ); //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java index dabe5d3bb4d..baa656679c1 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java @@ -14,6 +14,7 @@ import java.io.StringWriter; import java.io.Writer; import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; +import org.eclipse.cdt.core.parser.ast.IASTField; import org.eclipse.cdt.core.parser.ast.IASTFunction; import org.eclipse.cdt.core.parser.ast.IASTMethod; import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition; @@ -331,4 +332,19 @@ public class SelectionParseTest extends SelectionParseBaseTest { int startIndex = code.indexOf( "static_function( file )"); //$NON-NLS-1$ parse( code, startIndex, startIndex + "static_function".length() ); //$NON-NLS-1$ } + + public void testBug61800() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "class B {};\n"); //$NON-NLS-1$ + writer.write( "class ABCDEF {\n"); //$NON-NLS-1$ + writer.write( " static B stInt; };\n"); //$NON-NLS-1$ + writer.write( "B ABCDEF::stInt = 5;\n"); //$NON-NLS-1$ + String code = writer.toString(); + int startIndex = code.indexOf( "::stInt") + 2; //$NON-NLS-1$ + + IASTNode node = parse( code, startIndex, startIndex+ 5 ); + assertTrue( node instanceof IASTField ); + assertEquals( ((IASTField)node).getName(), "stInt" ); //$NON-NLS-1$ + } } diff --git a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java index 27bc6c8f757..b9c55e58de8 100644 --- a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java +++ b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java @@ -21,7 +21,6 @@ import org.eclipse.cdt.core.model.tests.WorkingCopyTests; import org.eclipse.cdt.core.parser.failedTests.ASTFailedTests; import org.eclipse.cdt.core.parser.failedTests.FailedCompleteParseASTTest; import org.eclipse.cdt.core.parser.failedTests.STLFailedTests; -import org.eclipse.cdt.core.parser.failedTests.SelectionParseFailedTest; import org.eclipse.cdt.core.parser.tests.ParserTestSuite; import org.eclipse.cdt.core.search.tests.SearchTestSuite; @@ -71,7 +70,6 @@ public class AutomatedIntegrationSuite extends TestSuite { suite.addTestSuite(ASTFailedTests.class); suite.addTestSuite(STLFailedTests.class); suite.addTestSuite(FailedCompleteParseASTTest.class); - suite.addTestSuite(SelectionParseFailedTest.class); return suite; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java index ea7734b58f4..53156413f91 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java @@ -2706,12 +2706,18 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto if( variableDeclaration != null && newSymbol.getType() == variableDeclaration.getType() ) { - if( !newSymbol.isType( ITypeInfo.t_type ) || - (newSymbol.isType( ITypeInfo.t_type ) && newSymbol.getTypeSymbol() != variableDeclaration.getTypeSymbol() ) ) + TypeInfoProvider provider = pst.getTypeInfoProvider(); + + ITypeInfo newInfo = newSymbol.getTypeInfo().getFinalType( provider ); + ITypeInfo varInfo = variableDeclaration.getTypeInfo().getFinalType( provider ); + + if( newInfo.equals( varInfo ) ) { variableDeclaration.setForwardSymbol( newSymbol ); previouslyDeclared = true; } + provider.returnTypeInfo( newInfo ); + provider.returnTypeInfo( varInfo ); } } try @@ -2934,8 +2940,12 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto if( fieldDeclaration != null && newSymbol.getType() == fieldDeclaration.getType() ) { - if( !newSymbol.isType( ITypeInfo.t_type ) || - (newSymbol.isType( ITypeInfo.t_type ) && newSymbol.getTypeSymbol() != fieldDeclaration.getTypeSymbol() ) ) + TypeInfoProvider provider = pst.getTypeInfoProvider(); + + ITypeInfo newInfo = newSymbol.getTypeInfo().getFinalType( provider ); + ITypeInfo fieldInfo = fieldDeclaration.getTypeInfo().getFinalType( provider ); + + if( newInfo.equals( fieldInfo ) ) { previouslyDeclared = true; fieldDeclaration.setForwardSymbol( newSymbol ); @@ -2943,6 +2953,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto // ASTReference reference = (ASTReference) fieldReferences.iterator().next(); visibility = ((IASTField)fieldDeclaration.getASTExtension().getPrimaryDeclaration()).getVisiblity(); } + provider.returnTypeInfo( newInfo ); + provider.returnTypeInfo( fieldInfo ); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/BasicTypeInfo.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/BasicTypeInfo.java index 504d56f2c6a..be73e9be07e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/BasicTypeInfo.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/BasicTypeInfo.java @@ -202,7 +202,10 @@ public class BasicTypeInfo implements ITypeInfo { ITypeInfo type = (ITypeInfo)t; - boolean result = ( _typeBits == type.getTypeBits() ); + int bits1 = _typeBits & ~isTypedef & ~isForward & ~isStatic & ~isExtern; + int bits2 = type.getTypeBits() & ~isTypedef & ~isForward & ~isStatic & ~isExtern; + boolean result = ( bits1 == bits2 ); + result &= ( _type == type.getType() ); // Object def1 = getDefault(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java index 32f53d59df5..6395811aa94 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java @@ -526,7 +526,11 @@ public class ParserSymbolTable { if( obj == null ){ obj = foundSymbol; } else { - if( data.isPrefixLookup() ){ + if( obj.isForwardDeclaration() && obj.getForwardSymbol() == foundSymbol ) + obj = foundSymbol; + else if( foundSymbol.isForwardDeclaration() && foundSymbol.getForwardSymbol() == obj ){ + //we already have what we want. + } else if( data.isPrefixLookup() ){ data.addAmbiguity( foundSymbol.getName() ); } else { throw new ParserSymbolTableException( ParserSymbolTableException.r_Ambiguous ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java index e361b595d0f..2d3a344279b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java @@ -464,6 +464,9 @@ public class BasicTokenDuple implements ITokenDuple { } i = i.getNext(); } + if( i.getType() == IToken.tIDENTIFIER ){ + qn.add( i.getImage() ); + } String [] qualifiedName = new String[ qn.size() ]; return (String[]) qn.toArray( qualifiedName ); }