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

Commit eab9e7f8 authored by Makoto Onuki's avatar Makoto Onuki
Browse files

Don't add API annotations in the internal R.java

I'm trying to enable a check for the following structure:
```
/** @hide */
public class Class1 {
    /** @hide */
    @SystemApi // Invalid because the class is hidden.
    public void method1() { }
}
```

The internal R.java file violates this, which this change is going to fix.

Bug: 159162473
Test: build (treehugger)
Test: atest aapt2_tests

Merged-in: I613e8611ddaf5f8e4761d351d4cd0142d59c7cc9
Change-Id: I613e8611ddaf5f8e4761d351d4cd0142d59c7cc9
parent bdc57bef
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1252,7 +1252,8 @@ class Linker {
      return false;
    }

    ClassDefinition::WriteJavaFile(manifest_class.get(), package_utf8, true, &fout);
    ClassDefinition::WriteJavaFile(manifest_class.get(), package_utf8, true,
                                   false /* strip_api_annotations */, &fout);
    fout.Flush();

    if (fout.HadError()) {
+4 −1
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ void AnnotationProcessor::AppendNewLine() {
  }
}

void AnnotationProcessor::Print(Printer* printer) const {
void AnnotationProcessor::Print(Printer* printer, bool strip_api_annotations) const {
  if (has_comments_) {
    std::string result = comment_.str();
    for (const StringPiece& line : util::Tokenize(result, '\n')) {
@@ -123,6 +123,9 @@ void AnnotationProcessor::Print(Printer* printer) const {
    printer->Println("@Deprecated");
  }

  if (strip_api_annotations) {
    return;
  }
  for (const AnnotationRule& rule : sAnnotationRules) {
    if (annotation_bit_mask_ & rule.bit_mask) {
      printer->Println(rule.annotation);
+1 −1
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ class AnnotationProcessor {
  void AppendNewLine();

  // Writes the comments and annotations to the Printer.
  void Print(text::Printer* printer) const;
  void Print(text::Printer* printer, bool strip_api_annotations = false) const;

 private:
  std::stringstream comment_;
+15 −0
Original line number Diff line number Diff line
@@ -76,6 +76,21 @@ TEST(AnnotationProcessorTest, EmitsTestApiAnnotationAndRemovesFromComment) {
  EXPECT_THAT(annotations, HasSubstr("This is a test API"));
}

TEST(AnnotationProcessorTest, NotEmitSystemApiAnnotation) {
  AnnotationProcessor processor;
  processor.AppendComment("@SystemApi This is a system API");

  std::string annotations;
  StringOutputStream out(&annotations);
  Printer printer(&out);
  processor.Print(&printer, true /* strip_api_annotations */);
  out.Flush();

  EXPECT_THAT(annotations, Not(HasSubstr("@android.annotation.SystemApi")));
  EXPECT_THAT(annotations, Not(HasSubstr("@SystemApi")));
  EXPECT_THAT(annotations, HasSubstr("This is a system API"));
}

TEST(AnnotationProcessor, ExtractsFirstSentence) {
  EXPECT_THAT(AnnotationProcessor::ExtractFirstSentence("This is the only sentence"),
              Eq("This is the only sentence"));
+8 −8
Original line number Diff line number Diff line
@@ -23,15 +23,15 @@ using ::android::StringPiece;

namespace aapt {

void ClassMember::Print(bool /*final*/, Printer* printer) const {
  processor_.Print(printer);
void ClassMember::Print(bool /*final*/, Printer* printer, bool strip_api_annotations) const {
  processor_.Print(printer, strip_api_annotations);
}

void MethodDefinition::AppendStatement(const StringPiece& statement) {
  statements_.push_back(statement.to_string());
}

void MethodDefinition::Print(bool final, Printer* printer) const {
void MethodDefinition::Print(bool final, Printer* printer, bool) const {
  printer->Print(signature_).Println(" {");
  printer->Indent();
  for (const auto& statement : statements_) {
@@ -74,12 +74,12 @@ bool ClassDefinition::empty() const {
  return true;
}

void ClassDefinition::Print(bool final, Printer* printer) const {
void ClassDefinition::Print(bool final, Printer* printer, bool strip_api_annotations) const {
  if (empty() && !create_if_empty_) {
    return;
  }

  ClassMember::Print(final, printer);
  ClassMember::Print(final,  printer, strip_api_annotations);

  printer->Print("public ");
  if (qualifier_ == ClassQualifier::kStatic) {
@@ -93,7 +93,7 @@ void ClassDefinition::Print(bool final, Printer* printer) const {
    // and takes precedence over a previous member with the same name. The overridden member is
    // set to nullptr.
    if (member != nullptr) {
      member->Print(final, printer);
      member->Print(final, printer, strip_api_annotations);
      printer->Println();
    }
  }
@@ -111,11 +111,11 @@ constexpr static const char* sWarningHeader =
    " */\n\n";

void ClassDefinition::WriteJavaFile(const ClassDefinition* def, const StringPiece& package,
                                    bool final, io::OutputStream* out) {
                                    bool final, bool strip_api_annotations, io::OutputStream* out) {
  Printer printer(out);
  printer.Print(sWarningHeader).Print("package ").Print(package).Println(";");
  printer.Println();
  def->Print(final, &printer);
  def->Print(final, &printer, strip_api_annotations);
}

}  // namespace aapt
Loading