GreatSyntacticShift: shift action removed
This commit is contained in:
@@ -24,11 +24,6 @@
|
|||||||
<keyboard-shortcut keymap="$default" first-keystroke="control alt shift T"/>
|
<keyboard-shortcut keymap="$default" first-keystroke="control alt shift T"/>
|
||||||
<add-to-group group-id="CodeMenu" anchor="last"/>
|
<add-to-group group-id="CodeMenu" anchor="last"/>
|
||||||
</action>
|
</action>
|
||||||
<action id="GreatSyntacticShift" class="org.jetbrains.jet.plugin.actions.ShiftAction"
|
|
||||||
text="GreatSyntacticShift">
|
|
||||||
<!--<keyboard-shortcut keymap="$default" first-keystroke="control alt shift T"/>-->
|
|
||||||
<add-to-group group-id="CodeMenu" anchor="last"/>
|
|
||||||
</action>
|
|
||||||
<action id="ToggleJetErrorReporting" class="org.jetbrains.jet.plugin.actions.ToggleErrorReportingAction"
|
<action id="ToggleJetErrorReporting" class="org.jetbrains.jet.plugin.actions.ToggleErrorReportingAction"
|
||||||
text="Toggle Error Reporting">
|
text="Toggle Error Reporting">
|
||||||
<keyboard-shortcut keymap="$default" first-keystroke="control alt shift E"/>
|
<keyboard-shortcut keymap="$default" first-keystroke="control alt shift E"/>
|
||||||
|
|||||||
@@ -1,352 +0,0 @@
|
|||||||
package org.jetbrains.jet.plugin.actions;
|
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.intellij.lang.ASTNode;
|
|
||||||
import com.intellij.openapi.actionSystem.AnAction;
|
|
||||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
|
||||||
import com.intellij.openapi.actionSystem.LangDataKeys;
|
|
||||||
import com.intellij.openapi.actionSystem.PlatformDataKeys;
|
|
||||||
import com.intellij.openapi.application.ApplicationManager;
|
|
||||||
import com.intellij.openapi.editor.Editor;
|
|
||||||
import com.intellij.openapi.project.Project;
|
|
||||||
import com.intellij.openapi.util.TextRange;
|
|
||||||
import com.intellij.openapi.util.io.FileUtil;
|
|
||||||
import com.intellij.psi.PsiFile;
|
|
||||||
import com.intellij.psi.tree.IElementType;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.jet.checkers.CheckerTestUtil;
|
|
||||||
import org.jetbrains.jet.lang.diagnostics.Diagnostic;
|
|
||||||
import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory;
|
|
||||||
import org.jetbrains.jet.lang.diagnostics.Severity;
|
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.jetbrains.jet.lexer.JetTokens.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author abreslav
|
|
||||||
*/
|
|
||||||
public class ShiftAction extends AnAction {
|
|
||||||
@Override
|
|
||||||
public void actionPerformed(AnActionEvent e) {
|
|
||||||
Editor editor = e.getData(PlatformDataKeys.EDITOR);
|
|
||||||
PsiFile psiFile = e.getData(LangDataKeys.PSI_FILE);
|
|
||||||
assert editor != null && psiFile != null;
|
|
||||||
|
|
||||||
// BindingContext bindingContext = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile((JetFile) psiFile);
|
|
||||||
// List<TextRange> syntaxError = AnalyzingUtils.getSyntaxErrorRanges(psiFile);
|
|
||||||
//
|
|
||||||
// String result = CheckerTestUtil.addDiagnosticMarkersToText(psiFile, bindingContext, syntaxError).toString();
|
|
||||||
//
|
|
||||||
// Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
|
|
||||||
// clipboard.setContents(new StringSelection(result), new ClipboardOwner() {
|
|
||||||
// @Override
|
|
||||||
// public void lostOwnership(Clipboard clipboard, Transferable contents) {}
|
|
||||||
// });
|
|
||||||
// final JetFile file = JetPsiFactory.createFile(psiFile.getProject(), "namespace foo\nclass A");
|
|
||||||
Project project = psiFile.getProject();
|
|
||||||
|
|
||||||
File rootDir = new File("/Users/abreslav/work/jet-clean/compiler/testData/diagnostics/tests");
|
|
||||||
assert rootDir.exists() : "Root dir does not exist";
|
|
||||||
|
|
||||||
System.out.println("Shift started");
|
|
||||||
transformDir(project, rootDir);
|
|
||||||
System.out.println("Shift done");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void transformDir(Project project, File rootDir) {
|
|
||||||
assert rootDir.isDirectory();
|
|
||||||
println("----------------------------------------------");
|
|
||||||
println("Directory: ", rootDir.getAbsolutePath());
|
|
||||||
println("----------------------------------------------");
|
|
||||||
for (final File file : rootDir.listFiles()) {
|
|
||||||
if (file.getName().endsWith(".kt") || file.getName().endsWith(".jet.jet")) {
|
|
||||||
file.delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (File file : rootDir.listFiles()) {
|
|
||||||
if (file.isDirectory()) continue;
|
|
||||||
if (!file.getName().endsWith(".jet")) continue;
|
|
||||||
transformFile(project, file);
|
|
||||||
}
|
|
||||||
for (File file : rootDir.listFiles()) {
|
|
||||||
if (!file.isDirectory()) continue;
|
|
||||||
transformDir(project, file);
|
|
||||||
}
|
|
||||||
println("----------------------------------------------");
|
|
||||||
println("----------------------------------------------");
|
|
||||||
println("----------------------------------------------");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void transformFile(Project project, File file) {
|
|
||||||
println("File name: ", file.getAbsolutePath());
|
|
||||||
println("==============================================================");
|
|
||||||
System.out.flush();
|
|
||||||
try {
|
|
||||||
String text = FileUtil.loadTextAndClose(new FileReader(file));
|
|
||||||
List<CheckerTestUtil.DiagnosedRange> result = Lists.newArrayList();
|
|
||||||
|
|
||||||
String clearText = CheckerTestUtil.parseDiagnosedRanges(text, result);
|
|
||||||
|
|
||||||
final JetFile jetFile = JetPsiFactory.createFile(project, clearText);
|
|
||||||
ApplicationManager.getApplication().runWriteAction(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
convert(jetFile);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Collection<Diagnostic> diagnostics = Lists.newArrayList();
|
|
||||||
|
|
||||||
for (CheckerTestUtil.DiagnosedRange diagnosedRange : result) {
|
|
||||||
for (String message : diagnosedRange.getDiagnostics()) {
|
|
||||||
diagnostics.add(new MyDiagnostic(message, new MyDF(message), new TextRange(diagnosedRange.getStart(), diagnosedRange.getEnd()), jetFile));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String textWithDiagnosticsBack = CheckerTestUtil.addDiagnosticMarkersToText(jetFile, diagnostics).toString();
|
|
||||||
StringBuilder finalText = new StringBuilder();
|
|
||||||
for (int i = 0; i < textWithDiagnosticsBack.length(); i++) {
|
|
||||||
char c = textWithDiagnosticsBack.charAt(i);
|
|
||||||
switch (c) {
|
|
||||||
case 'Я':
|
|
||||||
break;
|
|
||||||
case 'Ц':
|
|
||||||
finalText.append("->");
|
|
||||||
break;
|
|
||||||
case 'Щ':
|
|
||||||
finalText.append("#(");
|
|
||||||
break;
|
|
||||||
case 'Ф':
|
|
||||||
if ("ФАН".equals(textWithDiagnosticsBack.substring(i, i + 3))) {
|
|
||||||
i += 2;
|
|
||||||
while (i < textWithDiagnosticsBack.length() && textWithDiagnosticsBack.charAt(i) == ' ') {
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
finalText.append(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File newFile = new File(file.getAbsoluteFile().getParent(), file.getName() + ".kt");
|
|
||||||
FileUtil.writeToFile(newFile, finalText.toString());
|
|
||||||
String message = "newFile = " + newFile;
|
|
||||||
println(message);
|
|
||||||
} catch (Throwable e1) {
|
|
||||||
System.err.println(file.getAbsolutePath());
|
|
||||||
e1.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
|
|
||||||
System.err.flush();
|
|
||||||
}
|
|
||||||
println("==============================================================");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void convert(JetFile file) {
|
|
||||||
file.getRootNamespace().accept(new JetTreeVisitor<Void>() {
|
|
||||||
|
|
||||||
private void replaceWithLeaf(@NotNull ASTNode toReplace, IElementType type, String text) {
|
|
||||||
ASTNode treeNext = toReplace.getTreeNext();
|
|
||||||
ASTNode treeParent = toReplace.getTreeParent();
|
|
||||||
treeParent.removeChild(toReplace);
|
|
||||||
treeParent.addLeaf(type, text, treeNext);
|
|
||||||
}
|
|
||||||
|
|
||||||
// namespace -> package
|
|
||||||
@Override
|
|
||||||
public Void visitNamespace(JetNamespace namespace, Void data) {
|
|
||||||
ASTNode namespaceNode = namespace.getHeader().getNode();
|
|
||||||
ASTNode token = namespaceNode.findChildByType(NAMESPACE_KEYWORD);
|
|
||||||
if (token != null) {
|
|
||||||
// ASTNode packageKeyword = JetPsiFactory.createFile(namespace.getProject(), "package foo").getRootNamespace().getHeader().getNode().findChildByType(NAMESPACE_KEYWORD);
|
|
||||||
replaceWithLeaf(token, NAMESPACE_KEYWORD, "packageЯЯ");
|
|
||||||
}
|
|
||||||
return super.visitNamespace(namespace, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// function types
|
|
||||||
@Override
|
|
||||||
public Void visitFunctionType(JetFunctionType type, Void data) {
|
|
||||||
ASTNode node = type.getNode();
|
|
||||||
ASTNode funToken = node.findChildByType(FUN_KEYWORD);
|
|
||||||
replaceWithLeaf(funToken, WHITE_SPACE, "ФАН");
|
|
||||||
|
|
||||||
// node.removeChild(funToken);
|
|
||||||
ASTNode colonToken = node.findChildByType(COLON);
|
|
||||||
if (colonToken != null) {
|
|
||||||
// JetBinaryExpression arrowExpression = (JetBinaryExpression) JetPsiFactory.createExpression(type.getProject(), "a -> b");
|
|
||||||
// ASTNode childByType = arrowExpression.getOperationReference().getNode().findChildByType(JetTokens.ARROW);
|
|
||||||
replaceWithLeaf(colonToken, WHITE_SPACE, "Ц"); // arrow
|
|
||||||
}
|
|
||||||
return super.visitFunctionType(type, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// function literals => ->>> ->
|
|
||||||
@Override
|
|
||||||
public Void visitFunctionLiteralExpression(JetFunctionLiteralExpression expression, Void data) {
|
|
||||||
ASTNode arrowNode = expression.getFunctionLiteral().getArrowNode();
|
|
||||||
if (arrowNode != null) {
|
|
||||||
replaceWithLeaf(arrowNode, ARROW, "->");
|
|
||||||
}
|
|
||||||
return super.visitFunctionLiteralExpression(expression, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// when entry => ->>> ->
|
|
||||||
@Override
|
|
||||||
public Void visitWhenEntry(JetWhenEntry jetWhenEntry, Void data) {
|
|
||||||
ASTNode arrow = jetWhenEntry.getNode().findChildByType(DOUBLE_ARROW);
|
|
||||||
if (arrow == null) {
|
|
||||||
System.err.println(jetWhenEntry.getText());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
replaceWithLeaf(arrow, ARROW, "->");
|
|
||||||
}
|
|
||||||
return super.visitWhenEntry(jetWhenEntry, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// tuple expressions #()
|
|
||||||
@Override
|
|
||||||
public Void visitTupleExpression(JetTupleExpression expression, Void data) {
|
|
||||||
replaceWithLeaf(expression.getNode().getFirstChildNode(), LPAR, "Щ"); // LPAR
|
|
||||||
return super.visitTupleExpression(expression, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// typle types #()
|
|
||||||
@Override
|
|
||||||
public Void visitTupleType(JetTupleType type, Void data) {
|
|
||||||
replaceWithLeaf(type.getNode().getFirstChildNode(), LPAR, "Щ"); // LPAR
|
|
||||||
return super.visitTupleType(type, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// tuple patterns #()
|
|
||||||
@Override
|
|
||||||
public Void visitTuplePattern(JetTuplePattern pattern, Void data) {
|
|
||||||
replaceWithLeaf(pattern.getNode().getFirstChildNode(), LPAR, "Щ"); // LPAR
|
|
||||||
return super.visitTuplePattern(pattern, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
// decomposer patterns remove '@'
|
|
||||||
@Override
|
|
||||||
public Void visitDecomposerPattern(JetDecomposerPattern pattern, Void data) {
|
|
||||||
replaceWithLeaf(pattern.getNode().findChildByType(AT), WHITE_SPACE, "Я"); // LPAR
|
|
||||||
return super.visitDecomposerPattern(pattern, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update(AnActionEvent e) {
|
|
||||||
Editor editor = e.getData(PlatformDataKeys.EDITOR);
|
|
||||||
PsiFile psiFile = e.getData(LangDataKeys.PSI_FILE);
|
|
||||||
e.getPresentation().setEnabled(editor != null && psiFile instanceof JetFile && ApplicationManager.getApplication().isInternal());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class MyDiagnostic implements Diagnostic {
|
|
||||||
|
|
||||||
private final String message;
|
|
||||||
private final DiagnosticFactory factory;
|
|
||||||
private final TextRange range;
|
|
||||||
private final PsiFile file;
|
|
||||||
|
|
||||||
private MyDiagnostic(String message, DiagnosticFactory factory, TextRange range, PsiFile file) {
|
|
||||||
this.message = message;
|
|
||||||
this.factory = factory;
|
|
||||||
this.range = range;
|
|
||||||
this.file = file;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PsiFile getFile() {
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public DiagnosticFactory getFactory() {
|
|
||||||
return factory;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public String getMessage() {
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TextRange getRange() {
|
|
||||||
return range;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public Severity getSeverity() {
|
|
||||||
return Severity.ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class MyDF implements DiagnosticFactory {
|
|
||||||
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
private MyDF(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public TextRange getTextRange(@NotNull Diagnostic diagnostic) {
|
|
||||||
return ((MyDiagnostic) diagnostic).getRange();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public PsiFile getPsiFile(@NotNull Diagnostic diagnostic) {
|
|
||||||
return ((MyDiagnostic) diagnostic).getFile();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean printingOn() {
|
|
||||||
return false;
|
|
||||||
// return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void print(Object message) {
|
|
||||||
if (printingOn()) {
|
|
||||||
System.out.print(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void println() {
|
|
||||||
if (printingOn()) {
|
|
||||||
System.out.println();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void println(Object message) {
|
|
||||||
print(message);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void println(Object message1, Object message2) {
|
|
||||||
print(message1.toString() + message2);
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void println(Object... message) {
|
|
||||||
for (Object m : message) {
|
|
||||||
print(m);
|
|
||||||
}
|
|
||||||
println();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user