1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-17 22:23:10 +03:00

Introducing Artistic Style: new IDE autoformatter

This commit is contained in:
Federico Fissore
2013-10-14 17:31:35 +02:00
parent cb7b62f43e
commit 56bdebb8d7
7 changed files with 192 additions and 5 deletions

View File

@ -0,0 +1,68 @@
package cc.arduino.packages.formatter;
import processing.app.Base;
import processing.app.Editor;
import processing.app.helpers.FileUtils;
import processing.app.tools.Tool;
import java.io.File;
import java.io.IOException;
import static processing.app.I18n._;
public class AStyle implements Tool {
private static String FORMATTER_CONF = "formatter.conf";
private final AStyleInterface aStyleInterface;
private final String formatterConfiguration;
private Editor editor;
public AStyle() {
this.aStyleInterface = new AStyleInterface();
File customFormatterConf = Base.getSettingsFile(FORMATTER_CONF);
File defaultFormatterConf = new File(Base.getContentFile("lib"), FORMATTER_CONF);
File formatterConf;
if (customFormatterConf.exists()) {
formatterConf = customFormatterConf;
} else {
formatterConf = defaultFormatterConf;
}
String formatterConfiguration = "";
try {
formatterConfiguration = FileUtils.readFileToString(formatterConf);
} catch (IOException e) {
// noop
}
this.formatterConfiguration = formatterConfiguration;
}
@Override
public void init(Editor editor) {
this.editor = editor;
}
@Override
public void run() {
String originalText = editor.getText();
String formattedText = aStyleInterface.AStyleMain(originalText, formatterConfiguration);
if (formattedText.equals(originalText)) {
editor.statusNotice(_("No changes necessary for Auto Format."));
return;
}
editor.setText(formattedText);
editor.getSketch().setModified(true);
// mark as finished
editor.statusNotice(_("Auto Format finished."));
}
@Override
public String getMenuTitle() {
return _("Auto Format");
}
}

View File

@ -0,0 +1,54 @@
package cc.arduino.packages.formatter;
import processing.app.Base;
import java.io.File;
public class AStyleInterface {
static {
File astyleLib = new File(Base.getContentFile("lib"), System.mapLibraryName("astylej"));
String astylePath = astyleLib.getAbsolutePath();
try {
System.load(astylePath);
} catch (UnsatisfiedLinkError e) {
e.printStackTrace();
System.out.println(e.getMessage());
System.out.println("Cannot load native library " + astylePath);
System.out.println("The program has terminated!");
System.exit(1);
}
}
/**
* Calls the AStyleMain function in Artistic Style.
*
* @param textIn A string containing the source code to be formatted.
* @param options A string of options to Artistic Style.
* @return A String containing the formatted source from Artistic Style.
*/
public native String AStyleMain(String textIn, String options);
/**
* Calls the AStyleGetVersion function in Artistic Style.
*
* @return A String containing the version number of Artistic Style.
*/
public native String AStyleGetVersion();
/**
* Error handler for messages from Artistic Style.
* This method is called only if there are errors when AStyleMain is called.
* This is for debugging and there should be no errors when the calling
* parameters are correct.
* Changing the method name requires changing Artistic Style.
* Signature: (ILjava/lang/String;)V.
*
* @param errorNumber The error number from Artistic Style.
* @param errorMessage The error message from Artistic Style.
*/
private void ErrorHandler(int errorNumber, String errorMessage) {
System.out.println("AStyle error " + String.valueOf(errorNumber) + " - " + errorMessage);
}
}

View File

@ -907,7 +907,7 @@ public class Editor extends JFrame implements RunnerListener {
protected JMenu addInternalTools(JMenu menu) {
JMenuItem item;
item = createToolMenuItem("processing.app.tools.AutoFormat");
item = createToolMenuItem("cc.arduino.packages.formatter.AStyle");
int modifiers = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
item.setAccelerator(KeyStroke.getKeyStroke('T', modifiers));
menu.add(item);

View File

@ -1,9 +1,6 @@
package processing.app.helpers;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.*;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
@ -170,4 +167,25 @@ public class FileUtils {
public static boolean isSCCSOrHiddenFile(File file) {
return file.isHidden() || file.getName().charAt(0) == '.' || (file.isDirectory() && SOURCE_CONTROL_FOLDERS.contains(file.getName()));
}
public static String readFileToString(File file) throws IOException {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
return sb.toString();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
// noop
}
}
}
}
}