Don't add initializer to extension property on override/implement

This commit is contained in:
Alexander Udalov
2014-05-28 20:12:19 +04:00
parent d78d4bc44c
commit a78b7fb31f
6 changed files with 40 additions and 15 deletions
@@ -32,7 +32,6 @@ import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
@@ -132,12 +131,10 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
for (DescriptorClassMember selectedElement : selectedElements) { for (DescriptorClassMember selectedElement : selectedElements) {
DeclarationDescriptor descriptor = selectedElement.getDescriptor(); DeclarationDescriptor descriptor = selectedElement.getDescriptor();
if (descriptor instanceof SimpleFunctionDescriptor) { if (descriptor instanceof SimpleFunctionDescriptor) {
overridingMembers.add(overrideFunction(file.getProject(), overridingMembers.add(overrideFunction(file.getProject(), (SimpleFunctionDescriptor) descriptor));
(SimpleFunctionDescriptor) descriptor));
} }
else if (descriptor instanceof PropertyDescriptor) { else if (descriptor instanceof PropertyDescriptor) {
overridingMembers.add( overridingMembers.add(overrideProperty(file.getProject(), (PropertyDescriptor) descriptor));
overrideProperty(file.getProject(), (PropertyDescriptor) descriptor));
} }
} }
return overridingMembers; return overridingMembers;
@@ -153,15 +150,20 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
/* copyOverrides = */ true); /* copyOverrides = */ true);
newDescriptor.addOverriddenDescriptor(descriptor); newDescriptor.addOverriddenDescriptor(descriptor);
StringBuilder bodyBuilder = new StringBuilder(); StringBuilder body = new StringBuilder();
String initializer = CodeInsightUtils.defaultInitializer(descriptor.getType()); String defaultInitializer = CodeInsightUtils.defaultInitializer(descriptor.getType());
if (initializer != null) { String initializer = defaultInitializer != null ? " = " + defaultInitializer : " = ?";
bodyBuilder.append(" = ").append(initializer); if (descriptor.getReceiverParameter() != null) {
body.append("\nget()");
body.append(initializer);
if (descriptor.isVar()) {
body.append("\nset(value) {}");
}
} }
else { else {
bodyBuilder.append(" = ?"); body.append(initializer);
} }
return JetPsiFactory.createProperty(project, OVERRIDE_RENDERER.render(newDescriptor) + bodyBuilder.toString()); return JetPsiFactory.createProperty(project, OVERRIDE_RENDERER.render(newDescriptor) + body);
} }
@NotNull @NotNull
@@ -4,4 +4,4 @@ trait A {
class B : A { class B : A {
<caret> <caret>
} }
@@ -4,5 +4,6 @@ trait A {
class B : A { class B : A {
override val String.prop: Int = 0 override val String.prop: Int
} get() = 0
}
@@ -0,0 +1,7 @@
trait A {
var Int.foo : Double
}
class B : A {
<caret>
}
@@ -0,0 +1,11 @@
trait A {
var Int.foo : Double
}
class B : A {
override var Int.foo: Double
get() = 0.0
set(value) {
}
}
@@ -110,7 +110,11 @@ public final class OverrideImplementTest extends AbstractOverrideImplementTest {
doOverrideFileTest(); doOverrideFileTest();
} }
public void testOverrideExplicitProperty() { public void testOverrideExtensionProperty() {
doOverrideFileTest();
}
public void testOverrideMutableExtensionProperty() {
doOverrideFileTest(); doOverrideFileTest();
} }