Plugin actions added
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
<orderEntry type="module" module-name="compiler-tests" />
|
||||
<orderEntry type="module" module-name="jet.as.java.psi" />
|
||||
<orderEntry type="library" name="idea-full" level="project" />
|
||||
<orderEntry type="module" module-name="j2k" />
|
||||
</component>
|
||||
</module>
|
||||
|
||||
|
||||
@@ -31,6 +31,11 @@
|
||||
<keyboard-shortcut keymap="$default" first-keystroke="control alt shift T"/>
|
||||
<add-to-group group-id="CodeMenu" anchor="last"/>
|
||||
</action>
|
||||
<action id="ConvertJavaToKotlin" class="org.jetbrains.jet.plugin.actions.JavaToKotlinAction"
|
||||
text="Convert Java File to Kotlin File">
|
||||
<keyboard-shortcut keymap="$default" first-keystroke="control alt shift J"/>
|
||||
<add-to-group group-id="CodeMenu" anchor="last"/>
|
||||
</action>
|
||||
<action id="ToggleJetErrorReporting" class="org.jetbrains.jet.plugin.actions.ToggleErrorReportingAction"
|
||||
text="Toggle Error Reporting">
|
||||
<keyboard-shortcut keymap="$default" first-keystroke="control alt shift E"/>
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
package org.jetbrains.jet.plugin.actions;
|
||||
|
||||
import com.intellij.ide.highlighter.JavaFileType;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.actionSystem.PlatformDataKeys;
|
||||
import com.intellij.openapi.command.CommandProcessor;
|
||||
import com.intellij.openapi.fileEditor.FileEditorManager;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiFile;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.jet.j2k.Converter.clearClassIdentifiers;
|
||||
import static org.jetbrains.jet.plugin.actions.JavaToKotlinActionUtil.*;
|
||||
|
||||
/**
|
||||
* @author ignatov
|
||||
*/
|
||||
public class JavaToKotlinAction extends AnAction {
|
||||
@Override
|
||||
public void actionPerformed(final AnActionEvent e) {
|
||||
VirtualFile[] virtualFiles = e.getData(PlatformDataKeys.VIRTUAL_FILE_ARRAY);
|
||||
final Project project = PlatformDataKeys.PROJECT.getData(e.getDataContext());
|
||||
assert virtualFiles != null;
|
||||
assert project != null;
|
||||
int result = Messages.showYesNoCancelDialog(project,
|
||||
"Would you like to backup Java files?",
|
||||
"Backup",
|
||||
Messages.getQuestionIcon());
|
||||
final boolean finalRemoveIt = needToRemoveFiles(result);
|
||||
final List<PsiFile> allJavaFiles = getAllJavaFiles(virtualFiles, project);
|
||||
|
||||
clearClassIdentifiers();
|
||||
for (PsiFile f : allJavaFiles) {
|
||||
if (f.getFileType() instanceof JavaFileType) {
|
||||
setClassIdentifiers(f);
|
||||
}
|
||||
}
|
||||
|
||||
final List<PsiFile> allJavaFilesNear = getAllJavaFiles(virtualFiles, project);
|
||||
CommandProcessor.getInstance().executeCommand(
|
||||
project,
|
||||
new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final List<VirtualFile> newFiles = performFiles(allJavaFilesNear);
|
||||
if (finalRemoveIt) {
|
||||
deleteFiles(allJavaFilesNear);
|
||||
}
|
||||
else {
|
||||
renameFiles(allJavaFiles);
|
||||
}
|
||||
reformatFiles(newFiles, project);
|
||||
for (VirtualFile vf : newFiles) {
|
||||
FileEditorManager.getInstance(project).openFile(vf, true);
|
||||
}
|
||||
}
|
||||
},
|
||||
"Convert files from Java to Kotlin",
|
||||
"group_id"
|
||||
);
|
||||
}
|
||||
|
||||
private static boolean needToRemoveFiles(int result) {
|
||||
boolean removeIt = false;
|
||||
switch (result) {
|
||||
case 0:
|
||||
removeIt = false;
|
||||
break;
|
||||
case 1:
|
||||
removeIt = true;
|
||||
break;
|
||||
}
|
||||
return removeIt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
final boolean enabled = e.getData(PlatformDataKeys.VIRTUAL_FILE_ARRAY) != null;
|
||||
e.getPresentation().setVisible(enabled);
|
||||
e.getPresentation().setEnabled(enabled);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,154 @@
|
||||
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;
|
||||
import com.intellij.openapi.vfs.CharsetToolkit;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiJavaFile;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.psi.codeStyle.CodeStyleManager;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.j2k.Converter;
|
||||
import org.jetbrains.jet.j2k.visitors.ClassVisitor;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author ignatov
|
||||
*/
|
||||
public class JavaToKotlinActionUtil {
|
||||
private JavaToKotlinActionUtil() {
|
||||
}
|
||||
|
||||
static void setClassIdentifiers(@NotNull PsiFile psiFile) {
|
||||
ClassVisitor c = new ClassVisitor();
|
||||
psiFile.accept(c);
|
||||
Converter.setClassIdentifiers(c.getClassIdentifiers());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static List<VirtualFile> getChildrenRecursive(@Nullable VirtualFile baseDir) {
|
||||
List<VirtualFile> result = new LinkedList<VirtualFile>();
|
||||
VirtualFile[] children = baseDir != null ? baseDir.getChildren() : VirtualFile.EMPTY_ARRAY;
|
||||
result.addAll(Arrays.asList(children));
|
||||
for (VirtualFile f : children)
|
||||
result.addAll(getChildrenRecursive(f));
|
||||
return result;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
static List<PsiFile> getAllJavaFiles(@NotNull VirtualFile[] vFiles, Project project) {
|
||||
final PsiManager manager = PsiManager.getInstance(project);
|
||||
Set<VirtualFile> filesSet = new HashSet<VirtualFile>();
|
||||
for (VirtualFile f : vFiles) {
|
||||
filesSet.add(f);
|
||||
filesSet.addAll(getChildrenRecursive(f));
|
||||
}
|
||||
final List<PsiFile> res = new ArrayList<PsiFile>();
|
||||
for (final VirtualFile file : filesSet) {
|
||||
final PsiFile psiFile = manager.findFile(file);
|
||||
if (psiFile != null && psiFile.getFileType() instanceof JavaFileType) {
|
||||
res.add(psiFile);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static void reformatFiles(List<VirtualFile> allJetFiles, final Project project) {
|
||||
for (final VirtualFile vf : allJetFiles)
|
||||
ApplicationManager.getApplication().runWriteAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (vf != null) {
|
||||
PsiFile psiFile = PsiManager.getInstance(project).findFile(vf);
|
||||
if (psiFile != null) {
|
||||
CodeStyleManager.getInstance(project).reformat(psiFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@NotNull
|
||||
static List<VirtualFile> performFiles(List<PsiFile> allJavaFilesNear) {
|
||||
final List<VirtualFile> result = new LinkedList<VirtualFile>();
|
||||
for (final PsiFile f : allJavaFilesNear) {
|
||||
ApplicationManager.getApplication().runWriteAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
VirtualFile vf = performOneFile(f);
|
||||
if (vf != null) {
|
||||
result.add(vf);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static void deleteFiles(List<PsiFile> allJavaFilesNear) {
|
||||
for (final PsiFile f : allJavaFilesNear) {
|
||||
ApplicationManager.getApplication().runWriteAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
PsiManager manager = f.getManager();
|
||||
VirtualFile vFile = f.getVirtualFile();
|
||||
if (vFile != null) {
|
||||
vFile.delete(manager);
|
||||
}
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static VirtualFile performOneFile(PsiFile psiFile) {
|
||||
try {
|
||||
VirtualFile virtualFile = psiFile.getVirtualFile();
|
||||
if (psiFile instanceof PsiJavaFile && virtualFile != null) {
|
||||
String result = "";
|
||||
try {
|
||||
result = Converter.fileToFile((PsiJavaFile) psiFile).toKotlin();
|
||||
} catch (Exception e) {
|
||||
//noinspection CallToPrintStackTrace
|
||||
e.printStackTrace();
|
||||
}
|
||||
final PsiManager manager = psiFile.getManager();
|
||||
assert manager != null;
|
||||
VirtualFile copy = virtualFile.copy(manager, virtualFile.getParent(), virtualFile.getNameWithoutExtension() + ".kt");
|
||||
copy.setBinaryContent(CharsetToolkit.getUtf8Bytes(result));
|
||||
return copy;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
MessagesEx.error(psiFile.getProject(), ex.getMessage()).showLater();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static void renameFiles(@NotNull List<PsiFile> psiFiles) {
|
||||
for (final PsiFile f : psiFiles) {
|
||||
ApplicationManager.getApplication().runWriteAction(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
PsiManager manager = f.getManager();
|
||||
VirtualFile vFile = f.getVirtualFile();
|
||||
if (vFile != null) {
|
||||
vFile.copy(manager, vFile.getParent(), vFile.getNameWithoutExtension() + ".java.old");
|
||||
vFile.delete(manager);
|
||||
}
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user