Merge branch 'master' into netbeans

This commit is contained in:
Reinier Zwitserloot committed 2009-11-29 19:46:47 +01:00
commit 64f47685ca
25 files changed
+258 -81

No files matched your search

+4
View File
@@ -75,6 +75,10 @@ the common tasks and can be called on to run the main aspects of all the sub-scr
</ant>
</target>
<target name="test" depends="compile">
<ant antfile="buildScripts/test.ant.xml" target="test" />
</target>
<target name="findbugs" description="Runs findbugs on the code">
<ant antfile="buildScripts/compile.ant.xml" target="findbugs" inheritAll="false" />
</target>
+79
View File
@@ -0,0 +1,79 @@
<!--
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-test" basedir=".." default="test">
<description>
This buildfile is part of projectlombok.org. It responsible for running unit tests.
</description>
<path id="deps.path">
<fileset dir="deps/lombok">
<include name="**/*.jar" />
<exclude name="**/ant.jar" />
</fileset>
<fileset dir="deps">
<include name="*.jar" />
</fileset>
</path>
<path id="libs.path">
<fileset dir="lib/lombok">
<include name="**/*.jar" />
</fileset>
<fileset dir="lib">
<include name="*.jar" />
</fileset>
</path>
<target name="-test-compile" unless="skipTests">
<mkdir dir="build/tests" />
<javac debug="on" destdir="build/tests" target="1.5">
<classpath refid="deps.path" />
<classpath refid="libs.path" />
<classpath path="build/lombok" />
<src path="test/core/src" />
<src path="test/delombok/src" />
</javac>
<copy todir="build/tests">
<fileset dir="test/lombok/resource" />
<fileset dir="test/delombok/resource" />
</copy>
</target>
<target name="test" depends="-test-compile" unless="tests.skip">
<junit haltonfailure="yes" fork="on">
<formatter type="plain" usefile="false" unless="tests.quiet" />
<classpath refid="deps.path" />
<classpath refid="libs.path" />
<classpath path="build/lombok" />
<classpath path="build/tests" />
<batchtest>
<fileset dir="test/core/src">
<include name="**/Test*.java" />
</fileset>
<fileset dir="test/delombok/src">
<include name="**/Test*.java" />
</fileset>
</batchtest>
</junit>
<echo level="info">All tests successful.</echo>
</target>
</project>
+12 -3
View File
@@ -30,6 +30,7 @@ import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.List;
@@ -52,12 +53,16 @@ public abstract class AST<A extends AST<A, L, N>, L extends LombokNode<A, L, N>,
private L top;
private final String fileName;
private final String packageDeclaration;
private final Collection<String> imports;
Map<N, Void> identityDetector = new IdentityHashMap<N, Void>();
private Map<N, L> nodeMap = new IdentityHashMap<N, L>();
private boolean changed = false;
protected AST(String fileName) {
protected AST(String fileName, String packageDeclaration, Collection<String> imports) {
this.fileName = fileName == null ? "(unknown).java" : fileName;
this.packageDeclaration = packageDeclaration;
this.imports = Collections.unmodifiableCollection(new ArrayList<String>(imports));
}
protected void setChanged() {
@@ -82,14 +87,18 @@ public abstract class AST<A extends AST<A, L, N>, L extends LombokNode<A, L, N>,
*
* Example: "java.util".
*/
public abstract String getPackageDeclaration();
public final String getPackageDeclaration() {
return packageDeclaration;
}
/**
* Return the contents of each non-static import statement on this AST's top (Compilation Unit) node.
*
* Example: "java.util.IOException".
*/
public abstract Collection<String> getImportStatements();
public final Collection<String> getImportStatements() {
return imports;
}
/**
* Puts the given node in the map so that javac/Eclipse's own internal AST object can be translated to
+3 -8
View File
@@ -56,30 +56,25 @@ public class EclipseAST extends AST<EclipseAST, EclipseNode, ASTNode> {
* @param ast The compilation unit, which serves as the top level node in the tree to be built.
*/
public EclipseAST(CompilationUnitDeclaration ast) {
super(toFileName(ast));
super(toFileName(ast), packageDeclaration(ast), imports(ast));
this.compilationUnitDeclaration = ast;
setTop(buildCompilationUnit(ast));
this.completeParse = isComplete(ast);
clearChanged();
}
/** {@inheritDoc} */
@Override public String getPackageDeclaration() {
CompilationUnitDeclaration cud = (CompilationUnitDeclaration) top().get();
private static String packageDeclaration(CompilationUnitDeclaration cud) {
ImportReference pkg = cud.currentPackage;
return pkg == null ? null : Eclipse.toQualifiedName(pkg.getImportName());
}
/** {@inheritDoc} */
@Override public Collection<String> getImportStatements() {
private static Collection<String> imports(CompilationUnitDeclaration cud) {
List<String> imports = new ArrayList<String>();
CompilationUnitDeclaration cud = (CompilationUnitDeclaration) top().get();
if (cud.imports == null) return imports;
for (ImportReference imp : cud.imports) {
if (imp == null) continue;
imports.add(Eclipse.toQualifiedName(imp.getImportName()));
}
return imports;
}
+12 -13
View File
@@ -71,7 +71,7 @@ public class JavacAST extends AST<JavacAST, JavacNode, JCTree> {
* @param top The compilation unit, which serves as the top level node in the tree to be built.
*/
public JavacAST(Messager messager, Context context, JCCompilationUnit top) {
super(top.sourcefile == null ? null : top.sourcefile.toString());
super(sourceName(top), packageDeclaration(top), imports(top));
setTop(buildCompilationUnit(top));
this.context = context;
this.messager = messager;
@@ -81,30 +81,29 @@ public class JavacAST extends AST<JavacAST, JavacNode, JCTree> {
this.symtab = Symtab.instance(context);
clearChanged();
}
public Context getContext() {
return context;
private static String sourceName(JCCompilationUnit cu) {
return cu.sourcefile == null ? null : cu.sourcefile.toString();
}
/** {@inheritDoc} */
@Override public String getPackageDeclaration() {
JCCompilationUnit unit = (JCCompilationUnit)top().get();
return unit.pid instanceof JCFieldAccess ? unit.pid.toString() : null;
private static String packageDeclaration(JCCompilationUnit cu) {
return cu.pid instanceof JCFieldAccess ? cu.pid.toString() : null;
}
/** {@inheritDoc} */
@Override public Collection<String> getImportStatements() {
private static Collection<String> imports(JCCompilationUnit cu) {
List<String> imports = new ArrayList<String>();
JCCompilationUnit unit = (JCCompilationUnit)top().get();
for (JCTree def : unit.defs) {
for (JCTree def : cu.defs) {
if (def instanceof JCImport) {
imports.add(((JCImport)def).qualid.toString());
}
}
return imports;
}
public Context getContext() {
return context;
}
/**
* Runs through the entire AST, starting at the compilation unit, calling the provided visitor's visit methods
* for each node, depth first.
@@ -87,7 +87,7 @@ public class HandleSynchronized implements JavacAnnotationHandler<Synchronized>
JCNewArray newObjectArray = maker.NewArray(chainDots(maker, methodNode, "java", "lang", "Object"),
List.<JCExpression>of(maker.Literal(TypeTags.INT, 0)), null);
JCVariableDecl fieldDecl = maker.VarDef(
maker.Modifiers(Flags.FINAL | (isStatic ? Flags.STATIC : 0)),
maker.Modifiers(Flags.PRIVATE | Flags.FINAL | (isStatic ? Flags.STATIC : 0)),
methodNode.toName(lockName), objectType, newObjectArray);
injectField(methodNode.up(), fieldDecl);
}
+13 -7
View File
@@ -22,22 +22,28 @@
package lombok.delombok;
public final class Comment {
public enum StartConnection {
START_OF_LINE,
ON_NEXT_LINE,
DIRECT_AFTER_PREVIOUS,
AFTER_PREVIOUS
}
final int pos;
final int prevEndPos;
final String content;
final int endPos;
final boolean newLine;
final StartConnection start;
final boolean newLineAfter;
public Comment(int prevEndPos, int pos, int endPos, String content, boolean newLine) {
public Comment(int prevEndPos, int pos, int endPos, String content, StartConnection start, boolean newLineAfter) {
this.pos = pos;
this.prevEndPos = prevEndPos;
this.endPos = endPos;
this.content = content;
this.newLine = newLine;
}
public boolean isConnected() {
return !newLine && prevEndPos == pos;
this.start = start;
this.newLineAfter = newLineAfter;
}
public String summary() {
@@ -23,6 +23,7 @@ package lombok.delombok;
import java.nio.CharBuffer;
import lombok.delombok.Comment.StartConnection;
import lombok.delombok.CommentPreservingParser.Comments;
import com.sun.tools.javac.parser.Scanner;
@@ -79,17 +80,32 @@ public class CommentCollectingScanner extends Scanner {
protected void processComment(CommentStyle style) {
int prevEndPos = prevEndPos();
int pos = pos();
boolean newLine = containsNewLine(prevEndPos, pos);
String content = new String(getRawCharacters(pos, endPos()));
comments.add(prevEndPos, pos, endPos(), content, newLine);
int endPos = endPos();
String content = new String(getRawCharacters(pos, endPos));
boolean lineBreakAfter = isNewLine(getRawCharacters(endPos, endPos + 1)[0]);
StartConnection start = determineStartConnection(prevEndPos, pos);
Comment comment = new Comment(prevEndPos, pos, endPos, content, start, lineBreakAfter);
comments.add(comment);
}
private boolean containsNewLine(int from, int to) {
for (char c : getRawCharacters(from, to)) {
if (c == '\n' || c == '\r') {
return true;
private StartConnection determineStartConnection(int from, int to) {
if (from == to) {
return StartConnection.DIRECT_AFTER_PREVIOUS;
}
char[] between = getRawCharacters(from, to);
if (isNewLine(between[between.length - 1])) {
return StartConnection.START_OF_LINE;
}
for (char c : between) {
if (isNewLine(c)) {
return StartConnection.ON_NEXT_LINE;
}
}
return false;
return StartConnection.AFTER_PREVIOUS;
}
private boolean isNewLine(char c) {
return c == '\n' || c == '\r';
}
}
@@ -101,8 +101,8 @@ public class CommentPreservingParser {
static class Comments {
List<Comment> comments = List.nil();
void add(int prevEndPos, int pos, int endPos, String content, boolean newLine) {
comments = comments.append(new Comment(prevEndPos, pos, endPos, content, newLine));
void add(Comment comment) {
comments = comments.append(comment);
}
}
@@ -38,6 +38,8 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
import lombok.delombok.Comment.StartConnection;
import com.sun.source.tree.Tree;
import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.code.Symbol;
@@ -154,6 +156,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
private List<Comment> comments;
private final JCCompilationUnit cu;
private boolean newLine = true;
private boolean indent = false;
private boolean inParams = false;
public PrettyCommentsPrinter(Writer out, JCCompilationUnit cu, List<Comment> comments) {
@@ -168,13 +171,16 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
private void consumeComments(int till) throws IOException {
boolean shouldIndent = !newLine;
while (comments.nonEmpty() && comments.head.pos < till) {
if (newLine) {
align();
}
print(comments.head.content);
println();
boolean found = false;
Comment head = comments.head;
while (comments.nonEmpty() && head.pos < till) {
found = true;
printComment(head);
comments = comments.tail;
head = comments.head;
}
if (found && !newLine && !indent) {
print(" ");
}
if (newLine && shouldIndent) {
align();
@@ -186,18 +192,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
Comment head = comments.head;
while (comments.nonEmpty() && head.prevEndPos == from) {
from = head.endPos;
if (!head.isConnected()) {
if (head.newLine) {
if (!newLine) {
println();
align();
}
}
else {
print(" ");
}
}
print(head.content);
printComment(head);
comments = comments.tail;
head = comments.head;
}
@@ -206,6 +201,39 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
}
}
private void printComment(Comment comment) throws IOException {
prepareComment(comment.start);
print(comment.content);
if (comment.newLineAfter) {
println();
}
}
private void prepareComment(StartConnection start) throws IOException {
switch (start) {
case DIRECT_AFTER_PREVIOUS:
break;
case AFTER_PREVIOUS:
if (!newLine && !indent) {
print(" ");
}
break;
case START_OF_LINE:
if (!newLine) {
println();
}
break;
case ON_NEXT_LINE:
if (!newLine && !indent) {
println();
}
if (!indent) {
align();
}
break;
}
}
/** The output stream on which trees are printed.
*/
Writer out;
@@ -227,6 +255,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
*/
void align() throws IOException {
newLine = false;
indent = true;
for (int i = 0; i < lmargin; i++) out.write("\t");
}
@@ -264,6 +293,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
*/
public void print(Object s) throws IOException {
newLine = false;
indent = false;
out.write(Convert.escapeUnicode(s.toString()));
}
@@ -271,6 +301,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
*/
public void println() throws IOException {
newLine = true;
indent = false;
out.write(lineSep);
}
@@ -306,7 +337,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor {
tree.accept(this);
int endPos = endPos(tree);
consumeTrailingComments(endPos);
consumeComments(endPos);
// consumeComments(endPos);
}
} catch (UncheckedIOException ex) {
IOException e = new IOException(ex.getMessage());
+1 -1
View File
@@ -82,7 +82,7 @@ public class DirectoryRunner extends Runner {
if (mustIgnore(file)) {
return false;
}
TestViaDelombok.compareFile(afterDirectory, file);
RunTestsViaDelombok.compareFile(afterDirectory, file);
return true;
}
@@ -33,7 +33,7 @@ import java.util.List;
import lombok.delombok.Delombok;
public class TestViaDelombok {
public class RunTestsViaDelombok {
private static Delombok delombok = new Delombok();
private static volatile boolean printErrors = false;
+1 -2
View File
@@ -1,7 +1,6 @@
import java.util.*;
public class Cast {
public void test(List<?> list) {
RandomAccess r = (/*before*/
RandomAccess /*after*/)list;
RandomAccess r = (/*before*/ RandomAccess /*after*/)list;
}
}
@@ -1,4 +1,5 @@
// Cool Comments
public class WithComments {
// Also inside the body
// On start of line
}
@@ -1,4 +1,5 @@
// Cool Comments
public class WithComments {
// Also inside the body
// On start of line
}
@@ -24,7 +24,7 @@ package lombok.delombok;
import java.io.File;
import lombok.DirectoryRunner;
import lombok.TestViaDelombok;
import lombok.RunTestsViaDelombok;
import org.junit.runner.RunWith;
@@ -32,7 +32,7 @@ import org.junit.runner.RunWith;
public class TestLombokFiles {
public static File getBeforeDirectory() {
TestViaDelombok.printErrors(true);
RunTestsViaDelombok.printErrors(true);
return new File("test/lombok/resource/before");
}
+1 -1
View File
@@ -1,5 +1,5 @@
import java.io.*;
class Cleanup {
class CleanupPlain {
void test() throws Exception {
InputStream in = new FileInputStream("in");
try {
@@ -1,13 +1,9 @@
/* cmt */
/* cmt2 */
/* cmt3 */
/*bla */
/* cmt *//* cmt2 */ /* cmt3 */ /*bla */
public class CommentsInterspersed {
/** javadoc for field */
private int x;
/* bla2 */
private String test = "foo"; //$NON-NLS-1$
/* bla2 */ private String test = "foo"; //$NON-NLS-1$
/** Javadoc on method */
public native void gwtTest(); /*-{
+1 -1
View File
@@ -1,4 +1,4 @@
class Getter {
class GetterPlain {
int i;
int foo;
public int getI() {
+1 -1
View File
@@ -1,4 +1,4 @@
class Setter {
class SetterPlain {
int i;
int foo;
public void setI(final int i) {
@@ -0,0 +1,26 @@
class SynchronizedPlain1 {
void test() {
synchronized ($lock) {
System.out.println("one");
}
}
void test2() {
synchronized ($lock) {
System.out.println("two");
}
}
private final java.lang.Object $lock = new java.lang.Object[0];
}
class SynchronizedPlain2 {
static void test() {
synchronized ($LOCK) {
System.out.println("three");
}
}
static void test2() {
synchronized ($LOCK) {
System.out.println("four");
}
}
private static final java.lang.Object $LOCK = new java.lang.Object[0];
}
@@ -1,7 +1,6 @@
//ignore
import lombok.Cleanup;
import java.io.*;
class Cleanup {
class CleanupPlain {
void test() throws Exception {
@lombok.Cleanup InputStream in = new FileInputStream("in");
@Cleanup OutputStream out = new FileOutputStream("out");
+1 -1
View File
@@ -1,5 +1,5 @@
import lombok.Getter;
class Getter {
class GetterPlain {
@lombok.Getter int i;
@Getter int foo;
}
+1 -2
View File
@@ -1,6 +1,5 @@
//ignore
import lombok.Setter;
class Setter {
class SetterPlain {
@lombok.Setter int i;
@Setter int foo;
}
@@ -0,0 +1,17 @@
import lombok.Synchronized;
class SynchronizedPlain1 {
@lombok.Synchronized void test() {
System.out.println("one");
}
@Synchronized void test2() {
System.out.println("two");
}
}
class SynchronizedPlain2 {
@lombok.Synchronized static void test() {
System.out.println("three");
}
@Synchronized static void test2() {
System.out.println("four");
}
}