diff options
Diffstat (limited to 'experimental')
3 files changed, 210 insertions, 0 deletions
diff --git a/experimental/build.xml b/experimental/build.xml new file mode 100644 index 00000000..59dab9e2 --- /dev/null +++ b/experimental/build.xml @@ -0,0 +1,42 @@ +<!-- + Copyright © 2009 Reinier Zwitserloot and Roel Spilker. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +--> +<project name="lombok-experimental" basedir=".." default="info"> + <description> + This buildfile is part of projectlombok.org. It is the main entry point for experimental features. + </description> + + <target name="info"> + <echo> +Does the build and packaging work on experimental features. Currently available: + disableCheckedExceptions + </echo> + </target> + + <target name="disableCheckedExceptions" depends="buildDeps" + description="Creates the disableCheckedExceptions experimental jar."> + <ant antfile="experimental/buildScripts/disableCheckedExceptions.ant.xml" target="dist" /> + </target> + + <target name="buildDeps"> + <ant antfile="buildScripts/deps.ant.xml" target="build" inheritAll="false" /> + </target> +</project> diff --git a/experimental/buildScripts/disableCheckedExceptions.ant.xml b/experimental/buildScripts/disableCheckedExceptions.ant.xml new file mode 100644 index 00000000..b8deae24 --- /dev/null +++ b/experimental/buildScripts/disableCheckedExceptions.ant.xml @@ -0,0 +1,75 @@ +<!-- + Copyright © 2009 Reinier Zwitserloot and Roel Spilker. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +--> +<project name="lombok-experimental-disableCheckedExceptions" basedir="../.." default="dist"> + <description> + This buildfile is part of projectlombok.org. It controls building and packaging of the disableCheckedExceptions feature. + </description> + + <path id="deps.path"> + <fileset dir="deps/lombok"> + <include name="**/*.jar" /> + </fileset> + <fileset dir="experimental"> + <include name="deps/**/*.jar" /> + </fileset> + </path> + + <path id="libs.path"> + <fileset dir="lib/lombok"> + <include name="**/*.jar" /> + </fileset> + <fileset dir="experimental"> + <include name="lib/**/*.jar" /> + </fileset> + </path> + + <target name="-unpackLibs"> + <mkdir dir="build/experimental/disableCheckedExceptions" /> + <unjar dest="build/experimental/disableCheckedExceptions"> + <path refid="libs.path" /> + </unjar> + </target> + + <target name="compile" description="Compiles disableCheckedExceptions."> + <mkdir dir="build/experimental/disableCheckedExceptions" /> + <javac debug="on" destdir="build/experimental/disableCheckedExceptions" target="1.6"> + <src path="experimental/src" /> + <include name="**/disableCheckedExceptions/**/*.java" /> + <classpath refid="deps.path" /> + <classpath refid="libs.path" /> + </javac> + </target> + + <target name="dist" description="Creates the disable checked exceptions jar" depends="compile, -unpackLibs"> + <mkdir dir="build/experimental/disableCheckedExceptions/META-INF" /> + <mkdir dir="build/experimental/disableCheckedExceptions/META-INF/services" /> + <echo file="build/experimental/disableCheckedExceptions/META-INF/services/javax.annotation.processor">lombok.javac.disableCheckedExceptions.DynamicAgent</echo> + <jar destfile="dist/disableCheckedExceptions-alpha.jar"> + <fileset dir="build/experimental/disableCheckedExceptions" /> + <manifest> + <attribute name="Agent-Class" value="lombok.javac.disableCheckedExceptions.DynamicAgent" /> + <attribute name="Can-Redefine-Classes" value="true" /> + <attribute name="Can-Retransform-Classes" value="true" /> + </manifest> + </jar> + </target> +</project> diff --git a/experimental/src/lombok/javac/disableCheckedExceptions/DisableCheckedExceptionsAgent.java b/experimental/src/lombok/javac/disableCheckedExceptions/DisableCheckedExceptionsAgent.java new file mode 100644 index 00000000..deb4626f --- /dev/null +++ b/experimental/src/lombok/javac/disableCheckedExceptions/DisableCheckedExceptionsAgent.java @@ -0,0 +1,93 @@ +/* + * Copyright © 2009 Reinier Zwitserloot and Roel Spilker. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package lombok.javac.disableCheckedExceptions; + +import java.lang.instrument.Instrumentation; +import java.util.Set; + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.ProcessingEnvironment; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.TypeElement; +import javax.tools.Diagnostic.Kind; + +import lombok.patcher.Hook; +import lombok.patcher.MethodTarget; +import lombok.patcher.ScriptManager; +import lombok.patcher.inject.LiveInjector; +import lombok.patcher.scripts.ScriptBuilder; + +import com.sun.tools.javac.processing.JavacProcessingEnvironment; + +@SupportedAnnotationTypes("*") +@SupportedSourceVersion(SourceVersion.RELEASE_6) +public class DisableCheckedExceptionsAgent extends AbstractProcessor { + /** Inject an agent if we're on a sun-esque JVM. */ + @Override public void init(ProcessingEnvironment processingEnv) { + super.init(processingEnv); + if (!(processingEnv instanceof JavacProcessingEnvironment)) { + processingEnv.getMessager().printMessage(Kind.WARNING, "You aren't using a compiler based around javac v1.6, so lombok will not work properly."); + this.processingEnv = null; + } + + new LiveInjector().injectSelf(); + } + + /** Does nothing - we just wanted the init method so we can inject an agent. */ + @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { + return false; + } + + public static void agentmain(String agentArgs, Instrumentation instrumentation) throws Exception { + registerPatchScripts(instrumentation, true); + } + + public static void premain(String agentArgs, Instrumentation instrumentation) throws Exception { + registerPatchScripts(instrumentation, false); + } + + private static void registerPatchScripts(Instrumentation instrumentation, boolean reloadExistingClasses) { + ScriptManager sm = new ScriptManager(); + sm.registerTransformer(instrumentation); + + patchExceptions(sm); + + if (reloadExistingClasses) sm.reloadClasses(instrumentation); + } + + private static void patchExceptions(ScriptManager sm) { + sm.addScript(ScriptBuilder.exitEarly() + .target(new MethodTarget("com.sun.tools.javac.comp.Check", "isUnchecked", + "boolean", "com.sun.tools.javac.code.Symbol$ClassSymbol")) + .transplant() + .decisionMethod(new Hook("lombok/javac/disableCheckedExceptions/DisableCheckedExceptionsAgent", "retTrue", "()Z")) + .valueMethod(new Hook("lombok/javac/disableCheckedExceptions/DisableCheckedExceptionsAgent", "retTrue", "()Z")) + .build()); + } + + public static boolean retTrue() { + return true; + } +} |