Merge pull request #1 from rzwitserloot/master

merge from the main repo
This commit is contained in:
bulgakovalexander authored and GitHub committed 2016-10-20 16:47:35 +03:00
commit 4d9da60f4f
15 files changed
+323 -26

No files matched your search

+1
View File
@@ -1,5 +1,6 @@
Lombok contributors in alphabetical order:
Bulgakov Alexander <buls@yandex.ru>
Christian Sterzl <christian.sterzl@gmail.com>
DaveLaw <project.lombok@apconsult.de>
Dawid Rusin <dawidrusin90@gmail.com>
+3 -1
View File
@@ -3,7 +3,9 @@ Lombok Changelog
### v1.16.11 "Edgy Guinea Pig"
* v1.16.10 is the latest release
* BUGFIX: delombok: for-loops with initializers that are not local variables would be generated incorrectly [Issue 1076](https://github.com/rzwitserloot/lombok/issues/1076)
* BUGFIX: `val` in lambda expressions now work as expected [Issue #911](https://github.com/rzwitserloot/lombok/issues/911)
* PLATFORM: Red Hat JBoss Developer Studio is now correctly identified by the installer [Issue #1164](https://github.com/rzwitserloot/lombok/issues/1164)
* BUGFIX: delombok: for-loops with initializers that are not local variables would be generated incorrectly [Issue #1076](https://github.com/rzwitserloot/lombok/issues/1076)
### v1.16.10 (July 15th, 2016)
* FEATURE: Added support for JBoss logger [Issue #1103](https://github.com/rzwitserloot/lombok/issues/1103)
+17 -15
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2009-2013 The Project Lombok Authors.
* Copyright (C) 2009-2016 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -21,7 +21,7 @@
*/
package lombok.core;
import static lombok.Lombok.*;
import static lombok.Lombok.sneakyThrow;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
@@ -31,10 +31,11 @@ import java.lang.reflect.Type;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import lombok.core.configuration.ConfigurationKey;
import lombok.core.debug.HistogramTracker;
@@ -61,12 +62,18 @@ public abstract class AST<A extends AST<A, L, N>, L extends LombokNode<A, L, N>,
Map<N, N> identityDetector = new IdentityHashMap<N, N>();
private Map<N, L> nodeMap = new IdentityHashMap<N, L>();
private boolean changed = false;
// The supertypes which are considered AST Node children. Usually, the Statement, and the Expression,
// though some platforms (such as Eclipse) group these under one common supertype.
private final Collection<Class<? extends N>> statementTypes;
private static final HistogramTracker configTracker = System.getProperty("lombok.timeConfig") == null ? null : new HistogramTracker("lombok.config");
protected AST(String fileName, String packageDeclaration, ImportList imports) {
protected AST(String fileName, String packageDeclaration, ImportList imports, Collection<Class<? extends N>> statementTypes) {
this.fileName = fileName == null ? "(unknown).java" : fileName;
this.packageDeclaration = packageDeclaration;
this.imports = imports;
this.statementTypes = statementTypes;
}
/**
@@ -209,11 +216,11 @@ public abstract class AST<A extends AST<A, L, N>, L extends LombokNode<A, L, N>,
}
}
private static Map<Class<?>, Collection<FieldAccess>> fieldsOfASTClasses = new HashMap<Class<?>, Collection<FieldAccess>>();
private static final ConcurrentMap<Class<?>, Collection<FieldAccess>> fieldsOfASTClasses = new ConcurrentHashMap<Class<?>, Collection<FieldAccess>>();
/** Returns FieldAccess objects for the stated class. Each field that contains objects of the kind returned by
* {@link #getStatementTypes()}, either directly or inside of an array or java.util.collection (or array-of-arrays,
* or collection-of-collections, etcetera), is returned.
* or collection-of-collections, et cetera), is returned.
*/
protected Collection<FieldAccess> fieldsOf(Class<?> c) {
Collection<FieldAccess> fields = fieldsOfASTClasses.get(c);
@@ -221,8 +228,8 @@ public abstract class AST<A extends AST<A, L, N>, L extends LombokNode<A, L, N>,
fields = new ArrayList<FieldAccess>();
getFields(c, fields);
fieldsOfASTClasses.put(c, fields);
return fields;
fieldsOfASTClasses.putIfAbsent(c, fields);
return fieldsOfASTClasses.get(c);
}
private void getFields(Class<?> c, Collection<FieldAccess> fields) {
@@ -261,13 +268,8 @@ public abstract class AST<A extends AST<A, L, N>, L extends LombokNode<A, L, N>,
return Object.class;
}
/**
* The supertypes which are considered AST Node children. Usually, the Statement, and the Expression,
* though some platforms (such as Eclipse) group these under one common supertype. */
protected abstract Collection<Class<? extends N>> getStatementTypes();
protected boolean shouldDrill(Class<?> parentType, Class<?> childType, String fieldName) {
for (Class<?> statementType : getStatementTypes()) {
private boolean shouldDrill(Class<?> parentType, Class<?> childType, String fieldName) {
for (Class<?> statementType : statementTypes) {
if (statementType.isAssignableFrom(childType)) return true;
}
+3 -3
View File
@@ -62,7 +62,7 @@ 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), packageDeclaration(ast), new EclipseImportList(ast));
super(toFileName(ast), packageDeclaration(ast), new EclipseImportList(ast), statementTypes());
this.compilationUnitDeclaration = ast;
setTop(buildCompilationUnit(ast));
this.completeParse = isComplete(ast);
@@ -477,9 +477,9 @@ public class EclipseAST extends AST<EclipseAST, EclipseNode, ASTNode> {
return putInMap(new EclipseNode(this, statement, childNodes, Kind.STATEMENT));
}
/** For Eclipse, only Statement counts, as Expression is a subclass of it, even though this isn't
/* For Eclipse, only Statement counts, as Expression is a subclass of it, even though this isn't
* entirely correct according to the JLS spec (only some expressions can be used as statements, not all of them). */
@Override protected Collection<Class<? extends ASTNode>> getStatementTypes() {
private static Collection<Class<? extends ASTNode>> statementTypes() {
return Collections.<Class<? extends ASTNode>>singleton(Statement.class);
}
+35 -7
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2009-2015 The Project Lombok Authors.
* Copyright (C) 2009-2016 The Project Lombok Authors.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -28,6 +28,8 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import javax.annotation.processing.Messager;
import javax.tools.Diagnostic;
@@ -79,7 +81,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(sourceName(top), PackageName.getPackageName(top), new JavacImportList(top));
super(sourceName(top), PackageName.getPackageName(top), new JavacImportList(top), statementTypes());
setTop(buildCompilationUnit(top));
this.context = context;
this.messager = messager;
@@ -315,7 +317,6 @@ public class JavacAST extends AST<JavacAST, JavacNode, JCTree> {
// @Foo int x, y; is handled in javac by putting the same annotation node on 2 JCVariableDecls.
return null;
}
return putInMap(new JavacNode(this, annotation, null, Kind.ANNOTATION));
}
@@ -333,12 +334,40 @@ public class JavacAST extends AST<JavacAST, JavacNode, JCTree> {
if (statement instanceof JCClassDecl) return buildType((JCClassDecl)statement);
if (statement instanceof JCVariableDecl) return buildLocalVar((JCVariableDecl)statement, Kind.LOCAL);
if (statement instanceof JCTry) return buildTry((JCTry) statement);
if (statement.getClass().getSimpleName().equals("JCLambda")) return buildLambda(statement);
if (setAndGetAsHandled(statement)) return null;
return drill(statement);
}
private JavacNode buildLambda(JCTree jcTree) {
return buildStatementOrExpression(getBody(jcTree));
}
private JCTree getBody(JCTree jcTree) {
try {
return (JCTree) getBodyMethod(jcTree.getClass()).invoke(jcTree);
} catch (Exception e) {
throw Javac.sneakyThrow(e);
}
}
private final static ConcurrentMap<Class<?>, Method> getBodyMethods = new ConcurrentHashMap<Class<?>, Method>();
private Method getBodyMethod(Class<?> c) {
Method m = getBodyMethods.get(c);
if (m != null) {
return m;
}
try {
m = c.getMethod("getBody");
} catch (NoSuchMethodException e) {
throw Javac.sneakyThrow(e);
}
getBodyMethods.putIfAbsent(c, m);
return getBodyMethods.get(c);
}
private JavacNode drill(JCTree statement) {
try {
List<JavacNode> childNodes = new ArrayList<JavacNode>();
@@ -354,9 +383,8 @@ public class JavacAST extends AST<JavacAST, JavacNode, JCTree> {
}
}
/** For javac, both JCExpression and JCStatement are considered as valid children types. */
@Override
protected Collection<Class<? extends JCTree>> getStatementTypes() {
/* For javac, both JCExpression and JCStatement are considered as valid children types. */
private static Collection<Class<? extends JCTree>> statementTypes() {
Collection<Class<? extends JCTree>> collection = new ArrayList<Class<? extends JCTree>>(3);
collection.add(JCStatement.class);
collection.add(JCExpression.class);
@@ -0,0 +1,70 @@
/*
* Copyright (C) 2013 The Project Lombok Authors.
*
* 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.installer.eclipse;
import java.util.Arrays;
import java.util.List;
import lombok.installer.CorruptedIdeLocationException;
import lombok.installer.IdeFinder;
import lombok.installer.IdeLocation;
import org.mangosdk.spi.ProviderFor;
/**
* RHDS (Red Hat JBoss Developer Studio) is an eclipse variant.
* Other than different executable names, it's the same as eclipse, as far as lombok support goes.
*/
@ProviderFor(IdeFinder.class)
public class RhdsFinder extends EclipseFinder {
@Override protected IdeLocation createLocation(String guess) throws CorruptedIdeLocationException {
return new RhdsLocationProvider().create0(guess);
}
@Override protected String getDirName() {
return "studio";
}
@Override protected String getMacExecutableName() {
return "devstudio.app";
}
@Override protected String getUnixExecutableName() {
return "devstudio";
}
@Override protected String getWindowsExecutableName() {
return "devstudio.exe";
}
@Override protected List<String> getSourceDirsOnWindows() {
return Arrays.asList("\\", "\\Program Files", "\\Program Files (x86)", System.getProperty("user.home", "."));
}
@Override protected List<String> getSourceDirsOnMac() {
return Arrays.asList("/Applications", System.getProperty("user.home", "."));
}
@Override protected List<String> getSourceDirsOnUnix() {
return Arrays.asList(System.getProperty("user.home", "."));
}
}
@@ -0,0 +1,45 @@
/*
* Copyright (C) 2013 The Project Lombok Authors.
*
* 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.installer.eclipse;
import java.io.File;
import java.net.URL;
import lombok.installer.CorruptedIdeLocationException;
public class RhdsLocation extends EclipseLocation {
public RhdsLocation(String nameOfLocation, File pathToEclipseIni) throws CorruptedIdeLocationException {
super(nameOfLocation, pathToEclipseIni);
}
@Override public URL getIdeIcon() {
return RhdsLocation.class.getResource("rhds.png");
}
@Override protected String getIniFileName() {
return "devstudio.ini";
}
@Override protected String getTypeName() {
return "Red Hat JBoss Developer Studio";
}
}
@@ -0,0 +1,69 @@
/*
* Copyright (C) 2013 The Project Lombok Authors.
*
* 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.installer.eclipse;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import lombok.installer.CorruptedIdeLocationException;
import lombok.installer.IdeLocation;
import lombok.installer.IdeLocationProvider;
import lombok.installer.IdeFinder.OS;
import org.mangosdk.spi.ProviderFor;
@ProviderFor(IdeLocationProvider.class)
public class RhdsLocationProvider extends EclipseLocationProvider {
@Override protected List<String> getEclipseExecutableNames() {
return Arrays.asList("devstudio.app", "devstudio.exe", "devstudioc.exe", "devstudio");
}
@Override protected String getIniName() {
return "devstudio.ini";
}
@Override protected IdeLocation makeLocation(String name, File ini) throws CorruptedIdeLocationException {
return new RhdsLocation(name, ini);
}
@Override protected String getMacAppName() {
return "devstudio.app";
}
@Override protected String getUnixAppName() {
return "devstudio";
}
@Override public Pattern getLocationSelectors(OS os) {
switch (os) {
case MAC_OS_X:
return Pattern.compile("^(devstudio|devstudio\\.ini|devstudio\\.app)$", Pattern.CASE_INSENSITIVE);
case WINDOWS:
return Pattern.compile("^(devstudioc?\\.exe|devstudio\\.ini)$", Pattern.CASE_INSENSITIVE);
default:
case UNIX:
return Pattern.compile("^(devstudio|devstudio\\.ini)$", Pattern.CASE_INSENSITIVE);
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

@@ -0,0 +1,5 @@
public class ValFinal {
public void test() {
final int x = 10;
}
}
@@ -0,0 +1,18 @@
// version 8:
class ValInLambda {
Runnable foo = (Runnable) () -> {
final int i = 1;
};
public void easyLambda() {
Runnable foo = (Runnable) () -> {
final int i = 1;
};
}
public void easyIntersectionLambda() {
Runnable foo = (Runnable) () -> {
final int i = 1;
};
}
}
@@ -0,0 +1,9 @@
import lombok.val;
public class ValFinal {
public ValFinal() {
super();
}
public void test() {
final @val int x = 10;
}
}
@@ -0,0 +1,21 @@
// version 8:
import lombok.val;
class ValInLambda {
Runnable foo = (Runnable) () -> {
final @val int i = 1;
};
ValInLambda() {
super();
}
public void easyLambda() {
Runnable foo = (Runnable) () -> {
final @val int i = 1;
};
}
public void easyIntersectionLambda() {
Runnable foo = (Runnable) () -> {
final @val int i = 1;
};
}
}
@@ -0,0 +1,6 @@
import lombok.val;
public class ValFinal {
public void test() {
final val x = 10;
}
}
@@ -0,0 +1,21 @@
// version 8:
import lombok.val;
class ValInLambda {
Runnable foo = (Runnable) () -> {
val i = 1;
};
public void easyLambda() {
Runnable foo = (Runnable) () -> {
val i = 1;
};
}
public void easyIntersectionLambda() {
Runnable foo = (Runnable) () -> {
val i = 1;
};
}
}