From f5758907320ae0fffde24909d2fa1124ffbf98cc Mon Sep 17 00:00:00 2001 From: Natalia Ukhorskaya Date: Thu, 16 Apr 2015 18:23:33 +0300 Subject: [PATCH] Change J2K API for Web Demo --- .../kotlin/j2k/JavaToKotlinTranslator.kt | 100 ++---------------- ...ractJavaToKotlinConverterForWebDemoTest.kt | 89 +++++++++++++++- 2 files changed, 95 insertions(+), 94 deletions(-) diff --git a/j2k/src/org/jetbrains/kotlin/j2k/JavaToKotlinTranslator.kt b/j2k/src/org/jetbrains/kotlin/j2k/JavaToKotlinTranslator.kt index f2bf6fa33be..6aa36c7ee6c 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/JavaToKotlinTranslator.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/JavaToKotlinTranslator.kt @@ -44,63 +44,15 @@ import com.intellij.psi.compiled.ClassFileDecompilers import com.intellij.psi.impl.PsiTreeChangePreprocessor import com.intellij.psi.PsiElementFinder import com.intellij.openapi.extensions.ExtensionsArea +import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement public object JavaToKotlinTranslator { - val DISPOSABLE = Disposer.newDisposable() - - private fun createFile(text: String): PsiFile? { - val javaCoreEnvironment: JavaCoreProjectEnvironment? = setUpJavaCoreEnvironment() - return PsiFileFactory.getInstance(javaCoreEnvironment?.getProject()!!).createFileFromText("test.java", JavaLanguage.INSTANCE, text) + private fun createFile(text: String, project: Project): PsiFile? { + return PsiFileFactory.getInstance(project).createFileFromText("test.java", JavaLanguage.INSTANCE, text) } - fun setUpJavaCoreEnvironment(): JavaCoreProjectEnvironment { - Extensions.cleanRootArea(DISPOSABLE) - val area = Extensions.getRootArea() - - registerExtensionPoints(area) - - val applicationEnvironment = JavaCoreApplicationEnvironment(DISPOSABLE) - val javaCoreEnvironment = object : JavaCoreProjectEnvironment(DISPOSABLE, applicationEnvironment) { - override fun preregisterServices() { - val projectArea = Extensions.getArea(getProject()) - CoreApplicationEnvironment.registerExtensionPoint(projectArea, PsiTreeChangePreprocessor.EP_NAME, javaClass()) - CoreApplicationEnvironment.registerExtensionPoint(projectArea, PsiElementFinder.EP_NAME, javaClass()) - } - }; - - javaCoreEnvironment.getProject().registerService(javaClass(), object : NullableNotNullManager() { - override fun isNullable(owner: PsiModifierListOwner, checkBases: Boolean) = !isNotNull(owner, checkBases) - override fun isNotNull(owner: PsiModifierListOwner, checkBases: Boolean) = true - override fun hasHardcodedContracts(element: PsiElement): Boolean = false - }) - - for (root in PathUtil.getJdkClassesRoots()) { - javaCoreEnvironment.addJarToClassPath(root) - } - val annotations: File? = findAnnotations() - if (annotations != null && annotations.exists()) { - javaCoreEnvironment.addJarToClassPath(annotations) - } - return javaCoreEnvironment - } - - private fun registerExtensionPoints(area: ExtensionsArea) { - CoreApplicationEnvironment.registerExtensionPoint(area, ContentBasedFileSubstitutor.EP_NAME, javaClass()) - CoreApplicationEnvironment.registerExtensionPoint(area, BinaryFileStubBuilders.EP_NAME, javaClass>()) - CoreApplicationEnvironment.registerExtensionPoint(area, FileContextProvider.EP_NAME, javaClass()) - // - CoreApplicationEnvironment.registerExtensionPoint(area, MetaDataContributor.EP_NAME, javaClass()) - CoreApplicationEnvironment.registerExtensionPoint(area, ClsStubBuilderFactory.EP_NAME, javaClass>()) - CoreApplicationEnvironment.registerExtensionPoint(area, PsiAugmentProvider.EP_NAME, javaClass()) - CoreApplicationEnvironment.registerExtensionPoint(area, JavaMainMethodProvider.EP_NAME, javaClass()) - // - CoreApplicationEnvironment.registerExtensionPoint(area, ContainerProvider.EP_NAME, javaClass()) - CoreApplicationEnvironment.registerExtensionPoint(area, ClsCustomNavigationPolicy.EP_NAME, javaClass()) - CoreApplicationEnvironment.registerExtensionPoint(area, ClassFileDecompilers.EP_NAME, javaClass()) - } - - fun prettify(code: String?): String { + public fun prettify(code: String?): String { if (code == null) { return "" } @@ -115,24 +67,8 @@ public object JavaToKotlinTranslator { .trim() } - fun findAnnotations(): File? { - var classLoader = javaClass().getClassLoader() - while (classLoader != null) { - val loader = classLoader - if (loader is URLClassLoader) { - for (url in loader.getURLs()) { - if ("file" == url.getProtocol() && url.getFile()!!.endsWith("/annotations.jar")) { - return File(url.getFile()!!) - } - } - } - classLoader = classLoader?.getParent() - } - return null - } - - fun generateKotlinCode(javaCode: String): String { - val file = createFile(javaCode) + public fun generateKotlinCode(javaCode: String, project: Project): String { + val file = createFile(javaCode, project) if (file is PsiJavaFile) { val converter = JavaToKotlinConverter(file.getProject(), ConverterSettings.defaultSettings, EmptyReferenceSearcher, EmptyResolverForConverter, null) return prettify(converter.elementsToKotlin(listOf(JavaToKotlinConverter.InputElement(file, null))).results.single()!!.text) @@ -141,27 +77,7 @@ public object JavaToKotlinTranslator { } } -fun main(args: Array) { - if (args.size() == 1) { - try { - val kotlinCode = JavaToKotlinTranslator.generateKotlinCode(args[0]) - if (kotlinCode.isEmpty()) { - println("EXCEPTION: generated code is empty.") - } - else { - println(kotlinCode) - } - } - catch (e: Exception) { - println("EXCEPTION: " + e.getMessage()) - } - } - else { - println("EXCEPTION: wrong number of arguments (should be 1).") - } -} - //used in Kotlin Web Demo -public fun translateToKotlin(code: String): String { - return JavaToKotlinTranslator.generateKotlinCode(code) +public fun translateToKotlin(code: String, project: Project): String { + return JavaToKotlinTranslator.generateKotlinCode(code, project) } diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/AbstractJavaToKotlinConverterForWebDemoTest.kt b/j2k/tests/org/jetbrains/kotlin/j2k/AbstractJavaToKotlinConverterForWebDemoTest.kt index 6ff82575828..09a0b6f870c 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/AbstractJavaToKotlinConverterForWebDemoTest.kt +++ b/j2k/tests/org/jetbrains/kotlin/j2k/AbstractJavaToKotlinConverterForWebDemoTest.kt @@ -16,19 +16,104 @@ package org.jetbrains.kotlin.j2k +import com.intellij.codeInsight.ContainerProvider +import com.intellij.codeInsight.NullableNotNullManager +import com.intellij.codeInsight.runner.JavaMainMethodProvider +import com.intellij.core.CoreApplicationEnvironment +import com.intellij.core.JavaCoreApplicationEnvironment +import com.intellij.core.JavaCoreProjectEnvironment +import com.intellij.openapi.extensions.Extensions +import com.intellij.openapi.extensions.ExtensionsArea +import com.intellij.openapi.fileTypes.ContentBasedFileSubstitutor +import com.intellij.openapi.fileTypes.FileTypeExtensionPoint import junit.framework.TestCase import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.Disposer +import com.intellij.psi.* +import com.intellij.psi.augment.PsiAugmentProvider +import com.intellij.psi.compiled.ClassFileDecompilers +import com.intellij.psi.impl.PsiTreeChangePreprocessor +import com.intellij.psi.impl.compiled.ClsCustomNavigationPolicy +import com.intellij.psi.impl.compiled.ClsStubBuilderFactory +import com.intellij.psi.meta.MetaDataContributor +import com.intellij.psi.stubs.BinaryFileStubBuilders +import org.jetbrains.kotlin.utils.PathUtil import java.io.File +import java.net.URLClassLoader public abstract class AbstractJavaToKotlinConverterForWebDemoTest : TestCase() { + val DISPOSABLE = Disposer.newDisposable() + public fun doTest(javaPath: String) { try { val fileContents = FileUtil.loadFile(File(javaPath), true) - translateToKotlin(fileContents) + val javaCoreEnvironment: JavaCoreProjectEnvironment = setUpJavaCoreEnvironment() + translateToKotlin(fileContents, javaCoreEnvironment.getProject()) } finally { - Disposer.dispose(JavaToKotlinTranslator.DISPOSABLE) + Disposer.dispose(DISPOSABLE) } } + + fun setUpJavaCoreEnvironment(): JavaCoreProjectEnvironment { + Extensions.cleanRootArea(DISPOSABLE) + val area = Extensions.getRootArea() + + registerExtensionPoints(area) + + val applicationEnvironment = JavaCoreApplicationEnvironment(DISPOSABLE) + val javaCoreEnvironment = object : JavaCoreProjectEnvironment(DISPOSABLE, applicationEnvironment) { + override fun preregisterServices() { + val projectArea = Extensions.getArea(getProject()) + CoreApplicationEnvironment.registerExtensionPoint(projectArea, PsiTreeChangePreprocessor.EP_NAME, javaClass()) + CoreApplicationEnvironment.registerExtensionPoint(projectArea, PsiElementFinder.EP_NAME, javaClass()) + } + }; + + javaCoreEnvironment.getProject().registerService(javaClass(), object : NullableNotNullManager() { + override fun isNullable(owner: PsiModifierListOwner, checkBases: Boolean) = !isNotNull(owner, checkBases) + override fun isNotNull(owner: PsiModifierListOwner, checkBases: Boolean) = true + override fun hasHardcodedContracts(element: PsiElement): Boolean = false + }) + + for (root in PathUtil.getJdkClassesRoots()) { + javaCoreEnvironment.addJarToClassPath(root) + } + val annotations: File? = findAnnotations() + if (annotations != null && annotations.exists()) { + javaCoreEnvironment.addJarToClassPath(annotations) + } + return javaCoreEnvironment + } + + private fun registerExtensionPoints(area: ExtensionsArea) { + CoreApplicationEnvironment.registerExtensionPoint(area, ContentBasedFileSubstitutor.EP_NAME, javaClass()) + CoreApplicationEnvironment.registerExtensionPoint(area, BinaryFileStubBuilders.EP_NAME, javaClass>()) + CoreApplicationEnvironment.registerExtensionPoint(area, FileContextProvider.EP_NAME, javaClass()) + + CoreApplicationEnvironment.registerExtensionPoint(area, MetaDataContributor.EP_NAME, javaClass()) + CoreApplicationEnvironment.registerExtensionPoint(area, ClsStubBuilderFactory.EP_NAME, javaClass>()) + CoreApplicationEnvironment.registerExtensionPoint(area, PsiAugmentProvider.EP_NAME, javaClass()) + CoreApplicationEnvironment.registerExtensionPoint(area, JavaMainMethodProvider.EP_NAME, javaClass()) + + CoreApplicationEnvironment.registerExtensionPoint(area, ContainerProvider.EP_NAME, javaClass()) + CoreApplicationEnvironment.registerExtensionPoint(area, ClsCustomNavigationPolicy.EP_NAME, javaClass()) + CoreApplicationEnvironment.registerExtensionPoint(area, ClassFileDecompilers.EP_NAME, javaClass()) + } + + fun findAnnotations(): File? { + var classLoader = javaClass().getClassLoader() + while (classLoader != null) { + val loader = classLoader + if (loader is URLClassLoader) { + for (url in loader.getURLs()) { + if ("file" == url.getProtocol() && url.getFile()!!.endsWith("/annotations.jar")) { + return File(url.getFile()!!) + } + } + } + classLoader = classLoader?.getParent() + } + return null + } }