From 03d8731b439714c327d1343c296313fd4cb7de29 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Fri, 18 Jun 2004 18:54:00 +0000 Subject: [PATCH] Added caching of type ID's in completeparse mode. --- .../tests/CompleteParseASTExpressionTest.java | 6 ++-- .../parser/tests/CompleteParseASTTest.java | 19 +++++++++---- .../eclipse/cdt/core/parser/ast/ASTUtil.java | 22 +++++++-------- .../core/parser/ExpressionParser.java | 28 +++++++++++-------- .../ast/complete/CompleteParseASTFactory.java | 11 ++++++++ 5 files changed, 56 insertions(+), 30 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java index 9c063a351cc..58ad016501c 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTExpressionTest.java @@ -384,7 +384,7 @@ public class CompleteParseASTExpressionTest extends CompleteParseBaseTest{ } // Kind POSTFIX_REINTERPRET_CAST public void testPostfixReinterpretCast() throws Exception{ - Iterator i = parse( "int *a; \n int foo(); int foo( double* ); \n int x = foo( reinterpret_cast(a) );").getDeclarations(); //$NON-NLS-1$ + Iterator i = parse( "int *a; \n int foo(); int foo( double* ); \n int x = foo( reinterpret_cast(a) );").getDeclarations(); //$NON-NLS-1$ IASTVariable a = (IASTVariable) i.next(); IASTFunction f1 = (IASTFunction) i.next(); IASTFunction f2 = (IASTFunction) i.next(); @@ -393,7 +393,7 @@ public class CompleteParseASTExpressionTest extends CompleteParseBaseTest{ assertAllReferences( 2, createTaskList( new Task(a), new Task(f2))); IASTExpression exp = x.getInitializerClause().getAssigmentExpression(); - assertEquals( exp.toString(), "foo(reinterpret_cast(a))" ); //$NON-NLS-1$ + assertEquals( exp.toString(), "foo(reinterpret_cast(a))" ); //$NON-NLS-1$ } // Kind POSTFIX_STATIC_CAST public void testPostfixStaticCast() throws Exception{ @@ -419,7 +419,7 @@ public class CompleteParseASTExpressionTest extends CompleteParseBaseTest{ assertAllReferences( 2, createTaskList( new Task(a), new Task(f2))); IASTExpression exp = x.getInitializerClause().getAssigmentExpression(); - assertEquals( exp.toString(), "foo(const_cast(&a))" ); //$NON-NLS-1$ + assertEquals( exp.toString(), "foo(const_cast(&a))" ); //$NON-NLS-1$ } // Kind POSTFIX_TYPEID_EXPRESSION : LHS public void testPostfixTypeIdExpression() throws Exception{ 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 7117f00aacb..697859db679 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 @@ -39,6 +39,7 @@ import org.eclipse.cdt.core.parser.ast.IASTReference; import org.eclipse.cdt.core.parser.ast.IASTScope; import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier; import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration; +import org.eclipse.cdt.core.parser.ast.IASTTypeId; import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration; import org.eclipse.cdt.core.parser.ast.IASTUsingDeclaration; import org.eclipse.cdt.core.parser.ast.IASTUsingDirective; @@ -1563,7 +1564,7 @@ public class CompleteParseASTTest extends CompleteParseBaseTest assertFalse( i.hasNext() ); IASTExpression exp = a.getInitializerClause().getAssigmentExpression(); assertEquals( exp.getExpressionKind(), IASTGCCExpression.Kind.UNARY_ALIGNOF_TYPEID ); - assertEquals( exp.toString(), "__alignof__(int)"); + assertEquals( exp.toString(), "__alignof__(int)"); //$NON-NLS-1$ } public void testBug39684() throws Exception @@ -1597,14 +1598,14 @@ public class CompleteParseASTTest extends CompleteParseBaseTest Iterator i = parse("int c = a ? b;").getDeclarations(); //$NON-NLS-1$ IASTVariable c = (IASTVariable) i.next(); IASTExpression exp = c.getInitializerClause().getAssigmentExpression(); - assertEquals( ASTUtil.getExpressionString( exp ), "a >? b" ); + assertEquals( ASTUtil.getExpressionString( exp ), "a >? b" ); //$NON-NLS-1$ } public void testULong() throws Exception @@ -1951,8 +1952,8 @@ public class CompleteParseASTTest extends CompleteParseBaseTest public void testBug67680() throws Exception { Writer writer = new StringWriter(); - writer.write( "template < class T> class Base {}; \n" ); - writer.write( "class Derived : public Base, Base, foo {}; \n" ); + writer.write( "template < class T> class Base {}; \n" ); //$NON-NLS-1$ + writer.write( "class Derived : public Base, Base, foo {}; \n" ); //$NON-NLS-1$ Iterator i = parse( writer.toString(), false ).getDeclarations(); @@ -1967,4 +1968,12 @@ public class CompleteParseASTTest extends CompleteParseBaseTest assertEquals( parent.getParentClassSpecifier(), base ); } + + public void testTypeIDSignature() throws Exception + { + IASTVariable v = (IASTVariable) parse( "int * v = (int*)0;").getDeclarations().next(); + IASTTypeId typeId = v.getInitializerClause().getAssigmentExpression().getTypeId(); + assertEquals( typeId.getFullSignature(), "int *"); //$NON-NLS-1$ + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/ASTUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/ASTUtil.java index 3937088bb65..82975cb8f2d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/ASTUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/ASTUtil.java @@ -254,17 +254,17 @@ public class ASTUtil { } type.append( id.getFullSignature() ); - Iterator i = id.getPointerOperators(); - while(i.hasNext()){ - ASTPointerOperator po = (ASTPointerOperator) i.next(); - type.append(getPointerOperator(po)); - } - - i = id.getArrayModifiers(); - while (i.hasNext()){ - i.next(); - type.append("[]"); //$NON-NLS-1$ - } +// Iterator i = id.getPointerOperators(); +// while(i.hasNext()){ +// ASTPointerOperator po = (ASTPointerOperator) i.next(); +// type.append(getPointerOperator(po)); +// } +// +// i = id.getArrayModifiers(); +// while (i.hasNext()){ +// i.next(); +// type.append("[]"); //$NON-NLS-1$ +// } return type.toString(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java index 559640fe65c..8af69573c6b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java @@ -632,9 +632,10 @@ public class ExpressionParser implements IExpressionParser, IParserData { return result; } - protected void consumeArrayModifiers(IDeclarator d, IASTScope scope) + protected IToken consumeArrayModifiers(IDeclarator d, IASTScope scope) throws EndOfFileException, BacktrackException { int startingOffset = LA(1).getOffset(); + IToken last = null; while (LT(1) == IToken.tLBRACKET) { consume(IToken.tLBRACKET); // eat the '[' @@ -644,7 +645,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { CompletionKind.SINGLE_NAME_REFERENCE, KeywordSetKey.EXPRESSION); } - consume(IToken.tRBRACKET); + last = consume(IToken.tRBRACKET); IASTArrayModifier arrayMod = null; try { arrayMod = astFactory.createArrayModifier(exp); @@ -654,6 +655,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { } d.addArrayModifier(arrayMod); } + return last; } protected void operatorId(Declarator d, IToken originalToken, @@ -1615,27 +1617,31 @@ public class ExpressionParser implements IExpressionParser, IParserData { TypeId id = getTypeIdInstance(scope); IToken last = lastToken; + IToken temp = last; //template parameters are consumed as part of name //lastToken = consumeTemplateParameters( last ); //if( lastToken == null ) lastToken = last; - consumePointerOperators(id); - if (lastToken == null) - lastToken = last; + temp = consumePointerOperators(id); + if (temp != null) + last = temp; if (!skipArrayModifiers) { - last = lastToken; - consumeArrayModifiers(id, scope); - if (lastToken == null) - lastToken = last; + temp = consumeArrayModifiers(id, scope); + if (temp != null) + last = temp; } try { String signature = "";//$NON-NLS-1$ - if (lastToken != null) + if (last != null) + { + if( lastToken == null ) + lastToken = last; signature = TokenFactory.createStringRepresentation(mark, - lastToken); + last); + } return astFactory.createTypeId(scope, kind, isConst, isVolatile, isShort, isLong, isSigned, isUnsigned, isTypename, name, id .getPointerOperators(), id.getArrayModifiers(), 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 aa16bffa498..a626b37f435 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 @@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.parser.ast.complete; import java.util.ArrayList; +import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -121,6 +122,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto private final IFilenameProvider fileProvider; private final ParserMode mode; private final ReferenceCache cache = new ReferenceCache(); + private static final int BUILTIN_TYPE_SIZE = 64; + private final Hashtable typeIdCache = new Hashtable( BUILTIN_TYPE_SIZE ); static { @@ -3380,10 +3383,18 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto public IASTTypeId createTypeId(IASTScope scope, Type kind, boolean isConst, boolean isVolatile, boolean isShort, boolean isLong, boolean isSigned, boolean isUnsigned, boolean isTypename, ITokenDuple name, List pointerOps, List arrayMods, String completeSignature) throws ASTSemanticException { + if( kind != Type.CLASS_OR_TYPENAME ) + { + IASTTypeId check = (IASTTypeId) typeIdCache.get( completeSignature ); + if( check != null ) + return check; + } ASTTypeId result = new ASTTypeId( kind, name, pointerOps, arrayMods, completeSignature, isConst, isVolatile, isUnsigned, isSigned, isShort, isLong, isTypename ); result.setTypeSymbol( createSymbolForTypeId( scope, result ) ); + if( kind != Type.CLASS_OR_TYPENAME ) + typeIdCache.put( completeSignature, result ); return result; }