-
Notifications
You must be signed in to change notification settings - Fork 470
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add BlockListener support... #1575
base: master
Are you sure you want to change the base?
Changes from all commits
5ea59a5
cc16dda
818f362
d3cf3da
68fd3bf
9a3fef4
ad3d442
5f321ec
ce7d36e
753a778
1efce7c
5b03edc
ccc712e
f4a3f29
878c8ff
cd30bcf
abb8a90
5a78a05
73bb879
55138de
bd9e694
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -46,6 +46,7 @@ public class AstNodeCache { | |||||
public final ClassNode SpecificationContext = ClassHelper.makeWithoutCaching(SpecificationContext.class); | ||||||
public final ClassNode DataVariableMultiplication = ClassHelper.makeWithoutCaching(DataVariableMultiplication.class); | ||||||
public final ClassNode DataVariableMultiplicationFactor = ClassHelper.makeWithoutCaching(DataVariableMultiplicationFactor.class); | ||||||
public final ClassNode BlockInfo = ClassHelper.makeWithoutCaching(BlockInfo.class); | ||||||
|
||||||
public final MethodNode SpecInternals_GetSpecificationContext = | ||||||
SpecInternals.getDeclaredMethods(Identifiers.GET_SPECIFICATION_CONTEXT).get(0); | ||||||
|
@@ -71,6 +72,12 @@ public class AstNodeCache { | |||||
public final MethodNode SpockRuntime_DespreadList = | ||||||
SpockRuntime.getDeclaredMethods(org.spockframework.runtime.SpockRuntime.DESPREAD_LIST).get(0); | ||||||
|
||||||
public final MethodNode SpockRuntime_CallEnterBlock = | ||||||
SpockRuntime.getDeclaredMethods(org.spockframework.runtime.SpockRuntime.CALL_ENTER_BLOCK).get(0); | ||||||
|
||||||
public final MethodNode SpockRuntime_CallExitBlock = | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Rename if method gets renamed |
||||||
SpockRuntime.getDeclaredMethods(org.spockframework.runtime.SpockRuntime.CALL_EXIT_BLOCK).get(0); | ||||||
|
||||||
public final MethodNode ValueRecorder_Reset = | ||||||
ValueRecorder.getDeclaredMethods(org.spockframework.runtime.ValueRecorder.RESET).get(0); | ||||||
|
||||||
|
@@ -107,6 +114,12 @@ public class AstNodeCache { | |||||
public final MethodNode SpecificationContext_GetSharedInstance = | ||||||
SpecificationContext.getDeclaredMethods(org.spockframework.runtime.SpecificationContext.GET_SHARED_INSTANCE).get(0); | ||||||
|
||||||
public final MethodNode SpecificationContext_GetBlockCurrentBlock = | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
SpecificationContext.getDeclaredMethods(org.spockframework.runtime.SpecificationContext.GET_CURRENT_BLOCK).get(0); | ||||||
|
||||||
public final MethodNode SpecificationContext_SetBlockCurrentBlock = | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
SpecificationContext.getDeclaredMethods(org.spockframework.runtime.SpecificationContext.SET_CURRENT_BLOCK).get(0); | ||||||
|
||||||
public final MethodNode List_Get = | ||||||
ClassHelper.LIST_TYPE.getDeclaredMethods("get").get(0); | ||||||
|
||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,6 +17,7 @@ | |
package org.spockframework.compiler; | ||
|
||
import org.codehaus.groovy.syntax.Token; | ||
import org.codehaus.groovy.syntax.Types; | ||
import org.spockframework.lang.Wildcard; | ||
import org.spockframework.util.*; | ||
import spock.lang.Specification; | ||
|
@@ -390,4 +391,18 @@ | |
public static ConstantExpression primitiveConstExpression(boolean value) { | ||
return new ConstantExpression(value, true); | ||
} | ||
|
||
public static BinaryExpression createVariableIsNotNullExpression(VariableExpression var) { | ||
return new BinaryExpression( | ||
new VariableExpression(var), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we need to create a new |
||
Token.newSymbol(Types.COMPARE_NOT_EQUAL, -1, -1), | ||
new ConstantExpression(null)); | ||
} | ||
|
||
public static BinaryExpression createVariableIsNullExpression(VariableExpression var) { | ||
leonard84 marked this conversation as resolved.
Show resolved
Hide resolved
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is it intended that this unused method is added for some future use or is it a left-over from being used at some point? |
||
return new BinaryExpression( | ||
new VariableExpression(var), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we need to create a new |
||
Token.newSymbol(Types.COMPARE_EQUAL, -1, -1), | ||
new ConstantExpression(null)); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -200,6 +200,12 @@ private void buildBlocks(Method method) throws InvalidSpecCompileException { | |||||
checkIsValidSuccessor(method, BlockParseInfo.METHOD_END, | ||||||
method.getAst().getLastLineNumber(), method.getAst().getLastColumnNumber()); | ||||||
|
||||||
// set the block metaData index for each block this must be equal to the index of the block in the @BlockMetadata annotation | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
int i = -1; | ||||||
for (Block block : method.getBlocks()) { | ||||||
if(!block.hasBlockMetadata()) continue; | ||||||
block.setBlockMetaDataIndex(++i); | ||||||
} | ||||||
// now that statements have been copied to blocks, the original statement | ||||||
// list is cleared; statements will be copied back after rewriting is done | ||||||
stats.clear(); | ||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -16,19 +16,24 @@ | |||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
package org.spockframework.compiler; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
import org.spockframework.compiler.model.*; | ||||||||||||||||||||||||||||||||||||||||||
import org.spockframework.runtime.SpockException; | ||||||||||||||||||||||||||||||||||||||||||
import org.spockframework.util.*; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
import java.lang.reflect.InvocationTargetException; | ||||||||||||||||||||||||||||||||||||||||||
import java.util.*; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
import org.codehaus.groovy.ast.*; | ||||||||||||||||||||||||||||||||||||||||||
import org.codehaus.groovy.ast.expr.*; | ||||||||||||||||||||||||||||||||||||||||||
import org.codehaus.groovy.ast.stmt.*; | ||||||||||||||||||||||||||||||||||||||||||
import org.codehaus.groovy.runtime.MetaClassHelper; | ||||||||||||||||||||||||||||||||||||||||||
import org.codehaus.groovy.syntax.*; | ||||||||||||||||||||||||||||||||||||||||||
import org.codehaus.groovy.syntax.Token; | ||||||||||||||||||||||||||||||||||||||||||
import org.codehaus.groovy.syntax.Types; | ||||||||||||||||||||||||||||||||||||||||||
import org.jetbrains.annotations.NotNull; | ||||||||||||||||||||||||||||||||||||||||||
import org.objectweb.asm.Opcodes; | ||||||||||||||||||||||||||||||||||||||||||
import org.spockframework.compiler.model.*; | ||||||||||||||||||||||||||||||||||||||||||
import org.spockframework.runtime.SpockException; | ||||||||||||||||||||||||||||||||||||||||||
import org.spockframework.util.InternalIdentifiers; | ||||||||||||||||||||||||||||||||||||||||||
import org.spockframework.util.ObjectUtil; | ||||||||||||||||||||||||||||||||||||||||||
import org.spockframework.util.ReflectionUtil; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
import java.lang.reflect.InvocationTargetException; | ||||||||||||||||||||||||||||||||||||||||||
import java.util.ArrayList; | ||||||||||||||||||||||||||||||||||||||||||
import java.util.Iterator; | ||||||||||||||||||||||||||||||||||||||||||
import java.util.List; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
import static java.util.Arrays.asList; | ||||||||||||||||||||||||||||||||||||||||||
import static java.util.Collections.singletonList; | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -159,7 +164,7 @@ private void createFinalFieldGetter(Field field) { | |||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
private void createSharedFieldSetter(Field field) { | ||||||||||||||||||||||||||||||||||||||||||
String setterName = "set" + MetaClassHelper.capitalize(field.getName()); | ||||||||||||||||||||||||||||||||||||||||||
Parameter[] params = new Parameter[] { new Parameter(field.getAst().getType(), "$spock_value") }; | ||||||||||||||||||||||||||||||||||||||||||
Parameter[] params = new Parameter[] { new Parameter(field.getAst().getType(), SpockNames.SPOCK_VALUE) }; | ||||||||||||||||||||||||||||||||||||||||||
MethodNode setter = spec.getAst().getMethod(setterName, params); | ||||||||||||||||||||||||||||||||||||||||||
if (setter != null) { | ||||||||||||||||||||||||||||||||||||||||||
errorReporter.error(field.getAst(), | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -180,7 +185,7 @@ private void createSharedFieldSetter(Field field) { | |||||||||||||||||||||||||||||||||||||||||
// use internal name | ||||||||||||||||||||||||||||||||||||||||||
new ConstantExpression(field.getAst().getName())), | ||||||||||||||||||||||||||||||||||||||||||
Token.newSymbol(Types.ASSIGN, -1, -1), | ||||||||||||||||||||||||||||||||||||||||||
new VariableExpression("$spock_value")))); | ||||||||||||||||||||||||||||||||||||||||||
new VariableExpression(SpockNames.SPOCK_VALUE)))); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
setter.setSourcePosition(field.getAst()); | ||||||||||||||||||||||||||||||||||||||||||
spec.getAst().addMethod(setter); | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -390,13 +395,20 @@ private void handleWhereBlock(Method method) { | |||||||||||||||||||||||||||||||||||||||||
public void visitMethodAgain(Method method) { | ||||||||||||||||||||||||||||||||||||||||||
this.block = null; | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
if (!movedStatsBackToMethod) | ||||||||||||||||||||||||||||||||||||||||||
for (Block b : method.getBlocks()) | ||||||||||||||||||||||||||||||||||||||||||
if (!movedStatsBackToMethod) { | ||||||||||||||||||||||||||||||||||||||||||
for (Block b : method.getBlocks()) { | ||||||||||||||||||||||||||||||||||||||||||
// This will only run if there was no 'cleanup' block in the method. | ||||||||||||||||||||||||||||||||||||||||||
// Otherwise, the blocks have already been copied to try block by visitCleanupBlock. | ||||||||||||||||||||||||||||||||||||||||||
// We need to run as late as possible, so we'll have to do the handling here and in visitCleanupBlock. | ||||||||||||||||||||||||||||||||||||||||||
addBlockListeners(b); | ||||||||||||||||||||||||||||||||||||||||||
method.getStatements().addAll(b.getAst()); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
leonard84 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// for global required interactions | ||||||||||||||||||||||||||||||||||||||||||
if (method instanceof FeatureMethod) | ||||||||||||||||||||||||||||||||||||||||||
if (method instanceof FeatureMethod) { | ||||||||||||||||||||||||||||||||||||||||||
method.getStatements().add(createMockControllerCall(nodeCache.MockController_LeaveScope)); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
if (methodHasCondition) { | ||||||||||||||||||||||||||||||||||||||||||
defineValueRecorder(method.getStatements(), ""); | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -406,6 +418,63 @@ public void visitMethodAgain(Method method) { | |||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
private void addBlockListeners(Block block) { | ||||||||||||||||||||||||||||||||||||||||||
BlockParseInfo blockType = block.getParseInfo(); | ||||||||||||||||||||||||||||||||||||||||||
if (blockType == BlockParseInfo.WHERE | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is |
||||||||||||||||||||||||||||||||||||||||||
|| blockType == BlockParseInfo.METHOD_END | ||||||||||||||||||||||||||||||||||||||||||
|| blockType == BlockParseInfo.COMBINED | ||||||||||||||||||||||||||||||||||||||||||
|| blockType == BlockParseInfo.ANONYMOUS) return; | ||||||||||||||||||||||||||||||||||||||||||
leonard84 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// SpockRuntime.enterBlock(getSpecificationContext(), new BlockInfo(blockKind, blockMetaDataIndex)) | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
or maybe |
||||||||||||||||||||||||||||||||||||||||||
MethodCallExpression enterBlockCall = createBlockListenerCall(block, blockType, nodeCache.SpockRuntime_CallEnterBlock); | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||||||||||||||||||||||||||||||||||||||
// SpockRuntime.exitedBlock(getSpecificationContext(), new BlockInfo(blockKind, blockMetaDataIndex)) | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
or maybe |
||||||||||||||||||||||||||||||||||||||||||
MethodCallExpression exitBlockCall = createBlockListenerCall(block, blockType, nodeCache.SpockRuntime_CallExitBlock); | ||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
if (blockType == BlockParseInfo.CLEANUP) { | ||||||||||||||||||||||||||||||||||||||||||
// In case of a cleanup block we need store a reference of the previously `currentBlock` in case that an exception occurred | ||||||||||||||||||||||||||||||||||||||||||
// and restore it at the end of the cleanup block, so that the correct `BlockInfo` is available for the `IErrorContext`. | ||||||||||||||||||||||||||||||||||||||||||
// The restoration happens in the `finally` statement created by `createCleanupTryCatch`. | ||||||||||||||||||||||||||||||||||||||||||
VariableExpression failedBlock = new VariableExpression(SpockNames.FAILED_BLOCK, nodeCache.BlockInfo); | ||||||||||||||||||||||||||||||||||||||||||
block.getAst().addAll(0, asList( | ||||||||||||||||||||||||||||||||||||||||||
ifThrowableIsNotNull(storeFailedBlock(failedBlock)), | ||||||||||||||||||||||||||||||||||||||||||
new ExpressionStatement(enterBlockCall) | ||||||||||||||||||||||||||||||||||||||||||
)); | ||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||
block.getAst().add(0, new ExpressionStatement(enterBlockCall)); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+434
to
+445
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||
block.getAst().add(new ExpressionStatement(exitBlockCall)); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
private @NotNull Statement storeFailedBlock(VariableExpression failedBlock) { | ||||||||||||||||||||||||||||||||||||||||||
MethodCallExpression getCurrentBlock = createDirectMethodCall(getSpecificationContext(), nodeCache.SpecificationContext_GetBlockCurrentBlock, ArgumentListExpression.EMPTY_ARGUMENTS); | ||||||||||||||||||||||||||||||||||||||||||
return new ExpressionStatement(new BinaryExpression(failedBlock, Token.newSymbol(Types.ASSIGN, -1, -1), getCurrentBlock)); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
private @NotNull Statement restoreFailedBlock(VariableExpression failedBlock) { | ||||||||||||||||||||||||||||||||||||||||||
return new ExpressionStatement(createDirectMethodCall(new CastExpression(nodeCache.SpecificationContext, getSpecificationContext()), nodeCache.SpecificationContext_SetBlockCurrentBlock, new ArgumentListExpression(failedBlock))); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
private IfStatement ifThrowableIsNotNull(Statement statement) { | ||||||||||||||||||||||||||||||||||||||||||
return new IfStatement( | ||||||||||||||||||||||||||||||||||||||||||
// if ($spock_feature_throwable != null) | ||||||||||||||||||||||||||||||||||||||||||
new BooleanExpression(AstUtil.createVariableIsNotNullExpression(new VariableExpression(SpockNames.SPOCK_FEATURE_THROWABLE, nodeCache.Throwable))), | ||||||||||||||||||||||||||||||||||||||||||
statement, | ||||||||||||||||||||||||||||||||||||||||||
EmptyStatement.INSTANCE | ||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
private MethodCallExpression createBlockListenerCall(Block block, BlockParseInfo blockType, MethodNode blockListenerMethod) { | ||||||||||||||||||||||||||||||||||||||||||
if (block.getBlockMetaDataIndex() < 0) throw new SpockException("Block metadata index not set: " + block); | ||||||||||||||||||||||||||||||||||||||||||
return createDirectMethodCall( | ||||||||||||||||||||||||||||||||||||||||||
new ClassExpression(nodeCache.SpockRuntime), | ||||||||||||||||||||||||||||||||||||||||||
blockListenerMethod, | ||||||||||||||||||||||||||||||||||||||||||
new ArgumentListExpression( | ||||||||||||||||||||||||||||||||||||||||||
getSpecificationContext(), | ||||||||||||||||||||||||||||||||||||||||||
new ConstantExpression(block.getBlockMetaDataIndex(), true) | ||||||||||||||||||||||||||||||||||||||||||
)); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
@Override | ||||||||||||||||||||||||||||||||||||||||||
public void visitAnyBlock(Block block) { | ||||||||||||||||||||||||||||||||||||||||||
this.block = block; | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -484,12 +553,15 @@ private Statement createMockControllerCall(MethodNode method) { | |||||||||||||||||||||||||||||||||||||||||
@Override | ||||||||||||||||||||||||||||||||||||||||||
public void visitCleanupBlock(CleanupBlock block) { | ||||||||||||||||||||||||||||||||||||||||||
for (Block b : method.getBlocks()) { | ||||||||||||||||||||||||||||||||||||||||||
// call addBlockListeners() here, as this method will already copy the contents of the blocks, | ||||||||||||||||||||||||||||||||||||||||||
// so we need to transform the block listeners here as they won't be copied in visitMethodAgain where we normally add them | ||||||||||||||||||||||||||||||||||||||||||
addBlockListeners(b); | ||||||||||||||||||||||||||||||||||||||||||
if (b == block) break; | ||||||||||||||||||||||||||||||||||||||||||
moveVariableDeclarations(b.getAst(), method.getStatements()); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
VariableExpression featureThrowableVar = | ||||||||||||||||||||||||||||||||||||||||||
new VariableExpression("$spock_feature_throwable", nodeCache.Throwable); | ||||||||||||||||||||||||||||||||||||||||||
new VariableExpression(SpockNames.SPOCK_FEATURE_THROWABLE, nodeCache.Throwable); | ||||||||||||||||||||||||||||||||||||||||||
method.getStatements().add(createVariableDeclarationStatement(featureThrowableVar)); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
List<Statement> featureStats = new ArrayList<>(); | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -499,9 +571,10 @@ public void visitCleanupBlock(CleanupBlock block) { | |||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
CatchStatement featureCatchStat = createThrowableAssignmentAndRethrowCatchStatement(featureThrowableVar); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
List<Statement> cleanupStats = singletonList( | ||||||||||||||||||||||||||||||||||||||||||
createCleanupTryCatch(block, featureThrowableVar)); | ||||||||||||||||||||||||||||||||||||||||||
VariableExpression failedBlock = new VariableExpression(SpockNames.FAILED_BLOCK, nodeCache.BlockInfo); | ||||||||||||||||||||||||||||||||||||||||||
List<Statement> cleanupStats = asList( | ||||||||||||||||||||||||||||||||||||||||||
new ExpressionStatement(new DeclarationExpression(failedBlock, Token.newSymbol(Types.ASSIGN, -1, -1), ConstantExpression.NULL)), | ||||||||||||||||||||||||||||||||||||||||||
createCleanupTryCatch(block, featureThrowableVar, failedBlock)); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
TryCatchStatement tryFinally = | ||||||||||||||||||||||||||||||||||||||||||
new TryCatchStatement( | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -517,13 +590,6 @@ public void visitCleanupBlock(CleanupBlock block) { | |||||||||||||||||||||||||||||||||||||||||
movedStatsBackToMethod = true; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
private BinaryExpression createVariableNotNullExpression(VariableExpression var) { | ||||||||||||||||||||||||||||||||||||||||||
return new BinaryExpression( | ||||||||||||||||||||||||||||||||||||||||||
new VariableExpression(var), | ||||||||||||||||||||||||||||||||||||||||||
Token.newSymbol(Types.COMPARE_NOT_EQUAL, -1, -1), | ||||||||||||||||||||||||||||||||||||||||||
new ConstantExpression(null)); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
private Statement createVariableDeclarationStatement(VariableExpression var) { | ||||||||||||||||||||||||||||||||||||||||||
DeclarationExpression throwableDecl = | ||||||||||||||||||||||||||||||||||||||||||
new DeclarationExpression( | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -534,21 +600,21 @@ private Statement createVariableDeclarationStatement(VariableExpression var) { | |||||||||||||||||||||||||||||||||||||||||
return new ExpressionStatement(throwableDecl); | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
private TryCatchStatement createCleanupTryCatch(CleanupBlock block, VariableExpression featureThrowableVar) { | ||||||||||||||||||||||||||||||||||||||||||
private TryCatchStatement createCleanupTryCatch(CleanupBlock block, VariableExpression featureThrowableVar, VariableExpression failedBlock) { | ||||||||||||||||||||||||||||||||||||||||||
List<Statement> cleanupStats = new ArrayList<>(block.getAst()); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
TryCatchStatement tryCatchStat = | ||||||||||||||||||||||||||||||||||||||||||
new TryCatchStatement( | ||||||||||||||||||||||||||||||||||||||||||
new BlockStatement(cleanupStats, null), | ||||||||||||||||||||||||||||||||||||||||||
EmptyStatement.INSTANCE); | ||||||||||||||||||||||||||||||||||||||||||
ifThrowableIsNotNull(restoreFailedBlock(failedBlock)) | ||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
tryCatchStat.addCatch(createHandleSuppressedThrowableStatement(featureThrowableVar)); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
return tryCatchStat; | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
private CatchStatement createThrowableAssignmentAndRethrowCatchStatement(VariableExpression assignmentVar) { | ||||||||||||||||||||||||||||||||||||||||||
Parameter catchParameter = new Parameter(nodeCache.Throwable, "$spock_tmp_throwable"); | ||||||||||||||||||||||||||||||||||||||||||
Parameter catchParameter = new Parameter(nodeCache.Throwable, SpockNames.SPOCK_TMP_THROWABLE); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BinaryExpression assignThrowableExpr = | ||||||||||||||||||||||||||||||||||||||||||
new BinaryExpression( | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -565,9 +631,9 @@ private CatchStatement createThrowableAssignmentAndRethrowCatchStatement(Variabl | |||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
private CatchStatement createHandleSuppressedThrowableStatement(VariableExpression featureThrowableVar) { | ||||||||||||||||||||||||||||||||||||||||||
Parameter catchParameter = new Parameter(nodeCache.Throwable, "$spock_tmp_throwable"); | ||||||||||||||||||||||||||||||||||||||||||
Parameter catchParameter = new Parameter(nodeCache.Throwable, SpockNames.SPOCK_TMP_THROWABLE); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
BinaryExpression featureThrowableNotNullExpr = createVariableNotNullExpression(featureThrowableVar); | ||||||||||||||||||||||||||||||||||||||||||
BinaryExpression featureThrowableNotNullExpr = AstUtil.createVariableIsNotNullExpression(featureThrowableVar); | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
List<Statement> addSuppressedStats = | ||||||||||||||||||||||||||||||||||||||||||
singletonList(new ExpressionStatement( | ||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,12 @@ | ||
package org.spockframework.compiler; | ||
|
||
public class SpockNames { | ||
public static final String VALUE_RECORDER = "$spock_valueRecorder"; | ||
public static final String ERROR_COLLECTOR = "$spock_errorCollector"; | ||
public static final String FAILED_BLOCK = "$spock_failedBlock"; | ||
public static final String OLD_VALUE = "$spock_oldValue"; | ||
public static final String SPOCK_EX = "$spock_ex"; | ||
public static final String SPOCK_FEATURE_THROWABLE = "$spock_feature_throwable"; | ||
public static final String SPOCK_TMP_THROWABLE = "$spock_tmp_throwable"; | ||
public static final String SPOCK_VALUE = "$spock_value"; | ||
public static final String VALUE_RECORDER = "$spock_valueRecorder"; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rename if method gets renamed