Converter: use ide resolve through a dedicated interface
Eliminate direct usages of ResolveSession
This commit is contained in:
@@ -38,9 +38,9 @@ import org.jetbrains.jet.plugin.j2k.J2kPostProcessor
|
|||||||
import com.intellij.openapi.vfs.CharsetToolkit
|
import com.intellij.openapi.vfs.CharsetToolkit
|
||||||
import org.jetbrains.jet.lang.psi.JetFile
|
import org.jetbrains.jet.lang.psi.JetFile
|
||||||
import org.jetbrains.jet.utils.addIfNotNull
|
import org.jetbrains.jet.utils.addIfNotNull
|
||||||
import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
|
|
||||||
import com.intellij.openapi.vfs.VfsUtilCore
|
import com.intellij.openapi.vfs.VfsUtilCore
|
||||||
import com.intellij.openapi.vfs.VirtualFileVisitor
|
import com.intellij.openapi.vfs.VirtualFileVisitor
|
||||||
|
import org.jetbrains.jet.plugin.j2k.IdeaResolverForConverter
|
||||||
|
|
||||||
public class JavaToKotlinAction : AnAction() {
|
public class JavaToKotlinAction : AnAction() {
|
||||||
override fun actionPerformed(e: AnActionEvent) {
|
override fun actionPerformed(e: AnActionEvent) {
|
||||||
@@ -104,7 +104,7 @@ public class JavaToKotlinAction : AnAction() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun convertFiles(javaFiles: List<PsiJavaFile>, project: Project): List<VirtualFile> {
|
private fun convertFiles(javaFiles: List<PsiJavaFile>, project: Project): List<VirtualFile> {
|
||||||
val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, FilesConversionScope(javaFiles), IdeaReferenceSearcher, { it.getLazyResolveSession() })
|
val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, FilesConversionScope(javaFiles), IdeaReferenceSearcher, IdeaResolverForConverter)
|
||||||
|
|
||||||
val convertedTexts = converter.elementsToKotlin(javaFiles.map { it to J2kPostProcessor(it) })
|
val convertedTexts = converter.elementsToKotlin(javaFiles.map { it to J2kPostProcessor(it) })
|
||||||
|
|
||||||
|
|||||||
+8
-6
@@ -34,7 +34,7 @@ import com.intellij.openapi.util.TextRange
|
|||||||
import com.intellij.psi.codeStyle.CodeStyleManager
|
import com.intellij.psi.codeStyle.CodeStyleManager
|
||||||
import com.intellij.lang.java.JavaLanguage
|
import com.intellij.lang.java.JavaLanguage
|
||||||
import org.jetbrains.jet.plugin.j2k.J2kPostProcessor
|
import org.jetbrains.jet.plugin.j2k.J2kPostProcessor
|
||||||
import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
|
import org.jetbrains.jet.plugin.j2k.IdeaResolverForConverter
|
||||||
|
|
||||||
public class ConvertJavaCopyPastePostProcessor() : CopyPastePostProcessor<TextBlockTransferableData>() {
|
public class ConvertJavaCopyPastePostProcessor() : CopyPastePostProcessor<TextBlockTransferableData>() {
|
||||||
|
|
||||||
@@ -87,11 +87,13 @@ public class ConvertJavaCopyPastePostProcessor() : CopyPastePostProcessor<TextBl
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun convertCopiedCodeToKotlin(code: CopiedCode, fileCopiedFrom: PsiJavaFile, fileCopiedTo: JetFile): String {
|
private fun convertCopiedCodeToKotlin(code: CopiedCode, fileCopiedFrom: PsiJavaFile, fileCopiedTo: JetFile): String {
|
||||||
val converter = JavaToKotlinConverter(fileCopiedFrom.getProject(),
|
val converter = JavaToKotlinConverter(
|
||||||
ConverterSettings.defaultSettings,
|
fileCopiedFrom.getProject(),
|
||||||
FilesConversionScope(listOf(fileCopiedFrom)),
|
ConverterSettings.defaultSettings,
|
||||||
IdeaReferenceSearcher,
|
FilesConversionScope(listOf(fileCopiedFrom)),
|
||||||
{ it.getLazyResolveSession() })
|
IdeaReferenceSearcher,
|
||||||
|
IdeaResolverForConverter
|
||||||
|
)
|
||||||
val startOffsets = code.startOffsets
|
val startOffsets = code.startOffsets
|
||||||
val endOffsets = code.endOffsets
|
val endOffsets = code.endOffsets
|
||||||
assert(startOffsets.size == endOffsets.size) { "Must have the same size" }
|
assert(startOffsets.size == endOffsets.size) { "Must have the same size" }
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.plugin.j2k
|
||||||
|
|
||||||
|
import org.jetbrains.jet.j2k.ResolverForConverter
|
||||||
|
import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
|
||||||
|
import org.jetbrains.jet.lang.psi.JetDeclaration
|
||||||
|
|
||||||
|
public object IdeaResolverForConverter: ResolverForConverter {
|
||||||
|
override fun resolveToDescriptor(declaration: JetDeclaration) = declaration.getLazyResolveSession().resolveToDescriptor(declaration)
|
||||||
|
}
|
||||||
@@ -27,14 +27,12 @@ import com.intellij.psi.util.PsiTreeUtil
|
|||||||
import org.jetbrains.jet.j2k.usageProcessing.UsageProcessing
|
import org.jetbrains.jet.j2k.usageProcessing.UsageProcessing
|
||||||
import org.jetbrains.jet.j2k.usageProcessing.FieldToPropertyProcessing
|
import org.jetbrains.jet.j2k.usageProcessing.FieldToPropertyProcessing
|
||||||
import org.jetbrains.jet.j2k.usageProcessing.UsageProcessingExpressionConverter
|
import org.jetbrains.jet.j2k.usageProcessing.UsageProcessingExpressionConverter
|
||||||
import org.jetbrains.jet.lang.psi.JetElement
|
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer
|
|
||||||
|
|
||||||
class Converter private(private val elementToConvert: PsiElement,
|
class Converter private(private val elementToConvert: PsiElement,
|
||||||
val settings: ConverterSettings,
|
val settings: ConverterSettings,
|
||||||
val conversionScope: ConversionScope,
|
val conversionScope: ConversionScope,
|
||||||
val referenceSearcher: ReferenceSearcher,
|
val referenceSearcher: ReferenceSearcher,
|
||||||
val resolveSessionGetter: ((JetElement) -> KotlinCodeAnalyzer)?,
|
val resolverForConverter: ResolverForConverter,
|
||||||
private val postProcessor: PostProcessor?,
|
private val postProcessor: PostProcessor?,
|
||||||
private val commonState: Converter.CommonState,
|
private val commonState: Converter.CommonState,
|
||||||
private val personalState: Converter.PersonalState) {
|
private val personalState: Converter.PersonalState) {
|
||||||
@@ -56,16 +54,16 @@ class Converter private(private val elementToConvert: PsiElement,
|
|||||||
|
|
||||||
class object {
|
class object {
|
||||||
public fun create(elementToConvert: PsiElement, settings: ConverterSettings, conversionScope: ConversionScope,
|
public fun create(elementToConvert: PsiElement, settings: ConverterSettings, conversionScope: ConversionScope,
|
||||||
referenceSearcher: ReferenceSearcher, resolveSessionGetter: ((JetElement) -> KotlinCodeAnalyzer)?, postProcessor: PostProcessor?,
|
referenceSearcher: ReferenceSearcher, resolverForConverter: ResolverForConverter, postProcessor: PostProcessor?,
|
||||||
usageProcessingsCollector: (UsageProcessing) -> Unit): Converter {
|
usageProcessingsCollector: (UsageProcessing) -> Unit): Converter {
|
||||||
return Converter(elementToConvert, settings, conversionScope, referenceSearcher, resolveSessionGetter, postProcessor, CommonState(usageProcessingsCollector), PersonalState(null))
|
return Converter(elementToConvert, settings, conversionScope, referenceSearcher, resolverForConverter, postProcessor, CommonState(usageProcessingsCollector), PersonalState(null))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun withSpecialContext(context: PsiElement): Converter = withState(PersonalState(context))
|
public fun withSpecialContext(context: PsiElement): Converter = withState(PersonalState(context))
|
||||||
|
|
||||||
private fun withState(state: PersonalState): Converter
|
private fun withState(state: PersonalState): Converter
|
||||||
= Converter(elementToConvert, settings, conversionScope, referenceSearcher, resolveSessionGetter, postProcessor, commonState, state)
|
= Converter(elementToConvert, settings, conversionScope, referenceSearcher, resolverForConverter, postProcessor, commonState, state)
|
||||||
|
|
||||||
private fun createDefaultCodeConverter() = CodeConverter(this, DefaultExpressionConverter(), DefaultStatementConverter(), null)
|
private fun createDefaultCodeConverter() = CodeConverter(this, DefaultExpressionConverter(), DefaultStatementConverter(), null)
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,6 @@ import org.jetbrains.jet.lang.resolve.BindingContext
|
|||||||
import com.intellij.openapi.diagnostic.Logger
|
import com.intellij.openapi.diagnostic.Logger
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
import org.jetbrains.jet.j2k.usageProcessing.UsageProcessing
|
import org.jetbrains.jet.j2k.usageProcessing.UsageProcessing
|
||||||
import org.jetbrains.jet.lang.psi.JetElement
|
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer
|
|
||||||
import java.util.HashMap
|
import java.util.HashMap
|
||||||
|
|
||||||
public trait ConversionScope {
|
public trait ConversionScope {
|
||||||
@@ -48,7 +46,7 @@ public class JavaToKotlinConverter(private val project: Project,
|
|||||||
private val settings: ConverterSettings,
|
private val settings: ConverterSettings,
|
||||||
private val conversionScope: ConversionScope /*TODO: drop this parameter*/,
|
private val conversionScope: ConversionScope /*TODO: drop this parameter*/,
|
||||||
private val referenceSearcher: ReferenceSearcher,
|
private val referenceSearcher: ReferenceSearcher,
|
||||||
private val resolveSessionGetter: ((JetElement) -> KotlinCodeAnalyzer)?) {
|
private val resolverForConverter: ResolverForConverter) {
|
||||||
private val LOG = Logger.getInstance("#org.jetbrains.jet.j2k.JavaToKotlinConverter")
|
private val LOG = Logger.getInstance("#org.jetbrains.jet.j2k.JavaToKotlinConverter")
|
||||||
|
|
||||||
public fun elementsToKotlin(psiElementsAndProcessors: List<Pair<PsiElement, PostProcessor?>>): List<String> {
|
public fun elementsToKotlin(psiElementsAndProcessors: List<Pair<PsiElement, PostProcessor?>>): List<String> {
|
||||||
@@ -61,7 +59,7 @@ public class JavaToKotlinConverter(private val project: Project,
|
|||||||
usageProcessings.put(usageProcessing.targetElement, usageProcessing)
|
usageProcessings.put(usageProcessing.targetElement, usageProcessing)
|
||||||
}
|
}
|
||||||
for ((psiElement, postProcessor) in psiElementsAndProcessors) {
|
for ((psiElement, postProcessor) in psiElementsAndProcessors) {
|
||||||
val converter = Converter.create(psiElement, settings, conversionScope, referenceSearcher, resolveSessionGetter, postProcessor, usageProcessingCollector)
|
val converter = Converter.create(psiElement, settings, conversionScope, referenceSearcher, resolverForConverter, postProcessor, usageProcessingCollector)
|
||||||
val result = converter.convert()
|
val result = converter.convert()
|
||||||
intermediateResults.add(result)
|
intermediateResults.add(result)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ public object JavaToKotlinTranslator {
|
|||||||
fun generateKotlinCode(javaCode: String): String {
|
fun generateKotlinCode(javaCode: String): String {
|
||||||
val file = createFile(javaCode)
|
val file = createFile(javaCode)
|
||||||
if (file is PsiJavaFile) {
|
if (file is PsiJavaFile) {
|
||||||
val converter = JavaToKotlinConverter(file.getProject(), ConverterSettings.defaultSettings, FilesConversionScope(listOf(file)), EmptyReferenceSearcher, null)
|
val converter = JavaToKotlinConverter(file.getProject(), ConverterSettings.defaultSettings, FilesConversionScope(listOf(file)), EmptyReferenceSearcher, EmptyResolverForConverter)
|
||||||
return prettify(converter.elementsToKotlin(listOf(file to null))[0])
|
return prettify(converter.elementsToKotlin(listOf(file to null))[0])
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.j2k
|
||||||
|
|
||||||
|
import org.jetbrains.jet.lang.psi.JetDeclaration
|
||||||
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
|
||||||
|
|
||||||
|
public trait ResolverForConverter {
|
||||||
|
public fun resolveToDescriptor(declaration: JetDeclaration): DeclarationDescriptor?
|
||||||
|
}
|
||||||
|
|
||||||
|
object EmptyResolverForConverter : ResolverForConverter {
|
||||||
|
override fun resolveToDescriptor(declaration: JetDeclaration) = null
|
||||||
|
}
|
||||||
@@ -33,9 +33,9 @@ import org.jetbrains.jet.j2k.ast.Mutability
|
|||||||
import java.util.HashSet
|
import java.util.HashSet
|
||||||
import org.jetbrains.jet.asJava.KotlinLightElement
|
import org.jetbrains.jet.asJava.KotlinLightElement
|
||||||
import org.jetbrains.jet.lang.psi.JetCallableDeclaration
|
import org.jetbrains.jet.lang.psi.JetCallableDeclaration
|
||||||
import org.jetbrains.jet.lang.descriptors.CallableDescriptor
|
|
||||||
import org.jetbrains.jet.lang.types.TypeUtils
|
import org.jetbrains.jet.lang.types.TypeUtils
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils
|
||||||
|
import org.jetbrains.jet.lang.descriptors.CallableDescriptor
|
||||||
|
|
||||||
class TypeConverter(val converter: Converter) {
|
class TypeConverter(val converter: Converter) {
|
||||||
public fun convertType(type: PsiType?, nullability: Nullability = Nullability.Default, mutability: Mutability = Mutability.Default): Type {
|
public fun convertType(type: PsiType?, nullability: Nullability = Nullability.Default, mutability: Mutability = Mutability.Default): Type {
|
||||||
@@ -370,9 +370,7 @@ class TypeConverter(val converter: Converter) {
|
|||||||
override fun fromAnnotations(owner: PsiModifierListOwner): Mutability {
|
override fun fromAnnotations(owner: PsiModifierListOwner): Mutability {
|
||||||
if (owner is KotlinLightElement<*, *>) {
|
if (owner is KotlinLightElement<*, *>) {
|
||||||
val jetDeclaration = owner.origin as? JetCallableDeclaration ?: return Mutability.Default
|
val jetDeclaration = owner.origin as? JetCallableDeclaration ?: return Mutability.Default
|
||||||
val codeAnalyzer = converter.resolveSessionGetter?.invoke(jetDeclaration)
|
val descriptor = converter.resolverForConverter.resolveToDescriptor(jetDeclaration) as? CallableDescriptor ?: return Mutability.Default
|
||||||
val descriptor = codeAnalyzer?.resolveToDescriptor(jetDeclaration)
|
|
||||||
as? CallableDescriptor ?: return Mutability.Default
|
|
||||||
val type = descriptor.getReturnType() ?: return Mutability.Default
|
val type = descriptor.getReturnType() ?: return Mutability.Default
|
||||||
val classDescriptor = TypeUtils.getClassDescriptor(type) ?: return Mutability.Default
|
val classDescriptor = TypeUtils.getClassDescriptor(type) ?: return Mutability.Default
|
||||||
return if (DescriptorUtils.getFqName(classDescriptor).asString() in mutableKotlinClasses)
|
return if (DescriptorUtils.getFqName(classDescriptor).asString() in mutableKotlinClasses)
|
||||||
|
|||||||
+2
-2
@@ -32,7 +32,7 @@ import com.intellij.psi.PsiManager
|
|||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
import org.jetbrains.jet.j2k.ConverterSettings
|
import org.jetbrains.jet.j2k.ConverterSettings
|
||||||
import org.jetbrains.jet.lang.psi.JetFile
|
import org.jetbrains.jet.lang.psi.JetFile
|
||||||
import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
|
import org.jetbrains.jet.plugin.j2k.IdeaResolverForConverter
|
||||||
|
|
||||||
public abstract class AbstractJavaToKotlinConverterMultiFileTest() : AbstractJavaToKotlinConverterTest() {
|
public abstract class AbstractJavaToKotlinConverterMultiFileTest() : AbstractJavaToKotlinConverterTest() {
|
||||||
public fun doTest(dirPath: String) {
|
public fun doTest(dirPath: String) {
|
||||||
@@ -47,7 +47,7 @@ public abstract class AbstractJavaToKotlinConverterMultiFileTest() : AbstractJav
|
|||||||
psiFiles.add(psiFile)
|
psiFiles.add(psiFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, FilesConversionScope(psiFiles), IdeaReferenceSearcher, { it.getLazyResolveSession() })
|
val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, FilesConversionScope(psiFiles), IdeaReferenceSearcher, IdeaResolverForConverter)
|
||||||
val results: List<String> = converter.elementsToKotlin(psiFiles.map { it to J2kPostProcessor(it) })
|
val results: List<String> = converter.elementsToKotlin(psiFiles.map { it to J2kPostProcessor(it) })
|
||||||
.map { reformat(it, project) }
|
.map { reformat(it, project) }
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -33,7 +33,7 @@ import com.intellij.psi.PsiJavaFile
|
|||||||
import org.jetbrains.jet.j2k.IdeaReferenceSearcher
|
import org.jetbrains.jet.j2k.IdeaReferenceSearcher
|
||||||
import org.jetbrains.jet.j2k.JavaToKotlinConverter
|
import org.jetbrains.jet.j2k.JavaToKotlinConverter
|
||||||
import org.jetbrains.jet.lang.psi.JetFile
|
import org.jetbrains.jet.lang.psi.JetFile
|
||||||
import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
|
import org.jetbrains.jet.plugin.j2k.IdeaResolverForConverter
|
||||||
|
|
||||||
public abstract class AbstractJavaToKotlinConverterSingleFileTest() : AbstractJavaToKotlinConverterTest() {
|
public abstract class AbstractJavaToKotlinConverterSingleFileTest() : AbstractJavaToKotlinConverterTest() {
|
||||||
val testHeaderPattern = Pattern.compile("//(element|expression|statement|method|class|file|comp)\n")
|
val testHeaderPattern = Pattern.compile("//(element|expression|statement|method|class|file|comp)\n")
|
||||||
@@ -111,14 +111,14 @@ public abstract class AbstractJavaToKotlinConverterSingleFileTest() : AbstractJa
|
|||||||
|
|
||||||
private fun elementToKotlin(text: String, settings: ConverterSettings, project: Project): String {
|
private fun elementToKotlin(text: String, settings: ConverterSettings, project: Project): String {
|
||||||
val fileWithText = createJavaFile(text)
|
val fileWithText = createJavaFile(text)
|
||||||
val converter = JavaToKotlinConverter(project, settings, FilesConversionScope(listOf(fileWithText)), IdeaReferenceSearcher, { it.getLazyResolveSession() })
|
val converter = JavaToKotlinConverter(project, settings, FilesConversionScope(listOf(fileWithText)), IdeaReferenceSearcher, IdeaResolverForConverter)
|
||||||
val element = fileWithText.getFirstChild()!!
|
val element = fileWithText.getFirstChild()!!
|
||||||
return converter.elementsToKotlin(listOf(element to J2kPostProcessor(fileWithText)))[0]
|
return converter.elementsToKotlin(listOf(element to J2kPostProcessor(fileWithText)))[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun fileToKotlin(text: String, settings: ConverterSettings, project: Project): String {
|
private fun fileToKotlin(text: String, settings: ConverterSettings, project: Project): String {
|
||||||
val file = createJavaFile(text)
|
val file = createJavaFile(text)
|
||||||
val converter = JavaToKotlinConverter(project, settings, FilesConversionScope(listOf(file)), IdeaReferenceSearcher, { it.getLazyResolveSession() })
|
val converter = JavaToKotlinConverter(project, settings, FilesConversionScope(listOf(file)), IdeaReferenceSearcher, IdeaResolverForConverter)
|
||||||
return converter.elementsToKotlin(listOf(file to J2kPostProcessor(file)))[0]
|
return converter.elementsToKotlin(listOf(file to J2kPostProcessor(file)))[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user