package org.projectusus.metrics;
import java.util.List;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.DoStatement;
import org.eclipse.jdt.core.dom.EnhancedForStatement;
import org.eclipse.jdt.core.dom.ForStatement;
import org.eclipse.jdt.core.dom.IfStatement;
import org.eclipse.jdt.core.dom.Initializer;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.SwitchStatement;
import org.eclipse.jdt.core.dom.WhileStatement;
import org.projectusus.core.basis.MetricsResults;
import org.projectusus.core.metrics.MetricsCollector;
public class MLCollector extends MetricsCollector {
private Counter statementCount = new Counter();
@Override
public boolean visit( MethodDeclaration node ) {
init( node );
return true;
}
@Override
public boolean visit( Initializer node ) {
init( node );
return true;
}
@Override
public void endVisit( MethodDeclaration node ) {
commit( node );
}
@Override
public void endVisit( Initializer node ) {
commit( node );
}
@Override
public boolean visit( Block node ) {
calculate( node.statements().size() );
return true;
}
@Override
public boolean visit( IfStatement node ) {
calculate( countNonBlock( node.getThenStatement() ) + countNonBlock( node.getElseStatement() ) );
return true;
}
@Override
public boolean visit( EnhancedForStatement node ) {
calculate( countNonBlock( node.getBody() ) );
return true;
}
@Override
public boolean visit( ForStatement node ) {
calculate( countNonBlock( node.getBody() ) );
return true;
}
@Override
public boolean visit( DoStatement node ) {
calculate( countNonBlock( node.getBody() ) );
return true;
}
@Override
public boolean visit( WhileStatement node ) {
calculate( countNonBlock( node.getBody() ) );
return true;
}
@Override
public boolean visit( SwitchStatement node ) {
calculate( countNonBlocks( node.statements() ) );
return true;
}
private int countNonBlocks( List<?> statements ) {
int count = 0;
for( Object stmt : statements ) {
count += countNonBlock( stmt );
}
return count;
}
private int countNonBlock( Object stmt ) {
return (stmt instanceof Block) ? 0 : 1;
}
public void init( @SuppressWarnings( "unused" ) MethodDeclaration node ) {
statementCount.startNewCount();
}
public void init( @SuppressWarnings( "unused" ) Initializer node ) {
statementCount.startNewCount();
}
public void calculate( int count ) {
statementCount.increaseLastCountBy( count );
}
public void commit( MethodDeclaration node ) {
int count = statementCount.getAndClearCount();
getMetricsWriter().putData( getFile(), node, MetricsResults.ML, count );
}
public void commit( Initializer node ) {
int count = statementCount.getAndClearCount();
getMetricsWriter().putData( getFile(), node, MetricsResults.ML, count );
}
}