diff options
Diffstat (limited to 'test')
59 files changed, 1077 insertions, 112 deletions
diff --git a/test/core/src/lombok/DirectoryRunner.java b/test/core/src/lombok/DirectoryRunner.java index a174355d..93b18039 100644 --- a/test/core/src/lombok/DirectoryRunner.java +++ b/test/core/src/lombok/DirectoryRunner.java @@ -180,7 +180,8 @@ public class DirectoryRunner extends Runner { case DELOMBOK: return new RunTestsViaDelombok().createTester(params, file, "javac", params.getVersion()); case ECJ: - return new RunTestsViaEcj().createTester(params, file, "ecj", params.getVersion()); + String platform = RunTestsViaEcj.eclipseAvailable() ? "eclipse" : "ecj"; + return new RunTestsViaEcj().createTester(params, file, platform, params.getVersion()); default: case JAVAC: throw new UnsupportedOperationException(); diff --git a/test/core/src/lombok/LombokTestSource.java b/test/core/src/lombok/LombokTestSource.java index a0a6407a..e23a0f57 100644 --- a/test/core/src/lombok/LombokTestSource.java +++ b/test/core/src/lombok/LombokTestSource.java @@ -65,7 +65,10 @@ public class LombokTestSource { public boolean runOnPlatform(String platform) { if (platforms == null || platforms.isEmpty()) return true; - for (String pl : platforms) if (pl.equalsIgnoreCase(platform)) return true; + for (String pl : platforms) { + if (pl.startsWith("!") && pl.regionMatches(true, 1, platform, 0, platform.length())) return false; + if (pl.equalsIgnoreCase(platform)) return true; + } return false; } diff --git a/test/core/src/lombok/RunTestsViaEcj.java b/test/core/src/lombok/RunTestsViaEcj.java index b98c19b7..1d840a21 100644 --- a/test/core/src/lombok/RunTestsViaEcj.java +++ b/test/core/src/lombok/RunTestsViaEcj.java @@ -35,6 +35,14 @@ import java.util.concurrent.atomic.AtomicReference; import lombok.eclipse.Eclipse; import lombok.javac.CapturingDiagnosticListener.CompilerMessage; +import org.eclipse.core.internal.registry.ExtensionRegistry; +import org.eclipse.core.internal.runtime.Activator; +import org.eclipse.core.internal.runtime.PlatformActivator; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.RegistryFactory; +import org.eclipse.core.runtime.adaptor.EclipseStarter; +import org.eclipse.core.runtime.spi.IRegistryProvider; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; @@ -49,6 +57,9 @@ import org.eclipse.jdt.internal.compiler.batch.FileSystem; import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; +import org.eclipse.jdt.internal.core.JavaModelManager; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; public class RunTestsViaEcj extends AbstractRunTests { protected CompilerOptions ecjCompilerOptions() { @@ -107,7 +118,17 @@ public class RunTestsViaEcj extends AbstractRunTests { String source = readFile(file); char[] sourceArray = source.toCharArray(); - final ICompilationUnit sourceUnit = new TestCompilationUnit(file.getName(), source); + final ICompilationUnit sourceUnit; + try { + if (eclipseAvailable()) { + sourceUnit = new TestCompilationUnitEclipse(file.getName(), source); + } else { + sourceUnit = new TestCompilationUnitEcj(file.getName(), source); + } + } catch (Throwable t) { + t.printStackTrace(); + return false; + } Compiler ecjCompiler = new Compiler(createFileSystem(file, minVersion), ecjErrorHandlingPolicy(), ecjCompilerOptions(), bitbucketRequestor, new DefaultProblemFactory(Locale.ENGLISH)) { @Override protected synchronized void addCompilationUnit(ICompilationUnit inUnit, CompilationUnitDeclaration parsedUnit) { @@ -116,6 +137,8 @@ public class RunTestsViaEcj extends AbstractRunTests { } }; + // initializeEclipseBundles(); + ecjCompiler.compile(new ICompilationUnit[] {sourceUnit}); CompilationResult compilationResult = compilationResult_.get(); @@ -137,7 +160,37 @@ public class RunTestsViaEcj extends AbstractRunTests { return true; } - private boolean eclipseAvailable() { + @SuppressWarnings("unused") + private static class EclipseInitializer { + static void initializeEclipseBundles() throws Exception { + // This code does not work yet, it's research-in-progress. + // The problem is that parts of the eclipse handler (in `PatchValEclipse` and friends) do not work unless + // an actual eclipse exists; PatchVal causes code to run that will end up running `ResourcesPlugin.getWorkspace()`, which + // goes down a rabbit hole of pinging off of various static fields (or `getX()` calls which return static fields), all + // of which are `null` until the plugin they belong to is properly initialized. + // This code is work in progress to 'hack' the initialization of each plugin one-by-one, but I doubt this is the right + // way to do it, as I bet it's fragile (will break when eclipse updates rather easily), and who knows how many fields + // and things need to be initialized. + // A better plan would be to start an actual, real eclipse, by telling `EclipseStarter.startup` to launch some sort of + // application (or at least a bunch of bundles/products/apps, including the JDT). This will then take long enough that + // it'll need to be cached and re-used for each test or the Eclipse test run would take far too long. + + BundleContext context = EclipseStarter.startup(new String[0], null); + RegistryFactory.setDefaultRegistryProvider(new IRegistryProvider() { + private final ExtensionRegistry REG = new ExtensionRegistry(null, null, null); + @Override public IExtensionRegistry getRegistry() { + return REG; + } + }); + new Activator().start(context); + new PlatformActivator().start(context); + for (Bundle b : context.getBundles()) System.out.println("BUNDLE: " + b.getSymbolicName()); + new ResourcesPlugin().start(context); + JavaModelManager.getJavaModelManager().startup(); + } + } + + static boolean eclipseAvailable() { try { Class.forName("org.eclipse.jdt.core.dom.CompilationUnit"); } catch (Throwable t) { @@ -171,7 +224,7 @@ public class RunTestsViaEcj extends AbstractRunTests { i.remove(); } } - if (new File("bin").exists()) classpath.add("bin"); + if (new File("bin/main").exists()) classpath.add("bin/main"); classpath.add("dist/lombok.jar"); if (bootRuntimePath == null || bootRuntimePath.isEmpty()) throw new IllegalStateException("System property delombok.bootclasspath is not set; set it to the rt of java6 or java8"); classpath.add(bootRuntimePath); @@ -184,11 +237,44 @@ public class RunTestsViaEcj extends AbstractRunTests { return new FileSystem(classpath.toArray(new String[0]), new String[] {file.getAbsolutePath()}, "UTF-8"); } - private static final class TestCompilationUnit extends org.eclipse.jdt.internal.core.CompilationUnit { + private static final class TestCompilationUnitEcj implements ICompilationUnit { + private final char[] name, source, mainTypeName; + + TestCompilationUnitEcj(String name, String source) { + this.source = source.toCharArray(); + this.name = name.toCharArray(); + + char[] fileNameCharArray = getFileName(); + int start = CharOperation.lastIndexOf(File.separatorChar, fileNameCharArray) + 1; + int end = CharOperation.lastIndexOf('.', fileNameCharArray); + if (end == -1) { + end = fileNameCharArray.length; + } + mainTypeName = CharOperation.subarray(fileNameCharArray, start, end); + } + + @Override public char[] getFileName() { + return name; + } + + @Override public char[] getContents() { + return source; + } + + @Override public char[] getMainTypeName() { + return mainTypeName; + } + + @Override public char[][] getPackageName() { + return null; + } + } + + private static final class TestCompilationUnitEclipse extends org.eclipse.jdt.internal.core.CompilationUnit { private final char[] source; private final char[] mainTypeName; - private TestCompilationUnit(String name, String source) { + private TestCompilationUnitEclipse(String name, String source) { super(null, name, null); this.source = source.toCharArray(); diff --git a/test/pretty/resource/after/tryWithResourcesVarRef.java b/test/pretty/resource/after/TryWithResourcesVarRef.java index 5117f706..5117f706 100644 --- a/test/pretty/resource/after/tryWithResourcesVarRef.java +++ b/test/pretty/resource/after/TryWithResourcesVarRef.java diff --git a/test/stubs/org/checkerframework/checker/calledmethods/qual/CalledMethods.java b/test/stubs/org/checkerframework/checker/calledmethods/qual/CalledMethods.java new file mode 100644 index 00000000..514e8c6b --- /dev/null +++ b/test/stubs/org/checkerframework/checker/calledmethods/qual/CalledMethods.java @@ -0,0 +1,17 @@ +package org.checkerframework.checker.calledmethods.qual; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) +public @interface CalledMethods { + /** + * Methods that have been called, on any expression whose type is annotated. + * + * @return methods that have been called + */ + public String[] value() default {}; +}
\ No newline at end of file diff --git a/test/stubs/org/checkerframework/checker/calledmethods/qual/NotCalledMethods.java b/test/stubs/org/checkerframework/checker/calledmethods/qual/NotCalledMethods.java new file mode 100644 index 00000000..7a9ef37c --- /dev/null +++ b/test/stubs/org/checkerframework/checker/calledmethods/qual/NotCalledMethods.java @@ -0,0 +1,17 @@ +package org.checkerframework.checker.calledmethods.qual; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) +public @interface NotCalledMethods { + /** + * Methods that have been called, on any expression whose type is annotated. + * + * @return methods that have been called + */ + public String[] value() default {}; +}
\ No newline at end of file diff --git a/test/stubs/org/checkerframework/common/aliasing/qual/Unique.java b/test/stubs/org/checkerframework/common/aliasing/qual/Unique.java new file mode 100644 index 00000000..fe7acfca --- /dev/null +++ b/test/stubs/org/checkerframework/common/aliasing/qual/Unique.java @@ -0,0 +1,12 @@ +package org.checkerframework.common.aliasing.qual; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) +public @interface Unique {}
\ No newline at end of file diff --git a/test/stubs/org/checkerframework/common/returnsreceiver/qual/This.java b/test/stubs/org/checkerframework/common/returnsreceiver/qual/This.java new file mode 100644 index 00000000..8ae1cd59 --- /dev/null +++ b/test/stubs/org/checkerframework/common/returnsreceiver/qual/This.java @@ -0,0 +1,12 @@ +package org.checkerframework.common.returnsreceiver.qual; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@Inherited +public @interface This {}
\ No newline at end of file diff --git a/test/stubs/org/checkerframework/dataflow/qual/Pure.java b/test/stubs/org/checkerframework/dataflow/qual/Pure.java new file mode 100644 index 00000000..d9bb1bf4 --- /dev/null +++ b/test/stubs/org/checkerframework/dataflow/qual/Pure.java @@ -0,0 +1,12 @@ +package org.checkerframework.dataflow.qual; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.CONSTRUCTOR}) +public @interface Pure {}
\ No newline at end of file diff --git a/test/stubs/org/checkerframework/dataflow/qual/SideEffectFree.java b/test/stubs/org/checkerframework/dataflow/qual/SideEffectFree.java new file mode 100644 index 00000000..9c32d369 --- /dev/null +++ b/test/stubs/org/checkerframework/dataflow/qual/SideEffectFree.java @@ -0,0 +1,12 @@ +package org.checkerframework.dataflow.qual; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.CONSTRUCTOR}) +public @interface SideEffectFree {}
\ No newline at end of file diff --git a/test/transform/resource/after-delombok/BuilderWithDeprecatedAnnOnly.java b/test/transform/resource/after-delombok/BuilderWithDeprecatedAnnOnly.java new file mode 100644 index 00000000..f039c047 --- /dev/null +++ b/test/transform/resource/after-delombok/BuilderWithDeprecatedAnnOnly.java @@ -0,0 +1,104 @@ +import com.google.common.collect.ImmutableList; +public class BuilderWithDeprecatedAnnOnly { + @Deprecated + int dep1; + @Deprecated + java.util.List<String> strings; + @Deprecated + ImmutableList<Integer> numbers; + @java.lang.SuppressWarnings("all") + BuilderWithDeprecatedAnnOnly(final int dep1, final java.util.List<String> strings, final ImmutableList<Integer> numbers) { + this.dep1 = dep1; + this.strings = strings; + this.numbers = numbers; + } + @java.lang.SuppressWarnings("all") + public static class BuilderWithDeprecatedAnnOnlyBuilder { + @java.lang.SuppressWarnings("all") + private int dep1; + @java.lang.SuppressWarnings("all") + private java.util.ArrayList<String> strings; + @java.lang.SuppressWarnings("all") + private com.google.common.collect.ImmutableList.Builder<Integer> numbers; + @java.lang.SuppressWarnings("all") + BuilderWithDeprecatedAnnOnlyBuilder() { + } + @java.lang.Deprecated + @java.lang.SuppressWarnings("all") + public BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder dep1(final int dep1) { + this.dep1 = dep1; + return this; + } + @java.lang.Deprecated + @java.lang.SuppressWarnings("all") + public BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder string(final String string) { + if (this.strings == null) this.strings = new java.util.ArrayList<String>(); + this.strings.add(string); + return this; + } + @java.lang.Deprecated + @java.lang.SuppressWarnings("all") + public BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder strings(final java.util.Collection<? extends String> strings) { + if (strings == null) { + throw new java.lang.NullPointerException("strings cannot be null"); + } + if (this.strings == null) this.strings = new java.util.ArrayList<String>(); + this.strings.addAll(strings); + return this; + } + @java.lang.Deprecated + @java.lang.SuppressWarnings("all") + public BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder clearStrings() { + if (this.strings != null) this.strings.clear(); + return this; + } + @java.lang.Deprecated + @java.lang.SuppressWarnings("all") + public BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder number(final Integer number) { + if (this.numbers == null) this.numbers = com.google.common.collect.ImmutableList.builder(); + this.numbers.add(number); + return this; + } + @java.lang.Deprecated + @java.lang.SuppressWarnings("all") + public BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder numbers(final java.lang.Iterable<? extends Integer> numbers) { + if (numbers == null) { + throw new java.lang.NullPointerException("numbers cannot be null"); + } + if (this.numbers == null) this.numbers = com.google.common.collect.ImmutableList.builder(); + this.numbers.addAll(numbers); + return this; + } + @java.lang.Deprecated + @java.lang.SuppressWarnings("all") + public BuilderWithDeprecatedAnnOnly.BuilderWithDeprecatedAnnOnlyBuilder clearNumbers() { + this.numbers = null; + return this; + } + @java.lang.SuppressWarnings("all") + public BuilderWithDeprecatedAnnOnly build() { + java.util.List<String> strings; + switch (this.strings |
