Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f85eec84 authored by Adam Koski's avatar Adam Koski
Browse files

Fix conditional keep rules for new semantics

New conditional syntax is a logical AND, not OR. This means if a
resource should be conditionally kept by multiple ids, we need to
generate a separate rule for each condition (which will be interpreted
as OR).

Test: unit tests
Bug: 69341430
Change-Id: I0786c65561d36fbf43d181a2dfd0c7eaf1d96b8c
parent de3766e9
Loading
Loading
Loading
Loading
+9 −11
Original line number Diff line number Diff line
@@ -346,22 +346,20 @@ void WriteKeepSet(const KeepSet& keep_set, OutputStream* out) {
      can_be_conditional &= CollectLocations(location, keep_set, &locations);
    }

    for (const UsageLocation& location : entry.second) {
      printer.Print("# Referenced at ").Println(location.source.to_string());
    }
    if (keep_set.conditional_keep_rules_ && can_be_conditional) {
      printer.Println("-if class **.R$layout {");
      printer.Indent();
      for (const UsageLocation& location : locations) {
        printer.Print("int ")
        printer.Print("# Referenced at ").Println(location.source.to_string());
        printer.Print("-if class **.R$layout { int ")
            .Print(JavaClassGenerator::TransformToFieldName(location.name.entry))
            .Println(";");
            .Println("; }");
        printer.Print("-keep class ").Print(entry.first).Println(" { <init>(...); }");
      }
      printer.Undent();
      printer.Println("}");
      printer.Println();
    } else {
      for (const UsageLocation& location : entry.second) {
        printer.Print("# Referenced at ").Println(location.source.to_string());
      }
      printer.Print("-keep class ").Print(entry.first).Println(" { <init>(...); }");
    }
    printer.Println();
  }