Java to Kotlin converter: no usage search and body analysis for members out of conversion scope

This commit is contained in:
Valentin Kipyatkov
2014-06-10 14:34:37 +04:00
parent d6755b91ee
commit 324040a02f
7 changed files with 67 additions and 67 deletions
@@ -26,9 +26,11 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiJavaFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.j2k.Converter;
import org.jetbrains.jet.j2k.ConverterSettings;
import org.jetbrains.jet.j2k.FilesConversionScope;
import java.util.List;
@@ -43,7 +45,7 @@ public class JavaToKotlinAction extends AnAction {
assert virtualFiles != null;
final Project project = CommonDataKeys.PROJECT.getData(e.getDataContext());
assert project != null;
final List<PsiFile> selectedJavaFiles = getAllJavaFiles(virtualFiles, project);
final List<PsiJavaFile> selectedJavaFiles = getAllJavaFiles(virtualFiles, project);
if (selectedJavaFiles.isEmpty()) {
return;
}
@@ -77,8 +79,8 @@ public class JavaToKotlinAction extends AnAction {
}
@NotNull
private static Converter prepareConverter(@NotNull Project project, @NotNull List<PsiFile> selectedJavaFiles) {
Converter converter = new Converter(project, ConverterSettings.defaultSettings);
private static Converter prepareConverter(@NotNull Project project, @NotNull List<PsiJavaFile> selectedJavaFiles) {
Converter converter = new Converter(project, ConverterSettings.defaultSettings, new FilesConversionScope(selectedJavaFiles));
converter.clearClassIdentifiers();
for (PsiFile f : selectedJavaFiles) {
if (f.getFileType() instanceof JavaFileType) {
@@ -16,7 +16,6 @@
package org.jetbrains.jet.plugin.actions;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ex.MessagesEx;
@@ -53,14 +52,14 @@ public class JavaToKotlinActionUtil {
}
@NotNull
/*package*/ static List<PsiFile> getAllJavaFiles(@NotNull VirtualFile[] vFiles, Project project) {
/*package*/ static List<PsiJavaFile> getAllJavaFiles(@NotNull VirtualFile[] vFiles, Project project) {
Set<VirtualFile> filesSet = allVirtualFiles(vFiles);
PsiManager manager = PsiManager.getInstance(project);
List<PsiFile> res = new ArrayList<PsiFile>();
List<PsiJavaFile> res = new ArrayList<PsiJavaFile>();
for (VirtualFile file : filesSet) {
PsiFile psiFile = manager.findFile(file);
if (psiFile != null && psiFile.getFileType() instanceof JavaFileType) {
res.add(psiFile);
if (psiFile != null && psiFile instanceof PsiJavaFile) {
res.add((PsiJavaFile)psiFile);
}
}
return res;
@@ -92,7 +91,7 @@ public class JavaToKotlinActionUtil {
}
@NotNull
static List<VirtualFile> convertFiles(final Converter converter, List<PsiFile> allJavaFilesNear) {
static List<VirtualFile> convertFiles(final Converter converter, List<PsiJavaFile> allJavaFilesNear) {
final List<VirtualFile> result = new LinkedList<VirtualFile>();
for (final PsiFile f : allJavaFilesNear) {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@@ -108,7 +107,7 @@ public class JavaToKotlinActionUtil {
return result;
}
static void deleteFiles(List<PsiFile> allJavaFilesNear) {
static void deleteFiles(List<PsiJavaFile> allJavaFilesNear) {
for (final PsiFile f : allJavaFilesNear) {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
@@ -150,7 +149,7 @@ public class JavaToKotlinActionUtil {
return null;
}
static void renameFiles(@NotNull List<PsiFile> psiFiles) {
static void renameFiles(@NotNull List<PsiJavaFile> psiFiles) {
for (final PsiFile f : psiFiles) {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
@@ -48,44 +48,38 @@ public class ConvertJavaCopyPastePostProcessor() : CopyPastePostProcessor<TextBl
}
public override fun collectTransferableData(file: PsiFile, editor: Editor, startOffsets: IntArray, endOffsets: IntArray): TextBlockTransferableData? {
if (!(file is PsiJavaFile)) {
return null
}
if (file !is PsiJavaFile) return null
val lightFile = PsiFileFactory.getInstance(file.getProject())!!.createFileFromText(file.getText()!!, file)
return CopiedCode(lightFile as? PsiJavaFile, startOffsets, endOffsets)
}
public override fun processTransferableData(project: Project, editor: Editor, bounds: RangeMarker, caretOffset: Int, indented: Ref<Boolean>, value: TextBlockTransferableData) {
if (value !is CopiedCode)
return
if (value !is CopiedCode) return
val sourceFile = value.getFile() ?: return
if (value.getFile() == null)
return
val file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument())
if (file !is JetFile)
return
val targetFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument())
if (targetFile !is JetFile) return
val jetEditorOptions = JetEditorOptions.getInstance()!!
val needConvert = jetEditorOptions.isEnableJavaToKotlinConversion() && (jetEditorOptions.isDonTShowConversionDialog() || okFromDialog(project))
if (needConvert) {
val text = convertCopiedCodeToKotlin(value, file.getProject())
val text = convertCopiedCodeToKotlin(value, sourceFile)
if (text.isNotEmpty()) {
ApplicationManager.getApplication()!!.runWriteAction {
val startOffset = bounds.getStartOffset()
editor.getDocument().replaceString(bounds.getStartOffset(), bounds.getEndOffset(), text)
val endOffsetAfterCopy = startOffset + text.length()
editor.getCaretModel().moveToOffset(endOffsetAfterCopy)
CodeStyleManager.getInstance(project)!!.reformatText(file, startOffset, endOffsetAfterCopy)
PsiDocumentManager.getInstance(file.getProject()).commitDocument(editor.getDocument())
CodeStyleManager.getInstance(project)!!.reformatText(targetFile, startOffset, endOffsetAfterCopy)
PsiDocumentManager.getInstance(targetFile.getProject()).commitDocument(editor.getDocument())
}
}
}
}
private fun convertCopiedCodeToKotlin(code: CopiedCode, project: Project): String {
val converter = Converter(project, ConverterSettings.defaultSettings)
private fun convertCopiedCodeToKotlin(code: CopiedCode, file: PsiJavaFile): String {
val converter = Converter(file.getProject(), ConverterSettings.defaultSettings, FilesConversionScope(listOf(file)))
val startOffsets = code.getStartOffsets()
val endOffsets = code.getEndOffsets()
assert(startOffsets.size == endOffsets.size) { "Must have the same size" }
@@ -93,7 +87,7 @@ public class ConvertJavaCopyPastePostProcessor() : CopyPastePostProcessor<TextBl
for (i in startOffsets.indices) {
val startOffset = startOffsets[i]
val endOffset = endOffsets[i]
result.append(convertRangeToKotlin(code.getFile()!!, TextRange(startOffset, endOffset), converter))
result.append(convertRangeToKotlin(file, TextRange(startOffset, endOffset), converter))
}
return StringUtil.convertLineSeparators(result.toString())
}