Add @SuppressWarnings annotation
This only adds @SuppressWarnings annotation definition so that the AIDL
compiler understands it but does nothing about it yet.
The annotation has a single parameter named `value` of `String[]` type.
@SuppressWarnings(value={".."})
It will suppress warnings(listed in `value` parameter) within the scope
of the annotated node.
Bug: 168028537
Test: aidl_unittests
Change-Id: Ic6bf4b023e882c8c97e0aeb629598bab6caf84de
diff --git a/aidl_checkapi.cpp b/aidl_checkapi.cpp
index b54ddbb..2b5664a 100644
--- a/aidl_checkapi.cpp
+++ b/aidl_checkapi.cpp
@@ -59,6 +59,7 @@
AidlAnnotation::Type::BACKING,
// @RustDerive doesn't affect read/write
AidlAnnotation::Type::RUST_DERIVE,
+ AidlAnnotation::Type::SUPPRESS_WARNINGS,
};
vector<string> annotations;
for (const AidlAnnotation& annotation : node.GetAnnotations()) {
diff --git a/aidl_language.cpp b/aidl_language.cpp
index 5a69809..350b4c1 100644
--- a/aidl_language.cpp
+++ b/aidl_language.cpp
@@ -110,6 +110,7 @@
}
static const AidlTypeSpecifier kStringType{AIDL_LOCATION_HERE, "String", false, nullptr, ""};
+static const AidlTypeSpecifier kStringArrayType{AIDL_LOCATION_HERE, "String", true, nullptr, ""};
static const AidlTypeSpecifier kIntType{AIDL_LOCATION_HERE, "int", false, nullptr, ""};
static const AidlTypeSpecifier kLongType{AIDL_LOCATION_HERE, "long", false, nullptr, ""};
static const AidlTypeSpecifier kBooleanType{AIDL_LOCATION_HERE, "boolean", false, nullptr, ""};
@@ -153,6 +154,11 @@
{"Eq", kBooleanType},
{"Hash", kBooleanType}},
false},
+ {AidlAnnotation::Type::SUPPRESS_WARNINGS,
+ "SuppressWarnings",
+ {{"value", kStringArrayType}},
+ false,
+ {"value"}},
};
return kSchemas;
}
@@ -348,6 +354,16 @@
return GetAnnotation(annotations_, AidlAnnotation::Type::BACKING);
}
+std::vector<std::string> AidlAnnotatable::SuppressWarnings() const {
+ auto annot = GetAnnotation(annotations_, AidlAnnotation::Type::SUPPRESS_WARNINGS);
+ if (annot) {
+ auto names = annot->ParamValue<std::vector<std::string>>("value");
+ AIDL_FATAL_IF(!names.has_value(), this);
+ return std::move(names.value());
+ }
+ return {};
+}
+
bool AidlAnnotatable::IsStableApiParcelable(Options::Language lang) const {
return lang == Options::Language::JAVA &&
GetAnnotation(annotations_, AidlAnnotation::Type::JAVA_STABLE_PARCELABLE);
@@ -489,11 +505,15 @@
}
std::set<AidlAnnotation::Type> AidlTypeSpecifier::GetSupportedAnnotations() const {
- // kHide and kUnsupportedAppUsage are both method return annotations
- // which we don't distinguish from other type specifiers.
- return {AidlAnnotation::Type::NULLABLE, AidlAnnotation::Type::UTF8_IN_CPP,
- AidlAnnotation::Type::UNSUPPORTED_APP_USAGE, AidlAnnotation::Type::HIDE,
- AidlAnnotation::Type::JAVA_PASSTHROUGH};
+ // TODO(b/151102494) we don't distinguish field-level annotations from other type specifiers.
+ return {
+ AidlAnnotation::Type::NULLABLE,
+ AidlAnnotation::Type::UTF8_IN_CPP,
+ AidlAnnotation::Type::JAVA_PASSTHROUGH,
+ AidlAnnotation::Type::UNSUPPORTED_APP_USAGE, // field-level annotation
+ AidlAnnotation::Type::HIDE, // field-level annotation
+ AidlAnnotation::Type::SUPPRESS_WARNINGS, // field-level annotation
+ };
}
bool AidlTypeSpecifier::CheckValid(const AidlTypenames& typenames) const {
@@ -1018,14 +1038,17 @@
}
std::set<AidlAnnotation::Type> AidlStructuredParcelable::GetSupportedAnnotations() const {
- return {AidlAnnotation::Type::VINTF_STABILITY,
- AidlAnnotation::Type::UNSUPPORTED_APP_USAGE,
- AidlAnnotation::Type::HIDE,
- AidlAnnotation::Type::JAVA_PASSTHROUGH,
- AidlAnnotation::Type::JAVA_DERIVE,
- AidlAnnotation::Type::JAVA_ONLY_IMMUTABLE,
- AidlAnnotation::Type::FIXED_SIZE,
- AidlAnnotation::Type::RUST_DERIVE};
+ return {
+ AidlAnnotation::Type::VINTF_STABILITY,
+ AidlAnnotation::Type::UNSUPPORTED_APP_USAGE,
+ AidlAnnotation::Type::HIDE,
+ AidlAnnotation::Type::JAVA_PASSTHROUGH,
+ AidlAnnotation::Type::JAVA_DERIVE,
+ AidlAnnotation::Type::JAVA_ONLY_IMMUTABLE,
+ AidlAnnotation::Type::FIXED_SIZE,
+ AidlAnnotation::Type::RUST_DERIVE,
+ AidlAnnotation::Type::SUPPRESS_WARNINGS,
+ };
}
bool AidlStructuredParcelable::CheckValid(const AidlTypenames& typenames,
@@ -1240,8 +1263,13 @@
}
std::set<AidlAnnotation::Type> AidlEnumDeclaration::GetSupportedAnnotations() const {
- return {AidlAnnotation::Type::VINTF_STABILITY, AidlAnnotation::Type::BACKING,
- AidlAnnotation::Type::HIDE, AidlAnnotation::Type::JAVA_PASSTHROUGH};
+ return {
+ AidlAnnotation::Type::VINTF_STABILITY,
+ AidlAnnotation::Type::BACKING,
+ AidlAnnotation::Type::HIDE,
+ AidlAnnotation::Type::JAVA_PASSTHROUGH,
+ AidlAnnotation::Type::SUPPRESS_WARNINGS,
+ };
}
bool AidlEnumDeclaration::CheckValid(const AidlTypenames& typenames,
@@ -1297,9 +1325,12 @@
: AidlParcelable(location, name, package, comments, "" /*cpp_header*/, type_params, members) {}
std::set<AidlAnnotation::Type> AidlUnionDecl::GetSupportedAnnotations() const {
- return {AidlAnnotation::Type::VINTF_STABILITY, AidlAnnotation::Type::HIDE,
- AidlAnnotation::Type::JAVA_PASSTHROUGH, AidlAnnotation::Type::JAVA_DERIVE,
- AidlAnnotation::Type::JAVA_ONLY_IMMUTABLE, AidlAnnotation::Type::RUST_DERIVE};
+ return {
+ AidlAnnotation::Type::VINTF_STABILITY, AidlAnnotation::Type::HIDE,
+ AidlAnnotation::Type::JAVA_PASSTHROUGH, AidlAnnotation::Type::JAVA_DERIVE,
+ AidlAnnotation::Type::JAVA_ONLY_IMMUTABLE, AidlAnnotation::Type::RUST_DERIVE,
+ AidlAnnotation::Type::SUPPRESS_WARNINGS,
+ };
}
void AidlUnionDecl::Dump(CodeWriter* writer) const {
@@ -1435,9 +1466,12 @@
}
std::set<AidlAnnotation::Type> AidlInterface::GetSupportedAnnotations() const {
- return {AidlAnnotation::Type::SENSITIVE_DATA, AidlAnnotation::Type::VINTF_STABILITY,
- AidlAnnotation::Type::UNSUPPORTED_APP_USAGE, AidlAnnotation::Type::HIDE,
- AidlAnnotation::Type::JAVA_PASSTHROUGH, AidlAnnotation::Type::DESCRIPTOR};
+ return {
+ AidlAnnotation::Type::SENSITIVE_DATA, AidlAnnotation::Type::VINTF_STABILITY,
+ AidlAnnotation::Type::UNSUPPORTED_APP_USAGE, AidlAnnotation::Type::HIDE,
+ AidlAnnotation::Type::JAVA_PASSTHROUGH, AidlAnnotation::Type::DESCRIPTOR,
+ AidlAnnotation::Type::SUPPRESS_WARNINGS,
+ };
}
bool AidlInterface::CheckValid(const AidlTypenames& typenames, DiagnosticsContext& diag) const {
diff --git a/aidl_language.h b/aidl_language.h
index 9bcbaa9..112c6dc 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -171,6 +171,7 @@
FIXED_SIZE,
DESCRIPTOR,
RUST_DERIVE,
+ SUPPRESS_WARNINGS,
};
static std::string TypeToString(Type type);
@@ -260,6 +261,7 @@
const AidlAnnotation* UnsupportedAppUsage() const;
const AidlAnnotation* RustDerive() const;
const AidlAnnotation* BackingType() const;
+ std::vector<std::string> SuppressWarnings() const;
// ToString is for dumping AIDL.
// Returns string representation of annotations.
diff --git a/aidl_unittest.cpp b/aidl_unittest.cpp
index e5fe9e9..f985575 100644
--- a/aidl_unittest.cpp
+++ b/aidl_unittest.cpp
@@ -43,6 +43,7 @@
using std::string;
using std::unique_ptr;
using std::vector;
+using testing::HasSubstr;
using testing::TestParamInfo;
using testing::internal::CaptureStderr;
using testing::internal::GetCapturedStderr;
@@ -420,51 +421,37 @@
TEST_P(AidlTest, RejectUnsupportedInterfaceAnnotations) {
AidlError error;
const string method = "package a; @nullable interface IFoo { int f(); }";
- const string expected_stderr =
- "ERROR: a/IFoo.aidl:1.21-31: 'nullable' is not a supported annotation for this node. "
- "It must be one of: Hide, UnsupportedAppUsage, VintfStability, SensitiveData, "
- "JavaPassthrough, Descriptor\n";
CaptureStderr();
EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, typenames_, GetLanguage(), &error));
- EXPECT_EQ(expected_stderr, GetCapturedStderr());
+ EXPECT_THAT(GetCapturedStderr(), HasSubstr("'nullable' is not a supported annotation"));
EXPECT_EQ(AidlError::BAD_TYPE, error);
}
TEST_P(AidlTest, RejectUnsupportedTypeAnnotations) {
AidlError error;
const string method = "package a; interface IFoo { @JavaOnlyStableParcelable int f(); }";
- const string expected_stderr =
- "ERROR: a/IFoo.aidl:1.54-58: 'JavaOnlyStableParcelable' is not a supported annotation "
- "for this node. It must be one of: Hide, UnsupportedAppUsage, nullable, utf8InCpp, JavaPassthrough\n";
CaptureStderr();
EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, typenames_, GetLanguage(), &error));
- EXPECT_EQ(expected_stderr, GetCapturedStderr());
+ EXPECT_THAT(GetCapturedStderr(),
+ HasSubstr("'JavaOnlyStableParcelable' is not a supported annotation"));
EXPECT_EQ(AidlError::BAD_TYPE, error);
}
TEST_P(AidlTest, RejectUnsupportedParcelableAnnotations) {
AidlError error;
const string method = "package a; @nullable parcelable IFoo cpp_header \"IFoo.h\";";
- const string expected_stderr =
- "ERROR: a/IFoo.aidl:1.32-37: 'nullable' is not a supported annotation for this node. "
- "It must be one of: Hide, JavaOnlyStableParcelable, UnsupportedAppUsage, VintfStability, "
- "JavaPassthrough, JavaOnlyImmutable\n";
CaptureStderr();
EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, typenames_, GetLanguage(), &error));
- EXPECT_EQ(expected_stderr, GetCapturedStderr());
+ EXPECT_THAT(GetCapturedStderr(), HasSubstr("'nullable' is not a supported annotation"));
EXPECT_EQ(AidlError::BAD_TYPE, error);
}
TEST_P(AidlTest, RejectUnsupportedParcelableDefineAnnotations) {
AidlError error;
const string method = "package a; @nullable parcelable IFoo { String a; String b; }";
- const string expected_stderr =
- "ERROR: a/IFoo.aidl:1.32-37: 'nullable' is not a supported annotation for this node. "
- "It must be one of: Hide, UnsupportedAppUsage, VintfStability, JavaPassthrough, JavaDerive, "
- "JavaOnlyImmutable, FixedSize, RustDerive\n";
CaptureStderr();
EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, typenames_, GetLanguage(), &error));
- EXPECT_EQ(expected_stderr, GetCapturedStderr());
+ EXPECT_THAT(GetCapturedStderr(), HasSubstr("'nullable' is not a supported annotation"));
EXPECT_EQ(AidlError::BAD_TYPE, error);
}
@@ -694,7 +681,8 @@
EXPECT_NE(0, ::android::aidl::compile_aidl(java_options, io_delegate_));
const std::string expected_stderr =
"ERROR: a/Foo.aidl:1.11-34: Parameter blah not supported for annotation JavaDerive.";
- EXPECT_THAT(GetCapturedStderr(), testing::HasSubstr(expected_stderr));
+ EXPECT_THAT(GetCapturedStderr(),
+ HasSubstr("Parameter blah not supported for annotation JavaDerive."));
}
{
@@ -702,11 +690,7 @@
Options java_options = Options::From("aidl --lang=java -o out a/IFoo.aidl");
CaptureStderr();
EXPECT_NE(0, ::android::aidl::compile_aidl(java_options, io_delegate_));
- const std::string expected_stderr =
- "ERROR: a/IFoo.aidl:1.23-33: 'JavaDerive' is not a supported annotation for this node. "
- "It must be one of: Hide, UnsupportedAppUsage, VintfStability, SensitiveData, "
- "JavaPassthrough, Descriptor\n";
- EXPECT_EQ(expected_stderr, GetCapturedStderr());
+ EXPECT_THAT(GetCapturedStderr(), HasSubstr("'JavaDerive' is not a supported annotation"));
}
{
@@ -714,10 +698,7 @@
Options java_options = Options::From("aidl --lang=java -o out a/IFoo.aidl");
CaptureStderr();
EXPECT_NE(0, ::android::aidl::compile_aidl(java_options, io_delegate_));
- const std::string expected_stderr =
- "ERROR: a/IFoo.aidl:1.28-33: 'JavaDerive' is not a supported annotation for this node. "
- "It must be one of: Backing, Hide, VintfStability, JavaPassthrough\n";
- EXPECT_EQ(expected_stderr, GetCapturedStderr());
+ EXPECT_THAT(GetCapturedStderr(), HasSubstr("'JavaDerive' is not a supported annotation"));
}
}