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:08:00 UTC
[1/3] groovy git commit: Revert "GROOVY-8260: Static compilation
requires casting inside instanceof check (handle additional cases)"
Repository: groovy
Updated Branches:
refs/heads/GROOVY_2_4_X 47b8f5ee7 -> a8bccc944
Revert "GROOVY-8260: Static compilation requires casting inside instanceof check (handle additional cases)"
This reverts commit 47b8f5ee7dad52175bd06f818e77abce616faa77.
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/b672fda7
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/b672fda7
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/b672fda7
Branch: refs/heads/GROOVY_2_4_X
Commit: b672fda79b5622f151aa096389dd3649955f25eb
Parents: 47b8f5e
Author: paulk <pa...@asert.com.au>
Authored: Fri Sep 29 23:05:12 2017 +1000
Committer: paulk <pa...@asert.com.au>
Committed: Fri Sep 29 23:05:12 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/b672fda7/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 6e8dbb7..32c2818 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -470,30 +470,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, 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()
@@ -3209,9 +3183,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;
@@ -3399,14 +3371,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) {
@@ -3414,23 +3378,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/b672fda7/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
- '''
- }
}
[3/3] groovy git commit: minor refactor
Posted by pa...@apache.org.
minor refactor
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/a8bccc94
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/a8bccc94
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/a8bccc94
Branch: refs/heads/GROOVY_2_4_X
Commit: a8bccc944e7532a7efa694f8b1341bacc6df32cb
Parents: 132f8ca
Author: paulk <pa...@asert.com.au>
Authored: Wed Sep 27 22:01:49 2017 +1000
Committer: paulk <pa...@asert.com.au>
Committed: Fri Sep 29 23:05:35 2017 +1000
----------------------------------------------------------------------
.../codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/a8bccc94/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 f986d1b..5872bb8 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1966,7 +1966,7 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
List<ClassNode> classNodes = getTemporaryTypesForExpression(exp);
if (classNodes != null && !classNodes.isEmpty()) {
ArrayList<ClassNode> arr = new ArrayList<ClassNode>(classNodes.size() + 1);
- if (result != null) arr.add(result);
+ if (result != null && !classNodes.contains(result)) arr.add(result);
arr.addAll(classNodes);
// GROOVY-7333: filter out Object
Iterator<ClassNode> iterator = arr.iterator();
[2/3] groovy git commit: minor refactor
Posted by pa...@apache.org.
minor refactor
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/132f8ca1
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/132f8ca1
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/132f8ca1
Branch: refs/heads/GROOVY_2_4_X
Commit: 132f8ca1b8a460c53169d9eee3181c539825b947
Parents: b672fda
Author: paulk <pa...@asert.com.au>
Authored: Wed Sep 27 21:50:52 2017 +1000
Committer: paulk <pa...@asert.com.au>
Committed: Fri Sep 29 23:05:35 2017 +1000
----------------------------------------------------------------------
.../stc/StaticTypeCheckingVisitor.java | 61 ++++++++++----------
1 file changed, 32 insertions(+), 29 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/132f8ca1/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 32c2818..f986d1b 100644
--- a/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1949,40 +1949,43 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
protected ClassNode[] getArgumentTypes(ArgumentListExpression args) {
List<Expression> arglist = args.getExpressions();
ClassNode[] ret = new ClassNode[arglist.size()];
- int i = 0;
+ for (int i = 0; i < arglist.size(); i++) {
+ Expression exp = arglist.get(i);
+ if (isNullConstant(exp)) {
+ ret[i] = UNKNOWN_PARAMETER_TYPE;
+ } else {
+ ret[i] = getInferredTypeFromTempInfo(exp, getType(exp));
+ }
+ }
+ return ret;
+ }
+
+ private ClassNode getInferredTypeFromTempInfo(Expression exp, ClassNode result) {
Map<Object, List<ClassNode>> info = typeCheckingContext.temporaryIfBranchTypeInformation.empty() ? null : typeCheckingContext.temporaryIfBranchTypeInformation.peek();
- for (Expression exp : arglist) {
- if (isNullConstant(exp)) {
- ret[i] = UNKNOWN_PARAMETER_TYPE;
- } else {
- ret[i] = getType(exp);
- if (exp instanceof VariableExpression && info != null) {
- List<ClassNode> classNodes = getTemporaryTypesForExpression(exp);
- if (classNodes != null && !classNodes.isEmpty()) {
- ArrayList<ClassNode> arr = new ArrayList<ClassNode>(classNodes.size() + 1);
- arr.add(ret[i]);
- arr.addAll(classNodes);
- // GROOVY-7333: filter out Object
- Iterator<ClassNode> iterator = arr.iterator();
- while (iterator.hasNext()) {
- ClassNode next = iterator.next();
- if (ClassHelper.OBJECT_TYPE.equals(next)) {
- iterator.remove();
- }
- }
- if (arr.isEmpty()) {
- ret[i] = ClassHelper.OBJECT_TYPE.getPlainNodeReference();
- } else if (arr.size()==1) {
- ret[i] = arr.get(0);
- } else {
- ret[i] = new UnionTypeClassNode(arr.toArray(new ClassNode[arr.size()]));
- }
+ if (exp instanceof VariableExpression && info != null) {
+ List<ClassNode> classNodes = getTemporaryTypesForExpression(exp);
+ if (classNodes != null && !classNodes.isEmpty()) {
+ ArrayList<ClassNode> arr = new ArrayList<ClassNode>(classNodes.size() + 1);
+ if (result != null) arr.add(result);
+ arr.addAll(classNodes);
+ // GROOVY-7333: filter out Object
+ Iterator<ClassNode> iterator = arr.iterator();
+ while (iterator.hasNext()) {
+ ClassNode next = iterator.next();
+ if (ClassHelper.OBJECT_TYPE.equals(next)) {
+ iterator.remove();
}
}
+ if (arr.isEmpty()) {
+ result = ClassHelper.OBJECT_TYPE.getPlainNodeReference();
+ } else if (arr.size()==1) {
+ result = arr.get(0);
+ } else {
+ result = new UnionTypeClassNode(arr.toArray(new ClassNode[arr.size()]));
+ }
}
- i++;
}
- return ret;
+ return result;
}
@Override