New J2K: pass converter context to postprocessing

This commit is contained in:
Ilya Kirillov
2019-04-18 12:42:01 +03:00
committed by Ilya Kirillov
parent c4a238cca4
commit 39b09b39ff
58 changed files with 202 additions and 150 deletions
@@ -44,6 +44,7 @@ import org.jetbrains.kotlin.idea.codeInsight.CodeInsightUtils
import org.jetbrains.kotlin.idea.debugger.KotlinEditorTextProvider import org.jetbrains.kotlin.idea.debugger.KotlinEditorTextProvider
import org.jetbrains.kotlin.idea.debugger.evaluate.compilation.DebugLabelPropertyDescriptorProvider import org.jetbrains.kotlin.idea.debugger.evaluate.compilation.DebugLabelPropertyDescriptorProvider
import org.jetbrains.kotlin.idea.j2k.JavaToKotlinConverterFactory import org.jetbrains.kotlin.idea.j2k.JavaToKotlinConverterFactory
import org.jetbrains.kotlin.idea.refactoring.convertToKotlin
import org.jetbrains.kotlin.idea.refactoring.j2k import org.jetbrains.kotlin.idea.refactoring.j2k
import org.jetbrains.kotlin.idea.refactoring.j2kText import org.jetbrains.kotlin.idea.refactoring.j2kText
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
@@ -242,7 +243,8 @@ class KotlinCodeFragmentFactory : CodeFragmentFactory() {
var convertedFragment: KtExpressionCodeFragment? = null var convertedFragment: KtExpressionCodeFragment? = null
project.executeWriteCommand("Convert java expression to kotlin in Evaluate Expression") { project.executeWriteCommand("Convert java expression to kotlin in Evaluate Expression") {
try { try {
val newText = javaExpression.j2kText() val (elementResults, _, conversionContext) = javaExpression.convertToKotlin() ?: return@executeWriteCommand
val newText = elementResults.singleOrNull()?.text
val newImports = importList?.j2kText() val newImports = importList?.j2kText()
if (newText != null) { if (newText != null) {
convertedFragment = KtExpressionCodeFragment( convertedFragment = KtExpressionCodeFragment(
@@ -253,7 +255,12 @@ class KotlinCodeFragmentFactory : CodeFragmentFactory() {
kotlinCodeFragment.context kotlinCodeFragment.context
) )
AfterConversionPass(project, JavaToKotlinConverterFactory.createPostProcessor(formatCode = false)).run(convertedFragment!!, range = null) AfterConversionPass(project, JavaToKotlinConverterFactory.createPostProcessor(formatCode = false))
.run(
convertedFragment!!,
conversionContext,
range = null
)
} }
} catch (e: Throwable) { } catch (e: Throwable) {
// ignored because text can be invalid // ignored because text can be invalid
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.j2k.AfterConversionPass import org.jetbrains.kotlin.j2k.AfterConversionPass
import org.jetbrains.kotlin.j2k.ConverterContext
import org.jetbrains.kotlin.j2k.ConverterSettings import org.jetbrains.kotlin.j2k.ConverterSettings
import org.jetbrains.kotlin.j2k.ParseContext import org.jetbrains.kotlin.j2k.ParseContext
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
@@ -85,14 +86,19 @@ class ConvertJavaCopyPasteProcessor : CopyPastePostProcessor<TextBlockTransferab
if (isNoConversionPosition(targetFile, bounds.startOffset)) return if (isNoConversionPosition(targetFile, bounds.startOffset)) return
data class Result(val text: String?, val referenceData: Collection<KotlinReferenceData>, val explicitImports: Set<FqName>) data class Result(
val text: String?,
val referenceData: Collection<KotlinReferenceData>,
val explicitImports: Set<FqName>,
val converterContext: ConverterContext?
)
fun doConversion(): Result { fun doConversion(): Result {
val dataForConversion = DataForConversion.prepare(data, project) val dataForConversion = DataForConversion.prepare(data, project)
val result = dataForConversion.elementsAndTexts.convertCodeToKotlin(project) val result = dataForConversion.elementsAndTexts.convertCodeToKotlin(project)
val referenceData = buildReferenceData(result.text, result.parseContext, dataForConversion.importsAndPackage, targetFile) val referenceData = buildReferenceData(result.text, result.parseContext, dataForConversion.importsAndPackage, targetFile)
val text = if (result.textChanged) result.text else null val text = if (result.textChanged) result.text else null
return Result(text, referenceData, result.importsToAdd) return Result(text, referenceData, result.importsToAdd, result.converterContext)
} }
fun insertImports(bounds: TextRange, referenceData: Collection<KotlinReferenceData>, explicitImports: Collection<FqName>): TextRange? { fun insertImports(bounds: TextRange, referenceData: Collection<KotlinReferenceData>, explicitImports: Collection<FqName>): TextRange? {
@@ -153,7 +159,12 @@ class ConvertJavaCopyPasteProcessor : CopyPastePostProcessor<TextBlockTransferab
val newBounds = insertImports(boundsAfterReplace, referenceData, explicitImports) val newBounds = insertImports(boundsAfterReplace, referenceData, explicitImports)
PsiDocumentManager.getInstance(project).commitAllDocuments() PsiDocumentManager.getInstance(project).commitAllDocuments()
AfterConversionPass(project, JavaToKotlinConverterFactory.createPostProcessor(formatCode = true)).run(targetFile, newBounds) AfterConversionPass(project, JavaToKotlinConverterFactory.createPostProcessor(formatCode = true))
.run(
targetFile,
conversionResult?.converterContext,
newBounds
)
conversionPerformed = true conversionPerformed = true
} }
@@ -202,7 +213,8 @@ internal class ConversionResult(
val text: String, val text: String,
val parseContext: ParseContext, val parseContext: ParseContext,
val importsToAdd: Set<FqName>, val importsToAdd: Set<FqName>,
val textChanged: Boolean val textChanged: Boolean,
val converterContext: ConverterContext?
) )
internal fun ElementAndTextList.convertCodeToKotlin(project: Project): ConversionResult { internal fun ElementAndTextList.convertCodeToKotlin(project: Project): ConversionResult {
@@ -214,7 +226,7 @@ internal fun ElementAndTextList.convertCodeToKotlin(project: Project): Conversio
) )
val inputElements = this.toList().filterIsInstance<PsiElement>() val inputElements = this.toList().filterIsInstance<PsiElement>()
val results = val (results, _, converterContext) =
ProgressManager.getInstance().runProcessWithProgressSynchronously( ProgressManager.getInstance().runProcessWithProgressSynchronously(
ThrowableComputable<org.jetbrains.kotlin.j2k.Result, Exception> { ThrowableComputable<org.jetbrains.kotlin.j2k.Result, Exception> {
runReadAction { converter.elementsToKotlin(inputElements) } runReadAction { converter.elementsToKotlin(inputElements) }
@@ -222,7 +234,7 @@ internal fun ElementAndTextList.convertCodeToKotlin(project: Project): Conversio
JavaToKotlinAction.title, JavaToKotlinAction.title,
false, false,
project project
).results )
val importsToAdd = LinkedHashSet<FqName>() val importsToAdd = LinkedHashSet<FqName>()
@@ -257,7 +269,13 @@ internal fun ElementAndTextList.convertCodeToKotlin(project: Project): Conversio
val convertedCode = convertedCodeBuilder.toString() val convertedCode = convertedCodeBuilder.toString()
val originalCode = originalCodeBuilder.toString() val originalCode = originalCodeBuilder.toString()
return ConversionResult(convertedCode, parseContext ?: ParseContext.CODE_BLOCK, importsToAdd, convertedCode != originalCode) return ConversionResult(
convertedCode,
parseContext ?: ParseContext.CODE_BLOCK,
importsToAdd,
convertedCode != originalCode,
converterContext
)
} }
internal fun isNoConversionPosition(file: KtFile, offset: Int): Boolean { internal fun isNoConversionPosition(file: KtFile, offset: Int): Boolean {
@@ -109,7 +109,8 @@ class ConvertTextJavaCopyPasteProcessor : CopyPastePostProcessor<TextBlockTransf
val additionalImports = dataForConversion.tryResolveImports(targetFile) val additionalImports = dataForConversion.tryResolveImports(targetFile)
var convertedImportsText = additionalImports.convertCodeToKotlin(project).text var convertedImportsText = additionalImports.convertCodeToKotlin(project).text
val convertedText = dataForConversion.convertCodeToKotlin(project).text val convertedResult = dataForConversion.convertCodeToKotlin(project)
val convertedText = convertedResult.text
val newBounds = runWriteAction { val newBounds = runWriteAction {
@@ -129,7 +130,12 @@ class ConvertTextJavaCopyPasteProcessor : CopyPastePostProcessor<TextBlockTransf
} }
psiDocumentManager.commitAllDocuments() psiDocumentManager.commitAllDocuments()
AfterConversionPass(project, JavaToKotlinConverterFactory.createPostProcessor(formatCode = true)).run(targetFile, newBounds) AfterConversionPass(project, JavaToKotlinConverterFactory.createPostProcessor(formatCode = true))
.run(
targetFile,
convertedResult.converterContext,
newBounds
)
conversionPerformed = true conversionPerformed = true
} }
@@ -32,13 +32,12 @@ import org.jetbrains.kotlin.idea.core.util.EDT
import org.jetbrains.kotlin.idea.util.ImportInsertHelper import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.j2k.ConverterContext
import org.jetbrains.kotlin.j2k.PostProcessor import org.jetbrains.kotlin.j2k.PostProcessor
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.psi.psiUtil.elementsInRange import org.jetbrains.kotlin.psi.psiUtil.elementsInRange
import org.jetbrains.kotlin.resolve.ImportPath
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
import java.util.* import java.util.*
@@ -58,7 +57,7 @@ class J2kPostProcessor(private val formatCode: Boolean) : PostProcessor {
PROCESS PROCESS
} }
override fun doAdditionalProcessing(file: KtFile, rangeMarker: RangeMarker?) = override fun doAdditionalProcessing(file: KtFile, converterContext: ConverterContext?, rangeMarker: RangeMarker?) =
runBlocking(EDT.ModalityStateElement(ModalityState.defaultModalityState())) { runBlocking(EDT.ModalityStateElement(ModalityState.defaultModalityState())) {
do { do {
var modificationStamp: Long? = file.modificationStamp var modificationStamp: Long? = file.modificationStamp
@@ -16,6 +16,6 @@ object JavaToKotlinConverterFactory {
): JavaToKotlinConverter = ): JavaToKotlinConverter =
J2kConverterExtension.extension.createJavaToKotlinConverter(project, settings, services) J2kConverterExtension.extension.createJavaToKotlinConverter(project, settings, services)
fun createPostProcessor(formatCode: Boolean, settings: ConverterSettings = ConverterSettings.defaultSettings): PostProcessor = fun createPostProcessor(formatCode: Boolean): PostProcessor =
J2kConverterExtension.extension.createPostProcessor(formatCode, settings) J2kConverterExtension.extension.createPostProcessor(formatCode)
} }
@@ -13,6 +13,6 @@ class OldJ2kConverterExtension : J2kConverterExtension() {
): JavaToKotlinConverter = ): JavaToKotlinConverter =
OldJavaToKotlinConverter(project, settings, services) OldJavaToKotlinConverter(project, settings, services)
override fun createPostProcessor(formatCode: Boolean, settings: ConverterSettings): PostProcessor = override fun createPostProcessor(formatCode: Boolean): PostProcessor =
J2kPostProcessor(formatCode) J2kPostProcessor(formatCode)
} }
@@ -84,7 +84,6 @@ import org.jetbrains.kotlin.idea.refactoring.rename.canonicalRender
import org.jetbrains.kotlin.idea.util.* import org.jetbrains.kotlin.idea.util.*
import org.jetbrains.kotlin.idea.util.string.collapseSpaces import org.jetbrains.kotlin.idea.util.string.collapseSpaces
import org.jetbrains.kotlin.j2k.ConverterSettings import org.jetbrains.kotlin.j2k.ConverterSettings
import org.jetbrains.kotlin.j2k.JavaToKotlinConverter
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.FqNameUnsafe
@@ -643,7 +642,10 @@ fun createJavaClass(klass: KtClass, targetClass: PsiClass?, forcePlainClass: Boo
return javaClass return javaClass
} }
fun PsiElement.j2kText(): String? { fun PsiElement.j2kText(): String? =
convertToKotlin()?.results?.single()?.text //TODO: insert imports
fun PsiElement.convertToKotlin(): org.jetbrains.kotlin.j2k.Result? {
if (language != JavaLanguage.INSTANCE) return null if (language != JavaLanguage.INSTANCE) return null
val j2kConverter = val j2kConverter =
@@ -652,7 +654,7 @@ fun PsiElement.j2kText(): String? {
ConverterSettings.defaultSettings, ConverterSettings.defaultSettings,
IdeaJavaToKotlinServices IdeaJavaToKotlinServices
) )
return j2kConverter.elementsToKotlin(listOf(this)).results.single()?.text ?: return null //TODO: insert imports return j2kConverter.elementsToKotlin(listOf(this))
} }
fun PsiExpression.j2k(): KtExpression? { fun PsiExpression.j2k(): KtExpression? {
@@ -21,7 +21,7 @@ import com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
class AfterConversionPass(val project: Project, val postProcessor: PostProcessor) { class AfterConversionPass(val project: Project, val postProcessor: PostProcessor) {
fun run(kotlinFile: KtFile, range: TextRange?) { fun run(kotlinFile: KtFile, converterContext: ConverterContext?, range: TextRange?) {
val rangeMarker = if (range != null) { val rangeMarker = if (range != null) {
val document = kotlinFile.viewProvider.document!! val document = kotlinFile.viewProvider.document!!
val marker = document.createRangeMarker(range.startOffset, range.endOffset) val marker = document.createRangeMarker(range.startOffset, range.endOffset)
@@ -32,6 +32,6 @@ class AfterConversionPass(val project: Project, val postProcessor: PostProcessor
null null
} }
postProcessor.doAdditionalProcessing(kotlinFile, rangeMarker) postProcessor.doAdditionalProcessing(kotlinFile, converterContext, rangeMarker)
} }
} }
@@ -14,7 +14,7 @@ abstract class J2kConverterExtension : AbstractExtensionPointBean() {
services: JavaToKotlinConverterServices services: JavaToKotlinConverterServices
): JavaToKotlinConverter ): JavaToKotlinConverter
abstract fun createPostProcessor(formatCode: Boolean, settings: ConverterSettings = ConverterSettings.defaultSettings): PostProcessor abstract fun createPostProcessor(formatCode: Boolean): PostProcessor
companion object { companion object {
@@ -40,7 +40,7 @@ import java.util.*
interface PostProcessor { interface PostProcessor {
fun insertImport(file: KtFile, fqName: FqName) fun insertImport(file: KtFile, fqName: FqName)
fun doAdditionalProcessing(file: KtFile, rangeMarker: RangeMarker?) fun doAdditionalProcessing(file: KtFile, converterContext: ConverterContext?, rangeMarker: RangeMarker?)
} }
enum class ParseContext { enum class ParseContext {
@@ -55,10 +55,15 @@ interface ExternalCodeProcessing {
data class ElementResult(val text: String, val importsToAdd: Set<FqName>, val parseContext: ParseContext) data class ElementResult(val text: String, val importsToAdd: Set<FqName>, val parseContext: ParseContext)
data class Result(val results: List<ElementResult?>, val externalCodeProcessing: ExternalCodeProcessing?) data class Result(
val results: List<ElementResult?>,
val externalCodeProcessing: ExternalCodeProcessing?,
val converterContext: ConverterContext?
)
data class FilesResult(val results: List<String>, val externalCodeProcessing: ExternalCodeProcessing?) data class FilesResult(val results: List<String>, val externalCodeProcessing: ExternalCodeProcessing?)
interface ConverterContext
abstract class JavaToKotlinConverter { abstract class JavaToKotlinConverter {
protected abstract fun elementsToKotlin(inputElements: List<PsiElement>, processor: WithProgressProcessor): Result protected abstract fun elementsToKotlin(inputElements: List<PsiElement>, processor: WithProgressProcessor): Result
@@ -101,7 +106,7 @@ class OldJavaToKotlinConverter(
result!!.importsToAdd.forEach { postProcessor.insertImport(kotlinFile, it) } result!!.importsToAdd.forEach { postProcessor.insertImport(kotlinFile, it) }
AfterConversionPass(project, postProcessor).run(kotlinFile, range = null) AfterConversionPass(project, postProcessor).run(kotlinFile, converterContext = null, range = null)
kotlinFile.text kotlinFile.text
} catch (e: ProcessCanceledException) { } catch (e: ProcessCanceledException) {
@@ -140,7 +145,7 @@ class OldJavaToKotlinConverter(
val externalCodeProcessing = buildExternalCodeProcessing(usageProcessings, ::inConversionScope) val externalCodeProcessing = buildExternalCodeProcessing(usageProcessings, ::inConversionScope)
return Result(results, externalCodeProcessing) return Result(results, externalCodeProcessing, null)
} catch (e: ElementCreationStackTraceRequiredException) { } catch (e: ElementCreationStackTraceRequiredException) {
// if we got this exception then we need to turn element creation stack traces on to get better diagnostic // if we got this exception then we need to turn element creation stack traces on to get better diagnostic
Element.saveCreationStacktraces = true Element.saveCreationStacktraces = true
@@ -34,7 +34,7 @@ import org.jetbrains.kotlin.idea.formatter.commitAndUnblockDocument
import org.jetbrains.kotlin.idea.util.ImportInsertHelper import org.jetbrains.kotlin.idea.util.ImportInsertHelper
import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.j2k.ConverterSettings import org.jetbrains.kotlin.j2k.ConverterContext
import org.jetbrains.kotlin.j2k.PostProcessor import org.jetbrains.kotlin.j2k.PostProcessor
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.AnalysisScope import org.jetbrains.kotlin.nj2k.nullabilityAnalysis.AnalysisScope
@@ -47,10 +47,7 @@ import org.jetbrains.kotlin.psi.psiUtil.elementsInRange
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
import java.util.* import java.util.*
class NewJ2kPostProcessor( class NewJ2kPostProcessor(private val formatCode: Boolean) : PostProcessor {
private val formatCode: Boolean,
private val settings: ConverterSettings?
) : PostProcessor {
override fun insertImport(file: KtFile, fqName: FqName) { override fun insertImport(file: KtFile, fqName: FqName) {
ApplicationManager.getApplication().invokeAndWait { ApplicationManager.getApplication().invokeAndWait {
runWriteAction { runWriteAction {
@@ -66,10 +63,14 @@ class NewJ2kPostProcessor(
PROCESS PROCESS
} }
private suspend fun List<NewJ2kPostProcessing>.runProcessings(file: KtFile, rangeMarker: RangeMarker?): Boolean { private suspend fun List<NewJ2kPostProcessing>.runProcessings(
file: KtFile,
converterContext: NewJ2kConverterContext,
rangeMarker: RangeMarker?
): Boolean {
var modificationStamp: Long? = file.modificationStamp var modificationStamp: Long? = file.modificationStamp
val elementToActions = runReadAction { val elementToActions = runReadAction {
collectAvailableActions(this, file, rangeMarker) collectAvailableActions(this, file, converterContext, rangeMarker)
} }
withContext(EDT) { withContext(EDT) {
for ((element, action, _, writeActionNeeded) in elementToActions) { for ((element, action, _, writeActionNeeded) in elementToActions) {
@@ -100,23 +101,24 @@ class NewJ2kPostProcessor(
} }
private suspend fun Processing.runProcessings(file: KtFile, rangeMarker: RangeMarker?) { private suspend fun Processing.runProcessings(file: KtFile, converterContext: NewJ2kConverterContext, rangeMarker: RangeMarker?) {
when (this) { when (this) {
is SingleOneTimeProcessing -> listOf(processing).runProcessings(file, rangeMarker) is SingleOneTimeProcessing -> listOf(processing).runProcessings(file, converterContext, rangeMarker)
is RepeatableProcessingGroup -> is RepeatableProcessingGroup ->
do { do {
val needContinue = processings.runProcessings(file, rangeMarker) val needContinue = processings.runProcessings(file, converterContext, rangeMarker)
} while (needContinue) } while (needContinue)
is OneTimeProcessingGroup -> is OneTimeProcessingGroup ->
processings.forEach { it.runProcessings(file, rangeMarker) } processings.forEach { it.runProcessings(file, converterContext, rangeMarker) }
} }
} }
override fun doAdditionalProcessing(file: KtFile, rangeMarker: RangeMarker?) { override fun doAdditionalProcessing(file: KtFile, converterContext: ConverterContext?, rangeMarker: RangeMarker?) {
runBlocking(EDT.ModalityStateElement(ModalityState.defaultModalityState())) { runBlocking(EDT.ModalityStateElement(ModalityState.defaultModalityState())) {
withContext(EDT) { withContext(EDT) {
NullabilityAnalysisFacade( NullabilityAnalysisFacade(
converterContext as NewJ2kConverterContext,
getTypeElementNullability = ::nullabilityByUndefinedNullabilityComment, getTypeElementNullability = ::nullabilityByUndefinedNullabilityComment,
prepareTypeElement = ::prepareTypeElementByMakingAllTypesNullableConsideringNullabilityComment, prepareTypeElement = ::prepareTypeElementByMakingAllTypesNullableConsideringNullabilityComment,
debugPrint = false debugPrint = false
@@ -131,7 +133,7 @@ class NewJ2kPostProcessor(
} }
} }
} }
NewJ2KPostProcessingRegistrar.mainProcessings.runProcessings(file, rangeMarker) NewJ2KPostProcessingRegistrar.mainProcessings.runProcessings(file, converterContext as NewJ2kConverterContext, rangeMarker)
withContext(EDT) { withContext(EDT) {
runWriteAction { runWriteAction {
file.commitAndUnblockDocument() file.commitAndUnblockDocument()
@@ -159,6 +161,7 @@ class NewJ2kPostProcessor(
private fun collectAvailableActions( private fun collectAvailableActions(
processings: Collection<NewJ2kPostProcessing>, processings: Collection<NewJ2kPostProcessing>,
file: KtFile, file: KtFile,
context: NewJ2kConverterContext,
rangeMarker: RangeMarker? rangeMarker: RangeMarker?
): List<ActionData> { ): List<ActionData> {
val diagnostics = analyzeFileRange(file, rangeMarker) val diagnostics = analyzeFileRange(file, rangeMarker)
@@ -174,7 +177,7 @@ class NewJ2kPostProcessor(
if (rangeResult == RangeFilterResult.PROCESS) { if (rangeResult == RangeFilterResult.PROCESS) {
processings.forEach { processing -> processings.forEach { processing ->
val action = processing.createAction(element, diagnostics, settings) val action = processing.createAction(element, diagnostics, context.converter.settings)
if (action != null) { if (action != null) {
availableActions.add( availableActions.add(
ActionData( ActionData(
@@ -13,6 +13,6 @@ class NewJ2kConverterExtension : J2kConverterExtension() {
): JavaToKotlinConverter = ): JavaToKotlinConverter =
NewJavaToKotlinConverter(project, settings, services) NewJavaToKotlinConverter(project, settings, services)
override fun createPostProcessor(formatCode: Boolean, settings: ConverterSettings): PostProcessor = override fun createPostProcessor(formatCode: Boolean): PostProcessor =
NewJ2kPostProcessor(formatCode, settings) NewJ2kPostProcessor(formatCode)
} }
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.nj2k.tree.JKTreeRoot
object ConversionsRunner { object ConversionsRunner {
private fun createRootConversion(context: ConversionContext) = private fun createRootConversion(context: NewJ2kConverterContext) =
batchPipe { batchPipe {
//Java --> Kotlin conversions //Java --> Kotlin conversions
+NonCodeElementsConversion() +NonCodeElementsConversion()
@@ -82,9 +82,10 @@ object ConversionsRunner {
+ClassToObjectPromotionConversion(context) +ClassToObjectPromotionConversion(context)
+CollectImportsConversion(context) +CollectImportsConversion(context)
+SortClassMembersConversion() +SortClassMembersConversion()
+AddElementsInfoConversion(context)
} }
fun doApply(trees: List<JKTreeRoot>, context: ConversionContext) { fun doApply(trees: List<JKTreeRoot>, context: NewJ2kConverterContext) {
val conversion = createRootConversion(context) val conversion = createRootConversion(context)
conversion.runConversion(trees, context) conversion.runConversion(trees, context)
} }
@@ -5,17 +5,18 @@
package org.jetbrains.kotlin.nj2k package org.jetbrains.kotlin.nj2k
import com.intellij.openapi.command.impl.DummyProject
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.j2k.* import org.jetbrains.kotlin.j2k.*
import org.jetbrains.kotlin.nj2k.tree.JKElement
data class ConversionContext( data class NewJ2kConverterContext(
val symbolProvider: JKSymbolProvider, val symbolProvider: JKSymbolProvider,
val converter: NewJavaToKotlinConverter, val converter: NewJavaToKotlinConverter,
val inConversionContext: (PsiElement) -> Boolean, val inConversionContext: (PsiElement) -> Boolean,
val importStorage: ImportStorage val importStorage: ImportStorage,
) { val elementsInfoStorage: ElementInfoStorage
) : ConverterContext {
val project: Project get() = converter.project val project: Project get() = converter.project
val typeFlavorCalculator = TypeFlavorCalculator(object : TypeFlavorConverterFacade { val typeFlavorCalculator = TypeFlavorCalculator(object : TypeFlavorConverterFacade {
override val referenceSearcher: ReferenceSearcher override val referenceSearcher: ReferenceSearcher
@@ -28,4 +29,20 @@ data class ConversionContext(
override fun inConversionScope(element: PsiElement): Boolean = inConversionContext(element) override fun inConversionScope(element: PsiElement): Boolean = inConversionContext(element)
}) })
} companion object {
val DUMMY =
NewJ2kConverterContext(
JKSymbolProvider(),
NewJavaToKotlinConverter(
DummyProject.getInstance(),
ConverterSettings.defaultSettings,
EmptyJavaToKotlinServices
),
{ false },
ImportStorage(),
ElementInfoStorage()
)
}
}
@@ -51,7 +51,7 @@ class NewJavaToKotlinConverter(
progress: ProgressIndicator progress: ProgressIndicator
): FilesResult { ): FilesResult {
val withProgressProcessor = WithProgressProcessor(progress, files) val withProgressProcessor = WithProgressProcessor(progress, files)
val (results, externalCodeProcessing) = ApplicationManager.getApplication().runReadAction(Computable { val (results, externalCodeProcessing, context) = ApplicationManager.getApplication().runReadAction(Computable {
elementsToKotlin(files, withProgressProcessor) elementsToKotlin(files, withProgressProcessor)
}) })
@@ -73,7 +73,7 @@ class NewJavaToKotlinConverter(
} }
CommandProcessor.getInstance().runUndoTransparentAction { CommandProcessor.getInstance().runUndoTransparentAction {
AfterConversionPass(project, postProcessor).run(kotlinFile, range = null) AfterConversionPass(project, postProcessor).run(kotlinFile, context, range = null)
} }
kotlinFile.text kotlinFile.text
@@ -97,7 +97,7 @@ class NewJavaToKotlinConverter(
element to treeBuilder.buildTree(element) element to treeBuilder.buildTree(element)
} }
val context = ConversionContext( val context = NewJ2kConverterContext(
symbolProvider, symbolProvider,
this, this,
{ it.containingFile in inputElements }, { it.containingFile in inputElements },
@@ -119,6 +119,6 @@ class NewJavaToKotlinConverter(
) )
} }
return Result(results, null) return Result(results, null, context)
} }
} }
@@ -6,12 +6,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.toExpression import org.jetbrains.kotlin.nj2k.toExpression
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class AnnotationClassConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class AnnotationClassConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
if (element.classKind != JKClass.ClassKind.ANNOTATION) return recurse(element) if (element.classKind != JKClass.ClassKind.ANNOTATION) return recurse(element)
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.isVarargsArgument import org.jetbrains.kotlin.nj2k.isVarargsArgument
import org.jetbrains.kotlin.nj2k.toExpression import org.jetbrains.kotlin.nj2k.toExpression
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKAnnotationParameterImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtAnnotationArrayInitializerExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtAnnotationArrayInitializerExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKNameIdentifierImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKNameIdentifierImpl
class AnnotationConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class AnnotationConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKAnnotation) return recurse(element) if (element !is JKAnnotation) return recurse(element)
fixVarargsInvocation(element) fixVarargsInvocation(element)
@@ -8,14 +8,14 @@ package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.PrimitiveType
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.toArgumentList import org.jetbrains.kotlin.nj2k.toArgumentList
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.resolve.CollectionLiteralResolver import org.jetbrains.kotlin.resolve.CollectionLiteralResolver
class ArrayInitializerConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class ArrayInitializerConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
var newElement = element var newElement = element
if (element is JKJavaNewArray) { if (element is JKJavaNewArray) {
@@ -10,15 +10,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKExpressionStatementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldAccessExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldAccessExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldSymbol
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtThrowExpressionImpl
class ArrayOperationsConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class ArrayOperationsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKQualifiedExpression) return recurse(element) if (element !is JKQualifiedExpression) return recurse(element)
val selector = element.selector as? JKFieldAccessExpression ?: return recurse(element) val selector = element.selector as? JKFieldAccessExpression ?: return recurse(element)
@@ -8,12 +8,10 @@ package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.* import org.jetbrains.kotlin.nj2k.*
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKExpressionStatementImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKExpressionStatementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKJavaOperatorImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKLambdaExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKLambdaExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.toKtToken
class AssertStatementConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class AssertStatementConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaAssertStatement) return recurse(element) if (element !is JKJavaAssertStatement) return recurse(element)
val messageExpression = val messageExpression =
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.addToStdlib.cast
class AssignmentAsExpressionToAlsoConversion(val context: ConversionContext) : RecursiveApplicableConversionBase() { class AssignmentAsExpressionToAlsoConversion(val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaAssignmentExpression) return recurse(element) if (element !is JKJavaAssignmentExpression) return recurse(element)
element.invalidate() element.invalidate()
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class AssignmentStatementValCreationConversion(val context: ConversionContext) : RecursiveApplicableConversionBase() { class AssignmentStatementValCreationConversion(val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKKtAlsoCallExpression) return recurse(element) if (element !is JKKtAlsoCallExpression) return recurse(element)
val codeBlock = (element.statement as? JKBlockStatement)?.block ?: return recurse(element) val codeBlock = (element.statement as? JKBlockStatement)?.block ?: return recurse(element)
@@ -16,17 +16,17 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
interface BatchBaseConversion { interface BatchBaseConversion {
fun runConversion(treeRoots: List<JKTreeElement>, context: ConversionContext): Boolean fun runConversion(treeRoots: List<JKTreeElement>, context: NewJ2kConverterContext): Boolean
} }
interface SequentialBaseConversion : BatchBaseConversion { interface SequentialBaseConversion : BatchBaseConversion {
fun runConversion(treeRoot: JKTreeElement, context: ConversionContext): Boolean fun runConversion(treeRoot: JKTreeElement, context: NewJ2kConverterContext): Boolean
override fun runConversion(treeRoots: List<JKTreeElement>, context: ConversionContext): Boolean { override fun runConversion(treeRoots: List<JKTreeElement>, context: NewJ2kConverterContext): Boolean {
return treeRoots.asSequence().map { runConversion(it, context) }.max() ?: false return treeRoots.asSequence().map { runConversion(it, context) }.max() ?: false
} }
} }
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class BlockToRunConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class BlockToRunConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKBlockStatement) return recurse(element) if (element !is JKBlockStatement) return recurse(element)
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKArgumentListImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKArgumentListImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtCallExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtCallExpressionImpl
class BoxedTypeOperationsConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class BoxedTypeOperationsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
return recurse( return recurse(
when (element) { when (element) {
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.addToStdlib.cast
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class BuiltinMembersConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKExpression) return recurse(element) if (element !is JKExpression) return recurse(element)
return recurse(element.convert() ?: element) return recurse(element.convert() ?: element)
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.getCompanion import org.jetbrains.kotlin.nj2k.getCompanion
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKAnnotationListImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKAnnotationListImpl
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKClassImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKModalityModifierElementImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKModalityModifierElementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
class ClassToObjectPromotionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class ClassToObjectPromotionConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKClass && element.classKind == JKClass.ClassKind.CLASS) { if (element is JKClass && element.classKind == JKClass.ClassKind.CLASS) {
val companion = element.getCompanion() ?: return recurse(element) val companion = element.getCompanion() ?: return recurse(element)
@@ -11,14 +11,14 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKSymbol import org.jetbrains.kotlin.nj2k.tree.impl.JKSymbol
import org.jetbrains.kotlin.nj2k.tree.impl.fqNameToImport import org.jetbrains.kotlin.nj2k.tree.impl.fqNameToImport
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class CollectImportsConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class CollectImportsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
when (element) { when (element) {
is JKClassAccessExpression -> addSymbol(element.identifier) is JKClassAccessExpression -> addSymbol(element.identifier)
@@ -5,31 +5,31 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
class BatchPipelineConversion(val conversions: List<BatchBaseConversion>) : BatchBaseConversion { class BatchPipelineConversion(val conversions: List<BatchBaseConversion>) : BatchBaseConversion {
override fun runConversion(treeRoots: List<JKTreeElement>, context: ConversionContext): Boolean { override fun runConversion(treeRoots: List<JKTreeElement>, context: NewJ2kConverterContext): Boolean {
return conversions.asSequence().map { it.runConversion(treeRoots, context) }.max() ?: false return conversions.asSequence().map { it.runConversion(treeRoots, context) }.max() ?: false
} }
} }
class SequentialPipelineConversion(val conversions: List<SequentialBaseConversion>) : SequentialBaseConversion { class SequentialPipelineConversion(val conversions: List<SequentialBaseConversion>) : SequentialBaseConversion {
override fun runConversion(treeRoot: JKTreeElement, context: ConversionContext): Boolean { override fun runConversion(treeRoot: JKTreeElement, context: NewJ2kConverterContext): Boolean {
return conversions.asSequence().map { it.runConversion(treeRoot, context) }.max() ?: false return conversions.asSequence().map { it.runConversion(treeRoot, context) }.max() ?: false
} }
} }
class BatchRepeatConversion(val conversion: BatchBaseConversion) : BatchBaseConversion { class BatchRepeatConversion(val conversion: BatchBaseConversion) : BatchBaseConversion {
override fun runConversion(treeRoots: List<JKTreeElement>, context: ConversionContext): Boolean { override fun runConversion(treeRoots: List<JKTreeElement>, context: NewJ2kConverterContext): Boolean {
return true in generateSequence { conversion.runConversion(treeRoots, context) }.takeWhile { it } return true in generateSequence { conversion.runConversion(treeRoots, context) }.takeWhile { it }
} }
} }
class SequentialRepeatConversion(val conversion: SequentialBaseConversion) : SequentialBaseConversion { class SequentialRepeatConversion(val conversion: SequentialBaseConversion) : SequentialBaseConversion {
override fun runConversion(treeRoot: JKTreeElement, context: ConversionContext): Boolean { override fun runConversion(treeRoot: JKTreeElement, context: NewJ2kConverterContext): Boolean {
return true in generateSequence { conversion.runConversion(treeRoot, context) }.takeWhile { it } return true in generateSequence { conversion.runConversion(treeRoot, context) }.takeWhile { it }
} }
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtConstructorImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtConstructorImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKStubExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKStubExpressionImpl
class ConstructorConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class ConstructorConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaMethod) return recurse(element) if (element !is JKJavaMethod) return recurse(element)
val outerClass = element.parentOfType<JKClass>() ?: return recurse(element) val outerClass = element.parentOfType<JKClass>() ?: return recurse(element)
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.copyTreeAndDetach import org.jetbrains.kotlin.nj2k.copyTreeAndDetach
import org.jetbrains.kotlin.nj2k.jvmAnnotation import org.jetbrains.kotlin.nj2k.jvmAnnotation
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKUniverseMethodSymbol
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class DefaultArgumentsConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class DefaultArgumentsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
private fun JKMethod.canNotBeMerged(): Boolean = private fun JKMethod.canNotBeMerged(): Boolean =
modality == Modality.ABSTRACT modality == Modality.ABSTRACT
@@ -6,13 +6,13 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import com.intellij.psi.PsiEnumConstant import com.intellij.psi.PsiEnumConstant
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.psi.psiUtil.containingClass import org.jetbrains.kotlin.psi.psiUtil.containingClass
class EnumFieldAccessConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class EnumFieldAccessConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKFieldAccessExpression) return recurse(element) if (element !is JKFieldAccessExpression) return recurse(element)
if ((element.parent as? JKQualifiedExpression)?.selector == element) return recurse(element) if ((element.parent as? JKQualifiedExpression)?.selector == element) return recurse(element)
@@ -5,13 +5,13 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.equalsExpression import org.jetbrains.kotlin.nj2k.equalsExpression
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKParenthesizedExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKParenthesizedExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.deepestFqName import org.jetbrains.kotlin.nj2k.tree.impl.deepestFqName
class EqualsOperatorConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class EqualsOperatorConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKQualifiedExpression) return recurse(element) if (element !is JKQualifiedExpression) return recurse(element)
if (element.receiver is JKSuperExpression) return recurse(element) if (element.receiver is JKSuperExpression) return recurse(element)
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.*
import kotlin.math.abs import kotlin.math.abs
class ForConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class ForConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
private val referenceSearcher: ReferenceSearcher private val referenceSearcher: ReferenceSearcher
get() = context.converter.converterServices.oldServices.referenceSearcher get() = context.converter.converterServices.oldServices.referenceSearcher
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class ImplicitCastsConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class ImplicitCastsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
when (element) { when (element) {
is JKVariable -> convertVariable(element) is JKVariable -> convertVariable(element)
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.findUsages import org.jetbrains.kotlin.nj2k.findUsages
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class ImplicitInitializerConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class ImplicitInitializerConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
enum class InitializationState { enum class InitializationState {
INITIALIZED_IN_ALL_CONSTRUCTORS, INITIALIZED_IN_ALL_CONSTRUCTORS,
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class InsertDefaultPrimaryConstructorConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class InsertDefaultPrimaryConstructorConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
if (element.classKind != JKClass.ClassKind.CLASS) return recurse(element) if (element.classKind != JKClass.ClassKind.CLASS) return recurse(element)
@@ -6,12 +6,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import com.intellij.psi.PsiMember import com.intellij.psi.PsiMember
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
import org.jetbrains.kotlin.nj2k.visibility import org.jetbrains.kotlin.nj2k.visibility
class InternalDeclarationConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class InternalDeclarationConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKVisibilityOwner || element !is JKModalityOwner) return recurse(element) if (element !is JKVisibilityOwner || element !is JKModalityOwner) return recurse(element)
val containingClass = element.parentOfType<JKClass>() val containingClass = element.parentOfType<JKClass>()
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.copyTreeAndDetach import org.jetbrains.kotlin.nj2k.copyTreeAndDetach
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKAnnotationParameterImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKAnnotationParameterImpl
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldAccessExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtLiteralExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtLiteralExpressionImpl
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class JavaAnnotationsConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class JavaAnnotationsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKAnnotationList) { if (element is JKAnnotationList) {
for (annotation in element.annotations) { for (annotation in element.annotations) {
@@ -17,13 +17,13 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.throwAnnotation import org.jetbrains.kotlin.nj2k.throwAnnotation
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtFunctionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtFunctionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
class JavaMethodToKotlinFunctionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class JavaMethodToKotlinFunctionConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaMethod) return recurse(element) if (element !is JKJavaMethod) return recurse(element)
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.annotationByFqName import org.jetbrains.kotlin.nj2k.annotationByFqName
import org.jetbrains.kotlin.nj2k.jvmAnnotation import org.jetbrains.kotlin.nj2k.jvmAnnotation
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
class JavaModifiersConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class JavaModifiersConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKModalityOwner && element is JKAnnotationListOwner) { if (element is JKModalityOwner && element is JKAnnotationListOwner) {
val overrideAnnotation = element.annotationList.annotationByFqName("java.lang.Override") val overrideAnnotation = element.annotationList.annotationByFqName("java.lang.Override")
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class JavaStandartMethodsConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class JavaStandartMethodsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
for (declaration in element.classBody.declarations) { for (declaration in element.classBody.declarations) {
@@ -8,12 +8,12 @@ package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.load.java.NOT_NULL_ANNOTATIONS import org.jetbrains.kotlin.load.java.NOT_NULL_ANNOTATIONS
import org.jetbrains.kotlin.load.java.NULLABLE_ANNOTATIONS import org.jetbrains.kotlin.load.java.NULLABLE_ANNOTATIONS
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKTypeElementImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKTypeElementImpl
class JetbrainsNullableAnnotationsConverter(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class JetbrainsNullableAnnotationsConverter(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKAnnotationListOwner) return recurse(element) if (element !is JKAnnotationListOwner) return recurse(element)
@@ -5,15 +5,14 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.util.collectionUtils.concatInOrder
//TODO temporary //TODO temporary
class MainFunctionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class MainFunctionConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKMethod) return recurse(element) if (element !is JKMethod) return recurse(element)
if (element.isMainFunctionDeclaration()) { if (element.isMainFunctionDeclaration()) {
@@ -7,11 +7,11 @@ package org.jetbrains.kotlin.nj2k.conversions
import com.intellij.psi.PsiClass import com.intellij.psi.PsiClass
import com.intellij.psi.PsiMethod import com.intellij.psi.PsiMethod
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
class ModalityConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class ModalityConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
when (element) { when (element) {
is JKClass -> processClass(element) is JKClass -> processClass(element)
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.nj2k.conversions
import com.intellij.psi.JavaTokenType import com.intellij.psi.JavaTokenType
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.kotlinBinaryExpression import org.jetbrains.kotlin.nj2k.kotlinBinaryExpression
import org.jetbrains.kotlin.nj2k.kotlinPostfixExpression import org.jetbrains.kotlin.nj2k.kotlinPostfixExpression
import org.jetbrains.kotlin.nj2k.kotlinPrefixExpression import org.jetbrains.kotlin.nj2k.kotlinPrefixExpression
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class OperatorExpressionConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class OperatorExpressionConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKOperatorExpression) return recurse(element) if (element !is JKOperatorExpression) return recurse(element)
val operator = element.operator as? JKJavaOperatorImpl ?: return recurse(element) val operator = element.operator as? JKJavaOperatorImpl ?: return recurse(element)
@@ -6,13 +6,13 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.hasWritableUsages import org.jetbrains.kotlin.nj2k.hasWritableUsages
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class ParameterModificationInMethodCallsConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class ParameterModificationInMethodCallsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKMethod) return recurse(element) if (element !is JKMethod) return recurse(element)
val newVariables = val newVariables =
@@ -5,13 +5,13 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.replace import org.jetbrains.kotlin.nj2k.replace
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtInitDeclarationImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtInitDeclarationImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtPrimaryConstructorImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtPrimaryConstructorImpl
class PrimaryConstructorDetectConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class PrimaryConstructorDetectConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKClass && if (element is JKClass &&
(element.classKind == JKClass.ClassKind.CLASS || element.classKind == JKClass.ClassKind.ENUM) (element.classKind == JKClass.ClassKind.CLASS || element.classKind == JKClass.ClassKind.ENUM)
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
abstract class RecursiveApplicableConversionBase : MatchBasedConversion() { abstract class RecursiveApplicableConversionBase : MatchBasedConversion() {
@@ -13,7 +13,7 @@ abstract class RecursiveApplicableConversionBase : MatchBasedConversion() {
somethingChanged = true somethingChanged = true
} }
override fun runConversion(treeRoot: JKTreeElement, context: ConversionContext): Boolean { override fun runConversion(treeRoot: JKTreeElement, context: NewJ2kConverterContext): Boolean {
val root = applyToElement(treeRoot) val root = applyToElement(treeRoot)
assert(root === treeRoot) assert(root === treeRoot)
return somethingChanged return somethingChanged
@@ -10,7 +10,7 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.PsiModifierListOwner import com.intellij.psi.PsiModifierListOwner
import com.intellij.psi.util.parentOfType import com.intellij.psi.util.parentOfType
import org.jetbrains.kotlin.j2k.getContainingClass import org.jetbrains.kotlin.j2k.getContainingClass
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.asQualifierWithThisAsSelector import org.jetbrains.kotlin.nj2k.asQualifierWithThisAsSelector
import org.jetbrains.kotlin.nj2k.copyTreeAndDetach import org.jetbrains.kotlin.nj2k.copyTreeAndDetach
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.psi.psiUtil.containingClass
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class StaticMemberAccessConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class StaticMemberAccessConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
val symbol = val symbol =
when (element) { when (element) {
@@ -9,7 +9,7 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.controlFlow.ControlFlowFactory import com.intellij.psi.controlFlow.ControlFlowFactory
import com.intellij.psi.controlFlow.ControlFlowUtil import com.intellij.psi.controlFlow.ControlFlowUtil
import com.intellij.psi.controlFlow.LocalsOrMyInstanceFieldsControlFlowPolicy import com.intellij.psi.controlFlow.LocalsOrMyInstanceFieldsControlFlowPolicy
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.blockStatement import org.jetbrains.kotlin.nj2k.blockStatement
import org.jetbrains.kotlin.nj2k.copyTreeAndDetach import org.jetbrains.kotlin.nj2k.copyTreeAndDetach
import org.jetbrains.kotlin.nj2k.runExpression import org.jetbrains.kotlin.nj2k.runExpression
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class SwitchStatementConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class SwitchStatementConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaSwitchStatementImpl) return recurse(element) if (element !is JKJavaSwitchStatementImpl) return recurse(element)
element.invalidate() element.invalidate()
@@ -5,14 +5,14 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.JKJavaSynchronizedStatement import org.jetbrains.kotlin.nj2k.tree.JKJavaSynchronizedStatement
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.nj2k.tree.withNonCodeElementsFrom import org.jetbrains.kotlin.nj2k.tree.withNonCodeElementsFrom
class SynchronizedStatementConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class SynchronizedStatementConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaSynchronizedStatement) return recurse(element) if (element !is JKJavaSynchronizedStatement) return recurse(element)
element.invalidate() element.invalidate()
@@ -16,14 +16,14 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
import org.jetbrains.kotlin.nj2k.tree.visitors.JKVisitorVoid import org.jetbrains.kotlin.nj2k.tree.visitors.JKVisitorVoid
abstract class TransformerBasedConversion : SequentialBaseConversion, JKVisitorVoid { abstract class TransformerBasedConversion : SequentialBaseConversion, JKVisitorVoid {
protected var somethingChanged = false protected var somethingChanged = false
override fun runConversion(treeRoot: JKTreeElement, context: ConversionContext): Boolean { override fun runConversion(treeRoot: JKTreeElement, context: NewJ2kConverterContext): Boolean {
somethingChanged = false somethingChanged = false
treeRoot.accept(this, null) treeRoot.accept(this, null)
return somethingChanged return somethingChanged
@@ -6,14 +6,14 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.copyTreeAndDetach import org.jetbrains.kotlin.nj2k.copyTreeAndDetach
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.nj2k.useExpression import org.jetbrains.kotlin.nj2k.useExpression
class TryStatementConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { class TryStatementConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaTryStatement) return recurse(element) if (element !is JKJavaTryStatement) return recurse(element)
return if (element.resourceDeclarations.isEmpty()) return if (element.resourceDeclarations.isEmpty())
@@ -15,12 +15,12 @@ import org.jetbrains.kotlin.j2k.ast.Mutability
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.kotlinTypeByName import org.jetbrains.kotlin.nj2k.kotlinTypeByName
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class TypeMappingConversion(val context: ConversionContext) : RecursiveApplicableConversionBase() { class TypeMappingConversion(val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
private val typeFlavorCalculator = TypeFlavorCalculator(object : TypeFlavorConverterFacade { private val typeFlavorCalculator = TypeFlavorCalculator(object : TypeFlavorConverterFacade {
override val referenceSearcher: ReferenceSearcher override val referenceSearcher: ReferenceSearcher
get() = context.converter.converterServices.oldServices.referenceSearcher get() = context.converter.converterServices.oldServices.referenceSearcher
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.nj2k.conversions
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiPolyVariantReference import com.intellij.psi.PsiPolyVariantReference
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getChildOfType
import org.jetbrains.kotlin.resolve.ImportPath import org.jetbrains.kotlin.resolve.ImportPath
internal fun resolveFqName(classId: ClassId, contextElement: JKTreeElement, context: ConversionContext): PsiElement? { internal fun resolveFqName(classId: ClassId, contextElement: JKTreeElement, context: NewJ2kConverterContext): PsiElement? {
val element = contextElement.psi ?: return null val element = contextElement.psi ?: return null
return resolveFqName(classId, element) return resolveFqName(classId, element)
} }
@@ -220,7 +220,7 @@ fun kotlinPostfixExpression(
fun untilToExpression( fun untilToExpression(
from: JKExpression, from: JKExpression,
to: JKExpression, to: JKExpression,
conversionContext: ConversionContext conversionContext: NewJ2kConverterContext
): JKExpression = ): JKExpression =
rangeExpression( rangeExpression(
from, from,
@@ -232,7 +232,7 @@ fun untilToExpression(
fun downToExpression( fun downToExpression(
from: JKExpression, from: JKExpression,
to: JKExpression, to: JKExpression,
conversionContext: ConversionContext conversionContext: NewJ2kConverterContext
): JKExpression = ): JKExpression =
rangeExpression( rangeExpression(
from, from,
@@ -254,7 +254,7 @@ fun rangeExpression(
from: JKExpression, from: JKExpression,
to: JKExpression, to: JKExpression,
operatorName: String, operatorName: String,
conversionContext: ConversionContext conversionContext: NewJ2kConverterContext
): JKExpression = ): JKExpression =
JKBinaryExpressionImpl( JKBinaryExpressionImpl(
from, from,
@@ -331,7 +331,7 @@ fun stringLiteral(content: String, symbolProvider: JKSymbolProvider): JKExpressi
} }
} }
fun JKVariable.findUsages(scope: JKTreeElement, context: ConversionContext): List<JKFieldAccessExpression> { fun JKVariable.findUsages(scope: JKTreeElement, context: NewJ2kConverterContext): List<JKFieldAccessExpression> {
val symbol = context.symbolProvider.provideUniverseSymbol(this) val symbol = context.symbolProvider.provideUniverseSymbol(this)
val usages = mutableListOf<JKFieldAccessExpression>() val usages = mutableListOf<JKFieldAccessExpression>()
val searcher = object : RecursiveApplicableConversionBase() { val searcher = object : RecursiveApplicableConversionBase() {
@@ -369,7 +369,7 @@ fun JKExpression.bangedBangedExpr(symbolProvider: JKSymbolProvider): JKExpressio
JKKtOperatorImpl(KtTokens.EXCLEXCL, type(symbolProvider)!!) JKKtOperatorImpl(KtTokens.EXCLEXCL, type(symbolProvider)!!)
) )
fun JKVariable.hasWritableUsages(scope: JKTreeElement, context: ConversionContext): Boolean = fun JKVariable.hasWritableUsages(scope: JKTreeElement, context: NewJ2kConverterContext): Boolean =
findUsages(scope, context).any { findUsages(scope, context).any {
it.asAssignmentFromTarget() != null it.asAssignmentFromTarget() != null
|| it.isInDecrementOrIncrement() || it.isInDecrementOrIncrement()
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaClassDescriptor
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.nj2k.ConversionContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.JKSymbolProvider import org.jetbrains.kotlin.nj2k.JKSymbolProvider
import org.jetbrains.kotlin.nj2k.kotlinTypeByName import org.jetbrains.kotlin.nj2k.kotlinTypeByName
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
@@ -240,7 +240,7 @@ fun <T : JKType> T.updateNullabilityRecursively(newNullability: Nullability): T
} }
} as T } as T
fun JKJavaMethod.returnTypeNullability(context: ConversionContext): Nullability = fun JKJavaMethod.returnTypeNullability(context: NewJ2kConverterContext): Nullability =
context.typeFlavorCalculator.methodNullability(psi()!!) context.typeFlavorCalculator.methodNullability(psi()!!)
fun JKType.isCollectionType(symbolProvider: JKSymbolProvider): Boolean { fun JKType.isCollectionType(symbolProvider: JKSymbolProvider): Boolean {