diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTemplateTests.java index b0c1f59e9f4..45ca1368e07 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTemplateTests.java @@ -10,8 +10,8 @@ ***********************************************************************/ package org.eclipse.cdt.core.parser.tests; +import java.util.ArrayList; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import junit.framework.TestCase; @@ -88,7 +88,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { table.getCompilationUnit().addSymbol( B ); TypeInfo type = new TypeInfo( TypeInfo.t_type, 0, B ); - LinkedList args = new LinkedList(); + ArrayList args = new ArrayList(); args.add( type ); IContainerSymbol instance = (IContainerSymbol) table.getCompilationUnit().lookupTemplateId( "A", args ); @@ -145,7 +145,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { table.getCompilationUnit().addSymbol( B ); TypeInfo type = new TypeInfo( TypeInfo.t_int, 0 , null ); - LinkedList args = new LinkedList(); + ArrayList args = new ArrayList(); args.add( type ); look = table.getCompilationUnit().lookupTemplateId( "A", args ); @@ -217,7 +217,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { X.addSymbol( u ); TypeInfo type = new TypeInfo( TypeInfo.t_char, 0, null ); - LinkedList args = new LinkedList(); + ArrayList args = new ArrayList(); args.add( type ); IDerivableContainerSymbol lookX = (IDerivableContainerSymbol) table.getCompilationUnit().lookupTemplateId( "X", args ); assertTrue( lookX.isTemplateInstance() ); @@ -272,7 +272,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { IDerivableContainerSymbol B = table.newDerivableContainerSymbol( "B", TypeInfo.t_class ); table.getCompilationUnit().addSymbol( B ); - LinkedList args = new LinkedList(); + ArrayList args = new ArrayList(); TypeInfo arg = new TypeInfo( TypeInfo.t_type, 0, B ); args.add( arg ); @@ -292,7 +292,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { f3.addParameter( TypeInfo.t_int, 0, null, false ); table.getCompilationUnit().addSymbol( f3 ); - args = new LinkedList(); + args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_type, 0, B ) ); IDerivableContainerSymbol lookA2 = (IDerivableContainerSymbol) table.getCompilationUnit().lookupTemplateId( "A", args ); assertEquals( lookA2, lookA ); @@ -302,7 +302,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { a.setTypeSymbol( lookA ); table.getCompilationUnit().addSymbol( a ); - LinkedList params = new LinkedList(); + ArrayList params = new ArrayList(); params.add( new TypeInfo( TypeInfo.t_type, 0, a ) ); ISymbol look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", params ); @@ -421,7 +421,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { p.addPtrOperator( new PtrOp( PtrOp.t_pointer ) ); table.getCompilationUnit().addSymbol( p ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_type, 0, p ) ); look = table.getCompilationUnit().lookupTemplateId( "R", args ); @@ -473,7 +473,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { IDerivableContainerSymbol string = table.newDerivableContainerSymbol( "String", TypeInfo.t_class ); factory.addSymbol( string ); - List args = new LinkedList(); + List args = new ArrayList(); ISymbol look = table.getCompilationUnit().lookupTemplateId( "String", args ); assertTrue( look.isTemplateInstance() ); assertEquals( look.getInstantiatedSymbol(), string ); @@ -510,7 +510,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { IDerivableContainerSymbol S = table.newDerivableContainerSymbol( "S", TypeInfo.t_struct ); f.addSymbol( S ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_type, 0, S ) ); try{ f.lookupTemplateId( "X", args ); @@ -560,7 +560,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { IDerivableContainerSymbol X = table.newDerivableContainerSymbol( "X", TypeInfo.t_class ); factory.addSymbol( X ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_int, 0, null ) ); args.add( new TypeInfo( TypeInfo.t_char, 0, null, new PtrOp( PtrOp.t_pointer ), "Studebaker" ) ); @@ -631,7 +631,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { t.addPtrOperator( new PtrOp( PtrOp.t_pointer ) ); S.addSymbol( t ); - List args = new LinkedList(); + List args = new ArrayList(); TypeInfo arg = new TypeInfo( TypeInfo.t_type, 0, m ); arg.addOperatorExpression( TypeInfo.OperatorExpression.addressof ); args.add( arg ); @@ -692,7 +692,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { IDerivableContainerSymbol B = table.newDerivableContainerSymbol( "B", TypeInfo.t_struct ); factory.addSymbol( B ); - List args = new LinkedList( ); + List args = new ArrayList( ); args.add( new TypeInfo( TypeInfo.t_int, 0, null, null, "1" ) ); try{ @@ -774,7 +774,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { IDerivableContainerSymbol C = table.newDerivableContainerSymbol( "C", TypeInfo.t_class ); templateC.addSymbol( C ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_int, 0, null ) ); ISymbol look = templateC.lookupTemplateId( "V", args ); @@ -889,7 +889,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { ISymbol returnType = factory.lookup( "U" ); assertEquals( returnType, U ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_type, 0, U ) ); args.add( new TypeInfo( TypeInfo.t_type, 0, V ) ); @@ -897,7 +897,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { assertEquals( look, A ); factory.pushTemplateId( look, args ); - IParameterizedSymbol lookF = factory.lookupMethodForDefinition( "f1", new LinkedList() ); + IParameterizedSymbol lookF = factory.lookupMethodForDefinition( "f1", new ArrayList() ); assertEquals( lookF, f1 ); assertTrue( lookF.isForwardDeclaration() ); @@ -915,7 +915,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { assertTrue( lookA.isTemplateInstance() ); assertEquals( lookA.getInstantiatedSymbol(), A ); - List params = new LinkedList(); + List params = new ArrayList(); look = lookA.qualifiedFunctionLookup( "f1", params ); assertTrue( look.isTemplateInstance() ); assertEquals( look.getInstantiatedSymbol(), defnd ); @@ -980,7 +980,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { factory.setContainingSymbol( table.getCompilationUnit() ); factory.pushTemplate( temp ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_type, 0, U ) ); IContainerSymbol lookA = factory.lookupTemplateIdForDefinition( "A", args ); @@ -1061,7 +1061,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { factory.setContainingSymbol( table.getCompilationUnit() ); factory.pushTemplate( temp ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_type, 0, paramU ) ); look = factory.lookupTemplateIdForDefinition( "X", args ); @@ -1151,7 +1151,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { ISymbol lookV = factory.lookup( "V" ); assertEquals( lookV, V ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_type, 0, U ) ); ISymbol look = factory.lookupTemplateIdForDefinition( "string", args ); @@ -1300,7 +1300,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { spec.addSymbol( A2 ); template.addSpecialization( spec ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_int, 0, null ) ); args.add( new TypeInfo( TypeInfo.t_int, 0, null, new PtrOp( PtrOp.t_pointer ), false ) ); @@ -1424,7 +1424,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { ITemplateSymbol a = (ITemplateSymbol) table.getCompilationUnit().lookup( "A" ); assertEquals( a, template1 ); - LinkedList args = new LinkedList(); + ArrayList args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_int, 0, null ) ); args.add( new TypeInfo( TypeInfo.t_int, 0, null ) ); @@ -1527,7 +1527,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { p.addPtrOperator( new PtrOp( PtrOp.t_pointer, false, false ) ); table.getCompilationUnit().addSymbol( p ); - List params = new LinkedList(); + List params = new ArrayList(); params.add( new TypeInfo( TypeInfo.t_type, 0, p ) ); ISymbol look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", params ); @@ -1572,7 +1572,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { factory.addSymbol( g2 ); ISymbol x = table.newSymbol( "x", TypeInfo.t_float ); - List params = new LinkedList(); + List params = new ArrayList(); params.add( new TypeInfo( TypeInfo.t_type, 0, x ) ); try{ table.getCompilationUnit().unqualifiedFunctionLookup( "g", params ); @@ -1630,20 +1630,20 @@ public class ParserSymbolTableTemplateTests extends TestCase { T = template2.lookup( "T" ); IParameterizedSymbol h2 = table.newParameterizedSymbol( "h", TypeInfo.t_function ); - List argList = new LinkedList(); + List argList = new ArrayList(); argList.add( new TypeInfo( TypeInfo.t_type, 0, T ) ); h2.addParameter( templateA.instantiate( argList ), 0, new PtrOp( PtrOp.t_reference ), false ); factory.addSymbol( h2 ); ISymbol z = table.newSymbol( "z", TypeInfo.t_type ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_int, 0, null ) ); ISymbol look = table.getCompilationUnit().lookupTemplateId( "A", args ); assertTrue( look.isTemplateInstance() ); assertEquals( look.getInstantiatedSymbol(), A ); z.setTypeSymbol( look ); - List params = new LinkedList(); + List params = new ArrayList(); params.add( new TypeInfo( TypeInfo.t_type, 0, z ) ); look = table.getCompilationUnit().unqualifiedFunctionLookup( "h", params ); assertTrue( look.isTemplateInstance() ); @@ -1843,7 +1843,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { factory.setContainingSymbol( table.getCompilationUnit() ); factory.pushTemplate( temp ); - LinkedList params = new LinkedList(), args = new LinkedList(); + ArrayList args = new ArrayList(); factory = table.newTemplateFactory(); factory.setContainingSymbol( table.getCompilationUnit() ); @@ -1910,7 +1910,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { IParameterizedSymbol sort = table.newParameterizedSymbol( "sort", TypeInfo.t_function ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_type, 0, T ) ); ISymbol arrayLook = factory.lookupTemplateId( "Array", args ); @@ -1989,8 +1989,6 @@ public class ParserSymbolTableTemplateTests extends TestCase { factory.addSymbol( f2 ); - List params = new LinkedList(); - factory = table.newTemplateFactory(); ITemplateSymbol template = table.newTemplateSymbol( ParserSymbolTable.EMPTY_NAME ); factory.setContainingSymbol( table.getCompilationUnit() ); @@ -1999,11 +1997,11 @@ public class ParserSymbolTableTemplateTests extends TestCase { IParameterizedSymbol f3 = table.newParameterizedSymbol( "f", TypeInfo.t_function ); f3.addParameter( TypeInfo.t_int, 0, new PtrOp( PtrOp.t_pointer ), false ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_int, 0, null, new PtrOp( PtrOp.t_pointer ), false ) ); factory.addTemplateId( f3, args ); - args = new LinkedList(); + args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_int, 0, null ) ); template = table.newTemplateSymbol( ParserSymbolTable.EMPTY_NAME ); @@ -2093,7 +2091,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { table.getCompilationUnit().addSymbol( a ); table.getCompilationUnit().addSymbol( b ); - List argList = new LinkedList(); + List argList = new ArrayList(); TypeInfo aParam = new TypeInfo( TypeInfo.t_type, 0, a ); TypeInfo bParam = new TypeInfo( TypeInfo.t_type, 0, b ); @@ -2188,7 +2186,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { table.getCompilationUnit().addSymbol( g3); TypeInfo arg = new TypeInfo( TypeInfo.t_type, 0, g1 ); - List argList = new LinkedList(); + List argList = new ArrayList(); argList.add( arg ); ISymbol look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", argList ); @@ -2230,7 +2228,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { ISymbol p = table.newSymbol( "p", TypeInfo.t_int ); p.addPtrOperator( new PtrOp( PtrOp.t_pointer ) ); - List params = new LinkedList(); + List params = new ArrayList(); params.add( new TypeInfo( TypeInfo.t_type, 0, p ) ); ISymbol look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", params ); @@ -2293,7 +2291,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { factory.addSymbol( D ); ISymbol T = templateD.lookup( "T" ); - List args = new LinkedList (); + List args = new ArrayList (); args.add( new TypeInfo( TypeInfo.t_type, 0, T ) ); ISymbol look = table.getCompilationUnit().lookupTemplateId( "B", args ); assertTrue( look instanceof IDeferredTemplateInstance ); @@ -2432,7 +2430,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { factory.setContainingSymbol( table.getCompilationUnit() ); factory.pushTemplate( spec1 ); - List args = new LinkedList(); + List args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_type, 0, spec1_T ) ); args.add( new TypeInfo( TypeInfo.t_type, 0, spec1_T ) ); @@ -2482,7 +2480,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { assertEquals( ((IDeferredTemplateInstance)symbol).getTemplate(), template ); factory.pushTemplateId( symbol, args ); - ISymbol look = factory.lookupMethodForDefinition( "f", new LinkedList() ); + ISymbol look = factory.lookupMethodForDefinition( "f", new ArrayList() ); assertEquals( look, f1 ); IParameterizedSymbol f1Def = table.newParameterizedSymbol( "f", TypeInfo.t_function ); f1.setTypeSymbol( f1Def ); @@ -2500,14 +2498,14 @@ public class ParserSymbolTableTemplateTests extends TestCase { factory.setContainingSymbol( table.getCompilationUnit() ); factory.pushTemplate( specDef1 ); - args = new LinkedList(); + args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_type, 0, W ) ); args.add( new TypeInfo( TypeInfo.t_type, 0, W ) ); symbol = factory.lookupTemplateId( "A", args ); factory.pushTemplateId( symbol, args ); - look = factory.lookupMethodForDefinition( "f", new LinkedList() ); + look = factory.lookupMethodForDefinition( "f", new ArrayList() ); assertEquals( look, f2 ); IParameterizedSymbol f2Def = table.newParameterizedSymbol( "f", TypeInfo.t_function ); f2.setTypeSymbol( f2Def ); @@ -2525,14 +2523,14 @@ public class ParserSymbolTableTemplateTests extends TestCase { factory.setContainingSymbol( table.getCompilationUnit() ); factory.pushTemplate( specDef1 ); - args = new LinkedList(); + args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_char, 0, null ) ); args.add( new TypeInfo( TypeInfo.t_type, 0, X ) ); symbol = factory.lookupTemplateId( "A", args ); factory.pushTemplateId( symbol, args ); - look = factory.lookupMethodForDefinition( "f", new LinkedList() ); + look = factory.lookupMethodForDefinition( "f", new ArrayList() ); assertEquals( look, f3 ); IParameterizedSymbol f3Def = table.newParameterizedSymbol( "f", TypeInfo.t_function ); f3.setTypeSymbol( f3Def ); @@ -2542,7 +2540,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { f3Def.addSymbol( c3 ); //A< int, char > a1; - args = new LinkedList(); + args = new ArrayList(); args.add( new TypeInfo( TypeInfo.t_int, 0, null ) ); args.add( new TypeInfo( TypeInfo.t_char, 0, null ) ); @@ -2550,7 +2548,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { assertTrue( look.isTemplateInstance() ); assertEquals( look.getInstantiatedSymbol(), A1 ); - look = ((IContainerSymbol)look).qualifiedFunctionLookup( "f", new LinkedList() ); + look = ((IContainerSymbol)look).qualifiedFunctionLookup( "f", new ArrayList() ); assertTrue( look.isTemplateInstance() ); assertEquals( look.getInstantiatedSymbol(), f1Def ); @@ -2568,7 +2566,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { assertTrue( look.isTemplateInstance() ); assertEquals( look.getInstantiatedSymbol(), A2 ); - look = ((IContainerSymbol)look).qualifiedFunctionLookup( "f", new LinkedList() ); + look = ((IContainerSymbol)look).qualifiedFunctionLookup( "f", new ArrayList() ); assertTrue( look.isTemplateInstance() ); assertEquals( look.getInstantiatedSymbol(), f2Def ); @@ -2586,7 +2584,7 @@ public class ParserSymbolTableTemplateTests extends TestCase { assertTrue( look.isTemplateInstance() ); assertEquals( look.getInstantiatedSymbol(), A3 ); - look = ((IContainerSymbol)look).qualifiedFunctionLookup( "f", new LinkedList() ); + look = ((IContainerSymbol)look).qualifiedFunctionLookup( "f", new ArrayList() ); assertTrue( look.isTemplateInstance() ); assertEquals( look.getInstantiatedSymbol(), f3Def ); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java index 13272239e08..29912369317 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java @@ -13,7 +13,6 @@ package org.eclipse.cdt.core.parser.tests; import java.util.ArrayList; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -44,7 +43,6 @@ import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTableException; import org.eclipse.cdt.internal.core.parser.pst.StandardSymbolExtension; import org.eclipse.cdt.internal.core.parser.pst.TypeFilter; import org.eclipse.cdt.internal.core.parser.pst.TypeInfo; -import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.Mark; import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.OperatorExpression; import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.PtrOp; @@ -1159,7 +1157,7 @@ public class ParserSymbolTableTest extends TestCase { foo.setType( TypeInfo.t_function ); compUnit.addSymbol( foo ); - LinkedList paramList = new LinkedList(); + ArrayList paramList = new ArrayList(); TypeInfo param = new TypeInfo( TypeInfo.t_char, 0, null ); paramList.add( param ); @@ -1304,7 +1302,7 @@ public class ParserSymbolTableTest extends TestCase { main.setReturnType( table.newSymbol( "", TypeInfo.t_int ) ); compUnit.addSymbol( main ); - LinkedList paramList = new LinkedList(); + ArrayList paramList = new ArrayList(); look = main.lookup( "parm" ); assertEquals( look, param ); TypeInfo p = new TypeInfo( TypeInfo.t_type, 0, look ); @@ -1389,7 +1387,7 @@ public class ParserSymbolTableTest extends TestCase { a.setTypeSymbol( look ); compUnit.addSymbol( a ); - LinkedList paramList = new LinkedList(); + ArrayList paramList = new ArrayList(); look = compUnit.lookup( "a" ); assertEquals( look, a ); TypeInfo param = new TypeInfo( look.getType(), 0, look, null, false ); @@ -1464,7 +1462,7 @@ public class ParserSymbolTableTest extends TestCase { assertEquals( look, c ); assertEquals( look.getTypeSymbol(), C ); - LinkedList paramList = new LinkedList(); + ArrayList paramList = new ArrayList(); TypeInfo p1 = new TypeInfo( TypeInfo.t_int, 0, null ); TypeInfo p2 = new TypeInfo( TypeInfo.t_char, 0, null ); @@ -1510,7 +1508,7 @@ public class ParserSymbolTableTest extends TestCase { f2.addParameter( TypeInfo.t_char, 0, null, true ); compUnit.addSymbol( f2 ); - LinkedList paramList = new LinkedList(); + ArrayList paramList = new ArrayList(); TypeInfo p1 = new TypeInfo( TypeInfo.t_int, 0, null ); paramList.add( p1 ); @@ -1589,7 +1587,7 @@ public class ParserSymbolTableTest extends TestCase { c.setTypeSymbol( C ); c.addPtrOperator( new PtrOp( PtrOp.t_pointer, false, false ) ); - LinkedList paramList = new LinkedList(); + ArrayList paramList = new ArrayList(); TypeInfo p1 = new TypeInfo( TypeInfo.t_type, 0, a ); paramList.add( p1 ); ISymbol look = compUnit.unqualifiedFunctionLookup( "f", paramList ); @@ -1663,7 +1661,7 @@ public class ParserSymbolTableTest extends TestCase { array.setTypeSymbol( A ); array.addPtrOperator( new PtrOp( PtrOp.t_array, false, false ) ); - LinkedList paramList = new LinkedList(); + ArrayList paramList = new ArrayList(); TypeInfo p = new TypeInfo( TypeInfo.t_type, 0, a ); paramList.add( p ); @@ -1734,7 +1732,7 @@ public class ParserSymbolTableTest extends TestCase { a.setTypeSymbol( A ); compUnit.addSymbol( a ); - LinkedList paramList = new LinkedList(); + ArrayList paramList = new ArrayList(); TypeInfo p = new TypeInfo( TypeInfo.t_type, 0, a ); paramList.add( p ); @@ -1794,7 +1792,7 @@ public class ParserSymbolTableTest extends TestCase { main.setType( TypeInfo.t_function ); compUnit.addSymbol( main ); - LinkedList params = new LinkedList(); + ArrayList params = new ArrayList(); TypeInfo p1 = new TypeInfo( TypeInfo.t_type, 0, i ); p1.addOperatorExpression( OperatorExpression.addressof ); TypeInfo p2 = new TypeInfo( TypeInfo.t_type, 0, s ); @@ -1889,7 +1887,7 @@ public class ParserSymbolTableTest extends TestCase { b.setType( TypeInfo.t_type ); b.setTypeSymbol( B ); - LinkedList params = new LinkedList(); + ArrayList params = new ArrayList(); TypeInfo p1 = new TypeInfo( TypeInfo.t_type, 0, b ); params.add( p1 ); @@ -1932,56 +1930,56 @@ public class ParserSymbolTableTest extends TestCase { assertEquals( look, f3 ); } - public void testMarkRollback() throws Exception{ - newTable(); - - IDerivableContainerSymbol A = table.newDerivableContainerSymbol("A"); - A.setType( TypeInfo.t_class ); - table.getCompilationUnit().addSymbol( A ); - - Mark mark = table.setMark(); - - ISymbol f = table.newSymbol("f"); - A.addSymbol( f ); - - ISymbol look = A.lookup("f"); - assertEquals( look, f ); - - assertTrue( table.rollBack( mark ) ); - - look = A.lookup("f"); - assertEquals( look, null ); - - IDerivableContainerSymbol B = table.newDerivableContainerSymbol("B"); - B.setType( TypeInfo.t_class ); - - mark = table.setMark(); - table.getCompilationUnit().addSymbol( B ); - Mark mark2 = table.setMark(); - A.addParent( B ); - Mark mark3 = table.setMark(); - - IParameterizedSymbol C = table.newParameterizedSymbol("C"); - C.addParameter( TypeInfo.t_class, 0, null, false ); - - assertEquals( C.getParameterList().size(), 1 ); - table.rollBack( mark3 ); - assertEquals( C.getParameterList().size(), 0 ); - assertEquals( A.getParents().size(), 1 ); - table.rollBack( mark2 ); - assertEquals( A.getParents().size(), 0 ); - - assertFalse( table.commit( mark2 ) ); - assertFalse( table.rollBack( mark2 ) ); - - B.setType( TypeInfo.t_namespace ); - - mark = table.setMark(); - C.addUsingDirective( B ); - assertEquals( C.getUsingDirectives().size(), 1 ); - table.rollBack( mark ); - assertEquals( C.getUsingDirectives().size(), 0 ); - } +// public void testMarkRollback() throws Exception{ +// newTable(); +// +// IDerivableContainerSymbol A = table.newDerivableContainerSymbol("A"); +// A.setType( TypeInfo.t_class ); +// table.getCompilationUnit().addSymbol( A ); +// +// Mark mark = table.setMark(); +// +// ISymbol f = table.newSymbol("f"); +// A.addSymbol( f ); +// +// ISymbol look = A.lookup("f"); +// assertEquals( look, f ); +// +// assertTrue( table.rollBack( mark ) ); +// +// look = A.lookup("f"); +// assertEquals( look, null ); +// +// IDerivableContainerSymbol B = table.newDerivableContainerSymbol("B"); +// B.setType( TypeInfo.t_class ); +// +// mark = table.setMark(); +// table.getCompilationUnit().addSymbol( B ); +// Mark mark2 = table.setMark(); +// A.addParent( B ); +// Mark mark3 = table.setMark(); +// +// IParameterizedSymbol C = table.newParameterizedSymbol("C"); +// C.addParameter( TypeInfo.t_class, 0, null, false ); +// +// assertEquals( C.getParameterList().size(), 1 ); +// table.rollBack( mark3 ); +// assertEquals( C.getParameterList().size(), 0 ); +// assertEquals( A.getParents().size(), 1 ); +// table.rollBack( mark2 ); +// assertEquals( A.getParents().size(), 0 ); +// +// assertFalse( table.commit( mark2 ) ); +// assertFalse( table.rollBack( mark2 ) ); +// +// B.setType( TypeInfo.t_namespace ); +// +// mark = table.setMark(); +// C.addUsingDirective( B ); +// assertEquals( C.getUsingDirectives().size(), 1 ); +// table.rollBack( mark ); +// assertEquals( C.getUsingDirectives().size(), 0 ); +// } /** * class A; @@ -2110,7 +2108,7 @@ public class ParserSymbolTableTest extends TestCase { /*..*/ - LinkedList paramList = new LinkedList(); + ArrayList paramList = new ArrayList(); TypeInfo p1 = new TypeInfo( TypeInfo.t_type, 0, a1 ); paramList.add( p1 ); ISymbol look = classB.memberFunctionLookup( "f", paramList ); @@ -2150,7 +2148,7 @@ public class ParserSymbolTableTest extends TestCase { assertEquals( e.reason, ParserSymbolTableException.r_InvalidOverload ); } - LinkedList paramList = new LinkedList(); + ArrayList paramList = new ArrayList(); paramList.add( new TypeInfo( TypeInfo.t_int, 0, null ) ); ISymbol lookup = classA.lookupConstructor( paramList ); @@ -2221,7 +2219,7 @@ public class ParserSymbolTableTest extends TestCase { table.getCompilationUnit().addSymbol( NSB ); //look for function that has no parameters - LinkedList paramList = new LinkedList(); + ArrayList paramList = new ArrayList(); ISymbol look = NSB.qualifiedFunctionLookup( "f", paramList ); assertEquals( look, f ); @@ -2252,7 +2250,7 @@ public class ParserSymbolTableTest extends TestCase { table.getCompilationUnit().addSymbol( f ); - LinkedList paramList = new LinkedList (); + ArrayList paramList = new ArrayList (); TypeInfo param = new TypeInfo( TypeInfo.t_type, 0, null ); @@ -2386,7 +2384,7 @@ public class ParserSymbolTableTest extends TestCase { f1.addParameter( clsA, 0, new PtrOp( PtrOp.t_reference ), false ); table.getCompilationUnit().addSymbol( f1 ); - LinkedList parameters = new LinkedList(); + ArrayList parameters = new ArrayList(); TypeInfo param = new TypeInfo( TypeInfo.t_type, 0, b ); parameters.add( param ); @@ -2470,7 +2468,7 @@ public class ParserSymbolTableTest extends TestCase { IParameterizedSymbol f = table.newParameterizedSymbol( "f", TypeInfo.t_function ); table.getCompilationUnit().addSymbol( f ); - LinkedList parameters = new LinkedList(); + ArrayList parameters = new ArrayList(); TypeInfo param = new TypeInfo( TypeInfo.t_void, 0, null ); parameters.add( param ); @@ -2573,7 +2571,7 @@ public class ParserSymbolTableTest extends TestCase { IParameterizedSymbol init2 = table.newParameterizedSymbol( "initialize", TypeInfo.t_function ); - ISymbol look = table.getCompilationUnit().unqualifiedFunctionLookup( "initialize", new LinkedList() ); + ISymbol look = table.getCompilationUnit().unqualifiedFunctionLookup( "initialize", new ArrayList() ); assertEquals( look, init1 ); init1.getTypeInfo().setIsForwardDeclaration( true ); @@ -2581,7 +2579,7 @@ public class ParserSymbolTableTest extends TestCase { table.getCompilationUnit().addSymbol( init2 ); - look = table.getCompilationUnit().unqualifiedFunctionLookup( "initialize", new LinkedList() ); + look = table.getCompilationUnit().unqualifiedFunctionLookup( "initialize", new ArrayList() ); assertEquals( look, init2 ); } @@ -2622,7 +2620,7 @@ public class ParserSymbolTableTest extends TestCase { f3.addParameter( TypeInfo.t_char, 0, null, false ); B.addSymbol( f3 ); - List params = new LinkedList(); + List params = new ArrayList(); params.add( new TypeInfo( TypeInfo.t_int, 0, null ) ); ISymbol look = B.qualifiedFunctionLookup( "f", params ); @@ -3000,7 +2998,7 @@ public class ParserSymbolTableTest extends TestCase { table.getCompilationUnit().addSymbol( foo ); - List params = new LinkedList(); + List params = new ArrayList(); TypeInfo p1 = new TypeInfo( TypeInfo.t_int, 0, null ); params.add( p1 ); @@ -3029,7 +3027,7 @@ public class ParserSymbolTableTest extends TestCase { foo2.addParameter( TypeInfo.t_int, 0, null, false ); table.getCompilationUnit().addSymbol( foo2 ); - List params = new LinkedList(); + List params = new ArrayList(); TypeInfo p1 = new TypeInfo( TypeInfo.t_int, 0, null ); params.add( p1 ); @@ -3057,7 +3055,7 @@ public class ParserSymbolTableTest extends TestCase { foo2.setHasVariableArgs( true ); table.getCompilationUnit().addSymbol( foo2 ); - List params = new LinkedList(); + List params = new ArrayList(); ISymbol look = table.getCompilationUnit().unqualifiedFunctionLookup( "foo", params ); @@ -3203,7 +3201,7 @@ public class ParserSymbolTableTest extends TestCase { f2.addParameter( TypeInfo.t_int, TypeInfo.isLong, null, false ); table.getCompilationUnit().addSymbol( f2 ); - List params = new LinkedList(); + List params = new ArrayList(); params.add( new TypeInfo( TypeInfo.t_int, TypeInfo.isLong, null ) ); IParameterizedSymbol lookup = table.getCompilationUnit().unqualifiedFunctionLookup( "f", params ); @@ -3241,7 +3239,7 @@ public class ParserSymbolTableTest extends TestCase { g.addParameter( TypeInfo.t_float, 0, null, false ); table.getCompilationUnit().addSymbol( g ); - List params = new LinkedList(); + List params = new ArrayList(); params.add( new TypeInfo( TypeInfo.t_float, TypeInfo.isComplex, null ) ); IParameterizedSymbol lookup = table.getCompilationUnit().unqualifiedFunctionLookup( "f", params ); @@ -3280,7 +3278,7 @@ public class ParserSymbolTableTest extends TestCase { table.getCompilationUnit().addSymbol( g ); - List params = new LinkedList(); + List params = new ArrayList(); params.add( new TypeInfo( TypeInfo.t__Bool, 0, null ) ); IParameterizedSymbol look = table.getCompilationUnit().unqualifiedFunctionLookup( "f", params ); @@ -3412,7 +3410,7 @@ public class ParserSymbolTableTest extends TestCase { look = B.qualifiedLookup( "i" ); assertNull( look ); - List params = new LinkedList(); + List params = new ArrayList(); look = B.qualifiedFunctionLookup( "f", params ); assertEquals( look, f1 ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTAbstractDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTAbstractDeclaration.java index 055dc6d3eb9..b9c16ab2bf7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTAbstractDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/ASTAbstractDeclaration.java @@ -70,6 +70,13 @@ public class ASTAbstractDeclaration implements IASTAbstractDeclaration if( pointerOperators == null ) return EmptyIterator.EMPTY_ITERATOR; return pointerOperators.iterator(); } + + public int getNumPointerOperators(){ + if( pointerOperators == null ) + return 0; + return pointerOperators.size(); + } + /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration#getArrayModifiers() */ @@ -78,6 +85,12 @@ public class ASTAbstractDeclaration implements IASTAbstractDeclaration if( arrayModifiers == null ) return EmptyIterator.EMPTY_ITERATOR; return arrayModifiers.iterator(); } + + public int getNumArrayModifiers(){ + if( arrayModifiers == null ) + return 0; + return arrayModifiers.size(); + } /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration#getParameters() */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java index a0d9930214b..2f696c5e437 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java @@ -73,6 +73,7 @@ import org.eclipse.cdt.core.parser.ast.IASTExpression.Kind; import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier.Type; import org.eclipse.cdt.core.parser.ast.IASTTemplateParameter.ParamKind; import org.eclipse.cdt.core.parser.extension.IASTFactoryExtension; +import org.eclipse.cdt.internal.core.parser.ast.ASTAbstractDeclaration; import org.eclipse.cdt.internal.core.parser.ast.BaseASTFactory; import org.eclipse.cdt.internal.core.parser.problem.IProblemFactory; import org.eclipse.cdt.internal.core.parser.pst.ExtensibleSymbolExtension; @@ -2062,6 +2063,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto symbol.setHasVariableArgs( hasVariableArguments ); + symbol.prepareForParameters( parameters.size() ); setParameter( symbol, returnType, false, references ); setParameters( symbol, references, parameters.iterator() ); @@ -2380,6 +2382,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto setMethodTypeInfoBits( symbol, isConst, isVolatile, isVirtual, isExplicit ); symbol.setHasVariableArgs( hasVariableArguments ); + symbol.prepareForParameters( parameters.size() ); if( returnType.getTypeSpecifier() != null ) setParameter( symbol, returnType, false, references ); setParameters( symbol, references, parameters.iterator() ); @@ -2595,6 +2598,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto isRegister, isStatic, newSymbol); + + int numPtrOps = ((ASTAbstractDeclaration)abstractDeclaration).getNumArrayModifiers() + + ((ASTAbstractDeclaration)abstractDeclaration).getNumPointerOperators(); + newSymbol.preparePtrOperatros( numPtrOps ); setPointerOperators( newSymbol, abstractDeclaration.getPointerOperators(), abstractDeclaration.getArrayModifiers() ); newSymbol.setIsForwardDeclaration( isStatic || isExtern ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/BasicSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/BasicSymbol.java index 8d526757dde..52827a08543 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/BasicSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/BasicSymbol.java @@ -13,7 +13,6 @@ */ package org.eclipse.cdt.internal.core.parser.pst; -import java.util.Iterator; import java.util.List; import java.util.Map; @@ -119,15 +118,10 @@ public class BasicSymbol extends ExtensibleSymbol implements ISymbol } else if( size == 0 ) return 0; else { - - Iterator iter1 = symbol.getTypeInfo().getPtrOperators().iterator(); - Iterator iter2 = getTypeInfo().getPtrOperators().iterator(); - TypeInfo.PtrOp op1 = null, op2 = null; - - for( int i = size; i > 0; i-- ){ - op1 = (TypeInfo.PtrOp)iter1.next(); - op2 = (TypeInfo.PtrOp)iter2.next(); + for( int i = 0; i > size; i++ ){ + op1 = (TypeInfo.PtrOp)symbol.getTypeInfo().getPtrOperators().get(i); + op2 = (TypeInfo.PtrOp)getTypeInfo().getPtrOperators().get(i); if( op1.compareCVTo( op2 ) != 0 ){ return -1; @@ -144,6 +138,10 @@ public class BasicSymbol extends ExtensibleSymbol implements ISymbol public void addPtrOperator( TypeInfo.PtrOp ptrOp ){ getTypeInfo().addPtrOperator( ptrOp ); } + public void preparePtrOperatros(int numPtrOps) { + getTypeInfo().preparePtrOperators( numPtrOps ); + } + public int getDepth(){ return _depth; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java index 232aae6e89b..c3de201a360 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java @@ -15,11 +15,12 @@ package org.eclipse.cdt.internal.core.parser.pst; import java.text.Collator; +import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -32,7 +33,6 @@ import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; import org.eclipse.cdt.core.parser.ast.IASTMember; import org.eclipse.cdt.core.parser.ast.IASTNode; -import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.Command; import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.LookupData; /** @@ -58,14 +58,14 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { public Object clone(){ ContainerSymbol copy = (ContainerSymbol)super.clone(); - copy._usingDirectives = (_usingDirectives != ParserSymbolTable.EMPTY_LIST) ? (LinkedList) _usingDirectives.clone() : _usingDirectives; + copy._usingDirectives = (_usingDirectives != Collections.EMPTY_LIST) ? (List) ((ArrayList)_usingDirectives).clone() : _usingDirectives; if( getSymbolTable().getParserMode() == ParserMode.COMPLETION_PARSE ) - copy._containedSymbols = ( _containedSymbols != ParserSymbolTable.EMPTY_MAP )? (Map)((TreeMap) _containedSymbols).clone() : _containedSymbols; + copy._containedSymbols = ( _containedSymbols != Collections.EMPTY_MAP )? (Map)((TreeMap) _containedSymbols).clone() : _containedSymbols; else - copy._containedSymbols = ( _containedSymbols != ParserSymbolTable.EMPTY_MAP )? (Map)((HashMap) _containedSymbols).clone() : _containedSymbols; + copy._containedSymbols = ( _containedSymbols != Collections.EMPTY_MAP )? (Map)((HashMap) _containedSymbols).clone() : _containedSymbols; - copy._contents = (_contents != ParserSymbolTable.EMPTY_LIST) ? (LinkedList) _contents.clone() : _contents; + copy._contents = (_contents != Collections.EMPTY_LIST) ? (List) ((ArrayList)_contents).clone() : _contents; return copy; } @@ -98,11 +98,12 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { } if( !template.getExplicitSpecializations().isEmpty() ){ - List argList = new LinkedList(); + List params = template.getParameterList(); + int size = template.getParameterList().size(); + List argList = new ArrayList( size ); boolean hasAllParams = true; - Iterator templateParams = template.getParameterList().iterator(); - while( templateParams.hasNext() ){ - Object obj = argMap.get( templateParams.next() ); + for( int i = 0; i < size; i++ ){ + Object obj = argMap.get( params.get( i ) ); if( obj == null ){ hasAllParams = false; break; @@ -141,7 +142,7 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { if( obj instanceof List ){ ((List) obj).add( newSymbol ); } else { - List list = new LinkedList(); + List list = new ArrayList(4); list.add( obj ); list.add( newSymbol ); newContainer.putInContainedSymbols( newSymbol.getName(), list ); @@ -211,12 +212,12 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { if( origObj != null ) { ISymbol origDecl = null; - LinkedList origList = null; + ArrayList origList = null; if( origObj instanceof ISymbol ){ origDecl = (ISymbol)origObj; - } else if( origObj.getClass() == LinkedList.class ){ - origList = (LinkedList)origObj; + } else if( origObj.getClass() == ArrayList.class ){ + origList = (ArrayList)origObj; } else { throw new ParserSymbolTableError( ParserSymbolTableError.r_InternalError ); } @@ -228,7 +229,7 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { if( unnamed || validOverride ) { if( origList == null ){ - origList = new LinkedList(); + origList = new ArrayList(4); origList.add( origDecl ); origList.add( obj ); @@ -248,8 +249,8 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { addToContents( obj ); - Command command = new AddSymbolCommand( obj, containing ); - getSymbolTable().pushCommand( command ); +// Command command = new AddSymbolCommand( obj, containing ); +// getSymbolTable().pushCommand( command ); } public boolean removeSymbol( ISymbol symbol ){ @@ -303,8 +304,8 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { } protected void addToUsingDirectives( IExtensibleSymbol symbol ){ - if( _usingDirectives == ParserSymbolTable.EMPTY_LIST ) - _usingDirectives = new LinkedList(); + if( _usingDirectives == Collections.EMPTY_LIST ) + _usingDirectives = new ArrayList(4); _usingDirectives.add( symbol ); } /* (non-Javadoc) @@ -330,8 +331,8 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { addToUsingDirectives( usingDirective ); addToContents( usingDirective ); - Command command = new AddUsingDirectiveCommand( this, usingDirective ); - getSymbolTable().pushCommand( command ); +// Command command = new AddUsingDirectiveCommand( this, usingDirective ); +// getSymbolTable().pushCommand( command ); return usingDirective; } @@ -376,7 +377,8 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { //then they will be in data.foundItems (since we provided no parameter info); ISymbol symbol = null; ISymbol clone = null; - Iterator iter = null; + int objListSize = 0; + List objList = null; try{ symbol = ParserSymbolTable.resolveAmbiguities( data ); @@ -392,16 +394,17 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { if( symbol == null ){ Object object = data.foundItems.get( data.name ); - iter = ( object instanceof List ) ? ((List) object).iterator() : null; - symbol = ( iter != null && iter.hasNext() ) ? (ISymbol)iter.next() : null; + objList = ( object instanceof List ) ? (List) object : null; + objListSize = ( objList != null ) ? objList.size() : 0; + symbol = ( objListSize > 0 ) ? (ISymbol)objList.get(0) : null; } - List usingDecs = new LinkedList(); - List usingRefs = new LinkedList(); + List usingDecs = new ArrayList( ( objListSize > 0 ) ? objListSize : 1 ); + List usingRefs = new ArrayList( ( objListSize > 0 ) ? objListSize : 1 ); UsingDeclarationSymbol usingDeclaration = new UsingDeclarationSymbol( getSymbolTable(), usingRefs, usingDecs ); boolean addedUsingToContained = false; - + int idx = 1; while( symbol != null ){ if( ParserSymbolTable.okToAddUsingDeclaration( symbol, this ) ){ if( ! addedUsingToContained ){ @@ -417,8 +420,8 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { usingDecs.add( clone ); usingRefs.add( symbol ); - if( iter != null && iter.hasNext() ){ - symbol = (ISymbol) iter.next(); + if( objList != null && idx < objListSize ){ + symbol = (ISymbol) objList.get( idx++ ); } else { symbol = null; } @@ -435,7 +438,7 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { } protected void putInContainedSymbols( String key, Object obj ){ - if( _containedSymbols == ParserSymbolTable.EMPTY_MAP ){ + if( _containedSymbols == Collections.EMPTY_MAP ){ if( getSymbolTable().getParserMode() == ParserMode.COMPLETION_PARSE ){ _containedSymbols = new TreeMap( new SymbolTableComparator() ); } else { @@ -542,7 +545,7 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { public IParameterizedSymbol lookupMethodForDefinition( String name, List parameters ) throws ParserSymbolTableException{ LookupData data = new LookupData( name, TypeInfo.t_any ); data.qualified = true; - data.parameters = ( parameters == null ) ? ParserSymbolTable.EMPTY_LIST : parameters; + data.parameters = ( parameters == null ) ? Collections.EMPTY_LIST : parameters; data.exactFunctionsOnly = true; IContainerSymbol container = this; @@ -684,7 +687,7 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { 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 ) ? ParserSymbolTable.EMPTY_LIST : parameters; + data.parameters = ( parameters == null ) ? Collections.EMPTY_LIST : parameters; data.associated = associated; ParserSymbolTable.lookup( data, this ); @@ -741,7 +744,7 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { 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 ) ? ParserSymbolTable.EMPTY_LIST : parameters; + data.parameters = ( parameters == null ) ? Collections.EMPTY_LIST : parameters; ParserSymbolTable.lookup( data, this ); return (IParameterizedSymbol) ParserSymbolTable.resolveAmbiguities( data ); @@ -755,7 +758,7 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { 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 ) ? ParserSymbolTable.EMPTY_LIST : parameters; + data.parameters = ( parameters == null ) ? Collections.EMPTY_LIST : parameters; ParserSymbolTable.lookup( data, this ); @@ -818,8 +821,13 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { List constructors = null; if( filter != null && filter.willAccept( TypeInfo.t_constructor ) && (this instanceof IDerivableContainerSymbol) ){ - if( getName().startsWith( prefix ) ) - constructors = new LinkedList( ((IDerivableContainerSymbol)this).getConstructors() ); + if( getName().startsWith( prefix ) ){ + List temp = ((IDerivableContainerSymbol)this).getConstructors(); + int size = temp.size(); + constructors = new ArrayList( size ); + for( int i = 0; i < size; i++ ) + constructors.add( temp.get( i ) ); + } } if( data.foundItems == null || data.foundItems.isEmpty() ){ @@ -840,7 +848,7 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { } } - List list = new LinkedList(); + List list = new ArrayList(); Iterator iter = data.foundItems.keySet().iterator(); Object obj = null; @@ -857,7 +865,7 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { if( paramList != null && ((ISymbol)obj).isType( TypeInfo.t_function ) ) { if( tempList == null ) - tempList = new LinkedList(); + tempList = new ArrayList(1); else tempList.clear(); tempList.add( obj ); @@ -960,8 +968,16 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { } protected void addToContents( IExtensibleSymbol symbol ){ - if( _contents == ParserSymbolTable.EMPTY_LIST ) - _contents = new LinkedList(); + if( _contents == Collections.EMPTY_LIST ){ + if( isType( TypeInfo.t_namespace ) ) + _contents = new ArrayList( 64 ); + else if( isType( TypeInfo.t_class ) || isType( TypeInfo.t_struct ) ) + _contents = new ArrayList( 32 ); + else if( isType( TypeInfo.t_function ) ) + _contents = new ArrayList( 16 ); + else + _contents = new ArrayList( 8 ); + } _contents.add( symbol ); } @@ -1049,72 +1065,72 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { } } - static private class AddSymbolCommand extends Command{ - AddSymbolCommand( ISymbol newDecl, IContainerSymbol context ){ - _symbol = newDecl; - _context = context; - } - - public void undoIt(){ - Object obj = _context.getContainedSymbols().get( _symbol.getName() ); - - if( obj instanceof LinkedList ){ - LinkedList list = (LinkedList)obj; - ListIterator iter = list.listIterator(); - int size = list.size(); - ISymbol item = null; - for( int i = 0; i < size; i++ ){ - item = (ISymbol)iter.next(); - if( item == _symbol ){ - iter.remove(); - break; - } - } - if( list.size() == 1 ){ - _context.getContainedSymbols().put( _symbol.getName(), list.getFirst() ); - } - } else if( obj instanceof BasicSymbol ){ - _context.getContainedSymbols().remove( _symbol.getName() ); - } - - //this is an inefficient way of doing this, we can modify the interfaces if the undo starts - //being used often. - ContentsIterator iter = (ContentsIterator) _context.getContentsIterator(); - while( iter.hasNext() ){ - IExtensibleSymbol ext = (IExtensibleSymbol) iter.next(); - if( ext == _symbol ){ - iter.removeSymbol(); - break; - } - } - } - - private final ISymbol _symbol; - private final IContainerSymbol _context; - } +// static private class AddSymbolCommand extends Command{ +// AddSymbolCommand( ISymbol newDecl, IContainerSymbol context ){ +// _symbol = newDecl; +// _context = context; +// } +// +// public void undoIt(){ +// Object obj = _context.getContainedSymbols().get( _symbol.getName() ); +// +// if( obj instanceof ArrayList ){ +// ArrayList list = (ArrayList)obj; +// ListIterator iter = list.listIterator(); +// int size = list.size(); +// ISymbol item = null; +// for( int i = 0; i < size; i++ ){ +// item = (ISymbol)iter.next(); +// if( item == _symbol ){ +// iter.remove(); +// break; +// } +// } +// if( list.size() == 1 ){ +// _context.getContainedSymbols().put( _symbol.getName(), list.get(0) ); +// } +// } else if( obj instanceof BasicSymbol ){ +// _context.getContainedSymbols().remove( _symbol.getName() ); +// } +// +// //this is an inefficient way of doing this, we can modify the interfaces if the undo starts +// //being used often. +// ContentsIterator iter = (ContentsIterator) _context.getContentsIterator(); +// while( iter.hasNext() ){ +// IExtensibleSymbol ext = (IExtensibleSymbol) iter.next(); +// if( ext == _symbol ){ +// iter.removeSymbol(); +// break; +// } +// } +// } +// +// private final ISymbol _symbol; +// private final IContainerSymbol _context; +// } - static private class AddUsingDirectiveCommand extends Command{ - public AddUsingDirectiveCommand( IContainerSymbol container, IUsingDirectiveSymbol directive ){ - _decl = container; - _directive = directive; - } - public void undoIt(){ - _decl.getUsingDirectives().remove( _directive ); - - //this is an inefficient way of doing this, we can modify the interfaces if the undo starts - //being used often. - ContentsIterator iter = (ContentsIterator) _decl.getContentsIterator(); - while( iter.hasNext() ){ - IExtensibleSymbol ext = (IExtensibleSymbol) iter.next(); - if( ext == _directive ){ - iter.removeSymbol(); - break; - } - } - } - private final IContainerSymbol _decl; - private final IUsingDirectiveSymbol _directive; - } +// static private class AddUsingDirectiveCommand extends Command{ +// public AddUsingDirectiveCommand( IContainerSymbol container, IUsingDirectiveSymbol directive ){ +// _decl = container; +// _directive = directive; +// } +// public void undoIt(){ +// _decl.getUsingDirectives().remove( _directive ); +// +// //this is an inefficient way of doing this, we can modify the interfaces if the undo starts +// //being used often. +// ContentsIterator iter = (ContentsIterator) _decl.getContentsIterator(); +// while( iter.hasNext() ){ +// IExtensibleSymbol ext = (IExtensibleSymbol) iter.next(); +// if( ext == _directive ){ +// iter.removeSymbol(); +// break; +// } +// } +// } +// private final IContainerSymbol _decl; +// private final IUsingDirectiveSymbol _directive; +// } static protected class SymbolTableComparator implements Comparator{ static final private Collator collator = Collator.getInstance(); @@ -1134,9 +1150,9 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { } } - private LinkedList _contents = ParserSymbolTable.EMPTY_LIST; //ordered list of all contents of this symbol - private LinkedList _usingDirectives = ParserSymbolTable.EMPTY_LIST; //collection of nominated namespaces - private Map _containedSymbols = ParserSymbolTable.EMPTY_MAP; //declarations contained by us. + private List _contents = Collections.EMPTY_LIST; //ordered list of all contents of this symbol + private List _usingDirectives = Collections.EMPTY_LIST; //collection of nominated namespaces + private Map _containedSymbols = Collections.EMPTY_MAP; //declarations contained by us. /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol#addTemplateId(org.eclipse.cdt.internal.core.parser.pst.ISymbol, java.util.List) */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DeferredTemplateInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DeferredTemplateInstance.java index b3f2cd3d233..38ba8371f1b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DeferredTemplateInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DeferredTemplateInstance.java @@ -10,8 +10,8 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser.pst; +import java.util.ArrayList; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -26,7 +26,7 @@ public class DeferredTemplateInstance extends BasicSymbol implements IDeferredTe public DeferredTemplateInstance( ParserSymbolTable table, ITemplateSymbol template, List args ){ super(table, ParserSymbolTable.EMPTY_NAME ); _template = template; - _arguments = new LinkedList( args ); + _arguments = new ArrayList( args ); setContainingSymbol( template ); if( template.getTemplatedSymbol() != null ) @@ -50,7 +50,7 @@ public class DeferredTemplateInstance extends BasicSymbol implements IDeferredTe public ISymbol instantiate( ITemplateSymbol template, Map argMap ) throws ParserSymbolTableException{ List args = getArguments(); - List newArgs = new LinkedList(); + List newArgs = new ArrayList( args.size() ); Iterator iter = args.iterator(); while( iter.hasNext() ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DerivableContainerSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DerivableContainerSymbol.java index ca444905297..c5096a40125 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DerivableContainerSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/DerivableContainerSymbol.java @@ -14,14 +14,14 @@ package org.eclipse.cdt.internal.core.parser.pst; +import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; -import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.Command; import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.LookupData; /** @@ -48,9 +48,9 @@ public class DerivableContainerSymbol extends ContainerSymbol implements IDeriva public Object clone(){ DerivableContainerSymbol copy = (DerivableContainerSymbol)super.clone(); - copy._parentScopes = ( _parentScopes != ParserSymbolTable.EMPTY_LIST ) ? (LinkedList) _parentScopes.clone() : _parentScopes; - copy._constructors = ( _constructors != ParserSymbolTable.EMPTY_LIST ) ? (LinkedList) _constructors.clone() : _constructors; - copy._friends = ( _friends != ParserSymbolTable.EMPTY_LIST ) ? (LinkedList) _friends.clone() : _friends; + copy._parentScopes = ( _parentScopes != Collections.EMPTY_LIST ) ? (List)((ArrayList)_parentScopes).clone() : _parentScopes; + copy._constructors = ( _constructors != Collections.EMPTY_LIST ) ? (List)((ArrayList) _constructors).clone() : _constructors; + copy._friends = ( _friends != Collections.EMPTY_LIST ) ? (List)((ArrayList) _friends).clone() : _friends; return copy; } @@ -122,15 +122,15 @@ public class DerivableContainerSymbol extends ContainerSymbol implements IDeriva * @see org.eclipse.cdt.internal.core.parser.pst.IDerivableContainerSymbol#addParent(org.eclipse.cdt.internal.core.parser.pst.ISymbol, boolean, org.eclipse.cdt.core.parser.ast.ASTAccessVisibility, int, java.util.List) */ public void addParent( ISymbol parent, boolean virtual, ASTAccessVisibility visibility, int offset, List references ){ - if( _parentScopes == ParserSymbolTable.EMPTY_LIST ){ - _parentScopes = new LinkedList(); + if( _parentScopes == Collections.EMPTY_LIST ){ + _parentScopes = new ArrayList(4); } ParentWrapper wrapper = new ParentWrapper( parent, virtual, visibility, offset, references ); _parentScopes.add( wrapper ); - Command command = new AddParentCommand( this, wrapper ); - getSymbolTable().pushCommand( command ); +// Command command = new AddParentCommand( this, wrapper ); +// getSymbolTable().pushCommand( command ); } /* (non-Javadoc) @@ -169,15 +169,15 @@ public class DerivableContainerSymbol extends ContainerSymbol implements IDeriva addToContents( constructor ); - Command command = new AddConstructorCommand( constructor, this ); - getSymbolTable().pushCommand( command ); +// Command command = new AddConstructorCommand( constructor, this ); +// getSymbolTable().pushCommand( command ); } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.pst.IDerivableContainerSymbol#addCopyConstructor() */ public void addCopyConstructor() throws ParserSymbolTableException{ - List parameters = new LinkedList(); + List parameters = new ArrayList(1); ISymbol paramType = this; if( getContainingSymbol() instanceof ITemplateSymbol ){ @@ -212,7 +212,7 @@ public class DerivableContainerSymbol extends ContainerSymbol implements IDeriva List constructors = null; if( !getConstructors().isEmpty() ){ - constructors = new LinkedList( getConstructors() ); + constructors = new ArrayList( getConstructors() ); } if( constructors != null ) return ParserSymbolTable.resolveFunction( data, constructors ); @@ -227,8 +227,8 @@ public class DerivableContainerSymbol extends ContainerSymbol implements IDeriva } private void addToConstructors( IParameterizedSymbol constructor ){ - if( _constructors == ParserSymbolTable.EMPTY_LIST ) - _constructors = new LinkedList(); + if( _constructors == Collections.EMPTY_LIST ) + _constructors = new ArrayList(4); _constructors.add( constructor ); } /** @@ -378,59 +378,59 @@ public class DerivableContainerSymbol extends ContainerSymbol implements IDeriva return _friends; } private void addToFriends( ISymbol friend ){ - if( _friends == ParserSymbolTable.EMPTY_LIST ){ - _friends = new LinkedList(); + if( _friends == Collections.EMPTY_LIST ){ + _friends = new ArrayList(4); } _friends.add( friend ); } - static private class AddParentCommand extends Command{ - public AddParentCommand( IDerivableContainerSymbol container, ParentWrapper wrapper ){ - _decl = container; - _wrapper = wrapper; - } - - public void undoIt(){ - List parents = _decl.getParents(); - parents.remove( _wrapper ); - } - - private IDerivableContainerSymbol _decl; - private ParentWrapper _wrapper; - } - - static private class AddConstructorCommand extends Command{ - AddConstructorCommand( IParameterizedSymbol newConstr, IDerivableContainerSymbol context ){ - _constructor = newConstr; - _context = context; - } - public void undoIt(){ - List constructors = _context.getConstructors(); - Iterator iter = constructors.listIterator(); - - int size = constructors.size(); - IParameterizedSymbol item = null; - for( int i = 0; i < size; i++ ){ - item = (IParameterizedSymbol)iter.next(); - if( item == _constructor ){ - iter.remove(); - break; - } - } - - ContentsIterator contents = (ContentsIterator) _context.getContentsIterator(); - while( iter.hasNext() ){ - IExtensibleSymbol ext = (IExtensibleSymbol) iter.next(); - if( ext == _constructor ){ - contents.removeSymbol(); - break; - } - } - } - - private final IParameterizedSymbol _constructor; - private final IDerivableContainerSymbol _context; - } +// static private class AddParentCommand extends Command{ +// public AddParentCommand( IDerivableContainerSymbol container, ParentWrapper wrapper ){ +// _decl = container; +// _wrapper = wrapper; +// } +// +// public void undoIt(){ +// List parents = _decl.getParents(); +// parents.remove( _wrapper ); +// } +// +// private IDerivableContainerSymbol _decl; +// private ParentWrapper _wrapper; +// } +// +// static private class AddConstructorCommand extends Command{ +// AddConstructorCommand( IParameterizedSymbol newConstr, IDerivableContainerSymbol context ){ +// _constructor = newConstr; +// _context = context; +// } +// public void undoIt(){ +// List constructors = _context.getConstructors(); +// Iterator iter = constructors.listIterator(); +// +// int size = constructors.size(); +// IParameterizedSymbol item = null; +// for( int i = 0; i < size; i++ ){ +// item = (IParameterizedSymbol)iter.next(); +// if( item == _constructor ){ +// iter.remove(); +// break; +// } +// } +// +// ContentsIterator contents = (ContentsIterator) _context.getContentsIterator(); +// while( iter.hasNext() ){ +// IExtensibleSymbol ext = (IExtensibleSymbol) iter.next(); +// if( ext == _constructor ){ +// contents.removeSymbol(); +// break; +// } +// } +// } +// +// private final IParameterizedSymbol _constructor; +// private final IDerivableContainerSymbol _context; +// } public class ParentWrapper implements IDerivableContainerSymbol.IParentSymbol { @@ -470,7 +470,7 @@ public class DerivableContainerSymbol extends ContainerSymbol implements IDeriva private final List references; } - private LinkedList _constructors = ParserSymbolTable.EMPTY_LIST; //constructor list - private LinkedList _parentScopes = ParserSymbolTable.EMPTY_LIST; //inherited scopes (is base classes) - private LinkedList _friends = ParserSymbolTable.EMPTY_LIST; + private List _constructors = Collections.EMPTY_LIST; //constructor list + private List _parentScopes = Collections.EMPTY_LIST; //inherited scopes (is base classes) + private List _friends = Collections.EMPTY_LIST; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java index 8560a621c41..78c4c29aee3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IParameterizedSymbol.java @@ -43,4 +43,6 @@ public interface IParameterizedSymbol extends IContainerSymbol { public void setHasVariableArgs( boolean var ); public boolean hasVariableArgs( ); + + public void prepareForParameters(int i); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ISpecializedSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ISpecializedSymbol.java index 0f50b3bd5a0..702195bb7d8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ISpecializedSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ISpecializedSymbol.java @@ -33,4 +33,9 @@ public interface ISpecializedSymbol extends ITemplateSymbol { public ITemplateSymbol getPrimaryTemplate(); public void setPrimaryTemplate( ITemplateSymbol templateSymbol ); + /** + * @param size + */ + public void prepareArguments(int size); + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ISymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ISymbol.java index b53d47800be..d2b59e0e3e6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ISymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ISymbol.java @@ -64,4 +64,6 @@ public interface ISymbol extends Cloneable, IExtensibleSymbol { public int getDepth(); public boolean getIsInvisible(); public void setIsInvisible( boolean invisible ); + + public void preparePtrOperatros(int numPtrOps); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java index 3b5189addcd..9834fac91a7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java @@ -13,16 +13,16 @@ */ package org.eclipse.cdt.internal.core.parser.pst; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.TreeMap; import org.eclipse.cdt.core.parser.ParserMode; -import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.Command; import org.eclipse.cdt.internal.core.parser.pst.TypeInfo.PtrOp; /** @@ -48,12 +48,12 @@ public class ParameterizedSymbol extends ContainerSymbol implements IParameteriz public Object clone(){ ParameterizedSymbol copy = (ParameterizedSymbol)super.clone(); - copy._parameterList = ( _parameterList != ParserSymbolTable.EMPTY_LIST ) ? (LinkedList) _parameterList.clone() : _parameterList; + copy._parameterList = ( _parameterList != Collections.EMPTY_LIST ) ? (List) ((ArrayList)_parameterList).clone() : _parameterList; if( getSymbolTable().getParserMode() == ParserMode.COMPLETION_PARSE ) - copy._parameterMap = ( _parameterMap != ParserSymbolTable.EMPTY_MAP ) ? (Map) ((TreeMap) _parameterMap).clone() : _parameterMap; + copy._parameterMap = ( _parameterMap != Collections.EMPTY_MAP ) ? (Map) ((TreeMap) _parameterMap).clone() : _parameterMap; else - copy._parameterMap = ( _parameterMap != ParserSymbolTable.EMPTY_MAP ) ? (Map) ((HashMap) _parameterMap).clone() : _parameterMap; + copy._parameterMap = ( _parameterMap != Collections.EMPTY_MAP ) ? (Map) ((HashMap) _parameterMap).clone() : _parameterMap; return copy; } @@ -104,19 +104,28 @@ public class ParameterizedSymbol extends ContainerSymbol implements IParameteriz setReturnType( returnType.instantiate( template, argMap ) ); } + + public void prepareForParameters( int numParams ){ + if( _parameterList == Collections.EMPTY_LIST ){ + _parameterList = new ArrayList( numParams ); + } else { + ((ArrayList)_parameterList).ensureCapacity( numParams ); + } + } + /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.pst.IParameterizedSymbol#addParameter(org.eclipse.cdt.internal.core.parser.pst.ISymbol) */ public void addParameter( ISymbol param ){ - if( _parameterList == ParserSymbolTable.EMPTY_LIST ) - _parameterList = new LinkedList(); + if( _parameterList == Collections.EMPTY_LIST) + _parameterList = new ArrayList(8); _parameterList.add( param ); String name = param.getName(); if( name != null && !name.equals(ParserSymbolTable.EMPTY_NAME) ) { - if( _parameterMap == ParserSymbolTable.EMPTY_MAP ){ + if( _parameterMap == Collections.EMPTY_MAP ){ if( getSymbolTable().getParserMode() == ParserMode.COMPLETION_PARSE ) _parameterMap = new TreeMap( new SymbolTableComparator() ); else @@ -130,8 +139,8 @@ public class ParameterizedSymbol extends ContainerSymbol implements IParameteriz param.setContainingSymbol( this ); param.setIsTemplateMember( isTemplateMember() || getType() == TypeInfo.t_template ); - Command command = new AddParameterCommand( this, param ); - getSymbolTable().pushCommand( command ); +// Command command = new AddParameterCommand( this, param ); +// getSymbolTable().pushCommand( command ); } /* (non-Javadoc) @@ -287,29 +296,29 @@ public class ParameterizedSymbol extends ContainerSymbol implements IParameteriz return _hasVarArgs; } - static private class AddParameterCommand extends Command{ - public AddParameterCommand( IParameterizedSymbol container, ISymbol parameter ){ - _decl = container; - _param = parameter; - } - - public void undoIt(){ - _decl.getParameterList().remove( _param ); - - String name = _param.getName(); - if( name != null && !name.equals( ParserSymbolTable.EMPTY_NAME) ) - { - _decl.getParameterMap().remove( name ); - } - } - - private IParameterizedSymbol _decl; - private ISymbol _param; - } +// static private class AddParameterCommand extends Command{ +// public AddParameterCommand( IParameterizedSymbol container, ISymbol parameter ){ +// _decl = container; +// _param = parameter; +// } +// +// public void undoIt(){ +// _decl.getParameterList().remove( _param ); +// +// String name = _param.getName(); +// if( name != null && !name.equals( ParserSymbolTable.EMPTY_NAME) ) +// { +// _decl.getParameterMap().remove( name ); +// } +// } +// +// private IParameterizedSymbol _decl; +// private ISymbol _param; +// } - private LinkedList _parameterList = ParserSymbolTable.EMPTY_LIST; //have my cake - private Map _parameterMap = ParserSymbolTable.EMPTY_MAP; //and eat it too + private List _parameterList = Collections.EMPTY_LIST; //have my cake + private Map _parameterMap = Collections.EMPTY_MAP; //and eat it too private ISymbol _returnType; private boolean _hasVarArgs = false; //whether or not this function has variable arguments } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java index 545e5fe4a4c..2e4416a7a25 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java @@ -13,11 +13,12 @@ package org.eclipse.cdt.internal.core.parser.pst; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -41,8 +42,6 @@ public class ParserSymbolTable { public static final int TYPE_LOOP_THRESHOLD = 50; public static final String EMPTY_NAME = ""; //$NON-NLS-1$ - public static final LinkedList EMPTY_LIST = new LinkedList(); - public static final Map EMPTY_MAP = new HashMap(); public static final String THIS = "this"; //$NON-NLS-1$ /** @@ -124,7 +123,7 @@ public class ParserSymbolTable { } } - LinkedList transitives = null; //list of transitive using directives + ArrayList transitives = null; //list of transitive using directives //if this name define in this scope? Map map = null; @@ -224,30 +223,28 @@ public class ParserSymbolTable { * directives, the effect is as if the using-directives from the second * namespace also appeared in the first. */ - static private LinkedList lookupInNominated( LookupData data, IContainerSymbol symbol, LinkedList transitiveDirectives ) throws ParserSymbolTableException{ + static private ArrayList lookupInNominated( LookupData data, IContainerSymbol symbol, ArrayList transitiveDirectives ) throws ParserSymbolTableException{ //if the data.usingDirectives is empty, there is nothing to do. if( data.usingDirectives == null ){ return transitiveDirectives; } //local variables - LinkedList directives = null; //using directives association with declaration - Iterator iter = null; + ArrayList directives = null; //using directives association with declaration IContainerSymbol temp = null; boolean foundSomething = false; int size = 0; - directives = (LinkedList) data.usingDirectives.remove( symbol ); + directives = (ArrayList) data.usingDirectives.remove( symbol ); if( directives == null ){ return transitiveDirectives; } - iter = directives.iterator(); size = directives.size(); - for( int i = size; i > 0; i-- ){ - temp = (IContainerSymbol) iter.next(); + for( int i = 0; i < size; i++ ){ + temp = (IContainerSymbol) directives.get(i); //namespaces are searched at most once if( !data.visited.contains( temp ) ){ @@ -267,7 +264,7 @@ public class ParserSymbolTable { if( (!data.qualified || !foundSomething || data.mode == LookupMode.PREFIX ) && temp.hasUsingDirectives() ){ //name wasn't found, add transitive using directives for later consideration if( transitiveDirectives == null ) - transitiveDirectives = new LinkedList(); + transitiveDirectives = new ArrayList(4); transitiveDirectives.addAll( temp.getUsingDirectives() ); } } @@ -290,7 +287,7 @@ public class ParserSymbolTable { while( keyIterator.hasNext() ){ key = keyIterator.next(); if( resultMap.containsKey( key ) ){ - List list = new LinkedList(); + List list = new ArrayList(); Object obj = resultMap.get( key ); if ( obj instanceof List ) list.addAll( (List) obj ); @@ -328,7 +325,7 @@ public class ParserSymbolTable { Map declarations = lookIn.getContainedSymbols(); Iterator iterator = null; - if( data.mode == LookupMode.PREFIX && declarations != ParserSymbolTable.EMPTY_MAP ){ + if( data.mode == LookupMode.PREFIX && declarations != Collections.EMPTY_MAP ){ if( declarations instanceof SortedMap ){ iterator = ((SortedMap)declarations).tailMap( data.name.toLowerCase() ).keySet().iterator(); } else { @@ -414,7 +411,7 @@ public class ParserSymbolTable { } Map parameters = ((IParameterizedSymbol)lookIn).getParameterMap(); - if( parameters != ParserSymbolTable.EMPTY_MAP ){ + if( parameters != Collections.EMPTY_MAP ){ iterator = null; if( data.mode == LookupMode.PREFIX ){ if( parameters instanceof SortedMap ){ @@ -470,15 +467,16 @@ public class ParserSymbolTable { ISymbol foundSymbol = null; - Iterator iter = ( object instanceof List ) ? ((List)object).iterator() : null; - ISymbol symbol = ( iter != null ) ? (ISymbol) iter.next() : (ISymbol) object; + List objList = ( object instanceof List ) ? (List)object : null; + int objListSize = ( objList != null ) ? objList.size() : 0; + ISymbol symbol = ( objList != null ) ? (ISymbol) objList.get( 0 ) : (ISymbol) object; Set functionSet = new HashSet(); Set templateFunctionSet = new HashSet(); ISymbol obj = null; IContainerSymbol cls = null; - + int idx = 1; while( symbol != null ){ if( symbol instanceof ITemplateSymbol ){ ISymbol temp = ((ITemplateSymbol)symbol).getTemplatedSymbol(); @@ -540,8 +538,8 @@ public class ParserSymbolTable { } } - if( iter != null ){ - symbol = iter.hasNext() ? (ISymbol) iter.next() : null; + if( objList != null && idx < objListSize ){ + symbol = (ISymbol) objList.get( idx++ ); } else { symbol = null; } @@ -603,7 +601,7 @@ public class ParserSymbolTable { return obj; } } else if( numFunctions > 0 ) { - return new LinkedList( functionSet ); + return new ArrayList( functionSet ); } if( ambiguous ){ @@ -641,7 +639,6 @@ public class ParserSymbolTable { Map symbol = null; Map inherited = null; - Iterator iterator = null; IDerivableContainerSymbol.IParentSymbol wrapper = null; if( scopes == null ) @@ -652,14 +649,11 @@ public class ParserSymbolTable { data.inheritanceChain = new HashSet(); data.inheritanceChain.add( container ); - - iterator = scopes.iterator(); int size = scopes.size(); - - for( int i = size; i > 0; i-- ) + for( int i = 0; i < size; i++ ) { - wrapper = (IDerivableContainerSymbol.IParentSymbol) iterator.next(); + wrapper = (IDerivableContainerSymbol.IParentSymbol) scopes.get(i); ISymbol parent = wrapper.getParent(); if( parent == null ) continue; @@ -706,8 +700,9 @@ public class ParserSymbolTable { key = iter.next(); if( symbol.containsKey( key ) ){ Object obj = symbol.get( key ); - Iterator objIter = ( obj instanceof List ) ? ((List)obj).iterator() : null; - ISymbol sym = (ISymbol) (( objIter != null && objIter.hasNext() ) ? objIter.next() : obj); + List objList = ( obj instanceof List ) ? (List)obj : null; + int objListSize = ( objList != null ) ? objList.size() : 0, idx = 1; + ISymbol sym = (ISymbol) (( objList != null && objListSize > 0 ) ? objList.get(0) : obj); while( sym != null ){ if( !checkAmbiguity( sym, temp.get( key ) ) ){ if( data.mode == LookupMode.PREFIX ){ @@ -720,8 +715,8 @@ public class ParserSymbolTable { } } - if( objIter != null && objIter.hasNext() ){ - sym = (ISymbol) objIter.next(); + if( objList != null && idx < objListSize ){ + sym = (ISymbol) objList.get( idx++ ); } else { sym = null; } @@ -744,17 +739,18 @@ public class ParserSymbolTable { private static boolean checkAmbiguity( Object obj1, Object obj2 ){ //it is not ambiguous if they are the same thing and it is static or an enumerator if( obj1 == obj2 ){ - - Iterator iter = ( obj1 instanceof List ) ? ((List) obj1).iterator() : null; - ISymbol symbol = ( iter != null ) ? (ISymbol) iter.next() : ( ISymbol )obj1; + List objList = ( obj1 instanceof List ) ? (List) obj1 : null; + int objListSize = ( objList != null ) ? objList.size() : 0; + ISymbol symbol = ( objList != null ) ? (ISymbol) objList.get(0) : ( ISymbol )obj1; + int idx = 1; while( symbol != null ) { TypeInfo type = ((ISymbol)obj1).getTypeInfo(); if( !type.checkBit( TypeInfo.isStatic ) && !type.isType( TypeInfo.t_enumerator ) ){ return false; } - if( iter != null && iter.hasNext() ){ - symbol = (ISymbol) iter.next(); + if( objList != null && idx < objListSize ){ + symbol = (ISymbol) objList.get( idx++ ); } else { symbol = null; } @@ -942,16 +938,16 @@ public class ParserSymbolTable { Object object = data.foundItems.get( data.name ); - LinkedList functionList = null; + ArrayList functionList = null; if( object instanceof List ){ //if we got this far with a list, they must all be functions - functionList = new LinkedList(); + functionList = new ArrayList( ((List)object).size() ); functionList.addAll( (List) object ); } else { ISymbol symbol = (ISymbol) object; if( symbol.isType( TypeInfo.t_function ) ){ - functionList = new LinkedList(); + functionList = new ArrayList(1); functionList.add( symbol ); } else { if( symbol.isTemplateMember() && !symbol.isTemplateInstance() && @@ -969,7 +965,7 @@ public class ParserSymbolTable { //we have no parameter information, if we only have one function, return //that, otherwise we can't decide between them if( functionList.size() == 1){ - resolvedSymbol = (ISymbol) functionList.getFirst(); + resolvedSymbol = (ISymbol) functionList.get(0); } else { throw new ParserSymbolTableException( ParserSymbolTableException.r_UnableToResolveFunction ); } @@ -1009,9 +1005,8 @@ public class ParserSymbolTable { } else if ( numFns == 1 ){ return (IParameterizedSymbol)functions.iterator().next(); } else if ( numFns == 2 ){ - Iterator iter = functions.iterator(); - while( iter.hasNext() ){ - IParameterizedSymbol fn = (IParameterizedSymbol) iter.next(); + for (int i = 0; i < numFns; i++) { + IParameterizedSymbol fn = (IParameterizedSymbol) functions.get(i); if( fn.getTypeInfo().isForwardDeclaration() && fn.getTypeSymbol() != null ){ if( functions.contains( fn.getTypeSymbol() ) ){ return (IParameterizedSymbol) fn.getTypeSymbol(); @@ -1029,10 +1024,6 @@ public class ParserSymbolTable { Cost [] bestFnCost = null; //the cost of the best function Cost [] currFnCost = null; //the cost for the current function - Iterator iterFns = functions.iterator(); - Iterator sourceParams = null; //the parameters the function is being called with - Iterator targetParams = null; //the current function's parameters - TypeInfo source = null; //parameter we are called with TypeInfo target = null; //function's parameter @@ -1046,19 +1037,20 @@ public class ParserSymbolTable { boolean currHasAmbiguousParam = false; //currFn has an ambiguous parameter conversion (ok if not bestFn) boolean bestHasAmbiguousParam = false; //bestFn has an ambiguous parameter conversion (not ok, ambiguous) - List parameters = null; + List sourceParameters = null; //the parameters the function is being called with + List targetParameters = null; //the current function's parameters if( numSourceParams == 0 ){ //f() is the same as f( void ) - parameters = new LinkedList(); - parameters.add( new TypeInfo( TypeInfo.t_void, 0, null ) ); + sourceParameters = new ArrayList(1); + sourceParameters.add( new TypeInfo( TypeInfo.t_void, 0, null ) ); numSourceParams = 1; } else { - parameters = data.parameters; + sourceParameters = data.parameters; } - for( int i = numFns; i > 0; i-- ){ - currFn = (IParameterizedSymbol) iterFns.next(); + for( int fnIdx = 0; fnIdx < numFns; fnIdx++ ){ + currFn = (IParameterizedSymbol) functions.get( fnIdx ); if( bestFn != null ){ if( bestFn.isForwardDeclaration() && bestFn.getTypeSymbol() == currFn ){ @@ -1069,19 +1061,17 @@ public class ParserSymbolTable { } } - sourceParams = parameters.iterator(); - List parameterList = null; if( currFn.getParameterList().isEmpty() && !currFn.hasVariableArgs() ){ //the only way we get here and have no parameters, is if we are looking //for a function that takes void parameters ie f( void ) - parameterList = new LinkedList(); - parameterList.add( currFn.getSymbolTable().newSymbol( "", TypeInfo.t_void ) ); //$NON-NLS-1$ + targetParameters = new ArrayList(1); + targetParameters.add( currFn.getSymbolTable().newSymbol( "", TypeInfo.t_void ) ); //$NON-NLS-1$ } else { - parameterList = currFn.getParameterList(); + targetParameters = currFn.getParameterList(); } - targetParams = parameterList.iterator(); + int numTargetParams = targetParameters.size(); if( currFnCost == null ){ currFnCost = new Cost [ numSourceParams ]; } @@ -1090,10 +1080,10 @@ public class ParserSymbolTable { boolean varArgs = false; for( int j = 0; j < numSourceParams; j++ ){ - source = (TypeInfo) sourceParams.next(); + source = (TypeInfo) sourceParameters.get(j); - if( targetParams.hasNext() ) - target = ((ISymbol)targetParams.next()).getTypeInfo(); + if( j < numTargetParams ) + target = ((ISymbol)targetParameters.get(j)).getTypeInfo(); else varArgs = true; @@ -1138,7 +1128,8 @@ public class ParserSymbolTable { if( data.mode == LookupMode.PREFIX ){ //for prefix lookup, just remove from the function list those functions //that don't fit the parameters - iterFns.remove(); + functions.remove( fnIdx-- ); + numFns--; } break; } @@ -1219,10 +1210,10 @@ public class ParserSymbolTable { //create a new function that has params as its parameters, then use IParameterizedSymbol.hasSameParameters IParameterizedSymbol tempFn = function.getSymbolTable().newParameterizedSymbol( EMPTY_NAME, TypeInfo.t_function ); - Iterator i = params.iterator(); - while( i.hasNext() ){ + int size = params.size(); + for( int i = 0; i < size; i++ ){ ISymbol param = function.getSymbolTable().newSymbol( EMPTY_NAME ); - param.setTypeInfo( (TypeInfo) i.next() ); + param.setTypeInfo( (TypeInfo) params.get(i) ); tempFn.addParameter( param ); } @@ -1241,19 +1232,21 @@ public class ParserSymbolTable { //Trim the list down to the set of viable functions IParameterizedSymbol function; - Iterator iter = functions.iterator(); Object obj = null; - while( iter.hasNext() ){ - obj = iter.next(); + int size = functions.size(); + for( int i = 0; i < size; i++ ){ + obj = functions.get(i); //sanity check if( obj instanceof IParameterizedSymbol ){ function = (IParameterizedSymbol) obj; if( !function.isType( TypeInfo.t_function) && !function.isType( TypeInfo.t_constructor ) ){ - iter.remove(); + functions.remove( i-- ); + size--; continue; } } else { - iter.remove(); + functions.remove( i-- ); + size--; continue; } @@ -1263,7 +1256,8 @@ public class ParserSymbolTable { //are viable if( num == numParameters ){ if( data.exactFunctionsOnly && !functionHasParameters( function, data.parameters ) ){ - iter.remove(); + functions.remove( i-- ); + size--; } continue; } @@ -1286,7 +1280,8 @@ public class ParserSymbolTable { continue; } //not enough parameters, remove it - iter.remove(); + functions.remove( i-- ); + size--; } //a candidate function having more than m parameters is viable only if the (m+1)-st //parameter has a default argument @@ -1295,12 +1290,13 @@ public class ParserSymbolTable { //during prefix lookup, having more parameters than what is provided is ok continue; } - ListIterator listIter = function.getParameterList().listIterator( num ); + List params = function.getParameterList(); TypeInfo param; - for( int i = num; i > ( numParameters - num + 1); i-- ){ - param = ((ISymbol)listIter.previous()).getTypeInfo(); + for( int j = num - 1; j > ( numParameters - num); j-- ){ + param = ((ISymbol)params.get(j)).getTypeInfo(); if( !param.getHasDefault() ){ - iter.remove(); + functions.remove( i-- ); + size--; break; } } @@ -1327,10 +1323,8 @@ public class ParserSymbolTable { return; int size = directives.size(); - Iterator iter = directives.iterator(); - - for( int i = size; i > 0; i-- ){ - temp = ((IUsingDirectiveSymbol) iter.next()).getNamespace(); + for( int i = 0; i < size; i++ ){ + temp = ((IUsingDirectiveSymbol) directives.get(i)).getNamespace(); //namespaces are searched at most once if( !data.visited.contains( temp ) ){ @@ -1339,11 +1333,11 @@ public class ParserSymbolTable { //the data.usingDirectives is a map from enclosing declaration to //a list of namespaces to consider when we reach that enclosing //declaration - LinkedList list = (data.usingDirectives == null ) + ArrayList list = (data.usingDirectives == null ) ? null - : (LinkedList) data.usingDirectives.get( enclosing ); + : (ArrayList) data.usingDirectives.get( enclosing ); if ( list == null ){ - list = new LinkedList(); + list = new ArrayList(4); list.add( temp ); if( data.usingDirectives == null ){ data.usingDirectives = new HashMap(); @@ -1471,13 +1465,13 @@ public class ParserSymbolTable { return; } - Iterator iter = obj.getParents().iterator(); - int size = obj.getParents().size(); + List parents = obj.getParents(); + int size = parents.size(); IDerivableContainerSymbol.IParentSymbol wrapper; ISymbol base; - for( int i = size; i > 0; i-- ){ - wrapper = (IDerivableContainerSymbol.IParentSymbol) iter.next(); + for( int i = 0; i < size; i++ ){ + wrapper = (IDerivableContainerSymbol.IParentSymbol) parents.get(i); base = wrapper.getParent(); //TODO: what about IDeferredTemplateInstance parents? if( base instanceof IDerivableContainerSymbol ){ @@ -1561,16 +1555,13 @@ public class ParserSymbolTable { if( cost.source.hasPtrOperators() ){ List sourcePtrs = cost.source.getPtrOperators(); - Iterator iterator = sourcePtrs.iterator(); - TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)iterator.next(); + TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)sourcePtrs.get( 0 ); if( ptr.getType() == TypeInfo.PtrOp.t_reference ){ - iterator.remove(); + sourcePtrs.remove( 0 ); } int size = sourcePtrs.size(); - Iterator iter = sourcePtrs.iterator(); - - for( int i = size; i > 0; i-- ){ - op = (TypeInfo.PtrOp) iter.next(); + for( int i = 0; i < size; i++ ){ + op = (TypeInfo.PtrOp) sourcePtrs.get( 0 ); if( op.getType() == TypeInfo.PtrOp.t_array ){ op.setType( TypeInfo.PtrOp.t_pointer ); } @@ -1579,18 +1570,16 @@ public class ParserSymbolTable { if( cost.target.hasPtrOperators() ){ List targetPtrs = cost.target.getPtrOperators(); - ListIterator iterator = targetPtrs.listIterator(); - TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)iterator.next(); + //ListIterator iterator = targetPtrs.listIterator(); + TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)targetPtrs.get(0); if( ptr.getType() == TypeInfo.PtrOp.t_reference ){ - iterator.remove(); + targetPtrs.remove(0); cost.targetHadReference = true; } int size = targetPtrs.size(); - Iterator iter = targetPtrs.iterator(); - - for( int i = size; i > 0; i-- ){ - op = (TypeInfo.PtrOp) iter.next(); + for( int i = 0; i < size; i++ ){ + op = (TypeInfo.PtrOp) targetPtrs.get(0); if( op.getType() == TypeInfo.PtrOp.t_array ){ op.setType( TypeInfo.PtrOp.t_pointer ); } @@ -1607,26 +1596,25 @@ public class ParserSymbolTable { * see spec section 4.4 regarding qualification conversions */ static private void qualificationConversion( Cost cost ){ - int size = cost.source.getPtrOperators().size(); - int size2 = cost.target.getPtrOperators().size(); + List sourcePtrs = cost.source.getPtrOperators(); + List targetPtrs = cost.target.getPtrOperators(); + int size = sourcePtrs.size(); + int size2 = targetPtrs.size(); TypeInfo.PtrOp op1 = null, op2 = null; boolean canConvert = true; - - Iterator iter1 = cost.source.getPtrOperators().iterator(); - Iterator iter2 = cost.target.getPtrOperators().iterator(); if( size != size2 ){ canConvert = false; } else if( size > 0 ){ - op1 = (TypeInfo.PtrOp) iter1.next(); - op2 = (TypeInfo.PtrOp) iter2.next(); + op1 = (TypeInfo.PtrOp) sourcePtrs.get(0); + op2 = (TypeInfo.PtrOp) targetPtrs.get(0); boolean constInEveryCV2k = true; for( int j= 1; j < size; j++ ){ - op1 = (TypeInfo.PtrOp) iter1.next(); - op2 = (TypeInfo.PtrOp) iter2.next(); + op1 = (TypeInfo.PtrOp) sourcePtrs.get(j); + op2 = (TypeInfo.PtrOp) targetPtrs.get(j); //pointer types must be similar if( op1.getType() != op2.getType() ){ @@ -1726,7 +1714,7 @@ public class ParserSymbolTable { return; } if( src.hasPtrOperators() && src.getPtrOperators().size() == 1 ){ - TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)src.getPtrOperators().iterator().next(); + TypeInfo.PtrOp ptr = (TypeInfo.PtrOp)src.getPtrOperators().get(0); ISymbol srcDecl = src.isType( TypeInfo.t_type ) ? src.getTypeSymbol() : null; ISymbol trgDecl = trg.isType( TypeInfo.t_type ) ? trg.getTypeSymbol() : null; if( ptr.getType() == TypeInfo.PtrOp.t_pointer ){ @@ -1766,7 +1754,7 @@ public class ParserSymbolTable { return; } - TypeInfo.PtrOp srcPtr = trg.hasPtrOperators() ? (TypeInfo.PtrOp)trg.getPtrOperators().iterator().next() : null; + TypeInfo.PtrOp srcPtr = trg.hasPtrOperators() ? (TypeInfo.PtrOp)trg.getPtrOperators().get(0) : null; if( trgDecl.isType( srcDecl.getType() ) && srcPtr != null && srcPtr.getType() == TypeInfo.PtrOp.t_memberPointer ){ try { temp = hasBaseClass( ptr.getMemberOf(), srcPtr.getMemberOf() ); @@ -1884,7 +1872,7 @@ public class ParserSymbolTable { } if( targetDecl.isType( TypeInfo.t_class, TypeInfo.t_union ) ){ LookupData data = new LookupData( EMPTY_NAME, TypeInfo.t_constructor); - data.parameters = new LinkedList(); + data.parameters = new ArrayList(1); data.parameters.add( source ); data.forUserDefinedConversion = true; @@ -1894,7 +1882,7 @@ public class ParserSymbolTable { IDerivableContainerSymbol container = (IDerivableContainerSymbol) targetDecl; if( !container.getConstructors().isEmpty() ){ - LinkedList constructors = new LinkedList( container.getConstructors() ); + ArrayList constructors = new ArrayList( container.getConstructors() ); constructor = resolveFunction( data, constructors ); } if( constructor != null && constructor.getTypeInfo().checkBit( TypeInfo.isExplicit ) ){ @@ -1914,7 +1902,7 @@ public class ParserSymbolTable { if( !name.equals(EMPTY_NAME) ){ LookupData data = new LookupData( "operator " + name, TypeInfo.t_function ); //$NON-NLS-1$ - data.parameters = ParserSymbolTable.EMPTY_LIST; + data.parameters = Collections.EMPTY_LIST; data.forUserDefinedConversion = true; data.foundItems = lookupInContained( data, (IContainerSymbol) sourceDecl ); @@ -2047,7 +2035,7 @@ public class ParserSymbolTable { returnInfo.applyOperatorExpressions( topInfo.getOperatorExpressions() ); if( topInfo.hasPtrOperators() ){ - TypeInfo.PtrOp topPtr = (PtrOp) topInfo.getPtrOperators().iterator().next(); + TypeInfo.PtrOp topPtr = (PtrOp) topInfo.getPtrOperators().get(0); TypeInfo.PtrOp ptr = new PtrOp( topPtr.getType(), topPtr.isConst(), topPtr.isVolatile() ); returnInfo.addPtrOperator( ptr ); } @@ -2061,7 +2049,7 @@ public class ParserSymbolTable { private IContainerSymbol _compilationUnit; private ParserLanguage _language; private ParserMode _mode; - private LinkedList undoList = new LinkedList(); +// private ArrayList undoList = new ArrayList(); private HashSet markSet = new HashSet(); public void setLanguage( ParserLanguage language ){ @@ -2076,52 +2064,52 @@ public class ParserSymbolTable { return _mode; } - protected void pushCommand( Command command ){ - undoList.addFirst( command ); - } +// protected void pushCommand( Command command ){ +// undoList.addFirst( command ); +// } - public Mark setMark(){ - Mark mark = new Mark(); - undoList.addFirst( mark ); - markSet.add( mark ); - return mark; - } +// public Mark setMark(){ +// Mark mark = new Mark(); +// undoList.addFirst( mark ); +// markSet.add( mark ); +// return mark; +// } - public boolean rollBack( Mark toMark ){ - if( markSet.contains( toMark ) ){ - markSet.remove( toMark ); - Command command = ( Command )undoList.removeFirst(); - while( command != toMark ){ - command.undoIt(); - command = ( Command ) undoList.removeFirst(); - } - - return true; - } - - return false; - } +// public boolean rollBack( Mark toMark ){ +// if( markSet.contains( toMark ) ){ +// markSet.remove( toMark ); +// Command command = ( Command )undoList.removeFirst(); +// while( command != toMark ){ +// command.undoIt(); +// command = ( Command ) undoList.removeFirst(); +// } +// +// return true; +// } +// +// return false; +// } - public boolean commit( Mark toMark ){ - if( markSet.contains( toMark ) ){ - markSet.remove( toMark ); - Command command = ( Command )undoList.removeLast(); - while( command != toMark ){ - command = (Command) undoList.removeLast(); - } - return true; - } - - return false; - } +// public boolean commit( Mark toMark ){ +// if( markSet.contains( toMark ) ){ +// markSet.remove( toMark ); +// Command command = ( Command )undoList.removeLast(); +// while( command != toMark ){ +// command = (Command) undoList.removeLast(); +// } +// return true; +// } +// +// return false; +// } - static abstract protected class Command{ - abstract public void undoIt(); - } - - static public class Mark extends Command{ - public void undoIt(){ } - } +// static abstract protected class Command{ +// abstract public void undoIt(); +// } +// +// static public class Mark extends Command{ +// public void undoIt(){ } +// } static public class LookupMode extends Enum{ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/SpecializedSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/SpecializedSymbol.java index 170171a821f..591c9f1f903 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/SpecializedSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/SpecializedSymbol.java @@ -13,14 +13,13 @@ */ package org.eclipse.cdt.internal.core.parser.pst; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; -import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.Command; - /** * @author aniefe */ @@ -37,7 +36,7 @@ public class SpecializedSymbol extends TemplateSymbol implements ISpecializedSym public Object clone(){ SpecializedSymbol copy = (SpecializedSymbol)super.clone(); - copy._argumentList = ( _argumentList != ParserSymbolTable.EMPTY_LIST ) ? (LinkedList) _argumentList.clone() : _argumentList; + copy._argumentList = ( _argumentList != Collections.EMPTY_LIST ) ? (List)((ArrayList) _argumentList).clone() : _argumentList; return copy; } @@ -59,7 +58,7 @@ public class SpecializedSymbol extends TemplateSymbol implements ISpecializedSym return null; } - List actualArgs = new LinkedList(); + List actualArgs = new ArrayList( specArgs.size() ); Iterator iter1 = specArgs.iterator(); Iterator iter2 = arguments.iterator(); @@ -126,34 +125,41 @@ public class SpecializedSymbol extends TemplateSymbol implements ISpecializedSym return _argumentList; } + public void prepareArguments( int size ){ + if( _argumentList == Collections.EMPTY_LIST ) + _argumentList = new ArrayList( size ); + else + ((ArrayList)_argumentList).ensureCapacity( size ); + } + /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.pst.IParameterizedSymbol#addArgument(org.eclipse.cdt.internal.core.parser.pst.ISymbol) */ public void addArgument(TypeInfo arg) { - if( _argumentList == ParserSymbolTable.EMPTY_LIST ) - _argumentList = new LinkedList(); + if( _argumentList == Collections.EMPTY_LIST ) + _argumentList = new ArrayList(4); _argumentList.add( arg ); //arg.setIsTemplateMember( isTemplateMember() || getType() == TypeInfo.t_template ); - Command command = new AddArgumentCommand( this, arg ); - getSymbolTable().pushCommand( command ); +// Command command = new AddArgumentCommand( this, arg ); +// getSymbolTable().pushCommand( command ); } - static private class AddArgumentCommand extends Command{ - public AddArgumentCommand( ISpecializedSymbol container, TypeInfo arg ){ - _decl = container; - _arg = arg; - } - public void undoIt(){ - _decl.getArgumentList().remove( _arg ); - } - - private ISpecializedSymbol _decl; - private TypeInfo _arg; - } +// static private class AddArgumentCommand extends Command{ +// public AddArgumentCommand( ISpecializedSymbol container, TypeInfo arg ){ +// _decl = container; +// _arg = arg; +// } +// public void undoIt(){ +// _decl.getArgumentList().remove( _arg ); +// } +// +// private ISpecializedSymbol _decl; +// private TypeInfo _arg; +// } - private LinkedList _argumentList = ParserSymbolTable.EMPTY_LIST; //template specialization arguments + private List _argumentList = Collections.EMPTY_LIST; //template specialization arguments private ITemplateSymbol _primaryTemplate; //our primary template } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java index f15295b804f..8e5de5cc7b4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateEngine.java @@ -10,11 +10,11 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser.pst; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; -import java.util.ListIterator; import java.util.Map; import java.util.Set; @@ -46,8 +46,7 @@ public final class TemplateEngine { { TypeInfo targetInfo = new TypeInfo( (TypeInfo) argMap.get( info.getTypeSymbol() ) ); if( info.hasPtrOperators() ){ - List infoOperators = new LinkedList( info.getPtrOperators() ); - targetInfo.addPtrOperator( infoOperators ); + targetInfo.addPtrOperator( info.getPtrOperators() ); } if( info.checkBit( TypeInfo.isConst ) ) @@ -316,16 +315,16 @@ public final class TemplateEngine { TypeInfo a = ParserSymbolTable.getFlatTypeInfo( aInfo ); if( !pIsAReferenceType ){ - List aPtrs = a.getPtrOperators(); ISymbol aSymbol = a.getTypeSymbol(); if( a.getType() == TypeInfo.t_type ){ if( aSymbol == null ){ throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTemplateArgument ); - } else if( aSymbol.isType( TypeInfo.t_function ) && aPtrs.size() == 0 ){ - aPtrs.add( new PtrOp( PtrOp.t_pointer ) ); + } else if( aSymbol.isType( TypeInfo.t_function ) && a.getPtrOperators().size() == 0 ){ + a.addPtrOperator( new PtrOp( PtrOp.t_pointer ) ); } } + List aPtrs = a.getPtrOperators(); if( aPtrs.size() > 0 ){ PtrOp pOp = (PtrOp) aPtrs.get( 0 ); @@ -392,9 +391,10 @@ public final class TemplateEngine { if( pTemplate instanceof ISpecializedSymbol ){ pTemplate = ((ISpecializedSymbol)pTemplate).getPrimaryTemplate(); } - Iterator iter = a.getParents().iterator(); - while( iter.hasNext() ){ - IParentSymbol wrapper = (IParentSymbol) iter.next(); + List parents = a.getParents(); + int size = parents.size(); + for( int i = 0; i < size; i++ ){ + IParentSymbol wrapper = (IParentSymbol) parents.get(i); ISymbol parent = wrapper.getParent(); if( parent instanceof IDeferredTemplateInstance ){ IDeferredTemplateInstance parentInstance = (IDeferredTemplateInstance) parent; @@ -430,8 +430,8 @@ public final class TemplateEngine { boolean pIsAReferenceType = false; - Iterator i = pSymbol.getPtrOperators().iterator(); - if( i.hasNext() && ((PtrOp)i.next()).getType() == TypeInfo.PtrOp.t_reference ){ + List ptrOps = pSymbol.getPtrOperators(); + if( ptrOps.size() > 0 && ((PtrOp)ptrOps.get(0)).getType() == TypeInfo.PtrOp.t_reference ){ pIsAReferenceType = true; } @@ -457,21 +457,23 @@ public final class TemplateEngine { if( aPtrs == null ){ return false; } + + int pSize = pPtrs.size(); + int aSize = aPtrs.size(); + if( pSize != aSize ) + return false; - Iterator pIter = pPtrs.iterator(); - ListIterator aIter = aPtrs.listIterator(); PtrOp pOp = null; PtrOp aOp = null; - while( pIter.hasNext() ){ - pOp = (PtrOp) pIter.next(); - if( !aIter.hasNext() ){ - return false; - } - aOp = (PtrOp) aIter.next(); + + int aIdx = 0; + for( int i = 0; i < pSize; i++ ){ + pOp = (PtrOp) pPtrs.get(i); + aOp = (PtrOp) aPtrs.get(aIdx++); if( pOp.getType() == aOp.getType() ){ if( !pOp.equals( aOp ) ) return false; - aIter.remove(); + aPtrs.remove( --aIdx ); } else { return false; } @@ -533,11 +535,10 @@ public final class TemplateEngine { if( pParams.size() != aParams.size() ){ return false; } - Iterator pIter = pParams.iterator(); - Iterator aIter = aParams.iterator(); - while( pIter.hasNext() ){ - TypeInfo info = ((ISymbol)aIter.next()).getTypeInfo(); - if( !deduceTemplateArgument( map, (ISymbol) pIter.next(), info ) ){ + int size = pParams.size(); + for( int i = 0; i < size; i++ ){ + TypeInfo info = ((ISymbol)aParams.get( i )).getTypeInfo(); + if( !deduceTemplateArgument( map, (ISymbol)pParams.get(i), info ) ){ return false; } } @@ -599,10 +600,10 @@ public final class TemplateEngine { if( pList == null || aList == null || pList.size() != aList.size()){ return false; } - Iterator pIter = pList.iterator(); - Iterator aIter = aList.iterator(); - while( pIter.hasNext() ){ - Object obj = pIter.next(); + + int size = pList.size(); + for( int i = 0; i < size; i++ ){ + Object obj = pList.get( i ); ISymbol sym = null; if( obj instanceof ISymbol ){ sym = (ISymbol) obj; @@ -611,7 +612,7 @@ public final class TemplateEngine { sym.setTypeInfo( (TypeInfo) obj ); } - TypeInfo arg = transformTypeInfo( aIter.next(), null ); + TypeInfo arg = transformTypeInfo( aList.get( i ), null ); try { if( !deduceTemplateArgument( map, sym, arg ) ){ @@ -637,11 +638,11 @@ public final class TemplateEngine { static private Map deduceTemplateArgumentsUsingParameterList( ITemplateSymbol template, IParameterizedSymbol function ){ List aList = function.getParameterList(); - LinkedList args = new LinkedList(); + int size = aList.size(); + ArrayList args = new ArrayList( size ); - Iterator iter = aList.iterator(); - while( iter.hasNext() ){ - ISymbol symbol = (ISymbol) iter.next(); + for( int i = 0; i < size; i++ ){ + ISymbol symbol = (ISymbol) aList.get(i); args.add( symbol.getTypeInfo() ); } @@ -658,7 +659,7 @@ public final class TemplateEngine { * after substitution of the deduced values, compatible with A. */ static private Map deduceTemplateArguments( ITemplateSymbol template, List arguments ){ - if( template.getContainedSymbols() == ParserSymbolTable.EMPTY_MAP || template.getContainedSymbols().size() != 1 ){ + if( template.getContainedSymbols() == Collections.EMPTY_MAP || template.getContainedSymbols().size() != 1 ){ return null; } @@ -677,12 +678,10 @@ public final class TemplateEngine { HashMap map = new HashMap(); - Iterator pIter = pList.iterator(); - Iterator aIter = arguments.iterator(); - - while( pIter.hasNext() ){ + int size = pList.size(); + for( int i = 0; i < size; i++ ){ try { - if( !deduceTemplateArgument( map, (ISymbol) pIter.next(), (TypeInfo) aIter.next() ) ){ + if( !deduceTemplateArgument( map, (ISymbol) pList.get(i), (TypeInfo) arguments.get(i) ) ){ return null; } } catch (ParserSymbolTableException e) { @@ -796,8 +795,9 @@ public final class TemplateEngine { HashMap map = new HashMap(); TypeInfo val = null; List paramList = template.getParameterList(); - for( Iterator iterator = paramList.iterator(); iterator.hasNext(); ) { - ISymbol param = (ISymbol) iterator.next(); + int size = paramList.size(); + for( int i = 0; i < size; i++ ){ + ISymbol param = (ISymbol) paramList.get( i ); //template type parameter if( param.getTypeInfo().getTemplateParameterType() == TypeInfo.t_typeName ){ val = new TypeInfo( TypeInfo.t_type, 0, template.getSymbolTable().newSymbol( "", TypeInfo.t_class ) ); //$NON-NLS-1$ @@ -891,7 +891,7 @@ public final class TemplateEngine { Iterator paramIter = template.getParameterList().iterator(); Iterator argsIter = (templateArguments != null ) ? templateArguments.iterator() : null; - List instanceArgs = new LinkedList(); + List instanceArgs = new ArrayList( template.getParameterList().size() ); while( paramIter.hasNext() ){ ISymbol param = (ISymbol) paramIter.next(); TypeInfo arg = (TypeInfo) (( argsIter != null && argsIter.hasNext() )? argsIter.next() : null); @@ -912,7 +912,7 @@ public final class TemplateEngine { if( instance != null ){ if( instances == null ) - instances = new LinkedList(); + instances = new ArrayList(4); instances.add( instance ); } } @@ -981,11 +981,10 @@ public final class TemplateEngine { return false; } - Iterator iter1 = p1.iterator(); - Iterator iter2 = p2.iterator(); - while( iter1.hasNext() ){ - ISymbol param1 = (ISymbol) iter1.next(); - ISymbol param2 = (ISymbol) iter2.next(); + int size = p1.size(); + for( int i = 0; i < size; i++ ){ + ISymbol param1 = (ISymbol) p1.get( i ); + ISymbol param2 = (ISymbol) p2.get( i ); if( param1.getTypeInfo().getTemplateParameterType() != param2.getTypeInfo().getTemplateParameterType() ){ return false; } @@ -1001,10 +1000,10 @@ public final class TemplateEngine { Map m [] = { new HashMap(), new HashMap() }; for( List list = p1; list != null; list = p2 ){ - Iterator i = list.iterator(); + int size = list.size(); int index = 0; - while( i.hasNext() ){ - m[ ( list == p2 )? 1 : 0 ].put( i.next(), new Integer( index++ ) ); + for( int i = 0; i < size; i++ ) { + m[ ( list == p2 )? 1 : 0 ].put( list.get( i ), new Integer( index++ ) ); } if( list == p2 ){ @@ -1012,11 +1011,10 @@ public final class TemplateEngine { } } - Iterator i1 = a1.iterator(); - Iterator i2 = a2.iterator(); - while( i1.hasNext() ){ - TypeInfo t1 = (TypeInfo) i1.next(); - TypeInfo t2 = (TypeInfo) i2.next(); + int a1Size = a1.size(); + for( int i = 0; i < a1Size; i++ ){ + TypeInfo t1 = (TypeInfo) a1.get( i ); + TypeInfo t2 = (TypeInfo) a2.get( i ); if( t1.equals( t2 ) ){ continue; @@ -1032,11 +1030,11 @@ public final class TemplateEngine { } static private ISpecializedSymbol findPartialSpecialization( ITemplateSymbol template, List parameters, List arguments ){ - - Iterator iter = template.getSpecializations().iterator(); + List specs = template.getSpecializations(); + int size = specs.size(); ISpecializedSymbol spec = null; - while( iter.hasNext() ){ - spec = (ISpecializedSymbol) iter.next(); + for( int i = 0; i < size; i++ ){ + spec = (ISpecializedSymbol) specs.get(i); if( ! checkTemplateParameterListsAreEquivalent( spec.getParameterList(), parameters ) ){ continue; @@ -1052,7 +1050,7 @@ public final class TemplateEngine { } static protected ISymbol translateParameterForDefinition ( ISymbol templatedSymbol, ISymbol param, Map defnMap ){ - if( defnMap == ParserSymbolTable.EMPTY_MAP ){ + if( defnMap == Collections.EMPTY_MAP ){ return param; } @@ -1112,10 +1110,11 @@ public final class TemplateEngine { instance = spec.deferredInstance( spec.getArgumentList() ); } else { ITemplateSymbol template = symbol; - Iterator iter = template.getParameterList().iterator(); - List args = new LinkedList(); - while( iter.hasNext() ){ - args.add( new TypeInfo( TypeInfo.t_type, 0, (ISymbol) iter.next() ) ); + List params = template.getParameterList(); + int size = params.size(); + List args = new ArrayList( size ); + for( int i = 0; i < size; i++ ){ + args.add( new TypeInfo( TypeInfo.t_type, 0, (ISymbol) params.get(i) ) ); } instance = template.deferredInstance( args ); @@ -1156,13 +1155,13 @@ public final class TemplateEngine { } static protected List verifyExplicitArguments( ITemplateSymbol template, List arguments, ISymbol symbol ) throws ParserSymbolTableException{ - List actualArgs = new LinkedList(); - - Iterator params = template.getParameterList().iterator(); + List params = template.getParameterList(); Iterator args = arguments.iterator(); - while( params.hasNext() ){ - ISymbol param = (ISymbol) params.next(); + int numParams = params.size(); + List actualArgs = new ArrayList( numParams ); + for( int i = 0; i < numParams; i++ ){ + ISymbol param = (ISymbol) params.get(i); if( args.hasNext() ){ TypeInfo arg = (TypeInfo) args.next(); if( matchTemplateParameterAndArgument( param, arg ) ){ @@ -1226,7 +1225,7 @@ public final class TemplateEngine { static protected List resolveTemplateFunctionArguments( List args, ITemplateSymbol template, IParameterizedSymbol fn ) { - List resultList = new LinkedList(); + List resultList = new ArrayList(); List params = template.getParameterList(); Map map = null; @@ -1323,14 +1322,13 @@ public final class TemplateEngine { List args = instance.getArguments(); List args2 = instance2.getArguments(); - - if( args.size() != args2.size() ) + int size = args.size(); + if( size != args2.size() ) return false; - Iterator iter1 = args.iterator(), iter2 = args2.iterator(); - while( iter1.hasNext() ){ - TypeInfo info1 = (TypeInfo) iter1.next(); - TypeInfo info2 = (TypeInfo) iter2.next(); + for( int i = 0; i < size; i++ ){ + TypeInfo info1 = (TypeInfo) args.get(i); + TypeInfo info2 = (TypeInfo) args2.get(i); if( ! info1.equals( info2 ) ) return false; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java index 201d6fc6a76..56ab51d2571 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java @@ -10,9 +10,9 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser.pst; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; @@ -31,8 +31,8 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor private IContainerSymbol lastSymbol; - private List templates = new LinkedList(); - private List symbols = new LinkedList(); + private ArrayList templates = new ArrayList(4); + private ArrayList symbols = new ArrayList(4); private Map argMap = new HashMap(); protected TemplateFactory( ParserSymbolTable table ){ @@ -49,7 +49,7 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor public void pushTemplateId(ISymbol symbol, List args) { symbols.add( symbol ); - argMap.put( symbol, new LinkedList( args ) ); + argMap.put( symbol, new ArrayList( args ) ); } /* (non-Javadoc) @@ -77,13 +77,14 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor } else { //partial speciailization ISpecializedSymbol spec = template.getSymbolTable().newSpecializedSymbol( symbol.getName() ); - Iterator iter = params.iterator(); - while( iter.hasNext() ){ - spec.addTemplateParameter( (ISymbol) iter.next() ); + int size = params.size(); + for( int i = 0; i < size; i++){ + spec.addTemplateParameter( (ISymbol) params.get( i ) ); } - iter = args.iterator(); - while( iter.hasNext() ){ - spec.addArgument( (TypeInfo) iter.next() ); + size = args.size(); + spec.prepareArguments( size ); + for( int i = 0; i < size; i++){ + spec.addArgument( (TypeInfo) args.get(i) ); } spec.addSymbol( symbol ); @@ -106,18 +107,18 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor public void addSymbol(ISymbol symbol) throws ParserSymbolTableException { lastSymbol = getLastSymbol(); - Iterator iter = symbols.iterator(); - ListIterator tIter = templates.listIterator(); - ISymbol sym = null; ISymbol container = null; boolean templateParamState = false; - while( iter.hasNext() ){ - sym = (ISymbol) iter.next(); + int size = symbols.size(); + int templatesSize = templates.size(), templatesIdx = 0; + for( int i = 0; i < size; i++ ){ + sym = (ISymbol) symbols.get( i ); if( !sym.getContainingSymbol().isType( TypeInfo.t_template ) ){ - iter.remove(); - } else if( tIter.hasNext() ) { - ITemplateSymbol template = (ITemplateSymbol) tIter.next(); + symbols.remove( i-- ); + size--; + } else if( templatesIdx < templatesSize ) { + ITemplateSymbol template = (ITemplateSymbol) templates.get( templatesIdx-- ); if( template.getParameterList().size() == 0 ){ templateParamState = true; container = sym; @@ -155,10 +156,11 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor List argList = null; if( symbol instanceof IParameterizedSymbol ){ - argList = new LinkedList(); - Iterator i = ((IParameterizedSymbol)symbol).getParameterList().iterator(); - while( i.hasNext() ){ - ISymbol param = (ISymbol) i.next(); + List params = ((IParameterizedSymbol)symbol).getParameterList(); + int size = params.size(); + argList = new ArrayList( size ); + for( int i = 0; i < size; i++ ){ + ISymbol param = (ISymbol) params.get(i); argList.add( param.getTypeInfo() ); } } @@ -182,7 +184,7 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor if( template.getParameterList().size() == 0 ){ //explicit specialization, deduce some arguments and use addTemplateId - ISymbol previous = findPreviousSymbol( symbol, new LinkedList() ); + ISymbol previous = findPreviousSymbol( symbol, new ArrayList() ); if( previous == null || !(previous.getContainingSymbol() instanceof ITemplateSymbol) ) throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTemplate ); @@ -276,21 +278,21 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTemplate ); } - Iterator tempIter = templates.iterator(); - Iterator symIter = symbols.iterator(); - - while( tempIter.hasNext() ){ + int size = templates.size(); + for( int i = 0; i < size; i++ ){ Map defnMap = new HashMap(); - ITemplateSymbol template = (ITemplateSymbol) tempIter.next(); - ITemplateSymbol origTemplate = (ITemplateSymbol) ((ISymbol)symIter.next()).getContainingSymbol(); + ITemplateSymbol template = (ITemplateSymbol) templates.get(i); + ITemplateSymbol origTemplate = (ITemplateSymbol) ((ISymbol)symbols.get(i)).getContainingSymbol(); - Iterator params = template.getParameterList().iterator(); - Iterator origParams = origTemplate.getParameterList().iterator(); - - while( params.hasNext() ){ - ISymbol param = (ISymbol) params.next(); - ISymbol origParam = (ISymbol) origParams.next(); + List tList = template.getParameterList(); + List oList = origTemplate.getParameterList(); + int tListSize = tList.size(); + if( oList.size() < tListSize ) + throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTemplate ); + for( int j = 0; j < tListSize; j++ ){ + ISymbol param = (ISymbol) tList.get(j); + ISymbol origParam = (ISymbol) oList.get(j); defnMap.put( param, origParam ); } @@ -310,9 +312,9 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor private void addExplicitSpecialization( ITemplateSymbol template, ISymbol symbol, List arguments ) throws ParserSymbolTableException { template.addExplicitSpecialization( symbol, arguments ); - Iterator i = symbols.iterator(); - while( i.hasNext() ){ - IContainerSymbol sym = (IContainerSymbol) i.next(); + int size = symbols.size(); + for( int i = 0; i < size; i++ ){ + IContainerSymbol sym = (IContainerSymbol) symbols.get( 0 ); ISymbol instantiated = sym.getInstantiatedSymbol(); if( instantiated != null ){ IContainerSymbol container = instantiated.getContainingSymbol(); @@ -320,7 +322,6 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor ((ITemplateSymbol) container ).removeInstantiation( sym ); } } - } if( getASTExtension() != null ){ @@ -838,4 +839,10 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor public List getFriends() { return null; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.pst.ISymbol#preparePtrOperatros(int) + */ + public void preparePtrOperatros(int numPtrOps) { + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java index f09163f8217..2169082a1ad 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateSymbol.java @@ -10,9 +10,10 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser.pst; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -37,8 +38,8 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb public Object clone(){ TemplateSymbol copy = (TemplateSymbol)super.clone(); - copy._defnParameterMap = ( _defnParameterMap != ParserSymbolTable.EMPTY_MAP ) ? (HashMap)((HashMap) _defnParameterMap).clone() : _defnParameterMap; - copy._instantiations = ( _instantiations != null ) ? (HashMap)((HashMap) _instantiations).clone() : _instantiations; + copy._defnParameterMap = ( _defnParameterMap != Collections.EMPTY_MAP ) ? (Map)((HashMap) _defnParameterMap).clone() : _defnParameterMap; + copy._instantiations = ( _instantiations != Collections.EMPTY_MAP ) ? (Map)((HashMap) _instantiations).clone() : _instantiations; return copy; } @@ -87,7 +88,7 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb ISymbol param = null; TypeInfo arg = null; - List actualArgs = new LinkedList(); + List actualArgs = new ArrayList( numParams ); ISymbol templatedSymbol = template.getTemplatedSymbol(); while( templatedSymbol != null && templatedSymbol.isTemplateInstance() ){ @@ -255,7 +256,7 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb List actualArgs = TemplateEngine.verifyExplicitArguments( this, args, symbol ); - if( _explicitSpecializations == ParserSymbolTable.EMPTY_MAP ) + if( _explicitSpecializations == Collections.EMPTY_MAP ) _explicitSpecializations = new HashMap(); Map specs = null; @@ -274,16 +275,17 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb specs = (Map) _explicitSpecializations.get( key ); } else { specs = new HashMap(); - _explicitSpecializations.put( new LinkedList( actualArgs ), specs ); + _explicitSpecializations.put( new ArrayList( actualArgs ), specs ); } ISymbol found = null; try{ if( symbol.isType( TypeInfo.t_function ) || symbol.isType( TypeInfo.t_constructor ) ){ - List fnArgs = new LinkedList(); - iter = ((IParameterizedSymbol)symbol).getParameterList().iterator(); - while( iter.hasNext() ){ - fnArgs.add( ((ISymbol)iter.next()).getTypeInfo() ); + List params = ((IParameterizedSymbol) symbol).getParameterList(); + int size = params.size(); + List fnArgs = new ArrayList( size ); + for( int i = 0; i < size; i++){ + fnArgs.add( ((ISymbol)params.get(i)).getTypeInfo() ); } found = getTemplatedSymbol().lookupMethodForDefinition( symbol.getName(), fnArgs ); } else { @@ -325,8 +327,8 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb * @see org.eclipse.cdt.internal.core.parser.pst.IParameterizedSymbol#addSpecialization(org.eclipse.cdt.internal.core.parser.pst.IParameterizedSymbol) */ public void addSpecialization( ISpecializedSymbol spec ){ - if( _specializations == ParserSymbolTable.EMPTY_LIST ) - _specializations = new LinkedList(); + if( _specializations == Collections.EMPTY_LIST ) + _specializations = new ArrayList(4); _specializations.add( spec ); @@ -342,15 +344,15 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb } public void addInstantiation( IContainerSymbol instance, List args ){ - List key = new LinkedList( args ); - if( _instantiations == ParserSymbolTable.EMPTY_MAP ){ + List key = new ArrayList( args ); + if( _instantiations == Collections.EMPTY_MAP ){ _instantiations = new HashMap(); } _instantiations.put( key, instance ); } public IContainerSymbol findInstantiation( List arguments ){ - if( _instantiations == ParserSymbolTable.EMPTY_MAP ){ + if( _instantiations == Collections.EMPTY_MAP ){ return null; } @@ -398,7 +400,7 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb } protected void addToDefinitionParameterMap( ISymbol newSymbol, Map defnMap ){ - if( _defnParameterMap == ParserSymbolTable.EMPTY_MAP ) + if( _defnParameterMap == Collections.EMPTY_MAP ) _defnParameterMap = new HashMap(); _defnParameterMap.put( newSymbol, defnMap ); } @@ -415,20 +417,20 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb * @see org.eclipse.cdt.internal.core.parser.pst.ITemplateSymbol#registerDeferredInstatiation(org.eclipse.cdt.internal.core.parser.pst.ParameterizedSymbol, org.eclipse.cdt.internal.core.parser.pst.ISymbol, org.eclipse.cdt.internal.core.parser.pst.ITemplateSymbol.DeferredKind) */ public void registerDeferredInstatiation( Object obj0, Object obj1, DeferredKind kind, Map argMap ) { - if( _deferredInstantiations == ParserSymbolTable.EMPTY_LIST ) - _deferredInstantiations = new LinkedList(); + if( _deferredInstantiations == Collections.EMPTY_LIST ) + _deferredInstantiations = new ArrayList(8); _deferredInstantiations.add( new Object [] { obj0, obj1, kind, argMap } ); } protected void processDeferredInstantiations() throws ParserSymbolTableException{ - if( _deferredInstantiations == ParserSymbolTable.EMPTY_LIST ) + if( _deferredInstantiations == Collections.EMPTY_LIST ) return; - Iterator iter = _deferredInstantiations.iterator(); - while( iter.hasNext() ){ - Object [] objs = (Object [])iter.next(); + int size = _deferredInstantiations.size(); + for( int i = 0; i < size; i++ ){ + Object [] objs = (Object [])_deferredInstantiations.get(i); DeferredKind kind = (DeferredKind) objs[2]; @@ -444,11 +446,11 @@ public class TemplateSymbol extends ParameterizedSymbol implements ITemplateSymb } } - private LinkedList _specializations = ParserSymbolTable.EMPTY_LIST; //template specializations - private Map _explicitSpecializations = ParserSymbolTable.EMPTY_MAP; //explicit specializations - private Map _defnParameterMap = ParserSymbolTable.EMPTY_MAP; //members could be defined with different template parameter names - private Map _instantiations = ParserSymbolTable.EMPTY_MAP; - private LinkedList _deferredInstantiations = ParserSymbolTable.EMPTY_LIST; //used to avoid recursive loop + private List _specializations = Collections.EMPTY_LIST; //template specializations + private Map _explicitSpecializations = Collections.EMPTY_MAP; //explicit specializations + private Map _defnParameterMap = Collections.EMPTY_MAP; //members could be defined with different template parameter names + private Map _instantiations = Collections.EMPTY_MAP; + private List _deferredInstantiations = Collections.EMPTY_LIST; //used to avoid recursive loop } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java index aef40b61093..737f0ee6a67 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeInfo.java @@ -10,8 +10,9 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser.pst; +import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.ListIterator; @@ -23,37 +24,37 @@ public class TypeInfo { super(); } - public TypeInfo( TypeInfo.eType type, int info, ISymbol symbol ){ + public TypeInfo( TypeInfo.eType type, int bits, ISymbol symbol ){ super(); - _typeInfo = info; + _typeBits = bits; _type = type; _typeDeclaration = symbol; } - public TypeInfo( TypeInfo.eType type, int info, ISymbol symbol, TypeInfo.PtrOp op, boolean hasDefault ){ + public TypeInfo( TypeInfo.eType type, int bits, ISymbol symbol, TypeInfo.PtrOp op, boolean hasDefault ){ super(); - _typeInfo = info; + _typeBits = bits; _type = type; _typeDeclaration = symbol; if( op != null ){ - _ptrOperators = new LinkedList(); + _ptrOperators = new ArrayList(2); _ptrOperators.add( op ); } else { - _ptrOperators = null; + _ptrOperators = Collections.EMPTY_LIST; } _hasDefaultValue = hasDefault; } - public TypeInfo( TypeInfo.eType type, int info, ISymbol symbol, TypeInfo.PtrOp op, Object def ){ + public TypeInfo( TypeInfo.eType type, int bits, ISymbol symbol, TypeInfo.PtrOp op, Object def ){ super(); - _typeInfo = info; + _typeBits = bits; _type = type; _typeDeclaration = symbol; if( op != null ){ - _ptrOperators = new LinkedList(); + _ptrOperators = new ArrayList( 1 ); _ptrOperators.add( op ); } else { - _ptrOperators = null; + _ptrOperators = Collections.EMPTY_LIST; } _hasDefaultValue = true; setDefault( def ); @@ -62,35 +63,34 @@ public class TypeInfo { public TypeInfo( TypeInfo info ){ super(); - _typeInfo = info._typeInfo; + _typeBits = info._typeBits; _type = info._type; _typeDeclaration = info._typeDeclaration; - _ptrOperators = ( info._ptrOperators == null ) ? null : (LinkedList)info._ptrOperators.clone(); + _ptrOperators = ( info._ptrOperators == Collections.EMPTY_LIST ) ? info._ptrOperators : (ArrayList)((ArrayList)info._ptrOperators).clone(); _hasDefaultValue = info._hasDefaultValue; _defaultValue = info._defaultValue; } - 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; - public static final int isForward = 0x100000; - public static final int isComplex = 0x200000; - public static final int isImaginary= 0x400000; - public static final int isLongLong = 0x800000; - public static final int isSigned = 0x1000000; + public static final int isAuto = 0x00001; + public static final int isRegister = 0x00002; + public static final int isStatic = 0x00004; + public static final int isExtern = 0x00008; + public static final int isMutable = 0x00010; + public static final int isInline = 0x00020; + public static final int isVirtual = 0x00040; + public static final int isExplicit = 0x00080; + public static final int isTypedef = 0x00100; + public static final int isFriend = 0x00200; + public static final int isConst = 0x00400; + public static final int isVolatile = 0x00800; + public static final int isUnsigned = 0x01000; + public static final int isShort = 0x02000; + public static final int isLong = 0x04000; + public static final int isForward = 0x08000; + public static final int isComplex = 0x10000; + public static final int isImaginary= 0x20000; + public static final int isLongLong = 0x40000; + public static final int isSigned = 0x80000; // Types (maximum type is typeMask // Note that these should be considered ordered and if you change @@ -248,14 +248,14 @@ public class TypeInfo { // Convenience methods public void setBit(boolean b, int mask){ if( b ){ - _typeInfo = _typeInfo | mask; + _typeBits = _typeBits | mask; } else { - _typeInfo = _typeInfo & ~mask; + _typeBits = _typeBits & ~mask; } } public boolean checkBit(int mask){ - return (_typeInfo & mask) != 0; + return (_typeBits & mask) != 0; } public void setType( TypeInfo.eType t){ @@ -271,11 +271,11 @@ public class TypeInfo { } public int getTypeInfo(){ - return _typeInfo; + return _typeBits; } public void setTypeInfo( int typeInfo ){ - _typeInfo = typeInfo; + _typeBits = typeInfo; } public eType getTemplateParameterType(){ @@ -320,13 +320,10 @@ public class TypeInfo { } public boolean hasPtrOperators(){ - return ( _ptrOperators != null && _ptrOperators.size() > 0 ); + return _ptrOperators.size() > 0; } public List getPtrOperators(){ - if( _ptrOperators == null ){ - _ptrOperators = new LinkedList(); - } return _ptrOperators; } @@ -353,9 +350,6 @@ public class TypeInfo { } public List getOperatorExpressions(){ - if( _operatorExpressions == null ){ - _operatorExpressions = new LinkedList(); - } return _operatorExpressions; } @@ -365,10 +359,9 @@ public class TypeInfo { return; int size = ops.size(); - Iterator iter = ops.iterator(); OperatorExpression op = null; - for( int i = size; i > 0; i-- ){ - op = (OperatorExpression)iter.next(); + for( int i = 0; i < size; i++ ){ + op = (OperatorExpression)ops.get(i); if( op == OperatorExpression.indirection || op == OperatorExpression.subscript ) { @@ -393,24 +386,37 @@ public class TypeInfo { } public void addPtrOperator( TypeInfo.PtrOp ptr ){ - if( _ptrOperators == null ){ - _ptrOperators = new LinkedList(); + if( _ptrOperators == Collections.EMPTY_LIST ){ + _ptrOperators = new ArrayList(4); } if( ptr != null ) _ptrOperators.add( ptr ); } public void addPtrOperator( List ptrs ){ - if( _ptrOperators == null ){ - _ptrOperators = new LinkedList(); + if( ptrs == null || ptrs.size() == 0 ) + return; + + if( _ptrOperators == Collections.EMPTY_LIST ){ + _ptrOperators = new ArrayList( ptrs.size() ); } - if( ptrs != null ) - _ptrOperators.addAll( ptrs ); + + int size = ptrs.size(); + for( int i = 0; i < size; i++ ){ + _ptrOperators.add( ptrs.get( i ) ); + } + } + + public void preparePtrOperators(int numPtrOps) { + if( _ptrOperators == Collections.EMPTY_LIST ) + _ptrOperators = new ArrayList( numPtrOps ); + else + ((ArrayList) _ptrOperators).ensureCapacity( numPtrOps ); } public void addOperatorExpression( OperatorExpression exp ){ - if( _operatorExpressions == null ){ - _operatorExpressions = new LinkedList(); + if( _operatorExpressions == Collections.EMPTY_LIST ){ + _operatorExpressions = new ArrayList(4); } _operatorExpressions.add( exp ); } @@ -461,7 +467,7 @@ public class TypeInfo { TypeInfo type = (TypeInfo)t; - boolean result = ( _typeInfo == type._typeInfo ); + boolean result = ( _typeBits == type._typeBits ); result &= ( _type == type._type ); if( _typeDeclaration != null && type._typeDeclaration != null ){ @@ -499,17 +505,14 @@ public class TypeInfo { result &= ( _typeDeclaration == type._typeDeclaration ); } - int size1 = (_ptrOperators == null) ? 0 : _ptrOperators.size(); - int size2 = (type._ptrOperators == null) ? 0 : type._ptrOperators.size(); + int size1 = _ptrOperators.size(); + int size2 = type._ptrOperators.size(); if( size1 == size2 ){ if( size1 != 0 ){ - Iterator iter1 = _ptrOperators.iterator(); - Iterator iter2 = type._ptrOperators.iterator(); - TypeInfo.PtrOp op1 = null, op2 = null; - for( int i = size1; i > 0; i-- ){ - op1 = (TypeInfo.PtrOp)iter1.next(); - op2 = (TypeInfo.PtrOp)iter2.next(); + for( int i = 0; i < size1; i++ ){ + op1 = (TypeInfo.PtrOp)_ptrOperators.get(i); + op2 = (TypeInfo.PtrOp)type._ptrOperators.get(i); if( !op1.equals(op2) ){ return false; @@ -530,14 +533,13 @@ public class TypeInfo { return TypeInfo._image[ getType().toInt() ]; } - private int _typeInfo = 0; + private int _typeBits = 0; private eType _type = TypeInfo.t_undef; private eType _templateParameterType = t_typeName; private ISymbol _typeDeclaration; private boolean _hasDefaultValue = false; private Object _defaultValue = null; - private LinkedList _ptrOperators; - private LinkedList _operatorExpressions; - + private List _ptrOperators = Collections.EMPTY_LIST; + private List _operatorExpressions = Collections.EMPTY_LIST; } \ No newline at end of file