J2K: preserving of visibility modifier for override members when access level was higher
This commit is contained in:
@@ -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
@@ -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
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user