use of org.codehaus.groovy.ast.stmt.ExpressionStatement in project spock by spockframework.
the class SpecialMethodCall method isMatch.
public boolean isMatch(Statement stat) {
ExpressionStatement exprStat = ObjectUtil.asInstance(stat, ExpressionStatement.class);
if (exprStat == null)
return false;
Expression expr = exprStat.getExpression();
return expr == binaryExpr || expr == methodCallExpr;
}
use of org.codehaus.groovy.ast.stmt.ExpressionStatement in project spock by spockframework.
the class ExpressionInfoBuilder method build.
public ExpressionInfo build() {
try {
SourceUnit unit = SourceUnit.create("Spec expression", adjustedText);
unit.parse();
unit.completePhase();
unit.convert();
BlockStatement blockStat = unit.getAST().getStatementBlock();
Assert.that(blockStat != null && blockStat.getStatements().size() == 1);
Statement stat = blockStat.getStatements().get(0);
Assert.that(stat instanceof ExpressionStatement);
Expression expr = ((ExpressionStatement) stat).getExpression();
ExpressionInfo exprInfo = new ExpressionInfoConverter(lines).convert(expr);
// IDEA: rest of this method could be moved to ExpressionInfoConverter (but: might make EIC less testable)
// IDEA: could make ExpressionInfo immutable
List<ExpressionInfo> inPostfixOrder = exprInfo.inPostfixOrder(false);
for (int variableNumber = 0; variableNumber < inPostfixOrder.size(); variableNumber++) {
ExpressionInfo info = inPostfixOrder.get(variableNumber);
info.setText(findText(info.getRegion()));
if (notRecordedVarNumberBecauseOfException != null && variableNumber == notRecordedVarNumberBecauseOfException) {
info.setValue(exception);
} else if (values.size() > variableNumber) {
//we have this value
info.setValue(values.get(variableNumber));
} else {
info.setValue(ExpressionInfo.VALUE_NOT_AVAILABLE);
}
if (startPos.getLineIndex() > 0)
info.shiftVertically(startPos.getLineIndex());
}
return exprInfo;
} catch (Throwable t) {
final ExpressionInfo expressionInfo = new ExpressionInfo(TextRegion.create(TextPosition.create(1, 1), TextPosition.create(1, 1)), TextPosition.create(1, 1), null);
expressionInfo.setText(text);
expressionInfo.setValue(lastOrNull(values));
return expressionInfo;
}
}
use of org.codehaus.groovy.ast.stmt.ExpressionStatement in project spock by spockframework.
the class AbstractDeepBlockRewriter method visitExpressionStatement.
@Override
public final void visitExpressionStatement(ExpressionStatement stat) {
ExpressionStatement oldExpressionStatement = currExprStat;
currExprStat = stat;
try {
doVisitExpressionStatement(stat);
} finally {
currExprStat = oldExpressionStatement;
}
}
use of org.codehaus.groovy.ast.stmt.ExpressionStatement in project gradle by gradle.
the class AstUtils method extractBareMethodCall.
@Nullable
public static MethodCallExpression extractBareMethodCall(Statement statement) {
if (!(statement instanceof ExpressionStatement)) {
return null;
}
ExpressionStatement expressionStatement = (ExpressionStatement) statement;
if (!(expressionStatement.getExpression() instanceof MethodCallExpression)) {
return null;
}
MethodCallExpression methodCall = (MethodCallExpression) expressionStatement.getExpression();
if (!targetIsThis(methodCall)) {
return null;
}
return methodCall;
}
use of org.codehaus.groovy.ast.stmt.ExpressionStatement in project groovy-core by groovy.
the class ClosureWriter method createClosureClass.
protected ClassNode createClosureClass(ClosureExpression expression, int mods) {
ClassNode classNode = controller.getClassNode();
ClassNode outerClass = controller.getOutermostClass();
MethodNode methodNode = controller.getMethodNode();
String name = classNode.getName() + "$" + // add a more informative name
controller.getContext().getNextClosureInnerName(outerClass, classNode, methodNode);
boolean staticMethodOrInStaticClass = controller.isStaticMethod() || classNode.isStaticClass();
Parameter[] parameters = expression.getParameters();
if (parameters == null) {
parameters = Parameter.EMPTY_ARRAY;
} else if (parameters.length == 0) {
// let's create a default 'it' parameter
Parameter it = new Parameter(ClassHelper.OBJECT_TYPE, "it", ConstantExpression.NULL);
parameters = new Parameter[] { it };
Variable ref = expression.getVariableScope().getDeclaredVariable("it");
if (ref != null)
it.setClosureSharedVariable(ref.isClosureSharedVariable());
}
Parameter[] localVariableParams = getClosureSharedVariables(expression);
removeInitialValues(localVariableParams);
InnerClassNode answer = new InnerClassNode(classNode, name, mods, ClassHelper.CLOSURE_TYPE.getPlainNodeReference());
answer.setEnclosingMethod(controller.getMethodNode());
answer.setSynthetic(true);
answer.setUsingGenerics(outerClass.isUsingGenerics());
answer.setSourcePosition(expression);
if (staticMethodOrInStaticClass) {
answer.setStaticClass(true);
}
if (controller.isInScriptBody()) {
answer.setScriptBody(true);
}
MethodNode method = answer.addMethod("doCall", ACC_PUBLIC, ClassHelper.OBJECT_TYPE, parameters, ClassNode.EMPTY_ARRAY, expression.getCode());
method.setSourcePosition(expression);
VariableScope varScope = expression.getVariableScope();
if (varScope == null) {
throw new RuntimeException("Must have a VariableScope by now! for expression: " + expression + " class: " + name);
} else {
method.setVariableScope(varScope.copy());
}
if (parameters.length > 1 || (parameters.length == 1 && parameters[0].getType() != null && parameters[0].getType() != ClassHelper.OBJECT_TYPE && !ClassHelper.OBJECT_TYPE.equals(parameters[0].getType().getComponentType()))) {
// let's add a typesafe call method
MethodNode call = answer.addMethod("call", ACC_PUBLIC, ClassHelper.OBJECT_TYPE, parameters, ClassNode.EMPTY_ARRAY, new ReturnStatement(new MethodCallExpression(VariableExpression.THIS_EXPRESSION, "doCall", new ArgumentListExpression(parameters))));
call.setSourcePosition(expression);
}
// let's make the constructor
BlockStatement block = new BlockStatement();
// this block does not get a source position, because we don't
// want this synthetic constructor to show up in corbertura reports
VariableExpression outer = new VariableExpression("_outerInstance");
outer.setSourcePosition(expression);
block.getVariableScope().putReferencedLocalVariable(outer);
VariableExpression thisObject = new VariableExpression("_thisObject");
thisObject.setSourcePosition(expression);
block.getVariableScope().putReferencedLocalVariable(thisObject);
TupleExpression conArgs = new TupleExpression(outer, thisObject);
block.addStatement(new ExpressionStatement(new ConstructorCallExpression(ClassNode.SUPER, conArgs)));
// let's assign all the parameter fields from the outer context
for (Parameter param : localVariableParams) {
String paramName = param.getName();
ClassNode type = param.getType();
if (true) {
VariableExpression initialValue = new VariableExpression(paramName);
initialValue.setAccessedVariable(param);
initialValue.setUseReferenceDirectly(true);
ClassNode realType = type;
type = ClassHelper.makeReference();
param.setType(ClassHelper.makeReference());
FieldNode paramField = answer.addField(paramName, ACC_PRIVATE | ACC_SYNTHETIC, type, initialValue);
paramField.setOriginType(ClassHelper.getWrapper(param.getOriginType()));
paramField.setHolder(true);
String methodName = Verifier.capitalize(paramName);
// let's add a getter & setter
Expression fieldExp = new FieldExpression(paramField);
answer.addMethod("get" + methodName, ACC_PUBLIC, realType.getPlainNodeReference(), Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, new ReturnStatement(fieldExp));
}
}
Parameter[] params = new Parameter[2 + localVariableParams.length];
params[0] = new Parameter(ClassHelper.OBJECT_TYPE, "_outerInstance");
params[1] = new Parameter(ClassHelper.OBJECT_TYPE, "_thisObject");
System.arraycopy(localVariableParams, 0, params, 2, localVariableParams.length);
ASTNode sn = answer.addConstructor(ACC_PUBLIC, params, ClassNode.EMPTY_ARRAY, block);
sn.setSourcePosition(expression);
correctAccessedVariable(answer, expression);
return answer;
}
Aggregations