From 58d2390a65854d27c3cd819017c77cb9a2636111 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Mon, 21 Jun 2004 20:24:36 +0000 Subject: [PATCH] Cached SimpleTypeSpecifiers in the CompleteParseASTFactory. Reduced parse footprint by a couple of MB. --- .../parser/tests/CompleteParseASTTest.java | 20 +++++--------- .../ast/complete/ASTSimpleTypeSpecifier.java | 3 ++- .../ast/complete/CompleteParseASTFactory.java | 27 +++++++++++++------ .../internal/core/parser/pst/BasicSymbol.java | 13 ++++++++- 4 files changed, 40 insertions(+), 23 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java index 697859db679..2ccc3a12c82 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java @@ -792,20 +792,14 @@ public class CompleteParseASTTest extends CompleteParseBaseTest */ public void testBug43373() throws Exception { - try { // This is to prove that there are no exceptions - // Used to cause AST Semantic exception - Iterator i = parse( "class A { static int x; }; int A::x = 5;" ).getDeclarations(); //$NON-NLS-1$ - IASTClassSpecifier classA = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier(); - Iterator j = getDeclarations(classA); - IASTField field1 = (IASTField) j.next(); + Iterator i = parse( "class A { static int x; }; int A::x = 5;" ).getDeclarations(); //$NON-NLS-1$ + IASTClassSpecifier classA = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier(); + Iterator j = getDeclarations(classA); + IASTField field1 = (IASTField) j.next(); // Note : this used to be considered a variable, not a field - IASTField field2 = (IASTField)i.next(); - assertTrue (field1.getVisiblity() == field2.getVisiblity()); - assertAllReferences( 1, createTaskList( new Task( classA ))); - - }catch (Exception e){ - fail(); - } + IASTField field2 = (IASTField)i.next(); + assertTrue (field1.getVisiblity() == field2.getVisiblity()); + assertAllReferences( 1, createTaskList( new Task( classA ))); } public void testBug39504() throws Exception diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTSimpleTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTSimpleTypeSpecifier.java index a06af473423..e90e4d091a2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTSimpleTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTSimpleTypeSpecifier.java @@ -10,6 +10,7 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser.ast.complete; +import java.util.Collections; import java.util.List; import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier; @@ -122,7 +123,7 @@ public class ASTSimpleTypeSpecifier extends ASTNode implements IASTSimpleTypeSpe public List getReferences() { - return refs; + return (refs == null ) ? Collections.EMPTY_LIST : refs; } /* (non-Javadoc) 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 636b49015ac..11eab183308 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 @@ -124,6 +124,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto private final ReferenceCache cache = new ReferenceCache(); private static final int BUILTIN_TYPE_SIZE = 64; private final Hashtable typeIdCache = new Hashtable( BUILTIN_TYPE_SIZE ); + private final Hashtable simpleTypeSpecCache = new Hashtable( BUILTIN_TYPE_SIZE ); + private static final int DEFAULT_QUALIFIEDNAME_REFERENCE_SIZE = 4; static { @@ -1956,6 +1958,14 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto { if( extension.overrideCreateSimpleTypeSpecifierMethod( kind )) return extension.createSimpleTypeSpecifier(pst, scope, kind, typeName, isShort, isLong, isSigned, isUnsigned, isTypename, isComplex, isImaginary, isGlobal, extensionParms ); + String typeNameAsString = typeName.toString(); + if( kind != Type.CLASS_OR_TYPENAME ) + { + IASTSimpleTypeSpecifier query = (IASTSimpleTypeSpecifier) simpleTypeSpecCache.get( typeNameAsString ); + if( query != null ) + return query; + } + TypeInfo.eType type = null; if( kind == IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME ) @@ -1975,7 +1985,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto else if( kind == IASTSimpleTypeSpecifier.Type._BOOL ) type = TypeInfo.t__Bool; - List references = new ArrayList(); + List references = ( kind == Type.CLASS_OR_TYPENAME ) ? new ArrayList( DEFAULT_QUALIFIEDNAME_REFERENCE_SIZE ): null; ISymbol s = pst.newSymbol( EMPTY_STRING, type ); if( kind == IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME ) { @@ -2047,7 +2057,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto s.getTypeInfo().setBit( isImaginary, TypeInfo.isImaginary ); s.getTypeInfo().setBit( isSigned, TypeInfo.isSigned ); - return new ASTSimpleTypeSpecifier( s, false, typeName.toString(), references ); + IASTSimpleTypeSpecifier result = new ASTSimpleTypeSpecifier( s, false, typeNameAsString, references ); + if( kind != Type.CLASS_OR_TYPENAME ) + simpleTypeSpecCache.put( typeNameAsString, result ); + return result; } /* (non-Javadoc) @@ -3001,16 +3014,14 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto } symbol = template; } else { - symbol = pst.newSymbol( identifier, TypeInfo.t_templateParameter ); + if( kind == ParamKind.CLASS || kind == ParamKind.TYPENAME ){ + symbol = pst.newSymbol( identifier, TypeInfo.t_templateParameter ); symbol.getTypeInfo().setTemplateParameterType( TypeInfo.t_typeName ); } else /*ParamKind.PARAMETER*/ { - symbol.setName( parameter.getName() ); - symbol.setTypeInfo( ((ASTSimpleTypeSpecifier)parameter.getTypeSpecifier()).getSymbol().getTypeInfo() ); + symbol = cloneSimpleTypeSymbol( parameter.getName(), parameter, null ); symbol.getTypeInfo().setTemplateParameterType( symbol.getType() ); - symbol.setType( TypeInfo.t_templateParameter ); - - setPointerOperators( symbol, parameter.getPointerOperators(), parameter.getArrayModifiers() ); + symbol.setType( TypeInfo.t_templateParameter ); } } 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 52827a08543..813ebbd3d9f 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 @@ -177,5 +177,16 @@ public class BasicSymbol extends ExtensibleSymbol implements ISymbol private boolean _isInvisible = false; //used by friend declarations (11.4-9) private boolean _isTemplateMember = false; - private ISymbol _instantiatedSymbol = null; + private ISymbol _instantiatedSymbol = null; + + + /* (non-Javadoc) + * @see java.lang.Object#clone() + */ + public Object clone() { + + BasicSymbol s = (BasicSymbol) super.clone(); + s._typeInfo = new TypeInfo( s._typeInfo ); + return s; + } }