Got rid of conversionScope parameter for JavaToKotlinConverter

This commit is contained in:
Valentin Kipyatkov
2015-04-02 20:14:21 +03:00
parent 751f952536
commit 0ed7d228f6
8 changed files with 70 additions and 58 deletions
@@ -35,7 +35,7 @@ import java.util.ArrayList
class Converter private(
private val elementToConvert: PsiElement,
val settings: ConverterSettings,
val conversionScope: ConversionScope,
val inConversionScope: (PsiElement) -> Boolean,
val referenceSearcher: ReferenceSearcher,
val resolverForConverter: ResolverForConverter,
private val postProcessor: PostProcessor?,
@@ -59,17 +59,17 @@ class Converter private(
public val specialContext: PsiElement? = personalState.specialContext
companion object {
public fun create(elementToConvert: PsiElement, settings: ConverterSettings, conversionScope: ConversionScope,
public fun create(elementToConvert: PsiElement, settings: ConverterSettings, inConversionScope: (PsiElement) -> Boolean,
referenceSearcher: ReferenceSearcher, resolverForConverter: ResolverForConverter, postProcessor: PostProcessor?,
usageProcessingsCollector: (UsageProcessing) -> Unit): Converter {
return Converter(elementToConvert, settings, conversionScope, referenceSearcher, resolverForConverter, postProcessor, CommonState(usageProcessingsCollector), PersonalState(null))
return Converter(elementToConvert, settings, inConversionScope, referenceSearcher, resolverForConverter, postProcessor, CommonState(usageProcessingsCollector), PersonalState(null))
}
}
public fun withSpecialContext(context: PsiElement): Converter = withState(PersonalState(context))
private fun withState(state: PersonalState): Converter
= Converter(elementToConvert, settings, conversionScope, referenceSearcher, resolverForConverter, postProcessor, commonState, state)
= Converter(elementToConvert, settings, inConversionScope, referenceSearcher, resolverForConverter, postProcessor, commonState, state)
private fun createDefaultCodeConverter() = CodeConverter(this, DefaultExpressionConverter(), DefaultStatementConverter(), null)
@@ -227,7 +227,7 @@ class Converter private(
val parameters = annotationMethods
.map { method ->
val returnType = method.getReturnType()
val typeConverted = if (method == annotationMethods.last && returnType is PsiArrayType)
val typeConverted = if (method == annotationMethods.last() && returnType is PsiArrayType)
VarArgType(typeConverter.convertType(returnType.getComponentType(), Nullability.NotNull))
else
typeConverter.convertType(returnType, Nullability.NotNull)
@@ -377,7 +377,7 @@ class Converter private(
var params = convertParameterList(method.getParameterList())
val typeParameterList = convertTypeParameterList(method.getTypeParameterList())
var body = deferredElement { (codeConverter: CodeConverter) ->
var body = deferredElement { codeConverter: CodeConverter ->
val body = codeConverter.withMethodReturnType(method.getReturnType()).convertBlock(method.getBody())
postProcessBody(body)
}
@@ -410,8 +410,8 @@ class Converter private(
if (containing != null) {
val hasOtherJavaSuperclasses = containing.getSuperTypes().any {
//TODO: correctly check for kotlin class
val `class` = it.resolve()
`class` != null && `class`.getQualifiedName() != JAVA_LANG_OBJECT && !conversionScope.contains(`class`)
val klass = it.resolve()
klass != null && klass.getQualifiedName() != JAVA_LANG_OBJECT && !inConversionScope(klass)
}
if (hasOtherJavaSuperclasses) return true
}
@@ -30,18 +30,11 @@ import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.j2k.ast.Element
import org.jetbrains.kotlin.j2k.usageProcessing.UsageProcessing
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
import org.jetbrains.kotlin.resolve.BindingContext
import java.util.ArrayList
import java.util.HashMap
public trait ConversionScope {
public fun contains(element: PsiElement): Boolean
}
public class FilesConversionScope(val files: Collection<PsiJavaFile>) : ConversionScope {
override fun contains(element: PsiElement) = files.any { element.getContainingFile() == it }
}
public trait PostProcessor {
public val contextToAnalyzeIn: PsiElement
public fun analyzeFile(file: JetFile): BindingContext
@@ -72,7 +65,6 @@ public trait PostProcessor {
public class JavaToKotlinConverter(private val project: Project,
private val settings: ConverterSettings,
private val conversionScope: ConversionScope /*TODO: drop this parameter*/,
private val referenceSearcher: ReferenceSearcher,
private val resolverForConverter: ResolverForConverter) {
private val LOG = Logger.getInstance("#org.jetbrains.kotlin.j2k.JavaToKotlinConverter")
@@ -124,7 +116,11 @@ public class JavaToKotlinConverter(private val project: Project,
processFilesWithProgress(0.25) { i ->
val psiElement = psiElementsAndProcessors[i].first
val postProcessor = psiElementsAndProcessors[i].second
val converter = Converter.create(psiElement, settings, conversionScope, referenceSearcher, resolverForConverter, postProcessor, usageProcessingCollector)
fun inConversionScope(element: PsiElement)
= psiElementsAndProcessors.any { it.first.isAncestor(element, strict = false) }
val converter = Converter.create(psiElement, settings, ::inConversionScope, referenceSearcher, resolverForConverter, postProcessor, usageProcessingCollector)
val result = converter.convert()
intermediateResults.add(result)
}
@@ -134,7 +134,7 @@ public object JavaToKotlinTranslator {
fun generateKotlinCode(javaCode: String): String {
val file = createFile(javaCode)
if (file is PsiJavaFile) {
val converter = JavaToKotlinConverter(file.getProject(), ConverterSettings.defaultSettings, FilesConversionScope(listOf(file)), EmptyReferenceSearcher, EmptyResolverForConverter)
val converter = JavaToKotlinConverter(file.getProject(), ConverterSettings.defaultSettings, EmptyReferenceSearcher, EmptyResolverForConverter)
return prettify(converter.elementsToKotlin(listOf(file to null))[0])
}
return ""
@@ -151,7 +151,7 @@ class TypeConverter(val converter: Converter) {
value = fromTypeHeuristics(variableType)
if (value != default) return value
if (!converter.conversionScope.contains(variable)) return default // do not analyze usages of variables not in our conversion scope
if (!converter.inConversionScope(variable)) return default // do not analyze usages of variables not in our conversion scope
val scope = searchScope(variable)
if (scope != null) {
@@ -189,7 +189,7 @@ class TypeConverter(val converter: Converter) {
value = fromTypeHeuristics(returnType)
if (value != default) return value
if (!converter.conversionScope.contains(method)) return default // do not analyze body and usages of methods out of our conversion scope
if (!converter.inConversionScope(method)) return default // do not analyze body and usages of methods out of our conversion scope
val body = method.getBody()
if (body != null) {
@@ -262,7 +262,7 @@ class TypeConverter(val converter: Converter) {
if (variable is PsiField
&& variable.hasModifierProperty(PsiModifier.PRIVATE)
&& converter.conversionScope.contains(variable)
&& converter.inConversionScope(variable)
&& shouldGenerateDefaultInitializer(converter.referenceSearcher, variable)) {
return Nullability.Nullable
}
@@ -43,7 +43,7 @@ public abstract class AbstractJavaToKotlinConverterMultiFileTest : AbstractJavaT
psiFiles.add(psiFile)
}
val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, FilesConversionScope(psiFiles), IdeaReferenceSearcher, IdeaResolverForConverter)
val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, IdeaReferenceSearcher, IdeaResolverForConverter)
val results: List<String> = converter.elementsToKotlin(psiFiles.map { it to J2kPostProcessor(it, formatCode = true) })
fun expectedFile(i: Int) = File(javaFiles[i].getPath().replace(".java", ".kt"))
@@ -106,7 +106,7 @@ public abstract class AbstractJavaToKotlinConverterSingleFileTest : AbstractJava
private fun fileToKotlin(text: String, settings: ConverterSettings, project: Project): String {
val file = createJavaFile(text)
val converter = JavaToKotlinConverter(project, settings, FilesConversionScope(listOf(file)), IdeaReferenceSearcher, IdeaResolverForConverter)
val converter = JavaToKotlinConverter(project, settings, IdeaReferenceSearcher, IdeaResolverForConverter)
return converter.elementsToKotlin(listOf(file to J2kPostProcessor(file, formatCode = false)))[0]
}