[issue #942] let @Data work on jdk9, first steps.

This commit is contained in:
Roel Spilker committed 2015-12-06 01:11:30 +01:00
1 parent 50716864f6
commit 8037350c70
3 files changed
+74 -23

No files matched your search

+27 -9
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2009-2013 The Project Lombok Authors.
* Copyright (C) 2009-2015 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
@@ -22,6 +22,7 @@
package lombok.javac;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
@@ -34,16 +35,14 @@ import javax.tools.JavaFileObject;
import lombok.core.AST;
import com.sun.tools.javac.code.Symtab;
import com.sun.tools.javac.code.Source;
import com.sun.tools.javac.code.Symtab;
import com.sun.tools.javac.model.JavacElements;
import com.sun.tools.javac.model.JavacTypes;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.JCCatch;
import com.sun.tools.javac.tree.JCTree.JCTry;
import com.sun.tools.javac.tree.TreeMaker;
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
import com.sun.tools.javac.tree.JCTree.JCBlock;
import com.sun.tools.javac.tree.JCTree.JCCatch;
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
import com.sun.tools.javac.tree.JCTree.JCExpression;
@@ -51,11 +50,13 @@ import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
import com.sun.tools.javac.tree.JCTree.JCIdent;
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
import com.sun.tools.javac.tree.JCTree.JCStatement;
import com.sun.tools.javac.tree.JCTree.JCTry;
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
import com.sun.tools.javac.tree.TreeMaker;
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import com.sun.tools.javac.util.Log;
import com.sun.tools.javac.util.Name;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
/**
* Wraps around javac's internal AST view to add useful features as well as the ability to visit parents from children,
@@ -78,7 +79,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), packageDeclaration(top), new JavacImportList(top));
super(sourceName(top), PackageName.getPackageName(top), new JavacImportList(top));
setTop(buildCompilationUnit(top));
this.context = context;
this.messager = messager;
@@ -103,8 +104,25 @@ public class JavacAST extends AST<JavacAST, JavacNode, JCTree> {
return cu.sourcefile == null ? null : cu.sourcefile.toString();
}
private static String packageDeclaration(JCCompilationUnit cu) {
return (cu.pid instanceof JCFieldAccess || cu.pid instanceof JCIdent) ? cu.pid.toString() : null;
// jdk9 support, types have changed, names stay the same
static class PackageName {
private static final Method packageNameMethod;
static {
Method m = null;
try {
m = JCCompilationUnit.class.getDeclaredMethod("getPackageName");
} catch (Exception e) {}
packageNameMethod = m;
}
static String getPackageName(JCCompilationUnit cu) {
try {
Object pkg = packageNameMethod.invoke(cu);
return (pkg instanceof JCFieldAccess || pkg instanceof JCIdent) ? pkg.toString() : null;
} catch (Exception e) {}
return null;
}
}
public Context getContext() {
+16 -11
View File
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2014 The Project Lombok Authors.
* Copyright (C) 2013-2015 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
@@ -24,22 +24,22 @@ package lombok.javac;
import java.util.ArrayList;
import java.util.Collection;
import lombok.core.ImportList;
import lombok.core.LombokInternalAliasing;
import lombok.javac.JavacAST.PackageName;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
import com.sun.tools.javac.tree.JCTree.JCExpression;
import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
import com.sun.tools.javac.tree.JCTree.JCImport;
import com.sun.tools.javac.util.List;
import lombok.core.ImportList;
import lombok.core.LombokInternalAliasing;
public class JavacImportList implements ImportList {
private final JCExpression pkg;
private final String pkgStr;
private final List<JCTree> defs;
public JavacImportList(JCCompilationUnit cud) {
this.pkg = cud.pid;
this.pkgStr = PackageName.getPackageName(cud);
this.defs = cud.defs;
}
@@ -58,7 +58,6 @@ public class JavacImportList implements ImportList {
}
@Override public boolean hasStarImport(String packageName) {
String pkgStr = pkg == null ? null : pkg.toString();
if (pkgStr != null && pkgStr.equals(packageName)) return true;
if ("java.lang".equals(packageName)) return true;
@@ -86,7 +85,7 @@ public class JavacImportList implements ImportList {
@Override public Collection<String> applyNameToStarImports(String startsWith, String name) {
ArrayList<String> out = new ArrayList<String>();
if (pkg != null && topLevelName(pkg).equals(startsWith)) out.add(pkg.toString() + "." + name);
if (pkgStr != null && topLevelName(pkgStr).equals(startsWith)) out.add(pkgStr + "." + name);
for (JCTree def : defs) {
if (!(def instanceof JCImport)) continue;
@@ -110,8 +109,14 @@ public class JavacImportList implements ImportList {
return tree.toString();
}
private String topLevelName(String packageName) {
int idx = packageName.indexOf(".");
if (idx == -1) return packageName;
return packageName.substring(0, idx);
}
@Override public String applyUnqualifiedNameToPackage(String unqualified) {
if (pkg == null) return unqualified;
return pkg.toString() + "." + unqualified;
if (pkgStr == null) return unqualified;
return pkgStr + "." + unqualified;
}
}
@@ -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;
}
}