Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Applied [HEAD] partial fix for operator overloading

CORE
        Partially fixed Bug 42979 : Cannot search for operator overloaders 

 

TESTS
        Added CompleteParseASTTest::testBug42979().
        Updated CompleteParseASTTest::testAndrewsExample(). 

JohnC

Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/ChangeLog,v
retrieving revision 1.95
diff -u -r1.95 ChangeLog
--- ChangeLog	15 Sep 2003 17:31:17 -0000	1.95
+++ ChangeLog	15 Sep 2003 19:03:32 -0000
@@ -1,3 +1,7 @@
+2003-09-15 John Camelon
+	Added CompleteParseASTTest::testBug42979().
+	Updated CompleteParseASTTest::testAndrewsExample(). 
+
 2003-09-13 Andrew Niefer
 	- added testBadParameterInfo to ParserSymbolTableTest
 
Index: parser/org/eclipse/cdt/core/parser/tests/BaseASTTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/BaseASTTest.java,v
retrieving revision 1.7
diff -u -r1.7 BaseASTTest.java
--- parser/org/eclipse/cdt/core/parser/tests/BaseASTTest.java	8 Sep 2003 18:10:55 -0000	1.7
+++ parser/org/eclipse/cdt/core/parser/tests/BaseASTTest.java	15 Sep 2003 19:03:32 -0000
@@ -92,7 +92,7 @@
 	public void assertCodeFailsParse(String code) {
 		boolean testPassed = false;
 		try {
-			IASTCompilationUnit tu = parse(code);
+			parse(code);
 			testPassed = true;
 			fail( "We should not reach this point");
 		} catch (Throwable e) {
@@ -106,7 +106,7 @@
 	public void assertCodeFailsFullParse(String code) {
 		boolean testPassed = false;
 		try {
-			IASTCompilationUnit tu = fullParse(code);
+			fullParse(code);
 			testPassed = true;
 			fail( "We should not reach this point");
 		} catch (Throwable e) {
Index: parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java,v
retrieving revision 1.28
diff -u -r1.28 CompleteParseASTTest.java
--- parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java	11 Sep 2003 18:06:15 -0000	1.28
+++ parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java	15 Sep 2003 19:03:33 -0000
@@ -345,6 +345,7 @@
 		Iterator i = parse(code.toString()).getDeclarations();
 		IASTVariable instanceA = (IASTVariable)i.next();
 		assertFalse( i.hasNext() );
+		assertEquals( callback.getReferences().size(), 0 );
 	}
 	
 	public void testNestedClassname() throws Exception
@@ -744,4 +745,32 @@
 		IASTFunction foo = (IASTFunction)i.next(); 
 		assertFalse( i.hasNext() );
 	}
+	
+	
+	public void testBug42979() throws Exception
+	{
+		Writer code = new StringWriter(); 
+		code.write( "class OperatorOverload{\n" );
+		code.write( "public:\n" );
+		code.write( "  bool operator==( const class OperatorOverload& that )\n" );
+		code.write( "  { return true; }\n" );
+		code.write( "  bool operator!=( const class OperatorOverload& that );\n" );
+		code.write( "}; \n" );
+  
+		code.write( "bool OperatorOverload::operator!=( const class OperatorOverload& that )\n" );
+		code.write( "{ return false; }\n" );
+
+		Iterator i = parse( code.toString() ).getDeclarations();
+		IASTClassSpecifier classOp = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+		Iterator subDeclarations = getDeclarations(classOp);
+		IASTMethod operatorEqualsDeclaration = (IASTMethod)subDeclarations.next();
+		IASTMethod operatorNotEqualsDeclaration = (IASTMethod)subDeclarations.next();
+		IASTMethod operatorNotEqualDefinition = (IASTMethod)i.next();
+		assertEquals( operatorNotEqualDefinition.getName(), operatorNotEqualsDeclaration.getName() );
+		assertFalse( i.hasNext());
+		assertEquals( callback.getReferences().size(), 4 );
+		for( int j =0; j < 4; ++j )
+			assertFalse( classOp.getNameOffset() == ((IASTReference)callback.getReferences().get(j)).getOffset() ); 
+	}
+	
 }
Index: parser/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/ChangeLog,v
retrieving revision 1.125
diff -u -r1.125 ChangeLog
--- parser/ChangeLog	15 Sep 2003 13:20:30 -0000	1.125
+++ parser/ChangeLog	15 Sep 2003 19:02:41 -0000
@@ -1,3 +1,6 @@
+2003-09-15 John Camelon
+	Partially fixed Bug 42979 : Cannot search for operator overloaders 
+
 2003-09-12 Hoda Amer
 	In completeParseASTFactory.getExpressionResultType()
 	- Added the handling of some more expression types.
Index: parser/org/eclipse/cdt/core/parser/ast/IASTFunction.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTFunction.java,v
retrieving revision 1.7
diff -u -r1.7 IASTFunction.java
--- parser/org/eclipse/cdt/core/parser/ast/IASTFunction.java	8 Sep 2003 19:17:53 -0000	1.7
+++ parser/org/eclipse/cdt/core/parser/ast/IASTFunction.java	15 Sep 2003 19:02:42 -0000
@@ -32,5 +32,7 @@
 	 */
 	public void setHasFunctionBody(boolean b);
 	public boolean hasFunctionBody();
+	
+	public boolean previouslyDeclared();
 
 }
