Skip to content

Commit

Permalink
Reuse extractPlaceholders and change error message
Browse files Browse the repository at this point in the history
(cherry picked from commit 795e254)
  • Loading branch information
daniellansun committed May 11, 2018
1 parent 4ba3f82 commit 57cfd2a
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@
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;
Expand Down Expand Up @@ -1093,8 +1092,7 @@ Person foo(B i){...}
Person p = foo(b)
*/

Map<GenericsType, GenericsType> declaringAndActualGenericsTypeMap = makeDeclaringAndActualGenericsTypeMap(declaringClassForDistance, actualReceiverForDistance);
Parameter[] params = makeRawTypes(safeNode.getParameters(), declaringAndActualGenericsTypeMap);
Parameter[] params = makeRawTypes(safeNode.getParameters(), declaringClassForDistance, actualReceiverForDistance);
int dist = measureParametersAndArgumentsDistance(params, safeArgs);
if (dist >= 0) {
dist += getClassDistance(declaringClassForDistance, actualReceiverForDistance);
Expand Down Expand Up @@ -1184,55 +1182,24 @@ private static int getExtensionDistance(boolean isExtensionMethodNode) {
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())) {
private static ClassNode findGenericsTypeByPlaceholderName(String placeholderName, Map<String, GenericsType> placeholderInfo) {
for (Map.Entry<String, GenericsType> entry : placeholderInfo.entrySet()) {
if (placeholderName.equals(entry.getKey())) {
return entry.getValue().getType();
}
}

return null;
}

/**
* 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, ClassNode declaringClassForDistance, ClassNode actualReceiverForDistance) {
Map<String, GenericsType> placeholderInfo = GenericsUtils.extractPlaceholders(GenericsUtils.findParameterizedType(declaringClassForDistance, actualReceiverForDistance));

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 = findActualTypeByGenericsPlaceholderName(oldP.getType().getUnresolvedName(), genericsPlaceholderAndTypeMap);
ClassNode actualType = findGenericsTypeByPlaceholderName(oldP.getType().getUnresolvedName(), placeholderInfo);
Parameter newP = new Parameter(makeRawType(null == actualType ? oldP.getType() : actualType), oldP.getName());
newParam[i] = newP;
}
Expand Down
2 changes: 1 addition & 1 deletion src/test/groovy/transform/stc/GenericsSTCTest.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
shouldFailWithMessages '''
List<String> list = []
list << 1
''', '[Static type checking] - Cannot find matching method java.util.List#leftShift(int)'
''', '[Static type checking] - Cannot call <T> java.util.List <String>#leftShift(T) with arguments [int] '
}

void testAddOnList2UsingLeftShift() {
Expand Down

0 comments on commit 57cfd2a

Please sign in to comment.