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 ab9ad23aa7c..4c0dced694d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiFactory.java @@ -54,7 +54,7 @@ public class JetPsiFactory { return createProperty(project, text); } - private static JetProperty createProperty(Project project, String text) { + public static JetProperty createProperty(Project project, String text) { return createDeclaration(project, text, JetProperty.class); } diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/ImplementMethodsHandler.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/ImplementMethodsHandler.java index 921ff3a4938..7b03f6eef67 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/ImplementMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/ImplementMethodsHandler.java @@ -96,9 +96,32 @@ public class ImplementMethodsHandler implements LanguageCodeInsightActionHandler JetElement target = overrideFunction(project, (FunctionDescriptor) descriptor); body.addBefore(target, body.getRBrace()); } + else if (descriptor instanceof PropertyDescriptor) { + JetElement target = overrideProperty(project, (PropertyDescriptor) descriptor); + body.addBefore(target, body.getRBrace()); + } } } + private static JetElement overrideProperty(Project project, PropertyDescriptor descriptor) { + StringBuilder bodyBuilder = new StringBuilder("override "); + if (descriptor.isVar()) { + bodyBuilder.append("var "); + } + else { + bodyBuilder.append("val "); + } + bodyBuilder.append(descriptor.getName()).append(": ").append(descriptor.getOutType()); + String initializer = defaultInitializer(descriptor.getOutType(), JetStandardLibrary.getJetStandardLibrary(project)); + if (initializer != null) { + bodyBuilder.append("=").append(initializer); + } + else { + bodyBuilder.append("= ?"); + } + return JetPsiFactory.createProperty(project, bodyBuilder.toString()); + } + private static JetElement overrideFunction(Project project, FunctionDescriptor descriptor) { StringBuilder bodyBuilder = new StringBuilder("override fun "); bodyBuilder.append(descriptor.getName()); @@ -120,19 +143,27 @@ public class ImplementMethodsHandler implements LanguageCodeInsightActionHandler bodyBuilder.append(": ").append(returnType.toString()); } bodyBuilder.append("{"); + final String initializer = defaultInitializer(returnType, stdlib); + if (initializer != null) { + bodyBuilder.append("return " ).append(initializer); + } + bodyBuilder.append("}"); + return JetPsiFactory.createFunction(project, bodyBuilder.toString()); + } + + private static String defaultInitializer(JetType returnType, JetStandardLibrary stdlib) { if (returnType.isNullable()) { - bodyBuilder.append("return null"); + return "null"; } else if (returnType.equals(stdlib.getIntType()) || returnType.equals(stdlib.getLongType()) || returnType.equals(stdlib.getShortType()) || returnType.equals(stdlib.getByteType()) || returnType.equals(stdlib.getFloatType()) || returnType.equals(stdlib.getDoubleType())) { - bodyBuilder.append("return 0"); + return "0"; } else if (returnType.equals(stdlib.getBooleanType())) { - bodyBuilder.append("return false"); + return "false"; } - bodyBuilder.append("}"); - return JetPsiFactory.createFunction(project, bodyBuilder.toString()); + return null; } private static MemberChooser showOverrideImplementChooser(Project project, diff --git a/idea/src/org/jetbrains/jet/plugin/formatter/JetFormattingModelBuilder.java b/idea/src/org/jetbrains/jet/plugin/formatter/JetFormattingModelBuilder.java index 54cb3e97069..e4a3f0d4901 100644 --- a/idea/src/org/jetbrains/jet/plugin/formatter/JetFormattingModelBuilder.java +++ b/idea/src/org/jetbrains/jet/plugin/formatter/JetFormattingModelBuilder.java @@ -29,6 +29,7 @@ public class JetFormattingModelBuilder implements FormattingModelBuilder { return new SpacingBuilder(settings) .before(COMMA).spaceIf(settings.SPACE_BEFORE_COMMA) .after(COMMA).spaceIf(settings.SPACE_AFTER_COMMA) + .around(EQ).spaceIf(settings.SPACE_AROUND_ASSIGNMENT_OPERATORS) .beforeInside(BLOCK, FUN).spaceIf(settings.SPACE_BEFORE_METHOD_LBRACE) .afterInside(LBRACE, BLOCK).lineBreakInCode() .beforeInside(RBRACE, CLASS_BODY).lineBreakInCode() diff --git a/idea/testData/codeInsight/overrideImplement/property.kt b/idea/testData/codeInsight/overrideImplement/property.kt new file mode 100644 index 00000000000..0f08af46b60 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/property.kt @@ -0,0 +1,7 @@ +trait T { + val v : Int +} + +class GC() : T { + +} diff --git a/idea/testData/codeInsight/overrideImplement/property.kt.after b/idea/testData/codeInsight/overrideImplement/property.kt.after new file mode 100644 index 00000000000..bfff67330db --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/property.kt.after @@ -0,0 +1,8 @@ +trait T { + val v : Int +} + +class GC() : T { + + override val v: Int = 0 +} diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java index c821b510dd6..b5d6d95016c 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/OverrideImplementTest.java @@ -39,9 +39,17 @@ public class OverrideImplementTest extends LightCodeInsightFixtureTestCase { } public void testGenericMethod() { - myFixture.configureByFile("genericMethod.kt"); + doFileTest(); + } + + public void testProperty() { + doFileTest(); + } + + private void doFileTest() { + myFixture.configureByFile(getTestName(true) + ".kt"); doImplement(); - myFixture.checkResultByFile("genericMethod.kt.after"); + myFixture.checkResultByFile(getTestName(true) + ".kt.after"); } private void doDirectoryTest() {