Change J2K API for Web Demo
This commit is contained in:
@@ -44,63 +44,15 @@ import com.intellij.psi.compiled.ClassFileDecompilers
|
|||||||
import com.intellij.psi.impl.PsiTreeChangePreprocessor
|
import com.intellij.psi.impl.PsiTreeChangePreprocessor
|
||||||
import com.intellij.psi.PsiElementFinder
|
import com.intellij.psi.PsiElementFinder
|
||||||
import com.intellij.openapi.extensions.ExtensionsArea
|
import com.intellij.openapi.extensions.ExtensionsArea
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
|
||||||
public object JavaToKotlinTranslator {
|
public object JavaToKotlinTranslator {
|
||||||
val DISPOSABLE = Disposer.newDisposable()
|
private fun createFile(text: String, project: Project): PsiFile? {
|
||||||
|
return PsiFileFactory.getInstance(project).createFileFromText("test.java", JavaLanguage.INSTANCE, text)
|
||||||
private fun createFile(text: String): PsiFile? {
|
|
||||||
val javaCoreEnvironment: JavaCoreProjectEnvironment? = setUpJavaCoreEnvironment()
|
|
||||||
return PsiFileFactory.getInstance(javaCoreEnvironment?.getProject()!!).createFileFromText("test.java", JavaLanguage.INSTANCE, text)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setUpJavaCoreEnvironment(): JavaCoreProjectEnvironment {
|
public fun prettify(code: String?): String {
|
||||||
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<PsiTreeChangePreprocessor>())
|
|
||||||
CoreApplicationEnvironment.registerExtensionPoint(projectArea, PsiElementFinder.EP_NAME, javaClass<PsiElementFinder>())
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
javaCoreEnvironment.getProject().registerService(javaClass<NullableNotNullManager>(), 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<ContentBasedFileSubstitutor>())
|
|
||||||
CoreApplicationEnvironment.registerExtensionPoint(area, BinaryFileStubBuilders.EP_NAME, javaClass<FileTypeExtensionPoint<Any>>())
|
|
||||||
CoreApplicationEnvironment.registerExtensionPoint(area, FileContextProvider.EP_NAME, javaClass<FileContextProvider>())
|
|
||||||
//
|
|
||||||
CoreApplicationEnvironment.registerExtensionPoint(area, MetaDataContributor.EP_NAME, javaClass<MetaDataContributor>())
|
|
||||||
CoreApplicationEnvironment.registerExtensionPoint(area, ClsStubBuilderFactory.EP_NAME, javaClass<ClsStubBuilderFactory<PsiFile>>())
|
|
||||||
CoreApplicationEnvironment.registerExtensionPoint(area, PsiAugmentProvider.EP_NAME, javaClass<PsiAugmentProvider>())
|
|
||||||
CoreApplicationEnvironment.registerExtensionPoint(area, JavaMainMethodProvider.EP_NAME, javaClass<JavaMainMethodProvider>())
|
|
||||||
//
|
|
||||||
CoreApplicationEnvironment.registerExtensionPoint(area, ContainerProvider.EP_NAME, javaClass<ContainerProvider>())
|
|
||||||
CoreApplicationEnvironment.registerExtensionPoint(area, ClsCustomNavigationPolicy.EP_NAME, javaClass<ClsCustomNavigationPolicy>())
|
|
||||||
CoreApplicationEnvironment.registerExtensionPoint(area, ClassFileDecompilers.EP_NAME, javaClass<ClassFileDecompilers.Decompiler>())
|
|
||||||
}
|
|
||||||
|
|
||||||
fun prettify(code: String?): String {
|
|
||||||
if (code == null) {
|
if (code == null) {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@@ -115,24 +67,8 @@ public object JavaToKotlinTranslator {
|
|||||||
.trim()
|
.trim()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun findAnnotations(): File? {
|
public fun generateKotlinCode(javaCode: String, project: Project): String {
|
||||||
var classLoader = javaClass<JavaToKotlinTranslator>().getClassLoader()
|
val file = createFile(javaCode, project)
|
||||||
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)
|
|
||||||
if (file is PsiJavaFile) {
|
if (file is PsiJavaFile) {
|
||||||
val converter = JavaToKotlinConverter(file.getProject(), ConverterSettings.defaultSettings, EmptyReferenceSearcher, EmptyResolverForConverter, null)
|
val converter = JavaToKotlinConverter(file.getProject(), ConverterSettings.defaultSettings, EmptyReferenceSearcher, EmptyResolverForConverter, null)
|
||||||
return prettify(converter.elementsToKotlin(listOf(JavaToKotlinConverter.InputElement(file, null))).results.single()!!.text)
|
return prettify(converter.elementsToKotlin(listOf(JavaToKotlinConverter.InputElement(file, null))).results.single()!!.text)
|
||||||
@@ -141,27 +77,7 @@ public object JavaToKotlinTranslator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun main(args: Array<String>) {
|
|
||||||
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
|
//used in Kotlin Web Demo
|
||||||
public fun translateToKotlin(code: String): String {
|
public fun translateToKotlin(code: String, project: Project): String {
|
||||||
return JavaToKotlinTranslator.generateKotlinCode(code)
|
return JavaToKotlinTranslator.generateKotlinCode(code, project)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,19 +16,104 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.j2k
|
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 junit.framework.TestCase
|
||||||
import com.intellij.openapi.util.io.FileUtil
|
import com.intellij.openapi.util.io.FileUtil
|
||||||
import com.intellij.openapi.util.Disposer
|
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.io.File
|
||||||
|
import java.net.URLClassLoader
|
||||||
|
|
||||||
public abstract class AbstractJavaToKotlinConverterForWebDemoTest : TestCase() {
|
public abstract class AbstractJavaToKotlinConverterForWebDemoTest : TestCase() {
|
||||||
|
val DISPOSABLE = Disposer.newDisposable()
|
||||||
|
|
||||||
public fun doTest(javaPath: String) {
|
public fun doTest(javaPath: String) {
|
||||||
try {
|
try {
|
||||||
val fileContents = FileUtil.loadFile(File(javaPath), true)
|
val fileContents = FileUtil.loadFile(File(javaPath), true)
|
||||||
translateToKotlin(fileContents)
|
val javaCoreEnvironment: JavaCoreProjectEnvironment = setUpJavaCoreEnvironment()
|
||||||
|
translateToKotlin(fileContents, javaCoreEnvironment.getProject())
|
||||||
}
|
}
|
||||||
finally {
|
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<PsiTreeChangePreprocessor>())
|
||||||
|
CoreApplicationEnvironment.registerExtensionPoint(projectArea, PsiElementFinder.EP_NAME, javaClass<PsiElementFinder>())
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
javaCoreEnvironment.getProject().registerService(javaClass<NullableNotNullManager>(), 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<ContentBasedFileSubstitutor>())
|
||||||
|
CoreApplicationEnvironment.registerExtensionPoint(area, BinaryFileStubBuilders.EP_NAME, javaClass<FileTypeExtensionPoint<Any>>())
|
||||||
|
CoreApplicationEnvironment.registerExtensionPoint(area, FileContextProvider.EP_NAME, javaClass<FileContextProvider>())
|
||||||
|
|
||||||
|
CoreApplicationEnvironment.registerExtensionPoint(area, MetaDataContributor.EP_NAME, javaClass<MetaDataContributor>())
|
||||||
|
CoreApplicationEnvironment.registerExtensionPoint(area, ClsStubBuilderFactory.EP_NAME, javaClass<ClsStubBuilderFactory<PsiFile>>())
|
||||||
|
CoreApplicationEnvironment.registerExtensionPoint(area, PsiAugmentProvider.EP_NAME, javaClass<PsiAugmentProvider>())
|
||||||
|
CoreApplicationEnvironment.registerExtensionPoint(area, JavaMainMethodProvider.EP_NAME, javaClass<JavaMainMethodProvider>())
|
||||||
|
|
||||||
|
CoreApplicationEnvironment.registerExtensionPoint(area, ContainerProvider.EP_NAME, javaClass<ContainerProvider>())
|
||||||
|
CoreApplicationEnvironment.registerExtensionPoint(area, ClsCustomNavigationPolicy.EP_NAME, javaClass<ClsCustomNavigationPolicy>())
|
||||||
|
CoreApplicationEnvironment.registerExtensionPoint(area, ClassFileDecompilers.EP_NAME, javaClass<ClassFileDecompilers.Decompiler>())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun findAnnotations(): File? {
|
||||||
|
var classLoader = javaClass<JavaToKotlinTranslator>().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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user