From 0dabbbeed56726aac4fbf4923223ee56060b7671 Mon Sep 17 00:00:00 2001 From: Vladimir Rudev Date: Wed, 7 Nov 2012 19:50:41 +0400 Subject: [PATCH 1/2] KT-1985 Creating class body on override/implement if necessary --- .../src/org/jetbrains/jet/lang/psi/JetPsiFactory.java | 5 +++++ .../codeInsight/OverrideImplementMethodsHandler.java | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java index ce49e79196f..98fe1b8d487 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java @@ -147,6 +147,11 @@ public class JetPsiFactory { return function.getBodyExpression(); } + public static JetClassBody createEmptyClassBody(Project project) { + JetClass aClass = createClass(project, "class A(){}"); + return aClass.getBody(); + } + public static JetParameter createParameter(Project project, String name, String type) { JetNamedFunction function = createFunction(project, "fun foo(" + name + " : " + type + ") {}"); return function.getValueParameters().get(0); diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java index 9fd363325d3..31534a94552 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java @@ -68,9 +68,10 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns JetClassOrObject classOrObject, List selectedElements ) { - final JetClassBody body = classOrObject.getBody(); + JetClassBody body = classOrObject.getBody(); + Project project = classOrObject.getProject(); if (body == null) { - return; + body = JetPsiFactory.createEmptyClassBody(project); } PsiElement afterAnchor = findInsertAfterAnchor(editor, body); @@ -86,6 +87,10 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns afterAnchor = added; elementsToCompact.add((JetElement) added); } + if (!body.isPhysical()) { + classOrObject.add(JetPsiFactory.createWhiteSpace(project)); + classOrObject.add(body); + } ReferenceToClassesShortening.compactReferenceToClasses(elementsToCompact); } From 2dd47d6339451787cf91354c37a9d9592fdbd1b5 Mon Sep 17 00:00:00 2001 From: Vladimir Rudev Date: Thu, 8 Nov 2012 23:23:49 +0400 Subject: [PATCH 2/2] KT-1985 Add test case and fix minor bug Reference compacting must be done before adding body to class. --- .../codeInsight/OverrideImplementMethodsHandler.java | 3 ++- .../overrideImplement/emptyClassBodyFunctionMethod.kt | 6 ++++++ .../emptyClassBodyFunctionMethod.kt.after | 10 ++++++++++ .../jet/plugin/codeInsight/OverrideImplementTest.java | 4 ++++ 4 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 idea/testData/codeInsight/overrideImplement/emptyClassBodyFunctionMethod.kt create mode 100644 idea/testData/codeInsight/overrideImplement/emptyClassBodyFunctionMethod.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 31534a94552..781abd15869 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java @@ -87,11 +87,12 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns afterAnchor = added; elementsToCompact.add((JetElement) added); } + ReferenceToClassesShortening.compactReferenceToClasses(elementsToCompact); + if (!body.isPhysical()) { classOrObject.add(JetPsiFactory.createWhiteSpace(project)); classOrObject.add(body); } - ReferenceToClassesShortening.compactReferenceToClasses(elementsToCompact); } @Nullable diff --git a/idea/testData/codeInsight/overrideImplement/emptyClassBodyFunctionMethod.kt b/idea/testData/codeInsight/overrideImplement/emptyClassBodyFunctionMethod.kt new file mode 100644 index 00000000000..207375dd207 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/emptyClassBodyFunctionMethod.kt @@ -0,0 +1,6 @@ +// From KT-1254 +trait T { + fun Foo() : (String) -> Unit +} + +class C : T \ No newline at end of file diff --git a/idea/testData/codeInsight/overrideImplement/emptyClassBodyFunctionMethod.kt.after b/idea/testData/codeInsight/overrideImplement/emptyClassBodyFunctionMethod.kt.after new file mode 100644 index 00000000000..a45b0a7ee27 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/emptyClassBodyFunctionMethod.kt.after @@ -0,0 +1,10 @@ +// From KT-1254 +trait T { + fun Foo() : (String) -> Unit +} + +class C : T { + override fun Foo(): (String) -> Unit { + 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 6f649a1b5c3..b7fe069ca3d 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 class OverrideImplementTest extends LightCodeInsightFixtureTestCase { myFixture.setTestDataPath(PluginTestCaseBase.getTestDataPathBase() + "/codeInsight/overrideImplement"); } + public void testEmptyClassBodyFunctionMethod() { + doImplementFileTest(); + } + public void testFunctionMethod() { doImplementFileTest(); }