diff options
author | Reinier Zwitserloot <reinier@tipit.to> | 2009-10-16 20:10:05 +0200 |
---|---|---|
committer | Reinier Zwitserloot <reinier@tipit.to> | 2009-10-16 20:10:05 +0200 |
commit | ea04b3ff14d5a6cf90a550eeb866aace02964b1d (patch) | |
tree | a30e794c45417e6e635e58d9a299c7ecbb13ff1c | |
parent | 5b0d52477d52f97967099dd6148d182210118f8d (diff) | |
download | lombok-ea04b3ff14d5a6cf90a550eeb866aace02964b1d.tar.gz lombok-ea04b3ff14d5a6cf90a550eeb866aace02964b1d.tar.bz2 lombok-ea04b3ff14d5a6cf90a550eeb866aace02964b1d.zip |
The old 'disableCheckedExceptions' branch wasn't a particularly nice distribution/storage model of experimental features. For example, it was hopelessly out of date. Redesigned to a separate experimental directory, along with new build scripts, and rewrite it to the new lombok.patcher model.
Unfortunately it doesn't actually work, just yet. Seems to do nothing at all.
-rw-r--r-- | .classpath | 1 | ||||
-rw-r--r-- | experimental/build.xml | 42 | ||||
-rw-r--r-- | experimental/buildScripts/disableCheckedExceptions.ant.xml | 75 | ||||
-rw-r--r-- | experimental/src/lombok/javac/disableCheckedExceptions/DisableCheckedExceptionsAgent.java | 93 | ||||
-rw-r--r-- | website/disableCheckedExceptions.html | 60 |
5 files changed, 271 insertions, 0 deletions
@@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> + <classpathentry kind="src" path="experimental/src"/> <classpathentry kind="src" path="src_eclipseagent"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="lib" path="deps/lombok/org.eclipse.jdt.core_3.5.0.v_963.jar"/> 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; + } +} diff --git a/website/disableCheckedExceptions.html b/website/disableCheckedExceptions.html new file mode 100644 index 00000000..744859d8 --- /dev/null +++ b/website/disableCheckedExceptions.html @@ -0,0 +1,60 @@ +<!DOCTYPE html> +<html><head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <link rel="stylesheet" type="text/css" href="logi/reset.css" /> + <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" /> + <meta name="description" content="Spice up your java" /> + <title>Project Lombok side projects - Disable checked Exceptions</title> + <style type="text/css"> + code { + font-size: 12px; + font-family: monospaced; + } + + .meat { + margin: 16px auto 0 auto; + width: 800px; + } + + .backLink { + padding-top: 100px; + width: 100%; + text-align: right; + } + </style> +</head><body> + <div class="meat"> + <h1>Tired of checked exceptions?</h1> + <p> + This lombok spinoff project consists of a hack that only works in javac - not eclipse or any other IDE.<br /> + It will completely disable the notion of checked exceptions. You may throw any exception anywhere, and you may + also catch any exception anywhere. In standard javac, you may not catch a checked exception that is not declared + as thrown by at least 1 statement in your try block, unless it is <code>Exception</code> or <code>Throwable</code>.<br /> + This restriction is lifted as well. + </p> + <h3>Usage</h3> + <p> + Just make sure <code>disableCheckedExceptions-alpha.jar</code> is on the classpath as you compile. For example:<br /> + <code>javac -cp disableCheckedExceptions-alpha.jar MySource.java</code> + </p> + <p> + Ready to try it out? download it here: <a href="downloads/disableCheckedExceptions-alpha.jar">disableCheckedExceptions-alpha.jar</a> + </p> + <p> + Want to know how its done? Grab the <em>disableCheckedExceptions</em> branch of project lombok. You can browse and download the branch <a href="http://github.com/rzwitserloot/lombok/tree/disableCheckedExceptions">here on github</a>. + </p> + <div class="backLink"> + <a href="index.html">back to the project homepage</a> + </div> + </div> + <script type="text/javascript"> + var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); + document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); + </script> + <script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-9884254-1"); + pageTracker._trackPageview(); + } catch(err) {} + </script> +</body></html> |