diff options
author | Roel Spilker <r.spilker@gmail.com> | 2015-12-06 01:11:30 +0100 |
---|---|---|
committer | Roel Spilker <r.spilker@gmail.com> | 2015-12-06 01:11:30 +0100 |
commit | 8037350c70a1172f88cd1f050336b326adabb64d (patch) | |
tree | 8918fb7aeaac4eb207a1b56534d361a83b2a7d63 /src/core/lombok/javac/handlers | |
parent | 50716864f684261313bd385dc20c86b7141c47d6 (diff) | |
download | lombok-8037350c70a1172f88cd1f050336b326adabb64d.tar.gz lombok-8037350c70a1172f88cd1f050336b326adabb64d.tar.bz2 lombok-8037350c70a1172f88cd1f050336b326adabb64d.zip |
[issue #942] let `@Data` work on jdk9, first steps.
Diffstat (limited to 'src/core/lombok/javac/handlers')
-rw-r--r-- | src/core/lombok/javac/handlers/JavacHandlerUtil.java | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java index 4e9be00b..fdc8a262 100644 --- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java +++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java @@ -27,6 +27,7 @@ import static lombok.javac.Javac.*; import static lombok.javac.JavacAugments.JCTree_generatedNode; import java.lang.annotation.Annotation; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; @@ -56,6 +57,9 @@ import lombok.javac.JavacTreeMaker; import com.sun.tools.javac.code.BoundKind; import com.sun.tools.javac.code.Flags; +import com.sun.tools.javac.code.Scope; +import com.sun.tools.javac.code.Symbol; +import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.parser.Tokens.Comment; import com.sun.tools.javac.tree.DocCommentTable; import com.sun.tools.javac.tree.JCTree; @@ -871,6 +875,32 @@ public class JavacHandlerUtil { return (field.mods.flags & Flags.ENUM) != 0; } + // jdk9 support, types have changed, names stay the same + static class ClassSymbolMembersField { + private static final Field membersField; + private static final Method removeMethod; + + static { + Field f = null; + Method m = null; + try { + f = ClassSymbol.class.getField("members_field"); + m = f.getType().getMethod("remove", Symbol.class); + } catch (Exception e) {} + membersField = f; + removeMethod = m; + } + + static void remove(ClassSymbol from, Symbol toRemove) { + if (from == null) return; + try { + Scope scope = (Scope) membersField.get(from); + if (scope == null) return; + removeMethod.invoke(scope, toRemove); + } catch (Exception e) {} + } + } + /** * Adds the given new method declaration to the provided type AST Node. * Can also inject constructors. @@ -889,9 +919,7 @@ public class JavacHandlerUtil { JavacNode tossMe = typeNode.getNodeFor(def); if (tossMe != null) tossMe.up().removeChild(tossMe); type.defs = addAllButOne(type.defs, idx); - if (type.sym != null && type.sym.members_field != null) { - type.sym.members_field.remove(((JCMethodDecl)def).sym); - } + ClassSymbolMembersField.remove(type.sym, ((JCMethodDecl)def).sym); break; } } |