aboutsummaryrefslogtreecommitdiff
path: root/test/core
diff options
context:
space:
mode:
authorRawi01 <Rawi01@users.noreply.github.com>2021-01-26 23:05:34 +0100
committerRoel Spilker <r.spilker@gmail.com>2021-01-28 19:40:41 +0100
commiteecd1a33e457446aa256231acdb93dd618a5754e (patch)
tree04a49fcbbdb91a172aa3fda574a347f3e06bea86 /test/core
parenta234a8e1d1dadc6990f8b8f1d87e93757beafe1c (diff)
downloadlombok-eecd1a33e457446aa256231acdb93dd618a5754e.tar.gz
lombok-eecd1a33e457446aa256231acdb93dd618a5754e.tar.bz2
lombok-eecd1a33e457446aa256231acdb93dd618a5754e.zip
Validate positions during tests
Diffstat (limited to 'test/core')
-rw-r--r--test/core/src/lombok/RunTestsViaDelombok.java113
1 files changed, 113 insertions, 0 deletions
diff --git a/test/core/src/lombok/RunTestsViaDelombok.java b/test/core/src/lombok/RunTestsViaDelombok.java
index ffac8372..433d8b07 100644
--- a/test/core/src/lombok/RunTestsViaDelombok.java
+++ b/test/core/src/lombok/RunTestsViaDelombok.java
@@ -21,17 +21,42 @@
*/
package lombok;
+import static org.junit.Assert.fail;
+
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.PrintStream;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.util.Collection;
+import java.util.Collections;
import java.util.Locale;
import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.ProcessingEnvironment;
+import javax.annotation.processing.RoundEnvironment;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.TypeElement;
+
+import com.sun.source.util.TreePath;
+import com.sun.source.util.Trees;
+import com.sun.tools.javac.code.Flags;
+import com.sun.tools.javac.tree.JCTree;
+import com.sun.tools.javac.tree.TreeScanner;
+import com.sun.tools.javac.tree.JCTree.JCAnnotation;
+import com.sun.tools.javac.tree.JCTree.JCAssign;
+import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
+import com.sun.tools.javac.tree.JCTree.JCIdent;
+import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
+import com.sun.tools.javac.tree.JCTree.JCModifiers;
+import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
import lombok.delombok.Delombok;
import lombok.javac.CapturingDiagnosticListener;
+import lombok.javac.Javac;
import lombok.javac.CapturingDiagnosticListener.CompilerMessage;
public class RunTestsViaDelombok extends AbstractRunTests {
@@ -48,6 +73,8 @@ public class RunTestsViaDelombok extends AbstractRunTests {
delombok.setDiagnosticsListener(new CapturingDiagnosticListener(file, messages));
+ delombok.addAdditionalAnnotationProcessor(new ValidatePositionProcessor());
+
delombok.addFile(file.getAbsoluteFile().getParentFile(), file.getName());
delombok.setSourcepath(file.getAbsoluteFile().getParent());
String bcp = System.getProperty("delombok.bootclasspath");
@@ -63,6 +90,92 @@ public class RunTestsViaDelombok extends AbstractRunTests {
}
}
+ public static class ValidatePositionProcessor extends TreeProcessor {
+ @Override void processCompilationUnit(final JCCompilationUnit unit) {
+ unit.accept(new TreeScanner() {
+ @Override public void scan(JCTree tree) {
+ if (tree == null) return;
+ if (tree instanceof JCMethodDecl && (((JCMethodDecl) tree).mods.flags & Flags.GENERATEDCONSTR) != 0) return;
+ try {
+ if (tree instanceof JCModifiers) return;
+
+ if (tree.pos == -1) {
+ fail("Start position of " + tree + " not set");
+ }
+ if (Javac.getEndPosition(tree, unit) == -1) {
+ fail("End position of " + tree + " not set");
+ }
+ } finally {
+ super.scan(tree);
+ }
+ }
+
+ @Override public void visitMethodDef(JCMethodDecl tree) {
+ super.visitMethodDef(tree);
+ }
+
+ @Override public void visitVarDef(JCVariableDecl tree) {
+ if ((tree.mods.flags & Flags.ENUM) != 0) return;
+ super.visitVarDef(tree);
+ }
+
+ @Override public void visitAnnotation(JCAnnotation tree) {
+ scan(tree.annotationType);
+ // Javac parser maps @Annotation("val") to @Annotation(value = "val") but does not add an end position for the new JCIdent...
+ if (tree.args.length() == 1 && tree.args.head instanceof JCAssign && ((JCIdent)((JCAssign) tree.args.head).lhs).name.toString().equals("value")) {
+ scan(((JCAssign) tree.args.head).rhs);
+ } else {
+ scan(tree.args);
+ }
+ }
+ });
+ }
+ }
+
+ public static abstract class TreeProcessor extends AbstractProcessor {
+ private Trees trees;
+ @Override public synchronized void init(ProcessingEnvironment processingEnv) {
+ super.init(processingEnv);
+ trees = Trees.instance(processingEnv);
+ }
+
+ @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+ for (Element element : roundEnv.getRootElements()) {
+ JCCompilationUnit unit = toUnit(element);
+ if (unit != null) {
+ processCompilationUnit(unit);
+ }
+ }
+ return false;
+ }
+
+ abstract void processCompilationUnit(JCCompilationUnit unit);
+
+ @Override public Set<String> getSupportedAnnotationTypes() {
+ return Collections.singleton("*");
+ }
+
+ @Override public SourceVersion getSupportedSourceVersion() {
+ return SourceVersion.latest();
+ }
+
+ private JCCompilationUnit toUnit(Element element) {
+ TreePath path = null;
+ if (trees != null) {
+ try {
+ path = trees.getPath(element);
+ } catch (NullPointerException ignore) {
+ // Happens if a package-info.java dowsn't conatin a package declaration.
+ // https://github.com/rzwitserloot/lombok/issues/2184
+ // We can safely ignore those, since they do not need any processing
+ }
+ }
+ if (path == null) return null;
+
+ return (JCCompilationUnit) path.getCompilationUnit();
+ }
+ }
+
static class ChangedChecker {
private final ByteArrayOutputStream bytes = new ByteArrayOutputStream();
private final PrintStream feedback;