From ea04b3ff14d5a6cf90a550eeb866aace02964b1d Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Fri, 16 Oct 2009 20:10:05 +0200 Subject: 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. --- .classpath | 1 + experimental/build.xml | 42 ++++++++++ .../buildScripts/disableCheckedExceptions.ant.xml | 75 +++++++++++++++++ .../DisableCheckedExceptionsAgent.java | 93 ++++++++++++++++++++++ website/disableCheckedExceptions.html | 60 ++++++++++++++ 5 files changed, 271 insertions(+) create mode 100644 experimental/build.xml create mode 100644 experimental/buildScripts/disableCheckedExceptions.ant.xml create mode 100644 experimental/src/lombok/javac/disableCheckedExceptions/DisableCheckedExceptionsAgent.java create mode 100644 website/disableCheckedExceptions.html diff --git a/.classpath b/.classpath index 67e52bfd..47f725c1 100644 --- a/.classpath +++ b/.classpath @@ -1,6 +1,7 @@ + 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 @@ + + + + This buildfile is part of projectlombok.org. It is the main entry point for experimental features. + + + + +Does the build and packaging work on experimental features. Currently available: + disableCheckedExceptions + + + + + + + + + + + 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 @@ + + + + This buildfile is part of projectlombok.org. It controls building and packaging of the disableCheckedExceptions feature. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lombok.javac.disableCheckedExceptions.DynamicAgent + + + + + + + + + + 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 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 @@ + + + + + + + Project Lombok side projects - Disable checked Exceptions + + +
+

Tired of checked exceptions?

+

+ This lombok spinoff project consists of a hack that only works in javac - not eclipse or any other IDE.
+ 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 Exception or Throwable.
+ This restriction is lifted as well. +

+

Usage

+

+ Just make sure disableCheckedExceptions-alpha.jar is on the classpath as you compile. For example:
+ javac -cp disableCheckedExceptions-alpha.jar MySource.java +

+

+ Ready to try it out? download it here: disableCheckedExceptions-alpha.jar +

+

+ Want to know how its done? Grab the disableCheckedExceptions branch of project lombok. You can browse and download the branch here on github. +

+ +
+ + + -- cgit