summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChengnian Sun <cnsun@google.com>2017-03-16 22:38:28 +0000
committerColin Cross <ccross@android.com>2017-03-22 09:55:48 -0700
commitc1cd3d1d1c4893c58f97479af51b1fff180e9d82 (patch)
treea859421556e19cfd8613db6c7e9e38ab0a09f2ee
parent8264d43883171b6c0233ec9d2bdd17c614027e91 (diff)
downloaddesugar-c1cd3d1d1c4893c58f97479af51b1fff180e9d82.tar.gz
Add a flag (--only_desugar_javac9_for_lint) to disable desugaring lambda expressions for Android Lint.
RELNOTES: n/a -- PiperOrigin-RevId: 150378522 MOS_MIGRATED_REVID=150378522 GitOrigin-RevId: 5ab0ec5a285547749f51779530c0f75b857553ed Change-Id: I3fe45f8ce4c5d2b7b66c2d9b2e6d9adbe812b1c5
-rw-r--r--java/com/google/devtools/build/android/desugar/Desugar.java47
-rw-r--r--java/com/google/devtools/build/android/desugar/LambdaClassMaker.java2
2 files changed, 34 insertions, 15 deletions
diff --git a/java/com/google/devtools/build/android/desugar/Desugar.java b/java/com/google/devtools/build/android/desugar/Desugar.java
index 6f9e0f0..1498782 100644
--- a/java/com/google/devtools/build/android/desugar/Desugar.java
+++ b/java/com/google/devtools/build/android/desugar/Desugar.java
@@ -18,6 +18,7 @@ import static java.nio.charset.StandardCharsets.ISO_8859_1;
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.io.ByteStreams;
import com.google.devtools.build.android.Converters.ExistingPathConverter;
@@ -96,6 +97,15 @@ class Desugar {
public boolean allowEmptyBootclasspath;
@Option(
+ name = "only_desugar_javac9_for_lint",
+ defaultValue = "false",
+ help =
+ "A temporary flag specifically for android lint, subject to removal anytime (DO NOT USE)",
+ category = "undocumented"
+ )
+ public boolean onlyDesugarJavac9ForLint;
+
+ @Option(
name = "output",
allowMultiple = true,
defaultValue = "",
@@ -217,15 +227,19 @@ class Desugar {
CoreLibraryRewriter.UnprefixingClassWriter writer =
rewriter.writer(ClassWriter.COMPUTE_MAXS /*for bridge methods*/);
ClassVisitor visitor = writer;
- if (!allowDefaultMethods) {
- visitor = new Java7Compatibility(visitor, readerFactory);
+ if (!options.onlyDesugarJavac9ForLint) {
+ if (!allowDefaultMethods) {
+ visitor = new Java7Compatibility(visitor, readerFactory);
+ }
+
+ visitor =
+ new LambdaDesugaring(
+ visitor,
+ loader,
+ lambdas,
+ interfaceLambdaMethodCollector,
+ allowDefaultMethods);
}
-
- visitor =
- new LambdaDesugaring(
- visitor, loader, lambdas, interfaceLambdaMethodCollector,
- allowDefaultMethods);
-
if (!allowCallsToObjectsNonNull) {
visitor = new ObjectsRequireNonNullMethodInliner(visitor);
}
@@ -244,14 +258,19 @@ class Desugar {
}
ImmutableSet<String> interfaceLambdaMethods = interfaceLambdaMethodCollector.build();
- if (allowDefaultMethods) {
- checkState(
- interfaceLambdaMethods.isEmpty(),
- "Desugaring with default methods enabled moved interface lambdas");
- }
+
+ checkState(
+ !allowDefaultMethods || interfaceLambdaMethods.isEmpty(),
+ "Desugaring with default methods enabled moved interface lambdas");
// Write out the lambda classes we generated along the way
- for (Map.Entry<Path, LambdaInfo> lambdaClass : lambdas.drain().entrySet()) {
+ ImmutableMap<Path, LambdaInfo> lambdaClasses = lambdas.drain();
+ checkState(
+ !options.onlyDesugarJavac9ForLint || lambdaClasses.isEmpty(),
+ "There should be no lambda classes generated: %s",
+ lambdaClasses.keySet());
+
+ for (Map.Entry<Path, LambdaInfo> lambdaClass : lambdaClasses.entrySet()) {
try (InputStream bytecode =
Files.newInputStream(dumpDirectory.resolve(lambdaClass.getKey()))) {
ClassReader reader = rewriter.reader(bytecode);
diff --git a/java/com/google/devtools/build/android/desugar/LambdaClassMaker.java b/java/com/google/devtools/build/android/desugar/LambdaClassMaker.java
index 2a9f9be..155e323 100644
--- a/java/com/google/devtools/build/android/desugar/LambdaClassMaker.java
+++ b/java/com/google/devtools/build/android/desugar/LambdaClassMaker.java
@@ -57,7 +57,7 @@ class LambdaClassMaker {
* Returns absolute paths to .class files generated since the last call to this method together
* with a string descriptor of the factory method.
*/
- public Map<Path, LambdaInfo> drain() {
+ public ImmutableMap<Path, LambdaInfo> drain() {
ImmutableMap<Path, LambdaInfo> result = ImmutableMap.copyOf(generatedClasses);
generatedClasses.clear();
return result;