package ru.naumen.gintonic.utils;
import java.util.List;
import org.eclipse.jdt.core.dom.*;
import ru.naumen.gintonic.guice.annotations.GuiceClassAnnotation;
import ru.naumen.gintonic.guice.annotations.GuiceNamedAnnotation;
import ru.naumen.gintonic.guice.annotations.IGuiceAnnotation;
public class ExpressionUtils {
public static String getQualifiedTypeName(Expression expression) {
ITypeBinding typeBinding = expression.resolveTypeBinding();
typeBinding = ITypeBindingUtils.removeSurroundingTypeLiteral(typeBinding);
typeBinding = ITypeBindingUtils.removeSurroundingClassType(typeBinding);
String qualifiedName = typeBinding.getQualifiedName();
qualifiedName = StringUtils.translatePrimitiveToWrapper(qualifiedName);
return qualifiedName;
}
/**
* Checks if the expression is a Names.named("jack") and returns the Literal
* value (in this case "jack").
*/
@SuppressWarnings("unchecked")
private static String getNamedLiteralValue(Expression expression) {
if (expression instanceof MethodInvocation) {
MethodInvocation mInvocation = (MethodInvocation) expression;
String methodName = mInvocation.getName().getFullyQualifiedName();
/* annotatedWith(Names.named("jack")) */
if (methodName.equals("named")) {
List<Expression> arguments2 = mInvocation.arguments();
Expression argument = arguments2.get(0);
String namedAnnotation = resolveStringExpression(argument);
if (namedAnnotation == null) {
throw new IllegalArgumentException("Resolved namedAnnotation should not be null");
}
return namedAnnotation;
}
}
return null;
}
private static String resolveStringExpression(Expression argument) {
String namedAnnotation = null;
if (argument instanceof StringLiteral) {
StringLiteral stringLiteral = (StringLiteral) argument;
namedAnnotation = stringLiteral.getLiteralValue();
} else if (argument instanceof SimpleName) {
namedAnnotation = resolveSimpleName((SimpleName) argument);
} else if (argument instanceof QualifiedName) {
namedAnnotation = resolveSimpleName(((QualifiedName) argument).getName());
}
return namedAnnotation;
}
private static String resolveSimpleName(SimpleName argument) {
IVariableBinding variableBinding = ASTNodeUtils.getVariableBinding(argument);
Object constantValue = variableBinding.getConstantValue();
return constantValue == null ? null : constantValue.toString();
}
public static IGuiceAnnotation resolveGuiceAnnotation(Expression expression) {
String literalValue = getNamedLiteralValue(expression);
if (literalValue != null) {
return new GuiceNamedAnnotation(literalValue);
}
String qualifiedTypeName = getQualifiedTypeName(expression);
if (qualifiedTypeName != null) {
return new GuiceClassAnnotation(qualifiedTypeName);
}
return null;
}
}