From d8d47c687d7ec22e481cf10782f1f889485c39fa Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Mon, 15 Aug 2011 22:11:25 +0200 Subject: Integrated Philipp's proof-of-concept delombok in javac7 fix, and used some creative stubbing to ensure both the javac7 and the javac6 source file can be loaded in the same project in eclipse without dependency warnings. --- .../com/sun/tools/javac/file/BaseFileObject.java | 41 ---------- .../com/sun/tools/javac/file/JavacFileManager.java | 41 ---------- src/delombok/lombok/delombok/DelombokApp.java | 2 +- .../lombok/delombok/PrettyCommentsPrinter.java | 4 +- .../java6/CommentCollectingScannerFactory.java | 4 + .../delombok/java7/CommentCollectingScanner.java | 95 ++++++++++++++++++++++ .../java7/CommentCollectingScannerFactory.java | 66 +++++++++++++++ src/stubs/ABOUT | 1 + .../com/sun/tools/javac/file/BaseFileObject.java | 10 +++ .../com/sun/tools/javac/file/JavacFileManager.java | 6 ++ src/stubs/com/sun/tools/javac/parser/Scanner.java | 62 ++++++++++++++ .../com/sun/tools/javac/parser/ScannerFactory.java | 21 +++++ src/stubs/com/sun/tools/javac/util/Context.java | 31 +++++++ 13 files changed, 299 insertions(+), 85 deletions(-) delete mode 100644 src/contrib/com/sun/tools/javac/file/BaseFileObject.java delete mode 100644 src/contrib/com/sun/tools/javac/file/JavacFileManager.java create mode 100644 src/delombok/lombok/delombok/java7/CommentCollectingScanner.java create mode 100644 src/delombok/lombok/delombok/java7/CommentCollectingScannerFactory.java create mode 100644 src/stubs/ABOUT create mode 100644 src/stubs/com/sun/tools/javac/file/BaseFileObject.java create mode 100644 src/stubs/com/sun/tools/javac/file/JavacFileManager.java create mode 100644 src/stubs/com/sun/tools/javac/parser/Scanner.java create mode 100644 src/stubs/com/sun/tools/javac/parser/ScannerFactory.java create mode 100644 src/stubs/com/sun/tools/javac/util/Context.java (limited to 'src') diff --git a/src/contrib/com/sun/tools/javac/file/BaseFileObject.java b/src/contrib/com/sun/tools/javac/file/BaseFileObject.java deleted file mode 100644 index 2437226a..00000000 --- a/src/contrib/com/sun/tools/javac/file/BaseFileObject.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * The lombok team has removed the implementation - */ -package com.sun.tools.javac.file; - -import javax.tools.JavaFileObject; - -/** - *

