Skip to content
This repository has been archived by the owner on Jan 7, 2020. It is now read-only.

Commit

Permalink
fixed class invariant check on return statement with assignment
Browse files Browse the repository at this point in the history
  • Loading branch information
andresteingress committed May 9, 2011
1 parent 73e8e48 commit 8cf2baa
Showing 1 changed file with 14 additions and 1 deletion.
Expand Up @@ -23,11 +23,15 @@
package org.gcontracts.generation;

import org.codehaus.groovy.ast.ClassCodeVisitorSupport;
import org.codehaus.groovy.ast.ClassHelper;
import org.codehaus.groovy.ast.MethodNode;
import org.codehaus.groovy.ast.expr.BooleanExpression;
import org.codehaus.groovy.ast.expr.DeclarationExpression;
import org.codehaus.groovy.ast.expr.VariableExpression;
import org.codehaus.groovy.ast.stmt.*;
import org.codehaus.groovy.control.SourceUnit;
import org.codehaus.groovy.syntax.Token;
import org.codehaus.groovy.syntax.Types;

import java.util.ArrayList;
import java.util.List;
Expand Down Expand Up @@ -237,8 +241,17 @@ public void visitBlockStatement(BlockStatement block) {
if (statement == returnStatement) {
blockStatement.getStatements().remove(statement);

final VariableExpression $_gc_result = new VariableExpression("$_gc_result", ClassHelper.DYNAMIC_TYPE);
blockStatement.addStatement(new ExpressionStatement(
new DeclarationExpression($_gc_result, Token.newSymbol(Types.ASSIGN, -1, -1), returnStatement.getExpression())
));

blockStatement.addStatement(assertionCallStatement);
blockStatement.addStatement(returnStatement);

ReturnStatement gcResultReturn = new ReturnStatement($_gc_result);
gcResultReturn.setSourcePosition(returnStatement);

blockStatement.addStatement(gcResultReturn);
return; // we found the return statement under target, let's cancel tree traversal
}
}
Expand Down

0 comments on commit 8cf2baa

Please sign in to comment.