aboutsummaryrefslogtreecommitdiff
path: root/src/core/lombok/javac/handlers
diff options
context:
space:
mode:
authorRoel Spilker <r.spilker@gmail.com>2015-12-06 01:11:30 +0100
committerRoel Spilker <r.spilker@gmail.com>2015-12-06 01:11:30 +0100
commit8037350c70a1172f88cd1f050336b326adabb64d (patch)
tree8918fb7aeaac4eb207a1b56534d361a83b2a7d63 /src/core/lombok/javac/handlers
parent50716864f684261313bd385dc20c86b7141c47d6 (diff)
downloadlombok-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.java34
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;
}
}