From 372106b914b4d9074c694dc9cc452d8f9c4e5a23 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 16 Dec 2013 16:01:51 +0400 Subject: [PATCH] KT-1043 'Implement Methods' throws a ClassCastException #KT-1043 Obsolete --- .../foo/JavaClass.java | 7 +++ .../foo/JavaClass.java.after | 14 ++++++ .../foo/KotlinTrait.kt | 7 +++ .../AbstractOverrideImplementTest.java | 46 +++++++++++++++++-- .../codeInsight/OverrideImplementTest.java | 4 ++ 5 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 idea/testData/codeInsight/overrideImplement/functionFromTraitInJava/foo/JavaClass.java create mode 100644 idea/testData/codeInsight/overrideImplement/functionFromTraitInJava/foo/JavaClass.java.after create mode 100644 idea/testData/codeInsight/overrideImplement/functionFromTraitInJava/foo/KotlinTrait.kt diff --git a/idea/testData/codeInsight/overrideImplement/functionFromTraitInJava/foo/JavaClass.java b/idea/testData/codeInsight/overrideImplement/functionFromTraitInJava/foo/JavaClass.java new file mode 100644 index 00000000000..04592f9f4da --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/functionFromTraitInJava/foo/JavaClass.java @@ -0,0 +1,7 @@ +package foo; + +class JavaClass { + +} + +// KT-1043 'Implement Methods' throws a ClassCastException \ No newline at end of file diff --git a/idea/testData/codeInsight/overrideImplement/functionFromTraitInJava/foo/JavaClass.java.after b/idea/testData/codeInsight/overrideImplement/functionFromTraitInJava/foo/JavaClass.java.after new file mode 100644 index 00000000000..ef80e945355 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/functionFromTraitInJava/foo/JavaClass.java.after @@ -0,0 +1,14 @@ +package foo; + +import org.jetbrains.annotations.NotNull; + +class JavaClass { + + @NotNull + @Override + public void bar(String price) { + + } +} + +// KT-1043 'Implement Methods' throws a ClassCastException \ No newline at end of file diff --git a/idea/testData/codeInsight/overrideImplement/functionFromTraitInJava/foo/KotlinTrait.kt b/idea/testData/codeInsight/overrideImplement/functionFromTraitInJava/foo/KotlinTrait.kt new file mode 100644 index 00000000000..c2f02ffe90b --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/functionFromTraitInJava/foo/KotlinTrait.kt @@ -0,0 +1,7 @@ +package foo + +trait KotlinTrait { + fun bar(price : String?) +} + +// KT-1043 'Implement Methods' throws a ClassCastException \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractOverrideImplementTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractOverrideImplementTest.java index e4f5c4f756c..06064b6e2a6 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractOverrideImplementTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractOverrideImplementTest.java @@ -16,12 +16,20 @@ package org.jetbrains.jet.plugin.codeInsight; +import com.intellij.codeInsight.generation.OverrideImplementUtil; +import com.intellij.codeInsight.generation.PsiMethodMember; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.psi.PsiElement; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.impl.source.PostprocessReformattingAspect; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; +import com.intellij.util.SmartList; +import junit.framework.Assert; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; @@ -67,6 +75,23 @@ public abstract class AbstractOverrideImplementTest extends LightCodeInsightFixt doDirectoryTest(new OverrideMethodsHandler(), memberToImplement); } + protected void doImplementJavaDirectoryTest(String className, String methodName) { + myFixture.copyDirectoryToProject(getTestName(true), ""); + myFixture.configureFromTempProjectFile("foo/JavaClass.java"); + + Project project = myFixture.getProject(); + + PsiClass aClass = JavaPsiFacade.getInstance(project).findClass(className, GlobalSearchScope.allScope(project)); + Assert.assertNotNull("Can't find class: " + className, aClass); + + PsiMethod method = aClass.findMethodsByName(methodName, false)[0]; + Assert.assertNotNull(String.format("Can't find method '%s' in class %s", methodName, className), method); + + generateImplementation(method); + + myFixture.checkResultByFile(getTestName(true) + "/foo/JavaClass.java.after"); + } + private void doFileTest(OverrideImplementMethodsHandler handler) { myFixture.configureByFile(getTestName(true) + ".kt"); doOverrideImplement(handler, null); @@ -96,8 +121,7 @@ public abstract class AbstractOverrideImplementTest extends LightCodeInsightFixt assertNotNull("Caret should be inside class or object", classOrObject); final JetFile jetFile = (JetFile) classOrObject.getContainingFile(); - final BindingContext bindingContext = AnalyzerFacadeWithCache.analyzeFileWithCache(jetFile) - .getBindingContext(); + final BindingContext bindingContext = AnalyzerFacadeWithCache.analyzeFileWithCache(jetFile).getBindingContext(); Set descriptors = handler.collectMethodsToGenerate(classOrObject, bindingContext); final CallableMemberDescriptor singleToOverride; @@ -159,4 +183,20 @@ public abstract class AbstractOverrideImplementTest extends LightCodeInsightFixt } }.execute(); } + + private void generateImplementation(@NotNull final PsiMethod method) { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + PsiClass aClass = ((PsiClassOwner) myFixture.getFile()).getClasses()[0]; + + PsiMethodMember methodMember = new PsiMethodMember(method, PsiSubstitutor.EMPTY); + + OverrideImplementUtil.overrideOrImplementMethodsInRightPlace( + myFixture.getEditor(), aClass, new SmartList(methodMember), false); + + PostprocessReformattingAspect.getInstance(myFixture.getProject()).doPostponedFormatting(); + } + }); + } } diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java index eaeaab69b82..14074e40017 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java @@ -54,6 +54,10 @@ public final class OverrideImplementTest extends AbstractOverrideImplementTest { doImplementDirectoryTest(); } + public void testFunctionFromTraitInJava() { + doImplementJavaDirectoryTest("foo.KotlinTrait", "bar"); + } + public void testGenericMethod() { doImplementFileTest(); }