You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by jw...@apache.org on 2018/05/26 03:43:21 UTC
[1/2] groovy git commit: Fix NPE if accessed property not a member of
the owning class (closes #724)
Repository: groovy
Updated Branches:
refs/heads/GROOVY_2_6_X 076d31e70 -> 12c2eb6cf
Fix NPE if accessed property not a member of the owning class (closes #724)
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/12c2eb6c
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/12c2eb6c
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/12c2eb6c
Branch: refs/heads/GROOVY_2_6_X
Commit: 12c2eb6cf0c55d9d637d7e04bc1db862a21b878c
Parents: 81351b7
Author: John Wagenleitner <jw...@apache.org>
Authored: Fri May 25 13:16:18 2018 -0700
Committer: John Wagenleitner <jw...@apache.org>
Committed: Fri May 25 20:41:53 2018 -0700
----------------------------------------------------------------------
.../transform/stc/StaticTypeCheckingVisitor.java | 11 +++++++----
.../typing/TypeCheckingExtensionSpecTest.groovy | 19 +++++++++++++++++++
2 files changed, 26 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/12c2eb6c/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 874ec95..d1b3669 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -611,10 +611,13 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
if (vexp.getNodeMetaData(StaticTypesMarker.IMPLICIT_RECEIVER) == null) {
ClassNode owner = (ClassNode) vexp.getNodeMetaData(StaticCompilationMetadataKeys.PROPERTY_OWNER);
if (owner != null) {
- boolean lhsOfEnclosingAssignment = isLHSOfEnclosingAssignment(vexp);
- fieldNode = owner.getField(vexp.getName());
- vexp.setAccessedVariable(fieldNode);
- checkOrMarkPrivateAccess(vexp, fieldNode, lhsOfEnclosingAssignment);
+ FieldNode veFieldNode = owner.getField(vexp.getName());
+ if (veFieldNode != null) {
+ fieldNode = veFieldNode;
+ boolean lhsOfEnclosingAssignment = isLHSOfEnclosingAssignment(vexp);
+ vexp.setAccessedVariable(fieldNode);
+ checkOrMarkPrivateAccess(vexp, fieldNode, lhsOfEnclosingAssignment);
+ }
}
}
}
http://git-wip-us.apache.org/repos/asf/groovy/blob/12c2eb6c/src/spec/test/typing/TypeCheckingExtensionSpecTest.groovy
----------------------------------------------------------------------
diff --git a/src/spec/test/typing/TypeCheckingExtensionSpecTest.groovy b/src/spec/test/typing/TypeCheckingExtensionSpecTest.groovy
index e6b310e..cb1e4fa 100644
--- a/src/spec/test/typing/TypeCheckingExtensionSpecTest.groovy
+++ b/src/spec/test/typing/TypeCheckingExtensionSpecTest.groovy
@@ -587,6 +587,25 @@ new DelegateTest().delegate()
'''
}
+ void testDelegateVariableFromDifferentOwningClass() {
+ assertScript '''
+ @groovy.transform.CompileStatic
+ class A {
+ static private int MAX_LINES = 2
+ static class B {
+ @Delegate
+ private Map<String, Object> delegate = [:]
+ void m(int c) {
+ if (c > MAX_LINES) {
+ return
+ }
+ }
+ }
+ }
+ null
+ '''
+ }
+
private static class SpecSupport {
static int getLongueur(String self) { self.length() }
static int longueur(String self) { self.length() }
[2/2] groovy git commit: Fix parameter matching for parameterized
types
Posted by jw...@apache.org.
Fix parameter matching for parameterized types
Revert of change 57cfd2a3e4d985b3 and fixes issues with Nextflow CI
builds.
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/81351b72
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/81351b72
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/81351b72
Branch: refs/heads/GROOVY_2_6_X
Commit: 81351b72f99e945e677370445d1c3418e08e4a33
Parents: 076d31e
Author: John Wagenleitner <jw...@apache.org>
Authored: Thu May 24 14:59:20 2018 -0700
Committer: John Wagenleitner <jw...@apache.org>
Committed: Fri May 25 20:41:53 2018 -0700
----------------------------------------------------------------------
.../stc/StaticTypeCheckingSupport.java | 52 ++++++++++++++++++--
.../groovy/transform/stc/GenericsSTCTest.groovy | 10 +++-
2 files changed, 57 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/81351b72/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index 0fa1e6c..a69d3d0 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -62,6 +62,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
@@ -1099,7 +1100,8 @@ public abstract class StaticTypeCheckingSupport {
Person p = foo(b)
*/
- Parameter[] params = makeRawTypes(safeNode.getParameters(), declaringClassForDistance, actualReceiverForDistance);
+ Map<GenericsType, GenericsType> declaringAndActualGenericsTypeMap = makeDeclaringAndActualGenericsTypeMap(declaringClassForDistance, actualReceiverForDistance);
+ Parameter[] params = makeRawTypes(safeNode.getParameters(), declaringAndActualGenericsTypeMap);
int dist = measureParametersAndArgumentsDistance(params, safeArgs);
if (dist >= 0) {
dist += getClassDistance(declaringClassForDistance, actualReceiverForDistance);
@@ -1189,20 +1191,62 @@ public abstract class StaticTypeCheckingSupport {
return isExtensionMethodNode ? 0 : 1;
}
+ private static ClassNode findActualTypeByGenericsPlaceholderName(String placeholderName, Map<GenericsType, GenericsType> genericsPlaceholderAndTypeMap) {
+ for (Map.Entry<GenericsType, GenericsType> entry : genericsPlaceholderAndTypeMap.entrySet()) {
+ GenericsType declaringGenericsType = entry.getKey();
+
+ if (placeholderName.equals(declaringGenericsType.getName())) {
+ return entry.getValue().getType();
+ }
+ }
+
+ return null;
+ }
+
public static ClassNode findActualTypeByPlaceholderName(String placeholderName, Map<String, GenericsType> placeholderInfo) {
GenericsType gt = placeholderInfo.get(placeholderName);
return null == gt ? null : gt.getType().redirect();
}
- private static Parameter[] makeRawTypes(Parameter[] params, ClassNode declaringClassForDistance, ClassNode actualReceiverForDistance) {
- Map<String, GenericsType> placeholderInfo = GenericsUtils.extractPlaceholders(GenericsUtils.findParameterizedTypeFromCache(declaringClassForDistance, actualReceiverForDistance));
+ /**
+ * map declaring generics type to actual generics type, e.g. GROOVY-7204:
+ * declaring generics types: T, S extends Serializable
+ * actual generics types : String, Long
+ *
+ * the result map is [
+ * T: String,
+ * S: Long
+ * ]
+ *
+ * The resolved types can not help us to choose methods correctly if the argument is a string: T: Object, S: Serializable
+ * so we need actual types: T: String, S: Long
+ */
+ private static Map<GenericsType, GenericsType> makeDeclaringAndActualGenericsTypeMap(ClassNode declaringClass, ClassNode actualReceiver) {
+ ClassNode parameterizedType = GenericsUtils.findParameterizedType(declaringClass, actualReceiver);
+
+ if (null == parameterizedType) {
+ return Collections.emptyMap();
+ }
+
+ GenericsType[] declaringGenericsTypes = declaringClass.getGenericsTypes();
+ GenericsType[] actualGenericsTypes = parameterizedType.getGenericsTypes();
+
+ Map<GenericsType, GenericsType> result = new LinkedHashMap<>();
+ for (int i = 0, n = declaringGenericsTypes.length; i < n; i++) {
+ result.put(declaringGenericsTypes[i], actualGenericsTypes[i]);
+ }
+
+ return result;
+ }
+
+ private static Parameter[] makeRawTypes(Parameter[] params, Map<GenericsType, GenericsType> genericsPlaceholderAndTypeMap) {
Parameter[] newParam = new Parameter[params.length];
for (int i = 0; i < params.length; i++) {
Parameter oldP = params[i];
- ClassNode actualType = findActualTypeByPlaceholderName(oldP.getType().getUnresolvedName(), placeholderInfo);
+ ClassNode actualType = findActualTypeByGenericsPlaceholderName(oldP.getType().getUnresolvedName(), genericsPlaceholderAndTypeMap);
Parameter newP = new Parameter(makeRawType(null == actualType ? oldP.getType() : actualType), oldP.getName());
newParam[i] = newP;
}
http://git-wip-us.apache.org/repos/asf/groovy/blob/81351b72/src/test/groovy/transform/stc/GenericsSTCTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 4b1055b..69a43a7 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -76,7 +76,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
shouldFailWithMessages '''
List<String> list = []
list << 1
- ''', '[Static type checking] - Cannot call <T> java.util.List <String>#leftShift(T) with arguments [int] '
+ ''', '[Static type checking] - Cannot find matching method java.util.List#leftShift(int)'
}
void testAddOnList2UsingLeftShift() {
@@ -91,6 +91,14 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ void testAddOnListWithParameterizedTypeLeftShift() {
+ assertScript '''
+ class Trie<T> {}
+ List<Trie<String>> list = []
+ list << new Trie<String>()
+ '''
+ }
+
void testAddOnListWithDiamondUsingLeftShift() {
assertScript '''
List<String> list = new LinkedList<>()