package com.liferay.ide.gradle.core.parser;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.codehaus.groovy.ast.CodeVisitorSupport;
import org.codehaus.groovy.ast.expr.ArgumentListExpression;
import org.codehaus.groovy.ast.expr.ClosureExpression;
import org.codehaus.groovy.ast.expr.ConstantExpression;
import org.codehaus.groovy.ast.expr.Expression;
import org.codehaus.groovy.ast.expr.MapEntryExpression;
import org.codehaus.groovy.ast.expr.MapExpression;
import org.codehaus.groovy.ast.expr.MethodCallExpression;
/**
* @author Lovett Li
*/
public class FindDependenciesVisitor extends CodeVisitorSupport
{
private int dependenceLineNum = -1;
private int columnNum = -1;
private List<GradleDependency> dependencies = new ArrayList<>();
@Override
public void visitMethodCallExpression( MethodCallExpression call )
{
if( !( call.getMethodAsString().equals( "buildscript" ) ) )
{
if( call.getMethodAsString().equals( "dependencies" ) )
{
if( dependenceLineNum == -1 )
{
dependenceLineNum = call.getLastLineNumber();
}
}
super.visitMethodCallExpression( call );
}
}
@Override
public void visitArgumentlistExpression( ArgumentListExpression ale )
{
List<Expression> expressions = ale.getExpressions();
if( expressions.size() == 1 && expressions.get( 0 ) instanceof ConstantExpression )
{
String depStr = expressions.get( 0 ).getText();
String[] deps = depStr.split( ":" );
if( deps.length == 3 )
{
dependencies.add( new GradleDependency( deps[0], deps[1], deps[2] ) );
}
}
super.visitArgumentlistExpression( ale );
}
@Override
public void visitClosureExpression( ClosureExpression expression )
{
if( dependenceLineNum != -1 && expression.getLineNumber() == expression.getLastLineNumber() )
{
columnNum = expression.getLastColumnNumber();
}
super.visitClosureExpression( expression );
}
@Override
public void visitMapExpression( MapExpression expression )
{
List<MapEntryExpression> mapEntryExpressions = expression.getMapEntryExpressions();
Map<String, String> dependenceMap = new HashMap<String, String>();
for( MapEntryExpression mapEntryExpression : mapEntryExpressions )
{
String key = mapEntryExpression.getKeyExpression().getText();
String value = mapEntryExpression.getValueExpression().getText();
dependenceMap.put( key, value );
}
dependencies.add( new GradleDependency( dependenceMap ) );
super.visitMapExpression( expression );
}
public int getDependenceLineNum()
{
return dependenceLineNum;
}
public int getColumnNum()
{
return columnNum;
}
public List<GradleDependency> getDependencies()
{
return dependencies;
}
}