#KT-13750 fix (#951)

This commit is contained in:
Simon Ogorodnik
2016-09-13 18:12:22 +03:00
committed by Dmitry Jemerov
parent 19ef29e96c
commit 115d63a2f3
6 changed files with 70 additions and 10 deletions
+28 -9
View File
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.j2k
import com.intellij.openapi.project.Project
import com.intellij.psi.*
import com.intellij.psi.CommonClassNames.*
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.InheritanceUtil
import com.intellij.psi.util.PsiMethodUtil
import com.intellij.psi.util.PsiTreeUtil
@@ -67,7 +68,7 @@ class Converter private constructor(
companion object {
fun create(elementToConvert: PsiElement, settings: ConverterSettings, services: JavaToKotlinConverterServices,
inConversionScope: (PsiElement) -> Boolean, usageProcessingsCollector: (UsageProcessing) -> Unit): Converter {
inConversionScope: (PsiElement) -> Boolean, usageProcessingsCollector: (UsageProcessing) -> Unit): Converter {
return Converter(elementToConvert, settings, inConversionScope,
services, CommonState(usageProcessingsCollector), PersonalState(null))
}
@@ -141,7 +142,7 @@ class Converter private constructor(
commonState.postUnfoldActions.forEach { it() }
}
fun<TResult : Element> deferredElement(generator: (CodeConverter) -> TResult): DeferredElement<TResult> {
fun <TResult : Element> deferredElement(generator: (CodeConverter) -> TResult): DeferredElement<TResult> {
val element = DeferredElement(generator, personalState)
commonState.deferredElements.add(element)
return element
@@ -309,7 +310,7 @@ class Converter private constructor(
val setMethod = propertyInfo.setMethod
//TODO: annotations from getter/setter?
val annotations = field?.let { convertAnnotations(it) } ?: Annotations.Empty
val annotations = field?.let { convertAnnotations(it) + specialAnnotationPropertyCases(it) } ?: Annotations.Empty
val modifiers = propertyInfo.modifiers
@@ -424,6 +425,24 @@ class Converter private constructor(
}
}
private fun specialAnnotationPropertyCases(field: PsiField): Annotations {
val javaSerializableInterface = JavaPsiFacade.getInstance(project).findClass(CommonClassNames.JAVA_IO_SERIALIZABLE, field.resolveScope)
val output = mutableListOf<Annotation>()
if (javaSerializableInterface != null &&
field.name == "serialVersionUID" &&
field.hasModifierProperty(PsiModifier.FINAL) &&
field.hasModifierProperty(PsiModifier.STATIC) &&
field.containingClass?.isInheritor(javaSerializableInterface, false) ?: false
) {
output.add(Annotation(Identifier.withNoPrototype("JvmStatic"),
listOf(),
newLineAfter = false).assignNoPrototype())
}
return Annotations(output)
}
private fun combinedNullability(vararg psiElements: PsiElement?): Nullability {
val values = psiElements.filterNotNull().map {
when (it) {
@@ -537,7 +556,7 @@ class Converter private constructor(
if (settings.openByDefault) {
val isEffectivelyFinal = method.hasModifierProperty(PsiModifier.FINAL) ||
containingClass != null && (containingClass.hasModifierProperty(PsiModifier.FINAL) || containingClass.isEnum)
containingClass != null && (containingClass.hasModifierProperty(PsiModifier.FINAL) || containingClass.isEnum)
if (!isEffectivelyFinal && !modifiers.contains(Modifier.ABSTRACT) && !modifiers.isPrivate) {
modifiers = modifiers.with(Modifier.OPEN)
}
@@ -611,9 +630,9 @@ class Converter private constructor(
if (!isInOpenClass) return false
if (modifiers.contains(Modifier.OVERRIDE) || modifiers.contains(Modifier.ABSTRACT)) return false
if (settings.openByDefault) {
return !method.hasModifierProperty(PsiModifier.FINAL)
&& !method.hasModifierProperty(PsiModifier.PRIVATE)
&& !method.hasModifierProperty(PsiModifier.STATIC)
return !method.hasModifierProperty(PsiModifier.FINAL)
&& !method.hasModifierProperty(PsiModifier.PRIVATE)
&& !method.hasModifierProperty(PsiModifier.STATIC)
}
else {
return referenceSearcher.hasOverrides(method)
@@ -657,8 +676,8 @@ class Converter private constructor(
private fun constructNestedClassReferenceIdentifier(psiClass: PsiClass, context: PsiElement): Identifier? {
val outerClass = psiClass.containingClass
if (outerClass != null
&& !PsiTreeUtil.isAncestor(outerClass, context, true)
&& !psiClass.isImported(context.containingFile as PsiJavaFile)) {
&& !PsiTreeUtil.isAncestor(outerClass, context, true)
&& !psiClass.isImported(context.containingFile as PsiJavaFile)) {
val qualifier = constructNestedClassReferenceIdentifier(outerClass, context)?.name ?: outerClass.name!!
return Identifier.withNoPrototype(Identifier.toKotlin(qualifier) + "." + Identifier.toKotlin(psiClass.name!!))
}
@@ -0,0 +1,12 @@
import java.io.Serializable;
public class Bar implements Serializable {
private static final long serialVersionUID = 0;
int foobar = 0;
}
public class Foo {
private static final long serialVersionUID = 0;
int foobar = 0;
}
@@ -0,0 +1,17 @@
import java.io.Serializable
class Bar : Serializable {
internal var foobar = 0
companion object {
@JvmStatic private val serialVersionUID: Long = 0
}
}
class Foo {
internal var foobar = 0
companion object {
private val serialVersionUID: Long = 0
}
}
+1 -1
View File
@@ -11,6 +11,6 @@ class Language(protected var code: String) : Serializable {
companion object {
var ENGLISH = Language("en")
var SWEDISH = Language("sv")
private val serialVersionUID = -2442762969929206780L
@JvmStatic private val serialVersionUID = -2442762969929206780L
}
}
@@ -120,6 +120,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/annotations/primaryConstructorAnnotation.java");
doTest(fileName);
}
@TestMetadata("serialVersionUID.java")
public void testSerialVersionUID() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/annotations/serialVersionUID.java");
doTest(fileName);
}
}
@TestMetadata("j2k/testData/fileOrElement/anonymousBlock")
@@ -120,6 +120,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/annotations/primaryConstructorAnnotation.java");
doTest(fileName);
}
@TestMetadata("serialVersionUID.java")
public void testSerialVersionUID() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/annotations/serialVersionUID.java");
doTest(fileName);
}
}
@TestMetadata("j2k/testData/fileOrElement/anonymousBlock")