Plugin actions added

This commit is contained in:
Andrey Breslav
2012-01-27 17:46:24 +04:00
parent 35889c08e9
commit 0da39c8bd6
4 changed files with 246 additions and 0 deletions
+1
View File
@@ -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>
+5
View File
@@ -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) {
}
}
});
}
}
}