From cde38382c038f349226a020d5f40df26fca7bb2f Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Sun, 22 Apr 2012 18:49:43 +0400 Subject: [PATCH] Fixed processing function type parameters in override/implement members. #KT-1603 fixed --- .../OverrideImplementMethodsHandler.java | 50 ++++++++++++++++--- .../functionWithTypeParameters.kt | 7 +++ .../functionWithTypeParameters.kt.after | 13 +++++ .../codeInsight/OverrideImplementTest.java | 4 ++ 4 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 idea/testData/codeInsight/overrideImplement/functionWithTypeParameters.kt create mode 100644 idea/testData/codeInsight/overrideImplement/functionWithTypeParameters.kt.after diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java index b82bc360996..f010af51727 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java @@ -24,6 +24,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; @@ -33,15 +34,13 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.plugin.project.WholeProjectAnalyzerFacade; import org.jetbrains.jet.plugin.quickfix.ImportInsertHelper; import org.jetbrains.jet.resolve.DescriptorRenderer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; /** * @author yole @@ -145,7 +144,40 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns private static JetElement overrideFunction(Project project, JetFile file, SimpleFunctionDescriptor descriptor) { StringBuilder bodyBuilder = new StringBuilder(); bodyBuilder.append(displayableVisibility(descriptor)); - bodyBuilder.append("override fun ").append(descriptor.getName()).append("("); + bodyBuilder.append("override fun "); + + List whereRestrictions = new ArrayList(); + if (!descriptor.getTypeParameters().isEmpty()) { + bodyBuilder.append("<"); + boolean first = true; + for (TypeParameterDescriptor param : descriptor.getTypeParameters()) { + if (!first) { + bodyBuilder.append(", "); + } + + bodyBuilder.append(param.getName()); + Set upperBounds = param.getUpperBounds(); + if (!upperBounds.isEmpty()) { + boolean firstUpperBound = true; + for (JetType upperBound : upperBounds) { + String upperBoundText = " : " + DescriptorRenderer.TEXT.renderTypeWithShortNames(upperBound); + if (upperBound != JetStandardClasses.getDefaultBound()) { + if (firstUpperBound) { + bodyBuilder.append(upperBoundText); + } else { + whereRestrictions.add(param.getName() + upperBoundText); + } + } + ImportInsertHelper.addImportDirectivesIfNeeded(upperBound, file); + firstUpperBound = false; + } + } + + first = false; + } + bodyBuilder.append("> "); + } + bodyBuilder.append(descriptor.getName()).append("("); boolean isAbstractFun = descriptor.getModality() == Modality.ABSTRACT; StringBuilder delegationBuilder = new StringBuilder(); if (isAbstractFun) { @@ -166,7 +198,7 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns first = false; bodyBuilder.append(parameterDescriptor.getName()); bodyBuilder.append(" : "); - bodyBuilder.append(DescriptorRenderer.COMPACT.renderTypeWithShortNames(parameterDescriptor.getType())); + bodyBuilder.append(DescriptorRenderer.TEXT.renderTypeWithShortNames(parameterDescriptor.getType())); ImportInsertHelper.addImportDirectivesIfNeeded(parameterDescriptor.getType(), file); @@ -183,10 +215,12 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns boolean returnsNotUnit = returnType != null && !stdlib.getTuple0Type().equals(returnType); if (returnsNotUnit) { - bodyBuilder.append(" : ").append(DescriptorRenderer.COMPACT.renderTypeWithShortNames(returnType)); + bodyBuilder.append(" : ").append(DescriptorRenderer.TEXT.renderTypeWithShortNames(returnType)); ImportInsertHelper.addImportDirectivesIfNeeded(returnType, file); } - + if (!whereRestrictions.isEmpty()) { + bodyBuilder.append("\n").append("where ").append(StringUtil.join(whereRestrictions, ", ")); + } bodyBuilder.append("{").append(returnsNotUnit && !isAbstractFun ? "return " : "").append(delegationBuilder.toString()).append("}"); return JetPsiFactory.createFunction(project, bodyBuilder.toString()); diff --git a/idea/testData/codeInsight/overrideImplement/functionWithTypeParameters.kt b/idea/testData/codeInsight/overrideImplement/functionWithTypeParameters.kt new file mode 100644 index 00000000000..699f1b7034a --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/functionWithTypeParameters.kt @@ -0,0 +1,7 @@ +trait Trait { + fun > foo() where B : Cloneable, B : Comparable; +} + +class TraitImpl : Trait { + +} \ No newline at end of file diff --git a/idea/testData/codeInsight/overrideImplement/functionWithTypeParameters.kt.after b/idea/testData/codeInsight/overrideImplement/functionWithTypeParameters.kt.after new file mode 100644 index 00000000000..eaf92a65bb1 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/functionWithTypeParameters.kt.after @@ -0,0 +1,13 @@ +import java.util.Map + +trait Trait { + fun > foo() where B : Cloneable, B : Comparable; +} + +class TraitImpl : Trait { + + override fun > foo() + where B : Cloneable, B : Comparable { + throw UnsupportedOperationException() + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java index eb35f51df8f..fadfbc34b22 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java @@ -58,6 +58,10 @@ public class OverrideImplementTest extends LightCodeInsightFixtureTestCase { doImplementFileTest(); } + public void testFunctionWithTypeParameters() { + doImplementFileTest(); + } + public void testJavaInterfaceMethod() { doImplementDirectoryTest(); }