[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Resubmitted : Re: REJECTED Re: [cdt-patch] Fix ParserSymbolTable bugs
|
I feel shame.
The symbol table changes should have had no affect on the search results.
However, the symbol table test project includes a file mail.cpp that never
parsed very well because of the inclusion of a number of system includes
as well as the presence of lots of expressions.
It seems that with this patch, the parsing of expressions has improved
enough so that we are getting more search results out of it, including one
additional unforseen parameter reference.
I have removed this file from the search test project until such time that
tests are actually written to test it.
-Andrew
John Camelon/Ottawa/IBM@IBMCA
Sent by: cdt-patch-admin@xxxxxxxxxxx
09/18/2003 04:26 PM
Please respond to
cdt-patch@xxxxxxxxxxx
To
cdt-patch@xxxxxxxxxxx
cc
Subject
REJECTED Re: [cdt-patch] Fix ParserSymbolTable bugs
1 JUnit failure in Search ... please fix.
junit.framework.AssertionFailedError: expected:<4> but was:<3>
at junit.framework.Assert.fail(Assert.java:47)
at junit.framework.Assert.failNotEquals(Assert.java:282)
at junit.framework.Assert.assertEquals(Assert.java:64)
at junit.framework.Assert.assertEquals(Assert.java:201)
at junit.framework.Assert.assertEquals(Assert.java:207)
at
org.eclipse.cdt.core.search.tests.OtherPatternTests.testParameterReferences(OtherPatternTests.java:238)
at java.lang.reflect.Method.invoke(Native Method)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at
org.eclipse.cdt.core.suite.AutomatedIntegrationSuite.run(AutomatedIntegrationSuite.java:116)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:392)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:276)
at
org.eclipse.pde.internal.junit.ui.RemotePluginTestRunner.main(RemotePluginTestRunner.java:30)
at
org.eclipse.pde.internal.junit.ui.UITestApplication.runEventLoop(UITestApplication.java:35)
at org.eclipse.ui.internal.Workbench.run(Workbench.java:1385)
at
org.eclipse.core.internal.boot.InternalBootLoader.run(InternalBootLoader.java:845)
at org.eclipse.core.boot.BootLoader.run(BootLoader.java:431)
at EclipseRuntimeLauncher.main(EclipseRuntimeLauncher.java:24)
JohnC
cdt-patch-admin@xxxxxxxxxxx wrote on 09/18/2003 02:58:51 PM:
> Core :
> - modified Symbol table interfaces to use List & Map instead of
> LinkedList and HashMap
> - fixed warnings in ParserSymbolTable
> - fixed bug43106 - Symbol Table support needed to resolve types
> - fixed bug43156 - require ability to add implicit inheritance
> copy constructor
> - fixed bug43159 - TypeInfo.equals() not working properly
> - fixed bug43238 - Postfix_Subscript expressions confuse
function
> resolution
>
> Tests:
> - removed testConditionalExpression_Bug43159 from
> FailedCompleteParseASTExpressionTest
> and uncommented it (testConditionalExpression) in
> CompleteParseASTExpressionTest
> - uncommented the following tests in
> CompleteParseASTExpressionTest :
> testPostfixSubscript,
> testPostfixSubscriptA,
> testPostfixSubscriptB,
> testPostfixSubscriptWithReferences
> - updated ParserSymbolTableTests to use new
addOperatorExpression
> function
> - added testDerivedReference, testAddCopyConstructor to
> ParserSymbolTableTests
> - fixed warning in ClassDeclarationPatternTests
>
> Andrew
>
> [attachment "pst_patch_09.18.03(cdt.core).txt" deleted by John
> Camelon/Ottawa/IBM] [attachment "pst_patch_09.18.03(cdt.core.tests).
> txt" deleted by John Camelon/Ottawa/IBM]
_______________________________________________
cdt-patch mailing list
cdt-patch@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/cdt-patch
Index: parser/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/ChangeLog,v
retrieving revision 1.132
diff -u -r1.132 ChangeLog
--- parser/ChangeLog 18 Sep 2003 15:22:48 -0000 1.132
+++ parser/ChangeLog 18 Sep 2003 18:47:05 -0000
@@ -1,3 +1,11 @@
+2003-09-18 Andrew Niefer
+ - modified Symbol table interfaces to use Lists & Maps instead of LinkedList and HashMap
+ - fixed warnings in ParserSymbolTable
+ - fixed bug43106 - Symbol Table support needed to resolve types
+ - fixed bug43156 - require ability to add implicit inheritance copy constructor
+ - fixed bug43159 - TypeInfo.equals() not working properly
+ - fixed bug43238 - Postfix_Subscript expressions confuse function resolution
+
2003-09-16 Andrew Niefer
- added setThrowExceptionOnBadCharacterRead to IScanner to help with wildcard bug43063
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.42
diff -u -r1.42 CompleteParseASTFactory.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java 18 Sep 2003 15:22:48 -0000 1.42
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java 18 Sep 2003 18:47:06 -0000
@@ -1058,7 +1058,7 @@
if( lhsResult.iterator().hasNext())
info = (TypeInfo)lhsResult.iterator().next();
if ((info != null) && (info.getTypeSymbol() != null)){
- info.addPtrOperator(new TypeInfo.PtrOp(TypeInfo.PtrOp.t_reference));
+ info.addOperatorExpression( TypeInfo.OperatorExpression.addressof );
}
result.add(info);
return result;
@@ -1069,22 +1069,22 @@
if( lhsResult.iterator().hasNext())
info = (TypeInfo)lhsResult.iterator().next();
if ((info != null)&& (info.getTypeSymbol() != null)){
- info.addPtrOperator(new TypeInfo.PtrOp(TypeInfo.PtrOp.t_pointer));
+ info.addOperatorExpression( TypeInfo.OperatorExpression.indirection );
}
result.add(info);
return result;
}
// subscript
-// if (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_SUBSCRIPT){
-// List lhsResult = ((ASTExpression)expression.getLHSExpression()).getResultType();
-// if( lhsResult.iterator().hasNext())
-// info = (TypeInfo)lhsResult.iterator().next();
-// if ((info != null) && (info.getTypeSymbol() != null)){
-// info.addPtrOperator(new TypeInfo.PtrOp(TypeInfo.PtrOp.t_pointer));
-// }
-// result.add(info);
-// return result;
-// }
+ if (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_SUBSCRIPT){
+ List lhsResult = ((ASTExpression)expression.getLHSExpression()).getResultType();
+ if( lhsResult.iterator().hasNext())
+ info = (TypeInfo)lhsResult.iterator().next();
+ if ((info != null) && (info.getTypeSymbol() != null)){
+ info.addOperatorExpression( TypeInfo.OperatorExpression.subscript );
+ }
+ result.add(info);
+ return result;
+ }
// the dot and the arrow resolves to the type of the member
if ((expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_DOT_IDEXPRESSION)
|| (expression.getExpressionKind() == IASTExpression.Kind.POSTFIX_ARROW_IDEXPRESSION)
@@ -1105,7 +1105,7 @@
if( rhsResult.iterator().hasNext())
info = (TypeInfo)rhsResult.iterator().next();
if (info != null){
- info.addPtrOperator(new TypeInfo.PtrOp(TypeInfo.PtrOp.t_pointer));
+ info.addOperatorExpression( TypeInfo.OperatorExpression.indirection );
}
if(symbol != null){
info.setTypeSymbol(symbol);
@@ -1119,7 +1119,7 @@
{
info.setType(TypeInfo.t_type);
info.setTypeSymbol(symbol);
- info.addPtrOperator(new TypeInfo.PtrOp(TypeInfo.PtrOp.t_reference));
+ info.addOperatorExpression( TypeInfo.OperatorExpression.addressof );
result.add(info);
return result;
}
Index: parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java,v
retrieving revision 1.5
diff -u -r1.5 IContainerSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java 28 Aug 2003 15:50:31 -0000 1.5
+++ parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java 18 Sep 2003 18:47:06 -0000
@@ -16,7 +16,6 @@
*/
package org.eclipse.cdt.internal.core.parser.pst;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -47,9 +46,9 @@
public IContainerSymbol lookupNestedNameSpecifier( String name ) throws ParserSymbolTableException;
public ISymbol qualifiedLookup( String name ) throws ParserSymbolTableException;
public ISymbol qualifiedLookup( String name, TypeInfo.eType t ) throws ParserSymbolTableException;
- public IParameterizedSymbol unqualifiedFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException;
- public IParameterizedSymbol memberFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException;
- public IParameterizedSymbol qualifiedFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException;
- public TemplateInstance templateLookup( String name, LinkedList arguments ) throws ParserSymbolTableException;
- public TemplateInstance instantiate( LinkedList arguments ) throws ParserSymbolTableException;
+ public IParameterizedSymbol unqualifiedFunctionLookup( String name, List parameters ) throws ParserSymbolTableException;
+ public IParameterizedSymbol memberFunctionLookup( String name, List parameters ) throws ParserSymbolTableException;
+ public IParameterizedSymbol qualifiedFunctionLookup( String name, List parameters ) throws ParserSymbolTableException;
+ public TemplateInstance templateLookup( String name, List arguments ) throws ParserSymbolTableException;
+ public TemplateInstance instantiate( List arguments ) throws ParserSymbolTableException;
}
Index: parser/org/eclipse/cdt/internal/core/parser/pst/IDerivableContainerSymbol.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IDerivableContainerSymbol.java,v
retrieving revision 1.5
diff -u -r1.5 IDerivableContainerSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/IDerivableContainerSymbol.java 7 Aug 2003 14:46:58 -0000 1.5
+++ parser/org/eclipse/cdt/internal/core/parser/pst/IDerivableContainerSymbol.java 18 Sep 2003 18:47:06 -0000
@@ -16,7 +16,6 @@
*/
package org.eclipse.cdt.internal.core.parser.pst;
-import java.util.LinkedList;
import java.util.List;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
@@ -35,13 +34,15 @@
public boolean hasParents();
public void addConstructor( IParameterizedSymbol constructor ) throws ParserSymbolTableException;
- public IParameterizedSymbol lookupConstructor( LinkedList parameters ) throws ParserSymbolTableException;
- public LinkedList getConstructors();
+ public void addCopyConstructor() throws ParserSymbolTableException;
+ public IParameterizedSymbol lookupConstructor( List parameters ) throws ParserSymbolTableException;
+ public List getConstructors();
public interface IParentSymbol{
public void setParent( ISymbol parent );
public ISymbol getParent();
public boolean isVirtual();
public void setVirtual( boolean virtual );
+ public ASTAccessVisibility getVisibility();
}
}
Index: parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java,v
retrieving revision 1.3
diff -u -r1.3 IParameterizedSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java 22 Jul 2003 22:02:20 -0000 1.3
+++ parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java 18 Sep 2003 18:47:06 -0000
@@ -16,8 +16,8 @@
*/
package org.eclipse.cdt.internal.core.parser.pst;
-import java.util.HashMap;
-import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
/**
@@ -33,12 +33,12 @@
public void addParameter( ISymbol typeSymbol, TypeInfo.PtrOp ptrOp, boolean hasDefault );
public void addArgument( ISymbol arg );
- public LinkedList getArgumentList();
- public void setArgumentList( LinkedList list );
+ public List getArgumentList();
+ public void setArgumentList( List list );
- public HashMap getParameterMap();
- public LinkedList getParameterList();
- public void setParameterList( LinkedList list );
+ public Map getParameterMap();
+ public List getParameterList();
+ public void setParameterList( List list );
public boolean hasSameParameters(IParameterizedSymbol newDecl);
@@ -47,5 +47,5 @@
public boolean hasSpecializations();
public void addSpecialization( IParameterizedSymbol spec );
- public LinkedList getSpecializations();
+ public List getSpecializations();
}
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ISymbol.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ISymbol.java,v
retrieving revision 1.6
diff -u -r1.6 ISymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ISymbol.java 1 Aug 2003 17:43:10 -0000 1.6
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ISymbol.java 18 Sep 2003 18:47:06 -0000
@@ -10,8 +10,8 @@
***********************************************************************/
package org.eclipse.cdt.internal.core.parser.pst;
-import java.util.HashMap;
-import java.util.LinkedList;
+import java.util.Map;
+import java.util.List;
import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.TemplateInstance;
/**
@@ -45,40 +45,15 @@
public void setIsForwardDeclaration( boolean forward );
public int compareCVQualifiersTo( ISymbol symbol );
- public LinkedList getPtrOperators();
+ public List getPtrOperators();
public void addPtrOperator( TypeInfo.PtrOp ptrOp );
public boolean isTemplateMember();
public void setIsTemplateMember( boolean isMember );
public ISymbol getTemplateInstance();
- public HashMap getArgumentMap();
+ public Map getArgumentMap();
public void setTemplateInstance( TemplateInstance instance );
-
- /*public interface ITypeInfo {
- public boolean checkBit(int mask);
- public void setBit(boolean b, int mask);
- public boolean isType( int type );
- public boolean isType( int type, int upperType );
- public int getType();
- public ISymbol getTypeSymbol();
-
- public int getCVQualifier();
- public void addCVQualifier( int cvQual );
- public String getPtrOperator();
- public void addPtrOperator( String ptrOp );
- public void setType(int i);
- public void setTypeSymbol(ISymbol typeSymbol);
-
- public int getTypeInfo();
- public void setTypeInfo( int typeInfo );
- public void setPtrOperator(String string);
- public boolean canHold(ITypeInfo src);
- public String getInvertedPtrOperator();
- public void setCVQualifier(int i);
- public boolean getHasDefault();
- public void setHasDefault(boolean hasDefault);
- }
- */
+
public int getDepth();
/**
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java,v
retrieving revision 1.20
diff -u -r1.20 ParserSymbolTable.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java 15 Sep 2003 21:50:00 -0000 1.20
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java 18 Sep 2003 18:47:06 -0000
@@ -24,6 +24,7 @@
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
+import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.PtrOp;
/**
* @author aniefer
@@ -31,12 +32,15 @@
public class ParserSymbolTable {
+ public static final String EMPTY_NAME = ""; //$NON-NLS-1$
+ public static final String THIS = "this"; //$NON-NLS-1$
+
/**
* Constructor for ParserSymbolTable.
*/
public ParserSymbolTable( ParserLanguage language ) {
super();
- _compilationUnit = new Declaration("");
+ _compilationUnit = new Declaration(EMPTY_NAME);
_compilationUnit.setType( TypeInfo.t_namespace );
_language = language;
}
@@ -346,7 +350,7 @@
}
List scopes = container.getParents();
- boolean foundSomething = false;
+
ISymbol temp = null;
ISymbol symbol = null;
@@ -472,9 +476,9 @@
return false;
}
- protected static boolean isValidOverload( LinkedList origList, ISymbol newSymbol ){
+ protected static boolean isValidOverload( List origList, ISymbol newSymbol ){
if( origList.size() == 1 ){
- return isValidOverload( (ISymbol)origList.getFirst(), newSymbol );
+ return isValidOverload( (ISymbol)origList.iterator().next(), newSymbol );
} else if ( origList.size() > 1 ){
//the first thing can be a class-name or enumeration name, but the rest
@@ -667,7 +671,7 @@
}
}
- static protected IParameterizedSymbol resolveFunction( LookupData data, LinkedList functions ) throws ParserSymbolTableException{
+ static protected IParameterizedSymbol resolveFunction( LookupData data, List functions ) throws ParserSymbolTableException{
if( functions == null ){
return null;
}
@@ -683,7 +687,7 @@
if( numFns == 0 ){
return null;
} else if ( numFns == 1 ){
- return (IParameterizedSymbol)functions.getFirst();
+ return (IParameterizedSymbol)functions.iterator().next();
} else{
throw new ParserSymbolTableException( ParserSymbolTableException.r_Ambiguous );
}
@@ -805,7 +809,7 @@
return bestFn;
}
- static private void reduceToViable( LookupData data, LinkedList functions ){
+ static private void reduceToViable( LookupData data, List functions ){
int numParameters = ( data.parameters == null ) ? 0 : data.parameters.size();
int num;
@@ -930,7 +934,11 @@
*
* TBD: Consider rewriting iteratively for performance.
*/
- static private int hasBaseClass( ISymbol obj, ISymbol base ){
+ static private int hasBaseClass( ISymbol obj, ISymbol base ) throws ParserSymbolTableException {
+ return hasBaseClass( obj, base, false );
+ }
+
+ static private int hasBaseClass( ISymbol obj, ISymbol base, boolean throwIfNotVisible ) throws ParserSymbolTableException{
if( obj == base ){
return 0;
}
@@ -961,14 +969,17 @@
for( int i = size; i > 0; i-- ){
wrapper = (IDerivableContainerSymbol.IParentSymbol) iter.next();
temp = wrapper.getParent();
-
+ boolean isVisible = ( wrapper.getVisibility() == ASTAccessVisibility.PUBLIC );
if( temp instanceof TemplateInstance ){
instance = (TemplateInstance) temp;
if( instance.getInstantiatedSymbol() instanceof IDerivableContainerSymbol ){
if( instance.getInstantiatedSymbol() == base ){
- return 1;
+ if( throwIfNotVisible && !isVisible )
+ throw new ParserSymbolTableException( ParserSymbolTableException.r_BadVisibility );
+ else
+ return 1;
} else {
- int n = hasBaseClass( instance, base );
+ int n = hasBaseClass( instance, base, throwIfNotVisible );
if( n > 0 ){
return n + 1;
}
@@ -989,9 +1000,12 @@
continue;
}
if( parent == base ){
- return 1;
+ if( throwIfNotVisible && !isVisible )
+ throw new ParserSymbolTableException( ParserSymbolTableException.r_BadVisibility );
+ else
+ return 1;
} else {
- int n = hasBaseClass( parent, base );
+ int n = hasBaseClass( parent, base, throwIfNotVisible );
if( n > 0 ){
return n + 1;
}
@@ -1057,23 +1071,28 @@
//7.3.3-4
else if( context.isType( TypeInfo.t_class, TypeInfo.t_struct ) ){
IContainerSymbol container = obj.getContainingSymbol();
- //a member of a base class
- if( obj.getContainingSymbol().getType() == context.getType() ){
- okToAdd = ( hasBaseClass( (IDerivableContainerSymbol) context, (IDerivableContainerSymbol) container ) > 0 );
- }
- else if ( obj.getContainingSymbol().getType() == TypeInfo.t_union ) {
- // TODO : must be an _anonymous_ union
- container = container.getContainingSymbol();
- okToAdd = ( container instanceof IDerivableContainerSymbol )
- ? ( hasBaseClass( (IDerivableContainerSymbol)context, (IDerivableContainerSymbol) container ) > 0 )
- : false;
- }
- //an enumerator for an enumeration
- else if ( obj.getType() == TypeInfo.t_enumerator ){
- container = container.getContainingSymbol();
- okToAdd = ( container instanceof IDerivableContainerSymbol )
- ? ( hasBaseClass( (IDerivableContainerSymbol)context, (IDerivableContainerSymbol) container ) > 0 )
- : false;
+
+ try{
+ //a member of a base class
+ if( obj.getContainingSymbol().getType() == context.getType() ){
+ okToAdd = ( hasBaseClass( (IDerivableContainerSymbol) context, (IDerivableContainerSymbol) container ) > 0 );
+ }
+ else if ( obj.getContainingSymbol().getType() == TypeInfo.t_union ) {
+ // TODO : must be an _anonymous_ union
+ container = container.getContainingSymbol();
+ okToAdd = ( container instanceof IDerivableContainerSymbol )
+ ? ( hasBaseClass( (IDerivableContainerSymbol)context, (IDerivableContainerSymbol) container ) > 0 )
+ : false;
+ }
+ //an enumerator for an enumeration
+ else if ( obj.getType() == TypeInfo.t_enumerator ){
+ container = container.getContainingSymbol();
+ okToAdd = ( container instanceof IDerivableContainerSymbol )
+ ? ( hasBaseClass( (IDerivableContainerSymbol)context, (IDerivableContainerSymbol) container ) > 0 )
+ : false;
+ }
+ } catch ( ParserSymbolTableException e ) {
+ //not going to happen since we didn't ask for the visibility exception from hasBaseClass
}
} else {
okToAdd = true;
@@ -1109,11 +1128,11 @@
TypeInfo.PtrOp op = null;
if( cost.source.hasPtrOperators() ){
- LinkedList sourcePtrs = cost.source.getPtrOperators();
- TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)sourcePtrs.getFirst();
-
+ List sourcePtrs = cost.source.getPtrOperators();
+ Iterator iterator = sourcePtrs.iterator();
+ TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)iterator.next();
if( ptr.getType() == TypeInfo.PtrOp.t_reference ){
- sourcePtrs.removeFirst();
+ iterator.remove();
}
int size = sourcePtrs.size();
Iterator iter = sourcePtrs.iterator();
@@ -1127,11 +1146,13 @@
}
if( cost.target.hasPtrOperators() ){
- LinkedList targetPtrs = cost.target.getPtrOperators();
- TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)targetPtrs.getFirst();
-
+ List targetPtrs = cost.target.getPtrOperators();
+ Iterator iterator = targetPtrs.iterator();
+ TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)iterator.next();
+
if( ptr.getType() == TypeInfo.PtrOp.t_reference ){
- targetPtrs.removeFirst();
+ iterator.remove();
+ cost.targetHadReference = true;
}
int size = targetPtrs.size();
Iterator iter = targetPtrs.iterator();
@@ -1271,7 +1292,7 @@
TypeInfo src = cost.source;
TypeInfo trg = cost.target;
- int temp;
+ int temp = -1;
cost.conversion = 0;
cost.detail = 0;
@@ -1280,7 +1301,7 @@
return;
}
if( src.hasPtrOperators() && src.getPtrOperators().size() == 1 ){
- TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)src.getPtrOperators().getFirst();
+ TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)src.getPtrOperators().iterator().next();
ISymbol srcDecl = src.isType( TypeInfo.t_type ) ? src.getTypeSymbol() : null;
ISymbol trgDecl = trg.isType( TypeInfo.t_type ) ? trg.getTypeSymbol() : null;
if( ptr.getType() == TypeInfo.PtrOp.t_pointer ){
@@ -1302,7 +1323,11 @@
//4.10-3 An rvalue of type "pointer to cv D", where D is a class type can be converted
// to an rvalue of type "pointer to cv B", where B is a base class of D.
if( (srcDecl instanceof IDerivableContainerSymbol) && trgDecl.isType( srcDecl.getType() ) ){
- temp = hasBaseClass( (IDerivableContainerSymbol) srcDecl, (IDerivableContainerSymbol) trgDecl );
+ try {
+ temp = hasBaseClass( (IDerivableContainerSymbol) srcDecl, (IDerivableContainerSymbol) trgDecl );
+ } catch (ParserSymbolTableException e) {
+ //not going to happen since we didn't ask for the visibility exception
+ }
cost.rank = ( temp > -1 ) ? Cost.CONVERSION_RANK : Cost.NO_MATCH_RANK;
cost.conversion = ( temp > -1 ) ? temp : 0;
cost.detail = 1;
@@ -1316,9 +1341,13 @@
return;
}
- TypeInfo.PtrOp srcPtr = trg.hasPtrOperators() ? (TypeInfo.PtrOp)trg.getPtrOperators().getFirst() : null;
+ TypeInfo.PtrOp srcPtr = trg.hasPtrOperators() ? (TypeInfo.PtrOp)trg.getPtrOperators().iterator().next() : null;
if( trgDecl.isType( srcDecl.getType() ) && srcPtr != null && srcPtr.getType() == TypeInfo.PtrOp.t_memberPointer ){
- temp = hasBaseClass( (IDerivableContainerSymbol)ptr.getMemberOf(), (IDerivableContainerSymbol)srcPtr.getMemberOf() );
+ try {
+ temp = hasBaseClass( (IDerivableContainerSymbol)ptr.getMemberOf(), (IDerivableContainerSymbol)srcPtr.getMemberOf() );
+ } catch (ParserSymbolTableException e) {
+ //not going to happen since we didn't ask for the visibility exception
+ }
cost.rank = ( temp > -1 ) ? Cost.CONVERSION_RANK : Cost.NO_MATCH_RANK;
cost.detail = 1;
cost.conversion = ( temp > -1 ) ? temp : 0;
@@ -1342,7 +1371,26 @@
}
}
- static private Cost checkStandardConversionSequence( TypeInfo source, TypeInfo target ){
+ static private void derivedToBaseConversion( Cost cost ) throws ParserSymbolTableException{
+ TypeInfo src = cost.source;
+ TypeInfo trg = cost.target;
+
+ ISymbol srcDecl = src.isType( TypeInfo.t_type ) ? src.getTypeSymbol() : null;
+ ISymbol trgDecl = trg.isType( TypeInfo.t_type ) ? trg.getTypeSymbol() : null;
+
+ if( !src.hasSamePtrs( trg ) || srcDecl == null || trgDecl == null || !cost.targetHadReference ){
+ return;
+ }
+
+ int temp = hasBaseClass( (IDerivableContainerSymbol) srcDecl, (IDerivableContainerSymbol) trgDecl, true );
+
+ if( temp > -1 ){
+ cost.rank = Cost.DERIVED_TO_BASE_CONVERSION;
+ cost.conversion = temp;
+ }
+ }
+
+ static private Cost checkStandardConversionSequence( TypeInfo source, TypeInfo target ) throws ParserSymbolTableException{
Cost cost = lvalue_to_rvalue( source, target );
if( cost.source == null || cost.target == null ){
@@ -1368,6 +1416,11 @@
conversion( cost );
+ if( cost.rank > -1 )
+ return cost;
+
+ derivedToBaseConversion( cost );
+
return cost;
}
@@ -1385,7 +1438,7 @@
if( target.getType() == TypeInfo.t_type ){
targetDecl = target.getTypeSymbol();
if( targetDecl.isType( TypeInfo.t_class, TypeInfo.t_union ) ){
- LookupData data = new LookupData( "", TypeInfo.t_constructor, null );
+ LookupData data = new LookupData( EMPTY_NAME, TypeInfo.t_constructor, null );
data.parameters = new LinkedList();
data.parameters.add( source );
data.forUserDefinedConversion = true;
@@ -1415,8 +1468,8 @@
if( sourceDecl != null && (sourceDecl instanceof IContainerSymbol) ){
String name = target.toString();
- if( !name.equals("") ){
- LookupData data = new LookupData( "operator " + name, TypeInfo.t_function, null );
+ if( !name.equals(EMPTY_NAME) ){
+ LookupData data = new LookupData( "operator " + name, TypeInfo.t_function, null ); //$NON-NLS-1$
LinkedList params = new LinkedList();
data.parameters = params;
data.forUserDefinedConversion = true;
@@ -1545,20 +1598,35 @@
returnInfo.setTypeInfo( info.getTypeInfo() );
returnInfo.setType( info.getType() );
returnInfo.setTypeSymbol( null );
+ returnInfo.addPtrOperator( info.getPtrOperators() );
}
- returnInfo.applyPtrsAsUnaryOperators( topInfo.getPtrOperators() );
+ returnInfo.applyOperatorExpressions( topInfo.getOperatorExpressions() );
+
+ if( topInfo.hasPtrOperators() ){
+ TypeInfo.PtrOp topPtr = (PtrOp) topInfo.getPtrOperators().iterator().next();
+ TypeInfo.PtrOp ptr = null;
+ if( returnInfo.hasPtrOperators() ){
+ ptr = (PtrOp)returnInfo.getPtrOperators().iterator().next();
+ } else {
+ ptr = new PtrOp();
+ returnInfo.addPtrOperator( ptr );
+ }
+
+ ptr.setConst( topPtr.isConst() );
+ ptr.setVolatile( topPtr.isVolatile() );
+ }
}
return returnInfo;
}
- static private IParameterizedSymbol matchTemplatePartialSpecialization( IParameterizedSymbol template, LinkedList args ){
+ static private IParameterizedSymbol matchTemplatePartialSpecialization( IParameterizedSymbol template, List args ){
if( template == null ){
return null;
}
- LinkedList specs = template.getSpecializations();
+ List specs = template.getSpecializations();
int size = ( specs != null ) ? specs.size() : 0;
if( size == 0 ){
return template;
@@ -1568,7 +1636,7 @@
boolean bestMatchIsBest = true;
Iterator iter = specs.iterator();
IParameterizedSymbol spec = null;
- LinkedList specArgs = null;
+ List specArgs = null;
for( int i = size; i > 0; i-- ){
spec = (IParameterizedSymbol) iter.next();
specArgs = spec.getArgumentList();
@@ -1581,7 +1649,7 @@
Iterator iter2 = args.iterator();
HashMap map = new HashMap();
- String name = null;
+ //String name = null;
boolean match = true;
for( int j = specArgs.size(); j > 0; j-- ){
sym1 = (ISymbol)iter1.next();
@@ -1589,7 +1657,7 @@
if( info2.isType( TypeInfo.t_type ) ){
sym2 = sym2.getTypeSymbol();
} else {
- sym2 = template.getSymbolTable().newSymbol( "" );
+ sym2 = template.getSymbolTable().newSymbol( EMPTY_NAME );
sym2.setTypeInfo( info2 );
}
@@ -1694,7 +1762,7 @@
return false;
}
- LinkedList args = ((IParameterizedSymbol) argFunction).getParameterList();
+ List args = ((IParameterizedSymbol) argFunction).getParameterList();
IParameterizedSymbol function = (IParameterizedSymbol) templateSymbol;
@@ -1715,7 +1783,7 @@
return true;
}
- static private boolean deduceTemplateArgument( HashMap map, ISymbol p, ISymbol a, HashMap argumentMap ){
+ static private boolean deduceTemplateArgument( Map map, ISymbol p, ISymbol a, Map argumentMap ){
if( argumentMap != null && argumentMap.containsKey( a ) ){
a = (ISymbol) argumentMap.get( a );
}
@@ -1730,12 +1798,12 @@
if( pSymbol.isTemplateMember() && pSymbol.isType( TypeInfo.t_undef ) ){
//T* or T& or T[ const ]
//also
- LinkedList pPtrs = pSymbol.getPtrOperators();
- LinkedList aPtrs = aSymbol.getPtrOperators();
+ List pPtrs = pSymbol.getPtrOperators();
+ List aPtrs = aSymbol.getPtrOperators();
if( pPtrs != null ){
- TypeInfo.PtrOp pOp = (TypeInfo.PtrOp) pPtrs.getFirst();
- TypeInfo.PtrOp aOp = ( aPtrs != null ) ? (TypeInfo.PtrOp)aPtrs.getFirst() : null;
+ TypeInfo.PtrOp pOp = (TypeInfo.PtrOp) pPtrs.iterator().next();;
+ TypeInfo.PtrOp aOp = ( aPtrs != null ) ? (TypeInfo.PtrOp)pPtrs.iterator().next() : null;
if( pOp != null && aOp != null && pOp.getType() == aOp.getType() ){
if( pOp.getType() == TypeInfo.PtrOp.t_memberPointer ){
@@ -1759,8 +1827,8 @@
}
//template-name<T> or template-name<i>
else if( pSymbol.isType( TypeInfo.t_template ) && aSymbol.isType( TypeInfo.t_template ) ){
- LinkedList pArgs = ((IParameterizedSymbol)pSymbol).getArgumentList();
- LinkedList aArgs = ((IParameterizedSymbol)aSymbol).getArgumentList();
+ List pArgs = ((IParameterizedSymbol)pSymbol).getArgumentList();
+ List aArgs = ((IParameterizedSymbol)aSymbol).getArgumentList();
if( pArgs == null || aArgs == null || pArgs.size() != aArgs.size()){
return false;
@@ -1782,8 +1850,8 @@
return false;
}
if( pSymbol.getPtrOperators() != null ){
- LinkedList ptrs = pSymbol.getPtrOperators();
- TypeInfo.PtrOp op = (TypeInfo.PtrOp) ptrs.getFirst();
+ List ptrs = pSymbol.getPtrOperators();
+ TypeInfo.PtrOp op = (TypeInfo.PtrOp) ptrs.iterator().next();;
if( op.getType() == TypeInfo.PtrOp.t_memberPointer ){
if( !deduceTemplateArgument( map, op.getMemberOf(), pFunction.getContainingSymbol(), argumentMap ) ){
return false;
@@ -1791,8 +1859,8 @@
}
}
- LinkedList pParams = pFunction.getParameterList();
- LinkedList aParams = aFunction.getParameterList();
+ List pParams = pFunction.getParameterList();
+ List aParams = aFunction.getParameterList();
if( pParams.size() != aParams.size() ){
return false;
} else {
@@ -1861,7 +1929,7 @@
*/
static private TemplateInstance transformFunctionTemplateForOrdering( IParameterizedSymbol template ){
- LinkedList paramList = template.getParameterList();
+ List paramList = template.getParameterList();
int size = ( paramList != null ) ? paramList.size() : 0;
if( size == 0 ){
@@ -1871,7 +1939,7 @@
HashMap map = new HashMap();
for( Iterator iterator = paramList.iterator(); iterator.hasNext(); ) {
ISymbol param = (ISymbol) iterator.next();
- ISymbol val = template.getSymbolTable().newSymbol( "", TypeInfo.t_type );
+ ISymbol val = template.getSymbolTable().newSymbol( EMPTY_NAME, TypeInfo.t_type );
if( false /* is value */ ){
//val.getTypeInfo().setHasDefault()
}
@@ -1971,7 +2039,7 @@
_context.getContainedSymbols().remove( _decl.getName() );
}
if( _removeThis && _decl instanceof IParameterizedSymbol ){
- ((IParameterizedSymbol)_decl).getContainedSymbols().remove( "this" );
+ ((IParameterizedSymbol)_decl).getContainedSymbols().remove( THIS );
}
}
@@ -1987,7 +2055,7 @@
_removeThis = removeThis;
}
public void undoIt(){
- LinkedList constructors = _context.getConstructors();
+ List constructors = _context.getConstructors();
ListIterator iter = constructors.listIterator();
int size = constructors.size();
@@ -2001,7 +2069,7 @@
}
if( _removeThis ){
- _constructor.getContainedSymbols().remove( "this" );
+ _constructor.getContainedSymbols().remove( THIS );
}
}
@@ -2035,7 +2103,7 @@
_decl.getParameterList().remove( _param );
String name = _param.getName();
- if( name != null && !name.equals("") )
+ if( name != null && !name.equals(EMPTY_NAME) )
{
_decl.getParameterMap().remove( name );
}
@@ -2079,7 +2147,7 @@
public HashSet inheritanceChain; //used to detect circular inheritance
- public LinkedList parameters; //parameter info for resolving functions
+ public List parameters; //parameter info for resolving functions
public HashSet associated; //associated namespaces for argument dependant lookup
public ISymbol stopAt; //stop looking along the stack once we hit this declaration
@@ -2102,14 +2170,17 @@
static private class Cost
{
+
public Cost( TypeInfo s, TypeInfo t ){
- source = s;
- target = t;
+ source = new TypeInfo( s );
+ target = new TypeInfo( t );
}
public TypeInfo source;
public TypeInfo target;
+ public boolean targetHadReference = false;
+
public int lvalue;
public int promotion;
public int conversion;
@@ -2126,7 +2197,10 @@
public static final int LVALUE_OR_QUALIFICATION_RANK = 0;
public static final int PROMOTION_RANK = 1;
public static final int CONVERSION_RANK = 2;
- public static final int USERDEFINED_CONVERSION_RANK = 3;
+ public static final int DERIVED_TO_BASE_CONVERSION = 3;
+ public static final int USERDEFINED_CONVERSION_RANK = 4;
+ public static final int ELLIPSIS_CONVERSION = 5;
+
public int compare( Cost cost ){
int result = 0;
@@ -2318,7 +2392,6 @@
TypeInfo.PtrOp op1 = null, op2 = null;
- int subOrSuper = 0;
for( int i = size; i > 0; i-- ){
op1 = (TypeInfo.PtrOp)iter1.next();
op2 = (TypeInfo.PtrOp)iter2.next();
@@ -2332,7 +2405,7 @@
return 0;
}
- public LinkedList getPtrOperators(){
+ public List getPtrOperators(){
return getTypeInfo().getPtrOperators();
}
public void addPtrOperator( TypeInfo.PtrOp ptrOp ){
@@ -2355,7 +2428,7 @@
public void setTemplateInstance( TemplateInstance instance ){
_templateInstance = instance;
}
- public HashMap getArgumentMap(){
+ public Map getArgumentMap(){
return null;
}
private String _name; //our name
@@ -2370,8 +2443,8 @@
public class TemplateInstance extends BasicSymbol
{
- protected TemplateInstance( ISymbol symbol, HashMap argMap ){
- super("");
+ protected TemplateInstance( ISymbol symbol, Map argMap ){
+ super(EMPTY_NAME);
_instantiatedSymbol = symbol;
symbol.setTemplateInstance( this );
_argumentMap = argMap;
@@ -2471,16 +2544,14 @@
return _instantiatedSymbol.getTypeInfo();
}
- public HashMap getArgumentMap(){
+ public Map getArgumentMap(){
return _argumentMap;
}
private ISymbol _instantiatedSymbol;
//private LinkedList _arguments;
- private HashMap _argumentMap;
- private Object _callbackExtension;
-
+ private Map _argumentMap;
}
public class Declaration extends BasicSymbol implements Cloneable,
@@ -2568,11 +2639,11 @@
return _containedDeclarations;
}
- public LinkedList getConstructors(){
+ public List getConstructors(){
return _constructors;
}
- public LinkedList createConstructors(){
+ public List createConstructors(){
if( _constructors == null )
_constructors = new LinkedList();
@@ -2601,23 +2672,23 @@
_returnType = type;
}
- public LinkedList getParameterList(){
+ public List getParameterList(){
return _parameterList;
}
- public void setParameterList( LinkedList list ){
- _parameterList = list;
+ public void setParameterList( List list ){
+ _parameterList = new LinkedList( list );
}
- public HashMap getParameterMap(){
+ public Map getParameterMap(){
return _parameterHash;
}
- public LinkedList getArgumentList(){
+ public List getArgumentList(){
return _argumentList;
}
- public void setArgumentList( LinkedList list ){
- _argumentList = list;
+ public void setArgumentList( List list ){
+ _argumentList = new LinkedList( list );
}
public void addArgument( ISymbol arg ){
if( _argumentList == null ){
@@ -2637,7 +2708,7 @@
_parameterList.addLast( param );
String name = param.getName();
- if( name != null && !name.equals("") )
+ if( name != null && !name.equals(EMPTY_NAME) )
{
if( _parameterHash == null )
_parameterHash = new HashMap();
@@ -2653,7 +2724,7 @@
}
public void addParameter( ISymbol typeSymbol, TypeInfo.PtrOp ptrOp, boolean hasDefault ){
- BasicSymbol param = new BasicSymbol("");
+ BasicSymbol param = new BasicSymbol(EMPTY_NAME);
TypeInfo info = param.getTypeInfo();
info.setType( TypeInfo.t_type );
@@ -2665,7 +2736,7 @@
}
public void addParameter( TypeInfo.eType type, int info, TypeInfo.PtrOp ptrOp, boolean hasDefault ){
- BasicSymbol param = new BasicSymbol("");
+ BasicSymbol param = new BasicSymbol(EMPTY_NAME);
TypeInfo t = param.getTypeInfo();
t.setTypeInfo( info );
@@ -2736,7 +2807,7 @@
Map declarations = containing.getContainedSymbols();
- boolean unnamed = obj.getName().equals( "" );
+ boolean unnamed = obj.getName().equals( EMPTY_NAME );
Object origObj = null;
@@ -2800,9 +2871,7 @@
if( !constructor.isType( TypeInfo.t_constructor ) )
throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTypeInfo );
- Object origObj = null;
-
- LinkedList constructors = getConstructors();
+ List constructors = getConstructors();
if( constructors == null )
constructors = createConstructors();
@@ -2820,6 +2889,20 @@
pushCommand( command );
}
+ public void addCopyConstructor() throws ParserSymbolTableException{
+ List parameters = new LinkedList();
+
+ TypeInfo param = new TypeInfo( TypeInfo.t_type, 0, this, new TypeInfo.PtrOp( TypeInfo.PtrOp.t_reference, true, false ), false );
+ parameters.add( param );
+
+ IParameterizedSymbol constructor = lookupConstructor( parameters );
+
+ if( constructor == null ){
+ constructor = getSymbolTable().newParameterizedSymbol( getName(), TypeInfo.t_constructor );
+ constructor.addParameter( this, new TypeInfo.PtrOp( TypeInfo.PtrOp.t_reference, true, false ), false );
+ addConstructor( constructor );
+ }
+ }
/**
*
* @param obj
@@ -2843,20 +2926,20 @@
if( obj.getContainingSymbol().isType( TypeInfo.t_class, TypeInfo.t_union ) ){
//check to see if there is already a this object, since using declarations
//of function will have them from the original declaration
- LookupData data = new LookupData( "this", TypeInfo.t_any, null );
+ LookupData data = new LookupData( THIS, TypeInfo.t_any, null );
lookupInContained( data, obj );
//if we didn't find "this" then foundItems will still be null, no need to actually
//check its contents
if( data.foundItems == null ){
- Declaration thisObj = new Declaration("this");
+ Declaration thisObj = new Declaration( THIS );
thisObj.setType( TypeInfo.t_type );
thisObj.setTypeSymbol( obj.getContainingSymbol() );
//thisObj.setCVQualifier( obj.getCVQualifier() );
TypeInfo.PtrOp ptr = new TypeInfo.PtrOp();
ptr.setType( TypeInfo.PtrOp.t_pointer );
if( obj.getTypeInfo().hasPtrOperators() ){
- ptr.setConst( ((TypeInfo.PtrOp) obj.getPtrOperators().getFirst()).isConst() );
- ptr.setVolatile( ((TypeInfo.PtrOp) obj.getPtrOperators().getFirst()).isVolatile() );
+ ptr.setConst( ((TypeInfo.PtrOp) obj.getPtrOperators().iterator().next()).isConst() );
+ ptr.setVolatile( ((TypeInfo.PtrOp) obj.getPtrOperators().iterator().next()).isVolatile() );
}
thisObj.addPtrOperator(ptr);
@@ -3129,7 +3212,7 @@
* Member lookup really proceeds as an unqualified lookup, but doesn't
* include argument dependant scopes
*/
- public IParameterizedSymbol memberFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException{
+ public IParameterizedSymbol memberFunctionLookup( String name, List parameters ) throws ParserSymbolTableException{
LookupData data = new LookupData( name, TypeInfo.t_function, getTemplateInstance() );
//if parameters == null, thats no parameters, but we need to distinguish that from
//no parameter information at all, so make an empty list.
@@ -3139,7 +3222,7 @@
return (IParameterizedSymbol) ParserSymbolTable.resolveAmbiguities( data );
}
- public IParameterizedSymbol qualifiedFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException{
+ public IParameterizedSymbol qualifiedFunctionLookup( String name, List parameters ) throws ParserSymbolTableException{
LookupData data = new LookupData( name, TypeInfo.t_function, getTemplateInstance() );
data.qualified = true;
//if parameters == null, thats no parameters, but we need to distinguish that from
@@ -3164,7 +3247,7 @@
return ParserSymbolTable.resolveAmbiguities( data );
}
- public TemplateInstance templateLookup( String name, LinkedList arguments ) throws ParserSymbolTableException
+ public TemplateInstance templateLookup( String name, List arguments ) throws ParserSymbolTableException
{
LookupData data = new LookupData( name, TypeInfo.t_any, getTemplateInstance() );
data.parameters = arguments;
@@ -3177,9 +3260,9 @@
return null;
}
- public IParameterizedSymbol lookupConstructor( LinkedList parameters ) throws ParserSymbolTableException
+ public IParameterizedSymbol lookupConstructor( List parameters ) throws ParserSymbolTableException
{
- LookupData data = new LookupData( "", TypeInfo.t_constructor, null );
+ LookupData data = new LookupData( EMPTY_NAME, TypeInfo.t_constructor, null );
data.parameters = parameters;
return ParserSymbolTable.resolveFunction( data, getConstructors() );
@@ -3207,7 +3290,7 @@
* ordinary unqualified lookup and the set of declarations found in the
* namespaces and classes associated with the argument types.
*/
- public IParameterizedSymbol unqualifiedFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException{
+ public IParameterizedSymbol unqualifiedFunctionLookup( String name, List parameters ) throws ParserSymbolTableException{
//figure out the set of associated scopes first, so we can remove those that are searched
//during the normal lookup to avoid doing them twice
HashSet associated = new HashSet();
@@ -3231,7 +3314,7 @@
//if T is a pointer to a data member of class X, its associated namespaces and classes
//are those associated with the member type together with those associated with X
if( param.hasPtrOperators() && param.getPtrOperators().size() == 1 ){
- TypeInfo.PtrOp op = (TypeInfo.PtrOp)param.getPtrOperators().getFirst();
+ TypeInfo.PtrOp op = (TypeInfo.PtrOp)param.getPtrOperators().iterator().next();
if( op.getType() == TypeInfo.PtrOp.t_pointer &&
paramType.getContainingSymbol().isType( TypeInfo.t_class, TypeInfo.t_union ) )
{
@@ -3258,8 +3341,6 @@
}
Declaration decl;
- Declaration temp;
-
//dump the hash to an array and iterate over the array because we
//could be removing items from the collection as we go and we don't
//want to get ConcurrentModificationExceptions
@@ -3286,7 +3367,7 @@
return ( _specializations != null && !_specializations.isEmpty() );
}
- public LinkedList getSpecializations(){
+ public List getSpecializations(){
return _specializations;
}
@@ -3297,7 +3378,7 @@
_specializations.add( spec );
}
- public TemplateInstance instantiate( LinkedList arguments ) throws ParserSymbolTableException{
+ public TemplateInstance instantiate( List arguments ) throws ParserSymbolTableException{
if( getType() != TypeInfo.t_template ){
return null;
}
@@ -3350,16 +3431,14 @@
return instance;
}
-
private boolean _needsDefinition; //this name still needs to be defined
-
- private LinkedList _parentScopes; //inherited scopes (is base classes)
- private LinkedList _usingDirectives; //collection of nominated namespaces
+ private LinkedList _parentScopes; //inherited scopes (is base classes)
+ private LinkedList _usingDirectives; //collection of nominated namespaces
private HashMap _containedDeclarations; //declarations contained by us.
private LinkedList _specializations; //template specializations
- private LinkedList _argumentList; //template specialization arguments
+ private LinkedList _argumentList; //template specialization arguments
private LinkedList _parameterList; //have my cake
private HashMap _parameterHash; //and eat it too
@@ -3368,8 +3447,6 @@
private ISymbol _returnType;
-
-
public class ParentWrapper implements IDerivableContainerSymbol.IParentSymbol
{
public ParentWrapper( ISymbol p, boolean v, ASTAccessVisibility s, int offset, List r ){
@@ -3394,6 +3471,10 @@
public void setVirtual( boolean virtual ){
isVirtual = virtual;
+ }
+
+ public ASTAccessVisibility getVisibility(){
+ return access;
}
private boolean isVirtual = false;
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTableException.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTableException.java,v
retrieving revision 1.3
diff -u -r1.3 ParserSymbolTableException.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTableException.java 7 Aug 2003 14:46:58 -0000 1.3
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTableException.java 18 Sep 2003 18:47:07 -0000
@@ -43,6 +43,7 @@
public static final int r_InvalidOverload = 3;
public static final int r_BadTemplate = 4;
public static final int r_InvalidUsing = 5;
+ public static final int r_BadVisibility = 6;
public int reason = -1;
}
Index: parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java,v
retrieving revision 1.4
diff -u -r1.4 TypeInfo.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java 14 Aug 2003 19:49:44 -0000 1.4
+++ parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java 18 Sep 2003 18:47:07 -0000
@@ -13,7 +13,9 @@
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.cdt.core.parser.Enum;
import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.TemplateInstance;
@@ -130,6 +132,26 @@
private int _val;
}
+ public static class OperatorExpression extends Enum{
+
+ //5.3.1-1 : The unary * operator, the expression to which it is applied shall be
+ //a pointer to an object type or a pointer to a function type and the result
+ //is an lvalue refering to the object or function to which the expression points
+ public static final OperatorExpression indirection = new OperatorExpression( 1 );
+
+ //5.3.1-2 : The result of the unary & operator is a pointer to its operand
+ public static final OperatorExpression addressof = new OperatorExpression( 0 );
+
+ //5.2.1 A postfix expression followed by an expression in square brackets is a postfix
+ //expression. one of the expressions shall have the type "pointer to T" and the other
+ //shall have a enumeration or integral type. The result is an lvalue of type "T"
+ public static final OperatorExpression subscript = new OperatorExpression( 2 );
+
+ protected OperatorExpression(int enumValue) {
+ super(enumValue);
+ }
+ }
+
public static class PtrOp {
public PtrOp( TypeInfo.eType type ){
this.type = type;
@@ -190,23 +212,27 @@
private ISymbol memberOf = null;
}
- private static final String _image[] = { "",
- "",
- "namespace",
- "template",
- "class",
- "struct",
- "union",
- "enum",
- "",
- "bool",
- "char",
- "wchar_t",
- "int",
- "float",
- "double",
- "void",
- ""
+ private static final String _image[] = { "", //$NON-NLS-1$ t_undef
+ "", //$NON-NLS-1$ t_type
+ "namespace", //$NON-NLS-1$ t_namespace
+ "class", //$NON-NLS-1$ t_class
+ "struct", //$NON-NLS-1$ t_struct
+ "union", //$NON-NLS-1$ t_union
+ "enum", //$NON-NLS-1$ t_enumeration
+ "", //$NON-NLS-1$ t_constructor
+ "", //$NON-NLS-1$ t_function
+ "bool", //$NON-NLS-1$ t_bool
+ "char", //$NON-NLS-1$ t_char
+ "wchar_t", //$NON-NLS-1$ t_wchar_t
+ "int", //$NON-NLS-1$ t_int
+ "float", //$NON-NLS-1$ t_float
+ "double", //$NON-NLS-1$ t_double
+ "void", //$NON-NLS-1$ t_void
+ "", //$NON-NLS-1$ t_enumerator
+ "", //$NON-NLS-1$ t_block
+ "template", //$NON-NLS-1$ t_template
+ "", //$NON-NLS-1$ t_asm
+ "" //$NON-NLS-1$ t_linkage
};
//Partial ordering :
// none < const
@@ -286,7 +312,7 @@
return ( _ptrOperators != null && _ptrOperators.size() > 0 );
}
- public LinkedList getPtrOperators(){
+ public List getPtrOperators(){
return _ptrOperators;
}
@@ -311,40 +337,38 @@
return false;
}
- public void applyPtrsAsUnaryOperators( LinkedList ptrs ){
- if( ptrs == null || ptrs.isEmpty() )
+ public List getOperatorExpressions(){
+ return _operatorExpressions;
+ }
+
+
+ public void applyOperatorExpressions( List ops ){
+ if( ops == null || ops.isEmpty() )
return;
- int size = ptrs.size();
- Iterator iter = ptrs.iterator();
- TypeInfo.PtrOp op = null;
+ int size = ops.size();
+ Iterator iter = ops.iterator();
+ OperatorExpression op = null;
for( int i = size; i > 0; i-- ){
- op = (TypeInfo.PtrOp)iter.next();
- if( op.getType() == PtrOp.t_pointer ){
+ op = (OperatorExpression)iter.next();
+ if( op == OperatorExpression.indirection ||
+ op == OperatorExpression.subscript )
+ {
//indirection operator, can only be applied to a pointer
+ //subscript should be applied to something that is "pointer to T", the result is a lvalue of type "T"
if( hasPtrOperators() ){
- TypeInfo.PtrOp first = (TypeInfo.PtrOp)getPtrOperators().getFirst();
- if( first.getType() == TypeInfo.PtrOp.t_pointer )
+ ListIterator iterator = getPtrOperators().listIterator( getPtrOperators().size() );
+ TypeInfo.PtrOp last = (TypeInfo.PtrOp)iterator.previous();
+ if( last.getType() == TypeInfo.PtrOp.t_pointer ||
+ last.getType() == TypeInfo.PtrOp.t_array )
{
- getPtrOperators().removeFirst();
- if( op.isConst() || op.isVolatile() ){
-
- if( hasPtrOperators() ){
- ((TypeInfo.PtrOp)getPtrOperators().getFirst()).setConst( op.isConst() );
- ((TypeInfo.PtrOp)getPtrOperators().getFirst()).setVolatile( op.isVolatile() );
- } else {
- TypeInfo.PtrOp newOp = new TypeInfo.PtrOp( TypeInfo.PtrOp.t_undef, op.isConst(), op.isVolatile() );
- addPtrOperator( newOp );
- }
- }
+ iterator.remove();
}
- } else {
- //???
}
- } else if( op.getType() == PtrOp.t_reference ){
+ } else if( op == OperatorExpression.addressof ){
//Address-of unary operator, results in pointer to T
//TODO or pointer to member
- TypeInfo.PtrOp newOp = new TypeInfo.PtrOp( PtrOp.t_pointer , op.isConst(), op.isVolatile() );
+ TypeInfo.PtrOp newOp = new TypeInfo.PtrOp( PtrOp.t_pointer );
addPtrOperator( newOp );
}
}
@@ -366,6 +390,13 @@
_ptrOperators.addAll( ptrs );
}
+ public void addOperatorExpression( OperatorExpression exp ){
+ if( _operatorExpressions == null ){
+ _operatorExpressions = new LinkedList();
+ }
+ _operatorExpressions.add( exp );
+ }
+
public boolean getHasDefault(){
return _hasDefaultValue;
}
@@ -414,10 +445,18 @@
if( _typeDeclaration instanceof TemplateInstance ){
result &= _typeDeclaration.equals( type._typeDeclaration );
} else {
- result &= ( _typeDeclaration == type._typeDeclaration );
+ if( _typeDeclaration != null && type._typeDeclaration != null &&
+ _typeDeclaration.isType( TypeInfo.t_bool, TypeInfo.t_void ) &&
+ type._typeDeclaration.isType( TypeInfo.t_bool, TypeInfo.t_void ) )
+ {
+ //if typeDeclaration is a basic type, then only need the types the same
+ result &= ( _typeDeclaration.getType() == type._typeDeclaration.getType() );
+ } else {
+ //otherwise, its a user defined type, need the decls the same
+ result &= ( _typeDeclaration == type._typeDeclaration );
+ }
}
-
-
+
int size1 = (_ptrOperators == null) ? 0 : _ptrOperators.size();
int size2 = (type._ptrOperators == null) ? 0 : type._ptrOperators.size();
if( size1 == size2 ){
@@ -457,4 +496,5 @@
private boolean _hasDefaultValue = false;
private Object _defaultValue = null;
private LinkedList _ptrOperators;
+ private LinkedList _operatorExpressions;
}
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/ChangeLog,v
retrieving revision 1.102
diff -u -r1.102 ChangeLog
--- ChangeLog 18 Sep 2003 15:22:42 -0000 1.102
+++ ChangeLog 18 Sep 2003 21:18:14 -0000
@@ -1,3 +1,13 @@
+2003-09-18 Andrew Niefer
+ - removed testConditionalExpression_Bug43159 from FailedCompleteParseASTExpressionTest
+ and uncommented it (testConditionalExpression) in CompleteParseASTExpressionTest
+ - uncommented the following tests in CompleteParseASTExpressionTest :
+ testPostfixSubscript, testPostfixSubscriptA, testPostfixSubscriptB,
+ testPostfixSubscriptWithReferences
+ - updated ParserSymbolTableTests to use new addOperatorExpression function
+ - added testDerivedReference, testAddCopyConstructor to ParserSymbolTableTests
+ - fixed warning in ClassDeclarationPatternTests
+
2003-09-17 Hoda Amer
Added more success test cases to CompleteParseASTExpressionTest
and more failure test cases to FailedCompleteParseASTExpressionTest
Index: failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java,v
retrieving revision 1.4
diff -u -r1.4 FailedCompleteParseASTExpressionTest.java
--- failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java 18 Sep 2003 15:22:42 -0000 1.4
+++ failures/org/eclipse/cdt/core/parser/failedTests/FailedCompleteParseASTExpressionTest.java 18 Sep 2003 21:18:14 -0000
@@ -79,23 +79,23 @@
// assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
// assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
// }
- public void testConditionalExpression_Bug43159() throws Exception {
- Iterator i = parse( "int foo(bool); int foo(int); int a = 10, b = 4, c = 2; int x = foo( a > 5 ? b : c );").getDeclarations();
- IASTFunction foo1 = (IASTFunction)i.next();
- IASTFunction foo2 = (IASTFunction)i.next();
- IASTVariable a = (IASTVariable)i.next();
- IASTVariable b = (IASTVariable)i.next();
- IASTVariable c = (IASTVariable)i.next();
- IASTVariable x = (IASTVariable)i.next();
- assertFalse( i.hasNext() );
- assertEquals( callback.getReferences().size(), 3 ); // should be 4
- Iterator references =callback.getReferences().iterator();
- assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
- assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
- assertEquals( ((IASTReference)references.next()).getReferencedElement(), c );
- //assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
- assertFalse( references.hasNext() );
- }
+// public void testConditionalExpression_Bug43159() throws Exception {
+// Iterator i = parse( "int foo(bool); int foo(int); int a = 10, b = 4, c = 2; int x = foo( a > 5 ? b : c );").getDeclarations();
+// IASTFunction foo1 = (IASTFunction)i.next();
+// IASTFunction foo2 = (IASTFunction)i.next();
+// IASTVariable a = (IASTVariable)i.next();
+// IASTVariable b = (IASTVariable)i.next();
+// IASTVariable c = (IASTVariable)i.next();
+// IASTVariable x = (IASTVariable)i.next();
+// assertFalse( i.hasNext() );
+// assertEquals( callback.getReferences().size(), 3 ); // should be 4
+// Iterator references =callback.getReferences().iterator();
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+// assertEquals( ((IASTReference)references.next()).getReferencedElement(), c );
+// //assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+// assertFalse( references.hasNext() );
+// }
public void testConditionalExpressionWithReferencesB_Bug43106() throws Exception {
Iterator i = parse( "class A{}; class B : public A{}; int foo(); int foo(A&); A a ; B b; int c = 0; int x = foo( c > 5 ? b : a );").getDeclarations();
Index: parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java,v
retrieving revision 1.5
diff -u -r1.5 CompleteParseASTExpressionTest.java
--- parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java 18 Sep 2003 15:22:42 -0000 1.5
+++ parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java 18 Sep 2003 21:18:14 -0000
@@ -170,59 +170,59 @@
assertEquals( fr1.getReferencedElement(), f1 );
}
// Kind POSTFIX_SUBSCRIPT
-// public void testPostfixSubscript() throws Exception
-// {
-// Iterator i = parse ("int pa[10]; \n int f(int ia){} \n int f(void); \n int x = f(pa[1]);").getDeclarations();
-// IASTVariable pa = (IASTVariable) i.next();
-// IASTFunction f1 = (IASTFunction) i.next();
-// IASTFunction f2 = (IASTFunction) i.next();
-// IASTVariable x = (IASTVariable) i.next();
-// Iterator references = callback.getReferences().iterator();
-// assertEquals( callback.getReferences().size(), 2 );
-// assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
-// assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
-// }
-//
-// public void testPostfixSubscriptA() throws Exception
-// {
-// Iterator i = parse ("int pa[10][5] ; \n int f(int ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
-// IASTVariable pa = (IASTVariable) i.next();
-// IASTFunction f1 = (IASTFunction) i.next();
-// IASTFunction f2 = (IASTFunction) i.next();
-// IASTVariable x = (IASTVariable) i.next();
-// Iterator references = callback.getReferences().iterator();
-// assertEquals( callback.getReferences().size(), 2 ); // should be = 2
-// assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
-// assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
-// }
-//
-// public void testPostfixSubscriptB() throws Exception
-// {
-// Iterator i = parse ("int* pa[10][5] ; \n int f(int* ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
-// IASTVariable pa = (IASTVariable) i.next();
-// IASTFunction f1 = (IASTFunction) i.next();
-// IASTFunction f2 = (IASTFunction) i.next();
-// IASTVariable x = (IASTVariable) i.next();
-// Iterator references = callback.getReferences().iterator();
-// assertEquals( callback.getReferences().size(), 2 ); // should be = 2
-// assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
-// assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
-// }
-//
-// public void testPostfixSubscriptWithReferences() throws Exception
-// {
-// Iterator i = parse ("class A{}; \n A *pa[10][5] ; \n int f(A* ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
-// IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
-// IASTVariable pa = (IASTVariable) i.next();
-// IASTFunction f1 = (IASTFunction) i.next();
-// IASTFunction f2 = (IASTFunction) i.next();
-// IASTVariable x = (IASTVariable) i.next();
-// Iterator references = callback.getReferences().iterator();
-// assertEquals( ((IASTClassReference) references.next()).getReferencedElement(), cl );
-// assertEquals( ((IASTClassReference) references.next()).getReferencedElement(), cl );
-// assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
-// assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
-// }
+ public void testPostfixSubscript() throws Exception
+ {
+ Iterator i = parse ("int pa[10]; \n int f(int ia){} \n int f(void); \n int x = f(pa[1]);").getDeclarations();
+ IASTVariable pa = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ assertEquals( callback.getReferences().size(), 2 );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+ }
+
+ public void testPostfixSubscriptA() throws Exception
+ {
+ Iterator i = parse ("int pa[10][5] ; \n int f(int ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
+ IASTVariable pa = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ assertEquals( callback.getReferences().size(), 2 ); // should be = 2
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+ }
+
+ public void testPostfixSubscriptB() throws Exception
+ {
+ Iterator i = parse ("int* pa[10][5] ; \n int f(int* ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
+ IASTVariable pa = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ assertEquals( callback.getReferences().size(), 2 ); // should be = 2
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+ }
+
+ public void testPostfixSubscriptWithReferences() throws Exception
+ {
+ Iterator i = parse ("class A{}; \n A *pa[10][5] ; \n int f(A* ia){} \n int f(void); \n int x = f(pa[1][2]);").getDeclarations();
+ IASTClassSpecifier cl = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
+ IASTVariable pa = (IASTVariable) i.next();
+ IASTFunction f1 = (IASTFunction) i.next();
+ IASTFunction f2 = (IASTFunction) i.next();
+ IASTVariable x = (IASTVariable) i.next();
+ Iterator references = callback.getReferences().iterator();
+ assertEquals( ((IASTClassReference) references.next()).getReferencedElement(), cl );
+ assertEquals( ((IASTClassReference) references.next()).getReferencedElement(), cl );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), pa );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), f1 );
+ }
// Kind POSTFIX_FUNCTIONCALL : return type of called function
public void testPostfixFunctioncallBug42822() throws Exception
@@ -891,23 +891,23 @@
assertFalse( references.hasNext() );
}
// Kind CONDITIONALEXPRESSION : conditional Expression Conversions
-// public void testConditionalExpression() throws Exception {
-// Iterator i = parse( "int foo(bool); int foo(int); int a = 10, b = 4, c = 2; int x = foo( a > 5 ? b : c );").getDeclarations();
-// IASTFunction foo1 = (IASTFunction)i.next();
-// IASTFunction foo2 = (IASTFunction)i.next();
-// IASTVariable a = (IASTVariable)i.next();
-// IASTVariable b = (IASTVariable)i.next();
-// IASTVariable c = (IASTVariable)i.next();
-// IASTVariable x = (IASTVariable)i.next();
-// assertFalse( i.hasNext() );
-// assertEquals( callback.getReferences().size(), 4 );
-// Iterator references =callback.getReferences().iterator();
-// assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
-// assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
-// assertEquals( ((IASTReference)references.next()).getReferencedElement(), c );
-// assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
-// assertFalse( references.hasNext() );
-// }
+ public void testConditionalExpression() throws Exception {
+ Iterator i = parse( "int foo(bool); int foo(int); int a = 10, b = 4, c = 2; int x = foo( a > 5 ? b : c );").getDeclarations();
+ IASTFunction foo1 = (IASTFunction)i.next();
+ IASTFunction foo2 = (IASTFunction)i.next();
+ IASTVariable a = (IASTVariable)i.next();
+ IASTVariable b = (IASTVariable)i.next();
+ IASTVariable c = (IASTVariable)i.next();
+ IASTVariable x = (IASTVariable)i.next();
+ assertFalse( i.hasNext() );
+ assertEquals( callback.getReferences().size(), 4 );
+ Iterator references =callback.getReferences().iterator();
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), a );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), b );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), c );
+ assertEquals( ((IASTReference)references.next()).getReferencedElement(), foo2 );
+ assertFalse( references.hasNext() );
+ }
// Kind CONDITIONALEXPRESSION with references : conditional Expression Conversions
public void testConditionalExpressionWithReferencesA() throws Exception {
Iterator i = parse( "class A{}; class B : public A{}; int foo(); int foo(A*); A *a ; B *b; int c = 0; int x = foo( c > 5 ? b : a );").getDeclarations();
Index: parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java,v
retrieving revision 1.19
diff -u -r1.19 ParserSymbolTableTest.java
--- parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java 15 Sep 2003 22:50:59 -0000 1.19
+++ parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java 18 Sep 2003 21:18:15 -0000
@@ -30,6 +30,7 @@
import org.eclipse.cdt.internal.core.parser.pst.TypeInfo;
import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.Mark;
import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.TemplateInstance;
+import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.OperatorExpression;
import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.PtrOp;
@@ -1187,8 +1188,8 @@
assertEquals( look.getType(), TypeInfo.t_type );
assertEquals( look.getTypeSymbol(), cls );
- assertEquals( ((PtrOp)look.getPtrOperators().getFirst()).getType(), TypeInfo.PtrOp.t_pointer );
- assertTrue( ((PtrOp)look.getPtrOperators().getFirst()).isConst() );
+ assertEquals( ((PtrOp)look.getPtrOperators().iterator().next()).getType(), TypeInfo.PtrOp.t_pointer );
+ assertTrue( ((PtrOp)look.getPtrOperators().iterator().next()).isConst() );
assertEquals( look.getContainingSymbol(), fn );
}
@@ -1364,7 +1365,9 @@
LinkedList paramList = new LinkedList();
look = compUnit.lookup( "a" );
assertEquals( look, a );
- TypeInfo param = new TypeInfo( look.getType(), 0, look, new PtrOp( PtrOp.t_reference ), false );
+ TypeInfo param = new TypeInfo( look.getType(), 0, look, null, false );
+ //new PtrOp( PtrOp.t_reference )
+ param.addOperatorExpression( OperatorExpression.addressof );
paramList.add( param );
look = compUnit.unqualifiedFunctionLookup( "f", paramList );
@@ -1640,21 +1643,21 @@
ISymbol look = compUnit.unqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f2 );
- p.addPtrOperator( new PtrOp( PtrOp.t_reference, false, false ) );
+ p.addOperatorExpression( OperatorExpression.addressof );
look = compUnit.unqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f1 );
p.setTypeSymbol( b );
- p.getPtrOperators().clear();
+ p.getOperatorExpressions().clear();
look = compUnit.unqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f1 );
- p.addPtrOperator( new PtrOp( PtrOp.t_pointer, false, false ) );
+ p.addOperatorExpression( OperatorExpression.indirection );
look = compUnit.unqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f2 );
p.setTypeSymbol( array );
- p.getPtrOperators().clear();
+ p.getOperatorExpressions().clear();
look = compUnit.unqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f1 );
@@ -1765,7 +1768,8 @@
compUnit.addSymbol( main );
LinkedList params = new LinkedList();
- TypeInfo p1 = new TypeInfo( TypeInfo.t_type, 0, i, new PtrOp( PtrOp.t_reference ), false );
+ TypeInfo p1 = new TypeInfo( TypeInfo.t_type, 0, i );
+ p1.addOperatorExpression( OperatorExpression.addressof );
TypeInfo p2 = new TypeInfo( TypeInfo.t_type, 0, s );
params.add( p1 );
params.add( p2 );
@@ -1794,7 +1798,8 @@
assertEquals( look, f2 );
params.clear();
- ((PtrOp)p1.getPtrOperators().getFirst()).setConst( true );
+ p1.addPtrOperator( new PtrOp( PtrOp.t_undef, true, false ) );
+ //((PtrOp)p1.getPtrOperators().iterator().next()).setConst( true );
params.add( p1 );
params.add( p3 );
look = main.unqualifiedFunctionLookup( "f", params );
@@ -2660,8 +2665,10 @@
table.getCompilationUnit().addSymbol( a );
table.getCompilationUnit().addSymbol( b );
- TypeInfo secondOp = new TypeInfo( TypeInfo.t_type, 0, a, new PtrOp( PtrOp.t_reference ), false );
- TypeInfo thirdOp = new TypeInfo( TypeInfo.t_type, 0, b, new PtrOp( PtrOp.t_reference ), false );
+ TypeInfo secondOp = new TypeInfo( TypeInfo.t_type, 0, a );
+ secondOp.addOperatorExpression( OperatorExpression.addressof );
+ TypeInfo thirdOp = new TypeInfo( TypeInfo.t_type, 0, b );
+ thirdOp.addOperatorExpression( OperatorExpression.addressof );
TypeInfo returned = ParserSymbolTable.getConditionalOperand( secondOp, thirdOp );
assertEquals( returned, secondOp );
@@ -2672,7 +2679,8 @@
c.setTypeSymbol( clsC );
table.getCompilationUnit().addSymbol( c );
- TypeInfo anotherOp = new TypeInfo( TypeInfo.t_type, 0, c, new PtrOp( PtrOp.t_reference ), false );
+ TypeInfo anotherOp = new TypeInfo( TypeInfo.t_type, 0, c );
+ anotherOp.addOperatorExpression( OperatorExpression.addressof );
returned = ParserSymbolTable.getConditionalOperand( secondOp, anotherOp );
assertEquals( returned, null );
@@ -2685,8 +2693,8 @@
constructorC.addParameter( clsA, null, false );
clsC.addConstructor( constructorC );
- secondOp.getPtrOperators().clear();
- anotherOp.getPtrOperators().clear();
+ secondOp.getOperatorExpressions().clear();
+ anotherOp.getOperatorExpressions().clear();
try{
returned = ParserSymbolTable.getConditionalOperand( secondOp, anotherOp );
@@ -2696,5 +2704,123 @@
}
}
+ /**
+ *
+ * @throws Exception
+ * class A {};
+ * class B : public A {} b;
+ * class C : private A {} c;
+ * int f ( A & );
+ *
+ * int i = f ( b ); //calls f( A & );
+ *
+ * int f ( B & );
+ * i = f( b ); //now calls f( B& );
+ *
+ * i = f( c ); //exception, A is not an accessible base class
+ */
+ public void testDerivedReference() throws Exception{
+ newTable();
+
+ IDerivableContainerSymbol clsA = table.newDerivableContainerSymbol( "A", TypeInfo.t_class );
+ IDerivableContainerSymbol clsB = table.newDerivableContainerSymbol( "B", TypeInfo.t_class );
+ IDerivableContainerSymbol clsC = table.newDerivableContainerSymbol( "C", TypeInfo.t_class );
+
+ clsB.addParent( clsA );
+ clsC.addParent( clsA, false, ASTAccessVisibility.PRIVATE, 0, null );
+
+ ISymbol b = table.newSymbol("b", TypeInfo.t_type );
+ b.setTypeSymbol( clsB );
+
+ ISymbol c = table.newSymbol("c", TypeInfo.t_type );
+ c.setTypeSymbol( clsC );
+
+ table.getCompilationUnit().addSymbol( clsA );
+ table.getCompilationUnit().addSymbol( clsB );
+ table.getCompilationUnit().addSymbol( clsC );
+ table.getCompilationUnit().addSymbol( b );
+ table.getCompilationUnit().addSymbol( c );
+
+ IParameterizedSymbol f1 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
+ f1.addParameter( clsA, new PtrOp( PtrOp.t_reference ), false );
+ table.getCompilationUnit().addSymbol( f1 );
+
+ LinkedList parameters = new LinkedList();
+ TypeInfo param = new TypeInfo( TypeInfo.t_type, 0, b );
+ parameters.add( param );
+
+ ISymbol look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", parameters );
+ assertEquals( look, f1 );
+
+ IParameterizedSymbol f2 = table.newParameterizedSymbol( "f", TypeInfo.t_function );
+ f2.addParameter( clsB, new PtrOp( PtrOp.t_reference ), false );
+ table.getCompilationUnit().addSymbol( f2 );
+
+ look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", parameters );
+ assertEquals( look, f2 );
+
+ parameters.clear();
+ param = new TypeInfo( TypeInfo.t_type, 0, c );
+ parameters.add( param );
+ try{
+ look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", parameters );
+ assertTrue( false );
+ } catch ( ParserSymbolTableException e ){
+ //good
+ }
+ }
+
+ /**
+ *
+ * @throws Exception
+ *
+ * class A {
+ * private :
+ * A ( const A & ) {}
+ * } a;
+ *
+ * class B : public A {
+ * } b;
+ *
+ * 1 > 2 ? a : b; //fails, b can't be converted to a without the A( const A & ) copy constructor
+ * -----------------------
+ * class A {
+ * A ( const A & ) {}
+ * } a;
+ * class B : public A {} b;
+ *
+ * 1 > 2 ? a : b; //succeeds, b can be converted to a using copy constructor
+ *
+ */
+ public void testAddCopyConstructor() throws Exception {
+ newTable();
+
+ IDerivableContainerSymbol clsA = table.newDerivableContainerSymbol( "A", TypeInfo.t_class );
+ table.getCompilationUnit().addSymbol( clsA );
+
+ ISymbol a = table.newSymbol( "a", TypeInfo.t_type );
+ a.setTypeSymbol( clsA );
+ table.getCompilationUnit().addSymbol( a );
+
+ IDerivableContainerSymbol clsB = table.newDerivableContainerSymbol( "B", TypeInfo.t_class );
+ clsB.addParent( clsA );
+ table.getCompilationUnit().addSymbol( clsB );
+
+ ISymbol b = table.newSymbol( "b", TypeInfo.t_type );
+ b.setTypeSymbol( clsB );
+ table.getCompilationUnit().addSymbol( b );
+
+ TypeInfo secondOp = new TypeInfo( TypeInfo.t_type, 0, a, null, false );
+ TypeInfo thirdOp = new TypeInfo( TypeInfo.t_type, 0, b, null, false );
+
+ TypeInfo returned = ParserSymbolTable.getConditionalOperand( secondOp, thirdOp );
+ assertEquals( returned, null );
+
+ clsA.addCopyConstructor();
+ clsB.addCopyConstructor();
+
+ returned = ParserSymbolTable.getConditionalOperand( secondOp, thirdOp );
+ assertEquals( returned, secondOp );
+ }
}
Index: search/org/eclipse/cdt/core/search/tests/BaseSearchTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/BaseSearchTest.java,v
retrieving revision 1.7
diff -u -r1.7 BaseSearchTest.java
--- search/org/eclipse/cdt/core/search/tests/BaseSearchTest.java 9 Sep 2003 20:13:37 -0000 1.7
+++ search/org/eclipse/cdt/core/search/tests/BaseSearchTest.java 18 Sep 2003 21:18:15 -0000
@@ -80,7 +80,7 @@
fileManager = new FileManager();
//Add a file to the project
- importFile("mail.cpp", "resources/indexer/mail.cpp");
+ //importFile("mail.cpp", "resources/indexer/mail.cpp");
importFile("classDecl.cpp", "resources/search/classDecl.cpp");
importFile("include.h", "resources/search/include.h");
Index: search/org/eclipse/cdt/core/search/tests/ClassDeclarationPatternTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/ClassDeclarationPatternTests.java,v
retrieving revision 1.15
diff -u -r1.15 ClassDeclarationPatternTests.java
--- search/org/eclipse/cdt/core/search/tests/ClassDeclarationPatternTests.java 15 Sep 2003 17:31:17 -0000 1.15
+++ search/org/eclipse/cdt/core/search/tests/ClassDeclarationPatternTests.java 18 Sep 2003 21:18:16 -0000
@@ -22,7 +22,6 @@
import org.eclipse.cdt.core.search.SearchEngine;
import org.eclipse.cdt.internal.core.CharOperation;
import org.eclipse.cdt.internal.core.search.matching.ClassDeclarationPattern;
-import org.eclipse.cdt.internal.core.search.matching.MatchLocator;
import org.eclipse.cdt.internal.core.search.matching.OrPattern;
@@ -34,10 +33,6 @@
*/
public class ClassDeclarationPatternTests extends BaseSearchTest implements ICSearchConstants {
- private MatchLocator matchLocator;
-
- private String cppPath;
-
public ClassDeclarationPatternTests(String name) {
super(name);
}
Index: search/org/eclipse/cdt/core/search/tests/FunctionMethodPatternTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/FunctionMethodPatternTests.java,v
retrieving revision 1.8
diff -u -r1.8 FunctionMethodPatternTests.java
--- search/org/eclipse/cdt/core/search/tests/FunctionMethodPatternTests.java 18 Sep 2003 15:14:59 -0000 1.8
+++ search/org/eclipse/cdt/core/search/tests/FunctionMethodPatternTests.java 18 Sep 2003 21:18:16 -0000
@@ -138,6 +138,6 @@
pattern = SearchEngine.createSearchPattern( "operator *", METHOD, DECLARATIONS, true );
search( workspace, pattern, scope, resultCollector );
matches = resultCollector.getSearchResults();
- assertEquals( matches.size(), 5 ); //3 in classDecl.cpp, 2 in mail.cpp
+ assertEquals( matches.size(), 3 ); //3 in classDecl.cpp
}
}