You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2017/09/29 13:04:23 UTC
groovy git commit: Revert "GROOVY-8260: Static compilation requires
casting inside instanceof check (handle additional cases)"
Repository: groovy
Updated Branches:
refs/heads/GROOVY_2_5_X aa0782ee6 -> 9a05e869e
Revert "GROOVY-8260: Static compilation requires casting inside instanceof check (handle additional cases)"
This reverts commit caa1e5f6ad55c9456833bb787f69d7d718a2e915.
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/9a05e869
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/9a05e869
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/9a05e869
Branch: refs/heads/GROOVY_2_5_X
Commit: 9a05e869e4fba3f31abf27d7b2b75d85f9c276d8
Parents: aa0782e
Author: paulk <pa...@asert.com.au>
Authored: Fri Sep 29 23:03:58 2017 +1000
Committer: paulk <pa...@asert.com.au>
Committed: Fri Sep 29 23:03:58 2017 +1000
----------------------------------------------------------------------
.../stc/StaticTypeCheckingVisitor.java | 51 ++--------------
.../groovy/transform/stc/MiscSTCTest.groovy | 63 +-------------------
2 files changed, 9 insertions(+), 105 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/9a05e869/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 64c8c2e..1c1d6e4 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -479,30 +479,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
}
}
- if (!(vexp.getAccessedVariable() instanceof DynamicVariable)) {
- VariableExpression variable = null;
- if (vexp.getAccessedVariable() instanceof Parameter) {
- variable = new ParameterVariableExpression((Parameter) vexp.getAccessedVariable());
- } else if (vexp.getAccessedVariable() instanceof VariableExpression) {
- variable = (VariableExpression) vexp.getAccessedVariable();
- }
- if (variable != null) {
- ClassNode inferredType = getInferredTypeFromTempInfo(variable, (ClassNode) variable.getNodeMetaData(StaticTypesMarker.INFERRED_TYPE));
- if (inferredType != null && !inferredType.getName().equals("java.lang.Object")) {
- if (typeCheckingContext.getEnclosingBinaryExpression() != null) {
- // TODO narrow this down to assignment
- if (typeCheckingContext.getEnclosingBinaryExpression().getRightExpression() == vexp) {
- vexp.putNodeMetaData(StaticTypesMarker.INFERRED_TYPE, inferredType);
- }
- } else {
- // stash away type info that will be lost later to handle case
- // where this expression has return added later - piggy back on existing key
- vexp.putNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE, inferredType);
- }
- }
- }
- return;
- }
+ if (! (vexp.getAccessedVariable() instanceof DynamicVariable)) return;
// a dynamic variable is either an undeclared variable
// or a member of a class used in a 'with'
@@ -1858,9 +1835,6 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
if (typeCheckingContext.getEnclosingClosure()!=null) {
return type;
}
- if ((expression instanceof VariableExpression) && hasInferredReturnType(expression)) {
- type = expression.getNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE);
- }
MethodNode enclosingMethod = typeCheckingContext.getEnclosingMethod();
if (enclosingMethod != null && typeCheckingContext.getEnclosingClosure()==null) {
if (!enclosingMethod.isVoidMethod()
@@ -3233,9 +3207,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
int depth = typeCheckingContext.temporaryIfBranchTypeInformation.size();
while (classNodes == null && depth > 0) {
final Map<Object, List<ClassNode>> tempo = typeCheckingContext.temporaryIfBranchTypeInformation.get(--depth);
- Object key = objectExpression instanceof ParameterVariableExpression
- ? ((ParameterVariableExpression) objectExpression).parameter
- : extractTemporaryTypeInfoKey(objectExpression);
+ Object key = extractTemporaryTypeInfoKey(objectExpression);
classNodes = tempo.get(key);
}
return classNodes;
@@ -3423,14 +3395,6 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
typeCheckingContext.popTemporaryTypeInfo();
falseExpression.visit(this);
ClassNode resultType;
- ClassNode typeOfFalse = getType(falseExpression);
- ClassNode typeOfTrue = getType(trueExpression);
- if (hasInferredReturnType(falseExpression)) {
- typeOfFalse = falseExpression.getNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE);
- }
- if (hasInferredReturnType(trueExpression)) {
- typeOfTrue = trueExpression.getNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE);
- }
if (isNullConstant(trueExpression) || isNullConstant(falseExpression)) {
BinaryExpression enclosingBinaryExpression = typeCheckingContext.getEnclosingBinaryExpression();
if (enclosingBinaryExpression != null && enclosingBinaryExpression.getRightExpression()==expression) {
@@ -3438,23 +3402,20 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
} else if (isNullConstant(trueExpression) && isNullConstant(falseExpression)) {
resultType = OBJECT_TYPE;
} else if (isNullConstant(trueExpression)) {
- resultType = wrapTypeIfNecessary(typeOfFalse);
+ resultType = wrapTypeIfNecessary(getType(falseExpression));
} else {
- resultType = wrapTypeIfNecessary(typeOfTrue);
+ resultType = wrapTypeIfNecessary(getType(trueExpression));
}
} else {
// store type information
+ final ClassNode typeOfTrue = getType(trueExpression);
+ final ClassNode typeOfFalse = getType(falseExpression);
resultType = lowestUpperBound(typeOfTrue, typeOfFalse);
}
storeType(expression, resultType);
popAssignmentTracking(oldTracker);
}
- private boolean hasInferredReturnType(Expression expression) {
- ClassNode type = expression.getNodeMetaData(StaticTypesMarker.INFERRED_RETURN_TYPE);
- return type != null && !type.getName().equals("java.lang.Object");
- }
-
@Override
public void visitTryCatchFinally(final TryCatchStatement statement) {
final List<CatchStatement> catchStatements = statement.getCatchStatements();
http://git-wip-us.apache.org/repos/asf/groovy/blob/9a05e869/src/test/groovy/transform/stc/MiscSTCTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/transform/stc/MiscSTCTest.groovy b/src/test/groovy/transform/stc/MiscSTCTest.groovy
index fadac0a..13bdb40 100644
--- a/src/test/groovy/transform/stc/MiscSTCTest.groovy
+++ b/src/test/groovy/transform/stc/MiscSTCTest.groovy
@@ -22,6 +22,8 @@ import org.codehaus.groovy.transform.stc.StaticTypeCheckingVisitor
/**
* Unit tests for static type checking : miscellaneous tests.
+ *
+ * @author Cedric Champeau
*/
class MiscSTCTest extends StaticTypeCheckingTestCase {
@@ -270,67 +272,8 @@ class MiscSTCTest extends StaticTypeCheckingTestCase {
}
}
- static class MiscSTCTestSupport {
+ public static class MiscSTCTestSupport {
static def foo() { '123' }
}
-
- void testTernaryParam() {
- assertScript '''
- Date ternaryParam(Object input) {
- input instanceof Date ? input : null
- }
- def d = new Date()
- assert ternaryParam(42) == null
- assert ternaryParam('foo') == null
- assert ternaryParam(d) == d
- '''
- }
-
- void testTernaryLocalVar() {
- assertScript '''
- Date ternaryLocalVar(Object input) {
- Object copy = input
- copy instanceof Date ? copy : null
- }
- def d = new Date()
- assert ternaryLocalVar(42) == null
- assert ternaryLocalVar('foo') == null
- assert ternaryLocalVar(d) == d
- '''
- }
-
- void testIfThenElseParam() {
- assertScript '''
- Date ifThenElseParam(Object input) {
- if (input instanceof Date) {
- input
- } else {
- null
- }
- }
- def d = new Date()
- assert ifThenElseParam(42) == null
- assert ifThenElseParam('foo') == null
- assert ifThenElseParam(d) == d
- '''
- }
-
- void testIfThenElseLocalVar() {
- assertScript '''
- Date ifThenElseLocalVar(Object input) {
- Date result
- if (input instanceof Date) {
- result = input
- } else {
- result = null
- }
- result
- }
- def d = new Date()
- assert ifThenElseLocalVar(42) == null
- assert ifThenElseLocalVar('foo') == null
- assert ifThenElseLocalVar(d) == d
- '''
- }
}