blob: ad10a9a18d1b65f13d91efa9fc0a413b0a9f3aae [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.performance;
import java.text.NumberFormat;
import java.util.List;
import junit.framework.*;
import org.eclipse.jdt.core.*;
import org.eclipse.jdt.core.dom.*;
import org.eclipse.jdt.core.dom.QualifiedName;
/**
*/
public class FullSourceWorkspaceASTTests extends FullSourceWorkspaceTests {
// Tests counter
private final static int ITERATIONS_COUNT = 10;
int nodesCount = 0;
/**
* @param name
*/
public FullSourceWorkspaceASTTests(String name) {
super(name);
}
public static Test suite() {
return buildSuite(FullSourceWorkspaceASTTests.class);
}
/**
* Comment Mapper visitor
*/
class CommentMapperASTVisitor extends ASTVisitor {
CompilationUnit compilationUnit;
int nodes = 0;
public CommentMapperASTVisitor(CompilationUnit unit) {
this.compilationUnit = unit;
}
protected boolean visitNode(ASTNode node) {
// update counters
this.nodes++;
return true;
}
protected void endVisitNode(ASTNode node) {
// do nothing
}
public boolean visit(AnonymousClassDeclaration node) {
return visitNode(node);
}
public boolean visit(ArrayAccess node) {
return visitNode(node);
}
public boolean visit(ArrayCreation node) {
return visitNode(node);
}
public boolean visit(ArrayInitializer node) {
return visitNode(node);
}
public boolean visit(ArrayType node) {
visitNode(node);
return false;
}
public boolean visit(AssertStatement node) {
return visitNode(node);
}
public boolean visit(Assignment node) {
return visitNode(node);
}
public boolean visit(Block node) {
return visitNode(node);
}
public boolean visit(BooleanLiteral node) {
return visitNode(node);
}
public boolean visit(BreakStatement node) {
return visitNode(node);
}
public boolean visit(CastExpression node) {
return visitNode(node);
}
public boolean visit(CatchClause node) {
return visitNode(node);
}
public boolean visit(CharacterLiteral node) {
return visitNode(node);
}
public boolean visit(ClassInstanceCreation node) {
return visitNode(node);
}
public boolean visit(CompilationUnit node) {
return visitNode(node);
}
public boolean visit(ConditionalExpression node) {
return visitNode(node);
}
public boolean visit(ConstructorInvocation node) {
return visitNode(node);
}
public boolean visit(ContinueStatement node) {
return visitNode(node);
}
public boolean visit(DoStatement node) {
return visitNode(node);
}
public boolean visit(EmptyStatement node) {
return visitNode(node);
}
public boolean visit(ExpressionStatement node) {
return visitNode(node);
}
public boolean visit(FieldAccess node) {
return visitNode(node);
}
public boolean visit(FieldDeclaration node) {
return visitNode(node);
}
public boolean visit(ForStatement node) {
return visitNode(node);
}
public boolean visit(IfStatement node) {
return visitNode(node);
}
public boolean visit(ImportDeclaration node) {
return visitNode(node);
}
public boolean visit(InfixExpression node) {
return visitNode(node);
}
public boolean visit(InstanceofExpression node) {
return visitNode(node);
}
public boolean visit(Initializer node) {
return visitNode(node);
}
public boolean visit(Javadoc node) {
// do not visit Javadoc tags by default. Use constructor with
// boolean to enable.
if (super.visit(node)) { return visitNode(node); }
return false;
}
public boolean visit(LabeledStatement node) {
return visitNode(node);
}
public boolean visit(MethodDeclaration node) {
return visitNode(node);
}
public boolean visit(MethodInvocation node) {
return visitNode(node);
}
public boolean visit(NullLiteral node) {
return visitNode(node);
}
public boolean visit(NumberLiteral node) {
return visitNode(node);
}
public boolean visit(PackageDeclaration node) {
return visitNode(node);
}
public boolean visit(ParenthesizedExpression node) {
return visitNode(node);
}
public boolean visit(PostfixExpression node) {
return visitNode(node);
}
public boolean visit(PrefixExpression node) {
return visitNode(node);
}
public boolean visit(PrimitiveType node) {
return visitNode(node);
}
public boolean visit(QualifiedName node) {
return visitNode(node);
}
public boolean visit(ReturnStatement node) {
return visitNode(node);
}
public boolean visit(SimpleName node) {
return visitNode(node);
}
public boolean visit(SimpleType node) {
return visitNode(node);
}
public boolean visit(StringLiteral node) {
return visitNode(node);
}
public boolean visit(SuperConstructorInvocation node) {
return visitNode(node);
}
public boolean visit(SuperFieldAccess node) {
return visitNode(node);
}
public boolean visit(SuperMethodInvocation node) {
return visitNode(node);
}
public boolean visit(SwitchCase node) {
return visitNode(node);
}
public boolean visit(SwitchStatement node) {
return visitNode(node);
}
public boolean visit(SynchronizedStatement node) {
return visitNode(node);
}
public boolean visit(ThisExpression node) {
return visitNode(node);
}
public boolean visit(ThrowStatement node) {
return visitNode(node);
}
public boolean visit(TryStatement node) {
return visitNode(node);
}
public boolean visit(TypeDeclaration node) {
return visitNode(node);
}
public boolean visit(TypeDeclarationStatement node) {
return visitNode(node);
}
public boolean visit(TypeLiteral node) {
return visitNode(node);
}
public boolean visit(SingleVariableDeclaration node) {
return visitNode(node);
}
public boolean visit(VariableDeclarationExpression node) {
return visitNode(node);
}
public boolean visit(VariableDeclarationStatement node) {
return visitNode(node);
}
public boolean visit(VariableDeclarationFragment node) {
return visitNode(node);
}
public boolean visit(WhileStatement node) {
return visitNode(node);
}
public void endVisit(AnonymousClassDeclaration node) {
endVisitNode(node);
}
public void endVisit(ArrayAccess node) {
endVisitNode(node);
}
public void endVisit(ArrayCreation node) {
endVisitNode(node);
}
public void endVisit(ArrayInitializer node) {
endVisitNode(node);
}
public void endVisit(ArrayType node) {
endVisitNode(node);
}
public void endVisit(AssertStatement node) {
endVisitNode(node);
}
public void endVisit(Assignment node) {
endVisitNode(node);
}
public void endVisit(Block node) {
endVisitNode(node);
}
public void endVisit(BooleanLiteral node) {
endVisitNode(node);
}
public void endVisit(BreakStatement node) {
endVisitNode(node);
}
public void endVisit(CastExpression node) {
endVisitNode(node);
}
public void endVisit(CatchClause node) {
endVisitNode(node);
}
public void endVisit(CharacterLiteral node) {
endVisitNode(node);
}
public void endVisit(ClassInstanceCreation node) {
endVisitNode(node);
}
public void endVisit(CompilationUnit node) {
endVisitNode(node);
}
public void endVisit(ConditionalExpression node) {
endVisitNode(node);
}
public void endVisit(ConstructorInvocation node) {
endVisitNode(node);
}
public void endVisit(ContinueStatement node) {
endVisitNode(node);
}
public void endVisit(DoStatement node) {
endVisitNode(node);
}
public void endVisit(EmptyStatement node) {
endVisitNode(node);
}
public void endVisit(ExpressionStatement node) {
endVisitNode(node);
}
public void endVisit(FieldAccess node) {
endVisitNode(node);
}
public void endVisit(FieldDeclaration node) {
endVisitNode(node);
}
public void endVisit(ForStatement node) {
endVisitNode(node);
}
public void endVisit(IfStatement node) {
endVisitNode(node);
}
public void endVisit(ImportDeclaration node) {
endVisitNode(node);
}
public void endVisit(InfixExpression node) {
endVisitNode(node);
}
public void endVisit(InstanceofExpression node) {
endVisitNode(node);
}
public void endVisit(Initializer node) {
endVisitNode(node);
}
public void endVisit(Javadoc node) {
endVisitNode(node);
}
public void endVisit(LabeledStatement node) {
endVisitNode(node);
}
public void endVisit(MethodDeclaration node) {
endVisitNode(node);
}
public void endVisit(MethodInvocation node) {
endVisitNode(node);
}
public void endVisit(NullLiteral node) {
endVisitNode(node);
}
public void endVisit(NumberLiteral node) {
endVisitNode(node);
}
public void endVisit(PackageDeclaration node) {
endVisitNode(node);
}
public void endVisit(ParenthesizedExpression node) {
endVisitNode(node);
}
public void endVisit(PostfixExpression node) {
endVisitNode(node);
}
public void endVisit(PrefixExpression node) {
endVisitNode(node);
}
public void endVisit(PrimitiveType node) {
endVisitNode(node);
}
public void endVisit(QualifiedName node) {
endVisitNode(node);
}
public void endVisit(ReturnStatement node) {
endVisitNode(node);
}
public void endVisit(SimpleName node) {
endVisitNode(node);
}
public void endVisit(SimpleType node) {
endVisitNode(node);
}
public void endVisit(StringLiteral node) {
endVisitNode(node);
}
public void endVisit(SuperConstructorInvocation node) {
endVisitNode(node);
}
public void endVisit(SuperFieldAccess node) {
endVisitNode(node);
}
public void endVisit(SuperMethodInvocation node) {
endVisitNode(node);
}
public void endVisit(SwitchCase node) {
endVisitNode(node);
}
public void endVisit(SwitchStatement node) {
endVisitNode(node);
}
public void endVisit(SynchronizedStatement node) {
endVisitNode(node);
}
public void endVisit(ThisExpression node) {
endVisitNode(node);
}
public void endVisit(ThrowStatement node) {
endVisitNode(node);
}
public void endVisit(TryStatement node) {
endVisitNode(node);
}
public void endVisit(TypeDeclaration node) {
endVisitNode(node);
}
public void endVisit(TypeDeclarationStatement node) {
endVisitNode(node);
}
public void endVisit(TypeLiteral node) {
endVisitNode(node);
}
public void endVisit(SingleVariableDeclaration node) {
endVisitNode(node);
}
public void endVisit(VariableDeclarationExpression node) {
endVisitNode(node);
}
public void endVisit(VariableDeclarationStatement node) {
endVisitNode(node);
}
public void endVisit(VariableDeclarationFragment node) {
endVisitNode(node);
}
public void endVisit(WhileStatement node) {
endVisitNode(node);
}
}
private void createAST(ICompilationUnit unit) throws JavaModelException {
// Warm up
for (int i = 0; i < 2; i++) {
AST.parseCompilationUnit(unit, false);
}
// Clean memory
runGc();
// Measures
for (int i = 0; i < MEASURES_COUNT; i++) {
ASTNode result = null;
startMeasuring();
for (int j=0; j<ITERATIONS_COUNT; j++) {
result = AST.parseCompilationUnit(unit, false);
}
stopMeasuring();
assertEquals("Wrong type for node"+result, result.getNodeType(), ASTNode.COMPILATION_UNIT);
CompilationUnit compilationUnit = (CompilationUnit) result;
CommentMapperASTVisitor visitor = new CommentMapperASTVisitor(compilationUnit);
compilationUnit.accept(visitor);
nodesCount += visitor.nodes * ITERATIONS_COUNT;
}
// Commit
commitMeasurements();
assertPerformance();
}
public void testDomAstCreationJLS2() throws JavaModelException {
tagAsSummary("DOM>Creation>JLS2", true); // put in fingerprint
ICompilationUnit unit = getCompilationUnit("org.eclipse.jdt.core", "org.eclipse.jdt.internal.compiler.parser", "Parser.java");
createAST(unit);
}
public void testWkspDomAstCreationJLS2() throws JavaModelException {
tagAsSummary("DOM>Creation>JLS2", true); // put in fingerprint
int allExtendedStartPositions = 0;
int allExtendedEndPositions = 0;
int allNodesCount = 0;
startMeasuring();
if (DEBUG) System.out.println("Creating AST hierarchy for all units of projects:");
for (int i = 0; i < ALL_PROJECTS.length; i++) {
// Get project compilation units
if (DEBUG) System.out.print("\t- "+ALL_PROJECTS[i].getElementName());
List units = getProjectCompilationUnits(ALL_PROJECTS[i]);
int size = units.size();
if (size == 0) {
if (DEBUG) System.out.println(": empty!");
continue;
}
List unitsArrays = splitListInSmallArrays(units, 20);
int n = unitsArrays.size();
if (DEBUG)
if (n==1)
System.out.print(": "+size+" units to proceed ("+n+" step): ");
else
System.out.print(": "+size+" units to proceed ("+n+" steps): ");
while (unitsArrays.size() > 0) {
ICompilationUnit[] unitsArray = (ICompilationUnit[]) unitsArrays.remove(0);
if (DEBUG) System.out.print('.');
int length = unitsArray.length;
CompilationUnit[] compilationUnits = new CompilationUnit[length];
// Create AST tree
for (int ptr=0; ptr<length; ptr++) {
ICompilationUnit unit = unitsArray[ptr];
unitsArray[ptr] = null; // release memory handle
ASTNode result = AST.parseCompilationUnit(unit, false);
assertEquals("Wrong type for node"+result, result.getNodeType(), ASTNode.COMPILATION_UNIT);
compilationUnits[ptr] = (CompilationUnit) result;
}
for (int ptr=0; ptr<length; ptr++) {
CommentMapperASTVisitor visitor = new CommentMapperASTVisitor(compilationUnits[ptr]);
compilationUnits[ptr].accept(visitor);
allNodesCount += visitor.nodes;
}
}
if (DEBUG) System.out.println(" done!");
}
stopMeasuring();
commitMeasurements();
assertPerformance();
// Print statistics
System.out.println("-------------------------------------");
System.out.println("DOM/AST creation performance test statistics:");
NumberFormat intFormat = NumberFormat.getIntegerInstance();
System.out.println(" - "+intFormat.format(allNodesCount)+" nodes have been parsed.");
System.out.println("-------------------------------------\n");
}
}