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

4
.gitignore vendored
View File

@ -14,13 +14,17 @@ hardware/arduino/bootloaders/caterina_LUFA/Caterina.elf
hardware/arduino/bootloaders/caterina_LUFA/Caterina.eep
hardware/arduino/bootloaders/caterina_LUFA/.dep/
build/windows/work/
build/windows/jre.zip
build/windows/libastylej*
build/windows/arduino-*.zip
build/windows/dist/gcc-*.tar.gz
build/macosx/arduino-*.zip
build/macosx/dist/gcc-*.tar.gz
build/macosx/libastylej*
build/linux/work/
build/linux/dist/*.tar.gz
build/linux/*.tgz
build/linux/libastylej*
test-bin
*.iml
.idea

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
}
}
}
}
}

View File

@ -259,6 +259,11 @@
<fileset dir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools" includes="**/man/**/*"/>
<fileset dir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools" includes="**/man"/>
</delete>
<get src="http://downloads.arduino.cc/libastylej-2.03.zip" dest="macosx" usetimestamp="true" />
<unzip src="macosx/libastylej-2.03.zip" dest="macosx" overwrite="true"/>
<copy file="macosx/libastylej/libastylej.jnilib" todir="macosx/work/Arduino.app/Contents/Resources/Java/lib/" />
<chmod perm="755" file="macosx/work/Arduino.app/Contents/Resources/Java/lib/libastylej.jnilib" />
</target>
<target name="macosx-run" depends="macosx-build" description="Run Mac OS X version">
@ -470,6 +475,11 @@
<copy todir="linux/work" file="linux/dist/arduino" />
<chmod perm="755" file="linux/work/arduino" />
<get src="http://downloads.arduino.cc/libastylej-2.03.zip" dest="linux" usetimestamp="true" />
<unzip src="linux/libastylej-2.03.zip" dest="linux" overwrite="true"/>
<copy file="linux/libastylej/libastylej${arch-bits}.so" tofile="linux/work/lib/libastylej.so" />
<chmod perm="755" file="linux/work/lib/libastylej.so" />
</target>
<target name="linux32-build" depends="linux-build" description="Build linux (32-bit) version">
@ -485,6 +495,7 @@
<arg value="-xjf"/>
<arg value="../../avr_tools_linux32.tar.bz2"/>
</exec>
</target>
<target name="linux64-build" depends="linux-build" description="Build linux (64-bit) version">
@ -659,6 +670,10 @@
<fileset file="windows/eeprom.h" />
</copy>
<get src="http://downloads.arduino.cc/libastylej-2.03.zip" dest="windows" usetimestamp="true" />
<unzip src="windows/libastylej-2.03.zip" dest="windows" overwrite="true"/>
<copy file="windows/libastylej/AStylej.dll" todir="windows/work/lib" />
<!-- Copy bossac.exe tool -->
<copy todir="windows/work/hardware/tools">
<fileset file="windows/bossac.exe" />

View File

@ -0,0 +1,28 @@
# This configuration file contains a selection of the available options provided by the formatting tool "Artistic Style"
# http://astyle.sourceforge.net/astyle.html
#
# If you wish to change them, don't edit this file.
# Instead, copy it in the same folder of file "preferences.txt" and modify the copy. This way, you won't lose your custom formatter settings when upgrading the IDE
# If you don't know where file preferences.txt is stored, open the IDE, File -> Preferences and you'll find a link
# 2 spaces indentation
indent=spaces=2
# also indent macros
indent-preprocessor
# indent classes, switches (and cases), comments starting at column 1
indent-classes
indent-switches
indent-cases
indent-col1-comments
# put a space around operators
pad-oper
# put a space after if/for/while
pad-header
# if you like one-liners, keep them
keep-one-line-statements