diff options
author | Reinier Zwitserloot <reinier@tipit.to> | 2009-10-07 23:54:12 +0200 |
---|---|---|
committer | Reinier Zwitserloot <reinier@tipit.to> | 2009-10-07 23:54:12 +0200 |
commit | bb09fa4f050a7f3cb172af69487de21d6d630bbd (patch) | |
tree | 77719ba6e3e092ab47ac1edff3d78e70af2de94a | |
parent | c2f1858781a4a1a5ae6f47a961172ee0b4cb6d53 (diff) | |
parent | 23da5b1e80bd03ee3fc02b7d7ee03130f158e7c4 (diff) | |
download | lombok-bb09fa4f050a7f3cb172af69487de21d6d630bbd.tar.gz lombok-bb09fa4f050a7f3cb172af69487de21d6d630bbd.tar.bz2 lombok-bb09fa4f050a7f3cb172af69487de21d6d630bbd.zip |
Merge branch 'lombokpatcher'
24 files changed, 797 insertions, 1260 deletions
@@ -3,7 +3,6 @@ <classpathentry kind="src" path="src"/> <classpathentry kind="src" path="src_eclipseagent"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> - <classpathentry kind="lib" path="lib/eclipse.agent/asm-3.1.jar"/> <classpathentry kind="lib" path="deps/lombok/org.eclipse.jdt.apt.core_3.3.200.v20090528-1135.jar"/> <classpathentry kind="lib" path="deps/lombok/org.eclipse.jdt.apt.pluggable.core_1.0.200.v20090526-2130.jar"/> <classpathentry kind="lib" path="deps/lombok/org.eclipse.jdt.compiler.apt_1.0.200.v20090528-1135.jar"/> @@ -17,6 +16,7 @@ <classpathentry kind="lib" path="deps/lombok/org.eclipse.osgi_3.5.0.v20090520.jar"/> <classpathentry kind="lib" path="deps/lombok/org.eclipse.equinox.common_3.5.0.v20090520-1800.jar"/> <classpathentry kind="lib" path="deps/lombok/spi-0.2.3-pre.jar"/> - <classpathentry kind="lib" path="deps/tools.jar"/> + <classpathentry combineaccessrules="false" kind="src" path="/lombok.patcher"/> + <classpathentry kind="lib" path="deps/lombok/tools.jar"/> <classpathentry kind="output" path="bin"/> </classpath> @@ -20,208 +20,14 @@ THE SOFTWARE. --> <project name="lombok" default="dist"> - <property name="SNIPPET_TAB_STOP" value="2" /> - <property name="build.compiler" value="javac1.6" /> - <fileset dir="src" id="eclipse.agent.main.deps"> - <include name="lombok/core/SpiLoadUtil.java" /> - <include name="lombok/Lombok.java" /> - </fileset> - - <path id="lombok.deps.path"> - <fileset dir="deps"> - <include name="*.jar" /> - </fileset> - <fileset dir="deps/lombok"> - <include name="**/*.jar" /> - </fileset> - </path> - <path id="lombok.libs.path"> - <fileset dir="lib/lombok"> - <include name="**/*.jar" /> - </fileset> - </path> - - <path id="eclipse.agent.deps.path"> - <fileset dir="deps"> - <include name="*.jar" /> - </fileset> - <fileset dir="deps/eclipse.agent"> - <include name="**/*.jar" /> - </fileset> - </path> - <path id="eclipse.agent.libs.path"> - <fileset dir="lib/eclipse.agent"> - <include name="**/*.jar" /> - </fileset> - </path> - + <description>This buildfile is part of projectlombok.org. It is the main entry point that contains +the common tasks and can be called on to run the main aspects of all the sub-scripts.</description> <target name="clean" description="Removes all generated files"> <delete dir="build" quiet="true" /> <delete dir="dist" quiet="true" /> </target> - <target name="-website-clean"> - <delete dir="build/website" quiet="true" /> - </target> - - <target name="website" description="Prepares the website for distribution" depends="-website-main, -website-videos, -website-dist" /> - <target name="website-novideo" description="Prepares the website for distribution, but does not add the videos to the zip." depends="-website-main, -website-dist" /> - - <target name="-website-videos" depends="-website-clean"> - <mkdir dir="build/website/videos" /> - <copy todir="build/website/videos"> - <fileset dir="website/videos" /> - </copy> - </target> - - <target name="-website-main" depends="-website-clean, version, javadoc, changelogToHtml"> - <taskdef classpath="deps/website/java2html.jar" name="java2html" classname="de.java2html.anttasks.Java2HtmlTask" /> - <mkdir dir="build/website" /> - <copy todir="build/website"> - <fileset dir="website"> - <exclude name="**/*.jpage" /> - <exclude name="**/*.svg" /> - <exclude name="**/*.psd" /> - <exclude name="**/*.ai" /> - <exclude name="**/publish" /> - <exclude name="**/*unused*" /> - <exclude name="videos/**" /> - </fileset> - </copy> - <copy todir="build/website" overwrite="true"> - <fileset dir="website"> - <include name="index.html" /> - <include name="download.html" /> - <include name="slideshow.html" /> - <include name="mavenrepo/index.html" /> - </fileset> - <filterchain> - <replacetokens> - <token key="VERSION" value="${lombok.version}" /> - </replacetokens> - </filterchain> - </copy> - <antcall target="-integrateSnippet"> - <param name="transformationName" value="GetterSetter" /> - </antcall> - <antcall target="-integrateSnippet"> - <param name="transformationName" value="ToString" /> - </antcall> - <antcall target="-integrateSnippet"> - <param name="transformationName" value="EqualsAndHashCode" /> - </antcall> - <antcall target="-integrateSnippet"> - <param name="transformationName" value="Data" /> - </antcall> - <antcall target="-integrateSnippet"> - <param name="transformationName" value="Cleanup" /> - </antcall> - <antcall target="-integrateSnippet"> - <param name="transformationName" value="Synchronized" /> - </antcall> - <antcall target="-integrateSnippet"> - <param name="transformationName" value="SneakyThrows" /> - </antcall> - <mkdir dir="dist" /> - </target> - - <target name="-website-dist"> - <tar destfile="dist/website.tar.bz2" compression="bzip2"> - <tarfileset dir="build/website" /> - <tarfileset dir="doc/api" prefix="api" /> - </tar> - <echo>Now upload dist/website.tar.bz2 to the webserver.</echo> - <echo>If you want to host projectlombok.org on github, run the website/publish script, but this is not where the site is currently hosted.</echo> - </target> - - <target name="-integrateSnippet"> - <mkdir dir="build/website" /> - <property name="prefile" location="usage_examples/${transformationName}Example_pre.jpage" /> - <property name="postfile" location="usage_examples/${transformationName}Example_post.jpage" /> - <property name="htmlfile" location="website/features/${transformationName}.html" /> - <mkdir dir="build/temp" /> - <property name="preout" location="build/temp/${transformationName}Example_pre.jpage.html" /> - <property name="postout" location="build/temp/${transformationName}Example_post.jpage.html" /> - <java2html srcdir="usage_examples" includes="${transformationName}Example_*.jpage" destdir="build/temp" tabs="${SNIPPET_TAB_STOP}" - showLineNumbers="true" overwrite="true" /> - <loadfile property="pre" encoding="UTF-8" srcFile="${preout}"> - <filterchain> - <linecontainsregexp> - <regexp pattern="(code>)|(font>)" /> - </linecontainsregexp> - <striplinebreaks /> - </filterchain> - </loadfile> - <loadfile property="post" encoding="UTF-8" srcFile="${postout}"> - <filterchain> - <linecontainsregexp> - <regexp pattern="(code>)|(font>)" /> - </linecontainsregexp> - <striplinebreaks /> - </filterchain> - </loadfile> - <delete dir="build/temp" quiet="true" /> - <copy file="${htmlfile}" todir="build/website/features" overwrite="true"> - <filterchain> - <replacetokens> - <token key="HTML_PRE" value="${pre}" /> - <token key="HTML_POST" value="${post}" /> - </replacetokens> - </filterchain> - </copy> - </target> - - <target name="compile" description="Compiles the code"> - <mkdir dir="build/lombok" /> - <!-- This version trickery is so that an eclipse running in a JVM 1.5 will run - properly (It'll never touch the javac files and hence never trigger a - Bad Class Version Number error, but for javac we definitely cannot support - javac 1.5, partly because they completely rewrote large swaths of javac, - and partly because our injection mechanism (annotations) doesn't work very - well on javac 1.5, hence, when using javac, we do demand you're on 1.6. --> - <javac srcdir="src" debug="on" destdir="build/lombok" target="1.5" excludes="lombok/javac/**"> - <classpath refid="lombok.deps.path" /> - <classpath refid="lombok.libs.path" /> - </javac> - <javac srcdir="src" debug="on" destdir="build/lombok" target="1.6" includes="lombok/javac/**"> - <classpath refid="lombok.deps.path" /> - <classpath refid="lombok.libs.path" /> - </javac> - <copy todir="build/lombok"> - <fileset dir="src"> - <exclude name="**/*.java" /> - <exclude name="**/*.class" /> - <exclude name="**/*.svg" /> - </fileset> - </copy> - - <mkdir dir="build/lombok/META-INF" /> - <mkdir dir="build/lombok/META-INF/services" /> - <echo file="build/lombok/META-INF/services/javax.annotation.processing.Processor">lombok.javac.apt.Processor</echo> - - <mkdir dir="build/eclipse.agent" /> - <mkdir dir="build/eclipse.agent.src" /> - <copy todir="build/eclipse.agent.src"> - <fileset dir="src_eclipseagent" /> - <fileset refid="eclipse.agent.main.deps" /> - </copy> - - <javac debug="on" destdir="build/eclipse.agent" target="1.5" srcdir="build/eclipse.agent.src"> - <classpath refid="eclipse.agent.deps.path" /> - <classpath refid="eclipse.agent.libs.path" /> - </javac> - </target> - - <target name="-unpackLibs"> - <unjar dest="build/lombok"> - <path refid="lombok.libs.path" /> - </unjar> - <unjar dest="build/eclipse.agent"> - <path refid="eclipse.agent.libs.path" /> - </unjar> - </target> - - <target name="version" description="Shows the version number"> + <target name="version" description="Shows the version number" unless="lombok.version"> <mkdir dir="build/lombok" /> <javac srcdir="src" debug="on" destdir="build/lombok" target="1.5" includes="lombok/core/Version.java" /> <java @@ -238,209 +44,44 @@ <echo level="info">Lombok version: ${lombok.version}</echo> </target> - <target name="javadoc" description="Generates the javadoc" depends="version"> - <delete dir="build/api" quiet="true" /> - <delete dir="doc/api" quiet="true" /> - <mkdir dir="build/api" /> - <property name="javadoc.overview.html" location="build/javadoc.overview.html" /> - <echo file="${javadoc.overview.html}"><![CDATA[<html><body> - Welcome to the lombok javadoc. If you're just looking to learn more about using lombok - You probably want to look at <a href="http://projectlombok.org/features/index.html">the feature documentation</a>. Otherwise, - check the <a href="lombok/package-summary.html">lombok</a> package. If you're trying to extend lombok or - write your own plugins, the other packages are what you're looking for.</body></html> - ]]></echo> - <javadoc sourcepath="src" defaultexcludes="yes" destdir="build/api" windowtitle="Lombok" Overview="${javadoc.overview.html}"> - <classpath refid="lombok.deps.path" /> - <classpath refid="lombok.libs.path" /> - <link href="http://java.sun.com/javase/6/docs/api/" offline="true" packagelistLoc="./deps/javadoc/java6"/> - <header><![CDATA[<a href='http://projectlombok.org/'>Lombok</a> - ]]>v${lombok.version}</header> - <bottom><![CDATA[<i>Copyright © 2009 Reinier Zwitserloot and Roel Spilker, licensed under the <a href='http://www.opensource.org/licenses/mit-license.php'>MIT licence</a>.]]></bottom> - </javadoc> - <mkdir dir="doc/api" /> - <copy todir="doc/api"> - <fileset dir="build/api" includes="**/*.html" /> - <filterchain> - <linecontainsregexp negate="true"> - <regexp pattern="(Generated by javadoc)|(.META NAME=.date.)" /> - </linecontainsregexp> - </filterchain> - </copy> - <copy todir="doc/api"> - <fileset dir="build/api" excludes="**/*.html" /> - </copy> + <target name="buildDeps" description="Builds dependencies"> + <ant antfile="buildScripts/deps.ant.xml" target="buildDeps" inheritAll="false" /> </target> - <target name="dist" description="Builds THE lombok.jar file which contains everything " depends="clean, compile, version, -unpackLibs"> - <mkdir dir="dist" /> - <jar basedir="build/eclipse.agent" destfile="dist/lombok.eclipse.agent-${lombok.version}.jar"> - <manifest> - <attribute name="Premain-Class" value="lombok.eclipse.agent.EclipsePatcher" /> - <attribute name="Can-Redefine-Classes" value="true" /> - </manifest> - </jar> - <copy file="dist/lombok.eclipse.agent-${lombok.version}.jar" tofile="dist/lombok.eclipse.agent.jar" /> - <copy file="doc/changelog.markdown" tofile="build/changelog.txt" /> - <jar destfile="dist/lombok-${lombok.version}.jar"> - <fileset dir="build/lombok" /> - <fileset dir="dist" includes="lombok.eclipse.agent.jar" /> - <fileset dir="build" includes="changelog.txt" /> - <manifest> - <attribute name="Main-Class" value="lombok.installer.Installer" /> - <attribute name="Lombok-Version" value="${lombok.version}" /> - </manifest> - </jar> - <copy file="dist/lombok-${lombok.version}.jar" tofile="dist/lombok.jar" /> + <target name="dist" depends="version, buildDeps" description="Builds THE lombok.jar file which contains everything"> + <ant antfile="buildScripts/compile.ant.xml" target="dist" inheritAll="false"> + <property name="lombok.version" value="${lombok.version}" /> + </ant> + <property name="lombok.dist.built" value="true" /> </target> - - <property name="credentialsFile" value="google.properties" /> - - <target name="-credentials"> - <available property="hasCredentialsFile" file="${credentialsFile}"/> + <target name="compile" description="Compiles the code"> + <ant antfile="buildScripts/compile.ant.xml" target="compile" inheritAll="false"> + <property name="lombok.version" value="${lombok.version}" /> + </ant> </target> - <target name="-checkCredentialsFile" depends="-credentials" unless="hasCredentialsFile"> - <echo file="${credentialsFile}">#username=[your google account name without @gmail.com] -#password=[your googlecode password, is NOT your gmail password]</echo> - <fail message="fill in ${credentialsFile} to provide your credentials"/> + <target name="maven" description="Build a maven repository"> + <ant antfile="buildScripts/maven.ant.xml" target="maven" inheritAll="false"> + <property name="lombok.version" value="${lombok.version}" /> + </ant> </target> - <target name="publish" description="Publishes the latest build to googlecode" depends="-checkCredentialsFile, dist"> - <taskdef classname="net.bluecow.googlecode.ant.GoogleCodeUploadTask" classpath="deps/website/ant-googlecode-0.0.2.jar" name="gcupload"/> - <property file="${credentialsFile}" prefix="google" /> - <gcupload - username="${google.username}" - password="${google.password}" - projectname="projectlombok" - filename="dist/lombok.jar" - targetfilename="lombok-${lombok.version}.jar" - summary="Version ${lombok.version}" - labels="" - verbose="true" /> - <gcupload - username="${google.username}" - password="${google.password}" - projectname="projectlombok" - filename="dist/lombok.jar" - targetfilename="lombok.jar" - summary="Version ${lombok.version} - The everything jar - doubleclick it to install, or just include it in your projects." - labels="Featured" - verbose="true" /> + <target name="publish" description="Publishes the latest build to googlecode"> + <ant antfile="buildScripts/publish.ant.xml" target="publish" inheritAll="false"> + <property name="lombok.version" value="${lombok.version}" /> + </ant> </target> - <target name="changelogToHtml"> - <mkdir dir="build/changelog" /> - <echo file="build/changelog/CompileChangelog.java"><![CDATA[ -import com.petebevin.markdown.MarkdownProcessor; -import java.io.*; - -public class CompileChangelog { - public static void main(String[] args) { - try { - FileInputStream in = new FileInputStream(args[0]); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - byte[] b = new byte[65536]; - while ( true ) { - int r = in.read(b); - if ( r == -1 ) break; - out.write(b, 0, r); - } - in.close(); - String markdown = new String(out.toByteArray(), "UTF-8"); - String html = new MarkdownProcessor().markdown(markdown); - FileOutputStream file = new FileOutputStream(args[1]); - file.write(html.getBytes("UTF-8")); - file.close(); - System.exit(0); - } catch ( Throwable e ) { - e.printStackTrace(); - System.exit(1); - } - } -} -]]></echo> - <mkdir dir="build/website" /> - <javac srcdir="build/changelog" destdir="build/changelog" classpath="deps/website/markdownj.jar" debug="on" /> - <property name="CHANGELOG_FILE" location="doc/changelog.markdown" /> - <property name="CHANGELOG_HTML" location="build/website/changelog.html" /> - <java fork="true" classname="CompileChangelog" failonerror="true"> - <classpath> - <pathelement location="deps/website/markdownj.jar" /> - <pathelement location="build/changelog" /> - </classpath> - <arg value="${CHANGELOG_FILE}" /> - <arg value="${CHANGELOG_HTML}" /> - </java> + <target name="website" description="Prepares the website for distribution"> + <ant antfile="buildScripts/website.ant.xml" target="website" inheritAll="false"> + <property name="lombok.version" value="${lombok.version}" /> + </ant> </target> - <target name="maven" depends="version, dist" description="Build a maven repository."> - <loadresource property="mvn.oldversions"> - <url url="http://projectlombok.org/mavenrepo/org/projectlombok/lombok/maven-metadata.xml" /> - <filterchain> - <linecontains><contains value="/version>" /></linecontains> - <headfilter lines="-1" skip="1" /> - </filterchain> - </loadresource> - <mkdir dir="build" /> - <echo file="build/version.tagged.tmp"><version>${lombok.version}</version></echo> - <loadfile srcFile="build/version.tagged.tmp" property="lombok.version.tagged" /> - <delete file="build/version.tagged.tmp" /> - <fail message="You already created a maven target for this version. You'll have to update the version to something new!"> - <condition> - <contains string="${mvn.oldversions}" substring="${lombok.version.tagged}" /> - </condition> - </fail> - - <delete dir="build/maven" quiet="true" /> - <property name="mvn.dir" value="build/maven/org/projectlombok/lombok" /> - <property name="mvn.bin" value="${mvn.dir}/${lombok.version}" /> - <property name="mvn.pom" value="${mvn.bin}/lombok-${lombok.version}.pom" /> - <mkdir dir="${mvn.bin}" /> - <tstamp> - <format property="now.millis" pattern="yyyyMMddHHmmss" timezone="UTC" /> - </tstamp> - <copy todir="${mvn.bin}" file="dist/lombok-${lombok.version}.jar" /> - <checksum property="mvn.bin.md5" file="${mvn.bin}/lombok-${lombok.version}.jar" algorithm="MD5" /> - <checksum property="mvn.bin.sha1" file="${mvn.bin}/lombok-${lombok.version}.jar" algorithm="SHA1" /> - <echo file="${mvn.bin}/lombok-${lombok.version}.jar.md5">${mvn.bin.md5}</echo> - <echo file="${mvn.bin}/lombok-${lombok.version}.jar.sha1">${mvn.bin.sha1}</echo> - <jar destfile="${mvn.bin}/lombok-${lombok.version}-sources.jar" basedir="src" excludes="**/.DS_Store" /> - <checksum property="mvn.src.md5" file="${mvn.bin}/lombok-${lombok.version}-sources.jar" algorithm="MD5" /> - <checksum property="mvn.src.sha1" file="${mvn.bin}/lombok-${lombok.version}-sources.jar" algorithm="SHA1" /> - <echo file="${mvn.bin}/lombok-${lombok.version}-sources.jar.md5">${mvn.src.md5}</echo> - <echo file="${mvn.bin}/lombok-${lombok.version}-sources.jar.sha1">${mvn.src.sha1}</echo> - <copy tofile="${mvn.pom}" file="doc/maven-pom.xml"> - <filterchain> - <replacetokens> - <token key="VERSION" value="${lombok.version}" /> - </replacetokens> - </filterchain> - </copy> - <checksum property="mvn.pom.md5" file="${mvn.pom}" algorithm="MD5" /> - <checksum property="mvn.pom.sha1" file="${mvn.pom}" algorithm="SHA1" /> - <echo file="${mvn.pom}.md5">${mvn.pom.md5}</echo> - <echo file="${mvn.pom}.sha1">${mvn.pom.sha1}</echo> - <echo file="${mvn.dir}/maven-metadata.xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?> -<metadata> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - <version>${lombok.version}</version> - <versioning> - <versions> - <version>${lombok.version}</version> -${mvn.oldversions} - </versions> - <lastUpdated>${now.millis}</lastUpdated> - </versioning> -</metadata> -]]></echo> - <checksum property="mvn.manifest.md5" file="${mvn.dir}/maven-metadata.xml" algorithm="MD5" /> - <checksum property="mvn.manifest.sha1" file="${mvn.dir}/maven-metadata.xml" algorithm="SHA1" /> - <echo file="${mvn.dir}/maven-metadata.xml.md5">${mvn.manifest.md5}</echo> - <echo file="${mvn.dir}/maven-metadata.xml.sha1">${mvn.manifest.sha1}</echo> - <tar destfile="dist/maven.tar.bz2" compression="bzip2"> - <tarfileset dir="build/maven" /> - </tar> - <echo>Now copy maven.tar.bz2 to the website and unpack it in the mavenrepo directory, overwriting whatever's there.</echo> + <target name="website-novideo" description="Prepares the website for distribution, but does not add the videos to the zip."> + <ant antfile="buildScripts/website.ant.xml" target="website-novideo" inheritAll="false"> + <property name="lombok.version" value="${lombok.version}" /> + </ant> </target> </project> diff --git a/buildScripts/compile.ant.xml b/buildScripts/compile.ant.xml new file mode 100644 index 00000000..82ee07f7 --- /dev/null +++ b/buildScripts/compile.ant.xml @@ -0,0 +1,131 @@ +<!-- + 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-compile" basedir=".." default="dist"> + <description>This buildfile is part of projectlombok.org. It responsible for compiling the main +lombok code including the various agents.</description> + <property name="build.compiler" value="javac1.6" /> + + <target name="version" unless="lombok.version"> + <ant antfile="build.xml" target="version" inheritAll="false" /> + <loadresource property="lombok.version"> + <file file="build/version.txt" /> + <filterchain> + <striplinebreaks /> + </filterchain> + </loadresource> + </target> + + <fileset dir="src" id="eclipse.agent.main.deps"> + <include name="lombok/core/SpiLoadUtil.java" /> + <include name="lombok/Lombok.java" /> + </fileset> + + <path id="deps.path"> + <fileset dir="deps/lombok"> + <include name="**/*.jar" /> + </fileset> + </path> + + <path id="lombok.libs.path"> + <fileset dir="lib/lombok"> + <include name="**/*.jar" /> + </fileset> + </path> + + <path id="eclipse.agent.libs.path"> + <fileset dir="lib/eclipse.agent"> + <include name="**/*.jar" /> + </fileset> + </path> + + <target name="-unpackLibs"> + <unjar dest="build/lombok"> + <path refid="lombok.libs.path" /> + </unjar> + <unjar dest="build/eclipse.agent"> + <path refid="eclipse.agent.libs.path" /> + </unjar> + </target> + + <target name="compile" description="Compiles the code"> + <mkdir dir="build/lombok" /> + <!-- This version trickery is so that an eclipse running in a JVM 1.5 will run + properly (It'll never touch the javac files and hence never trigger a + Bad Class Version Number error, but for javac we definitely cannot support + javac 1.5, partly because they completely rewrote large swaths of javac, + and partly because our injection mechanism (annotations) doesn't work very + well on javac 1.5, hence, when using javac, we do demand you're on 1.6. --> + <javac srcdir="src" debug="on" destdir="build/lombok" target="1.5" excludes="lombok/javac/**"> + <classpath refid="deps.path" /> + <classpath refid="lombok.libs.path" /> + </javac> + <javac srcdir="src" debug="on" destdir="build/lombok" target="1.6" includes="lombok/javac/**"> + <classpath refid="deps.path" /> + <classpath refid="lombok.libs.path" /> + </javac> + <copy todir="build/lombok"> + <fileset dir="src"> + <exclude name="**/*.java" /> + <exclude name="**/*.class" /> + <exclude name="**/*.svg" /> + </fileset> + </copy> + + <mkdir dir="build/lombok/META-INF" /> + <mkdir dir="build/lombok/META-INF/services" /> + <echo file="build/lombok/META-INF/services/javax.annotation.processing.Processor">lombok.javac.apt.Processor</echo> + + <mkdir dir="build/eclipse.agent" /> + <mkdir dir="build/eclipse.agent.src" /> + <copy todir="build/eclipse.agent.src"> + <fileset dir="src_eclipseagent" /> + <fileset refid="eclipse.agent.main.deps" /> + </copy> + + <javac debug="on" destdir="build/eclipse.agent" target="1.5" srcdir="build/eclipse.agent.src"> + <classpath refid="deps.path" /> + <classpath refid="eclipse.agent.libs.path" /> + </javac> + </target> + + <target name="dist" description="Builds THE lombok.jar file which contains everything" depends="compile, version, -unpackLibs"> + <mkdir dir="dist" /> + <jar basedir="build/eclipse.agent" destfile="dist/lombok.eclipse.agent-${lombok.version}.jar"> + <manifest> + <attribute name="Premain-Class" value="lombok.eclipse.agent.EclipsePatcher" /> + <attribute name="Can-Redefine-Classes" value="true" /> + </manifest> + </jar> + <copy file="dist/lombok.eclipse.agent-${lombok.version}.jar" tofile="dist/lombok.eclipse.agent.jar" /> + <copy file="doc/changelog.markdown" tofile="build/changelog.txt" /> + <jar destfile="dist/lombok-${lombok.version}.jar"> + <fileset dir="build/lombok" /> + <fileset dir="dist" includes="lombok.eclipse.agent.jar" /> + <fileset dir="build" includes="changelog.txt" /> + <manifest> + <attribute name="Main-Class" value="lombok.installer.Installer" /> + <attribute name="Lombok-Version" value="${lombok.version}" /> + </manifest> + </jar> + <copy file="dist/lombok-${lombok.version}.jar" tofile="dist/lombok.jar" /> + </target> +</project> diff --git a/buildScripts/deps.ant.xml b/buildScripts/deps.ant.xml new file mode 100644 index 00000000..648685dc --- /dev/null +++ b/buildScripts/deps.ant.xml @@ -0,0 +1,46 @@ +<!-- + 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-deps" basedir=".." default="buildDeps"> + <description>This buildfile is part of projectlombok.org. It responsible for finding, downloading, +and building dependencies.</description> + + <property name="dir.lombok.patcher" location="../lombok.patcher" /> + + <target name="buildDeps" description="Builds dependencies" depends="build-lombok.patcher" /> + + <target name="-check-lombok.patcher"> + <ant dir="${dir.lombok.patcher}" target="dist" inheritAll="false" /> + <condition property="replace-lombok.patcher"> + <or> + <not><available file="lib/eclipse.agent/lombok-patcher.jar" /></not> + <not><uptodate + srcfile="${dir.lombok.patcher}/dist/lombok-patcher.jar" + targetfile="lib/eclipse.agent/lombok-patcher.jar" /></not> + </or> + </condition> + </target> + + <target name="build-lombok.patcher" depends="-check-lombok.patcher" if="replace-lombok.patcher"> + <copy file="${dir.lombok.patcher}/dist/lombok-patcher.jar" todir="lib/eclipse.agent" /> + <echo>** UPDATED: lib/eclipse.agent/lombok-patcher.jar</echo> + </target> +</project> diff --git a/buildScripts/maven.ant.xml b/buildScripts/maven.ant.xml new file mode 100644 index 00000000..783303f2 --- /dev/null +++ b/buildScripts/maven.ant.xml @@ -0,0 +1,111 @@ +<!-- + 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-maven" basedir=".." default="maven"> + <description>This buildfile is part of projectlombok.org. It is responsible for creating and maintaining +the maven repository that contains lombok's deliverables for those using maven.</description> + <target name="version" unless="lombok.version"> + <ant antfile="build.xml" target="version" inheritAll="false" /> + <loadresource property="lombok.version"> + <file file="build/version.txt" /> + <filterchain> + <striplinebreaks /> + </filterchain> + </loadresource> + </target> + + <target name="dist" unless="lombok.dist.built" depends="version"> + <ant antfile="buildScripts/compile.xml" target="dist" inheritAll="false"> + <property name="lombok.version" value="${lombok.version}" /> + </ant> + </target> + + <target name="maven" depends="version, dist" description="Build a maven repository."> + <loadresource property="mvn.oldversions"> + <url url="http://projectlombok.org/mavenrepo/org/projectlombok/lombok/maven-metadata.xml" /> + <filterchain> + <linecontains><contains value="/version>" /></linecontains> + <headfilter lines="-1" skip="1" /> + </filterchain> + </loadresource> + <mkdir dir="build" /> + <echo file="build/version.tagged.tmp"><version>${lombok.version}</version></echo> + <loadfile srcFile="build/version.tagged.tmp" property="lombok.version.tagged" /> + <delete file="build/version.tagged.tmp" /> + <fail message="You already created a maven target for this version. You'll have to update the version to something new!"> + <condition> + <contains string="${mvn.oldversions}" substring="${lombok.version.tagged}" /> + </condition> + </fail> + + <delete dir="build/maven" quiet="true" /> + <property name="mvn.dir" value="build/maven/org/projectlombok/lombok" /> + <property name="mvn.bin" value="${mvn.dir}/${lombok.version}" /> + <property name="mvn.pom" value="${mvn.bin}/lombok-${lombok.version}.pom" /> + <mkdir dir="${mvn.bin}" /> + <tstamp> + <format property="now.millis" pattern="yyyyMMddHHmmss" timezone="UTC" /> + </tstamp> + <copy todir="${mvn.bin}" file="dist/lombok-${lombok.version}.jar" /> + <checksum property="mvn.bin.md5" file="${mvn.bin}/lombok-${lombok.version}.jar" algorithm="MD5" /> + <checksum property="mvn.bin.sha1" file="${mvn.bin}/lombok-${lombok.version}.jar" algorithm="SHA1" /> + <echo file="${mvn.bin}/lombok-${lombok.version}.jar.md5">${mvn.bin.md5}</echo> + <echo file="${mvn.bin}/lombok-${lombok.version}.jar.sha1">${mvn.bin.sha1}</echo> + <jar destfile="${mvn.bin}/lombok-${lombok.version}-sources.jar" basedir="src" excludes="**/.DS_Store" /> + <checksum property="mvn.src.md5" file="${mvn.bin}/lombok-${lombok.version}-sources.jar" algorithm="MD5" /> + <checksum property="mvn.src.sha1" file="${mvn.bin}/lombok-${lombok.version}-sources.jar" algorithm="SHA1" /> + <echo file="${mvn.bin}/lombok-${lombok.version}-sources.jar.md5">${mvn.src.md5}</echo> + <echo file="${mvn.bin}/lombok-${lombok.version}-sources.jar.sha1">${mvn.src.sha1}</echo> + <copy tofile="${mvn.pom}" file="doc/maven-pom.xml"> + <filterchain> + <replacetokens> + <token key="VERSION" value="${lombok.version}" /> + </replacetokens> + </filterchain> + </copy> + <checksum property="mvn.pom.md5" file="${mvn.pom}" algorithm="MD5" /> + <checksum property="mvn.pom.sha1" file="${mvn.pom}" algorithm="SHA1" /> + <echo file="${mvn.pom}.md5">${mvn.pom.md5}</echo> + <echo file="${mvn.pom}.sha1">${mvn.pom.sha1}</echo> + <echo file="${mvn.dir}/maven-metadata.xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?> +<metadata> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + <versioning> + <versions> + <version>${lombok.version}</version> + ${mvn.oldversions} + </versions> + <lastUpdated>${now.millis}</lastUpdated> + </versioning> +</metadata> +]]></echo> + <checksum property="mvn.manifest.md5" file="${mvn.dir}/maven-metadata.xml" algorithm="MD5" /> + <checksum property="mvn.manifest.sha1" file="${mvn.dir}/maven-metadata.xml" algorithm="SHA1" /> + <echo file="${mvn.dir}/maven-metadata.xml.md5">${mvn.manifest.md5}</echo> + <echo file="${mvn.dir}/maven-metadata.xml.sha1">${mvn.manifest.sha1}</echo> + <tar destfile="dist/maven.tar.bz2" compression="bzip2"> + <tarfileset dir="build/maven" /> + </tar> + <echo>Now copy maven.tar.bz2 to the website and unpack it in the mavenrepo directory. Let it overwrite files.</echo> + </target> +</project> diff --git a/buildScripts/publish.ant.xml b/buildScripts/publish.ant.xml new file mode 100644 index 00000000..6c31b42b --- /dev/null +++ b/buildScripts/publish.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-publish" basedir=".." default="publish"> + <description>This buildfile is part of projectlombok.org. It is responsible for turning the build results +into the actual deliverable form, and uploading it to the distribution websites.</description> + <property name="credentialsFile" value="google.properties" /> + + <target name="version" unless="lombok.version"> + <ant antfile="build.xml" target="version" inheritAll="false" /> + <loadresource property="lombok.version"> + <file file="build/version.txt" /> + <filterchain> + <striplinebreaks /> + </filterchain> + </loadresource> + </target> + + <target name="dist" unless="lombok.dist.built" depends="version"> + <ant antfile="buildScripts/compile.xml" target="dist" inheritAll="false"> + <property name="lombok.version" value="${lombok.version}" /> + </ant> + </target> + + <target name="-credentials"> + <available property="hasCredentialsFile" file="${credentialsFile}"/> + </target> + + <target name="-checkCredentialsFile" depends="-credentials" unless="hasCredentialsFile"> + <echo file="${credentialsFile}">#username=[your google account name without @gmail.com] +#password=[your googlecode password, is NOT your gmail password]</echo> + <fail message="fill in ${credentialsFile} to provide your credentials"/> + </target> + + <target name="publish" description="Publishes the latest build to googlecode" depends="version, -checkCredentialsFile, dist"> + <taskdef classname="net.bluecow.googlecode.ant.GoogleCodeUploadTask" classpath="deps/website/ant-googlecode-0.0.2.jar" name="gcupload"/> + <property file="${credentialsFile}" prefix="google" /> + <gcupload + username="${google.username}" + password="${google.password}" + projectname="projectlombok" + filename="dist/lombok.jar" + targetfilename="lombok-${lombok.version}.jar" + summary="Version ${lombok.version}" + labels="" + verbose="true" /> + <gcupload + username="${google.username}" + password="${google.password}" + projectname="projectlombok" + filename="dist/lombok.jar" + targetfilename="lombok.jar" + summary="Version ${lombok.version} - The everything jar - doubleclick it to install, or just include it in your projects." + labels="Featured" + verbose="true" /> + </target> +</project> diff --git a/buildScripts/website.ant.xml b/buildScripts/website.ant.xml new file mode 100644 index 00000000..d4b0605d --- /dev/null +++ b/buildScripts/website.ant.xml @@ -0,0 +1,224 @@ +<!-- + 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-website" basedir=".." default="website"> + <description> +This buildfile is part of projectlombok.org. It is responsible for building the website and all website-related aspects, +such as converting the changelog into HTML, and creating javadoc.</description> + <property name="SNIPPET_TAB_STOP" value="2" /> + + <target name="-website-clean"> + <delete dir="build/website" quiet="true" /> + </target> + + <target name="website" description="Prepares the website for distribution" depends="-website-main, -website-videos, -website-dist" /> + <target name="website-novideo" description="Prepares the website for distribution, but does not add the videos to the zip." depends="-website-main, -website-dist" /> + + <target name="version" unless="lombok.version"> + <ant antfile="build.xml" target="version" inheritAll="false" /> + <loadresource property="lombok.version"> + <file file="build/version.txt" /> + <filterchain> + <striplinebreaks /> + </filterchain> + </loadresource> + </target> + + <target name="-website-videos" depends="-website-clean"> + <mkdir dir="build/website/videos" /> + <copy todir="build/website/videos"> + <fileset dir="website/videos" /> + </copy> + </target> + + <target name="-website-main" depends="-website-clean, version, javadoc, changelogToHtml"> + <taskdef classpath="deps/website/java2html.jar" name="java2html" classname="de.java2html.anttasks.Java2HtmlTask" /> + <mkdir dir="build/website" /> + <copy todir="build/website"> + <fileset dir="website"> + <exclude name="**/*.jpage" /> + <exclude name="**/*.svg" /> + <exclude name="**/*.psd" /> + <exclude name="**/*.ai" /> + <exclude name="**/publish" /> + <exclude name="**/*unused*" /> + <exclude name="videos/**" /> + </fileset> + </copy> + <copy todir="build/website" overwrite="true"> + <fileset dir="website"> + <include name="index.html" /> + <include name="download.html" /> + <include name="slideshow.html" /> + <include name="mavenrepo/index.html" /> + </fileset> + <filterchain> + <replacetokens> + <token key="VERSION" value="${lombok.version}" /> + </replacetokens> + </filterchain> + </copy> + <antcall target="-integrateSnippet"> + <param name="transformationName" value="GetterSetter" /> + </antcall> + <antcall target="-integrateSnippet"> + <param name="transformationName" value="ToString" /> + </antcall> + <antcall target="-integrateSnippet"> + <param name="transformationName" value="EqualsAndHashCode" /> + </antcall> + <antcall target="-integrateSnippet"> + <param name="transformationName" value="Data" /> + </antcall> + <antcall target="-integrateSnippet"> + <param name="transformationName" value="Cleanup" /> + </antcall> + <antcall target="-integrateSnippet"> + <param name="transformationName" value="Synchronized" /> + </antcall> + <antcall target="-integrateSnippet"> + <param name="transformationName" value="SneakyThrows" /> + </antcall> + <mkdir dir="dist" /> + </target> + + <target name="-website-dist"> + <tar destfile="dist/website.tar.bz2" compression="bzip2"> + <tarfileset dir="build/website" /> + <tarfileset dir="doc/api" prefix="api" /> + </tar> + <echo>Now upload dist/website.tar.bz2 to the webserver.</echo> + </target> + + <target name="-integrateSnippet"> + <mkdir dir="build/website" /> + <property name="prefile" location="usage_examples/${transformationName}Example_pre.jpage" /> + <property name="postfile" location="usage_examples/${transformationName}Example_post.jpage" /> + <property name="htmlfile" location="website/features/${transformationName}.html" /> + <mkdir dir="build/temp" /> + <property name="preout" location="build/temp/${transformationName}Example_pre.jpage.html" /> + <property name="postout" location="build/temp/${transformationName}Example_post.jpage.html" /> + <java2html srcdir="usage_examples" includes="${transformationName}Example_*.jpage" destdir="build/temp" tabs="${SNIPPET_TAB_STOP}" + showLineNumbers="true" overwrite="true" /> + <loadfile property="pre" encoding="UTF-8" srcFile="${preout}"> + <filterchain> + <linecontainsregexp> + <regexp pattern="(code>)|(font>)" /> + </linecontainsregexp> + <striplinebreaks /> + </filterchain> + </loadfile> + <loadfile property="post" encoding="UTF-8" srcFile="${postout}"> + <filterchain> + <linecontainsregexp> + <regexp pattern="(code>)|(font>)" /> + </linecontainsregexp> + <striplinebreaks /> + </filterchain> + </loadfile> + <delete dir="build/temp" quiet="true" /> + <copy file="${htmlfile}" todir="build/website/features" overwrite="true"> + <filterchain> + <replacetokens> + <token key="HTML_PRE" value="${pre}" /> + <token key="HTML_POST" value="${post}" /> + </replacetokens> + </filterchain> + </copy> + </target> + + <target name="changelogToHtml"> + <mkdir dir="build/changelog" /> + <echo file="build/changelog/CompileChangelog.java"><![CDATA[ + import com.petebevin.markdown.MarkdownProcessor; + import java.io.*; + + public class CompileChangelog { + public static void main(String[] args) { + try { + FileInputStream in = new FileInputStream(args[0]); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] b = new byte[65536]; + while ( true ) { + int r = in.read(b); + if ( r == -1 ) break; + out.write(b, 0, r); + } + in.close(); + String markdown = new String(out.toByteArray(), "UTF-8"); + String html = new MarkdownProcessor().markdown(markdown); + FileOutputStream file = new FileOutputStream(args[1]); + file.write(html.getBytes("UTF-8")); + file.close(); + System.exit(0); + } catch ( Throwable e ) { + e.printStackTrace(); + System.exit(1); + } + } + } + ]]></echo> + <mkdir dir="build/website" /> + <javac srcdir="build/changelog" destdir="build/changelog" classpath="deps/website/markdownj.jar" debug="on" /> + <property name="CHANGELOG_FILE" location="doc/changelog.markdown" /> + <property name="CHANGELOG_HTML" location="build/website/changelog.html" /> + <java fork="true" classname="CompileChangelog" failonerror="true"> + <classpath> + <pathelement location="deps/website/markdownj.jar" /> + <pathelement location="build/changelog" /> + </classpath> + <arg value="${CHANGELOG_FILE}" /> + <arg value="${CHANGELOG_HTML}" /> + </java> + </target> + + <target name="javadoc" description="Generates the javadoc" depends="version"> + <delete dir="build/api" quiet="true" /> + <delete dir="doc/api" quiet="true" /> + <mkdir dir="build/api" /> + <property name="javadoc.overview.html" location="build/javadoc.overview.html" /> + <echo file="${javadoc.overview.html}"><![CDATA[<html><body> + Welcome to the lombok javadoc. If you're just looking to learn more about using lombok + You probably want to look at <a href="http://projectlombok.org/features/index.html">the feature documentation</a>. Otherwise, + check the <a href="lombok/package-summary.html">lombok</a> package. If you're trying to extend lombok or + write your own plugins, the other packages are what you're looking for.</body></html> + ]]></echo> + <javadoc sourcepath="src" defaultexcludes="yes" destdir="build/api" windowtitle="Lombok" Overview="${javadoc.overview.html}"> + <classpath refid="lombok.deps.path" /> + <classpath refid="lombok.libs.path" /> + <link href="http://java.sun.com/javase/6/docs/api/" offline="true" packagelistLoc="./deps/javadoc/java6"/> + <header><![CDATA[<a href='http://projectlombok.org/'>Lombok</a> - ]]>v${lombok.version}</header> + <bottom><![CDATA[<i>Copyright © 2009 Reinier Zwitserloot and Roel Spilker, licensed under the <a href='http://www.opensource.org/licenses/mit-license.php'>MIT licence</a>.]]></bottom> + </javadoc> + <mkdir dir="doc/api" /> + <copy todir="doc/api"> + <fileset dir="build/api" includes="**/*.html" /> + <filterchain> + <linecontainsregexp negate="true"> + <regexp pattern="(Generated by javadoc)|(.META NAME=.date.)" /> + </linecontainsregexp> + </filterchain> + </copy> + <copy todir="doc/api"> + <fileset dir="build/api" excludes="**/*.html" /> + </copy> + </target> +</project> diff --git a/deps/README b/deps/README index cda42040..3a260349 100644 --- a/deps/README +++ b/deps/README @@ -1,5 +1,4 @@ 'deps' are defined as those things which are required to compile or develop lombok, but which aren't required when -actually running lombok. The main lombok code is dependent on all libraries in the 'lombok' directory, whilst the agents -are dependent on both the contents of the 'agent' directory and the agent's specific directory (e.g. 'eclipse.agent'). +actually running lombok. For dependencies which need to be available at runtime, see the 'lib' directory. diff --git a/deps/eclipse.agent/spi-0.2.3-pre.jar b/deps/eclipse.agent/spi-0.2.3-pre.jar Binary files differdeleted file mode 100644 index ecd70464..00000000 --- a/deps/eclipse.agent/spi-0.2.3-pre.jar +++ /dev/null diff --git a/deps/tools.jar b/deps/lombok/tools.jar Binary files differindex bc3e0bef..bc3e0bef 100644 --- a/deps/tools.jar +++ b/deps/lombok/tools.jar diff --git a/lib/eclipse.agent/asm-3.1.jar b/lib/eclipse.agent/asm-3.1.jar Binary files differdeleted file mode 100644 index b3baf3fe..00000000 --- a/lib/eclipse.agent/asm-3.1.jar +++ /dev/null diff --git a/lib/eclipse.agent/lombok-patcher.jar b/lib/eclipse.agent/lombok-patcher.jar Binary files differnew file mode 100644 index 00000000..7818fc1d --- /dev/null +++ b/lib/eclipse.agent/lombok-patcher.jar diff --git a/src/lombok/eclipse/TransformEclipseAST.java b/src/lombok/eclipse/TransformEclipseAST.java index 3caddb18..691327b1 100644 --- a/src/lombok/eclipse/TransformEclipseAST.java +++ b/src/lombok/eclipse/TransformEclipseAST.java @@ -95,6 +95,10 @@ public class TransformEclipseAST { //potential speedup: if trace contains org.eclipse.swt.widgets. -> stop - nothing interesting ever follows that. I think. } + public static void transform_swapped(CompilationUnitDeclaration ast, Parser parser) { + transform(parser, ast); + } + /** * This method is called immediately after Eclipse finishes building a CompilationUnitDeclaration, which is * the top-level AST node when Eclipse parses a source file. The signature is 'magic' - you should not diff --git a/src_eclipseagent/java/lombok/eclipse/ClassLoaderWorkaround.java b/src_eclipseagent/java/lombok/eclipse/ClassLoaderWorkaround.java deleted file mode 100644 index f5c8bbd3..00000000 --- a/src_eclipseagent/java/lombok/eclipse/ClassLoaderWorkaround.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * 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 java.lombok.eclipse; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; - - -/** - * Allows you to inject the lombok classes into any classloader, even if that classloader does not - * know how to find the lombok classes. - * - * Example: Injecting lombok's Eclipse Parser patching code into eclipse's OSGi BundleLoader. - * - * @author rzwitserloot - */ -public class ClassLoaderWorkaround { - static RuntimeException sneakyThrow(Throwable t) { - if ( t == null ) throw new NullPointerException("t"); - ClassLoaderWorkaround.<RuntimeException>sneakyThrow0(t); - return null; - } - - @SuppressWarnings("unchecked") - private static <T extends Throwable> void sneakyThrow0(Throwable t) throws T { - throw (T)t; - } - - private static final Map<ClassLoader, Method> transform = new HashMap<ClassLoader, Method>(); - - public static void transformCompilationUnitDeclaration(Object parser, Object cud) throws Exception { - Method transformMethod = getTransformMethod(cud); - try { - transformMethod.invoke(null, parser, cud); - } catch ( InvocationTargetException e ) { - throw sneakyThrow(e.getCause()); - } - } - - private static Method getTransformMethod(Object cud) throws ClassNotFoundException { - ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); - - synchronized ( transform ) { - if ( !transform.containsKey(contextLoader)) { - transform.put(contextLoader, findTransformMethod(cud)); - } - - Method m = transform.get(contextLoader); - if ( m == null ) throw new ClassNotFoundException("lombok.eclipse.TransformEclipseAST"); - return m; - - } - } - - private static Method findTransformMethod(Object cud) throws ClassNotFoundException { - final ClassLoader parent = cud.getClass().getClassLoader(); - ClassLoader loader = new ClassLoader() { - @Override public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { - if ( name.startsWith("lombok.") ) { - InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(name.replace(".", "/") + ".class"); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - - byte[] b = new byte[65536]; - try { - while ( true ) { - int r = in.read(b); - if ( r == -1 ) break; - if ( r > 0 ) out.write(b, 0, r); - } - - in.close(); - byte[] data = out.toByteArray(); - Class<?> result = defineClass(name, data, 0, data.length); - if ( resolve ) resolveClass(result); - return result; - } catch ( IOException e ) { - throw new ClassNotFoundException(); - } - } else { - try { - Class<?> result = ClassLoader.getSystemClassLoader().loadClass(name); - if ( resolve ) resolveClass(result); - return result; - } catch ( ClassNotFoundException e ) { - Class<?> result = parent.loadClass(name); - if ( resolve ) resolveClass(result); - return result; - } - } - } - }; - - Class<?> c = loader.loadClass("lombok.eclipse.TransformEclipseAST"); - for ( Method method : c.getMethods() ) { - if ( method.getName().equals("transform") ) { - Class<?>[] types = method.getParameterTypes(); - if ( types.length != 2 ) continue; - if ( !types[0].getName().equals("org.eclipse.jdt.internal.compiler.parser.Parser") ) continue; - if ( !types[1].getName().equals("org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration") ) continue; - return method; - } - } - - throw new ClassNotFoundException("lombok.eclipse.TransformEclipseAST"); - } -} diff --git a/src_eclipseagent/java/lombok/eclipse/package-info.java b/src_eclipseagent/java/lombok/eclipse/package-info.java deleted file mode 100644 index 2ec8031f..00000000 --- a/src_eclipseagent/java/lombok/eclipse/package-info.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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. - */ - -/** - * Workaround package to avoid the OSGi class loader system, which will always refer to the system class loader for any classes in a package - * that starts with <code>java.</code> - */ -package java.lombok.eclipse; diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipseASTConverterTransformer.java b/src_eclipseagent/lombok/eclipse/agent/EclipseASTConverterTransformer.java deleted file mode 100644 index 4245e246..00000000 --- a/src_eclipseagent/lombok/eclipse/agent/EclipseASTConverterTransformer.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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.eclipse.agent; - -import org.mangosdk.spi.ProviderFor; -import org.objectweb.asm.ClassAdapter; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.MethodAdapter; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - -/** - * Transforms Eclipse's <code>org.eclipse.jdt.core.dom.ASTConverter</code> class, which sometimes rescans bits and pieces - * of source files because Eclipse's own AST doesn't actually have enough information for eclipse (why they don't just fix - * the AST tree generator is beyond me). At any rate, for catch blocks generated by lombok, eclipse tries to rescan the - * source file to find the source position of the catch statement, which will of course fail as there's nothing there. - * We will fix the code to return the original starting position, which is a pretty good simile, instead of '-1', which - * screws up all sorts of things. - * - * Transformations applied:<ul> - * <li>The <code>retrieveStartingCatchPosition(int, int)</code> method is instrumented to return its first parameter - * instead of the constant -1.</li></ul> - */ -@ProviderFor(EclipseTransformer.class) -public class EclipseASTConverterTransformer implements EclipseTransformer { - public byte[] transform(byte[] classfileBuffer) { - ClassReader reader = new ClassReader(classfileBuffer); - ClassWriter writer = new ClassWriter(reader, 0); - - ClassAdapter adapter = new ASTConverterPatcherAdapter(writer); - reader.accept(adapter, 0); - return writer.toByteArray(); - } - - private static class ASTConverterPatcherAdapter extends ClassAdapter { - public ASTConverterPatcherAdapter(ClassVisitor cv) { - super(cv); - } - - @Override public MethodVisitor visitMethod(int access, String name, String desc, - String signature, String[] exceptions) { - MethodVisitor writerVisitor = super.visitMethod(access, name, desc, signature, exceptions); - if ( !name.equals("retrieveStartingCatchPosition") ) return writerVisitor; - - return new RetrieveStartingCatchPositionPatcher(writerVisitor); - } - } - - static class RetrieveStartingCatchPositionPatcher extends MethodAdapter { - RetrieveStartingCatchPositionPatcher(MethodVisitor mv) { - super(mv); - } - - int count = 0; - @Override public void visitInsn(int opcode) { - if ( opcode == Opcodes.IRETURN ) { - if ( count++ == 0 ) { - super.visitInsn(opcode); - return; - } - //replaces: "return -1" with "return [firstParam]"; - super.visitInsn(Opcodes.POP); - super.visitVarInsn(Opcodes.ILOAD, 1); - super.visitInsn(Opcodes.IRETURN); - } else { - super.visitInsn(opcode); - } - } - } - - @Override public String getTargetClassName() { - return "org/eclipse/jdt/core/dom/ASTConverter"; - } -} diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipseASTNodeTransformer.java b/src_eclipseagent/lombok/eclipse/agent/EclipseASTNodeTransformer.java deleted file mode 100644 index e27aa08c..00000000 --- a/src_eclipseagent/lombok/eclipse/agent/EclipseASTNodeTransformer.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * 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.eclipse.agent; - -import org.mangosdk.spi.ProviderFor; -import org.objectweb.asm.ClassAdapter; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.Opcodes; - -/** - * Transforms Eclipse's {@code org.eclipse.jdt.internal.compiler.ast.ASTNode} class, - * which is the super-class of all AST Node class for Eclipse. - * - * Transformations applied:<ul> - * <li>A field is added: 'public transient ASTNode $generatedBy = null;'. It is set to something other than {@code null} if - * this node is generated; the reference then points at the node that is responsible for its generation (example: a {@code @Data} annotation).</li></ul> - */ -@ProviderFor(EclipseTransformer.class) -public class EclipseASTNodeTransformer implements EclipseTransformer { - private static final String ASTNODE = "org/eclipse/jdt/internal/compiler/ast/ASTNode"; - - public byte[] transform(byte[] classfileBuffer) { - ClassReader reader = new ClassReader(classfileBuffer); - ClassWriter writer = new ClassWriter(reader, 0); - - ClassAdapter adapter = new ASTNodePatcherAdapter(writer); - reader.accept(adapter, 0); - return writer.toByteArray(); - } - - private static class ASTNodePatcherAdapter extends ClassAdapter { - ASTNodePatcherAdapter(ClassVisitor cv) { - super(cv); - } - - @Override public void visitEnd() { - FieldVisitor fv = cv.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_TRANSIENT, "$generatedBy", "L" + ASTNODE + ";", null, null); - fv.visitEnd(); - cv.visitEnd(); - } - } - - @Override public String getTargetClassName() { - return ASTNODE; - } -} diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipseCUDTransformer.java b/src_eclipseagent/lombok/eclipse/agent/EclipseCUDTransformer.java deleted file mode 100644 index b18a1ff1..00000000 --- a/src_eclipseagent/lombok/eclipse/agent/EclipseCUDTransformer.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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.eclipse.agent; - -import org.mangosdk.spi.ProviderFor; -import org.objectweb.asm.ClassAdapter; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.Opcodes; - -/** - * Transforms Eclipse's <code>org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration</code> class, - * which is the top-level AST Node class for Eclipse. - * - * Transformations applied:<ul> - * <li>A field is added: 'public transient Object $lombokAST = null;'. We use it to cache our own AST object, - * usually of type <code>lombok.eclipse.EclipseAST.</code></li></ul> - */ -@ProviderFor(EclipseTransformer.class) -public class EclipseCUDTransformer implements EclipseTransformer { - public byte[] transform(byte[] classfileBuffer) { - ClassReader reader = new ClassReader(classfileBuffer); - ClassWriter writer = new ClassWriter(reader, 0); - - ClassAdapter adapter = new CUDPatcherAdapter(writer); - reader.accept(adapter, 0); - return writer.toByteArray(); - } - - private static class CUDPatcherAdapter extends ClassAdapter { - CUDPatcherAdapter(ClassVisitor cv) { - super(cv); - } - - @Override public void visitEnd() { - FieldVisitor fv = cv.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_TRANSIENT, "$lombokAST", "Ljava/lang/Object;", null, null); - fv.visitEnd(); - cv.visitEnd(); - } - } - - @Override public String getTargetClassName() { - return "org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration"; - } -} diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipseLinkedNodeFinderTransformer.java b/src_eclipseagent/lombok/eclipse/agent/EclipseLinkedNodeFinderTransformer.java deleted file mode 100644 index 9a1ebbb2..00000000 --- a/src_eclipseagent/lombok/eclipse/agent/EclipseLinkedNodeFinderTransformer.java +++ /dev/null @@ -1,169 +0,0 @@ -package lombok.eclipse.agent; - -import org.mangosdk.spi.ProviderFor; -import org.objectweb.asm.ClassAdapter; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Label; -import org.objectweb.asm.MethodVisitor; -import static org.objectweb.asm.Opcodes.*; - -@ProviderFor(EclipseTransformer.class) -public class EclipseLinkedNodeFinderTransformer implements EclipseTransformer { - private static final String LINKED_NODE_FINDER = "org/eclipse/jdt/core/internal/corext/dom/LinkedNodeFinder"; - - @Override public String getTargetClassName() { - return LINKED_NODE_FINDER; - } - - @Override public byte[] transform(byte[] in) { - ClassReader reader = new ClassReader(in); - ClassWriter writer = new ClassWriter(reader, 0); - - ClassAdapter adapter = new LinkedNodeFinderPatcherAdapter(writer); - reader.accept(adapter, 0); - return writer.toByteArray(); - } - - private static class LinkedNodeFinderPatcherAdapter extends ClassAdapter { - private int originalAccess; - private String originalDesc; - private String originalSignature; - private String[] originalExceptions; - - LinkedNodeFinderPatcherAdapter(ClassVisitor cv) { - super(cv); - } - - @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - if ( !name.equals("findByNode") ) return super.visitMethod(access, name, desc, signature, exceptions); - - originalAccess = access; - originalDesc = desc; - originalSignature = signature; - originalExceptions = exceptions; - - return super.visitMethod(0, "findByNode0", desc, signature, exceptions); - } - - private static final String SIMPLENAME = "org/eclipse/jdt/core/dom/SimpleName"; - private static final String SIMPLENAME_ARRAY = "[L" + SIMPLENAME + ";"; - private static final String ASTNODE = "Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;"; - - /* - * code generated by running ASMifier on: - * - public SimpleName[] findByNode(ASTNode a, SimpleName b) { - SimpleName[] ps = this.findByNode0(a, b); - int count = 0; - for (int i = 0; i < ps.length; i++) { - if ( ps[i] == null || ps[i].$generatedBy == null ) count++; - } - if (count == ps.length) return ps; - SimpleName[] newPs = new SimpleName[count]; - count = 0; - for (int i = 0; i < ps.length; i++) { - if ( ps[i] == null || ps[i].p == null ) newPs[count++] = ps[i]; - } - return newPs; - } - */ - @Override public void visitEnd() { - MethodVisitor mv = super.visitMethod(originalAccess, "findByNode", originalDesc, originalSignature, originalExceptions); - mv.visitCode(); - mv.visitCode(); - mv.visitVarInsn(ALOAD, 0); - mv.visitVarInsn(ALOAD, 1); - mv.visitVarInsn(ALOAD, 2); - mv.visitMethodInsn(INVOKESPECIAL, LINKED_NODE_FINDER, "findByNode0", originalDesc); - mv.visitVarInsn(ASTORE, 3); - mv.visitInsn(ICONST_0); - mv.visitVarInsn(ISTORE, 4); - mv.visitInsn(ICONST_0); - mv.visitVarInsn(ISTORE, 5); - Label l0 = new Label(); - mv.visitLabel(l0); - mv.visitFrame(F_APPEND,3, new Object[] {SIMPLENAME_ARRAY, INTEGER, INTEGER}, 0, null); - mv.visitVarInsn(ILOAD, 5); - mv.visitVarInsn(ALOAD, 3); - mv.visitInsn(ARRAYLENGTH); - Label l1 = new Label(); - mv.visitJumpInsn(IF_ICMPGE, l1); - mv.visitVarInsn(ALOAD, 3); - mv.visitVarInsn(ILOAD, 5); - mv.visitInsn(AALOAD); - Label l2 = new Label(); - mv.visitJumpInsn(IFNULL, l2); - mv.visitVarInsn(ALOAD, 3); - mv.visitVarInsn(ILOAD, 5); - mv.visitInsn(AALOAD); - mv.visitFieldInsn(GETFIELD, SIMPLENAME, "$generatedBy", ASTNODE); - Label l3 = new Label(); - mv.visitJumpInsn(IFNONNULL, l3); - mv.visitLabel(l2); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitIincInsn(4, 1); - mv.visitLabel(l3); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitIincInsn(5, 1); - mv.visitJumpInsn(GOTO, l0); - mv.visitLabel(l1); - mv.visitFrame(F_CHOP,1, null, 0, null); - mv.visitVarInsn(ILOAD, 4); - mv.visitVarInsn(ALOAD, 3); - mv.visitInsn(ARRAYLENGTH); - Label l4 = new Label(); - mv.visitJumpInsn(IF_ICMPNE, l4); - mv.visitVarInsn(ALOAD, 3); - mv.visitInsn(ARETURN); - mv.visitLabel(l4); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitVarInsn(ILOAD, 4); - mv.visitTypeInsn(ANEWARRAY, SIMPLENAME); - mv.visitVarInsn(ASTORE, 5); - mv.visitInsn(ICONST_0); - mv.visitVarInsn(ISTORE, 4); - mv.visitInsn(ICONST_0); - mv.visitVarInsn(ISTORE, 6); - Label l5 = new Label(); - mv.visitLabel(l5); - mv.visitFrame(F_APPEND,2, new Object[] {SIMPLENAME_ARRAY, INTEGER}, 0, null); - mv.visitVarInsn(ILOAD, 6); - mv.visitVarInsn(ALOAD, 3); - mv.visitInsn(ARRAYLENGTH); - Label l6 = new Label(); - mv.visitJumpInsn(IF_ICMPGE, l6); - mv.visitVarInsn(ALOAD, 3); - mv.visitVarInsn(ILOAD, 6); - mv.visitInsn(AALOAD); - Label l7 = new Label(); - mv.visitJumpInsn(IFNULL, l7); - mv.visitVarInsn(ALOAD, 3); - mv.visitVarInsn(ILOAD, 6); - mv.visitInsn(AALOAD); - mv.visitFieldInsn(GETFIELD, SIMPLENAME, "$generatedBy", ASTNODE); - Label l8 = new Label(); - mv.visitJumpInsn(IFNONNULL, l8); - mv.visitLabel(l7); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitVarInsn(ALOAD, 5); - mv.visitVarInsn(ILOAD, 4); - mv.visitIincInsn(4, 1); - mv.visitVarInsn(ALOAD, 3); - mv.visitVarInsn(ILOAD, 6); - mv.visitInsn(AALOAD); - mv.visitInsn(AASTORE); - mv.visitLabel(l8); - mv.visitFrame(F_SAME, 0, null, 0, null); - mv.visitIincInsn(6, 1); - mv.visitJumpInsn(GOTO, l5); - mv.visitLabel(l6); - mv.visitFrame(F_CHOP,1, null, 0, null); - mv.visitVarInsn(ALOAD, 5); - mv.visitInsn(ARETURN); - mv.visitMaxs(4, 7); - super.visitEnd(); - } - } -} diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipseParserTransformer.java b/src_eclipseagent/lombok/eclipse/agent/EclipseParserTransformer.java deleted file mode 100644 index 38917332..00000000 --- a/src_eclipseagent/lombok/eclipse/agent/EclipseParserTransformer.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * 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.eclipse.agent; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import lombok.Lombok; - -import org.mangosdk.spi.ProviderFor; -import org.objectweb.asm.ClassAdapter; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassVisitor; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.Label; -import org.objectweb.asm.MethodAdapter; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; - -/** - * Transforms Eclipse's <code>org.eclipse.jdt.internal.compiler.parser.Parser</code> class, - * which handles all the actual java source to AST tree conversion in eclipse. - * - * Transformations applied:<ul> - * <li>The <code>CompilationUnitDeclaration endParse(int)</code> method is instrumented to call - * the lombok framework via ClassLoaderWorkaround to TransformEclipseAST with the CompilationUnitDeclaration - * right before it returns the CompilationUnitDeclaration.</li> - * <li>The <code>getMethodBodies(CompilationUnitDeclaration)</code> is similarly instrumented; eclipse uses a - * 2-step parsing system, where the bodies of methods aren't filled in until its actually neccessary. Lombok - * gets a chance to change the AST immediately after either step.</li> - * <li>The <code>parse(MethodDeclaration, CUD)</code>, <code>parse(ConstructorDeclaration, CUD)</code> and - * <code>parse(Initializer, TypeDeclaration, CUD)</code> methods are all instrumented to not attempt to - * complete parsing a method generated by lombok, as the source positions are obviously all wrong - * (the method content isn't in the source file!) - lombok has already filled in the complete AST. - * - * Bit24 on the flags field on all ASTNode objects is used as a marker.</li></ul> - */ -@ProviderFor(EclipseTransformer.class) -public class EclipseParserTransformer implements EclipseTransformer { - private static final String COMPILER_PKG = - "Lorg/eclipse/jdt/internal/compiler/ast/"; - private static final String TARGET_STATIC_CLASS = "java/lombok/eclipse/ClassLoaderWorkaround"; - private static final String TARGET_STATIC_METHOD_NAME = "transformCompilationUnitDeclaration"; - private static final String TARGET_STATIC_METHOD_DESC = "(Ljava/lang/Object;Ljava/lang/Object;)V"; - - private static final Map<String, Class<? extends MethodVisitor>> rewriters; - - static { - Map<String, Class<? extends MethodVisitor>> map = new HashMap<String, Class<? extends MethodVisitor>>(); - map.put(String.format("endParse(I)%sCompilationUnitDeclaration;", COMPILER_PKG), EndParsePatcher.class); - map.put(String.format("getMethodBodies(%sCompilationUnitDeclaration;)V", COMPILER_PKG), GetMethodBodiesPatcher.class); - map.put(String.format("parse(%1$sMethodDeclaration;%1$sCompilationUnitDeclaration;)V", COMPILER_PKG), ParseBlockContainerPatcher.class); - map.put(String.format("parse(%1$sConstructorDeclaration;%1$sCompilationUnitDeclaration;Z)V", COMPILER_PKG), ParseBlockContainerPatcher.class); - map.put(String.format("parse(%1$sInitializer;%1$sTypeDeclaration;%1$sCompilationUnitDeclaration;)V", COMPILER_PKG), ParseBlockContainerPatcher.class); - rewriters = Collections.unmodifiableMap(map); - } - - public byte[] transform(byte[] classfileBuffer) { - ClassReader reader = new ClassReader(classfileBuffer); - ClassWriter writer = new ClassWriter(reader, 0); - - ClassAdapter adapter = new ParserPatcherAdapter(writer); - reader.accept(adapter, 0); - return writer.toByteArray(); - } - - private static class ParserPatcherAdapter extends ClassAdapter { - public ParserPatcherAdapter(ClassVisitor cv) { - super(cv); - } - - @Override public MethodVisitor visitMethod(int access, String name, String desc, - String signature, String[] exceptions) { - MethodVisitor writerVisitor = super.visitMethod(access, name, desc, signature, exceptions); - Class<? extends MethodVisitor> targetVisitorClass = rewriters.get(name+desc); - if ( targetVisitorClass == null ) return writerVisitor; - - try { - Constructor<? extends MethodVisitor> c = targetVisitorClass.getDeclaredConstructor(MethodVisitor.class); - c.setAccessible(true); - return c.newInstance(writerVisitor); - } catch ( InvocationTargetException e ) { - throw Lombok.sneakyThrow(e.getCause()); - } catch ( Exception e ) { - //NoSuchMethodException: We know they exist. - //IllegalAccessException: We called setAccessible. - //InstantiationException: None of these classes are abstract. - throw Lombok.sneakyThrow(e); - } - } - } - - private static final int BIT24 = 0x800000; - - static class GetMethodBodiesPatcher extends MethodAdapter { - GetMethodBodiesPatcher(MethodVisitor mv) { - super(mv); - } - - @Override public void visitInsn(int opcode) { - if ( opcode == Opcodes.RETURN ) { - //injects: ClassLoaderWorkaround.transformCUD(parser, compilationUnitDeclaration); - super.visitVarInsn(Opcodes.ALOAD, 0); - super.visitVarInsn(Opcodes.ALOAD, 1); - super.visitMethodInsn(Opcodes.INVOKESTATIC, TARGET_STATIC_CLASS, - TARGET_STATIC_METHOD_NAME, TARGET_STATIC_METHOD_DESC); - } - super.visitInsn(opcode); - } - } - - static class ParseBlockContainerPatcher extends MethodAdapter { - ParseBlockContainerPatcher(MethodVisitor mv) { - super(mv); - } - - @Override public void visitCode() { - //injects: if ( constructorDeclaration.bits & BIT24 > 0 ) return; - mv.visitVarInsn(Opcodes.ALOAD, 1); - mv.visitFieldInsn(Opcodes.GETFIELD, "org/eclipse/jdt/internal/compiler/ast/ASTNode", "bits", "I"); - mv.visitLdcInsn(Integer.valueOf(BIT24)); - mv.visitInsn(Opcodes.IAND); - Label l0 = new Label(); - mv.visitJumpInsn(Opcodes.IFLE, l0); - mv.visitInsn(Opcodes.RETURN); - mv.visitLabel(l0); - mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null); - super.visitCode(); - } - } - - static class EndParsePatcher extends MethodAdapter { - private static final String TARGET_STATIC_METHOD_NAME = "transformCompilationUnitDeclaration"; - - EndParsePatcher(MethodVisitor mv) { - super(mv); - } - - @Override public void visitInsn(int opcode) { - if ( opcode == Opcodes.ARETURN ) { - //injects: ClassLoaderWorkaround.transformCUD(parser, compilationUnitDeclaration); - super.visitInsn(Opcodes.DUP); - super.visitVarInsn(Opcodes.ALOAD, 0); - super.visitInsn(Opcodes.SWAP); - super.visitMethodInsn(Opcodes.INVOKESTATIC, TARGET_STATIC_CLASS, - TARGET_STATIC_METHOD_NAME, TARGET_STATIC_METHOD_DESC); - } - - super.visitInsn(opcode); - } - } - - @Override public String getTargetClassName() { - return "org/eclipse/jdt/internal/compiler/parser/Parser"; - } -} diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java b/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java index 7659302c..c39a7d4e 100644 --- a/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java +++ b/src_eclipseagent/lombok/eclipse/agent/EclipsePatcher.java @@ -21,24 +21,18 @@ */ package lombok.eclipse.agent; -import java.io.File; -import java.io.IOException; -import java.lang.instrument.ClassFileTransformer; -import java.lang.instrument.IllegalClassFormatException; import java.lang.instrument.Instrumentation; -import java.lang.reflect.InvocationTargetException; -import java.net.URI; -import java.net.URLDecoder; -import java.nio.charset.Charset; -import java.security.ProtectionDomain; -import java.util.HashMap; -import java.util.Map; -import java.util.jar.JarFile; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import java.util.Collection; +import java.util.Collections; +import java.util.List; -import lombok.Lombok; -import lombok.core.SpiLoadUtil; +import lombok.patcher.Hook; +import lombok.patcher.MethodTarget; +import lombok.patcher.ScriptManager; +import lombok.patcher.StackRequest; +import lombok.patcher.TargetMatcher; +import lombok.patcher.equinox.EquinoxClassLoader; +import lombok.patcher.scripts.ScriptBuilder; /** * This is a java-agent that patches some of eclipse's classes so AST Nodes are handed off to Lombok @@ -50,85 +44,127 @@ import lombok.core.SpiLoadUtil; public class EclipsePatcher { private EclipsePatcher() {} - private static Map<String, EclipseTransformer> transformers = new HashMap<String, EclipseTransformer>(); - static { - try { - for ( EclipseTransformer transformer : SpiLoadUtil.findServices(EclipseTransformer.class) ) { - String targetClassName = transformer.getTargetClassName(); - transformers.put(targetClassName, transformer); - } - } catch ( Throwable t ) { - throw Lombok.sneakyThrow(t); - } - } - - private static class Patcher implements ClassFileTransformer { - public byte[] transform(ClassLoader loader, String className, - Class<?> classBeingRedefined, - ProtectionDomain protectionDomain, byte[] classfileBuffer) - throws IllegalClassFormatException { - -// ClassLoader classLoader = Patcher.class.getClassLoader(); -// if ( classLoader == null ) classLoader = ClassLoader.getSystemClassLoader(); - - EclipseTransformer transformer = transformers.get(className); - if ( transformer != null ) return transformer.transform(classfileBuffer); - - return null; - } - } - public static void agentmain(String agentArgs, Instrumentation instrumentation) throws Exception { - registerPatcher(instrumentation, true); - addLombokToSearchPaths(instrumentation); - } - - private static void addLombokToSearchPaths(Instrumentation instrumentation) throws Exception { - String path = findPathOfOurClassloader(); - //On java 1.5, you don't have these methods, so you'll be forced to manually -Xbootclasspath/a them in. - tryCallMethod(instrumentation, "appendToSystemClassLoaderSearch", path + "/lombok.jar"); - tryCallMethod(instrumentation, "appendToBootstrapClassLoaderSearch", path + "/lombok.eclipse.agent.jar"); - } - - private static void tryCallMethod(Object o, String methodName, String path) { - try { - Instrumentation.class.getMethod(methodName, JarFile.class).invoke(o, new JarFile(path)); - } catch ( Throwable ignore ) {} - } - - private static String findPathOfOurClassloader() throws Exception { - URI uri = EclipsePatcher.class.getResource("/" + EclipsePatcher.class.getName().replace('.', '/') + ".class").toURI(); - Pattern p = Pattern.compile("^jar:file:([^\\!]+)\\!.*\\.class$"); - Matcher m = p.matcher(uri.toString()); - if ( !m.matches() ) return "."; - String rawUri = m.group(1); - return new File(URLDecoder.decode(rawUri, Charset.defaultCharset().name())).getParent(); + registerPatchScripts(instrumentation, true); } public static void premain(String agentArgs, Instrumentation instrumentation) throws Exception { - registerPatcher(instrumentation, false); - addLombokToSearchPaths(instrumentation); + registerPatchScripts(instrumentation, false); } - private static void registerPatcher(Instrumentation instrumentation, boolean transformExisting) throws IOException { - instrumentation.addTransformer(new Patcher()/*, true*/); + private static void registerPatchScripts(Instrumentation instrumentation, boolean reloadExistingClasses) { + ScriptManager sm = new ScriptManager(); + sm.registerTransformer(instrumentation); + EquinoxClassLoader.getInstance().addPrefix("lombok."); + EquinoxClassLoader.getInstance().registerScripts(sm); + + sm.addScript(ScriptBuilder.wrapReturnValue() + .target(new MethodTarget("org.eclipse.jdt.core.dom.ASTConverter", "retrieveStartingCatchPosition")) + .wrapMethod(new Hook("lombok/eclipse/agent/PatchFixes", "fixRetrieveStartingCatchPosition", "(I)I")) + .transplant().request(StackRequest.PARAM1).build()); + + sm.addScript(ScriptBuilder.addField() + .targetClass("org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration") + .fieldName("$lombokAST").fieldType("Ljava/lang/Object;") + .setPublic().setTransient().build()); + + final String PARSER_SIG1 = "org.eclipse.jdt.internal.compiler.parser.Parser"; + final String PARSER_SIG2 = "Lorg/eclipse/jdt/internal/compiler/parser/Parser;"; + final String CUD_SIG1 = "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration"; + final String CUD_SIG2 = "Lorg/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration;"; + + sm.addScript(ScriptBuilder.wrapReturnValue() + .target(new MethodTarget(PARSER_SIG1, "getMethodBodies", "void", CUD_SIG1)) + .wrapMethod(new Hook("lombok/eclipse/TransformEclipseAST", "transform", + "(" + PARSER_SIG2 + CUD_SIG2 + ")V")) + .request(StackRequest.THIS, StackRequest.PARAM1).build()); + + sm.addScript(ScriptBuilder.wrapReturnValue() + .target(new MethodTarget(PARSER_SIG1, "endParse", CUD_SIG1, "int")) + .wrapMethod(new Hook("lombok/eclipse/TransformEclipseAST", "transform_swapped", + "(" + CUD_SIG2 + PARSER_SIG2 + ")V")) + .request(StackRequest.THIS, StackRequest.RETURN_VALUE).build()); + + sm.addScript(ScriptBuilder.exitEarly() + .target(new MethodTarget(PARSER_SIG1, "parse", "void", + "org.eclipse.jdt.internal.compiler.ast.MethodDeclaration", + "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration")) + .decisionMethod(new Hook("lombok/eclipse/agent/PatchFixes", "checkBit24", "(Ljava/lang/Object;)Z")) + .transplant().request(StackRequest.PARAM1).build()); + + sm.addScript(ScriptBuilder.exitEarly() + .target(new MethodTarget(PARSER_SIG1, "parse", "void", + "org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration", + "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration", "boolean")) + .decisionMethod(new Hook("lombok/eclipse/agent/PatchFixes", "checkBit24", "(Ljava/lang/Object;)Z")) + .transplant().request(StackRequest.PARAM1).build()); + + sm.addScript(ScriptBuilder.exitEarly() + .target(new MethodTarget(PARSER_SIG1, "parse", "void", + "org.eclipse.jdt.internal.compiler.ast.Initializer", + "org.eclipse.jdt.internal.compiler.ast.TypeDeclaration", + "org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration")) + .decisionMethod(new Hook("lombok/eclipse/agent/PatchFixes", "checkBit24", "(Ljava/lang/Object;)Z")) + .transplant().request(StackRequest.PARAM1).build()); + + sm.addScript(ScriptBuilder.addField() + .targetClass("org.eclipse.jdt.internal.compiler.ast.ASTNode") + .fieldName("$generatedBy") + .fieldType("Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;") + .setPublic().setTransient().build()); + + sm.addScript(ScriptBuilder.addField() + .targetClass("org.eclipse.jdt.core.dom.ASTNode") + .fieldName("$isGenerated").fieldType("Z") + .setPublic().setTransient().build()); + + sm.addScript(ScriptBuilder.wrapReturnValue() + .target(new TargetMatcher() { + @Override public boolean matches(String classSpec, String methodName, String descriptor) { + if (!"convert".equals(methodName)) return false; + + List<String> fullDesc = MethodTarget.decomposeFullDesc(descriptor); + if ("V".equals(fullDesc.get(0))) return false; + if (fullDesc.size() < 2) return false; + if (!fullDesc.get(1).startsWith("Lorg/eclipse/jdt/internal/compiler/ast/")) return false; + return true; + } + + @Override public Collection<String> getAffectedClasses() { + return Collections.singleton("org.eclipse.jdt.core.dom.ASTConverter"); + } + }).request(StackRequest.PARAM1, StackRequest.RETURN_VALUE) + .wrapMethod(new Hook("lombok/eclipse/agent/PatchFixes", "setIsGeneratedFlag", + "(Lorg/eclipse/jdt/core/dom/ASTNode;Lorg/eclipse/jdt/internal/compiler/ast/ASTNode;)V")) + .transplant().build()); + + sm.addScript(ScriptBuilder.wrapMethodCall() + .target(new TargetMatcher() { + @Override public boolean matches(String classSpec, String methodName, String descriptor) { + if (!methodName.startsWith("convert")) return false; + + List<String> fullDesc = MethodTarget.decomposeFullDesc(descriptor); + if (fullDesc.size() < 2) return false; + if (!fullDesc.get(1).startsWith("Lorg/eclipse/jdt/internal/compiler/ast/")) return false; + + return true; + } + + @Override public Collection<String> getAffectedClasses() { + return Collections.singleton("org.eclipse.jdt.core.dom.ASTConverter"); + } + }).methodToWrap(new Hook("org/eclipse/jdt/core/dom/SimpleName", "<init>", "(Lorg/eclipse/jdt/core/dom/AST;)V")) + .requestExtra(StackRequest.PARAM1) + .replacementMethod(new Hook("lombok/eclipse/agent/PatchFixes", "setIsGeneratedFlagForSimpleName", + "(Lorg/eclipse/jdt/core/dom/SimpleName;Ljava/lang/Object;)V")) + .transplant().build()); + + sm.addScript(ScriptBuilder.wrapReturnValue() + .target(new MethodTarget("org.eclipse.jdt.internal.corext.dom.LinkedNodeFinder", "findByNode")) + .wrapMethod(new Hook("lombok/eclipse/agent/PatchFixes", "removeGeneratedSimpleNames", + "([Lorg/eclipse/jdt/core/dom/SimpleName;)[Lorg/eclipse/jdt/core/dom/SimpleName;")) + .request(StackRequest.RETURN_VALUE).build()); - if ( transformExisting ) for ( Class<?> c : instrumentation.getAllLoadedClasses() ) { - if ( transformers.containsKey(c.getName()) ) { - try { - //instrumentation.retransformClasses(c); - //not in java 1.5. - Instrumentation.class.getMethod("retransformClasses", Class[].class).invoke(instrumentation, - new Object[] { new Class[] {c }}); - } catch ( InvocationTargetException e ) { - throw new UnsupportedOperationException( - "The eclipse parser class is already loaded and cannot be modified. " + - "You'll have to restart eclipse in order to use Lombok in eclipse."); - } catch ( Throwable t ) { - throw new UnsupportedOperationException( - "This appears to be a java 1.5 instance, which cannot reload already loaded classes. " + - "You'll have to restart eclipse in order to use Lombok in eclipse."); - } - } - } + if (reloadExistingClasses) sm.reloadClasses(instrumentation); } } diff --git a/src_eclipseagent/lombok/eclipse/agent/EclipseTransformer.java b/src_eclipseagent/lombok/eclipse/agent/EclipseTransformer.java deleted file mode 100644 index 31f8413f..00000000 --- a/src_eclipseagent/lombok/eclipse/agent/EclipseTransformer.java +++ /dev/null @@ -1,8 +0,0 @@ -package lombok.eclipse.agent; - -public interface EclipseTransformer { - /** slash and not dot separated */ - String getTargetClassName(); - - byte[] transform(byte[] in); -} diff --git a/src_eclipseagent/lombok/eclipse/agent/PatchFixes.java b/src_eclipseagent/lombok/eclipse/agent/PatchFixes.java new file mode 100644 index 00000000..1914bba7 --- /dev/null +++ b/src_eclipseagent/lombok/eclipse/agent/PatchFixes.java @@ -0,0 +1,48 @@ +package lombok.eclipse.agent; + +import java.lang.reflect.Field; + +import org.eclipse.jdt.core.dom.SimpleName; + +public class PatchFixes { + public static int fixRetrieveStartingCatchPosition(int in) { + return in; + } + + private static final int BIT24 = 0x800000; + + public static boolean checkBit24(Object node) throws Exception { + int bits = (Integer)(node.getClass().getField("bits").get(node)); + return (bits & BIT24) != 0; + } + + public static void setIsGeneratedFlag(org.eclipse.jdt.core.dom.ASTNode domNode, + org.eclipse.jdt.internal.compiler.ast.ASTNode internalNode) throws Exception { + boolean isGenerated = internalNode.getClass().getField("$generatedBy").get(internalNode) != null; + if (isGenerated) domNode.getClass().getField("$isGenerated").set(domNode, true); + } + + public static void setIsGeneratedFlagForSimpleName(SimpleName name, Object internalNode) throws Exception { + if (internalNode instanceof org.eclipse.jdt.internal.compiler.ast.ASTNode) { + if (internalNode.getClass().getField("$generatedBy").get(internalNode) != null) { + name.getClass().getField("$isGenerated").set(name, true); + } + } + } + + public static SimpleName[] removeGeneratedSimpleNames(SimpleName[] in) throws Exception { + Field f = SimpleName.class.getField("$isGenerated"); + + int count = 0; + for (int i = 0; i < in.length; i++) { + if ( in[i] == null || !((Boolean)f.get(in[i])).booleanValue() ) count++; + } + if (count == in.length) return in; + SimpleName[] newSimpleNames = new SimpleName[count]; + count = 0; + for (int i = 0; i < in.length; i++) { + if ( in[i] == null || !((Boolean)f.get(in[i])).booleanValue() ) newSimpleNames[count++] = in[i]; + } + return newSimpleNames; + } +} diff --git a/website/publish b/website/publish deleted file mode 100755 index 412c71f6..00000000 --- a/website/publish +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -if [ ! -e src/lombok/core/Version.java ]; then - echo Run this script from the lombok project home directory. - exit -fi - -if [ ! -e dist/website.tar.bz2 ]; then - echo There is no dist/website.tar.bz2 file! Run: - echo ant website - echo then restart this script - exit -fi - -mkdir -p build/temp || exit -cd build/temp || exit -git clone -l -n ../.. websitegit || exit -cd websitegit || exit -BRANCHOK="foo" -git branch gh-pages origin/gh-pages || BRANCHOK="bar" -if [ $BRANCHOK == "bar" ]; then -echo If you get error fatal: Not a valid object name: origin/gh-pages. -echo then run: git branch gh-pages origin/gh-pages -echo first before running this script - exit -fi -git checkout gh-pages || exit -rm -r * || exit -tar xfj ../../../dist/website.tar.bz2 || exit -git add . || exit -git commit -a -m website || exit -git push origin gh-pages || exit -cd .. || exit -rm -rf websitegit || exit - -echo Your gh-pages branch has been updated. Do not forget to run: -echo git push origin gh-pages |