diff options
author | Reinier Zwitserloot <reinier@zwitserloot.com> | 2014-05-08 06:25:38 +0200 |
---|---|---|
committer | Reinier Zwitserloot <reinier@zwitserloot.com> | 2014-05-20 23:43:08 +0200 |
commit | 4996428ea12be7e381d76614e34a15ad1cc6d275 (patch) | |
tree | ca5067b7b8f63eff6adeed83f8ff9339128d8ca7 /src | |
parent | 05ca21b75e5c20e1e731d9141857f346bb3eca9f (diff) | |
download | lombok-4996428ea12be7e381d76614e34a15ad1cc6d275.tar.gz lombok-4996428ea12be7e381d76614e34a15ad1cc6d275.tar.bz2 lombok-4996428ea12be7e381d76614e34a15ad1cc6d275.zip |
@Delegate has moved to lombok.experimental.
Some work on the aliasing system to make that go smoothly.
Diffstat (limited to 'src')
-rw-r--r-- | src/core/lombok/Delegate.java | 18 | ||||
-rw-r--r-- | src/core/lombok/core/LombokInternalAliasing.java | 20 | ||||
-rw-r--r-- | src/core/lombok/eclipse/EclipseImportList.java | 14 | ||||
-rw-r--r-- | src/core/lombok/eclipse/handlers/HandleGetter.java | 2 | ||||
-rw-r--r-- | src/core/lombok/experimental/Delegate.java | 64 | ||||
-rw-r--r-- | src/core/lombok/javac/JavacImportList.java | 19 | ||||
-rw-r--r-- | src/core/lombok/javac/handlers/HandleDelegate.java | 6 | ||||
-rw-r--r-- | src/core/lombok/javac/handlers/HandleGetter.java | 2 |
8 files changed, 108 insertions, 37 deletions
diff --git a/src/core/lombok/Delegate.java b/src/core/lombok/Delegate.java index 534cfb3d..d5b4b48c 100644 --- a/src/core/lombok/Delegate.java +++ b/src/core/lombok/Delegate.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010-2013 The Project Lombok Authors. + * Copyright (C) 2010-2014 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 @@ -27,23 +27,11 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * Put on any field to make lombok generate delegate methods that forward the call to this field. - * - * Example: - * <pre> - * private @Delegate List<String> foo; - * </pre> - * - * will generate for example an {@code boolean add(String)} method, which contains: {@code return foo.add(arg);}, as well as all other methods in {@code List}. - * - * All public instance methods of the field's type, as well as all public instance methods of all the field's type's superfields are delegated, except for all methods - * that exist in {@link Object}, the {@code canEqual(Object)} method, and any methods that appear in types - * that are listed in the {@code excludes} property. - * <p> - * Complete documentation is found at <a href="http://projectlombok.org/features/Delegate.html">the project lombok features page for @Delegate</a>. + * @deprecated Use {@link lombok.experimental.Delegate} instead. */ @Target({ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.SOURCE) +@Deprecated public @interface Delegate { /** * Normally the type of the field is used as delegate type. However, to choose a different type to delegate, you can list one (or more) types here. Note that types with diff --git a/src/core/lombok/core/LombokInternalAliasing.java b/src/core/lombok/core/LombokInternalAliasing.java index 4fd7b29d..8d6794ae 100644 --- a/src/core/lombok/core/LombokInternalAliasing.java +++ b/src/core/lombok/core/LombokInternalAliasing.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Project Lombok Authors. + * Copyright (C) 2013-2014 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,12 +21,14 @@ */ package lombok.core; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; public class LombokInternalAliasing { - public static final Map<String, String> IMPLIED_EXTRA_STAR_IMPORTS; + /** Maps a package name to a space separated list of packages. If the key package is star-imported, assume all packages in the 'value' part of the MapEntry are too. */ + public static final Map<String, Collection<String>> IMPLIED_EXTRA_STAR_IMPORTS; public static final Map<String, String> ALIASES; /** @@ -41,12 +43,14 @@ public class LombokInternalAliasing { } static { - Map<String, String> m = new HashMap<String, String>(); - m.put("lombok.experimental", "lombok"); - IMPLIED_EXTRA_STAR_IMPORTS = Collections.unmodifiableMap(m); + Map<String, Collection<String>> m1 = new HashMap<String, Collection<String>>(); + m1.put("lombok.experimental", Collections.singleton("lombok")); + m1.put("lombok", Collections.singleton("lombok.experimental")); + IMPLIED_EXTRA_STAR_IMPORTS = Collections.unmodifiableMap(m1); - m = new HashMap<String, String>(); - m.put("lombok.experimental.Value", "lombok.Value"); - ALIASES = Collections.unmodifiableMap(m); + Map<String, String> m2 = new HashMap<String, String>(); + m2.put("lombok.experimental.Value", "lombok.Value"); + m2.put("lombok.Delegate", "lombok.experimental.Delegate"); + ALIASES = Collections.unmodifiableMap(m2); } } diff --git a/src/core/lombok/eclipse/EclipseImportList.java b/src/core/lombok/eclipse/EclipseImportList.java index 69246b3c..47167ec6 100644 --- a/src/core/lombok/eclipse/EclipseImportList.java +++ b/src/core/lombok/eclipse/EclipseImportList.java @@ -62,15 +62,23 @@ public class EclipseImportList implements ImportList { } @Override public boolean hasStarImport(String packageName) { - for (Map.Entry<String, String> e : LombokInternalAliasing.IMPLIED_EXTRA_STAR_IMPORTS.entrySet()) { - if (e.getValue().equals(packageName) && hasStarImport(e.getKey())) return true; - } if (isEqual(packageName, pkg)) return true; if ("java.lang".equals(packageName)) return true; + + if (pkg != null && pkg.tokens != null && pkg.tokens.length == 0) { + for (Map.Entry<String, Collection<String>> e : LombokInternalAliasing.IMPLIED_EXTRA_STAR_IMPORTS.entrySet()) { + if (isEqual(e.getKey(), pkg) && e.getValue().contains(packageName)) return true; + } + } + if (imports != null) for (ImportReference imp : imports) { if ((imp.bits & ASTNode.OnDemand) == 0) continue; if (imp.isStatic()) continue; if (isEqual(packageName, imp)) return true; + for (Map.Entry<String, Collection<String>> e : LombokInternalAliasing.IMPLIED_EXTRA_STAR_IMPORTS.entrySet()) { + if (isEqual(e.getKey(), imp) && e.getValue().contains(packageName)) return true; + } + } return false; } diff --git a/src/core/lombok/eclipse/handlers/HandleGetter.java b/src/core/lombok/eclipse/handlers/HandleGetter.java index 8cffaa2c..d3d974c9 100644 --- a/src/core/lombok/eclipse/handlers/HandleGetter.java +++ b/src/core/lombok/eclipse/handlers/HandleGetter.java @@ -34,7 +34,7 @@ import java.util.Map; import lombok.AccessLevel; import lombok.ConfigurationKeys; -import lombok.Delegate; +import lombok.experimental.Delegate; import lombok.Getter; import lombok.core.AST.Kind; import lombok.core.AnnotationValues; diff --git a/src/core/lombok/experimental/Delegate.java b/src/core/lombok/experimental/Delegate.java new file mode 100644 index 00000000..806d5871 --- /dev/null +++ b/src/core/lombok/experimental/Delegate.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2010-2014 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.experimental; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Put on any field to make lombok generate delegate methods that forward the call to this field. + * + * Example: + * <pre> + * private @Delegate List<String> foo; + * </pre> + * + * will generate for example an {@code boolean add(String)} method, which contains: {@code return foo.add(arg);}, as well as all other methods in {@code List}. + * + * All public instance methods of the field's type, as well as all public instance methods of all the field's type's superfields are delegated, except for all methods + * that exist in {@link Object}, the {@code canEqual(Object)} method, and any methods that appear in types + * that are listed in the {@code excludes} property. + * <p> + * Complete documentation is found at <a href="http://projectlombok.org/features/experimental/Delegate.html">the project lombok features page for @Delegate</a>. + */ +@Target({ElementType.FIELD, ElementType.METHOD}) +@Retention(RetentionPolicy.SOURCE) +public @interface Delegate { + /** + * Normally the type of the field is used as delegate type. However, to choose a different type to delegate, you can list one (or more) types here. Note that types with + * type arguments can only be done as a field type. A solution for this is to create a private inner interface/class with the appropriate types extended, and possibly + * with all methods you'd like to delegate listed, and then supply that class here. The field does not actually have to implement the type you're delegating; the + * type listed here is used only to determine which delegate methods to generate. + * + * NB: All methods in {@code Object}, as well as {@code canEqual(Object other)} will never be delegated. + */ + Class<?>[] types() default {}; + + /** + * Each method in any of the types listed here (include supertypes) will <em>not</em> be delegated. + * + * NB: All methods in {@code Object}, as well as {@code canEqual(Object other)} will never be delegated. + */ + Class<?>[] excludes() default {}; +} diff --git a/src/core/lombok/javac/JavacImportList.java b/src/core/lombok/javac/JavacImportList.java index d5d7460a..2665ca7c 100644 --- a/src/core/lombok/javac/JavacImportList.java +++ b/src/core/lombok/javac/JavacImportList.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Project Lombok Authors. + * Copyright (C) 2013-2014 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 @@ -23,7 +23,6 @@ package lombok.javac; import java.util.ArrayList; import java.util.Collection; -import java.util.Map; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; @@ -59,12 +58,15 @@ public class JavacImportList implements ImportList { } @Override public boolean hasStarImport(String packageName) { - for (Map.Entry<String, String> e : LombokInternalAliasing.IMPLIED_EXTRA_STAR_IMPORTS.entrySet()) { - if (e.getValue().equals(packageName) && hasStarImport(e.getKey())) return true; - } - if (pkg != null && pkg.toString().equals(packageName)) return true; + String pkgStr = pkg == null ? null : pkg.toString(); + if (pkgStr != null && pkgStr.equals(packageName)) return true; if ("java.lang".equals(packageName)) return true; + if (pkgStr != null) { + Collection<String> extra = LombokInternalAliasing.IMPLIED_EXTRA_STAR_IMPORTS.get(pkgStr); + if (extra != null && extra.contains(packageName)) return true; + } + for (JCTree def : defs) { if (!(def instanceof JCImport)) continue; if (((JCImport) def).staticImport) continue; @@ -72,7 +74,10 @@ public class JavacImportList implements ImportList { if (!(qual instanceof JCFieldAccess)) continue; String simpleName = ((JCFieldAccess) qual).name.toString(); if (!"*".equals(simpleName)) continue; - if (packageName.equals(((JCFieldAccess) qual).selected.toString())) return true; + String starImport = ((JCFieldAccess) qual).selected.toString(); + if (packageName.equals(starImport)) return true; + Collection<String> extra = LombokInternalAliasing.IMPLIED_EXTRA_STAR_IMPORTS.get(starImport); + if (extra != null && extra.contains(packageName)) return true; } return false; diff --git a/src/core/lombok/javac/handlers/HandleDelegate.java b/src/core/lombok/javac/handlers/HandleDelegate.java index ec6ea20c..9cd8844e 100644 --- a/src/core/lombok/javac/handlers/HandleDelegate.java +++ b/src/core/lombok/javac/handlers/HandleDelegate.java @@ -25,6 +25,7 @@ import static lombok.core.handlers.HandlerUtil.*; import static lombok.javac.handlers.JavacHandlerUtil.*; import static com.sun.tools.javac.code.Flags.*; +import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -42,7 +43,7 @@ import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import lombok.ConfigurationKeys; -import lombok.Delegate; +import lombok.experimental.Delegate; import lombok.core.AST.Kind; import lombok.core.AnnotationValues; import lombok.core.HandlerPriority; @@ -101,7 +102,8 @@ public class HandleDelegate extends JavacAnnotationHandler<Delegate> { @Override public void handle(AnnotationValues<Delegate> annotation, JCAnnotation ast, JavacNode annotationNode) { handleFlagUsage(annotationNode, ConfigurationKeys.DELEGATE_FLAG_USAGE, "@Delegate"); - deleteAnnotationIfNeccessary(annotationNode, Delegate.class); + @SuppressWarnings("deprecation") Class<? extends Annotation> oldDelegate = lombok.Delegate.class; + deleteAnnotationIfNeccessary(annotationNode, Delegate.class, oldDelegate); Type delegateType; Name delegateName = annotationNode.toName(annotationNode.up().getName()); diff --git a/src/core/lombok/javac/handlers/HandleGetter.java b/src/core/lombok/javac/handlers/HandleGetter.java index 48a13bde..063741e2 100644 --- a/src/core/lombok/javac/handlers/HandleGetter.java +++ b/src/core/lombok/javac/handlers/HandleGetter.java @@ -33,7 +33,7 @@ import java.util.Map; import lombok.AccessLevel; import lombok.ConfigurationKeys; -import lombok.Delegate; +import lombok.experimental.Delegate; import lombok.Getter; import lombok.core.AST.Kind; import lombok.core.AnnotationValues; |