[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Structural changes to ParserSymbolTable (for head)
|
core:
Structural changes to
ParserSymbolTable:
- moved TypeInfo & Declaration inside ParserSymbolTable
- removed the stack & push/pop/peek
- moved nonstatic add/lookup fuctions from the table to Declaration
- began undo framework: added AddDeclarationCommand
tests:
Rewrote ParserSymbolTableTest to reflect structural changes to the symbol
table.
-Andrew
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/ChangeLog,v
retrieving revision 1.49
diff -u -r1.49 ChangeLog
--- ChangeLog 1 May 2003 20:04:43 -0000 1.49
+++ ChangeLog 5 May 2003 16:04:54 -0000
@@ -1,3 +1,6 @@
+2003-05-05 Andrew Niefer
+ Rewrote ParserSymbolTableTest to reflect structural changes to the symbol table.
+
2003-05-01 Andrew Niefer
Updated FractionalAutomatedTest to use threads
Modified ScannerTestCase::testBug36287
Index: parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java,v
retrieving revision 1.12
diff -u -r1.12 ParserSymbolTableTest.java
--- parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java 9 Apr 2003 21:12:09 -0000 1.12
+++ parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java 5 May 2003 16:04:54 -0000
@@ -17,10 +17,8 @@
import junit.framework.TestCase;
-import org.eclipse.cdt.internal.core.parser.Declaration;
import org.eclipse.cdt.internal.core.parser.ParserSymbolTable;
import org.eclipse.cdt.internal.core.parser.ParserSymbolTableException;
-import org.eclipse.cdt.internal.core.parser.TypeInfo;
/**
* @author aniefer
@@ -53,21 +51,18 @@
public void testSimpleAdd() throws Exception{
newTable(); //create the symbol table
- Declaration decl = new Declaration( "x" );
-
- table.addDeclaration( decl );
-
- Declaration compUnit = table.getCompilationUnit();
- assertEquals( compUnit, table.peek() );
-
+ ParserSymbolTable.Declaration x = table.new Declaration( "x" );
+ ParserSymbolTable.Declaration compUnit = (ParserSymbolTable.Declaration) table.getCompilationUnit();
+ compUnit.addDeclaration( x );
+
Map declarations = compUnit.getContainedDeclarations();
assertEquals( 1, declarations.size() );
Iterator iter = declarations.values().iterator();
- Declaration contained = (Declaration) iter.next();
+ ParserSymbolTable.Declaration contained = (ParserSymbolTable.Declaration) iter.next();
assertEquals( false, iter.hasNext() );
- assertEquals( decl, contained );
+ assertEquals( x, contained );
assertEquals( contained.getName(), "x" );
}
@@ -79,19 +74,18 @@
public void testSimpleLookup() throws Exception{
newTable(); //new symbol table
- Declaration decl = new Declaration( "x" );
+ ParserSymbolTable.Declaration x = table.new Declaration( "x" );
+ table.getCompilationUnit().addDeclaration( x );
- table.addDeclaration( decl );
+ ParserSymbolTable.Declaration look = table.getCompilationUnit().Lookup( "x" );
- Declaration look = table.Lookup( "x" );
-
- assertEquals( decl, look );
+ assertEquals( x, look );
}
public void testLookupNonExistant() throws Exception{
newTable();
- Declaration look = table.Lookup( "boo" );
+ ParserSymbolTable.Declaration look = table.getCompilationUnit().Lookup("boo");
assertEquals( look, null );
}
@@ -99,7 +93,7 @@
* testSimplePushPop
* test pushing and popping
* @throws Exception
- */
+ *//*
public void testSimplePushPop() throws Exception{
newTable();
@@ -113,19 +107,19 @@
Declaration popped = table.pop();
assertEquals( pushing, popped );
assertEquals( table.peek(), table.getCompilationUnit() );
- }
+ }*/
public void testSimpleSetGetObject() throws Exception{
newTable();
- Declaration decl = new Declaration( "x" );
- Object obj = new Object();
-
- decl.setObject( obj );
+ ParserSymbolTable.Declaration x = table.new Declaration("x");
- table.addDeclaration( decl );
+ Object obj = new Object();
+ x.setObject( obj );
+
+ table.getCompilationUnit().addDeclaration( x );
- Declaration look = table.Lookup( "x" );
+ ParserSymbolTable.Declaration look = table.getCompilationUnit().Lookup( "x" );
assertEquals( look.getObject(), obj );
}
@@ -139,25 +133,23 @@
public void testHide() throws Exception{
newTable();
- Declaration firstX = new Declaration( "x" );
- table.addDeclaration( firstX );
+ ParserSymbolTable.Declaration firstX = table.new Declaration("x");
+ table.getCompilationUnit().addDeclaration( firstX );
- Declaration firstClass = new Declaration( "class" );
- table.addDeclaration( firstClass );
- table.push( firstClass );
-
- Declaration look = table.Lookup( "x" );
+ ParserSymbolTable.Declaration firstClass = table.new Declaration("class");
+ firstClass.setType( ParserSymbolTable.TypeInfo.t_class );
+ table.getCompilationUnit().addDeclaration( firstClass );
+
+ ParserSymbolTable.Declaration look = firstClass.Lookup( "x" );
assertEquals( look, firstX );
- Declaration secondX = new Declaration( "x" );
- table.addDeclaration( secondX );
+ ParserSymbolTable.Declaration secondX = table.new Declaration("x");
+ firstClass.addDeclaration( secondX );
- look = table.Lookup( "x" );
+ look = firstClass.Lookup( "x" );
assertEquals( look, secondX );
- table.pop();
-
- look = table.Lookup( "x" );
+ look = table.getCompilationUnit().Lookup( "x" );
assertEquals( look, firstX );
}
@@ -169,14 +161,14 @@
public void testContainingScopeLookup() throws Exception{
newTable();
- Declaration x = new Declaration("x");
- Declaration cls = new Declaration("class");
-
- table.addDeclaration( x );
- table.addDeclaration( cls );
- table.push( cls );
+ ParserSymbolTable.Declaration x = table.new Declaration("x");
+ table.getCompilationUnit().addDeclaration( x );
+
+ ParserSymbolTable.Declaration decl = table.new Declaration("class");
+ decl.setType( ParserSymbolTable.TypeInfo.t_class );
+ table.getCompilationUnit().addDeclaration( decl );
- Declaration look = table.Lookup( "x" );
+ ParserSymbolTable.Declaration look = decl.Lookup( "x" );
assertEquals( x, look );
}
@@ -190,24 +182,21 @@
public void testParentLookup() throws Exception{
newTable();
- Declaration class1 = new Declaration( "class" );
- Declaration parent = new Declaration( "parent" );
- Declaration decl = new Declaration( "x" );
-
- table.addDeclaration( parent );
- table.push( parent );
- table.addDeclaration( decl );
- table.pop();
-
+ ParserSymbolTable.Declaration parent = table.new Declaration("parent");
+ parent.setType( ParserSymbolTable.TypeInfo.t_class );
+
+ ParserSymbolTable.Declaration class1 = table.new Declaration("class");
+ class1.setType( ParserSymbolTable.TypeInfo.t_class );
class1.addParent( parent );
- table.addDeclaration( class1 );
- table.push( class1 );
- Declaration look = table.Lookup( "x" );
- assertEquals( look, decl );
+ ParserSymbolTable.Declaration decl = table.new Declaration("x");
+ parent.addDeclaration( decl );
- table.pop();
- assertEquals( table.peek(), table.getCompilationUnit() );
+ table.getCompilationUnit().addDeclaration( parent );
+ table.getCompilationUnit().addDeclaration( class1 );
+
+ ParserSymbolTable.Declaration look = class1.Lookup( "x" );
+ assertEquals( look, decl );
}
/**
@@ -221,28 +210,23 @@
*/
public void testAmbiguousParentLookup() throws Exception{
testParentLookup();
+
+ ParserSymbolTable.Declaration parent2 = table.new Declaration("parent2");
+ table.getCompilationUnit().addDeclaration( parent2 );
- Declaration parent2 = new Declaration( "parent2" );
-
- table.addDeclaration( parent2 );
-
- Declaration class1 = table.Lookup( "class" );
+ ParserSymbolTable.Declaration class1 = table.getCompilationUnit().Lookup( "class" );
class1.addParent( parent2 );
- Declaration decl = new Declaration("x");
- table.push( parent2 );
- table.addDeclaration( decl );
- table.pop();
-
- table.push( class1 );
+ ParserSymbolTable.Declaration decl = table.new Declaration("x");
+ parent2.addDeclaration( decl );
+
try{
- table.Lookup( "x" );
+ class1.Lookup( "x" );
assertTrue( false );
}
catch ( ParserSymbolTableException e ){
- assertTrue( true );
+ assertEquals( e.reason, ParserSymbolTableException.r_Ambiguous );
}
-
}
/**
@@ -253,19 +237,17 @@
public void testCircularParentLookup() throws Exception{
newTable();
- Declaration a = new Declaration("a");
- table.addDeclaration( a );
-
- Declaration b = new Declaration("b");
- table.addDeclaration(b);
+ ParserSymbolTable.Declaration a = table.new Declaration("a");
+ table.getCompilationUnit().addDeclaration( a );
- a.addParent( b );
+ ParserSymbolTable.Declaration b = table.new Declaration("b");
b.addParent( a );
-
- table.push( a );
+ table.getCompilationUnit().addDeclaration( b );
+
+ a.addParent( b );
try{
- Declaration look = table.Lookup("foo");
+ ParserSymbolTable.Declaration look = a.Lookup("foo");
assertTrue( false );
} catch ( ParserSymbolTableException e) {
assertEquals( e.reason, ParserSymbolTableException.r_CircularInheritance );
@@ -287,37 +269,31 @@
public void testVirtualParentLookup() throws Exception{
newTable();
- Declaration decl = new Declaration("class");
- Declaration c = new Declaration("C");
+ ParserSymbolTable.Declaration decl = table.new Declaration("class");
+ ParserSymbolTable.Declaration c = table.new Declaration("C");
- Declaration a = new Declaration("A");
+ ParserSymbolTable.Declaration a = table.new Declaration("A");
a.addParent( c, true );
- Declaration b = new Declaration("B");
+ ParserSymbolTable.Declaration b = table.new Declaration("B");
b.addParent( c, true );
decl.addParent( a );
decl.addParent( b );
- table.addDeclaration( c );
- table.push( c );
- Declaration x = new Declaration( "x" );
- table.addDeclaration( x );
- table.pop();
-
- table.addDeclaration( decl );
- table.addDeclaration( a );
- table.addDeclaration( b );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+ compUnit.addDeclaration( c );
- table.push(decl);
+ ParserSymbolTable.Declaration x = table.new Declaration( "x" );
+ c.addDeclaration( x );
- Declaration look = table.Lookup( "x" );
-
- assertEquals( look, x );
+ compUnit.addDeclaration( decl );
+ compUnit.addDeclaration( a );
+ compUnit.addDeclaration( b );
- table.pop();
+ ParserSymbolTable.Declaration look = decl.Lookup( "x" );
- assertEquals( table.peek(), table.getCompilationUnit() );
+ assertEquals( look, x );
}
/**
@@ -334,18 +310,17 @@
public void testAmbiguousVirtualParentLookup() throws Exception{
testVirtualParentLookup();
- Declaration cls = table.Lookup("class");
- Declaration c = table.Lookup("C");
- Declaration d = new Declaration("D");
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
- d.addParent( c );
+ ParserSymbolTable.Declaration cls = compUnit.Lookup("class");
+ ParserSymbolTable.Declaration c = compUnit.Lookup("C");
+ ParserSymbolTable.Declaration d = table.new Declaration("D");
+ d.addParent( c );
cls.addParent( d );
- table.push( cls );
-
try{
- table.Lookup( "x" );
+ cls.Lookup( "x" );
assertTrue( false );
}
catch( ParserSymbolTableException e){
@@ -369,44 +344,42 @@
public void testStaticEnumParentLookup() throws Exception{
newTable();
- Declaration a = new Declaration( "a" );
- Declaration b = new Declaration( "b" );
- Declaration c = new Declaration( "c" );
- Declaration d = new Declaration( "d" );
-
- table.addDeclaration( a );
- table.addDeclaration( b );
- table.addDeclaration( c );
- table.addDeclaration( d );
-
- Declaration enum = new Declaration("enum");
- enum.setType( TypeInfo.t_enumeration );
-
- Declaration enumerator = new Declaration( "enumerator" );
- enumerator.setType( TypeInfo.t_enumerator );
-
- Declaration stat = new Declaration("static");
- stat.getTypeInfo().setBit( true, TypeInfo.isStatic );
-
- Declaration x = new Declaration("x");
-
- table.push(d);
- table.addDeclaration( enum );
- table.push( enum );
- table.addDeclaration( enumerator );
- table.pop();
- table.addDeclaration( stat );
- table.addDeclaration( x );
- table.pop();
+ ParserSymbolTable.Declaration a = table.new Declaration( "a" );
+ ParserSymbolTable.Declaration b = table.new Declaration( "b" );
+ ParserSymbolTable.Declaration c = table.new Declaration( "c" );
+ ParserSymbolTable.Declaration d = table.new Declaration( "d" );
+
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
+ compUnit.addDeclaration( a );
+ compUnit.addDeclaration( b );
+ compUnit.addDeclaration( c );
+ compUnit.addDeclaration( d );
+
+ ParserSymbolTable.Declaration enum = table.new Declaration("enum");
+ enum.setType( ParserSymbolTable.TypeInfo.t_enumeration );
+
+ ParserSymbolTable.Declaration enumerator = table.new Declaration( "enumerator" );
+ enumerator.setType( ParserSymbolTable.TypeInfo.t_enumerator );
+
+ ParserSymbolTable.Declaration stat = table.new Declaration("static");
+ stat.getTypeInfo().setBit( true, ParserSymbolTable.TypeInfo.isStatic );
+
+ ParserSymbolTable.Declaration x = table.new Declaration("x");
+
+ d.addDeclaration( enum );
+ d.addDeclaration( stat );
+ d.addDeclaration( x );
+
+ enum.addDeclaration( enumerator );
a.addParent( b );
a.addParent( c );
b.addParent( d );
c.addParent( d );
- table.push( a );
try{
- table.Lookup( "enumerator" );
+ a.Lookup( "enumerator" );
assertTrue( true );
}
catch ( ParserSymbolTableException e){
@@ -414,7 +387,7 @@
}
try{
- table.Lookup( "static" );
+ a.Lookup( "static" );
assertTrue( true );
}
catch ( ParserSymbolTableException e){
@@ -422,7 +395,7 @@
}
try{
- table.Lookup( "x" );
+ a.Lookup( "x" );
assertTrue( false );
}
catch ( ParserSymbolTableException e){
@@ -438,76 +411,74 @@
public void testElaboratedLookup() throws Exception{
newTable();
- Declaration cls = new Declaration( "class" );
- cls.setType( TypeInfo.t_class );
+ ParserSymbolTable.Declaration cls = table.new Declaration( "class" );
+ cls.setType( ParserSymbolTable.TypeInfo.t_class );
+
+ ParserSymbolTable.Declaration struct = table.new Declaration("struct");
+ struct.setType( ParserSymbolTable.TypeInfo.t_struct );
- Declaration struct = new Declaration("struct");
- struct.setType( TypeInfo.t_struct );
+ ParserSymbolTable.Declaration union = table.new Declaration("union");
+ union.setType( ParserSymbolTable.TypeInfo.t_union );
- Declaration union = new Declaration("union");
- union.setType( TypeInfo.t_union );
+ ParserSymbolTable.Declaration hideCls = table.new Declaration( "class" );
+ ParserSymbolTable.Declaration hideStruct = table.new Declaration("struct");
+ ParserSymbolTable.Declaration hideUnion = table.new Declaration("union");
- Declaration hideCls = new Declaration( "class" );
- Declaration hideStruct = new Declaration("struct");
- Declaration hideUnion = new Declaration("union");
-
- Declaration a = new Declaration("a");
- Declaration b = new Declaration("b");
-
- table.push(a);
- table.addDeclaration(hideCls);
- table.addDeclaration(hideStruct);
- table.addDeclaration(hideUnion);
+ ParserSymbolTable.Declaration a = table.new Declaration("a");
+ ParserSymbolTable.Declaration b = table.new Declaration("b");
+
+ a.addDeclaration(hideCls);
+ a.addDeclaration(hideStruct);
+ a.addDeclaration(hideUnion);
a.addParent( b );
- table.push(b);
- table.addDeclaration(cls);
- table.addDeclaration(struct);
- table.addDeclaration(union);
- table.pop();
+ b.addDeclaration(cls);
+ b.addDeclaration(struct);
+ b.addDeclaration(union);
- Declaration look = table.ElaboratedLookup( TypeInfo.t_class, "class" );
+ ParserSymbolTable.Declaration look = a.ElaboratedLookup( ParserSymbolTable.TypeInfo.t_class, "class" );
assertEquals( look, cls );
- look = table.ElaboratedLookup( TypeInfo.t_struct, "struct" );
+ look = a.ElaboratedLookup( ParserSymbolTable.TypeInfo.t_struct, "struct" );
assertEquals( look, struct );
- look = table.ElaboratedLookup( TypeInfo.t_union, "union" );
+ look = a.ElaboratedLookup( ParserSymbolTable.TypeInfo.t_union, "union" );
assertEquals( look, union );
}
/**
* testDeclarationType
* @throws Exception
- * test the use of Declaration type in the scenario
+ * test the use of ParserSymbolTable.Declaration type in the scenario
* A a;
* a.member <=...>;
* where A was previously declared
*/
public void testDeclarationType() throws Exception{
newTable();
+
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
//pre-condition
- Declaration A = new Declaration("A");
- table.addDeclaration(A);
+ ParserSymbolTable.Declaration A = table.new Declaration("A");
+ compUnit.addDeclaration(A);
- Declaration member = new Declaration("member");
- table.push(A);
- table.addDeclaration(member);
- table.pop();
+ ParserSymbolTable.Declaration member = table.new Declaration("member");
+ A.addDeclaration(member);
//at time of "A a;"
- Declaration look = table.Lookup("A");
+ ParserSymbolTable.Declaration look = compUnit.Lookup("A");
assertEquals( look, A );
- Declaration a = new Declaration("a");
+ ParserSymbolTable.Declaration a = table.new Declaration("a");
a.setTypeDeclaration( look );
- table.addDeclaration( a );
+ compUnit.addDeclaration( a );
//later "a.member"
- look = table.Lookup("a");
+ look = compUnit.Lookup("a");
assertEquals( look, a );
- Declaration type = look.getTypeDeclaration();
+ ParserSymbolTable.Declaration type = look.getTypeDeclaration();
assertEquals( type, A );
- table.push(type);
- look = table.Lookup("member");
+
+ look = type.Lookup("member");
assertEquals( look, member );
}
@@ -528,23 +499,24 @@
public void testFunctionHidesClass() throws Exception{
newTable();
- Declaration struct = new Declaration( "stat");
- struct.setType( TypeInfo.t_struct );
- table.addDeclaration( struct );
-
- Declaration function = new Declaration( "stat" );
- function.setType( TypeInfo.t_function );
- table.addDeclaration( function );
-
- Declaration f = new Declaration("f");
- f.setType( TypeInfo.t_function );
- table.addDeclaration( f );
- table.push( f );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
- Declaration look = table.ElaboratedLookup( TypeInfo.t_struct, "stat" );
+ ParserSymbolTable.Declaration struct = table.new Declaration( "stat");
+ struct.setType( ParserSymbolTable.TypeInfo.t_struct );
+ compUnit.addDeclaration( struct );
+
+ ParserSymbolTable.Declaration function = table.new Declaration( "stat" );
+ function.setType( ParserSymbolTable.TypeInfo.t_function );
+ compUnit.addDeclaration( function );
+
+ ParserSymbolTable.Declaration f = table.new Declaration("f");
+ f.setType( ParserSymbolTable.TypeInfo.t_function );
+ compUnit.addDeclaration( f );
+
+ ParserSymbolTable.Declaration look = f.ElaboratedLookup( ParserSymbolTable.TypeInfo.t_struct, "stat" );
assertEquals( look, struct );
- look = table.Lookup( "stat" );
+ look = f.Lookup( "stat" );
assertEquals( look, function );
}
@@ -582,64 +554,54 @@
public void testUsingDirectives_1() throws Exception{
newTable();
- Declaration nsA = new Declaration("A");
- nsA.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsA );
- table.push( nsA );
-
- Declaration nsA_i = new Declaration("i");
- table.addDeclaration( nsA_i );
-
- Declaration nsB = new Declaration("B");
- nsB.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsB );
- table.push( nsB );
-
- Declaration nsC = new Declaration("C");
- nsC.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsC );
- table.push( nsC );
-
- Declaration nsC_i = new Declaration("i");
- table.addDeclaration( nsC_i );
- table.pop();
-
- Declaration look = table.Lookup("C");
- table.addUsingDirective( look );
-
- Declaration f1 = new Declaration("f");
- f1.setType( TypeInfo.t_function );
- table.push( f1 );
+ ParserSymbolTable.Declaration nsA = table.new Declaration("A");
+ nsA.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ table.getCompilationUnit().addDeclaration( nsA );
- look = table.Lookup( "i" );
- assertEquals( look, nsC_i ); //C::i visible and hides A::i
+ ParserSymbolTable.Declaration nsA_i = table.new Declaration("i");
+ nsA.addDeclaration( nsA_i );
+
+ ParserSymbolTable.Declaration nsB = table.new Declaration("B");
+ nsB.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ nsA.addDeclaration( nsB );
- table.pop(); //end of f1
- table.pop(); //end of nsB
+ ParserSymbolTable.Declaration nsC = table.new Declaration("C");
+ nsC.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ nsB.addDeclaration( nsC );
- assertEquals( table.peek(), nsA );
+ ParserSymbolTable.Declaration nsC_i = table.new Declaration("i");
+ nsC.addDeclaration( nsC_i );
- Declaration nsD = new Declaration("D");
- nsD.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsD );
- table.push( nsD );
+ ParserSymbolTable.Declaration look = nsB.Lookup("C");
+ nsB.addUsingDirective( look );
- look = table.Lookup("B");
+ ParserSymbolTable.Declaration f1 = table.new Declaration("f");
+ f1.setType( ParserSymbolTable.TypeInfo.t_function );
+
+ nsB.addDeclaration( f1 );
+
+ look = f1.Lookup( "i" );
+ assertEquals( look, nsC_i ); //C::i visible and hides A::i
+
+ ParserSymbolTable.Declaration nsD = table.new Declaration("D");
+ nsD.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ nsA.addDeclaration( nsD );
+
+ look = nsD.Lookup("B");
assertEquals( look, nsB );
- table.addUsingDirective( look );
+ nsD.addUsingDirective( look );
- look = table.Lookup("C");
+ look = nsD.Lookup("C");
assertEquals( look, nsC );
- table.addUsingDirective( look );
+ nsD.addUsingDirective( look );
- Declaration f2 = new Declaration( "f2" );
- f2.setType( TypeInfo.t_function );
- table.addDeclaration( f2 );
- table.push( f2 );
+ ParserSymbolTable.Declaration f2 = table.new Declaration( "f2" );
+ f2.setType( ParserSymbolTable.TypeInfo.t_function );
+ nsD.addDeclaration( f2 );
try
{
- look = table.Lookup( "i" );
+ look = f2.Lookup( "i" );
assertTrue( false );
}
catch ( ParserSymbolTableException e )
@@ -647,26 +609,19 @@
//ambiguous B::C::i and A::i
assertEquals( e.reason, ParserSymbolTableException.r_Ambiguous );
}
- table.pop(); //end f2
- table.pop(); //end nsD
- Declaration f3 = new Declaration ("f3");
- f3.setType( TypeInfo.t_function );
- table.addDeclaration( f3 );
- table.push( f3 );
+ ParserSymbolTable.Declaration f3 = table.new Declaration ("f3");
+ f3.setType( ParserSymbolTable.TypeInfo.t_function );
+ nsA.addDeclaration( f3 );
- look = table.Lookup("i");
+ look = f3.Lookup("i");
assertEquals( look, nsA_i ); //uses A::i
- table.pop();
- table.pop();
-
- Declaration f4 = new Declaration ("f4");
- f4.setType( TypeInfo.t_function );
- table.addDeclaration( f4 );
- table.push( f4 );
+ ParserSymbolTable.Declaration f4 = table.new Declaration ("f4");
+ f4.setType( ParserSymbolTable.TypeInfo.t_function );
+ table.getCompilationUnit().addDeclaration( f4 );
- look = table.Lookup("i");
+ look = f4.Lookup("i");
assertEquals( look, null );//neither i is visible here.
}
/**
@@ -693,37 +648,34 @@
{
newTable();
- Declaration nsM = new Declaration( "M" );
- nsM.setType( TypeInfo.t_namespace );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
- table.addDeclaration( nsM );
+ ParserSymbolTable.Declaration nsM = table.new Declaration( "M" );
+ nsM.setType( ParserSymbolTable.TypeInfo.t_namespace );
- table.push( nsM );
- Declaration nsM_i = new Declaration("i");
- table.addDeclaration( nsM_i );
- table.pop();
+ compUnit.addDeclaration( nsM );
- Declaration nsN = new Declaration( "N" );
- nsN.setType( TypeInfo.t_namespace );
+ ParserSymbolTable.Declaration nsM_i = table.new Declaration("i");
+ nsM.addDeclaration( nsM_i );
+
+ ParserSymbolTable.Declaration nsN = table.new Declaration( "N" );
+ nsN.setType( ParserSymbolTable.TypeInfo.t_namespace );
- table.addDeclaration( nsN );
+ compUnit.addDeclaration( nsN );
- table.push( nsN );
- Declaration nsN_i = new Declaration("i");
- table.addDeclaration( nsN_i );
- table.addUsingDirective( nsM );
- table.pop();
+ ParserSymbolTable.Declaration nsN_i = table.new Declaration("i");
+ nsN.addDeclaration( nsN_i );
+ nsN.addUsingDirective( nsM );
- Declaration f = new Declaration("f");
- table.addDeclaration( f );
- table.push( f );
+ ParserSymbolTable.Declaration f = table.new Declaration("f");
+ compUnit.addDeclaration( f );
- table.addUsingDirective( nsN );
+ f.addUsingDirective( nsN );
- Declaration look = null;
+ ParserSymbolTable.Declaration look = null;
try
{
- look = table.Lookup( "i" );
+ look = f.Lookup( "i" );
assertTrue( false );
}
catch ( ParserSymbolTableException e )
@@ -732,9 +684,8 @@
assertEquals( e.reason, ParserSymbolTableException.r_Ambiguous );
}
- look = table.LookupNestedNameSpecifier("N");
- table.push( look );
- look = table.QualifiedLookup("i"); //ok
+ look = f.LookupNestedNameSpecifier("N");
+ look = look.QualifiedLookup("i"); //ok
assertEquals( look, nsN_i );
}
@@ -765,46 +716,38 @@
{
newTable();
- Declaration nsA = new Declaration("A");
- nsA.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsA );
- table.push( nsA );
-
- Declaration a = new Declaration("a");
- table.addDeclaration( a );
- table.pop();
-
- Declaration nsB = new Declaration("B");
- nsB.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsB );
- table.push( nsB );
- table.addUsingDirective( nsA );
- table.pop();
-
- Declaration nsC = new Declaration("C");
- nsC.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsC );
- table.push( nsC );
- table.addUsingDirective( nsA );
- table.pop();
-
- Declaration nsBC = new Declaration("BC");
- nsBC.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsBC );
- table.push( nsBC );
- table.addUsingDirective( nsB );
- table.addUsingDirective( nsC );
- table.pop();
-
- Declaration f = new Declaration("f");
- f.setType(TypeInfo.t_function);
- table.addDeclaration( f );
- table.push(f);
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
- Declaration look = table.LookupNestedNameSpecifier("BC");
+ ParserSymbolTable.Declaration nsA = table.new Declaration("A");
+ nsA.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ compUnit.addDeclaration( nsA );
+
+ ParserSymbolTable.Declaration a = table.new Declaration("a");
+ nsA.addDeclaration( a );
+
+ ParserSymbolTable.Declaration nsB = table.new Declaration("B");
+ nsB.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ compUnit.addDeclaration( nsB );
+ nsB.addUsingDirective( nsA );
+
+ ParserSymbolTable.Declaration nsC = table.new Declaration("C");
+ nsC.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ compUnit.addDeclaration( nsC );
+ nsC.addUsingDirective( nsA );
+
+ ParserSymbolTable.Declaration nsBC = table.new Declaration("BC");
+ nsBC.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ compUnit.addDeclaration( nsBC );
+ nsBC.addUsingDirective( nsB );
+ nsBC.addUsingDirective( nsC );
+
+ ParserSymbolTable.Declaration f = table.new Declaration("f");
+ f.setType(ParserSymbolTable.TypeInfo.t_function);
+ compUnit.addDeclaration( f );
+
+ ParserSymbolTable.Declaration look = f.LookupNestedNameSpecifier("BC");
assertEquals( look, nsBC );
- table.push(look);
- look = table.QualifiedLookup("a");
+ look = look.QualifiedLookup("a");
assertEquals( look, a );
}
@@ -834,53 +777,42 @@
{
newTable();
- Declaration nsB = new Declaration( "B" );
- nsB.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsB );
- table.push( nsB );
-
- Declaration b = new Declaration("b");
- table.addDeclaration( b );
- table.pop();
-
- Declaration nsA = new Declaration( "A" );
- nsA.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsA );
- table.push( nsA );
-
- table.addUsingDirective( nsB );
-
- Declaration a = new Declaration("a");
- table.addDeclaration( a );
-
- table.pop();
-
- table.push( nsB );
- table.addUsingDirective( nsA );
- table.pop();
-
- Declaration f = new Declaration("f");
- table.addDeclaration(f);
- table.push(f);
-
- Declaration look = table.LookupNestedNameSpecifier("A");
- table.push(look);
- look = table.QualifiedLookup("a");
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
+ ParserSymbolTable.Declaration nsB = table.new Declaration( "B" );
+ nsB.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ compUnit.addDeclaration( nsB );
+
+ ParserSymbolTable.Declaration b = table.new Declaration("b");
+ nsB.addDeclaration( b );
+
+ ParserSymbolTable.Declaration nsA = table.new Declaration( "A" );
+ nsA.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ compUnit.addDeclaration( nsA );
+
+ nsA.addUsingDirective( nsB );
+
+ ParserSymbolTable.Declaration a = table.new Declaration("a");
+ nsA.addDeclaration( a );
+
+ nsB.addUsingDirective( nsA );
+
+ ParserSymbolTable.Declaration f = table.new Declaration("f");
+ compUnit.addDeclaration(f);
+
+ ParserSymbolTable.Declaration lookA = f.LookupNestedNameSpecifier("A");
+ ParserSymbolTable.Declaration look = lookA.QualifiedLookup("a");
assertEquals( look, a );
- look = table.QualifiedLookup("b");
+ look = lookA.QualifiedLookup("b");
assertEquals( look, b );
- table.pop();
- look = table.LookupNestedNameSpecifier("B");
- table.push(look);
- look = table.QualifiedLookup("a");
+ ParserSymbolTable.Declaration lookB = f.LookupNestedNameSpecifier("B");
+ look = lookB.QualifiedLookup("a");
assertEquals( look, a );
- look = table.QualifiedLookup("b");
+ look = lookB.QualifiedLookup("b");
assertEquals( look, b );
- table.pop();
-
}
/**
@@ -908,30 +840,26 @@
{
newTable();
- Declaration nsA = new Declaration( "A" );
- nsA.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsA );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
+ ParserSymbolTable.Declaration nsA = table.new Declaration( "A" );
+ nsA.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ compUnit.addDeclaration( nsA );
- Declaration nsB = new Declaration( "B" );
- nsB.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsB );
- table.push( nsB );
- table.addUsingDirective( nsA );
- table.pop();
-
- table.push( nsA );
- table.addUsingDirective( nsB );
- table.pop();
-
- Declaration f = new Declaration("f");
- table.addDeclaration(f);
- table.push(f);
- table.addUsingDirective(nsA);
- table.addUsingDirective(nsB);
+ ParserSymbolTable.Declaration nsB = table.new Declaration( "B" );
+ nsB.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ compUnit.addDeclaration( nsB );
+ nsB.addUsingDirective( nsA );
+
+ nsA.addUsingDirective( nsB );
+
+ ParserSymbolTable.Declaration f = table.new Declaration("f");
+ compUnit.addDeclaration(f);
+ f.addUsingDirective(nsA);
+ f.addUsingDirective(nsB);
- Declaration look = table.Lookup("i");
+ ParserSymbolTable.Declaration look = f.Lookup("i");
assertEquals( look, null );
-
}
/**
@@ -961,66 +889,57 @@
public void testNamespaceMemberHiding() throws Exception{
newTable();
- Declaration nsA = new Declaration("A");
- nsA.setType( TypeInfo.t_namespace );
-
- table.addDeclaration( nsA );
- table.push( nsA );
-
- Declaration structX = new Declaration("x");
- structX.setType( TypeInfo.t_struct );
- table.addDeclaration( structX );
-
- Declaration intX = new Declaration("x");
- intX.setType( TypeInfo.t_int );
- table.addDeclaration( intX );
-
- Declaration intY = new Declaration("y");
- intY.setType( TypeInfo.t_int );
- table.addDeclaration( intY );
-
- table.pop();
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
- Declaration nsB = new Declaration("B");
- nsB.setType( TypeInfo.t_namespace );
+ ParserSymbolTable.Declaration nsA = table.new Declaration("A");
+ nsA.setType( ParserSymbolTable.TypeInfo.t_namespace );
- table.addDeclaration( nsB );
- table.push( nsB );
+ compUnit.addDeclaration( nsA );
- Declaration structY = new Declaration("y");
- structY.setType( TypeInfo.t_struct );
- table.addDeclaration( structY );
+ ParserSymbolTable.Declaration structX = table.new Declaration("x");
+ structX.setType( ParserSymbolTable.TypeInfo.t_struct );
+ nsA.addDeclaration( structX );
- table.pop();
+ ParserSymbolTable.Declaration intX = table.new Declaration("x");
+ intX.setType( ParserSymbolTable.TypeInfo.t_int );
+ nsA.addDeclaration( intX );
- Declaration nsC = new Declaration("C");
- nsC.setType( TypeInfo.t_namespace);
- table.addDeclaration( nsC );
+ ParserSymbolTable.Declaration intY = table.new Declaration("y");
+ intY.setType( ParserSymbolTable.TypeInfo.t_int );
+ nsA.addDeclaration( intY );
+
+ ParserSymbolTable.Declaration nsB = table.new Declaration("B");
+ nsB.setType( ParserSymbolTable.TypeInfo.t_namespace );
- table.push( nsC );
+ compUnit.addDeclaration( nsB );
+ ParserSymbolTable.Declaration structY = table.new Declaration("y");
+ structY.setType( ParserSymbolTable.TypeInfo.t_struct );
+ nsB.addDeclaration( structY );
+
+ ParserSymbolTable.Declaration nsC = table.new Declaration("C");
+ nsC.setType( ParserSymbolTable.TypeInfo.t_namespace);
+ compUnit.addDeclaration( nsC );
- Declaration look = table.Lookup("A");
+ ParserSymbolTable.Declaration look = nsC.Lookup("A");
assertEquals( look, nsA );
- table.addUsingDirective( look );
+ nsC.addUsingDirective( look );
- look = table.Lookup("B");
+ look = nsC.Lookup("B");
assertEquals( look, nsB );
- table.addUsingDirective( look );
+ nsC.addUsingDirective( look );
//lookup C::x
- look = table.LookupNestedNameSpecifier("C");
+ look = nsC.LookupNestedNameSpecifier("C");
assertEquals( look, nsC );
- table.push(look);
- look = table.QualifiedLookup( "x" );
+ look = look.QualifiedLookup( "x" );
assertEquals( look, intX );
- table.pop();
//lookup C::y
- look = table.LookupNestedNameSpecifier("C");
+ look = nsC.LookupNestedNameSpecifier("C");
assertEquals( look, nsC );
- table.push(look);
+
try{
- look = table.QualifiedLookup( "y" );
+ look = look.QualifiedLookup( "y" );
assertTrue(false);
} catch ( ParserSymbolTableException e ) {
assertEquals( e.reason, ParserSymbolTableException.r_Ambiguous );
@@ -1044,34 +963,30 @@
public void testLookupMemberForDefinition() throws Exception{
newTable();
- Declaration nsA = new Declaration( "A" );
- nsA.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsA );
- table.push( nsA );
-
- Declaration nsB = new Declaration( "B" );
- nsB.setType( TypeInfo.t_namespace );
- table.addDeclaration( nsB );
- table.push( nsB );
-
- Declaration f1 = new Declaration("f1");
- f1.setType( TypeInfo.t_function );
- table.addDeclaration( f1 );
-
- table.pop();
-
- table.addUsingDirective( nsB );
- table.pop();
-
- Declaration look = table.LookupNestedNameSpecifier( "A" );
- assertEquals( nsA, look );
- table.push( look );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
+ ParserSymbolTable.Declaration nsA = table.new Declaration( "A" );
+ nsA.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ compUnit.addDeclaration( nsA );
+
+ ParserSymbolTable.Declaration nsB = table.new Declaration( "B" );
+ nsB.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ nsA.addDeclaration( nsB );
+
+ ParserSymbolTable.Declaration f1 = table.new Declaration("f1");
+ f1.setType( ParserSymbolTable.TypeInfo.t_function );
+ nsB.addDeclaration( f1 );
+
+ nsA.addUsingDirective( nsB );
+
+ ParserSymbolTable.Declaration lookA = compUnit.LookupNestedNameSpecifier( "A" );
+ assertEquals( nsA, lookA );
- look = table.LookupMemberForDefinition( "f1" );
+ ParserSymbolTable.Declaration look = lookA.LookupMemberForDefinition( "f1" );
assertEquals( look, null );
//but notice if you wanted to do A::f1 as a function call, it is ok
- look = table.QualifiedLookup( "f1" );
+ look = lookA.QualifiedLookup( "f1" );
assertEquals( look, f1 );
}
@@ -1102,63 +1017,58 @@
public void testUsingDeclaration() throws Exception{
newTable();
- Declaration B = new Declaration("B");
- B.setType( TypeInfo.t_struct );
- table.addDeclaration( B );
- table.push( B );
-
- Declaration f = new Declaration("f");
- f.setType( TypeInfo.t_function );
- table.addDeclaration( f );
-
- Declaration E = new Declaration( "E" );
- E.setType( TypeInfo.t_enumeration );
- table.addDeclaration( E );
-
- table.push( E );
- Declaration e = new Declaration( "e" );
- e.setType( TypeInfo.t_enumerator );
- table.addDeclaration( e );
- table.pop();
-
- //TBD: Anonymous unions are not yet implemented
-
- table.pop();
-
- Declaration C = new Declaration( "C" );
- C.setType( TypeInfo.t_class );
- table.addDeclaration( C );
-
- table.push( C );
- Declaration g = new Declaration( "g" );
- g.setType( TypeInfo.t_function );
- table.addDeclaration( g );
- table.pop();
-
- Declaration D = new Declaration( "D" );
- D.setType( TypeInfo.t_struct );
- Declaration look = table.Lookup( "B" );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
+ ParserSymbolTable.Declaration B = table.new Declaration("B");
+ B.setType( ParserSymbolTable.TypeInfo.t_struct );
+ compUnit.addDeclaration( B );
+
+ ParserSymbolTable.Declaration f = table.new Declaration("f");
+ f.setType( ParserSymbolTable.TypeInfo.t_function );
+ B.addDeclaration( f );
+
+ ParserSymbolTable.Declaration E = table.new Declaration( "E" );
+ E.setType( ParserSymbolTable.TypeInfo.t_enumeration );
+ B.addDeclaration( E );
+
+ ParserSymbolTable.Declaration e = table.new Declaration( "e" );
+ e.setType( ParserSymbolTable.TypeInfo.t_enumerator );
+ E.addDeclaration( e );
+
+ /**
+ * TBD: Anonymous unions are not yet implemented
+ */
+
+ ParserSymbolTable.Declaration C = table.new Declaration( "C" );
+ C.setType( ParserSymbolTable.TypeInfo.t_class );
+ compUnit.addDeclaration( C );
+
+ ParserSymbolTable.Declaration g = table.new Declaration( "g" );
+ g.setType( ParserSymbolTable.TypeInfo.t_function );
+ C.addDeclaration( g );
+
+ ParserSymbolTable.Declaration D = table.new Declaration( "D" );
+ D.setType( ParserSymbolTable.TypeInfo.t_struct );
+ ParserSymbolTable.Declaration look = compUnit.Lookup( "B" );
assertEquals( look, B );
D.addParent( look );
- table.addDeclaration( D );
- table.push( D );
+ compUnit.addDeclaration( D );
- Declaration lookB = table.LookupNestedNameSpecifier("B");
+ ParserSymbolTable.Declaration lookB = D.LookupNestedNameSpecifier("B");
assertEquals( lookB, B );
- table.addUsingDeclaration( "f", lookB );
-
- table.addUsingDeclaration( "e", lookB );
+ D.addUsingDeclaration( "f", lookB );
+ D.addUsingDeclaration( "e", lookB );
//TBD anonymous union
- //table.addUsingDeclaration( "x", lookB );
+ //D.addUsingDeclaration( "x", lookB );
- look = table.LookupNestedNameSpecifier("C");
+ look = D.LookupNestedNameSpecifier("C");
assertEquals( look, C );
try{
- table.addUsingDeclaration( "g", look );
+ D.addUsingDeclaration( "g", look );
assertTrue( false );
}
catch ( ParserSymbolTableException exception ){
@@ -1193,65 +1103,57 @@
public void testUsingDeclaration_2() throws Exception{
newTable();
- Declaration A = new Declaration( "A" );
- A.setType( TypeInfo.t_namespace );
- table.addDeclaration( A );
-
- table.push( A );
-
- Declaration f1 = new Declaration( "f" );
- f1.setType( TypeInfo.t_function );
- f1.setReturnType( TypeInfo.t_void );
- f1.addParameter( TypeInfo.t_int, 0, "", false );
- table.addDeclaration( f1 );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
- table.pop();
+ ParserSymbolTable.Declaration A = table.new Declaration( "A" );
+ A.setType( ParserSymbolTable.TypeInfo.t_namespace );
+ compUnit.addDeclaration( A );
+
+ ParserSymbolTable.Declaration f1 = table.new Declaration( "f" );
+ f1.setType( ParserSymbolTable.TypeInfo.t_function );
+ f1.setReturnType( ParserSymbolTable.TypeInfo.t_void );
+ f1.addParameter( ParserSymbolTable.TypeInfo.t_int, 0, "", false );
+ A.addDeclaration( f1 );
- Declaration look = table.LookupNestedNameSpecifier("A");
+ ParserSymbolTable.Declaration look = compUnit.LookupNestedNameSpecifier("A");
assertEquals( look, A );
- Declaration usingF = table.addUsingDeclaration( "f", look );
+ ParserSymbolTable.Declaration usingF = compUnit.addUsingDeclaration( "f", look );
- look = table.Lookup("A");
+ look = compUnit.Lookup("A");
assertEquals( look, A );
- table.push( look );
- Declaration f2 = new Declaration("f");
- f2.setType( TypeInfo.t_function );
- f2.setReturnType( TypeInfo.t_void );
- f2.addParameter( TypeInfo.t_char, 0, "", false );
-
- table.addDeclaration( f2 );
-
- table.pop();
-
- Declaration foo = new Declaration("foo");
- foo.setType( TypeInfo.t_function );
- table.addDeclaration( foo );
- table.push( foo );
+ ParserSymbolTable.Declaration f2 = table.new Declaration("f");
+ f2.setType( ParserSymbolTable.TypeInfo.t_function );
+ f2.setReturnType( ParserSymbolTable.TypeInfo.t_void );
+ f2.addParameter( ParserSymbolTable.TypeInfo.t_char, 0, "", false );
+
+ look.addDeclaration( f2 );
+
+ ParserSymbolTable.Declaration foo = table.new Declaration("foo");
+ foo.setType( ParserSymbolTable.TypeInfo.t_function );
+ compUnit.addDeclaration( foo );
+
LinkedList paramList = new LinkedList();
- TypeInfo param = new TypeInfo( TypeInfo.t_char, null );
+ ParserSymbolTable.TypeInfo param = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_char, null );
paramList.add( param );
- look = table.UnqualifiedFunctionLookup( "f", paramList );
+ look = foo.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, usingF );
assertTrue( look.hasSameParameters( f1 ) );
- Declaration bar = new Declaration( "bar" );
- bar.setType( TypeInfo.t_function );
- bar.addParameter( TypeInfo.t_char, 0, null, false );
- table.addDeclaration( bar );
- table.push( bar );
+ ParserSymbolTable.Declaration bar = table.new Declaration( "bar" );
+ bar.setType( ParserSymbolTable.TypeInfo.t_function );
+ bar.addParameter( ParserSymbolTable.TypeInfo.t_char, 0, null, false );
+ compUnit.addDeclaration( bar );
- look = table.LookupNestedNameSpecifier( "A" );
+ look = bar.LookupNestedNameSpecifier( "A" );
assertEquals( look, A );
- table.addUsingDeclaration( "f", A );
+ bar.addUsingDeclaration( "f", A );
- look = table.UnqualifiedFunctionLookup( "f", paramList );
+ look = bar.UnqualifiedFunctionLookup( "f", paramList );
assertTrue( look != null );
assertTrue( look.hasSameParameters( f2 ) );
-
- table.pop();
}
/**
@@ -1265,23 +1167,20 @@
public void testThisPointer() throws Exception{
newTable();
- Declaration cls = new Declaration("class");
- cls.setType( TypeInfo.t_class );
+ ParserSymbolTable.Declaration cls = table.new Declaration("class");
+ cls.setType( ParserSymbolTable.TypeInfo.t_class );
- Declaration fn = new Declaration("function");
- fn.setType( TypeInfo.t_function );
- fn.setCVQualifier( TypeInfo.cvConst );
+ ParserSymbolTable.Declaration fn = table.new Declaration("function");
+ fn.setType( ParserSymbolTable.TypeInfo.t_function );
+ fn.setCVQualifier( ParserSymbolTable.TypeInfo.cvConst );
- table.addDeclaration( cls );
- table.push( cls );
+ table.getCompilationUnit().addDeclaration( cls );
+ cls.addDeclaration( fn );
- table.addDeclaration( fn );
- table.push( fn );
-
- Declaration look = table.Lookup("this");
+ ParserSymbolTable.Declaration look = fn.Lookup("this");
assertTrue( look != null );
- assertEquals( look.getType(), TypeInfo.t_type );
+ assertEquals( look.getType(), ParserSymbolTable.TypeInfo.t_type );
assertEquals( look.getTypeDeclaration(), cls );
assertEquals( look.getPtrOperator(), "*" );
assertEquals( look.getCVQualifier(), fn.getCVQualifier() );
@@ -1299,24 +1198,20 @@
public void testEnumerator() throws Exception{
newTable();
- Declaration cls = new Declaration("class");
- cls.setType( TypeInfo.t_class );
-
- Declaration enumeration = new Declaration("enumeration");
- enumeration.setType( TypeInfo.t_enumeration );
+ ParserSymbolTable.Declaration cls = table.new Declaration("class");
+ cls.setType( ParserSymbolTable.TypeInfo.t_class );
- table.addDeclaration( cls );
- table.push( cls );
- table.addDeclaration( enumeration );
- table.push( enumeration );
+ ParserSymbolTable.Declaration enumeration = table.new Declaration("enumeration");
+ enumeration.setType( ParserSymbolTable.TypeInfo.t_enumeration );
- Declaration enumerator = new Declaration( "enumerator" );
- enumerator.setType( TypeInfo.t_enumerator );
- table.addDeclaration( enumerator );
+ table.getCompilationUnit().addDeclaration( cls );
+ cls.addDeclaration( enumeration );
- table.pop();
+ ParserSymbolTable.Declaration enumerator = table.new Declaration( "enumerator" );
+ enumerator.setType( ParserSymbolTable.TypeInfo.t_enumerator );
+ enumeration.addDeclaration( enumerator );
- Declaration look = table.Lookup( "enumerator" );
+ ParserSymbolTable.Declaration look = cls.Lookup( "enumerator" );
assertEquals( look, enumerator );
assertEquals( look.getContainingScope(), cls );
assertEquals( look.getTypeDeclaration(), enumeration );
@@ -1338,54 +1233,50 @@
public void testArgumentDependentLookup() throws Exception{
newTable();
- Declaration NS = new Declaration("NS");
- NS.setType( TypeInfo.t_namespace );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
- table.addDeclaration( NS );
- table.push( NS );
+ ParserSymbolTable.Declaration NS = table.new Declaration("NS");
+ NS.setType( ParserSymbolTable.TypeInfo.t_namespace );
- Declaration T = new Declaration("T");
- T.setType( TypeInfo.t_class );
+ compUnit.addDeclaration( NS );
- table.addDeclaration( T );
+ ParserSymbolTable.Declaration T = table.new Declaration("T");
+ T.setType( ParserSymbolTable.TypeInfo.t_class );
- Declaration f = new Declaration("f");
- f.setType( TypeInfo.t_function );
- f.setReturnType( TypeInfo.t_void );
+ NS.addDeclaration( T );
- Declaration look = table.Lookup( "T" );
+ ParserSymbolTable.Declaration f = table.new Declaration("f");
+ f.setType( ParserSymbolTable.TypeInfo.t_function );
+ f.setReturnType( ParserSymbolTable.TypeInfo.t_void );
+
+ ParserSymbolTable.Declaration look = NS.Lookup( "T" );
assertEquals( look, T );
f.addParameter( look, 0, "", false );
- table.addDeclaration( f );
-
- table.pop(); //done NS
+ NS.addDeclaration( f );
- look = table.LookupNestedNameSpecifier( "NS" );
+ look = compUnit.LookupNestedNameSpecifier( "NS" );
assertEquals( look, NS );
- table.push( look );
- look = table.QualifiedLookup( "T" );
+ look = look.QualifiedLookup( "T" );
assertEquals( look, T );
- table.pop();
- Declaration param = new Declaration("parm");
- param.setType( TypeInfo.t_type );
+ ParserSymbolTable.Declaration param = table.new Declaration("parm");
+ param.setType( ParserSymbolTable.TypeInfo.t_type );
param.setTypeDeclaration( look );
- table.addDeclaration( param );
-
- Declaration main = new Declaration("main");
- main.setType( TypeInfo.t_function );
- main.setReturnType( TypeInfo.t_int );
- table.addDeclaration( main );
- table.push( main );
+ compUnit.addDeclaration( param );
+ ParserSymbolTable.Declaration main = table.new Declaration("main");
+ main.setType( ParserSymbolTable.TypeInfo.t_function );
+ main.setReturnType( ParserSymbolTable.TypeInfo.t_int );
+ compUnit.addDeclaration( main );
+
LinkedList paramList = new LinkedList();
- look = table.Lookup( "parm" );
+ look = main.Lookup( "parm" );
assertEquals( look, param );
- TypeInfo p = new TypeInfo( TypeInfo.t_type, look, 0, null, false );
+ ParserSymbolTable.TypeInfo p = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_type, look, 0, null, false );
paramList.add( p );
- look = table.UnqualifiedFunctionLookup( "f", paramList );
+ look = main.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f );
}
@@ -1415,65 +1306,63 @@
public void testArgumentDependentLookup_2() throws Exception{
newTable();
- Declaration NS1 = new Declaration( "NS1" );
- NS1.setType( TypeInfo.t_namespace );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
+ ParserSymbolTable.Declaration NS1 = table.new Declaration( "NS1" );
+ NS1.setType( ParserSymbolTable.TypeInfo.t_namespace );
- table.addDeclaration( NS1 );
- table.push( NS1 );
+ compUnit.addDeclaration( NS1 );
- Declaration f1 = new Declaration( "f" );
- f1.setType( TypeInfo.t_function );
- f1.setReturnType( TypeInfo.t_void );
- f1.addParameter( TypeInfo.t_void, 0, "*", false );
- table.addDeclaration( f1 );
- table.pop();
+ ParserSymbolTable.Declaration f1 = table.new Declaration( "f" );
+ f1.setType( ParserSymbolTable.TypeInfo.t_function );
+ f1.setReturnType( ParserSymbolTable.TypeInfo.t_void );
+ f1.addParameter( ParserSymbolTable.TypeInfo.t_void, 0, "*", false );
+ NS1.addDeclaration( f1 );
- Declaration NS2 = new Declaration( "NS2" );
- NS2.setType( TypeInfo.t_namespace );
+ ParserSymbolTable.Declaration NS2 = table.new Declaration( "NS2" );
+ NS2.setType( ParserSymbolTable.TypeInfo.t_namespace );
- table.addDeclaration( NS2 );
- table.push( NS2 );
+ compUnit.addDeclaration( NS2 );
- Declaration look = table.Lookup( "NS1" );
+ ParserSymbolTable.Declaration look = NS2.Lookup( "NS1" );
assertEquals( look, NS1 );
- table.addUsingDirective( look );
+ NS2.addUsingDirective( look );
- Declaration B = new Declaration( "B" );
- B.setType( TypeInfo.t_class );
- table.addDeclaration( B );
-
- Declaration f2 = new Declaration( "f" );
- f2.setType( TypeInfo.t_function );
- f2.setReturnType( TypeInfo.t_void );
- f2.addParameter( TypeInfo.t_void, 0, "*", false );
- table.addDeclaration( f2 );
- table.pop();
-
- Declaration A = new Declaration( "A" );
- A.setType( TypeInfo.t_class );
- look = table.LookupNestedNameSpecifier( "NS2" );
+ ParserSymbolTable.Declaration B = table.new Declaration( "B" );
+ B.setType( ParserSymbolTable.TypeInfo.t_class );
+ NS2.addDeclaration( B );
+
+ ParserSymbolTable.Declaration f2 = table.new Declaration( "f" );
+ f2.setType( ParserSymbolTable.TypeInfo.t_function );
+ f2.setReturnType( ParserSymbolTable.TypeInfo.t_void );
+ f2.addParameter( ParserSymbolTable.TypeInfo.t_void, 0, "*", false );
+ NS2.addDeclaration( f2 );
+
+ ParserSymbolTable.Declaration A = table.new Declaration( "A" );
+ A.setType( ParserSymbolTable.TypeInfo.t_class );
+ look = compUnit.LookupNestedNameSpecifier( "NS2" );
assertEquals( look, NS2 );
- table.push( look );
- look = table.QualifiedLookup( "B" );
+
+ look = NS2.QualifiedLookup( "B" );
assertEquals( look, B );
A.addParent( look );
- table.addDeclaration( A );
+ compUnit.addDeclaration( A );
- look = table.Lookup( "A" );
+ look = compUnit.Lookup( "A" );
assertEquals( look, A );
- Declaration a = new Declaration( "a" );
- a.setType( TypeInfo.t_type );
+ ParserSymbolTable.Declaration a = table.new Declaration( "a" );
+ a.setType( ParserSymbolTable.TypeInfo.t_type );
a.setTypeDeclaration( look );
- table.addDeclaration( a );
+ compUnit.addDeclaration( a );
LinkedList paramList = new LinkedList();
- look = table.Lookup( "a" );
+ look = compUnit.Lookup( "a" );
assertEquals( look, a );
- TypeInfo param = new TypeInfo( look.getType(), look, 0, "&", false );
+ ParserSymbolTable.TypeInfo param = new ParserSymbolTable.TypeInfo( look.getType(), look, 0, "&", false );
paramList.add( param );
- look = table.UnqualifiedFunctionLookup( "f", paramList );
+ look = compUnit.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f2 );
}
@@ -1500,62 +1389,61 @@
public void testFunctionOverloading() throws Exception{
newTable();
- Declaration C = new Declaration( "C" );
- C.setType( TypeInfo.t_class );
- table.addDeclaration(C);
- table.push(C);
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
+ ParserSymbolTable.Declaration C = table.new Declaration( "C" );
+ C.setType( ParserSymbolTable.TypeInfo.t_class );
+ compUnit.addDeclaration(C);
- Declaration f1 = new Declaration("foo");
- f1.setType( TypeInfo.t_function );
- f1.setReturnType( TypeInfo.t_void );
- f1.addParameter( TypeInfo.t_int, 0, "", false );
- table.addDeclaration( f1 );
-
- Declaration f2 = new Declaration("foo");
- f2.setType( TypeInfo.t_function );
- f2.setReturnType( TypeInfo.t_void );
- f2.addParameter( TypeInfo.t_int, 0, "", false );
- f2.addParameter( TypeInfo.t_char, 0, "", false );
- table.addDeclaration( f2 );
-
- Declaration f3 = new Declaration("foo");
- f3.setType( TypeInfo.t_function );
- f3.setReturnType( TypeInfo.t_void );
- f3.addParameter( TypeInfo.t_int, 0, "", false );
- f3.addParameter( TypeInfo.t_char, 0, "", false );
+ ParserSymbolTable.Declaration f1 = table.new Declaration("foo");
+ f1.setType( ParserSymbolTable.TypeInfo.t_function );
+ f1.setReturnType( ParserSymbolTable.TypeInfo.t_void );
+ f1.addParameter( ParserSymbolTable.TypeInfo.t_int, 0, "", false );
+ C.addDeclaration( f1 );
+
+ ParserSymbolTable.Declaration f2 = table.new Declaration("foo");
+ f2.setType( ParserSymbolTable.TypeInfo.t_function );
+ f2.setReturnType( ParserSymbolTable.TypeInfo.t_void );
+ f2.addParameter( ParserSymbolTable.TypeInfo.t_int, 0, "", false );
+ f2.addParameter( ParserSymbolTable.TypeInfo.t_char, 0, "", false );
+ C.addDeclaration( f2 );
+
+ ParserSymbolTable.Declaration f3 = table.new Declaration("foo");
+ f3.setType( ParserSymbolTable.TypeInfo.t_function );
+ f3.setReturnType( ParserSymbolTable.TypeInfo.t_void );
+ f3.addParameter( ParserSymbolTable.TypeInfo.t_int, 0, "", false );
+ f3.addParameter( ParserSymbolTable.TypeInfo.t_char, 0, "", false );
f3.addParameter( C, 0, "*", false );
- table.addDeclaration( f3 );
- table.pop();
+ C.addDeclaration( f3 );
- Declaration look = table.Lookup("C");
+ ParserSymbolTable.Declaration look = compUnit.Lookup("C");
assertEquals( look, C );
- Declaration c = new Declaration("c");
- c.setType( TypeInfo.t_type );
+ ParserSymbolTable.Declaration c = table.new Declaration("c");
+ c.setType( ParserSymbolTable.TypeInfo.t_type );
c.setTypeDeclaration( look );
c.setPtrOperator( "*" );
- table.addDeclaration( c );
+ compUnit.addDeclaration( c );
- look = table.Lookup( "c" );
+ look = compUnit.Lookup( "c" );
assertEquals( look, c );
assertEquals( look.getTypeDeclaration(), C );
- table.push( look.getTypeDeclaration() );
LinkedList paramList = new LinkedList();
- TypeInfo p1 = new TypeInfo( TypeInfo.t_int, null, 0, "", false);
- TypeInfo p2 = new TypeInfo( TypeInfo.t_char, null, 0, "", false);
- TypeInfo p3 = new TypeInfo( TypeInfo.t_type, c, 0, "", false);
+ ParserSymbolTable.TypeInfo p1 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_int, null, 0, "", false);
+ ParserSymbolTable.TypeInfo p2 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_char, null, 0, "", false);
+ ParserSymbolTable.TypeInfo p3 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_type, c, 0, "", false);
paramList.add( p1 );
- look = table.MemberFunctionLookup( "foo", paramList );
+ look = C.MemberFunctionLookup( "foo", paramList );
assertEquals( look, f1 );
paramList.add( p2 );
- look = table.MemberFunctionLookup( "foo", paramList );
+ look = C.MemberFunctionLookup( "foo", paramList );
assertEquals( look, f2 );
paramList.add( p3 );
- look = table.MemberFunctionLookup( "foo", paramList );
+ look = C.MemberFunctionLookup( "foo", paramList );
assertEquals( look, f3 );
}
@@ -1574,36 +1462,38 @@
public void testFunctionResolution() throws Exception{
newTable();
- Declaration f1 = new Declaration("f");
- f1.setType( TypeInfo.t_function );
- f1.addParameter( TypeInfo.t_int, 0, "", false );
- table.addDeclaration( f1 );
-
- Declaration f2 = new Declaration("f");
- f2.setType( TypeInfo.t_function );
- f2.addParameter( TypeInfo.t_char, 0, "", true );
- table.addDeclaration( f2 );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
+ ParserSymbolTable.Declaration f1 = table.new Declaration("f");
+ f1.setType( ParserSymbolTable.TypeInfo.t_function );
+ f1.addParameter( ParserSymbolTable.TypeInfo.t_int, 0, "", false );
+ compUnit.addDeclaration( f1 );
+
+ ParserSymbolTable.Declaration f2 = table.new Declaration("f");
+ f2.setType( ParserSymbolTable.TypeInfo.t_function );
+ f2.addParameter( ParserSymbolTable.TypeInfo.t_char, 0, "", true );
+ compUnit.addDeclaration( f2 );
LinkedList paramList = new LinkedList();
- TypeInfo p1 = new TypeInfo( TypeInfo.t_int, null, 0, "", false );
+ ParserSymbolTable.TypeInfo p1 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_int, null, 0, "", false );
paramList.add( p1 );
- Declaration look = table.UnqualifiedFunctionLookup( "f", paramList );
+ ParserSymbolTable.Declaration look = compUnit.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f1 );
paramList.clear();
- TypeInfo p2 = new TypeInfo( TypeInfo.t_char, null, 0, "", false );
+ ParserSymbolTable.TypeInfo p2 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_char, null, 0, "", false );
paramList.add( p2 );
- look = table.UnqualifiedFunctionLookup( "f", paramList );
+ look = compUnit.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f2 );
paramList.clear();
- TypeInfo p3 = new TypeInfo( TypeInfo.t_bool, null, 0, "", false );
+ ParserSymbolTable.TypeInfo p3 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_bool, null, 0, "", false );
paramList.add( p3 );
- look = table.UnqualifiedFunctionLookup( "f", paramList );
+ look = compUnit.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f1 );
- look = table.UnqualifiedFunctionLookup( "f", null );
+ look = compUnit.UnqualifiedFunctionLookup( "f", null );
assertEquals( look, f2 );
}
@@ -1627,50 +1517,52 @@
public void testFunctionResolution_PointersAndBaseClasses() throws Exception{
newTable();
- Declaration A = new Declaration( "A" );
- A.setType( TypeInfo.t_class );
- table.addDeclaration( A );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
+ ParserSymbolTable.Declaration A = table.new Declaration( "A" );
+ A.setType( ParserSymbolTable.TypeInfo.t_class );
+ compUnit.addDeclaration( A );
- Declaration B = new Declaration( "B" );
- B.setType( TypeInfo.t_class );
+ ParserSymbolTable.Declaration B = table.new Declaration( "B" );
+ B.setType( ParserSymbolTable.TypeInfo.t_class );
B.addParent( A );
- table.addDeclaration( B );
+ compUnit.addDeclaration( B );
- Declaration C = new Declaration( "C" );
- C.setType( TypeInfo.t_class );
+ ParserSymbolTable.Declaration C = table.new Declaration( "C" );
+ C.setType( ParserSymbolTable.TypeInfo.t_class );
C.addParent( B );
- table.addDeclaration( C );
+ compUnit.addDeclaration( C );
- Declaration f1 = new Declaration( "f" );
- f1.setType( TypeInfo.t_function );
+ ParserSymbolTable.Declaration f1 = table.new Declaration( "f" );
+ f1.setType( ParserSymbolTable.TypeInfo.t_function );
f1.addParameter( A, 0, "*", false );
- table.addDeclaration( f1 );
+ compUnit.addDeclaration( f1 );
- Declaration f2 = new Declaration( "f" );
- f2.setType( TypeInfo.t_function );
+ ParserSymbolTable.Declaration f2 = table.new Declaration( "f" );
+ f2.setType( ParserSymbolTable.TypeInfo.t_function );
f2.addParameter( B, 0, "*", false );
- table.addDeclaration( f2 );
+ compUnit.addDeclaration( f2 );
- Declaration a = new Declaration( "a" );
- a.setType( TypeInfo.t_type );
+ ParserSymbolTable.Declaration a = table.new Declaration( "a" );
+ a.setType( ParserSymbolTable.TypeInfo.t_type );
a.setTypeDeclaration( A );
a.setPtrOperator( "*" );
- Declaration c = new Declaration( "c" );
- c.setType( TypeInfo.t_type );
+ ParserSymbolTable.Declaration c = table.new Declaration( "c" );
+ c.setType( ParserSymbolTable.TypeInfo.t_type );
c.setTypeDeclaration( C );
c.setPtrOperator( "*" );
LinkedList paramList = new LinkedList();
- TypeInfo p1 = new TypeInfo( TypeInfo.t_type, a, 0, null, false );
+ ParserSymbolTable.TypeInfo p1 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_type, a, 0, null, false );
paramList.add( p1 );
- Declaration look = table.UnqualifiedFunctionLookup( "f", paramList );
+ ParserSymbolTable.Declaration look = compUnit.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f1 );
paramList.clear();
- TypeInfo p2 = new TypeInfo( TypeInfo.t_type, c, 0, "", false );
+ ParserSymbolTable.TypeInfo p2 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_type, c, 0, "", false );
paramList.add( p2 );
- look = table.UnqualifiedFunctionLookup( "f", paramList );
+ look = compUnit.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f2 );
}
@@ -1697,64 +1589,66 @@
public void testFunctionResolution_TypedefsAndPointers() throws Exception{
newTable();
- Declaration A = new Declaration( "A" );
- A.setType( TypeInfo.t_class );
- table.addDeclaration( A );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
+ ParserSymbolTable.Declaration A = table.new Declaration( "A" );
+ A.setType( ParserSymbolTable.TypeInfo.t_class );
+ compUnit.addDeclaration( A );
- Declaration B = new Declaration( "B" );
- B.setType( TypeInfo.t_type );
+ ParserSymbolTable.Declaration B = table.new Declaration( "B" );
+ B.setType( ParserSymbolTable.TypeInfo.t_type );
B.setTypeDeclaration( A );
B.setPtrOperator( "*" );
- table.addDeclaration( B );
+ compUnit.addDeclaration( B );
- Declaration f1 = new Declaration( "f" );
- f1.setType( TypeInfo.t_function );
+ ParserSymbolTable.Declaration f1 = table.new Declaration( "f" );
+ f1.setType( ParserSymbolTable.TypeInfo.t_function );
f1.addParameter( A, 0, "*", false );
- table.addDeclaration( f1 );
+ compUnit.addDeclaration( f1 );
- Declaration f2 = new Declaration( "f" );
- f2.setType( TypeInfo.t_function );
+ ParserSymbolTable.Declaration f2 = table.new Declaration( "f" );
+ f2.setType( ParserSymbolTable.TypeInfo.t_function );
f2.addParameter( A, 0, null, false );
- table.addDeclaration( f2 );
+ compUnit.addDeclaration( f2 );
- Declaration a = new Declaration( "a" );
- a.setType( TypeInfo.t_type );
+ ParserSymbolTable.Declaration a = table.new Declaration( "a" );
+ a.setType( ParserSymbolTable.TypeInfo.t_type );
a.setTypeDeclaration( A );
- table.addDeclaration( a );
+ compUnit.addDeclaration( a );
- Declaration b = new Declaration( "b" );
- b.setType( TypeInfo.t_type );
+ ParserSymbolTable.Declaration b = table.new Declaration( "b" );
+ b.setType( ParserSymbolTable.TypeInfo.t_type );
b.setTypeDeclaration( B );
- table.addDeclaration( b );
+ compUnit.addDeclaration( b );
- Declaration array = new Declaration( "array" );
- array.setType( TypeInfo.t_type );
+ ParserSymbolTable.Declaration array = table.new Declaration( "array" );
+ array.setType( ParserSymbolTable.TypeInfo.t_type );
array.setTypeDeclaration( A );
array.setPtrOperator( "[]" );
LinkedList paramList = new LinkedList();
- TypeInfo p = new TypeInfo( TypeInfo.t_type, a, 0, null, false );
+ ParserSymbolTable.TypeInfo p = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_type, a, 0, null, false );
paramList.add( p );
- Declaration look = table.UnqualifiedFunctionLookup( "f", paramList );
+ ParserSymbolTable.Declaration look = compUnit.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f2 );
p.setPtrOperator( "&" );
- look = table.UnqualifiedFunctionLookup( "f", paramList );
+ look = compUnit.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f1 );
p.setTypeDeclaration( b );
p.setPtrOperator( null );
- look = table.UnqualifiedFunctionLookup( "f", paramList );
+ look = compUnit.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f1 );
p.setPtrOperator( "*" );
- look = table.UnqualifiedFunctionLookup( "f", paramList );
+ look = compUnit.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f2 );
p.setTypeDeclaration( array );
p.setPtrOperator( null );
- look = table.UnqualifiedFunctionLookup( "f", paramList );
+ look = compUnit.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f1 );
}
@@ -1778,39 +1672,37 @@
public void testUserDefinedConversionSequences() throws Exception{
newTable();
- Declaration A = new Declaration( "A" );
- A.setType( TypeInfo.t_class );
- table.addDeclaration( A );
-
- Declaration B = new Declaration( "B" );
- B.setType( TypeInfo.t_class );
- table.addDeclaration( B );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
- table.push( B );
+ ParserSymbolTable.Declaration A = table.new Declaration( "A" );
+ A.setType( ParserSymbolTable.TypeInfo.t_class );
+ compUnit.addDeclaration( A );
+
+ ParserSymbolTable.Declaration B = table.new Declaration( "B" );
+ B.setType( ParserSymbolTable.TypeInfo.t_class );
+ compUnit.addDeclaration( B );
//12.1-1 "Constructors do not have names"
- Declaration constructor = new Declaration("");
- constructor.setType( TypeInfo.t_function );
+ ParserSymbolTable.Declaration constructor = table.new Declaration("");
+ constructor.setType( ParserSymbolTable.TypeInfo.t_function );
constructor.addParameter( A, 0, null, false );
- table.addDeclaration( constructor );
+ B.addDeclaration( constructor );
- table.pop();
-
- Declaration f = new Declaration( "f" );
- f.setType( TypeInfo.t_function );
+ ParserSymbolTable.Declaration f = table.new Declaration( "f" );
+ f.setType( ParserSymbolTable.TypeInfo.t_function );
f.addParameter( B, 0, null, false );
- table.addDeclaration( f );
+ compUnit.addDeclaration( f );
- Declaration a = new Declaration( "a" );
- a.setType( TypeInfo.t_type );
+ ParserSymbolTable.Declaration a = table.new Declaration( "a" );
+ a.setType( ParserSymbolTable.TypeInfo.t_type );
a.setTypeDeclaration( A );
- table.addDeclaration( a );
+ compUnit.addDeclaration( a );
LinkedList paramList = new LinkedList();
- TypeInfo p = new TypeInfo( TypeInfo.t_type, a, 0, null, false );
+ ParserSymbolTable.TypeInfo p = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_type, a, 0, null, false );
paramList.add( p );
- Declaration look = table.UnqualifiedFunctionLookup( "f", paramList );
+ ParserSymbolTable.Declaration look = compUnit.UnqualifiedFunctionLookup( "f", paramList );
assertEquals( look, f );
}
@@ -1838,67 +1730,68 @@
public void testOverloadRanking() throws Exception{
newTable();
- Declaration f1 = new Declaration( "f" );
- f1.setType( TypeInfo.t_function );
- f1.addParameter( TypeInfo.t_int, TypeInfo.cvConst, "*", false );
- f1.addParameter( TypeInfo.t_int | TypeInfo.isShort, 0, null, false );
-
- table.addDeclaration( f1 );
-
- Declaration f2 = new Declaration( "f" );
- f2.setType( TypeInfo.t_function );
- f2.addParameter( TypeInfo.t_int, 0, "*", false );
- f2.addParameter( TypeInfo.t_int, 0, null, false );
- table.addDeclaration( f2 );
-
- Declaration i = new Declaration( "i" );
- i.setType( TypeInfo.t_int );
- table.addDeclaration( i );
-
- Declaration s = new Declaration( "s" );
- s.setType( TypeInfo.t_int );
- s.getTypeInfo().setBit( true, TypeInfo.isShort );
- table.addDeclaration( s );
-
- Declaration main = new Declaration( "main" );
- main.setType( TypeInfo.t_function );
- table.addDeclaration( main );
- table.push( main );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
+ ParserSymbolTable.Declaration f1 = table.new Declaration( "f" );
+ f1.setType( ParserSymbolTable.TypeInfo.t_function );
+ f1.addParameter( ParserSymbolTable.TypeInfo.t_int, ParserSymbolTable.TypeInfo.cvConst, "*", false );
+ f1.addParameter( ParserSymbolTable.TypeInfo.t_int | ParserSymbolTable.TypeInfo.isShort, 0, null, false );
+
+ compUnit.addDeclaration( f1 );
+
+ ParserSymbolTable.Declaration f2 = table.new Declaration( "f" );
+ f2.setType( ParserSymbolTable.TypeInfo.t_function );
+ f2.addParameter( ParserSymbolTable.TypeInfo.t_int, 0, "*", false );
+ f2.addParameter( ParserSymbolTable.TypeInfo.t_int, 0, null, false );
+ compUnit.addDeclaration( f2 );
+
+ ParserSymbolTable.Declaration i = table.new Declaration( "i" );
+ i.setType( ParserSymbolTable.TypeInfo.t_int );
+ compUnit.addDeclaration( i );
+
+ ParserSymbolTable.Declaration s = table.new Declaration( "s" );
+ s.setType( ParserSymbolTable.TypeInfo.t_int );
+ s.getTypeInfo().setBit( true, ParserSymbolTable.TypeInfo.isShort );
+ compUnit.addDeclaration( s );
+
+ ParserSymbolTable.Declaration main = table.new Declaration( "main" );
+ main.setType( ParserSymbolTable.TypeInfo.t_function );
+ compUnit.addDeclaration( main );
LinkedList params = new LinkedList();
- TypeInfo p1 = new TypeInfo( TypeInfo.t_type, i, 0, "&", false );
- TypeInfo p2 = new TypeInfo( TypeInfo.t_type, s, 0, null, false );
+ ParserSymbolTable.TypeInfo p1 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_type, i, 0, "&", false );
+ ParserSymbolTable.TypeInfo p2 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_type, s, 0, null, false );
params.add( p1 );
params.add( p2 );
- Declaration look = null;
+ ParserSymbolTable.Declaration look = null;
try{
- look = table.UnqualifiedFunctionLookup( "f", params );
+ main = main.UnqualifiedFunctionLookup( "f", params );
assertTrue( false );
} catch ( ParserSymbolTableException e ){
assertEquals( e.reason, ParserSymbolTableException.r_Ambiguous );
}
params.clear();
- TypeInfo p3 = new TypeInfo( TypeInfo.t_int | TypeInfo.isLong, null, 0, null, false );
+ ParserSymbolTable.TypeInfo p3 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_int | ParserSymbolTable.TypeInfo.isLong, null, 0, null, false );
params.add( p1 );
params.add( p3 );
- look = table.UnqualifiedFunctionLookup( "f", params );
+ look = main.UnqualifiedFunctionLookup( "f", params );
assertEquals( look, f2 );
params.clear();
- TypeInfo p4 = new TypeInfo( TypeInfo.t_char, null, 0, null, false );
+ ParserSymbolTable.TypeInfo p4 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_char, null, 0, null, false );
params.add( p1 );
params.add( p4 );
- look = table.UnqualifiedFunctionLookup( "f", params );
+ look = main.UnqualifiedFunctionLookup( "f", params );
assertEquals( look, f2 );
params.clear();
- p1.setCVQualifier( TypeInfo.cvConst );
+ p1.setCVQualifier( ParserSymbolTable.TypeInfo.cvConst );
params.add( p1 );
params.add( p3 );
- look = table.UnqualifiedFunctionLookup( "f", params );
+ look = main.UnqualifiedFunctionLookup( "f", params );
assertEquals( look, f1 );
}
@@ -1930,79 +1823,75 @@
public void testUserDefinedConversionByOperator() throws Exception{
newTable();
- Declaration B = new Declaration( "B" );
- B.setType( TypeInfo.t_class );
+ ParserSymbolTable.Declaration compUnit = table.getCompilationUnit();
+
+ ParserSymbolTable.Declaration B = table.new Declaration( "B" );
+ B.setType( ParserSymbolTable.TypeInfo.t_class );
+
+ compUnit.addDeclaration( B );
- table.addDeclaration( B );
+ ParserSymbolTable.Declaration A = table.new Declaration( "A" );
+ A.setType( ParserSymbolTable.TypeInfo.t_class );
+ compUnit.addDeclaration( A );
- Declaration A = new Declaration( "A" );
- A.setType( TypeInfo.t_class );
- table.addDeclaration( A );
-
- table.push( A );
- Declaration constructA = new Declaration( "" );
- constructA.setType( TypeInfo.t_function );
+ ParserSymbolTable.Declaration constructA = table.new Declaration( "" );
+ constructA.setType( ParserSymbolTable.TypeInfo.t_function );
constructA.addParameter( B, 0, "&", false );
- table.addDeclaration( constructA );
- table.pop();
+ A.addDeclaration( constructA );
- table.push( B );
- Declaration operator = new Declaration( "operator A" );
- operator.setType( TypeInfo.t_function );
- table.addDeclaration( operator );
- table.pop();
+ ParserSymbolTable.Declaration operator = table.new Declaration( "operator A" );
+ operator.setType( ParserSymbolTable.TypeInfo.t_function );
+ B.addDeclaration( operator );
- Declaration f1 = new Declaration( "f" );
- f1.setType( TypeInfo.t_function );
+ ParserSymbolTable.Declaration f1 = table.new Declaration( "f" );
+ f1.setType( ParserSymbolTable.TypeInfo.t_function );
f1.addParameter( A, 0, null, false );
- table.addDeclaration( f1 );
+ compUnit.addDeclaration( f1 );
- Declaration b = new Declaration( "b" );
- b.setType( TypeInfo.t_type );
+ ParserSymbolTable.Declaration b = table.new Declaration( "b" );
+ b.setType( ParserSymbolTable.TypeInfo.t_type );
b.setTypeDeclaration( B );
LinkedList params = new LinkedList();
- TypeInfo p1 = new TypeInfo( TypeInfo.t_type, b, 0, null, false );
+ ParserSymbolTable.TypeInfo p1 = new ParserSymbolTable.TypeInfo( ParserSymbolTable.TypeInfo.t_type, b, 0, null, false );
params.add( p1 );
- Declaration look = null;
+ ParserSymbolTable.Declaration look = null;
try{
- look = table.UnqualifiedFunctionLookup( "f", params );
+ look = compUnit.UnqualifiedFunctionLookup( "f", params );
assertTrue( false );
} catch( ParserSymbolTableException e ){
assertEquals( e.reason, ParserSymbolTableException.r_Ambiguous );
}
- Declaration C = new Declaration("C");
- C.setType( TypeInfo.t_class );
- table.addDeclaration( C );
-
- table.push( C );
- Declaration constructC = new Declaration("");
- constructC.setType( TypeInfo.t_function );
- constructC.addParameter( B, 0, "&", false );
- table.addDeclaration( constructC );
- table.pop();
+ ParserSymbolTable.Declaration C = table.new Declaration("C");
+ C.setType( ParserSymbolTable.TypeInfo.t_class );
+ compUnit.addDeclaration( C );
- Declaration f2 = new Declaration( "f" );
- f2.setType( TypeInfo.t_function );
+ ParserSymbolTable.Declaration constructC = table.new Declaration("");
+ constructC.setType( ParserSymbolTable.TypeInfo.t_function );
+ constructC.addParameter( B, 0, "&", false );
+ C.addDeclaration( constructC );
+
+ ParserSymbolTable.Declaration f2 = table.new Declaration( "f" );
+ f2.setType( ParserSymbolTable.TypeInfo.t_function );
f2.addParameter( C, 0, null, false );
- table.addDeclaration( f2 );
+ compUnit.addDeclaration( f2 );
try{
- look = table.UnqualifiedFunctionLookup( "f", params );
+ look = compUnit.UnqualifiedFunctionLookup( "f", params );
assertTrue( false );
} catch( ParserSymbolTableException e ){
assertEquals( e.reason, ParserSymbolTableException.r_Ambiguous );
}
- Declaration f3 = new Declaration( "f" );
- f3.setType( TypeInfo.t_function );
+ ParserSymbolTable.Declaration f3 = table.new Declaration( "f" );
+ f3.setType( ParserSymbolTable.TypeInfo.t_function );
f3.addParameter( B, 0, null, false );
- table.addDeclaration( f3 );
+ compUnit.addDeclaration( f3 );
- look = table.UnqualifiedFunctionLookup( "f", params );
+ look = compUnit.UnqualifiedFunctionLookup( "f", params );
assertEquals( look, f3 );
}
}
Index: parser/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/ChangeLog,v
retrieving revision 1.46
diff -u -r1.46 ChangeLog
--- parser/ChangeLog 1 May 2003 20:04:51 -0000 1.46
+++ parser/ChangeLog 5 May 2003 16:04:20 -0000
@@ -1,3 +1,10 @@
+2003-05-05 Andrew Niefer
+ Structural changes to ParserSymbolTable:
+ - moved TypeInfo & Declaration inside ParserSymbolTable
+ - removed the stack & push/pop/peek
+ - moved nonstatic add/lookup fuctions from the table to Declaration
+ - began undo framework: added AddDeclarationCommand
+
2003-05-01 Andrew Niefer
Fixed Bug 36287 - Parser failure with new CDT 1.1 parser
Fixed Bug 37011 - Scanner: #define A "//" not properly handled
Index: parser/org/eclipse/cdt/internal/core/parser/Declaration.java
===================================================================
RCS file: parser/org/eclipse/cdt/internal/core/parser/Declaration.java
diff -N parser/org/eclipse/cdt/internal/core/parser/Declaration.java
--- parser/org/eclipse/cdt/internal/core/parser/Declaration.java 9 Apr 2003 21:11:59 -0000 1.8
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,257 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002,2003 Rational Software Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- *
- * Contributors:
- * Rational Software - Initial API and implementation
-***********************************************************************/
-
-package org.eclipse.cdt.internal.core.parser;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Map;
-
-
-/**
- * @author aniefer
- *
- * To change this generated comment edit the template variable "typecomment":
- * Window>Preferences>Java>Templates.
- * To enable and disable the creation of type comments go to
- * Window>Preferences>Java>Code Generation.
- */
-
-public class Declaration implements Cloneable {
-
- /**
- * Constructor for Declaration.
- */
- public Declaration(){
- super();
- _typeInfo = new TypeInfo();
- }
-
- public Declaration( String name ){
- super();
- _name = name;
- _typeInfo = new TypeInfo();
- }
-
- public Declaration( String name, Object obj ){
- super();
- _name = name;
- _object = obj;
- _typeInfo = new TypeInfo();
- }
-
- /**
- * clone
- * @see java.lang.Object#clone()
- *
- * implement clone for the purposes of using declarations.
- * int _typeInfo; //by assignment
- * String _name; //by assignment
- * Object _object; //null this out
- * Declaration _typeDeclaration; //by assignment
- * Declaration _containingScope; //by assignment
- * LinkedList _parentScopes; //shallow copy
- * LinkedList _usingDirectives; //shallow copy
- * HashMap _containedDeclarations; //shallow copy
- * int _depth; //by assignment
- */
- public Object clone(){
- Declaration copy = null;
- try{
- copy = (Declaration)super.clone();
- }
- catch ( CloneNotSupportedException e ){
- //should not happen
- return null;
- }
-
- copy._object = null;
- copy._parentScopes = ( _parentScopes != null ) ? (LinkedList) _parentScopes.clone() : null;
- copy._usingDirectives = ( _usingDirectives != null ) ? (LinkedList) _usingDirectives.clone() : null;
- copy._containedDeclarations = ( _containedDeclarations != null ) ? (HashMap) _containedDeclarations.clone() : null;
- copy._parameters = ( _parameters != null ) ? (LinkedList) _parameters.clone() : null;
-
- return copy;
- }
-
- public void setType(int t) throws ParserSymbolTableException{
- _typeInfo.setType( t );
- }
-
- public int getType(){
- return _typeInfo.getType();
- }
-
- public boolean isType( int type ){
- return _typeInfo.isType( type, 0 );
- }
-
- public boolean isType( int type, int upperType ){
- return _typeInfo.isType( type, upperType );
- }
-
- public Declaration getTypeDeclaration(){
- return _typeInfo.getTypeDeclaration();
- }
-
- public void setTypeDeclaration( Declaration type ){
- _typeInfo.setTypeDeclaration( type );
- }
-
- public TypeInfo getTypeInfo(){
- return _typeInfo;
- }
-
- public String getName() { return _name; }
- public void setName(String name) { _name = name; }
-
- public Object getObject() { return _object; }
- public void setObject( Object obj ) { _object = obj; }
-
- public Declaration getContainingScope() { return _containingScope; }
- protected void setContainingScope( Declaration scope ){
- _containingScope = scope;
- _depth = scope._depth + 1;
- }
-
- public void addParent( Declaration parent ){
- addParent( parent, false );
- }
- public void addParent( Declaration parent, boolean virtual ){
- if( _parentScopes == null ){
- _parentScopes = new LinkedList();
- }
-
- _parentScopes.add( new ParentWrapper( parent, virtual ) );
- }
-
- public Map getContainedDeclarations(){
- return _containedDeclarations;
- }
-
- public Map createContained(){
- if( _containedDeclarations == null )
- _containedDeclarations = new HashMap();
-
- return _containedDeclarations;
- }
-
- public LinkedList getParentScopes(){
- return _parentScopes;
- }
-
- public boolean needsDefinition(){
- return _needsDefinition;
- }
- public void setNeedsDefinition( boolean need ) {
- _needsDefinition = need;
- }
-
- public int getCVQualifier(){
- return _cvQualifier;
- }
-
- public void setCVQualifier( int cv ){
- _cvQualifier = cv;
- }
-
- public String getPtrOperator(){
- return _typeInfo.getPtrOperator();
- }
- public void setPtrOperator( String ptrOp ){
- _typeInfo.setPtrOperator( ptrOp );
- }
-
- public int getReturnType(){
- return _returnType;
- }
-
- public void setReturnType( int type ){
- _returnType = type;
- }
-
- public void addParameter( Declaration typeDecl, int cvQual, String ptrOperator, boolean hasDefault ){
- if( _parameters == null ){
- _parameters = new LinkedList();
- }
-
- TypeInfo info = new TypeInfo( TypeInfo.t_type, typeDecl, cvQual, ptrOperator, hasDefault );
-
- _parameters.add( info );
- }
-
- public void addParameter( int type, int cvQual, String ptrOperator, boolean hasDefault ){
- if( _parameters == null ){
- _parameters = new LinkedList();
- }
-
- TypeInfo info = new TypeInfo(type, null, cvQual, ptrOperator, hasDefault );
-
- _parameters.add( info );
- }
-
- public boolean hasSameParameters( Declaration function ){
- if( function.getType() != getType() ){
- return false;
- }
-
- int size = _parameters.size();
- if( function._parameters.size() != size ){
- return false;
- }
-
- Iterator iter = _parameters.iterator();
- Iterator fIter = function._parameters.iterator();
-
- TypeInfo info = null;
- TypeInfo fInfo = null;
-
- for( int i = size; i > 0; i-- ){
- info = (TypeInfo) iter.next();
- fInfo = (TypeInfo) fIter.next();
-
- if( !info.equals( fInfo ) ){
- return false;
- }
- }
-
-
- return true;
- }
-
- private String _name; //our name
- private Object _object; //the object associated with us
- private boolean _needsDefinition; //this name still needs to be defined
- private int _cvQualifier;
- //private String _ptrOperator;
- protected TypeInfo _typeInfo; //our type info
- protected Declaration _containingScope; //the scope that contains us
- protected LinkedList _parentScopes; //inherited scopes (is base classes)
- protected LinkedList _usingDirectives; //collection of nominated namespaces
- protected HashMap _containedDeclarations; //declarations contained by us.
-
- protected LinkedList _parameters; //parameter list
- protected int _returnType;
-
- protected int _depth; //how far down the scope stack we are
-
- protected class ParentWrapper
- {
- public ParentWrapper( Declaration p, boolean v ){
- parent = p;
- isVirtual = v;
- }
-
- public boolean isVirtual = false;
- public Declaration parent = null;
- }
-}
Index: parser/org/eclipse/cdt/internal/core/parser/ParserSymbolTable.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ParserSymbolTable.java,v
retrieving revision 1.11
diff -u -r1.11 ParserSymbolTable.java
--- parser/org/eclipse/cdt/internal/core/parser/ParserSymbolTable.java 9 Apr 2003 21:12:00 -0000 1.11
+++ parser/org/eclipse/cdt/internal/core/parser/ParserSymbolTable.java 5 May 2003 16:04:21 -0000
@@ -20,7 +20,7 @@
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
-import java.util.Stack;
+//import java.util.Stack;
/**
@@ -45,511 +45,12 @@
} catch ( ParserSymbolTableException e ){
/*shouldn't happen*/
}
-
- push( _compilationUnit );
}
- public void push( Declaration obj ){
- if( _contextStack.empty() == false && obj.getContainingScope() == null ){
- obj.setContainingScope( (Declaration) _contextStack.peek() );
- }
-
- _contextStack.push( obj );
- }
-
- public Declaration pop(){
- return (Declaration) _contextStack.pop();
- }
-
- public Declaration peek(){
- return (Declaration) _contextStack.peek();
- }
-
public Declaration getCompilationUnit(){
return _compilationUnit;
}
-
- public Declaration Lookup( String name ) throws ParserSymbolTableException {
- LookupData data = new LookupData( name, -1 );
-
- Lookup( data, (Declaration) _contextStack.peek() );
-
- return ResolveAmbiguities( data );
- }
-
- public Declaration ElaboratedLookup( int type, String name ) throws ParserSymbolTableException{
- LookupData data = new LookupData( name, type );
-
- Lookup( data, (Declaration) _contextStack.peek() );
-
- return ResolveAmbiguities( data );
- }
-
- /**
- * Method LookupNestedNameSpecifier.
- * @param name
- * @return Declaration
- * The name of a class or namespace member can be referred to after the ::
- * scope resolution operator applied to a nested-name-specifier that
- * nominates its class or namespace. During the lookup for a name preceding
- * the ::, object, function and enumerator names are ignored. If the name
- * is not a class-name or namespace-name, the program is ill-formed
- */
-
- public Declaration LookupNestedNameSpecifier( String name ) throws ParserSymbolTableException {
- return LookupNestedNameSpecifier( name, (Declaration) _contextStack.peek() );
- }
-
- private Declaration LookupNestedNameSpecifier(String name, Declaration inDeclaration ) throws ParserSymbolTableException{
- Declaration foundDeclaration = null;
-
- LookupData data = new LookupData( name, TypeInfo.t_namespace );
- data.upperType = TypeInfo.t_union;
-
- LookupInContained( data, inDeclaration );
-
- if( data.foundItems != null ){
- foundDeclaration = ResolveAmbiguities( data );//, data.foundItems );
- }
-
- if( foundDeclaration == null && inDeclaration._containingScope != null ){
- foundDeclaration = LookupNestedNameSpecifier( name, inDeclaration._containingScope );
- }
-
- return foundDeclaration;
- }
-
- /**
- * LookupMemberForDefinition
- * @param name
- * @return Declaration
- * @throws ParserSymbolTableException
- *
- * In a definition for a namespace member in which the declarator-id is a
- * qualified-id, given that the qualified-id for the namespace member has
- * the form "nested-name-specifier unqualified-id", the unqualified-id shall
- * name a member of the namespace designated by the nested-name-specifier.
- *
- * ie:
- * you have this:
- * namespace A{
- * namespace B{
- * void f1(int);
- * }
- * using namespace B;
- * }
- *
- * if you then do this
- * void A::f1(int) { ... } //ill-formed, f1 is not a member of A
- * but, you can do this (Assuming f1 has been defined elsewhere)
- * A::f1( 1 ); //ok, finds B::f1
- *
- * ie, We need a seperate lookup function for looking up the member names
- * for a definition.
- */
- public Declaration LookupMemberForDefinition( String name ) throws ParserSymbolTableException{
- LookupData data = new LookupData( name, -1 );
- data.qualified = true;
-
- LookupInContained( data, (Declaration) _contextStack.peek() );
-
- return ResolveAmbiguities( data );
- }
-
- /**
- *
- * @param name
- * @return Declaration
- * @throws ParserSymbolTableException
- *
- */
- public Declaration QualifiedLookup( String name ) throws ParserSymbolTableException{
- LookupData data = new LookupData( name, -1 );
- data.qualified = true;
- Lookup( data, (Declaration) _contextStack.peek() );
-
- return ResolveAmbiguities( data );
- }
-
- /**
- *
- * @param name
- * @param parameters
- * @return Declaration
- * @throws ParserSymbolTableException
- */
- public Declaration QualifiedFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException{
- LookupData data = new LookupData( name, TypeInfo.t_function );
- data.qualified = true;
- //if parameters == null, thats no parameters, but we need to distinguish that from
- //no parameter information at all, so make an empty list.
- data.parameters = ( parameters == null ) ? new LinkedList() : parameters;
-
- Lookup( data, (Declaration) _contextStack.peek() );
-
- return ResolveAmbiguities( data );
- }
-
- /**
- * MemberFunctionLookup
- * @param name
- * @param parameters
- * @return Declaration
- * @throws ParserSymbolTableException
- *
- * Member lookup really proceeds as an unqualified lookup, but doesn't
- * include argument dependant scopes
- */
- public Declaration MemberFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException{
- LookupData data = new LookupData( name, TypeInfo.t_function );
- //if parameters == null, thats no parameters, but we need to distinguish that from
- //no parameter information at all, so make an empty list.
- data.parameters = ( parameters == null ) ? new LinkedList() : parameters;
-
- Lookup( data, (Declaration) _contextStack.peek() );
- return ResolveAmbiguities( data );
- }
-
- /**
- * UnqualifiedFunctionLookup
- * @param name
- * @param parameters
- * @return Declaration
- * @throws ParserSymbolTableException
- *
- * 3.4.2-1 When an unqualified name is used as the post-fix expression in a
- * function call, other namespaces not consdiered during the usual
- * unqualified lookup may be searched.
- *
- * 3.4.2-2 For each argument type T in the function call, there is a set of
- * zero or more associated namespaces and a set of zero or more associated
- * classes to be considered.
- *
- * If the ordinary unqualified lookup of the name find the declaration of a
- * class member function, the associated namespaces and classes are not
- * considered. Otherwise, the set of declarations found by the lookup of
- * the function name is the union of the set of declarations found using
- * ordinary unqualified lookup and the set of declarations found in the
- * namespaces and classes associated with the argument types.
- */
- public Declaration UnqualifiedFunctionLookup( String name, LinkedList 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();
-
- //collect associated namespaces & classes.
- int size = ( parameters == null ) ? 0 : parameters.size();
- Iterator iter = ( parameters == null ) ? null : parameters.iterator();
-
- TypeInfo param = null;
- Declaration paramType = null;
- for( int i = size; i > 0; i-- ){
- param = (TypeInfo) iter.next();
- paramType = getFlatTypeInfo( param ).getTypeDeclaration();
-
- getAssociatedScopes( paramType, associated );
-
- //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.getPtrOperator() != null &&
- (param.getPtrOperator().equals("*") || param.getPtrOperator().equals("[]")) &&
- paramType._containingScope.isType( TypeInfo.t_class, TypeInfo.t_union ) )
- {
- getAssociatedScopes( paramType._containingScope, associated );
- }
- }
-
- LookupData data = new LookupData( name, TypeInfo.t_function );
- //if parameters == null, thats no parameters, but we need to distinguish that from
- //no parameter information at all, so make an empty list.
- data.parameters = ( parameters == null ) ? new LinkedList() : parameters;
- data.associated = associated;
-
- Lookup( data, (Declaration) _contextStack.peek() );
-
- Declaration found = ResolveAmbiguities( data );
-
- //if we haven't found anything, or what we found is not a class member, consider the
- //associated scopes
- if( found == null || found._containingScope.getType() != TypeInfo.t_class ){
- if( found != null ){
- data.foundItems.add( found );
- }
-
- 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
- Object [] scopes = associated.toArray();
-
- size = associated.size();
-
- for( int i = 0; i < size; i++ ){
- decl = (Declaration) scopes[ i ];
- if( associated.contains( decl ) ){
- data.qualified = true;
- data.ignoreUsingDirectives = true;
- Lookup( data, decl );
- }
- }
-
- found = ResolveAmbiguities( data );
- }
-
- return found;
- }
-
- /**
- * LookupForFriendship
- * @param name
- * @return Declaration
- * 7.3.1.2-3 When looking for a prior declaration of a class or a function
- * declared as a friend, scopes outside the innermost enclosing namespace
- * scope are not considered.
- * 11.4-9 If a friend declaration appears in a local class and the name
- * specified is an unqualified name, a prior declaration is looked up
- * without considering scopes that are outside the innermost enclosing non-
- * class scope.
- */
- private Declaration LookupForFriendship( String name ) throws ParserSymbolTableException{
- LookupData data = new LookupData( name, -1 );
-
- Declaration decl = (Declaration) _contextStack.peek();
- boolean inClass = (decl.getType() == TypeInfo.t_class);
-
- Declaration enclosing = decl._containingScope;
- while( enclosing != null && (inClass ? enclosing.getType() != TypeInfo.t_class
- : enclosing.getType() == TypeInfo.t_namespace) )
- {
- enclosing = enclosing._containingScope;
- }
-
- data.stopAt = enclosing;
-
- Lookup( data, (Declaration) _contextStack.peek() );
-
- return ResolveAmbiguities( data );
- }
-
- public void addUsingDirective( Declaration namespace ) throws ParserSymbolTableException{
- if( namespace.getType() != TypeInfo.t_namespace ){
- throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTypeInfo );
- }
-
- Declaration declaration = (Declaration) _contextStack.peek();
-
- if( declaration._usingDirectives == null ){
- declaration._usingDirectives = new LinkedList();
- }
-
- declaration._usingDirectives.add( namespace );
- }
-
- /**
- * addUsingDeclaration
- * @param obj
- * @throws ParserSymbolTableException
- *
- * 7.3.3-9 The entity declared by a using-declaration shall be known in the
- * context using it according to its definition at the point of the using-
- * declaration. Definitions added to the namespace after the using-
- * declaration are not considered when a use of the name is made.
- *
- * 7.3.3-4 A using-declaration used as a member-declaration shall refer to a
- * member of a base class of the class being defined, shall refer to a
- * member of an anonymous union that is a member of a base class of the
- * class being defined, or shall refer to an enumerator for an enumeration
- * type that is a member of a base class of the class being defined.
- */
- public Declaration addUsingDeclaration( String name ) throws ParserSymbolTableException {
- return addUsingDeclaration( name, null );
- }
-
- public Declaration addUsingDeclaration( String name, Declaration declContext ) throws ParserSymbolTableException{
- LookupData data = new LookupData( name, -1 );
-
- if( declContext != null ){
- push( declContext );
- data.qualified = true;
- Lookup( data, (Declaration) _contextStack.peek() );
- pop();
- } else {
- Lookup( data, (Declaration) _contextStack.peek() );
- }
-
- //figure out which declaration we are talking about, if it is a set of functions,
- //then they will be in data.foundItems (since we provided no parameter info);
- Declaration obj = ResolveAmbiguities( data );
-
- if( data.foundItems == null ){
- throw new ParserSymbolTableException();
- }
-
- Declaration clone = null;
- //if obj != null, then that is the only object to consider, so size is 1,
- //otherwise we consider the foundItems set
- int size = ( obj == null ) ? data.foundItems.size() : 1;
- Iterator iter = data.foundItems.iterator();
- for( int i = size; i > 0; i-- ){
- obj = ( obj != null && size == 1 ) ? obj : (Declaration) iter.next();
-
- if( okToAddUsingDeclaration( obj, (Declaration) _contextStack.peek() ) ){
- clone = (Declaration) obj.clone(); //7.3.3-9
- addDeclaration( clone );
- } else {
- throw new ParserSymbolTableException();
- }
- }
-
- return ( size == 1 ) ? clone : null;
- }
-
- public void addDeclaration( Declaration obj ) throws ParserSymbolTableException{
-
- Declaration containing = (Declaration) _contextStack.peek();
-
- //handle enumerators
- if( obj.getType() == TypeInfo.t_enumerator ){
- //a using declaration of an enumerator will not be contained in a
- //enumeration.
- if( containing.getType() == TypeInfo.t_enumeration ){
- //Following the closing brace of an enum-specifier, each enumerator has the type of its
- //enumeration
- obj.setTypeDeclaration( containing );
- //Each enumerator is declared in the scope that immediately contains the enum-specifier
- containing = containing.getContainingScope();
- }
- }
-
- Map declarations = containing.getContainedDeclarations();
-
- boolean unnamed = obj.getName().equals( "" );
-
- Object origObj = null;
-
- obj.setContainingScope( containing );
-
- if( declarations == null ){
- declarations = containing.createContained();
- } else {
- //does this name exist already?
- origObj = declarations.get( obj.getName() );
- }
-
- if( origObj != null )
- {
- Declaration origDecl = null;
- LinkedList origList = null;
-
- if( origObj.getClass() == Declaration.class ){
- origDecl = (Declaration)origObj;
- } else if( origObj.getClass() == LinkedList.class ){
- origList = (LinkedList)origObj;
- } else {
- throw new ParserSymbolTableException();
- }
-
- if( unnamed || (origList == null) ? isValidOverload( origDecl, obj ) : isValidOverload( origList, obj ) ){
- if( origList == null ){
- origList = new LinkedList();
- origList.add( origDecl );
- origList.add( obj );
-
- declarations.remove( obj );
- declarations.put( obj.getName(), origList );
- } else {
- origList.add( obj );
- //origList is already in _containedDeclarations
- }
- } else {
- throw new ParserSymbolTableException( ParserSymbolTableException.r_InvalidOverload );
- }
- } else {
- declarations.put( obj.getName(), obj );
- }
-
- //take care of the this pointer
- TypeInfo type = obj._typeInfo;
- if( type.isType( TypeInfo.t_function ) && !type.checkBit( TypeInfo.isStatic ) ){
- addThis( obj );
- }
- }
-
- /**
- *
- * @param name
- * @return Declaration
- * @throws ParserSymbolTableException
- *
- * 7.3.1.2-3 If a friend declaration in a non-local class first declares a
- * class or function, the friend class or function is a member of the
- * innermost enclosing namespace.
- *
- * TBD: if/when the parser symbol table starts caring about visibility
- * (public/protected/private) we will need to do more to record friendship.
- */
- public Declaration addFriend( String name ) throws ParserSymbolTableException{
- Declaration friend = LookupForFriendship( name );
-
- if( friend == null ){
- friend = new Declaration( name );
- friend.setNeedsDefinition( true );
-
- Declaration decl = (Declaration) _contextStack.peek();
- Declaration containing = decl._containingScope;
- //find innermost enclosing namespace
- while( containing != null && containing.getType() != TypeInfo.t_namespace ){
- containing = containing._containingScope;
- }
-
- Declaration namespace = (containing == null ) ? _compilationUnit : containing;
- push( namespace );
- addDeclaration( friend );
- pop();
- }
-
- return friend;
- }
-
- /**
- *
- * @param obj
- * @throws ParserSymbolTableException
- * 9.3.2-1 In the body of a nonstatic member function... the type of this of
- * a class X is X*. If the member function is declared const, the type of
- * this is const X*, if the member function is declared volatile, the type
- * of this is volatile X*....
- */
- private void addThis( Declaration obj ) throws ParserSymbolTableException{
- TypeInfo type = obj._typeInfo;
- if( !type.isType( TypeInfo.t_function ) || type.checkBit( TypeInfo.isStatic ) ){
- return;
- }
-
- if( obj._containingScope.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", -1 );
- 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");
- thisObj.setType( TypeInfo.t_type );
- thisObj.setTypeDeclaration( obj._containingScope );
- thisObj.setCVQualifier( obj.getCVQualifier() );
- thisObj.setPtrOperator("*");
-
- push( obj );
- addDeclaration( thisObj );
- pop();
- }
- }
- }
-
/**
* Lookup the name from LookupData starting in the inDeclaration
* @param data
@@ -583,8 +84,8 @@
if( !data.qualified || data.foundItems == null ){
ProcessDirectives( inDeclaration, data, transitives );
- if( inDeclaration._usingDirectives != null ){
- ProcessDirectives( inDeclaration, data, inDeclaration._usingDirectives );
+ if( inDeclaration.getUsingDirectives() != null ){
+ ProcessDirectives( inDeclaration, data, inDeclaration.getUsingDirectives() );
}
while( data.usingDirectives != null && data.usingDirectives.get( inDeclaration ) != null ){
@@ -674,9 +175,9 @@
//only consider the transitive using directives if we are an unqualified
//lookup, or we didn't find the name in decl
- if( (!data.qualified || !foundSomething ) && decl._usingDirectives != null ){
+ if( (!data.qualified || !foundSomething ) && decl.getUsingDirectives() != null ){
//name wasn't found, add transitive using directives for later consideration
- transitiveDirectives.addAll( decl._usingDirectives );
+ transitiveDirectives.addAll( decl.getUsingDirectives() );
}
}
}
@@ -804,7 +305,7 @@
} else if ( temp != null ) {
//it is not ambiguous if temp & decl are the same thing and it is static
//or an enumerator
- TypeInfo type = temp._typeInfo;
+ TypeInfo type = temp.getTypeInfo();
if( decl == temp && ( type.checkBit( TypeInfo.isStatic ) || type.isType( TypeInfo.t_enumerator ) ) ){
temp = null;
@@ -886,7 +387,7 @@
if( origDecl.hasSameParameters( newDecl ) ){
//functions with the same name and same parameter types cannot be overloaded if any of them
//is static
- if( origDecl._typeInfo.checkBit( TypeInfo.isStatic ) || newDecl._typeInfo.checkBit( TypeInfo.isStatic ) ){
+ if( origDecl.getTypeInfo().checkBit( TypeInfo.isStatic ) || newDecl.getTypeInfo().checkBit( TypeInfo.isStatic ) ){
return false;
}
@@ -1082,10 +583,10 @@
currFn = (Declaration) iterFns.next();
sourceParams = data.parameters.iterator();
- targetParams = currFn._parameters.iterator();
+ targetParams = currFn.getParameters().iterator();
//number of parameters in the current function
- numTargetParams = currFn._parameters.size();
+ numTargetParams = currFn.getParameters().size();
//we only need to look at the smaller number of parameters
//(a larger number in the Target means default parameters, a larger
@@ -1169,7 +670,7 @@
Iterator iter = functions.iterator();
while( iter.hasNext() ){
function = (Declaration) iter.next();
- num = ( function._parameters == null ) ? 0 : function._parameters.size();
+ num = ( function.getParameters() == null ) ? 0 : function.getParameters().size();
//if there are m arguments in the list, all candidate functions having m parameters
//are viable
@@ -1186,7 +687,7 @@
//a candidate function having more than m parameters is viable only if the (m+1)-st
//parameter has a default argument
else {
- ListIterator listIter = function._parameters.listIterator( num );
+ ListIterator listIter = function.getParameters().listIterator( num );
TypeInfo param;
for( int i = num; i > ( numParameters - num + 1); i-- ){
param = (TypeInfo)listIter.previous();
@@ -1262,9 +763,9 @@
return decl1;
}
- if( decl1._depth == decl2._depth ){
+ if( decl1.getDepth() == decl2.getDepth() ){
return getClosestEnclosingDeclaration( decl1._containingScope, decl2._containingScope );
- } else if( decl1._depth > decl2._depth ) {
+ } else if( decl1.getDepth() > decl2.getDepth() ) {
return getClosestEnclosingDeclaration( decl1._containingScope, decl2 );
} else {
return getClosestEnclosingDeclaration( decl1, decl2._containingScope );
@@ -1290,12 +791,12 @@
return 0;
}
- if( obj._parentScopes != null ){
+ if( obj.getParentScopes() != null ){
Declaration decl;
Declaration.ParentWrapper wrapper;
- Iterator iter = obj._parentScopes.iterator();
- int size = obj._parentScopes.size();
+ Iterator iter = obj.getParentScopes().iterator();
+ int size = obj.getParentScopes().size();
for( int i = size; i > 0; i-- ){
wrapper = (Declaration.ParentWrapper) iter.next();
@@ -1336,13 +837,13 @@
}
static private void getBaseClassesAndContainingNamespaces( Declaration obj, HashSet classes ){
- if( obj._parentScopes != null ){
+ if( obj.getParentScopes() != null ){
if( classes == null ){
return;
}
- Iterator iter = obj._parentScopes.iterator();
- int size = obj._parentScopes.size();
+ Iterator iter = obj.getParentScopes().iterator();
+ int size = obj.getParentScopes().size();
Declaration.ParentWrapper wrapper;
Declaration base;
@@ -1691,10 +1192,52 @@
return returnInfo;
}
+
+ //private Stack _contextStack = new Stack();
+ private Declaration _compilationUnit;
+ private LinkedList undoList = new LinkedList();
+
+ static abstract private class Command{
+ abstract public void undoIt();
+ }
+ static private class AddDeclarationCommand extends Command{
+ AddDeclarationCommand( Declaration newDecl, Declaration context, boolean removeThis ){
+ _decl = newDecl;
+ _context = context;
+ _removeThis = removeThis;
+ }
+ public void undoIt(){
+ Object obj = _context.getContainedDeclarations().get( _decl.getName() );
+
+ if( obj instanceof LinkedList ){
+ LinkedList list = (LinkedList)obj;
+ ListIterator iter = list.listIterator();
+ int size = list.size();
+ Declaration item = null;
+ for( int i = 0; i < size; i++ ){
+ item = (Declaration)iter.next();
+ if( item == _decl ){
+ iter.remove();
+ break;
+ }
+ }
+ if( list.size() == 1 ){
+ _context.getContainedDeclarations().remove( _decl.getName() );
+ _context.getContainedDeclarations().put( _decl.getName(), list.getFirst() );
+ }
+ } else if( obj instanceof Declaration ){
+ _context.getContainedDeclarations().remove( _decl.getName() );
+ }
+ if( _removeThis ){
+ _context.getContainedDeclarations().remove( "this" );
+ }
+ }
- private Stack _contextStack = new Stack();
- private Declaration _compilationUnit;
+ private Declaration _decl;
+ private Declaration _context;
+ private boolean _removeThis;
+ }
static private class LookupData
{
@@ -1780,4 +1323,1046 @@
}
}
+ public class Declaration implements Cloneable {
+
+ /**
+ * Constructor for Declaration.
+ */
+ public Declaration(){
+ super();
+ _typeInfo = new TypeInfo();
+ }
+
+ public Declaration( String name ){
+ super();
+ _name = name;
+ _typeInfo = new TypeInfo();
+ }
+
+ public Declaration( String name, Object obj ){
+ super();
+ _name = name;
+ _object = obj;
+ _typeInfo = new TypeInfo();
+ }
+
+ /**
+ * clone
+ * @see java.lang.Object#clone()
+ *
+ * implement clone for the purposes of using declarations.
+ * int _typeInfo; //by assignment
+ * String _name; //by assignment
+ * Object _object; //null this out
+ * Declaration _typeDeclaration; //by assignment
+ * Declaration _containingScope; //by assignment
+ * LinkedList _parentScopes; //shallow copy
+ * LinkedList _usingDirectives; //shallow copy
+ * HashMap _containedDeclarations; //shallow copy
+ * int _depth; //by assignment
+ */
+ public Object clone(){
+ Declaration copy = null;
+ try{
+ copy = (Declaration)super.clone();
+ }
+ catch ( CloneNotSupportedException e ){
+ //should not happen
+ return null;
+ }
+
+ copy._object = null;
+ copy._parentScopes = ( _parentScopes != null ) ? (LinkedList) _parentScopes.clone() : null;
+ copy._usingDirectives = ( _usingDirectives != null ) ? (LinkedList) _usingDirectives.clone() : null;
+ copy._containedDeclarations = ( _containedDeclarations != null ) ? (HashMap) _containedDeclarations.clone() : null;
+ copy._parameters = ( _parameters != null ) ? (LinkedList) _parameters.clone() : null;
+
+ return copy;
+ }
+
+ public void setType(int t) throws ParserSymbolTableException{
+ _typeInfo.setType( t );
+ }
+
+ public int getType(){
+ return _typeInfo.getType();
+ }
+
+ public boolean isType( int type ){
+ return _typeInfo.isType( type, 0 );
+ }
+
+ public boolean isType( int type, int upperType ){
+ return _typeInfo.isType( type, upperType );
+ }
+
+ public Declaration getTypeDeclaration(){
+ return _typeInfo.getTypeDeclaration();
+ }
+
+ public void setTypeDeclaration( Declaration type ){
+ _typeInfo.setTypeDeclaration( type );
+ }
+
+ public TypeInfo getTypeInfo(){
+ return _typeInfo;
+ }
+
+ public String getName() { return _name; }
+ public void setName(String name) { _name = name; }
+
+ public Object getObject() { return _object; }
+ public void setObject( Object obj ) { _object = obj; }
+
+ public Declaration getContainingScope() { return _containingScope; }
+ protected void setContainingScope( Declaration scope ){
+ _containingScope = scope;
+ _depth = scope._depth + 1;
+ }
+
+ private int getDepth(){
+ return _depth;
+ }
+
+ public void addParent( Declaration parent ){
+ addParent( parent, false );
+ }
+ public void addParent( Declaration parent, boolean virtual ){
+ if( _parentScopes == null ){
+ _parentScopes = new LinkedList();
+ }
+
+ _parentScopes.add( new ParentWrapper( parent, virtual ) );
+ }
+
+ public Map getContainedDeclarations(){
+ return _containedDeclarations;
+ }
+
+ public Map createContained(){
+ if( _containedDeclarations == null )
+ _containedDeclarations = new HashMap();
+
+ return _containedDeclarations;
+ }
+
+ public LinkedList getParentScopes(){
+ return _parentScopes;
+ }
+
+ public boolean needsDefinition(){
+ return _needsDefinition;
+ }
+ public void setNeedsDefinition( boolean need ) {
+ _needsDefinition = need;
+ }
+
+ public int getCVQualifier(){
+ return _cvQualifier;
+ }
+
+ public void setCVQualifier( int cv ){
+ _cvQualifier = cv;
+ }
+
+ public String getPtrOperator(){
+ return _typeInfo.getPtrOperator();
+ }
+ public void setPtrOperator( String ptrOp ){
+ _typeInfo.setPtrOperator( ptrOp );
+ }
+
+ public int getReturnType(){
+ return _returnType;
+ }
+
+ public void setReturnType( int type ){
+ _returnType = type;
+ }
+
+ public LinkedList getParameters(){
+ return _parameters;
+ }
+
+ public void addParameter( Declaration typeDecl, int cvQual, String ptrOperator, boolean hasDefault ){
+ if( _parameters == null ){
+ _parameters = new LinkedList();
+ }
+
+ TypeInfo info = new TypeInfo( TypeInfo.t_type, typeDecl, cvQual, ptrOperator, hasDefault );
+
+ _parameters.add( info );
+ }
+
+ public void addParameter( int type, int cvQual, String ptrOperator, boolean hasDefault ){
+ if( _parameters == null ){
+ _parameters = new LinkedList();
+ }
+
+ TypeInfo info = new TypeInfo(type, null, cvQual, ptrOperator, hasDefault );
+
+ _parameters.add( info );
+ }
+
+ public boolean hasSameParameters( Declaration function ){
+ if( function.getType() != getType() ){
+ return false;
+ }
+
+ int size = getParameters().size();
+ if( function.getParameters().size() != size ){
+ return false;
+ }
+
+ Iterator iter = getParameters().iterator();
+ Iterator fIter = function.getParameters().iterator();
+
+ TypeInfo info = null;
+ TypeInfo fInfo = null;
+
+ for( int i = size; i > 0; i-- ){
+ info = (TypeInfo) iter.next();
+ fInfo = (TypeInfo) fIter.next();
+
+ if( !info.equals( fInfo ) ){
+ return false;
+ }
+ }
+
+
+ return true;
+ }
+
+ public void addDeclaration( Declaration obj ) throws ParserSymbolTableException{
+ Declaration containing = this;
+
+ //handle enumerators
+ if( obj.getType() == TypeInfo.t_enumerator ){
+ //a using declaration of an enumerator will not be contained in a
+ //enumeration.
+ if( containing.getType() == TypeInfo.t_enumeration ){
+ //Following the closing brace of an enum-specifier, each enumerator has the type of its
+ //enumeration
+ obj.setTypeDeclaration( containing );
+ //Each enumerator is declared in the scope that immediately contains the enum-specifier
+ containing = containing.getContainingScope();
+ }
+ }
+
+ Map declarations = containing.getContainedDeclarations();
+
+ boolean unnamed = obj.getName().equals( "" );
+
+ Object origObj = null;
+
+ obj.setContainingScope( containing );
+
+ if( declarations == null ){
+ declarations = containing.createContained();
+ } else {
+ //does this name exist already?
+ origObj = declarations.get( obj.getName() );
+ }
+
+ if( origObj != null )
+ {
+ Declaration origDecl = null;
+ LinkedList origList = null;
+
+ if( origObj.getClass() == Declaration.class ){
+ origDecl = (Declaration)origObj;
+ } else if( origObj.getClass() == LinkedList.class ){
+ origList = (LinkedList)origObj;
+ } else {
+ throw new ParserSymbolTableException();
+ }
+
+ if( unnamed || (origList == null) ? isValidOverload( origDecl, obj ) : isValidOverload( origList, obj ) ){
+ if( origList == null ){
+ origList = new LinkedList();
+ origList.add( origDecl );
+ origList.add( obj );
+
+ declarations.remove( obj );
+ declarations.put( obj.getName(), origList );
+ } else {
+ origList.add( obj );
+ //origList is already in _containedDeclarations
+ }
+ } else {
+ throw new ParserSymbolTableException( ParserSymbolTableException.r_InvalidOverload );
+ }
+ } else {
+ declarations.put( obj.getName(), obj );
+ }
+
+ //take care of the this pointer
+ TypeInfo type = obj.getTypeInfo();
+ boolean addedThis = false;
+ if( type.isType( TypeInfo.t_function ) && !type.checkBit( TypeInfo.isStatic ) ){
+ addThis( obj );
+ addedThis = true;
+ }
+
+ Command command = new AddDeclarationCommand( obj, containing, addedThis );
+ }
+
+ /**
+ *
+ * @param obj
+ * @throws ParserSymbolTableException
+ * 9.3.2-1 In the body of a nonstatic member function... the type of this of
+ * a class X is X*. If the member function is declared const, the type of
+ * this is const X*, if the member function is declared volatile, the type
+ * of this is volatile X*....
+ */
+ private void addThis( Declaration obj ) throws ParserSymbolTableException{
+ TypeInfo type = obj.getTypeInfo();
+ if( !type.isType( TypeInfo.t_function ) || type.checkBit( TypeInfo.isStatic ) ){
+ return;
+ }
+
+ if( obj.getContainingScope().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", -1 );
+ 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");
+ thisObj.setType( TypeInfo.t_type );
+ thisObj.setTypeDeclaration( obj.getContainingScope() );
+ thisObj.setCVQualifier( obj.getCVQualifier() );
+ thisObj.setPtrOperator("*");
+
+ obj.addDeclaration( thisObj );
+ }
+ }
+ }
+
+ /**
+ *
+ * @param name
+ * @return Declaration
+ * @throws ParserSymbolTableException
+ *
+ * 7.3.1.2-3 If a friend declaration in a non-local class first declares a
+ * class or function, the friend class or function is a member of the
+ * innermost enclosing namespace.
+ *
+ * TBD: if/when the parser symbol table starts caring about visibility
+ * (public/protected/private) we will need to do more to record friendship.
+ */
+ public Declaration addFriend( String name ) throws ParserSymbolTableException{
+ Declaration friend = LookupForFriendship( name );
+
+ if( friend == null ){
+ friend = new Declaration( name );
+ friend.setNeedsDefinition( true );
+
+ Declaration containing = getContainingScope();
+ //find innermost enclosing namespace
+ while( containing != null && containing.getType() != TypeInfo.t_namespace ){
+ containing = containing.getContainingScope();
+ }
+
+ Declaration namespace = ( containing == null ) ? ParserSymbolTable.this.getCompilationUnit() : containing;
+ namespace.addDeclaration( friend );
+ }
+
+ return friend;
+ }
+
+ /**
+ * LookupForFriendship
+ * @param name
+ * @return Declaration
+ * 7.3.1.2-3 When looking for a prior declaration of a class or a function
+ * declared as a friend, scopes outside the innermost enclosing namespace
+ * scope are not considered.
+ * 11.4-9 If a friend declaration appears in a local class and the name
+ * specified is an unqualified name, a prior declaration is looked up
+ * without considering scopes that are outside the innermost enclosing non-
+ * class scope.
+ */
+ private Declaration LookupForFriendship( String name ) throws ParserSymbolTableException{
+ LookupData data = new LookupData( name, -1 );
+
+ boolean inClass = ( getType() == TypeInfo.t_class);
+
+ Declaration enclosing = getContainingScope();
+ while( enclosing != null && (inClass ? enclosing.getType() != TypeInfo.t_class
+ : enclosing.getType() == TypeInfo.t_namespace) )
+ {
+ enclosing = enclosing.getContainingScope();
+ }
+
+ data.stopAt = enclosing;
+
+ ParserSymbolTable.Lookup( data, this );
+ return ParserSymbolTable.ResolveAmbiguities( data );
+ }
+
+ /**
+ * addUsingDeclaration
+ * @param obj
+ * @throws ParserSymbolTableException
+ *
+ * 7.3.3-9 The entity declared by a using-declaration shall be known in the
+ * context using it according to its definition at the point of the using-
+ * declaration. Definitions added to the namespace after the using-
+ * declaration are not considered when a use of the name is made.
+ *
+ * 7.3.3-4 A using-declaration used as a member-declaration shall refer to a
+ * member of a base class of the class being defined, shall refer to a
+ * member of an anonymous union that is a member of a base class of the
+ * class being defined, or shall refer to an enumerator for an enumeration
+ * type that is a member of a base class of the class being defined.
+ */
+ public Declaration addUsingDeclaration( String name ) throws ParserSymbolTableException {
+ return addUsingDeclaration( name, null );
+ }
+
+ public Declaration addUsingDeclaration( String name, Declaration declContext ) throws ParserSymbolTableException{
+ LookupData data = new LookupData( name, -1 );
+
+ if( declContext != null ){
+ data.qualified = true;
+ ParserSymbolTable.Lookup( data, declContext );
+ } else {
+ ParserSymbolTable.Lookup( data, this );
+ }
+
+ //figure out which declaration we are talking about, if it is a set of functions,
+ //then they will be in data.foundItems (since we provided no parameter info);
+ Declaration obj = ParserSymbolTable.ResolveAmbiguities( data );
+
+ if( data.foundItems == null ){
+ throw new ParserSymbolTableException();
+ }
+
+ Declaration clone = null;
+
+ //if obj != null, then that is the only object to consider, so size is 1,
+ //otherwise we consider the foundItems set
+ int size = ( obj == null ) ? data.foundItems.size() : 1;
+ Iterator iter = data.foundItems.iterator();
+ for( int i = size; i > 0; i-- ){
+ obj = ( obj != null && size == 1 ) ? obj : (Declaration) iter.next();
+
+ if( ParserSymbolTable.okToAddUsingDeclaration( obj, this ) ){
+ clone = (Declaration) obj.clone(); //7.3.3-9
+ addDeclaration( clone );
+ } else {
+ throw new ParserSymbolTableException();
+ }
+ }
+
+ return ( size == 1 ) ? clone : null;
+ }
+
+ public void addUsingDirective( Declaration namespace ) throws ParserSymbolTableException{
+ if( namespace.getType() != TypeInfo.t_namespace ){
+ throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTypeInfo );
+ }
+
+ if( _usingDirectives == null ){
+ _usingDirectives = new LinkedList();
+ }
+
+ _usingDirectives.add( namespace );
+ }
+
+ public LinkedList getUsingDirectives(){
+ return _usingDirectives;
+ }
+
+ public Declaration ElaboratedLookup( int type, String name ) throws ParserSymbolTableException{
+ LookupData data = new LookupData( name, type );
+
+ ParserSymbolTable.Lookup( data, this );
+
+ return ParserSymbolTable.ResolveAmbiguities( data );
+ }
+
+ public Declaration Lookup( String name ) throws ParserSymbolTableException {
+ LookupData data = new LookupData( name, -1 );
+
+ ParserSymbolTable.Lookup( data, this );
+
+ return ParserSymbolTable.ResolveAmbiguities( data );
+ }
+
+ /**
+ * LookupMemberForDefinition
+ * @param name
+ * @return Declaration
+ * @throws ParserSymbolTableException
+ *
+ * In a definition for a namespace member in which the declarator-id is a
+ * qualified-id, given that the qualified-id for the namespace member has
+ * the form "nested-name-specifier unqualified-id", the unqualified-id shall
+ * name a member of the namespace designated by the nested-name-specifier.
+ *
+ * ie:
+ * you have this:
+ * namespace A{
+ * namespace B{
+ * void f1(int);
+ * }
+ * using namespace B;
+ * }
+ *
+ * if you then do this
+ * void A::f1(int) { ... } //ill-formed, f1 is not a member of A
+ * but, you can do this (Assuming f1 has been defined elsewhere)
+ * A::f1( 1 ); //ok, finds B::f1
+ *
+ * ie, We need a seperate lookup function for looking up the member names
+ * for a definition.
+ */
+ public Declaration LookupMemberForDefinition( String name ) throws ParserSymbolTableException{
+ LookupData data = new LookupData( name, -1 );
+ data.qualified = true;
+
+ ParserSymbolTable.LookupInContained( data, this );
+
+ return ParserSymbolTable.ResolveAmbiguities( data );
+ }
+
+ /**
+ * Method LookupNestedNameSpecifier.
+ * @param name
+ * @return Declaration
+ * The name of a class or namespace member can be referred to after the ::
+ * scope resolution operator applied to a nested-name-specifier that
+ * nominates its class or namespace. During the lookup for a name preceding
+ * the ::, object, function and enumerator names are ignored. If the name
+ * is not a class-name or namespace-name, the program is ill-formed
+ */
+ public Declaration LookupNestedNameSpecifier( String name ) throws ParserSymbolTableException {
+ return LookupNestedNameSpecifier( name, this );
+ }
+ private Declaration LookupNestedNameSpecifier(String name, Declaration inDeclaration ) throws ParserSymbolTableException{
+ Declaration foundDeclaration = null;
+
+ LookupData data = new LookupData( name, TypeInfo.t_namespace );
+ data.upperType = TypeInfo.t_union;
+
+ ParserSymbolTable.LookupInContained( data, inDeclaration );
+
+ if( data.foundItems != null ){
+ foundDeclaration = ParserSymbolTable.ResolveAmbiguities( data );//, data.foundItems );
+ }
+
+ if( foundDeclaration == null && inDeclaration.getContainingScope() != null ){
+ foundDeclaration = LookupNestedNameSpecifier( name, inDeclaration.getContainingScope() );
+ }
+
+ return foundDeclaration;
+ }
+
+ /**
+ * MemberFunctionLookup
+ * @param name
+ * @param parameters
+ * @return Declaration
+ * @throws ParserSymbolTableException
+ *
+ * Member lookup really proceeds as an unqualified lookup, but doesn't
+ * include argument dependant scopes
+ */
+ public Declaration MemberFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException{
+ LookupData data = new LookupData( name, TypeInfo.t_function );
+ //if parameters == null, thats no parameters, but we need to distinguish that from
+ //no parameter information at all, so make an empty list.
+ data.parameters = ( parameters == null ) ? new LinkedList() : parameters;
+
+ ParserSymbolTable.Lookup( data, this );
+ return ParserSymbolTable.ResolveAmbiguities( data );
+ }
+
+ public Declaration QualifiedFunctionLookup( String name, LinkedList parameters ) throws ParserSymbolTableException{
+ LookupData data = new LookupData( name, TypeInfo.t_function );
+ data.qualified = true;
+ //if parameters == null, thats no parameters, but we need to distinguish that from
+ //no parameter information at all, so make an empty list.
+ data.parameters = ( parameters == null ) ? new LinkedList() : parameters;
+
+ ParserSymbolTable.Lookup( data, this );
+
+ return ParserSymbolTable.ResolveAmbiguities( data );
+ }
+
+ public Declaration QualifiedLookup( String name ) throws ParserSymbolTableException{
+ LookupData data = new LookupData( name, -1 );
+ data.qualified = true;
+ ParserSymbolTable.Lookup( data, this );
+
+ return ParserSymbolTable.ResolveAmbiguities( data );
+ }
+
+ /**
+ * UnqualifiedFunctionLookup
+ * @param name
+ * @param parameters
+ * @return Declaration
+ * @throws ParserSymbolTableException
+ *
+ * 3.4.2-1 When an unqualified name is used as the post-fix expression in a
+ * function call, other namespaces not consdiered during the usual
+ * unqualified lookup may be searched.
+ *
+ * 3.4.2-2 For each argument type T in the function call, there is a set of
+ * zero or more associated namespaces and a set of zero or more associated
+ * classes to be considered.
+ *
+ * If the ordinary unqualified lookup of the name find the declaration of a
+ * class member function, the associated namespaces and classes are not
+ * considered. Otherwise, the set of declarations found by the lookup of
+ * the function name is the union of the set of declarations found using
+ * ordinary unqualified lookup and the set of declarations found in the
+ * namespaces and classes associated with the argument types.
+ */
+ public Declaration UnqualifiedFunctionLookup( String name, LinkedList 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();
+
+ //collect associated namespaces & classes.
+ int size = ( parameters == null ) ? 0 : parameters.size();
+ Iterator iter = ( parameters == null ) ? null : parameters.iterator();
+
+ TypeInfo param = null;
+ Declaration paramType = null;
+ for( int i = size; i > 0; i-- ){
+ param = (TypeInfo) iter.next();
+ paramType = ParserSymbolTable.getFlatTypeInfo( param ).getTypeDeclaration();
+
+ ParserSymbolTable.getAssociatedScopes( paramType, associated );
+
+ //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.getPtrOperator() != null &&
+ (param.getPtrOperator().equals("*") || param.getPtrOperator().equals("[]")) &&
+ paramType.getContainingScope().isType( TypeInfo.t_class, TypeInfo.t_union ) )
+ {
+ ParserSymbolTable.getAssociatedScopes( paramType.getContainingScope(), associated );
+ }
+ }
+
+ LookupData data = new LookupData( name, TypeInfo.t_function );
+ //if parameters == null, thats no parameters, but we need to distinguish that from
+ //no parameter information at all, so make an empty list.
+ data.parameters = ( parameters == null ) ? new LinkedList() : parameters;
+ data.associated = associated;
+
+ ParserSymbolTable.Lookup( data, this );
+
+ Declaration found = ResolveAmbiguities( data );
+
+ //if we haven't found anything, or what we found is not a class member, consider the
+ //associated scopes
+ if( found == null || found.getContainingScope().getType() != TypeInfo.t_class ){
+ if( found != null ){
+ data.foundItems.add( found );
+ }
+
+ 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
+ Object [] scopes = associated.toArray();
+
+ size = associated.size();
+
+ for( int i = 0; i < size; i++ ){
+ decl = (Declaration) scopes[ i ];
+ if( associated.contains( decl ) ){
+ data.qualified = true;
+ data.ignoreUsingDirectives = true;
+ ParserSymbolTable.Lookup( data, decl );
+ }
+ }
+
+ found = ParserSymbolTable.ResolveAmbiguities( data );
+ }
+
+ return found;
+ }
+
+ private String _name; //our name
+ private Object _object; //the object associated with us
+ private boolean _needsDefinition; //this name still needs to be defined
+ private int _cvQualifier;
+
+ private TypeInfo _typeInfo; //our type info
+ private Declaration _containingScope; //the scope that contains us
+ private LinkedList _parentScopes; //inherited scopes (is base classes)
+ private LinkedList _usingDirectives; //collection of nominated namespaces
+ private HashMap _containedDeclarations; //declarations contained by us.
+
+ private LinkedList _parameters; //parameter list
+ private int _returnType;
+
+ private int _depth; //how far down the scope stack we are
+
+ protected class ParentWrapper
+ {
+ public ParentWrapper( Declaration p, boolean v ){
+ parent = p;
+ isVirtual = v;
+ }
+
+ public boolean isVirtual = false;
+ public Declaration parent = null;
+ }
+ }
+
+ static public class TypeInfo{
+ public TypeInfo(){
+ super();
+ }
+
+ public TypeInfo( int type, Declaration decl ){
+ super();
+ _typeInfo = type;
+ _typeDeclaration = decl;
+ }
+
+ public TypeInfo( int type, Declaration decl, int cvQualifier, String ptrOp, boolean hasDefault ){
+ super();
+ _typeInfo = type;
+ _typeDeclaration = decl;
+ _cvQualifier = cvQualifier;
+ _ptrOperator = ( ptrOp != null ) ? new String( ptrOp ) : null;
+ _hasDefaultValue = hasDefault;
+ }
+
+ public TypeInfo( TypeInfo info ){
+ super();
+
+ _typeInfo = info._typeInfo;
+ _typeDeclaration = info._typeDeclaration;
+ _cvQualifier = info._cvQualifier;
+ _ptrOperator = ( info._ptrOperator == null ) ? null : new String( info._ptrOperator );
+ _hasDefaultValue = info._hasDefaultValue;
+ }
+
+ public static final int typeMask = 0x001f;
+ public static final int isAuto = 0x0020;
+ public static final int isRegister = 0x0040;
+ public static final int isStatic = 0x0080;
+ public static final int isExtern = 0x0100;
+ public static final int isMutable = 0x0200;
+ public static final int isInline = 0x0400;
+ public static final int isVirtual = 0x0800;
+ public static final int isExplicit = 0x1000;
+ public static final int isTypedef = 0x2000;
+ public static final int isFriend = 0x4000;
+ public static final int isConst = 0x8000;
+ public static final int isVolatile = 0x10000;
+ public static final int isUnsigned = 0x20000;
+ public static final int isShort = 0x40000;
+ public static final int isLong = 0x80000;
+
+ // Types (maximum type is typeMask
+ // Note that these should be considered ordered and if you change
+ // the order, you should consider the ParserSymbolTable uses
+ public static final int t_undef = 0; //not specified
+ public static final int t_type = 1; // Type Specifier
+ public static final int t_namespace = 2;
+ public static final int t_class = 3;
+ public static final int t_struct = 4;
+ public static final int t_union = 5;
+ public static final int t_enumeration = 6;
+ public static final int t_function = 7;
+ public static final int t_bool = 8;
+ public static final int t_char = 9;
+ public static final int t_wchar_t = 10;
+ public static final int t_int = 11;
+ public static final int t_float = 12;
+ public static final int t_double = 13;
+ public static final int t_void = 14;
+ public static final int t_enumerator = 15;
+
+ private static final String _image[] = { "",
+ "",
+ "namespace",
+ "class",
+ "struct",
+ "union",
+ "enum",
+ "",
+ "bool",
+ "char",
+ "wchar_t",
+ "int",
+ "float",
+ "double",
+ "void",
+ ""
+ };
+ //Partial ordering :
+ // none < const
+ // none < volatile
+ // none < const volatile
+ // const < const volatile
+ // volatile < const volatile
+ public static final int cvConst = 2;
+ public static final int cvVolatile = 3;
+ public static final int cvConstVolatile = 5;
+
+ // Convenience methods
+ public void setBit(boolean b, int mask){
+ if( b ){
+ _typeInfo = _typeInfo | mask;
+ } else {
+ _typeInfo = _typeInfo & ~mask;
+ }
+ }
+
+ public boolean checkBit(int mask){
+ return (_typeInfo & mask) != 0;
+ }
+
+ public void setType(int t) throws ParserSymbolTableException{
+ //sanity check, t must fit in its allocated 5 bits in _typeInfo
+ if( t > typeMask ){
+ throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTypeInfo );
+ }
+
+ _typeInfo = _typeInfo & ~typeMask | t;
+ }
+
+ public int getType(){
+ return _typeInfo & typeMask;
+ }
+
+ public boolean isType( int type ){
+ return isType( type, 0 );
+ }
+
+ public int getTypeInfo(){
+ return _typeInfo;
+ }
+
+ public void setTypeInfo( int typeInfo ){
+ _typeInfo = typeInfo;
+ }
+
+ /**
+ *
+ * @param type
+ * @param upperType
+ * @return boolean
+ *
+ * type checking, check that this declaration's type is between type and
+ * upperType (inclusive). upperType of 0 means no range and our type must
+ * be type.
+ */
+ public boolean isType( int type, int upperType ){
+ //type of -1 means we don't care
+ if( type == -1 )
+ return true;
+
+ //upperType of 0 means no range
+ if( upperType == 0 ){
+ return ( getType() == type );
+ } else {
+ return ( getType() >= type && getType() <= upperType );
+ }
+ }
+
+ public Declaration getTypeDeclaration(){
+ return _typeDeclaration;
+ }
+
+ public void setTypeDeclaration( Declaration type ){
+ _typeDeclaration = type;
+ }
+
+ public int getCVQualifier(){
+ return _cvQualifier;
+ }
+
+ public void setCVQualifier( int cv ){
+ _cvQualifier = cv;
+ }
+
+ public void addCVQualifier( int cv ){
+ switch( _cvQualifier ){
+ case 0:
+ _cvQualifier = cv;
+ break;
+
+ case cvConst:
+ if( cv != cvConst ){
+ _cvQualifier = cvConstVolatile;
+ }
+ break;
+
+ case cvVolatile:
+ if( cv != cvVolatile ){
+ _cvQualifier = cvConstVolatile;
+ }
+ break;
+
+ case cvConstVolatile:
+ break; //nothing to do
+ }
+ }
+
+ public String getPtrOperator(){
+ return _ptrOperator;
+ }
+
+ public void setPtrOperator( String ptr ){
+ _ptrOperator = ptr;
+ }
+
+ public void addPtrOperator( String ptr ){
+ if( ptr == null ){
+ return;
+ }
+
+ char chars[] = ( _ptrOperator == null ) ? ptr.toCharArray() : ( ptr + _ptrOperator ).toCharArray();
+
+ int nChars = ( _ptrOperator == null ) ? ptr.length() : ptr.length() + _ptrOperator.length();
+
+ char dest[] = new char [ nChars ];
+ int j = 0;
+
+ char currChar, nextChar, tempChar;
+
+ for( int i = 0; i < nChars; i++ ){
+ currChar = chars[ i ];
+ nextChar = ( i + 1 < nChars ) ? chars[ i + 1 ] : 0;
+
+ switch( currChar ){
+ case '&':{
+ switch( nextChar ){
+ case '[':
+ tempChar = ( i + 2 < nChars ) ? chars[ i + 2 ] : 0;
+ if( tempChar == ']' ){
+ i++;
+ nextChar = '*';
+ }
+ //fall through to '*'
+ case '*':
+ i++;
+ break;
+ case '&':
+ default:
+ dest[ j++ ] = currChar;
+ break;
+ }
+ break;
+ }
+ case '[':{
+ if( nextChar == ']' ){
+ i++;
+ currChar = '*';
+ nextChar = ( i + 2 < nChars ) ? chars[ i + 2 ] : 0;
+ }
+ //fall through to '*'
+ }
+ case '*':{
+
+ if( nextChar == '&' ){
+ i++;
+ } else {
+ dest[ j++ ] = currChar;
+ }
+ break;
+ }
+ default:
+ break;
+
+ }
+ }
+
+ _ptrOperator = new String( dest, 0, j );
+ }
+
+ public String getInvertedPtrOperator(){
+ if( _ptrOperator == null ){
+ return null;
+ }
+
+ char chars[] = _ptrOperator.toCharArray();
+ int nChars = _ptrOperator.length();
+
+ char dest[] = new char [ nChars ];
+ char currChar;
+
+ for( int i = 0; i < nChars; i++ ){
+ currChar = chars[ i ];
+ switch( currChar ){
+ case '*' : dest[ i ] = '&'; break;
+ case '&' : dest[ i ] = '*'; break;
+ default: dest[ i ] = currChar; break;
+ }
+ }
+
+ return new String( dest );
+ }
+
+ public boolean getHasDefault(){
+ return _hasDefaultValue;
+ }
+
+ public void setHasDefault( boolean def ){
+ _hasDefaultValue = def;
+ }
+
+ /**
+ * canHold
+ * @param type
+ * @return boolean
+ * return true is the our type can hold all the values of the passed in
+ * type.
+ * TBD, for now return true if our type is "larger" (based on ordering of
+ * the type values)
+ */
+ public boolean canHold( TypeInfo type ){
+ return getType() >= type.getType();
+ }
+
+ public boolean equals( Object t ){
+ if( t == null || !(t instanceof TypeInfo) ){
+ return false;
+ }
+
+ TypeInfo type = (TypeInfo)t;
+
+ boolean result = ( _typeInfo == type._typeInfo );
+ result &= ( _typeDeclaration == type._typeDeclaration );
+ result &= ( _cvQualifier == type._cvQualifier );
+
+ String op1 = ( _ptrOperator != null && _ptrOperator.equals("") ) ? null : _ptrOperator;
+ String op2 = ( type._ptrOperator != null && type._ptrOperator.equals("") ) ? null : type._ptrOperator;
+ result &= (( op1 != null && op2 != null && op1.equals( op2 ) ) || op1 == op2 );
+
+ return result;
+ }
+
+ public String toString(){
+ if( isType( t_type ) ){
+ return _typeDeclaration.getName();
+ } else {
+ return _image[ getType() ];
+ }
+ }
+
+ private int _typeInfo = 0;
+ private Declaration _typeDeclaration;
+ private int _cvQualifier = 0;
+
+ private boolean _hasDefaultValue = false;
+ private String _ptrOperator;
+ }
}
Index: parser/org/eclipse/cdt/internal/core/parser/TypeInfo.java
===================================================================
RCS file: parser/org/eclipse/cdt/internal/core/parser/TypeInfo.java
diff -N parser/org/eclipse/cdt/internal/core/parser/TypeInfo.java
--- parser/org/eclipse/cdt/internal/core/parser/TypeInfo.java 9 Apr 2003 21:11:59 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,366 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2002,2003 Rational Software Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v0.5
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- *
- * Contributors:
- * Rational Software - Initial API and implementation
-***********************************************************************/
-
-package org.eclipse.cdt.internal.core.parser;
-
-
-/**
- * @author aniefer
- *
- * To change this generated comment edit the template variable "typecomment":
- * Window>Preferences>Java>Templates.
- * To enable and disable the creation of type comments go to
- * Window>Preferences>Java>Code Generation.
- */
-
-public class TypeInfo{
- public TypeInfo(){
- super();
- }
-
- public TypeInfo( int type, Declaration decl ){
- super();
- _typeInfo = type;
- _typeDeclaration = decl;
- }
-
- public TypeInfo( int type, Declaration decl, int cvQualifier, String ptrOp, boolean hasDefault ){
- super();
- _typeInfo = type;
- _typeDeclaration = decl;
- _cvQualifier = cvQualifier;
- _ptrOperator = ( ptrOp != null ) ? new String( ptrOp ) : null;
- _hasDefaultValue = hasDefault;
- }
-
- public TypeInfo( TypeInfo info ){
- super();
-
- _typeInfo = info._typeInfo;
- _typeDeclaration = info._typeDeclaration;
- _cvQualifier = info._cvQualifier;
- _ptrOperator = ( info._ptrOperator == null ) ? null : new String( info._ptrOperator );
- _hasDefaultValue = info._hasDefaultValue;
- }
-
- public static final int typeMask = 0x001f;
- public static final int isAuto = 0x0020;
- public static final int isRegister = 0x0040;
- public static final int isStatic = 0x0080;
- public static final int isExtern = 0x0100;
- public static final int isMutable = 0x0200;
- public static final int isInline = 0x0400;
- public static final int isVirtual = 0x0800;
- public static final int isExplicit = 0x1000;
- public static final int isTypedef = 0x2000;
- public static final int isFriend = 0x4000;
- public static final int isConst = 0x8000;
- public static final int isVolatile = 0x10000;
- public static final int isUnsigned = 0x20000;
- public static final int isShort = 0x40000;
- public static final int isLong = 0x80000;
-
- // Types (maximum type is typeMask
- // Note that these should be considered ordered and if you change
- // the order, you should consider the ParserSymbolTable uses
- public static final int t_undef = 0; //not specified
- public static final int t_type = 1; // Type Specifier
- public static final int t_namespace = 2;
- public static final int t_class = 3;
- public static final int t_struct = 4;
- public static final int t_union = 5;
- public static final int t_enumeration = 6;
- public static final int t_function = 7;
- public static final int t_bool = 8;
- public static final int t_char = 9;
- public static final int t_wchar_t = 10;
- public static final int t_int = 11;
- public static final int t_float = 12;
- public static final int t_double = 13;
- public static final int t_void = 14;
- public static final int t_enumerator = 15;
-
- private static final String _image[] = { "",
- "",
- "namespace",
- "class",
- "struct",
- "union",
- "enum",
- "",
- "bool",
- "char",
- "wchar_t",
- "int",
- "float",
- "double",
- "void",
- ""
- };
- //Partial ordering :
- // none < const
- // none < volatile
- // none < const volatile
- // const < const volatile
- // volatile < const volatile
- public static final int cvConst = 2;
- public static final int cvVolatile = 3;
- public static final int cvConstVolatile = 5;
-
- // Convenience methods
- public void setBit(boolean b, int mask){
- if( b ){
- _typeInfo = _typeInfo | mask;
- } else {
- _typeInfo = _typeInfo & ~mask;
- }
- }
-
- public boolean checkBit(int mask){
- return (_typeInfo & mask) != 0;
- }
-
- public void setType(int t) throws ParserSymbolTableException{
- //sanity check, t must fit in its allocated 5 bits in _typeInfo
- if( t > typeMask ){
- throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTypeInfo );
- }
-
- _typeInfo = _typeInfo & ~typeMask | t;
- }
-
- public int getType(){
- return _typeInfo & typeMask;
- }
-
- public boolean isType( int type ){
- return isType( type, 0 );
- }
-
- public int getTypeInfo(){
- return _typeInfo;
- }
-
- public void setTypeInfo( int typeInfo ){
- _typeInfo = typeInfo;
- }
-
- /**
- *
- * @param type
- * @param upperType
- * @return boolean
- *
- * type checking, check that this declaration's type is between type and
- * upperType (inclusive). upperType of 0 means no range and our type must
- * be type.
- */
- public boolean isType( int type, int upperType ){
- //type of -1 means we don't care
- if( type == -1 )
- return true;
-
- //upperType of 0 means no range
- if( upperType == 0 ){
- return ( getType() == type );
- } else {
- return ( getType() >= type && getType() <= upperType );
- }
- }
-
- public Declaration getTypeDeclaration(){
- return _typeDeclaration;
- }
-
- public void setTypeDeclaration( Declaration type ){
- _typeDeclaration = type;
- }
-
- public int getCVQualifier(){
- return _cvQualifier;
- }
-
- public void setCVQualifier( int cv ){
- _cvQualifier = cv;
- }
-
- public void addCVQualifier( int cv ){
- switch( _cvQualifier ){
- case 0:
- _cvQualifier = cv;
- break;
-
- case cvConst:
- if( cv != cvConst ){
- _cvQualifier = cvConstVolatile;
- }
- break;
-
- case cvVolatile:
- if( cv != cvVolatile ){
- _cvQualifier = cvConstVolatile;
- }
- break;
-
- case cvConstVolatile:
- break; //nothing to do
- }
- }
-
- public String getPtrOperator(){
- return _ptrOperator;
- }
-
- public void setPtrOperator( String ptr ){
- _ptrOperator = ptr;
- }
-
- public void addPtrOperator( String ptr ){
- if( ptr == null ){
- return;
- }
-
- char chars[] = ( _ptrOperator == null ) ? ptr.toCharArray() : ( ptr + _ptrOperator ).toCharArray();
-
- int nChars = ( _ptrOperator == null ) ? ptr.length() : ptr.length() + _ptrOperator.length();
-
- char dest[] = new char [ nChars ];
- int j = 0;
-
- char currChar, nextChar, tempChar;
-
- for( int i = 0; i < nChars; i++ ){
- currChar = chars[ i ];
- nextChar = ( i + 1 < nChars ) ? chars[ i + 1 ] : 0;
-
- switch( currChar ){
- case '&':{
- switch( nextChar ){
- case '[':
- tempChar = ( i + 2 < nChars ) ? chars[ i + 2 ] : 0;
- if( tempChar == ']' ){
- i++;
- nextChar = '*';
- }
- //fall through to '*'
- case '*':
- i++;
- break;
- case '&':
- default:
- dest[ j++ ] = currChar;
- break;
- }
- break;
- }
- case '[':{
- if( nextChar == ']' ){
- i++;
- currChar = '*';
- nextChar = ( i + 2 < nChars ) ? chars[ i + 2 ] : 0;
- }
- //fall through to '*'
- }
- case '*':{
-
- if( nextChar == '&' ){
- i++;
- } else {
- dest[ j++ ] = currChar;
- }
- break;
- }
- default:
- break;
-
- }
- }
-
- _ptrOperator = new String( dest, 0, j );
- }
-
- public String getInvertedPtrOperator(){
- if( _ptrOperator == null ){
- return null;
- }
-
- char chars[] = _ptrOperator.toCharArray();
- int nChars = _ptrOperator.length();
-
- char dest[] = new char [ nChars ];
- char currChar;
-
- for( int i = 0; i < nChars; i++ ){
- currChar = chars[ i ];
- switch( currChar ){
- case '*' : dest[ i ] = '&'; break;
- case '&' : dest[ i ] = '*'; break;
- default: dest[ i ] = currChar; break;
- }
- }
-
- return new String( dest );
- }
-
- public boolean getHasDefault(){
- return _hasDefaultValue;
- }
-
- public void setHasDefault( boolean def ){
- _hasDefaultValue = def;
- }
-
- /**
- * canHold
- * @param type
- * @return boolean
- * return true is the our type can hold all the values of the passed in
- * type.
- * TBD, for now return true if our type is "larger" (based on ordering of
- * the type values)
- */
- public boolean canHold( TypeInfo type ){
- return getType() >= type.getType();
- }
-
- public boolean equals( Object t ){
- if( t == null || !(t instanceof TypeInfo) ){
- return false;
- }
-
- TypeInfo type = (TypeInfo)t;
-
- boolean result = ( _typeInfo == type._typeInfo );
- result &= ( _typeDeclaration == type._typeDeclaration );
- result &= ( _cvQualifier == type._cvQualifier );
-
- String op1 = ( _ptrOperator != null && _ptrOperator.equals("") ) ? null : _ptrOperator;
- String op2 = ( type._ptrOperator != null && type._ptrOperator.equals("") ) ? null : type._ptrOperator;
- result &= (( op1 != null && op2 != null && op1.equals( op2 ) ) || op1 == op2 );
-
- return result;
- }
-
- public String toString(){
- if( isType( t_type ) ){
- return _typeDeclaration.getName();
- } else {
- return _image[ getType() ];
- }
- }
-
- private int _typeInfo = 0;
- private Declaration _typeDeclaration;
- private int _cvQualifier = 0;
-
- private boolean _hasDefaultValue = false;
- private String _ptrOperator;
-}
\ No newline at end of file