Fixed KT-4892 Override method generates redundant type arguments in call to super

#KT-4892 Fixed
This commit is contained in:
Valentin Kipyatkov
2014-12-05 07:22:42 +03:00
parent 4b9bcce07a
commit 9f845f0de4
21 changed files with 93 additions and 47 deletions
@@ -101,8 +101,7 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
PsiElement firstGenerated = null; PsiElement firstGenerated = null;
List<JetElement> elementsToCompact = new ArrayList<JetElement>(); List<JetElement> elementsToCompact = new ArrayList<JetElement>();
JetFile file = classOrObject.getContainingJetFile(); for (JetElement element : generateOverridingMembers(selectedElements, classOrObject)) {
for (JetElement element : generateOverridingMembers(selectedElements, file)) {
PsiElement added = body.addAfter(element, afterAnchor); PsiElement added = body.addAfter(element, afterAnchor);
if (firstGenerated == null) { if (firstGenerated == null) {
@@ -179,22 +178,22 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
return whiteSpace; return whiteSpace;
} }
private static List<JetElement> generateOverridingMembers(List<DescriptorClassMember> selectedElements, JetFile file) { private static List<JetElement> generateOverridingMembers(List<DescriptorClassMember> selectedElements, JetClassOrObject classOrObject) {
List<JetElement> overridingMembers = new ArrayList<JetElement>(); List<JetElement> overridingMembers = new ArrayList<JetElement>();
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(), (SimpleFunctionDescriptor) descriptor)); overridingMembers.add(overrideFunction(classOrObject, (SimpleFunctionDescriptor) descriptor));
} }
else if (descriptor instanceof PropertyDescriptor) { else if (descriptor instanceof PropertyDescriptor) {
overridingMembers.add(overrideProperty(file.getProject(), (PropertyDescriptor) descriptor)); overridingMembers.add(overrideProperty(classOrObject, (PropertyDescriptor) descriptor));
} }
} }
return overridingMembers; return overridingMembers;
} }
@NotNull @NotNull
private static JetElement overrideProperty(@NotNull Project project, @NotNull PropertyDescriptor descriptor) { private static JetElement overrideProperty(@NotNull JetClassOrObject classOrObject, @NotNull PropertyDescriptor descriptor) {
PropertyDescriptor newDescriptor = (PropertyDescriptor) descriptor.copy( PropertyDescriptor newDescriptor = (PropertyDescriptor) descriptor.copy(
descriptor.getContainingDeclaration(), descriptor.getContainingDeclaration(),
Modality.OPEN, Modality.OPEN,
@@ -211,11 +210,11 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
if (descriptor.isVar()) { if (descriptor.isVar()) {
body.append("\nset(value) {}"); body.append("\nset(value) {}");
} }
return JetPsiFactory(project).createProperty(OVERRIDE_RENDERER.render(newDescriptor) + body); return JetPsiFactory(classOrObject.getProject()).createProperty(OVERRIDE_RENDERER.render(newDescriptor) + body);
} }
@NotNull @NotNull
private static JetNamedFunction overrideFunction(@NotNull Project project, @NotNull FunctionDescriptor descriptor) { private static JetNamedFunction overrideFunction(@NotNull JetClassOrObject classOrObject, @NotNull FunctionDescriptor descriptor) {
FunctionDescriptor newDescriptor = descriptor.copy( FunctionDescriptor newDescriptor = descriptor.copy(
descriptor.getContainingDeclaration(), descriptor.getContainingDeclaration(),
Modality.OPEN, Modality.OPEN,
@@ -230,8 +229,11 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
delegationBuilder.append("throw UnsupportedOperationException()"); delegationBuilder.append("throw UnsupportedOperationException()");
} }
else { else {
delegationBuilder.append("super<").append(descriptor.getContainingDeclaration().getName()); delegationBuilder.append("super");
delegationBuilder.append(">.").append(descriptor.getName()).append("("); if (classOrObject.getDelegationSpecifiers().size() > 1) {
delegationBuilder.append("<").append(descriptor.getContainingDeclaration().getName()).append(">");
}
delegationBuilder.append(".").append(descriptor.getName()).append("(");
} }
boolean first = true; boolean first = true;
if (!isAbstractFun) { if (!isAbstractFun) {
@@ -250,7 +252,7 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
boolean returnsNotUnit = returnType != null && !builtIns.getUnitType().equals(returnType); boolean returnsNotUnit = returnType != null && !builtIns.getUnitType().equals(returnType);
String body = "{" + (returnsNotUnit && !isAbstractFun ? "return " : "") + delegationBuilder.toString() + "}"; String body = "{" + (returnsNotUnit && !isAbstractFun ? "return " : "") + delegationBuilder.toString() + "}";
return JetPsiFactory(project).createFunction(OVERRIDE_RENDERER.render(newDescriptor) + body); return JetPsiFactory(classOrObject.getProject()).createFunction(OVERRIDE_RENDERER.render(newDescriptor) + body);
} }
@NotNull @NotNull
@@ -6,25 +6,25 @@ open class Base<A, B, C>() {
class C : Base<String, C, Unit>() { class C : Base<String, C, Unit>() {
override fun bar(value: () -> Unit): (String) -> Unit { override fun bar(value: () -> Unit): (String) -> Unit {
<selection><caret>return super<Base>.bar(value)</selection> <selection><caret>return super.bar(value)</selection>
} }
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
return super<Base>.equals(other) return super.equals(other)
} }
override fun foo(value: C): C { override fun foo(value: C): C {
return super<Base>.foo(value) return super.foo(value)
} }
override fun hashCode(): Int { override fun hashCode(): Int {
return super<Base>.hashCode() return super.hashCode()
} }
override val method: (String?) -> String override val method: (String?) -> String
get() = ? get() = ?
override fun toString(): String { override fun toString(): String {
return super<Base>.toString() return super.toString()
} }
} }
@@ -9,7 +9,7 @@ class C(t :T) : T by t {
} }
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
return super<T>.equals(other) return super.equals(other)
} }
override fun foo() { override fun foo() {
@@ -17,11 +17,11 @@ class C(t :T) : T by t {
} }
override fun hashCode(): Int { override fun hashCode(): Int {
return super<T>.hashCode() return super.hashCode()
} }
override fun toString(): String { override fun toString(): String {
return super<T>.toString() return super.toString()
} }
} }
@@ -4,6 +4,6 @@ import foo.Intf
class Impl(): Intf() { class Impl(): Intf() {
override fun getFooBar(): String? { override fun getFooBar(): String? {
<selection><caret>return super<Intf>.getFooBar()</selection> <selection><caret>return super.getFooBar()</selection>
} }
} }
@@ -4,6 +4,6 @@ import foo.Intf
class Impl(): Intf() { class Impl(): Intf() {
override fun getFooBar(): String? { override fun getFooBar(): String? {
<selection><caret>return super<Intf>.getFooBar()</selection> <selection><caret>return super.getFooBar()</selection>
} }
} }
@@ -5,22 +5,22 @@ trait A {
class C : A { class C : A {
override fun bar(): String { override fun bar(): String {
<selection><caret>return super<A>.bar()</selection> <selection><caret>return super.bar()</selection>
} }
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
return super<A>.equals(other) return super.equals(other)
} }
override fun foo(value: String): Int { override fun foo(value: String): Int {
return super<A>.foo(value) return super.foo(value)
} }
override fun hashCode(): Int { override fun hashCode(): Int {
return super<A>.hashCode() return super.hashCode()
} }
override fun toString(): String { override fun toString(): String {
return super<A>.toString() return super.toString()
} }
} }
@@ -0,0 +1,11 @@
open class A {
open fun foo() {}
}
trait B {
fun bar()
}
class C : A(), B {
<caret>
}
@@ -0,0 +1,29 @@
open class A {
open fun foo() {}
}
trait B {
fun bar()
}
class C : A(), B {
override fun bar() {
<selection><caret>throw UnsupportedOperationException()</selection>
}
override fun equals(other: Any?): Boolean {
return super<A>.equals(other)
}
override fun foo() {
super<A>.foo()
}
override fun hashCode(): Int {
return super<A>.hashCode()
}
override fun toString(): String {
return super<A>.toString()
}
}
@@ -4,15 +4,15 @@ trait Some {
class Other { class Other {
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
<selection><caret>return super<Any>.equals(other)</selection> <selection><caret>return super.equals(other)</selection>
} }
override fun hashCode(): Int { override fun hashCode(): Int {
return super<Any>.hashCode() return super.hashCode()
} }
override fun toString(): String { override fun toString(): String {
return super<Any>.toString() return super.toString()
} }
fun test() { fun test() {
@@ -8,15 +8,15 @@ class Other {
} }
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
<selection><caret>return super<Any>.equals(other)</selection> <selection><caret>return super.equals(other)</selection>
} }
override fun hashCode(): Int { override fun hashCode(): Int {
return super<Any>.hashCode() return super.hashCode()
} }
override fun toString(): String { override fun toString(): String {
return super<Any>.toString() return super.toString()
} }
fun otherTest() { fun otherTest() {
@@ -4,15 +4,15 @@ trait Some {
class Other { class Other {
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
<selection><caret>return super<Any>.equals(other)</selection> <selection><caret>return super.equals(other)</selection>
} }
override fun hashCode(): Int { override fun hashCode(): Int {
return super<Any>.hashCode() return super.hashCode()
} }
override fun toString(): String { override fun toString(): String {
return super<Any>.toString() return super.toString()
} }
fun test() { fun test() {
@@ -4,6 +4,6 @@ trait A<T> {
class C : A<C> { class C : A<C> {
override fun foo(value: C) { override fun foo(value: C) {
<selection><caret>super<A>.foo(value)</selection> <selection><caret>super.foo(value)</selection>
} }
} }
@@ -2,6 +2,6 @@ import foo.A
class C : A() { class C : A() {
override fun getAnswer(array: Array<out String>?, number: Int, value: Any?): Int { override fun getAnswer(array: Array<out String>?, number: Int, value: Any?): Int {
<selection><caret>return super<A>.getAnswer(array, number, value)</selection> <selection><caret>return super.getAnswer(array, number, value)</selection>
} }
} }
@@ -4,6 +4,6 @@ trait A {
class C : A { class C : A {
override fun foo(value: String): Int { override fun foo(value: String): Int {
<selection><caret>return super<A>.foo(value)</selection> <selection><caret>return super.foo(value)</selection>
} }
} }
@@ -10,19 +10,19 @@ class C : A() {
get() = <selection><caret>0</selection> get() = <selection><caret>0</selection>
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
return super<A>.equals(other) return super.equals(other)
} }
override fun foo(value: Int) { override fun foo(value: Int) {
super<A>.foo(value) super.foo(value)
} }
override fun hashCode(): Int { override fun hashCode(): Int {
return super<A>.hashCode() return super.hashCode()
} }
override fun toString(): String { override fun toString(): String {
return super<A>.toString() return super.toString()
} }
/* /*
@@ -2,6 +2,6 @@ package foo
class Impl: B() { class Impl: B() {
override fun foo(r: Runnable?) { override fun foo(r: Runnable?) {
<selection><caret>super<B>.foo(r)</selection> <selection><caret>super.foo(r)</selection>
} }
} }
@@ -4,6 +4,6 @@ trait A {
class C : A { class C : A {
override fun foo(value: String) { override fun foo(value: String) {
<selection><caret>super<A>.foo(value)</selection> <selection><caret>super.foo(value)</selection>
} }
} }
@@ -2,6 +2,6 @@ package foo
class Impl : Bar() { class Impl : Bar() {
override fun f(): Any? { override fun f(): Any? {
<selection><caret>return super<Bar>.f()</selection> <selection><caret>return super.f()</selection>
} }
} }
@@ -8,6 +8,6 @@ public open class B() : A() {
public open class C() : B() { public open class C() : B() {
override fun foo() { override fun foo() {
<selection><caret>super<B>.foo()</selection> <selection><caret>super.foo()</selection>
} }
} }
@@ -4,6 +4,6 @@ import dependency.D
class C: D<Int>() { class C: D<Int>() {
override fun id(t: Int): Int { override fun id(t: Int): Int {
<selection><caret>return super<D>.id(t)</selection> <selection><caret>return super.id(t)</selection>
} }
} }
@@ -189,4 +189,8 @@ public final class OverrideImplementTest extends AbstractOverrideImplementTest {
public void testPropagationKJK() { public void testPropagationKJK() {
doDirectoryTest(new OverrideMethodsHandler()); doDirectoryTest(new OverrideMethodsHandler());
} }
public void testMultipleSupers() {
doMultiOverrideFileTest();
}
} }