diff options
author | Rawi01 <Rawi01@users.noreply.github.com> | 2021-01-26 23:05:34 +0100 |
---|---|---|
committer | Roel Spilker <r.spilker@gmail.com> | 2021-01-28 19:40:41 +0100 |
commit | eecd1a33e457446aa256231acdb93dd618a5754e (patch) | |
tree | 04a49fcbbdb91a172aa3fda574a347f3e06bea86 /test/core/src/lombok | |
parent | a234a8e1d1dadc6990f8b8f1d87e93757beafe1c (diff) | |
download | lombok-eecd1a33e457446aa256231acdb93dd618a5754e.tar.gz lombok-eecd1a33e457446aa256231acdb93dd618a5754e.tar.bz2 lombok-eecd1a33e457446aa256231acdb93dd618a5754e.zip |
Validate positions during tests
Diffstat (limited to 'test/core/src/lombok')
-rw-r--r-- | test/core/src/lombok/RunTestsViaDelombok.java | 113 |
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; |