Loading tools/aapt/Resource.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -2255,6 +2255,9 @@ static status_t writeLayoutClasses( if (comment.size() <= 0) { comment = getAttributeComment(assets, name8); } if (comment.contains(u"@removed")) { continue; } if (comment.size() > 0) { const char16_t* p = comment.string(); while (*p != 0 && *p != '.') { Loading tools/aapt2/java/JavaClassGenerator.cpp +18 −6 Original line number Diff line number Diff line Loading @@ -284,6 +284,13 @@ void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& package continue; } StringPiece16 attrCommentLine = entry.symbol->attribute->getComment(); if (attrCommentLine.contains(StringPiece16(u"@removed"))) { // Removed attributes are public but hidden from the documentation, so don't emit // them as part of the class documentation. continue; } const ResourceName& attrName = entry.attrRef->name.value(); styleableComment << "<tr><td>"; styleableComment << "<code>{@link #" Loading @@ -299,7 +306,6 @@ void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& package // Only use the comment up until the first '.'. This is to stay compatible with // the way old AAPT did it (presumably to keep it short and to avoid including // annotations like @hide which would affect this Styleable). StringPiece16 attrCommentLine = entry.symbol->attribute->getComment(); auto iter = std::find(attrCommentLine.begin(), attrCommentLine.end(), u'.'); if (iter != attrCommentLine.end()) { attrCommentLine = attrCommentLine.substr( Loading Loading @@ -348,6 +354,17 @@ void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& package continue; } StringPiece16 comment = styleableAttr.attrRef->getComment(); if (styleableAttr.symbol->attribute && comment.empty()) { comment = styleableAttr.symbol->attribute->getComment(); } if (comment.contains(StringPiece16(u"@removed"))) { // Removed attributes are public but hidden from the documentation, so don't emit them // as part of the class documentation. continue; } const ResourceName& attrName = styleableAttr.attrRef->name.value(); StringPiece16 packageName = attrName.package; Loading @@ -360,11 +377,6 @@ void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& package AnnotationProcessor* attrProcessor = indexMember->getCommentBuilder(); StringPiece16 comment = styleableAttr.attrRef->getComment(); if (styleableAttr.symbol->attribute && comment.empty()) { comment = styleableAttr.symbol->attribute->getComment(); } if (!comment.empty()) { attrProcessor->appendComment("<p>\n@attr description"); attrProcessor->appendComment(comment); Loading tools/aapt2/java/JavaClassGenerator_test.cpp +33 −0 Original line number Diff line number Diff line Loading @@ -289,4 +289,37 @@ TEST(JavaClassGeneratorTest, CommentsForStyleablesAndNestedAttributesArePresent) EXPECT_NE(std::string::npos, actual.find(util::utf16ToUtf8(styleable.getComment()))); } TEST(JavaClassGeneratorTest, CommentsForRemovedAttributesAreNotPresentInClass) { Attribute attr(false); attr.setComment(StringPiece16(u"@removed")); std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder() .setPackageId(u"android", 0x01) .addValue(u"@android:attr/one", util::make_unique<Attribute>(attr)) .build(); std::unique_ptr<IAaptContext> context = test::ContextBuilder() .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get())) .setNameManglerPolicy(NameManglerPolicy{ u"android" }) .build(); JavaClassGeneratorOptions options; options.useFinal = false; JavaClassGenerator generator(context.get(), table.get(), options); std::stringstream out; ASSERT_TRUE(generator.generate(u"android", &out)); std::string actual = out.str(); std::cout << actual << std::endl; EXPECT_EQ(std::string::npos, actual.find("@attr name android:one")); EXPECT_EQ(std::string::npos, actual.find("@attr description")); // We should find @removed only in the attribute javadoc and not anywhere else (i.e. the class // javadoc). const size_t pos = actual.find("@removed"); EXPECT_NE(std::string::npos, pos); EXPECT_EQ(std::string::npos, actual.find("@removed", pos + 1)); } } // namespace aapt tools/aapt2/util/StringPiece.h +22 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ public: bool empty() const; std::basic_string<TChar> toString() const; bool contains(const BasicStringPiece<TChar>& rhs) const; int compare(const BasicStringPiece<TChar>& rhs) const; bool operator<(const BasicStringPiece<TChar>& rhs) const; bool operator>(const BasicStringPiece<TChar>& rhs) const; Loading Loading @@ -163,6 +164,17 @@ inline std::basic_string<TChar> BasicStringPiece<TChar>::toString() const { return std::basic_string<TChar>(mData, mLength); } template <> inline bool BasicStringPiece<char>::contains(const BasicStringPiece<char>& rhs) const { if (!mData || !rhs.mData) { return false; } if (rhs.mLength > mLength) { return false; } return strstr(mData, rhs.mData) != nullptr; } template <> inline int BasicStringPiece<char>::compare(const BasicStringPiece<char>& rhs) const { const char nullStr = '\0'; Loading @@ -185,6 +197,16 @@ inline ::std::ostream& operator<<(::std::ostream& out, const BasicStringPiece<ch return out.write(utf8.string(), utf8.size()); } template <> inline bool BasicStringPiece<char16_t>::contains(const BasicStringPiece<char16_t>& rhs) const { if (!mData || !rhs.mData) { return false; } if (rhs.mLength > mLength) { return false; } return strstr16(mData, rhs.mData) != nullptr; } template <> inline int BasicStringPiece<char16_t>::compare(const BasicStringPiece<char16_t>& rhs) const { Loading tools/aapt2/util/StringPiece_test.cpp +32 −0 Original line number Diff line number Diff line Loading @@ -59,4 +59,36 @@ TEST(StringPieceTest, PiecesHaveCorrectSortOrderUtf8) { EXPECT_TRUE(StringPiece(car) > banana); } TEST(StringPieceTest, ContainsOtherStringPiece) { StringPiece text("I am a leaf on the wind."); StringPiece startNeedle("I am"); StringPiece endNeedle("wind."); StringPiece middleNeedle("leaf"); StringPiece emptyNeedle(""); StringPiece missingNeedle("soar"); StringPiece longNeedle("This string is longer than the text."); EXPECT_TRUE(text.contains(startNeedle)); EXPECT_TRUE(text.contains(endNeedle)); EXPECT_TRUE(text.contains(middleNeedle)); EXPECT_TRUE(text.contains(emptyNeedle)); EXPECT_FALSE(text.contains(missingNeedle)); EXPECT_FALSE(text.contains(longNeedle)); StringPiece16 text16(u"I am a leaf on the wind."); StringPiece16 startNeedle16(u"I am"); StringPiece16 endNeedle16(u"wind."); StringPiece16 middleNeedle16(u"leaf"); StringPiece16 emptyNeedle16(u""); StringPiece16 missingNeedle16(u"soar"); StringPiece16 longNeedle16(u"This string is longer than the text."); EXPECT_TRUE(text16.contains(startNeedle16)); EXPECT_TRUE(text16.contains(endNeedle16)); EXPECT_TRUE(text16.contains(middleNeedle16)); EXPECT_TRUE(text16.contains(emptyNeedle16)); EXPECT_FALSE(text16.contains(missingNeedle16)); EXPECT_FALSE(text16.contains(longNeedle16)); } } // namespace aapt Loading
tools/aapt/Resource.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -2255,6 +2255,9 @@ static status_t writeLayoutClasses( if (comment.size() <= 0) { comment = getAttributeComment(assets, name8); } if (comment.contains(u"@removed")) { continue; } if (comment.size() > 0) { const char16_t* p = comment.string(); while (*p != 0 && *p != '.') { Loading
tools/aapt2/java/JavaClassGenerator.cpp +18 −6 Original line number Diff line number Diff line Loading @@ -284,6 +284,13 @@ void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& package continue; } StringPiece16 attrCommentLine = entry.symbol->attribute->getComment(); if (attrCommentLine.contains(StringPiece16(u"@removed"))) { // Removed attributes are public but hidden from the documentation, so don't emit // them as part of the class documentation. continue; } const ResourceName& attrName = entry.attrRef->name.value(); styleableComment << "<tr><td>"; styleableComment << "<code>{@link #" Loading @@ -299,7 +306,6 @@ void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& package // Only use the comment up until the first '.'. This is to stay compatible with // the way old AAPT did it (presumably to keep it short and to avoid including // annotations like @hide which would affect this Styleable). StringPiece16 attrCommentLine = entry.symbol->attribute->getComment(); auto iter = std::find(attrCommentLine.begin(), attrCommentLine.end(), u'.'); if (iter != attrCommentLine.end()) { attrCommentLine = attrCommentLine.substr( Loading Loading @@ -348,6 +354,17 @@ void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& package continue; } StringPiece16 comment = styleableAttr.attrRef->getComment(); if (styleableAttr.symbol->attribute && comment.empty()) { comment = styleableAttr.symbol->attribute->getComment(); } if (comment.contains(StringPiece16(u"@removed"))) { // Removed attributes are public but hidden from the documentation, so don't emit them // as part of the class documentation. continue; } const ResourceName& attrName = styleableAttr.attrRef->name.value(); StringPiece16 packageName = attrName.package; Loading @@ -360,11 +377,6 @@ void JavaClassGenerator::addMembersToStyleableClass(const StringPiece16& package AnnotationProcessor* attrProcessor = indexMember->getCommentBuilder(); StringPiece16 comment = styleableAttr.attrRef->getComment(); if (styleableAttr.symbol->attribute && comment.empty()) { comment = styleableAttr.symbol->attribute->getComment(); } if (!comment.empty()) { attrProcessor->appendComment("<p>\n@attr description"); attrProcessor->appendComment(comment); Loading
tools/aapt2/java/JavaClassGenerator_test.cpp +33 −0 Original line number Diff line number Diff line Loading @@ -289,4 +289,37 @@ TEST(JavaClassGeneratorTest, CommentsForStyleablesAndNestedAttributesArePresent) EXPECT_NE(std::string::npos, actual.find(util::utf16ToUtf8(styleable.getComment()))); } TEST(JavaClassGeneratorTest, CommentsForRemovedAttributesAreNotPresentInClass) { Attribute attr(false); attr.setComment(StringPiece16(u"@removed")); std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder() .setPackageId(u"android", 0x01) .addValue(u"@android:attr/one", util::make_unique<Attribute>(attr)) .build(); std::unique_ptr<IAaptContext> context = test::ContextBuilder() .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get())) .setNameManglerPolicy(NameManglerPolicy{ u"android" }) .build(); JavaClassGeneratorOptions options; options.useFinal = false; JavaClassGenerator generator(context.get(), table.get(), options); std::stringstream out; ASSERT_TRUE(generator.generate(u"android", &out)); std::string actual = out.str(); std::cout << actual << std::endl; EXPECT_EQ(std::string::npos, actual.find("@attr name android:one")); EXPECT_EQ(std::string::npos, actual.find("@attr description")); // We should find @removed only in the attribute javadoc and not anywhere else (i.e. the class // javadoc). const size_t pos = actual.find("@removed"); EXPECT_NE(std::string::npos, pos); EXPECT_EQ(std::string::npos, actual.find("@removed", pos + 1)); } } // namespace aapt
tools/aapt2/util/StringPiece.h +22 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ public: bool empty() const; std::basic_string<TChar> toString() const; bool contains(const BasicStringPiece<TChar>& rhs) const; int compare(const BasicStringPiece<TChar>& rhs) const; bool operator<(const BasicStringPiece<TChar>& rhs) const; bool operator>(const BasicStringPiece<TChar>& rhs) const; Loading Loading @@ -163,6 +164,17 @@ inline std::basic_string<TChar> BasicStringPiece<TChar>::toString() const { return std::basic_string<TChar>(mData, mLength); } template <> inline bool BasicStringPiece<char>::contains(const BasicStringPiece<char>& rhs) const { if (!mData || !rhs.mData) { return false; } if (rhs.mLength > mLength) { return false; } return strstr(mData, rhs.mData) != nullptr; } template <> inline int BasicStringPiece<char>::compare(const BasicStringPiece<char>& rhs) const { const char nullStr = '\0'; Loading @@ -185,6 +197,16 @@ inline ::std::ostream& operator<<(::std::ostream& out, const BasicStringPiece<ch return out.write(utf8.string(), utf8.size()); } template <> inline bool BasicStringPiece<char16_t>::contains(const BasicStringPiece<char16_t>& rhs) const { if (!mData || !rhs.mData) { return false; } if (rhs.mLength > mLength) { return false; } return strstr16(mData, rhs.mData) != nullptr; } template <> inline int BasicStringPiece<char16_t>::compare(const BasicStringPiece<char16_t>& rhs) const { Loading
tools/aapt2/util/StringPiece_test.cpp +32 −0 Original line number Diff line number Diff line Loading @@ -59,4 +59,36 @@ TEST(StringPieceTest, PiecesHaveCorrectSortOrderUtf8) { EXPECT_TRUE(StringPiece(car) > banana); } TEST(StringPieceTest, ContainsOtherStringPiece) { StringPiece text("I am a leaf on the wind."); StringPiece startNeedle("I am"); StringPiece endNeedle("wind."); StringPiece middleNeedle("leaf"); StringPiece emptyNeedle(""); StringPiece missingNeedle("soar"); StringPiece longNeedle("This string is longer than the text."); EXPECT_TRUE(text.contains(startNeedle)); EXPECT_TRUE(text.contains(endNeedle)); EXPECT_TRUE(text.contains(middleNeedle)); EXPECT_TRUE(text.contains(emptyNeedle)); EXPECT_FALSE(text.contains(missingNeedle)); EXPECT_FALSE(text.contains(longNeedle)); StringPiece16 text16(u"I am a leaf on the wind."); StringPiece16 startNeedle16(u"I am"); StringPiece16 endNeedle16(u"wind."); StringPiece16 middleNeedle16(u"leaf"); StringPiece16 emptyNeedle16(u""); StringPiece16 missingNeedle16(u"soar"); StringPiece16 longNeedle16(u"This string is longer than the text."); EXPECT_TRUE(text16.contains(startNeedle16)); EXPECT_TRUE(text16.contains(endNeedle16)); EXPECT_TRUE(text16.contains(middleNeedle16)); EXPECT_TRUE(text16.contains(emptyNeedle16)); EXPECT_FALSE(text16.contains(missingNeedle16)); EXPECT_FALSE(text16.contains(longNeedle16)); } } // namespace aapt