Index: parser/org/eclipse/cdt/internal/core/parser/Declarator.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Declarator.java,v
retrieving revision 1.9
diff -u -r1.9 Declarator.java
--- parser/org/eclipse/cdt/internal/core/parser/Declarator.java	11 Sep 2003 18:05:55 -0000	1.9
+++ parser/org/eclipse/cdt/internal/core/parser/Declarator.java	15 Sep 2003 19:02:42 -0000
@@ -326,7 +326,7 @@
      */
     public void hasFunctionBody(boolean b)
     {
-    	hasFunctionBody = true;
+    	hasFunctionBody = b;
     }
 
     /**
Index: parser/org/eclipse/cdt/internal/core/parser/Parser.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java,v
retrieving revision 1.109
diff -u -r1.109 Parser.java
--- parser/org/eclipse/cdt/internal/core/parser/Parser.java	15 Sep 2003 13:20:30 -0000	1.109
+++ parser/org/eclipse/cdt/internal/core/parser/Parser.java	15 Sep 2003 19:02:44 -0000
@@ -23,8 +23,8 @@
 import org.eclipse.cdt.core.parser.IToken;
 import org.eclipse.cdt.core.parser.ITokenDuple;
 import org.eclipse.cdt.core.parser.ITranslationResult;
-import org.eclipse.cdt.core.parser.ParserLanguage;
 import org.eclipse.cdt.core.parser.ParserFactory;
+import org.eclipse.cdt.core.parser.ParserLanguage;
 import org.eclipse.cdt.core.parser.ParserMode;
 import org.eclipse.cdt.core.parser.ScannerException;
 import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
@@ -53,6 +53,7 @@
 import org.eclipse.cdt.core.parser.ast.IASTTemplateInstantiation;
 import org.eclipse.cdt.core.parser.ast.IASTTemplateParameter;
 import org.eclipse.cdt.core.parser.ast.IASTTemplateSpecialization;
+import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier;
 import org.eclipse.cdt.core.parser.ast.IASTUsingDeclaration;
 import org.eclipse.cdt.core.parser.ast.IASTUsingDirective;
 import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier.ClassNameType;
@@ -1545,7 +1546,7 @@
         }
  
         ITokenDuple d = name();
-        IASTElaboratedTypeSpecifier elaboratedTypeSpec = null;
+		IASTTypeSpecifier elaboratedTypeSpec = null;
 		final boolean isForewardDecl = ( LT(1) == IToken.tSEMI );
 		
         try
@@ -1567,7 +1568,7 @@
         sdw.setTypeSpecifier(elaboratedTypeSpec);
         
         if( isForewardDecl )
-        	elaboratedTypeSpec.acceptElement( requestor );
+        	((IASTElaboratedTypeSpecifier)elaboratedTypeSpec).acceptElement( requestor );
     }
     /**
      * Consumes template parameters.  
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTElaboratedTypeSpecifier.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTElaboratedTypeSpecifier.java,v
retrieving revision 1.4
diff -u -r1.4 ASTElaboratedTypeSpecifier.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTElaboratedTypeSpecifier.java	14 Aug 2003 19:49:44 -0000	1.4
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTElaboratedTypeSpecifier.java	15 Sep 2003 19:02:44 -0000
@@ -26,7 +26,8 @@
  */
 public class ASTElaboratedTypeSpecifier extends ASTSymbol implements IASTElaboratedTypeSpecifier
 {
-	private final boolean isForwardDeclaration;
+	private List references;
+    private final boolean isForwardDeclaration;
     private final ASTClassKind kind;
 	private final ASTQualifiedNamedElement qualifiedName;
     private NamedOffsets offsets = new NamedOffsets();
@@ -48,7 +49,7 @@
         qualifiedName = new ASTQualifiedNamedElement( getOwnerScope(), checkSymbol.getName() );
         store = new ASTReferenceStore( references );
         isForwardDeclaration = isDecl;
-        
+        this.references = references;
     }
     /* (non-Javadoc)
      * @see org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier#getName()
@@ -138,5 +139,10 @@
 	 */
 	public void setNameOffset(int o) {
 		offsets.setNameOffset(o);
+	}
+	
+	public List getReferences() 
+	{
+		return references;
 	}
 }
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTFunction.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTFunction.java,v
retrieving revision 1.5
diff -u -r1.5 ASTFunction.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTFunction.java	8 Sep 2003 19:17:53 -0000	1.5
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTFunction.java	15 Sep 2003 19:02:44 -0000
@@ -32,7 +32,8 @@
  */
 public class ASTFunction extends ASTScope implements IASTFunction
 {
-	private boolean hasFunctionBody = false;
+	private final boolean previouslyDeclared;
+    private boolean hasFunctionBody = false;
     private final IASTTemplate ownerTemplate;
     private final IASTAbstractDeclaration returnType;
     private final IASTExceptionSpecification exception;
@@ -51,7 +52,7 @@
      * @param ownerTemplate
      * @param references
      */
-    public ASTFunction(IParameterizedSymbol symbol, List parameters, IASTAbstractDeclaration returnType, IASTExceptionSpecification exception, int startOffset, int nameOffset, IASTTemplate ownerTemplate, List references)
+    public ASTFunction(IParameterizedSymbol symbol, List parameters, IASTAbstractDeclaration returnType, IASTExceptionSpecification exception, int startOffset, int nameOffset, IASTTemplate ownerTemplate, List references, boolean previouslyDeclared )
     {
     	super( symbol );
     	this.parameters = parameters;
@@ -63,6 +64,7 @@
     	this.ownerTemplate = ownerTemplate;
     	this.references = new ASTReferenceStore( references );
     	qualifiedName = new ASTQualifiedNamedElement( getOwnerScope(), symbol.getName() );
+    	this.previouslyDeclared =previouslyDeclared;
     }
 
 
@@ -249,5 +251,14 @@
     {
         return ( getSymbol().getContainingSymbol().getASTExtension().getPrimaryDeclaration() ) instanceof IASTCodeScope ? 
 			(IASTCodeScope) getSymbol().getContainingSymbol().getASTExtension().getPrimaryDeclaration()  : null;
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.eclipse.cdt.core.parser.ast.IASTFunction#previouslyDeclared()
+     */
+    public boolean previouslyDeclared()
+    {
+        return previouslyDeclared;
     }
 }
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTMethod.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTMethod.java,v
retrieving revision 1.5
diff -u -r1.5 ASTMethod.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTMethod.java	14 Aug 2003 15:33:27 -0000	1.5
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTMethod.java	15 Sep 2003 19:02:44 -0000
@@ -45,7 +45,7 @@
      * @param ownerTemplate
      * @param references
      */
-    public ASTMethod(IParameterizedSymbol symbol, List parameters, IASTAbstractDeclaration returnType, IASTExceptionSpecification exception, int startOffset, int nameOffset, IASTTemplate ownerTemplate, List references, 
+    public ASTMethod(IParameterizedSymbol symbol, List parameters, IASTAbstractDeclaration returnType, IASTExceptionSpecification exception, int startOffset, int nameOffset, IASTTemplate ownerTemplate, List references, boolean previouslyDeclared, 
 	boolean isConstructor, boolean isDestructor, boolean isPureVirtual, ASTAccessVisibility visibility, List constructorChain )
     {
         super(
@@ -56,7 +56,7 @@
             startOffset,
             nameOffset,
             ownerTemplate,
-            references);
+            references, previouslyDeclared );
         this.visibility = visibility; 
         this.isConstructor = isConstructor;
         this.isDestructor = isDestructor;
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java,v
retrieving revision 1.37
diff -u -r1.37 CompleteParseASTFactory.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java	15 Sep 2003 13:20:30 -0000	1.37
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java	15 Sep 2003 19:02:46 -0000
@@ -425,9 +425,13 @@
 		ISymbolASTExtension extension = symbol.getASTExtension();
 		if( extension == null )
 		{
-			if( astSymbol instanceof IASTNamespaceDefinition )
+			if( astSymbol instanceof IASTNamespaceDefinition || 
+				astSymbol instanceof IASTEnumerationSpecifier || 
+				astSymbol instanceof IASTClassSpecifier || 
+				astSymbol instanceof IASTElaboratedTypeSpecifier )
+
 				extension = new NamespaceSymbolExtension( symbol, astSymbol );
-			else if( astSymbol instanceof IASTFunction ) // TODO : other foreward declare cases
+			else if( astSymbol instanceof IASTFunction || astSymbol instanceof IASTMethod )
 			{
 				extension = new ForewardDeclaredSymbolExtension( symbol, astSymbol );
 			}
@@ -1351,7 +1355,7 @@
 		setParameters( symbol, references, parameters.iterator() );
 		 
 		symbol.setIsForwardDeclaration(!isFunctionDefinition);
-		
+		boolean previouslyDeclared = false;
 		if( isFunctionDefinition )
 		{
 			List functionParameters = new LinkedList();
@@ -1371,6 +1375,7 @@
 			if( functionDeclaration != null )
 			{
 				functionDeclaration.setTypeSymbol( symbol );
+				previouslyDeclared = true;
 			}
 		}
 		
@@ -1382,7 +1387,7 @@
 		{
 			throw new ASTSemanticException();   
 		}
-		ASTFunction function = new ASTFunction( symbol, parameters, returnType, exception, startOffset, nameOffset, ownerTemplate, references );        
+		ASTFunction function = new ASTFunction( symbol, parameters, returnType, exception, startOffset, nameOffset, ownerTemplate, references, previouslyDeclared );        
 	    try
 	    {
 	        attachSymbolExtension(symbol, function);
@@ -1491,13 +1496,20 @@
 		List newReferences = null; 
 	    if( absDecl.getTypeSpecifier() instanceof IASTSimpleTypeSpecifier ) 
 	    {
-	    	IASTSimpleTypeSpecifier.Type kind = ((IASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getType();
-	   		if( kind == IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME )
+	   		if( ((IASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getType() == IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME )
 	    	{
 	    		xrefSymbol = ((ASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getSymbol(); 
 	    		newReferences = ((ASTSimpleTypeSpecifier)absDecl.getTypeSpecifier()).getReferences();
 	    	}
 	    }
+	    else if( absDecl.getTypeSpecifier() instanceof ASTElaboratedTypeSpecifier )
+	    {
+	    	ASTElaboratedTypeSpecifier elab = (ASTElaboratedTypeSpecifier)absDecl.getTypeSpecifier();
+	    	xrefSymbol = elab.getSymbol();
+	    	newReferences = new ArrayList(); 
+	    	newReferences.addAll( elab.getReferences() );
+	    	newReferences.add( createReference( xrefSymbol, elab.getName(), elab.getNameOffset()) );  
+	    }
 	    
 	    String paramName = "";
 	    if(absDecl instanceof IASTParameterDeclaration){
@@ -1654,8 +1666,10 @@
 			throw new ASTSemanticException();   
 		}
 
+		boolean previouslyDeclared = false; 
+		//TODO : Hoda - if symbol was previously declared in PST, then set this to true
   
-        ASTMethod method = new ASTMethod( symbol, parameters, returnType, exception, startOffset, nameOffset, ownerTemplate, references, isConstructor, isDestructor, isPureVirtual, visibility, constructorChain );
+        ASTMethod method = new ASTMethod( symbol, parameters, returnType, exception, startOffset, nameOffset, ownerTemplate, references, previouslyDeclared, isConstructor, isDestructor, isPureVirtual, visibility, constructorChain );
         try
         {
             attachSymbolExtension( symbol, method );
@@ -1984,10 +1998,31 @@
                 	throw new ASTSemanticException();
                 }
 			}
+			return (IASTElaboratedTypeSpecifier)checkSymbol.getASTExtension().getPrimaryDeclaration();
  		}
-
-
-		return (IASTElaboratedTypeSpecifier)checkSymbol.getASTExtension().getPrimaryDeclaration();
+		else
+		{	
+			if( checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTClassSpecifier ||
+			    checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTEnumerationSpecifier 
+			)
+			{
+				ASTElaboratedTypeSpecifier elab = new ASTElaboratedTypeSpecifier( checkSymbol, kind, startingOffset, name.getFirstToken().getOffset(), endOffset, references, isForewardDecl );
+				try
+				{
+					attachSymbolExtension( checkSymbol, elab );
+				}
+				catch (ExtensionException e2)
+				{
+					throw new ASTSemanticException();
+				}
+				return elab;
+			}
+			if( checkSymbol.getASTExtension().getPrimaryDeclaration() instanceof IASTElaboratedTypeSpecifier )
+				return (IASTElaboratedTypeSpecifier)checkSymbol.getASTExtension().getPrimaryDeclaration();
+	
+		}
+		
+		throw new ASTSemanticException();
     }
 
     protected ParserSymbolTable pst;
Index: parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTFunction.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTFunction.java,v
retrieving revision 1.9
diff -u -r1.9 ASTFunction.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTFunction.java	8 Sep 2003 19:17:53 -0000	1.9
+++ parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTFunction.java	15 Sep 2003 19:02:46 -0000
@@ -218,4 +218,12 @@
     {
     	return null;
     }
+    /* (non-Javadoc)
+     * @see org.eclipse.cdt.core.parser.ast.IASTFunction#previouslyDeclared()
+     */
+    public boolean previouslyDeclared()
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
 }

Back to the top