This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice. -*/ -public abstract class BaseFileObject implements JavaFileObject { - protected BaseFileObject(JavacFileManager fileManager) {} -} diff --git a/src/contrib/com/sun/tools/javac/file/JavacFileManager.java b/src/contrib/com/sun/tools/javac/file/JavacFileManager.java deleted file mode 100644 index 9d5208c7..00000000 --- a/src/contrib/com/sun/tools/javac/file/JavacFileManager.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * The lombok team has removed the implementation - */ -package com.sun.tools.javac.file; - - -/** - * This class provides access to the source, class and other files - * used by the compiler and related tools. - * - *

This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice. - */ -public class JavacFileManager {} diff --git a/src/delombok/lombok/delombok/DelombokApp.java b/src/delombok/lombok/delombok/DelombokApp.java index e529d0f3..b4c89197 100644 --- a/src/delombok/lombok/delombok/DelombokApp.java +++ b/src/delombok/lombok/delombok/DelombokApp.java @@ -87,7 +87,7 @@ public class DelombokApp implements LombokApp { final JarFile toolsJarFile = new JarFile(toolsJar); ClassLoader loader = new ClassLoader() { - private ClassloadStreamAsClass(String name, boolean resolve, InputStream in) throws ClassNotFoundException { + private Class loadStreamAsClass(String name, boolean resolve, InputStream in) throws ClassNotFoundException { try { try { byte[] b = new byte[65536]; diff --git a/src/delombok/lombok/delombok/PrettyCommentsPrinter.java b/src/delombok/lombok/delombok/PrettyCommentsPrinter.java index d3710bab..fdc9ad5f 100644 --- a/src/delombok/lombok/delombok/PrettyCommentsPrinter.java +++ b/src/delombok/lombok/delombok/PrettyCommentsPrinter.java @@ -663,9 +663,9 @@ public class PrettyCommentsPrinter extends JCTree.Visitor { else print("class " + tree.name); printTypeParameters(tree.typarams); - if (tree.extending != null) { + if (tree.getExtendsClause() != null) { print(" extends "); - printExpr(tree.extending); + printExpr(tree.getExtendsClause()); } if (tree.implementing.nonEmpty()) { print(" implements "); diff --git a/src/delombok/lombok/delombok/java6/CommentCollectingScannerFactory.java b/src/delombok/lombok/delombok/java6/CommentCollectingScannerFactory.java index 80806f57..46d00551 100644 --- a/src/delombok/lombok/delombok/java6/CommentCollectingScannerFactory.java +++ b/src/delombok/lombok/delombok/java6/CommentCollectingScannerFactory.java @@ -36,6 +36,10 @@ public class CommentCollectingScannerFactory extends Scanner.Factory { public CommentCollectingScanner.Factory make() { return new CommentCollectingScannerFactory(context); } + + public CommentCollectingScanner.Factory make(Context c) { + return new CommentCollectingScannerFactory(c); + } }); } diff --git a/src/delombok/lombok/delombok/java7/CommentCollectingScanner.java b/src/delombok/lombok/delombok/java7/CommentCollectingScanner.java new file mode 100644 index 00000000..a6301143 --- /dev/null +++ b/src/delombok/lombok/delombok/java7/CommentCollectingScanner.java @@ -0,0 +1,95 @@ +/* + * Copyright © 2011 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.delombok.java7; + +import java.nio.CharBuffer; + +import lombok.delombok.Comment; +import lombok.delombok.Comment.EndConnection; +import lombok.delombok.Comment.StartConnection; +import lombok.delombok.Delombok.Comments; + +import com.sun.tools.javac.parser.Scanner; + +public class CommentCollectingScanner extends Scanner { + private final Comments comments; + private int endComment = 0; + + public CommentCollectingScanner(CommentCollectingScannerFactory factory, CharBuffer charBuffer, Comments comments) { + super(factory, charBuffer); + this.comments = comments; + } + + public CommentCollectingScanner(CommentCollectingScannerFactory factory, char[] input, int inputLength, Comments comments) { + super(factory, input, inputLength); + this.comments = comments; + } + + @Override + protected void processComment(CommentStyle style) { + int prevEndPos = Math.max(prevEndPos(), endComment); + int pos = pos(); + int endPos = endPos(); + endComment = endPos; + String content = new String(getRawCharacters(pos, endPos)); + StartConnection start = determineStartConnection(prevEndPos, pos); + EndConnection end = determineEndConnection(endPos); + + Comment comment = new Comment(prevEndPos, pos, endPos, content, start, end); + comments.add(comment); + } + + private EndConnection determineEndConnection(int pos) { + boolean first = true; + for (int i = pos;; i++) { + char c = getRawCharacters(i, i + 1)[0]; + if (isNewLine(c)) { + return EndConnection.ON_NEXT_LINE; + } + if (Character.isWhitespace(c)) { + first = false; + continue; + } + return first ? EndConnection.DIRECT_AFTER_COMMENT : EndConnection.AFTER_COMMENT; + } + } + + 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 StartConnection.AFTER_PREVIOUS; + } + + private boolean isNewLine(char c) { + return c == '\n' || c == '\r'; + } +} diff --git a/src/delombok/lombok/delombok/java7/CommentCollectingScannerFactory.java b/src/delombok/lombok/delombok/java7/CommentCollectingScannerFactory.java new file mode 100644 index 00000000..ce6ee71c --- /dev/null +++ b/src/delombok/lombok/delombok/java7/CommentCollectingScannerFactory.java @@ -0,0 +1,66 @@ +/* + * Copyright © 2011 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.delombok.java7; + +import java.nio.CharBuffer; + +import lombok.delombok.Delombok.Comments; + +import com.sun.tools.javac.parser.Scanner; +import com.sun.tools.javac.parser.ScannerFactory; +import com.sun.tools.javac.util.Context; + +public class CommentCollectingScannerFactory extends ScannerFactory { + private final Context context; + + public static void preRegister(final Context context) { + context.put(scannerFactoryKey, new Context.Factory() { + public ScannerFactory make() { + return new CommentCollectingScannerFactory(context); + } + + @Override public ScannerFactory make(Context c) { + return new CommentCollectingScannerFactory(c); + } + }); + } + + /** Create a new scanner factory. */ + protected CommentCollectingScannerFactory(Context context) { + super(context); + this.context = context; + } + + @Override + public Scanner newScanner(CharSequence input, boolean keepDocComments) { + if (input instanceof CharBuffer) { + return new CommentCollectingScanner(this, (CharBuffer)input, context.get(Comments.class)); + } + char[] array = input.toString().toCharArray(); + return newScanner(array, array.length, keepDocComments); + } + + @Override + public Scanner newScanner(char[] input, int inputLength, boolean keepDocComments) { + return new CommentCollectingScanner(this, input, inputLength, context.get(Comments.class)); + } +} diff --git a/src/stubs/ABOUT b/src/stubs/ABOUT new file mode 100644 index 00000000..3479d247 --- /dev/null +++ b/src/stubs/ABOUT @@ -0,0 +1 @@ +These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these. diff --git a/src/stubs/com/sun/tools/javac/file/BaseFileObject.java b/src/stubs/com/sun/tools/javac/file/BaseFileObject.java new file mode 100644 index 00000000..d072fc33 --- /dev/null +++ b/src/stubs/com/sun/tools/javac/file/BaseFileObject.java @@ -0,0 +1,10 @@ +/* + * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these. + */ +package com.sun.tools.javac.file; + +import javax.tools.JavaFileObject; + +public abstract class BaseFileObject implements JavaFileObject { + protected BaseFileObject(JavacFileManager fileManager) {} +} diff --git a/src/stubs/com/sun/tools/javac/file/JavacFileManager.java b/src/stubs/com/sun/tools/javac/file/JavacFileManager.java new file mode 100644 index 00000000..ba5f428a --- /dev/null +++ b/src/stubs/com/sun/tools/javac/file/JavacFileManager.java @@ -0,0 +1,6 @@ +/* + * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these. + */ +package com.sun.tools.javac.file; + +public class JavacFileManager {} diff --git a/src/stubs/com/sun/tools/javac/parser/Scanner.java b/src/stubs/com/sun/tools/javac/parser/Scanner.java new file mode 100644 index 00000000..f6f1d25d --- /dev/null +++ b/src/stubs/com/sun/tools/javac/parser/Scanner.java @@ -0,0 +1,62 @@ +/* + * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these. + */ +package com.sun.tools.javac.parser; + +import java.nio.CharBuffer; + +import com.sun.tools.javac.util.Context; + +public class Scanner { + protected Scanner(Factory fac, CharBuffer buffer) { + } + + protected Scanner(Factory fac, char[] input, int inputLength) { + } + + protected Scanner(ScannerFactory fac, CharBuffer buffer) { + } + + protected Scanner(ScannerFactory fac, char[] input, int inputLength) { + } + + public static class Factory { + public static final Context.Key scannerFactoryKey = null; + + protected Factory(Context context) { + } + + public Scanner newScanner(CharSequence input) { + return null; + } + + public Scanner newScanner(char[] input, int inputLength) { + return null; + } + } + + public enum CommentStyle { + LINE, + BLOCK, + JAVADOC, + } + + protected void processComment(CommentStyle style) { + } + + public int prevEndPos() { + return -1; + } + + public int endPos() { + return -1; + } + + public int pos() { + return -1; + } + + public char[] getRawCharacters(int beginIndex, int endIndex) { + return null; + } +} diff --git a/src/stubs/com/sun/tools/javac/parser/ScannerFactory.java b/src/stubs/com/sun/tools/javac/parser/ScannerFactory.java new file mode 100644 index 00000000..26483db3 --- /dev/null +++ b/src/stubs/com/sun/tools/javac/parser/ScannerFactory.java @@ -0,0 +1,21 @@ +/* + * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these. + */ +package com.sun.tools.javac.parser; + +import com.sun.tools.javac.util.Context; + +public class ScannerFactory { + public static final Context.Key scannerFactoryKey = null; + + protected ScannerFactory(Context c) { + } + + public Scanner newScanner(CharSequence input, boolean keepDocComments) { + return null; + } + + public Scanner newScanner(char[] input, int inputLength, boolean keepDocComments) { + return null; + } +} diff --git a/src/stubs/com/sun/tools/javac/util/Context.java b/src/stubs/com/sun/tools/javac/util/Context.java new file mode 100644 index 00000000..06b8ff4d --- /dev/null +++ b/src/stubs/com/sun/tools/javac/util/Context.java @@ -0,0 +1,31 @@ +/* + * These are stub versions of various bits of javac-internal API (for various different versions of javac). Lombok is compiled against these. + */ +package com.sun.tools.javac.util; + +public class Context { + public static class Key { + } + + public interface Factory { + T make(Context c); + T make(); + } + + public void put(Key key, Factory fac) { + } + + public void put(Key key, T data) { + } + + public void put(Class clazz, T data) { + } + + public T get(Key key) { + return null; + } + + public T get(Class clazz) { + return null; + } +} -- cgit