diff options
author | Yohann Roussel <yroussel@google.com> | 2015-01-13 16:40:25 +0100 |
---|---|---|
committer | Yohann Roussel <yroussel@google.com> | 2015-01-16 09:39:59 +0100 |
commit | 1f0061a3fa5a7281240db61802cb55c509e0ecc9 (patch) | |
tree | f5ff7ab322b4b496f75190f3f986b69de354c951 | |
parent | 206485ee1f596637186a5af99da5ed0788d32551 (diff) | |
download | toolchain_jack-1f0061a3fa5a7281240db61802cb55c509e0ecc9.zip toolchain_jack-1f0061a3fa5a7281240db61802cb55c509e0ecc9.tar.gz toolchain_jack-1f0061a3fa5a7281240db61802cb55c509e0ecc9.tar.bz2 |
Add support for negate NAME in proguard files
The proguard flags allow negating name of classes with '!'.
This is allowed for the name of a class, the name of annotations
and the name of extended/implemented classes.
Bug: 18994882
Change-Id: Ibc7f7970f50f93efcfdcf0058dac2993276e90d4
25 files changed, 109 insertions, 9 deletions
diff --git a/jack-tests/tests/com/android/jack/shrob/AbstractTest.java b/jack-tests/tests/com/android/jack/shrob/AbstractTest.java index 07185c4..a6b0db3 100644 --- a/jack-tests/tests/com/android/jack/shrob/AbstractTest.java +++ b/jack-tests/tests/com/android/jack/shrob/AbstractTest.java @@ -228,6 +228,18 @@ public abstract class AbstractTest { } @Test + @Category(SlowTests.class) + public void test2_004() throws Exception { + runTest("002", "004", ""); + } + + @Test + @Category(SlowTests.class) + public void test2_005() throws Exception { + runTest("002", "005", ""); + } + + @Test public void test4_001() throws Exception { runTest("004", "001", ""); } @@ -452,6 +464,12 @@ public abstract class AbstractTest { } @Test + @Category(SlowTests.class) + public void test18_002() throws Exception { + runTest("018", "002", ""); + } + + @Test public void test19_001() throws Exception { runTest("019", "001", ""); } diff --git a/jack-tests/tests/com/android/jack/shrob/test002/proguard.flags004 b/jack-tests/tests/com/android/jack/shrob/test002/proguard.flags004 new file mode 100644 index 0000000..9df9ae7 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/proguard.flags004 @@ -0,0 +1 @@ +-keep class !com.android.jack.shrob.test002.jack.A
\ No newline at end of file diff --git a/jack-tests/tests/com/android/jack/shrob/test002/proguard.flags005 b/jack-tests/tests/com/android/jack/shrob/test002/proguard.flags005 new file mode 100644 index 0000000..7b4eb3e --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/proguard.flags005 @@ -0,0 +1,3 @@ +-keepclasseswithmembers class * { + @!*.NotOverride java.lang.String toString(); +}
\ No newline at end of file diff --git a/jack-tests/tests/com/android/jack/shrob/test002/refsFlattenPackage/expected-004.txt b/jack-tests/tests/com/android/jack/shrob/test002/refsFlattenPackage/expected-004.txt new file mode 100644 index 0000000..401c6ee --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/refsFlattenPackage/expected-004.txt @@ -0,0 +1,2 @@ +com.android.jack.shrob.test002.jack.B -> com.android.jack.shrob.test002.jack.B: + void <init>() -> <init> diff --git a/jack-tests/tests/com/android/jack/shrob/test002/refsFlattenPackage/expected-005.txt b/jack-tests/tests/com/android/jack/shrob/test002/refsFlattenPackage/expected-005.txt new file mode 100644 index 0000000..8dfebe7 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/refsFlattenPackage/expected-005.txt @@ -0,0 +1,3 @@ +com.android.jack.shrob.test002.jack.A -> com.android.jack.shrob.test002.jack.A: + void <init>() -> <init> + java.lang.String toString() -> toString diff --git a/jack-tests/tests/com/android/jack/shrob/test002/refsObfuscationWithMapping/expected-004.txt b/jack-tests/tests/com/android/jack/shrob/test002/refsObfuscationWithMapping/expected-004.txt new file mode 100644 index 0000000..401c6ee --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/refsObfuscationWithMapping/expected-004.txt @@ -0,0 +1,2 @@ +com.android.jack.shrob.test002.jack.B -> com.android.jack.shrob.test002.jack.B: + void <init>() -> <init> diff --git a/jack-tests/tests/com/android/jack/shrob/test002/refsObfuscationWithMapping/expected-005.txt b/jack-tests/tests/com/android/jack/shrob/test002/refsObfuscationWithMapping/expected-005.txt new file mode 100644 index 0000000..8dfebe7 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/refsObfuscationWithMapping/expected-005.txt @@ -0,0 +1,3 @@ +com.android.jack.shrob.test002.jack.A -> com.android.jack.shrob.test002.jack.A: + void <init>() -> <init> + java.lang.String toString() -> toString diff --git a/jack-tests/tests/com/android/jack/shrob/test002/refsObfuscationWithoutMapping/expected-004.txt b/jack-tests/tests/com/android/jack/shrob/test002/refsObfuscationWithoutMapping/expected-004.txt new file mode 100644 index 0000000..401c6ee --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/refsObfuscationWithoutMapping/expected-004.txt @@ -0,0 +1,2 @@ +com.android.jack.shrob.test002.jack.B -> com.android.jack.shrob.test002.jack.B: + void <init>() -> <init> diff --git a/jack-tests/tests/com/android/jack/shrob/test002/refsObfuscationWithoutMapping/expected-005.txt b/jack-tests/tests/com/android/jack/shrob/test002/refsObfuscationWithoutMapping/expected-005.txt new file mode 100644 index 0000000..8dfebe7 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/refsObfuscationWithoutMapping/expected-005.txt @@ -0,0 +1,3 @@ +com.android.jack.shrob.test002.jack.A -> com.android.jack.shrob.test002.jack.A: + void <init>() -> <init> + java.lang.String toString() -> toString diff --git a/jack-tests/tests/com/android/jack/shrob/test002/refsRepackageClasses/expected-004.txt b/jack-tests/tests/com/android/jack/shrob/test002/refsRepackageClasses/expected-004.txt new file mode 100644 index 0000000..401c6ee --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/refsRepackageClasses/expected-004.txt @@ -0,0 +1,2 @@ +com.android.jack.shrob.test002.jack.B -> com.android.jack.shrob.test002.jack.B: + void <init>() -> <init> diff --git a/jack-tests/tests/com/android/jack/shrob/test002/refsRepackageClasses/expected-005.txt b/jack-tests/tests/com/android/jack/shrob/test002/refsRepackageClasses/expected-005.txt new file mode 100644 index 0000000..8dfebe7 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/refsRepackageClasses/expected-005.txt @@ -0,0 +1,3 @@ +com.android.jack.shrob.test002.jack.A -> com.android.jack.shrob.test002.jack.A: + void <init>() -> <init> + java.lang.String toString() -> toString diff --git a/jack-tests/tests/com/android/jack/shrob/test002/refsSeed/expected-004.txt b/jack-tests/tests/com/android/jack/shrob/test002/refsSeed/expected-004.txt new file mode 100644 index 0000000..3c2dea2 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/refsSeed/expected-004.txt @@ -0,0 +1 @@ +com.android.jack.shrob.test002.jack.B diff --git a/jack-tests/tests/com/android/jack/shrob/test002/refsSeed/expected-005.txt b/jack-tests/tests/com/android/jack/shrob/test002/refsSeed/expected-005.txt new file mode 100644 index 0000000..8f6fee9 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/refsSeed/expected-005.txt @@ -0,0 +1,2 @@ +com.android.jack.shrob.test002.jack.A +com.android.jack.shrob.test002.jack.A: java.lang.String toString() diff --git a/jack-tests/tests/com/android/jack/shrob/test002/refsShrinking/expected-004.txt b/jack-tests/tests/com/android/jack/shrob/test002/refsShrinking/expected-004.txt new file mode 100644 index 0000000..6164464 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/refsShrinking/expected-004.txt @@ -0,0 +1,2 @@ +Lcom/android/jack/shrob/test002/jack/B;: +<init>()V diff --git a/jack-tests/tests/com/android/jack/shrob/test002/refsShrinking/expected-005.txt b/jack-tests/tests/com/android/jack/shrob/test002/refsShrinking/expected-005.txt new file mode 100644 index 0000000..0ebb156 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test002/refsShrinking/expected-005.txt @@ -0,0 +1,3 @@ +Lcom/android/jack/shrob/test002/jack/A;: +<init>()V +toString()Ljava/lang/String; diff --git a/jack-tests/tests/com/android/jack/shrob/test018/proguard.flags002 b/jack-tests/tests/com/android/jack/shrob/test018/proguard.flags002 new file mode 100644 index 0000000..8a20627 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test018/proguard.flags002 @@ -0,0 +1,4 @@ +-keep class * extends !java.io.DoesNotExist { + static final long serialVersionUID; + java.lang.Object o; +}
\ No newline at end of file diff --git a/jack-tests/tests/com/android/jack/shrob/test018/refsFlattenPackage/expected-002.txt b/jack-tests/tests/com/android/jack/shrob/test018/refsFlattenPackage/expected-002.txt new file mode 100644 index 0000000..fc808f3 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test018/refsFlattenPackage/expected-002.txt @@ -0,0 +1,5 @@ +com.android.jack.shrob.test018.jack.B -> com.android.jack.shrob.test018.jack.B: + void <init>() -> <init> +com.android.jack.shrob.test018.jack.A -> com.android.jack.shrob.test018.jack.A: + long serialVersionUID -> serialVersionUID + void <init>() -> <init> diff --git a/jack-tests/tests/com/android/jack/shrob/test018/refsObfuscationWithMapping/expected-002.txt b/jack-tests/tests/com/android/jack/shrob/test018/refsObfuscationWithMapping/expected-002.txt new file mode 100644 index 0000000..fc808f3 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test018/refsObfuscationWithMapping/expected-002.txt @@ -0,0 +1,5 @@ +com.android.jack.shrob.test018.jack.B -> com.android.jack.shrob.test018.jack.B: + void <init>() -> <init> +com.android.jack.shrob.test018.jack.A -> com.android.jack.shrob.test018.jack.A: + long serialVersionUID -> serialVersionUID + void <init>() -> <init> diff --git a/jack-tests/tests/com/android/jack/shrob/test018/refsObfuscationWithoutMapping/expected-002.txt b/jack-tests/tests/com/android/jack/shrob/test018/refsObfuscationWithoutMapping/expected-002.txt new file mode 100644 index 0000000..fc808f3 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test018/refsObfuscationWithoutMapping/expected-002.txt @@ -0,0 +1,5 @@ +com.android.jack.shrob.test018.jack.B -> com.android.jack.shrob.test018.jack.B: + void <init>() -> <init> +com.android.jack.shrob.test018.jack.A -> com.android.jack.shrob.test018.jack.A: + long serialVersionUID -> serialVersionUID + void <init>() -> <init> diff --git a/jack-tests/tests/com/android/jack/shrob/test018/refsRepackageClasses/expected-002.txt b/jack-tests/tests/com/android/jack/shrob/test018/refsRepackageClasses/expected-002.txt new file mode 100644 index 0000000..df4ffca --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test018/refsRepackageClasses/expected-002.txt @@ -0,0 +1,5 @@ +com.android.jack.shrob.test018.jack.A -> com.android.jack.shrob.test018.jack.A: + long serialVersionUID -> serialVersionUID + void <init>() -> <init> +com.android.jack.shrob.test018.jack.B -> com.android.jack.shrob.test018.jack.B: + void <init>() -> <init> diff --git a/jack-tests/tests/com/android/jack/shrob/test018/refsSeed/expected-002.txt b/jack-tests/tests/com/android/jack/shrob/test018/refsSeed/expected-002.txt new file mode 100644 index 0000000..0241b23 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test018/refsSeed/expected-002.txt @@ -0,0 +1,3 @@ +com.android.jack.shrob.test018.jack.A +com.android.jack.shrob.test018.jack.A: long serialVersionUID +com.android.jack.shrob.test018.jack.B diff --git a/jack-tests/tests/com/android/jack/shrob/test018/refsShrinking/expected-002.txt b/jack-tests/tests/com/android/jack/shrob/test018/refsShrinking/expected-002.txt new file mode 100644 index 0000000..857ce62 --- /dev/null +++ b/jack-tests/tests/com/android/jack/shrob/test018/refsShrinking/expected-002.txt @@ -0,0 +1,5 @@ +Lcom/android/jack/shrob/test018/jack/A;: +J serialVersionUID +<init>()V +Lcom/android/jack/shrob/test018/jack/B;: +<init>()V diff --git a/jack/src/com/android/jack/shrob/proguard/GrammarActions.java b/jack/src/com/android/jack/shrob/proguard/GrammarActions.java index ea42d1b..50fa5a6 100644 --- a/jack/src/com/android/jack/shrob/proguard/GrammarActions.java +++ b/jack/src/com/android/jack/shrob/proguard/GrammarActions.java @@ -232,19 +232,24 @@ public class GrammarActions { @Nonnull static InheritanceSpecification createInheritance( - /*@Nonnull*/ String className, @CheckForNull AnnotationSpecification annotationType) { + /*@Nonnull*/ String className, boolean hasNameNegator, + @CheckForNull AnnotationSpecification annotationType) { NameSpecification nameSpec = name(className); + nameSpec.setNegator(hasNameNegator); return new InheritanceSpecification(nameSpec, annotationType); } @Nonnull - static AnnotationSpecification annotation(/*@Nonnull*/ String annotationName) { - return new AnnotationSpecification(name(annotationName)); + static AnnotationSpecification annotation(/*@Nonnull*/ String annotationName, + boolean hasNameNegator) { + NameSpecification name = name(annotationName); + name.setNegator(hasNameNegator); + return new AnnotationSpecification(name); } @Nonnull static ClassSpecification classSpec(/* @Nonnull */ - String name, @Nonnull ClassTypeSpecification classType, /* @Nonnull */ + String name, boolean hasNameNegator, @Nonnull ClassTypeSpecification classType, /* @Nonnull */ AnnotationSpecification annotation, @Nonnull ModifierSpecification modifier) { NameSpecification nameSpec; if (name.equals("*")) { @@ -252,6 +257,7 @@ public class GrammarActions { } else { nameSpec = name(name); } + nameSpec.setNegator(hasNameNegator); ClassSpecification classSpec = new ClassSpecification(nameSpec, classType, annotation); classSpec.setModifier(modifier); return classSpec; diff --git a/jack/src/com/android/jack/shrob/proguard/Proguard.g b/jack/src/com/android/jack/shrob/proguard/Proguard.g index a021b68..bf8d374 100644 --- a/jack/src/com/android/jack/shrob/proguard/Proguard.g +++ b/jack/src/com/android/jack/shrob/proguard/Proguard.g @@ -139,11 +139,12 @@ private nonEmptytFilter [FilterSpecification filter] private classSpecification returns [ClassSpecification classSpec] @init{ ModifierSpecification modifier = new ModifierSpecification(); + boolean hasNameNegator = false; } : (annotation)? cType=classModifierAndType[modifier] - NAME {classSpec = GrammarActions.classSpec($NAME.text, cType, $annotation.annotSpec, modifier);} + (NEGATOR {hasNameNegator = true;})? NAME {classSpec = GrammarActions.classSpec($NAME.text, hasNameNegator, cType, $annotation.annotSpec, modifier);} (inheritanceSpec=inheritance {classSpec.setInheritance(inheritanceSpec);})? members[classSpec]? ; @@ -190,7 +191,10 @@ private member [ClassSpecification classSpec] ; private annotation returns [AnnotationSpecification annotSpec] - : '@' NAME {$annotSpec = GrammarActions.annotation($NAME.text);}; +@init{ + boolean hasNameNegator = false; +} + : '@' (NEGATOR {hasNameNegator = true;})? NAME {$annotSpec = GrammarActions.annotation($NAME.text, hasNameNegator);}; private modifiers returns [ModifierSpecification modifiers] @init{ @@ -224,9 +228,12 @@ private modifier [ModifierSpecification modifiers] ; private inheritance returns [InheritanceSpecification inheritanceSpec] +@init{ + boolean hasNameNegator = false; +} : ('extends' | 'implements') - annotation? NAME {inheritanceSpec = GrammarActions.createInheritance($NAME.text, $annotation.annotSpec);}; + annotation? (NEGATOR {hasNameNegator = true;})? NAME {inheritanceSpec = GrammarActions.createInheritance($NAME.text, hasNameNegator, $annotation.annotSpec);}; private arguments returns [String signature] : diff --git a/jack/src/com/android/jack/shrob/spec/NameSpecification.java b/jack/src/com/android/jack/shrob/spec/NameSpecification.java index d33c464..e6293f9 100644 --- a/jack/src/com/android/jack/shrob/spec/NameSpecification.java +++ b/jack/src/com/android/jack/shrob/spec/NameSpecification.java @@ -24,7 +24,7 @@ import javax.annotation.Nonnull; /** * Class representing the name of a field, method or class in a {@code class specification}. */ -public class NameSpecification implements Specification<String> { +public class NameSpecification extends SpecificationWithNegator<String> { @Nonnull private final Pattern name; @@ -32,8 +32,13 @@ public class NameSpecification implements Specification<String> { this.name = name; } + public NameSpecification(@Nonnull Pattern name, boolean negator) { + this.name = name; + setNegator(negator); + } + @Override - public boolean matches(@Nonnull String t) { + protected boolean matchesWithoutNegator(@Nonnull String t) { Matcher matcher = name.matcher(t); return matcher.find(); } |