super.visitMethodCallExpression(expression);
Expression arguments = expression.getArguments();
String parent = expression.getMethodAsString();
String parentParent = getParentParent();
if (arguments instanceof ArgumentListExpression) {
ArgumentListExpression ale = (ArgumentListExpression)arguments;
List<Expression> expressions = ale.getExpressions();
if (expressions.size() == 1 &&
expressions.get(0) instanceof ClosureExpression) {
if (isInterestingBlock(parent, parentParent)) {
checkBlock(context, parent, parentParent, expression);
ClosureExpression closureExpression =
(ClosureExpression)expressions.get(0);
Statement block = closureExpression.getCode();
if (block instanceof BlockStatement) {
BlockStatement bs = (BlockStatement)block;
for (Statement statement : bs.getStatements()) {
if (statement instanceof ExpressionStatement) {
ExpressionStatement e = (ExpressionStatement)statement;
if (e.getExpression() instanceof MethodCallExpression) {
checkDslProperty(parent,
(MethodCallExpression)e.getExpression(),
parentParent);
}
} else if (statement instanceof ReturnStatement) {
// Single item in block
ReturnStatement e = (ReturnStatement)statement;
if (e.getExpression() instanceof MethodCallExpression) {
checkDslProperty(parent,
(MethodCallExpression)e.getExpression(),
parentParent);
}
}
}
}
}
}
} else if (arguments instanceof TupleExpression) {
if (isInterestingStatement(parent, parentParent)) {
TupleExpression te = (TupleExpression) arguments;
Map<String, String> namedArguments = Maps.newHashMap();
List<String> unnamedArguments = Lists.newArrayList();
for (Expression subExpr : te.getExpressions()) {
if (subExpr instanceof NamedArgumentListExpression) {
NamedArgumentListExpression nale = (NamedArgumentListExpression) subExpr;
for (MapEntryExpression mae : nale.getMapEntryExpressions()) {
namedArguments.put(mae.getKeyExpression().getText(),
mae.getValueExpression().getText());
}
}
}
checkMethodCall(context, parent, parentParent, namedArguments, unnamedArguments, expression);
}
}
assert !mMethodCallStack.isEmpty();
assert mMethodCallStack.get(mMethodCallStack.size() - 1) == expression;
mMethodCallStack.remove(mMethodCallStack.size() - 1);
}
private String getParentParent() {
for (int i = mMethodCallStack.size() - 2; i >= 0; i--) {
MethodCallExpression expression = mMethodCallStack.get(i);
Expression arguments = expression.getArguments();
if (arguments instanceof ArgumentListExpression) {
ArgumentListExpression ale = (ArgumentListExpression)arguments;
List<Expression> expressions = ale.getExpressions();
if (expressions.size() == 1 &&
expressions.get(0) instanceof ClosureExpression) {
return expression.getMethodAsString();
}
}