JavaToKotlinAction refactorings + minor fixes in the logic
This commit is contained in:
committed by
valentin
parent
41cb97ac61
commit
f100015e58
@@ -31,7 +31,6 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.psi.PsiJavaFile
|
import com.intellij.psi.PsiJavaFile
|
||||||
import com.intellij.psi.PsiManager
|
import com.intellij.psi.PsiManager
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
import java.util.HashSet
|
|
||||||
import com.intellij.openapi.application.ApplicationManager
|
import com.intellij.openapi.application.ApplicationManager
|
||||||
import com.intellij.psi.codeStyle.CodeStyleManager
|
import com.intellij.psi.codeStyle.CodeStyleManager
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
@@ -41,12 +40,13 @@ import org.jetbrains.jet.plugin.j2k.J2kPostProcessor
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.jet.j2k.PostProcessor
|
import org.jetbrains.jet.j2k.PostProcessor
|
||||||
import com.intellij.openapi.vfs.CharsetToolkit
|
import com.intellij.openapi.vfs.CharsetToolkit
|
||||||
|
import org.jetbrains.jet.lang.psi.JetFile
|
||||||
|
|
||||||
public class JavaToKotlinAction : AnAction() {
|
public class JavaToKotlinAction : AnAction() {
|
||||||
override fun actionPerformed(e: AnActionEvent) {
|
override fun actionPerformed(e: AnActionEvent) {
|
||||||
val virtualFiles = e.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY)!!
|
val virtualFiles = e.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY)!!
|
||||||
val project = CommonDataKeys.PROJECT.getData(e.getDataContext())!!
|
val project = CommonDataKeys.PROJECT.getData(e.getDataContext())!!
|
||||||
val selectedJavaFiles = getAllJavaFiles(virtualFiles, project)
|
val selectedJavaFiles = allJavaFiles(virtualFiles, project)
|
||||||
if (selectedJavaFiles.isEmpty()) return
|
if (selectedJavaFiles.isEmpty()) return
|
||||||
|
|
||||||
val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, FilesConversionScope(selectedJavaFiles), IdeaReferenceSearcher)
|
val converter = JavaToKotlinConverter(project, ConverterSettings.defaultSettings, FilesConversionScope(selectedJavaFiles), IdeaReferenceSearcher)
|
||||||
@@ -55,107 +55,98 @@ public class JavaToKotlinAction : AnAction() {
|
|||||||
val newFiles = convertFiles(converter, selectedJavaFiles)
|
val newFiles = convertFiles(converter, selectedJavaFiles)
|
||||||
deleteFiles(selectedJavaFiles)
|
deleteFiles(selectedJavaFiles)
|
||||||
reformatFiles(newFiles, project)
|
reformatFiles(newFiles, project)
|
||||||
for (vf in newFiles) {
|
|
||||||
FileEditorManager.getInstance(project).openFile(vf, true)
|
if (newFiles.size() == 1) {
|
||||||
|
FileEditorManager.getInstance(project).openFile(newFiles.single(), true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, "Convert files from Java to Kotlin", "group_id")
|
}, "Convert files from Java to Kotlin", null)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun update(e: AnActionEvent) {
|
override fun update(e: AnActionEvent) {
|
||||||
val enabled = e.getData<Array<VirtualFile>>(CommonDataKeys.VIRTUAL_FILE_ARRAY) != null
|
val enabled = e.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY)?.isNotEmpty() ?: false
|
||||||
e.getPresentation().setVisible(enabled)
|
|
||||||
e.getPresentation().setEnabled(enabled)
|
e.getPresentation().setEnabled(enabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getChildrenRecursive(baseDir: VirtualFile?): List<VirtualFile> {
|
private fun allJavaFiles(filesOrDirs: Array<VirtualFile>, project: Project): List<PsiJavaFile> {
|
||||||
val result = LinkedList<VirtualFile>()
|
val allFiles = allFiles(filesOrDirs)
|
||||||
val children = if (baseDir != null) baseDir.getChildren() else VirtualFile.EMPTY_ARRAY
|
|
||||||
result.addAll(children)
|
|
||||||
for (f in children) {
|
|
||||||
result.addAll(getChildrenRecursive(f))
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getAllJavaFiles(vFiles: Array<VirtualFile>, project: Project): List<PsiJavaFile> {
|
|
||||||
val filesSet = allVirtualFiles(vFiles)
|
|
||||||
val manager = PsiManager.getInstance(project)
|
val manager = PsiManager.getInstance(project)
|
||||||
val res = ArrayList<PsiJavaFile>()
|
val result = ArrayList<PsiJavaFile>()
|
||||||
for (file in filesSet) {
|
for (file in allFiles) {
|
||||||
val psiFile = manager.findFile(file)
|
val psiFile = manager.findFile(file)
|
||||||
if (psiFile != null && psiFile is PsiJavaFile) {
|
if (psiFile is PsiJavaFile) {
|
||||||
res.add(psiFile)
|
result.add(psiFile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun allVirtualFiles(vFiles: Array<VirtualFile>): Set<VirtualFile> {
|
private fun allFiles(filesOrDirs: Array<VirtualFile>): Collection<VirtualFile> {
|
||||||
val filesSet = HashSet<VirtualFile>()
|
val result = ArrayList<VirtualFile>()
|
||||||
for (f in vFiles) {
|
filesOrDirs.forEach { result.addFilesRecursive(it) }
|
||||||
filesSet.add(f)
|
return result
|
||||||
filesSet.addAll(getChildrenRecursive(f))
|
}
|
||||||
|
|
||||||
|
private fun MutableCollection<VirtualFile>.addFilesRecursive(root: VirtualFile) {
|
||||||
|
if (root.isDirectory()) {
|
||||||
|
root.getChildren()!!.forEach {
|
||||||
|
addFilesRecursive(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
add(root)
|
||||||
}
|
}
|
||||||
return filesSet
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun reformatFiles(allJetFiles: List<VirtualFile>, project: Project) {
|
private fun reformatFiles(kotlinFiles: List<VirtualFile>, project: Project) {
|
||||||
for (vf in allJetFiles) {
|
for (file in kotlinFiles) {
|
||||||
ApplicationManager.getApplication().runWriteAction {
|
ApplicationManager.getApplication().runWriteAction {
|
||||||
val psiFile = PsiManager.getInstance(project).findFile(vf)
|
val jetFile = PsiManager.getInstance(project).findFile(file) as? JetFile
|
||||||
if (psiFile != null) {
|
if (jetFile != null) {
|
||||||
CodeStyleManager.getInstance(project).reformat(psiFile)
|
CodeStyleManager.getInstance(project).reformat(jetFile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun convertFiles(converter: JavaToKotlinConverter, allJavaFilesNear: List<PsiJavaFile>): List<VirtualFile> {
|
private fun convertFiles(converter: JavaToKotlinConverter, javaFiles: List<PsiJavaFile>): List<VirtualFile> {
|
||||||
val result = LinkedList<VirtualFile>()
|
val result = ArrayList<VirtualFile>()
|
||||||
for (f in allJavaFilesNear) {
|
for (psiFile in javaFiles) {
|
||||||
ApplicationManager.getApplication().runWriteAction {
|
ApplicationManager.getApplication().runWriteAction {
|
||||||
val vf = convertOneFile(converter, f)
|
val file = convertOneFile(converter, psiFile)
|
||||||
if (vf != null) {
|
if (file != null) {
|
||||||
result.add(vf)
|
result.add(file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun deleteFiles(allJavaFilesNear: List<PsiJavaFile>) {
|
private fun deleteFiles(javaFiles: List<PsiJavaFile>) {
|
||||||
for (psiFile in allJavaFilesNear) {
|
for (psiFile in javaFiles) {
|
||||||
ApplicationManager.getApplication().runWriteAction(object : Runnable {
|
ApplicationManager.getApplication().runWriteAction {
|
||||||
override fun run() {
|
try {
|
||||||
try {
|
psiFile.getVirtualFile()?.delete(this)
|
||||||
psiFile.getVirtualFile()?.delete(this)
|
|
||||||
}
|
|
||||||
catch (e: IOException) {
|
|
||||||
MessagesEx.error(psiFile.getProject(), e.getMessage()).showLater()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
catch (e: IOException) {
|
||||||
|
MessagesEx.error(psiFile.getProject(), e.getMessage()).showLater()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private private fun convertOneFile(converter: JavaToKotlinConverter, psiFile: PsiFile): VirtualFile? {
|
private fun convertOneFile(converter: JavaToKotlinConverter, psiFile: PsiJavaFile): VirtualFile? {
|
||||||
try {
|
try {
|
||||||
val virtualFile = psiFile.getVirtualFile()
|
val virtualFile = psiFile.getVirtualFile()!!
|
||||||
if (psiFile is PsiJavaFile && virtualFile != null) {
|
val postProcessor = J2kPostProcessor(psiFile)
|
||||||
val postProcessor = J2kPostProcessor(psiFile)
|
val result = converter.elementsToKotlin(Pair<PsiElement, PostProcessor>(psiFile, postProcessor)).get(0) //TODO: convert all files in one call!
|
||||||
val result = converter.elementsToKotlin(Pair<PsiElement, PostProcessor>(psiFile, postProcessor)).get(0) //TODO: convert all files in one call!
|
val kotlinFile = virtualFile.copy(this, virtualFile.getParent(), virtualFile.getNameWithoutExtension() + ".kt")
|
||||||
val manager = psiFile.getManager()
|
kotlinFile.setBinaryContent(CharsetToolkit.getUtf8Bytes(result))
|
||||||
assert(manager != null)
|
return kotlinFile
|
||||||
val copy = virtualFile.copy(manager, virtualFile.getParent(), virtualFile.getNameWithoutExtension() + ".kt")
|
|
||||||
copy.setBinaryContent(CharsetToolkit.getUtf8Bytes(result))
|
|
||||||
return copy
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (e: IOException) {
|
catch (e: IOException) {
|
||||||
MessagesEx.error(psiFile.getProject(), e.getMessage()).showLater()
|
MessagesEx.error(psiFile.getProject(), e.getMessage()).showLater()
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
return null
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user