aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Chengnian Sun <cnsun@google.com>2017-03-16 22:38:28 +0000
committerGravatar Yun Peng <pcloudy@google.com>2017-03-17 12:26:19 +0000
commit5ab0ec5a285547749f51779530c0f75b857553ed (patch)
tree63efa1ba43f73c61d74b1540b16a8e2c51b5921f
parent2b88f62f223318b30b8f7ba9afe46e39c2030272 (diff)
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
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java47
-rw-r--r--src/tools/android/java/com/google/devtools/build/android/desugar/LambdaClassMaker.java2
2 files changed, 34 insertions, 15 deletions
diff --git a/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java b/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java
index 6f9e0f0167..1498782065 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/Desugar.java
+++ b/src/tools/android/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/src/tools/android/java/com/google/devtools/build/android/desugar/LambdaClassMaker.java b/src/tools/android/java/com/google/devtools/build/android/desugar/LambdaClassMaker.java
index 2a9f9beb80..155e3232fe 100644
--- a/src/tools/android/java/com/google/devtools/build/android/desugar/LambdaClassMaker.java
+++ b/src/tools/android/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;