implement works for properties

This commit is contained in:
Dmitry Jemerov
2011-11-04 18:42:38 +01:00
parent b2990b74ef
commit 7171fe8b02
6 changed files with 63 additions and 8 deletions
@@ -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);
}
@@ -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<DescriptorClassMember> showOverrideImplementChooser(Project project,
@@ -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()
@@ -0,0 +1,7 @@
trait T {
val v : Int
}
class GC() : T {
<caret>
}
@@ -0,0 +1,8 @@
trait T {
val v : Int
}
class GC() : T {
override val v: Int = 0
}
@@ -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() {