J2K: preserving of visibility modifier for override members when access level was higher

This commit is contained in:
Valentin Kipyatkov
2015-09-15 12:26:33 +03:00
parent 6f12db9cde
commit cc4aa6ed21
9 changed files with 59 additions and 8 deletions
@@ -18,9 +18,11 @@ package org.jetbrains.kotlin.idea.j2k
import com.intellij.psi.search.LocalSearchScope import com.intellij.psi.search.LocalSearchScope
import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.psi.search.searches.ReferencesSearch
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory import org.jetbrains.kotlin.diagnostics.DiagnosticFactory
import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
import org.jetbrains.kotlin.idea.inspections.RedundantSamConstructorInspection import org.jetbrains.kotlin.idea.inspections.RedundantSamConstructorInspection
import org.jetbrains.kotlin.idea.intentions.* import org.jetbrains.kotlin.idea.intentions.*
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions.IfThenToElvisIntention import org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions.IfThenToElvisIntention
@@ -28,9 +30,12 @@ import org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions.I
import org.jetbrains.kotlin.idea.quickfix.RemoveModifierFix import org.jetbrains.kotlin.idea.quickfix.RemoveModifierFix
import org.jetbrains.kotlin.idea.quickfix.RemoveRightPartOfBinaryExpressionFix import org.jetbrains.kotlin.idea.quickfix.RemoveRightPartOfBinaryExpressionFix
import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier
import org.jetbrains.kotlin.resolve.OverridingUtil
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
import java.util.ArrayList import java.util.*
interface J2kPostProcessing { interface J2kPostProcessing {
fun createAction(element: JetElement, diagnostics: Diagnostics): (() -> Unit)? fun createAction(element: JetElement, diagnostics: Diagnostics): (() -> Unit)?
@@ -44,6 +49,7 @@ object J2KPostProcessingRegistrar {
init { init {
_processings.add(RemoveExplicitTypeArgumentsProcessing()) _processings.add(RemoveExplicitTypeArgumentsProcessing())
_processings.add(RemoveRedundantOverrideVisibilityProcessing())
_processings.add(MoveLambdaOutsideParenthesesProcessing()) _processings.add(MoveLambdaOutsideParenthesesProcessing())
_processings.add(ConvertToStringTemplateProcessing()) _processings.add(ConvertToStringTemplateProcessing())
_processings.add(UsePropertyAccessSyntaxProcessing()) _processings.add(UsePropertyAccessSyntaxProcessing())
@@ -133,6 +139,16 @@ object J2KPostProcessingRegistrar {
} }
} }
private class RemoveRedundantOverrideVisibilityProcessing : J2kPostProcessing {
override fun createAction(element: JetElement, diagnostics: Diagnostics): (() -> Unit)? {
if (element !is JetCallableDeclaration || !element.hasModifier(JetTokens.OVERRIDE_KEYWORD)) return null
val descriptor = element.resolveToDescriptor() as? CallableMemberDescriptor ?: return null
val visibilityFromSupers = OverridingUtil.findMaxVisibility(descriptor.overriddenDescriptors)?.normalize() ?: return null
if (visibilityFromSupers != descriptor.visibility) return null
return { element.visibilityModifier()?.delete() }
}
}
private class MoveLambdaOutsideParenthesesProcessing : J2kPostProcessing { private class MoveLambdaOutsideParenthesesProcessing : J2kPostProcessing {
private val intention = MoveLambdaOutsideParenthesesIntention() private val intention = MoveLambdaOutsideParenthesesIntention()
@@ -16,7 +16,7 @@
package org.jetbrains.kotlin.j2k.ast package org.jetbrains.kotlin.j2k.ast
import org.jetbrains.kotlin.j2k.* import org.jetbrains.kotlin.j2k.CodeBuilder
abstract class FunctionLike( abstract class FunctionLike(
annotations: Annotations, annotations: Annotations,
@@ -43,7 +43,7 @@ class Function(
} }
if (modifiers.contains(Modifier.OVERRIDE)) { if (modifiers.contains(Modifier.OVERRIDE)) {
modifiers = modifiers.filter { it != Modifier.OPEN && it !in ACCESS_MODIFIERS } modifiers = modifiers.filter { it != Modifier.OPEN }
} }
return modifiers return modifiers
@@ -37,9 +37,12 @@ class Modifiers(modifiers: Collection<Modifier>) : Element() {
val modifiers = modifiers.toSet() val modifiers = modifiers.toSet()
override fun generateCode(builder: CodeBuilder) { override fun generateCode(builder: CodeBuilder) {
val text = modifiers val modifiersToInclude = if (modifiers.contains(Modifier.OVERRIDE))
modifiers // for override members we remove redundant visibility modifiers in post-processing
else
modifiers.filter { it != Modifier.PUBLIC }
val text = modifiersToInclude
.sortedBy { it.ordinal() } .sortedBy { it.ordinal() }
.filter { it != Modifier.PUBLIC }
.map { it.toKotlin() } .map { it.toKotlin() }
.joinToString(" ") .joinToString(" ")
builder.append(text) builder.append(text)
+1 -1
View File
@@ -1,2 +1,2 @@
//class //class
enum Color { WHITE, BLACK, RED, YELLOW, BLUE;@Override String toString() { return "COLOR";}} enum Color { WHITE, BLACK, RED, YELLOW, BLUE;@Override public String toString() { return "COLOR";}}
@@ -0,0 +1,10 @@
class Base {
protected void foo(){}
}
class Derived extends Base {
@Override
public void foo() {
super.foo();
}
}
@@ -0,0 +1,10 @@
internal open class Base {
protected open fun foo() {
}
}
internal class Derived : Base() {
public override fun foo() {
super.foo()
}
}
+2 -2
View File
@@ -18,14 +18,14 @@ public class Language implements Serializable {
class Base { class Base {
void test() {} void test() {}
String toString() { public String toString() {
return "BASE"; return "BASE";
} }
} }
class Child extends Base { class Child extends Base {
void test() {} void test() {}
String toString() { public String toString() {
return "Child"; return "Child";
} }
} }
@@ -2350,6 +2350,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
doTest(fileName); doTest(fileName);
} }
@TestMetadata("overrideWithHigherVisibility.java")
public void testOverrideWithHigherVisibility() throws Exception {
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/function/overrideWithHigherVisibility.java");
doTest(fileName);
}
@TestMetadata("ownGenericParam.java") @TestMetadata("ownGenericParam.java")
public void testOwnGenericParam() throws Exception { public void testOwnGenericParam() throws Exception {
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/function/ownGenericParam.java"); String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/function/ownGenericParam.java");
@@ -2350,6 +2350,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
doTest(fileName); doTest(fileName);
} }
@TestMetadata("overrideWithHigherVisibility.java")
public void testOverrideWithHigherVisibility() throws Exception {
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/function/overrideWithHigherVisibility.java");
doTest(fileName);
}
@TestMetadata("ownGenericParam.java") @TestMetadata("ownGenericParam.java")
public void testOwnGenericParam() throws Exception { public void testOwnGenericParam() throws Exception {
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/function/ownGenericParam.java"); String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/function/ownGenericParam.java");