diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/CreateMethodFromUsageFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/CreateMethodFromUsageFix.java index 84dbf01c659..150c07639f8 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/CreateMethodFromUsageFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/CreateMethodFromUsageFix.java @@ -320,12 +320,13 @@ public class CreateMethodFromUsageFix extends CreateFromUsageFixBase { * A sort-of dummy Expression for parameter lists, to allow us to update the parameter list as the user makes selections. */ private static class TypeParameterListExpression extends Expression { - private final String[] ownerTypeParameterNames; - private final Map typeParameterMap; + private final TypeParameterDescriptor[] typeParametersFromReceiverType; + private final Map typeParameterMap; - public TypeParameterListExpression(@NotNull String[] ownerTypeParameterNames, @NotNull Map typeParameterMap) { - this.ownerTypeParameterNames = ownerTypeParameterNames; - this.typeParameterMap = typeParameterMap; + public TypeParameterListExpression(@NotNull TypeParameterDescriptor[] typeParametersFromReceiverType, + @NotNull Map typeParametersMap) { + this.typeParametersFromReceiverType = typeParametersFromReceiverType; + this.typeParameterMap = typeParametersMap; } @NotNull @@ -343,24 +344,29 @@ public class CreateMethodFromUsageFix extends CreateFromUsageFixBase { assert func != null; List parameters = func.getValueParameters(); - List typeParameterNames = new ArrayList(); - Collections.addAll(typeParameterNames, ownerTypeParameterNames); + Set typeParameters = new LinkedHashSet(); + Collections.addAll(typeParameters, typeParametersFromReceiverType); for (JetParameter parameter : parameters) { JetTypeReference parameterTypeRef = parameter.getTypeReference(); assert parameterTypeRef != null; - String[] names = typeParameterMap.get(parameterTypeRef.getText()); - if (names != null) { - Collections.addAll(typeParameterNames, names); + TypeParameterDescriptor[] typeParametersFromParameter = typeParameterMap.get(parameterTypeRef.getText()); + if (typeParametersFromParameter != null) { + Collections.addAll(typeParameters, typeParametersFromParameter); } } JetTypeReference returnTypeRef = func.getReturnTypeRef(); if (returnTypeRef != null) { - String[] names = typeParameterMap.get(returnTypeRef.getText()); - if (names != null) { - Collections.addAll(typeParameterNames, names); + TypeParameterDescriptor[] typeParametersFromReturnType = typeParameterMap.get(returnTypeRef.getText()); + if (typeParametersFromReturnType != null) { + Collections.addAll(typeParameters, typeParametersFromReturnType); } } + List typeParameterNames = new ArrayList(); + for (TypeParameterDescriptor typeParameter : typeParameters) { + typeParameterNames.add(typeParameter.getName().getIdentifier()); + } + // make sure there are no name conflicts for (int i = 0; i < typeParameterNames.size(); i++) { String name = typeParameterNames.get(i); @@ -565,9 +571,6 @@ public class CreateMethodFromUsageFix extends CreateFromUsageFixBase { JetParameterList parameterList = func.getValueParameterList(); assert parameterList != null; - BindingContext containingFileContext = currentFile.equals(containingFile) - ? currentFileContext - : AnalyzerFacadeWithCache.analyzeFileWithCache(containingFile).getBindingContext(); JetScope scope; if (isExtension) { NamespaceDescriptor namespaceDescriptor = currentFileContext.get(BindingContext.FILE_TO_NAMESPACE, containingFile); @@ -731,9 +734,9 @@ public class CreateMethodFromUsageFix extends CreateFromUsageFixBase { @Nullable TypeExpression returnTypeExpression, @NotNull JetScope scope ) { - Map typeParameterMap = new HashMap(); + Map typeParameterMap = new HashMap(); Set receiverTypeParameters = getTypeParametersInType(receiverType); - String[] ownerTypeParameterNames = getTypeParameterNamesNotInScope(receiverTypeParameters, scope); + TypeParameterDescriptor[] receiverTypeParametersNotInScope = getTypeParameterNamesNotInScope(receiverTypeParameters, scope); for (TypeExpression parameterTypeExpression : parameterTypeExpressions) { JetType[] parameterTypeOptions = parameterTypeExpression.getOptions(); String[] parameterTypeOptionStrings = parameterTypeExpression.getOptionStrings(); @@ -757,7 +760,7 @@ public class CreateMethodFromUsageFix extends CreateFromUsageFixBase { } builder.replaceElement(func, TextRange.create(3, 3), TYPE_PARAMETER_LIST_VARIABLE_NAME, null, false); // ((3, 3) is after "fun") - return new TypeParameterListExpression(ownerTypeParameterNames, typeParameterMap); + return new TypeParameterListExpression(receiverTypeParametersNotInScope, typeParameterMap); } private TypeExpression[] setupParameterTypeTemplates(@NotNull Project project, @NotNull TemplateBuilder builder, @@ -863,25 +866,28 @@ public class CreateMethodFromUsageFix extends CreateFromUsageFixBase { } @NotNull - private static String renderTypeShort(JetType type) { + private static String renderTypeShort(@NotNull JetType type) { return DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(type); } @NotNull - private static String renderTypeLong(JetType type) { + private static String renderTypeLong(@NotNull JetType type) { return DescriptorRenderer.TEXT.renderType(type); } @NotNull - private static String[] getTypeParameterNamesNotInScope(Collection typeParameters, JetScope scope) { - List typeParameterNames = new ArrayList(); + private static TypeParameterDescriptor[] getTypeParameterNamesNotInScope( + @NotNull Collection typeParameters, + @NotNull JetScope scope + ) { + List typeParameterNames = new ArrayList(); for (TypeParameterDescriptor typeParameter : typeParameters) { ClassifierDescriptor classifier = scope.getClassifier(typeParameter.getName()); if (classifier == null || !classifier.equals(typeParameter)) { - typeParameterNames.add(typeParameter.getName().getIdentifier()); + typeParameterNames.add(typeParameter); } } - return ArrayUtil.toStringArray(typeParameterNames); + return typeParameterNames.toArray(new TypeParameterDescriptor[typeParameterNames.size()]); } @NotNull