blob: 9760fe43c40a691af59a04085fe8249e1bcc7d9e [file] [log] [blame]
// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
syntax = "proto3";
package com.android.tools.r8.keepanno.proto;
// All messages are placed under the outer class. This makes it a bit nicer to
// implement the AST <-> Proto conversions without type conflicts.
option java_multiple_files = false;
// Camel-case the outer class name (default is `Keepspec`).
option java_outer_classname = "KeepSpecProtos";
// Java package consistent with R8 convention.
option java_package = "com.android.tools.r8.keepanno.proto";
// Top-level container for the keep specification
message KeepSpec {
Version version = 1;
repeated Declaration declarations = 2;
}
message Version {
uint32 major = 1;
uint32 minor = 2;
uint32 patch = 3;
}
message Declaration {
oneof decl_oneof {
Edge edge = 2;
Check check = 3;
}
}
// Note: the messages and fields avoid the use of `descriptor` in any place as
// that name is used internally in the protobuf encodings. We consistently use
// the short-form `desc` throughout.
message Context {
oneof context_oneof {
TypeDesc class_desc = 1;
MethodDesc method_desc = 2;
FieldDesc field_desc = 3;
}
}
message TypeDesc {
string desc = 1;
}
message MethodDesc {
string name = 1;
TypeDesc holder = 2;
TypeDesc return_type = 3;
repeated TypeDesc parameter_types = 4;
}
message FieldDesc {
string name = 1;
TypeDesc holder = 2;
TypeDesc field_type = 3;
}
message MetaInfo {
optional Context context = 1;
optional string description = 2;
}
enum CheckKind {
CHECK_UNSPECIFIED = 0;
CHECK_REMOVED = 1;
CHECK_OPTIMIZED_OUT = 2;
}
message Check {
optional MetaInfo meta_info = 1;
CheckKind kind = 2;
Bindings bindings = 3;
BindingReference item = 4;
}
message Edge {
MetaInfo meta_info = 1;
Bindings bindings = 2;
repeated Condition preconditions = 3;
repeated Target consequences = 4;
}
message Bindings {
repeated Binding bindings = 1;
}
message Binding {
string name = 1;
ItemPattern item = 2;
}
message BindingReference {
string name = 1;
}
message Condition {
BindingReference item = 1;
}
message Target {
BindingReference item = 1;
optional Constraints constraints = 2;
repeated Constraint constraint_additions = 3;
}
message Constraints {
repeated Constraint constraints = 1;
}
enum ConstraintElement {
CONSTRAINT_UNSPECIFIED = 0;
CONSTRAINT_LOOKUP = 1;
CONSTRAINT_NAME = 2;
CONSTRAINT_VISIBILITY_RELAX = 3;
CONSTRAINT_VISIBILITY_RESTRICT = 4;
CONSTRAINT_NEVER_INLINE = 5;
CONSTRAINT_CLASS_INSTANTIATE = 6;
CONSTRAINT_CLASS_OPEN_HIERARCHY = 7;
CONSTRAINT_METHOD_INVOKE = 8;
CONSTRAINT_METHOD_REPLACE = 9;
CONSTRAINT_FIELD_GET = 10;
CONSTRAINT_FIELD_SET = 11;
CONSTRAINT_FIELD_REPLACE = 12;
CONSTRAINT_GENERIC_SIGNATURE = 13;
}
message AnnotationPattern {
optional AnnotationRetention retention = 1;
optional ClassNamePattern name = 2;
}
enum AnnotationRetention {
RETENTION_UNSPECIFIED = 0;
RETENTION_RUNTIME = 1;
RETENTION_CLASS = 2;
}
message Constraint {
oneof constraint_oneof {
ConstraintElement element = 1;
AnnotationPattern annotation = 2;
}
}
message ItemPattern {
oneof item_oneof {
ClassItemPattern class_item = 1;
MemberItemPattern member_item = 2;
}
}
message ClassItemPattern {
optional ClassPattern class_pattern = 1;
optional AnnotatedByPattern annotated_by = 2;
}
message ClassPattern {
optional ClassNamePattern class_name = 1;
optional InstanceOfPattern instance_of = 2;
}
message InstanceOfPattern {
optional bool inclusive = 1;
optional ClassNamePattern class_name = 2;
}
message ClassNamePattern {
optional PackagePattern package = 1;
optional UnqualifiedNamePattern unqualified_name = 2;
}
message PackagePattern {
// No components matches any package.
repeated PackageComponentPattern components = 1;
}
message PackageComponentPattern {
// An absent single component matches any number of components.
optional StringPattern single_component = 1;
}
message StringPattern {
// The string pattern is split in two so that we can distinguish the exact
// empty string, from the inexact patterns.
oneof pattern_oneof {
// Unset oneof denotes any type.
string exact = 1;
StringPatternInexact inexact = 2;
}
}
message StringPatternInexact {
optional string prefix = 2;
optional string suffix = 3;
}
message UnqualifiedNamePattern {
optional StringPattern name = 1;
}
message AnnotatedByPattern {
optional ClassNamePattern name = 1;
}
message MemberItemPattern {
BindingReference class_reference = 1;
optional MemberPattern member_pattern = 2;
}
message MemberPattern {
oneof member_oneof {
MemberPatternGeneral general_member = 1;
MemberPatternField field_member = 2;
MemberPatternMethod method_member = 3;
}
}
enum AccessVisibility {
ACCESS_UNSPECIFIED = 0;
ACCESS_PUBLIC = 1;
ACCESS_PROTECTED = 2;
ACCESS_PACKAGE_PRIVATE = 3;
ACCESS_PRIVATE = 4;
}
message AccessVisibilitySet {
repeated AccessVisibility access_visibility = 1;
}
// Placeholder for an optional boolean modifier.
// The optional value is encoded by it not being present at the reference point.
message ModifierPattern {
bool value = 1;
}
message MemberAccessGeneral {
optional AccessVisibilitySet access_visibility = 1;
optional ModifierPattern static_pattern = 2;
optional ModifierPattern final_pattern = 3;
optional ModifierPattern synthetic_pattern = 4;
}
message MemberAccessField {
optional MemberAccessGeneral general_access = 1;
optional ModifierPattern volatile_pattern = 2;
optional ModifierPattern transient_pattern = 3;
}
message MemberAccessMethod {
optional MemberAccessGeneral general_access = 1;
optional ModifierPattern synchronized_pattern = 2;
optional ModifierPattern bridge_pattern = 3;
optional ModifierPattern native_pattern = 4;
optional ModifierPattern abstract_pattern = 5;
optional ModifierPattern strict_fp_pattern = 6;
}
message MemberPatternGeneral {
optional MemberAccessGeneral access = 1;
optional AnnotatedByPattern annotated_by = 2;
}
message MemberPatternField {
optional MemberAccessField access = 1;
optional AnnotatedByPattern annotated_by = 2;
optional StringPattern name = 3;
optional TypePattern field_type = 4;
}
message MemberPatternMethod {
optional MemberAccessMethod access = 1;
optional AnnotatedByPattern annotated_by = 2;
optional StringPattern name = 3;
optional MethodReturnTypePattern return_type = 4;
optional MethodParameterTypesPattern parameter_types = 5;
}
message MethodReturnTypePattern {
oneof return_type_oneof {
// Unset type denotes any type.
TypeVoid void_type = 1;
TypePattern some_type = 2;
}
}
message MethodParameterTypesPattern {
repeated TypePattern types = 1;
}
message TypeVoid {
// Placeholder to denote a 'void' method return type.
}
message TypePattern {
oneof type_oneof {
// Unset type denotes any type.
TypePatternPrimitive primitive = 1;
TypePatternArray array = 2;
ClassPattern class_pattern = 3;
}
}
enum TypePatternPrimitive {
PRIMITIVE_UNSPECIFIED = 0; // Denotes any primitive.
PRIMITIVE_BOOLEAN = 1;
PRIMITIVE_BYTE = 2;
PRIMITIVE_CHAR = 3;
PRIMITIVE_SHORT = 4;
PRIMITIVE_INT = 5;
PRIMITIVE_LONG = 6;
PRIMITIVE_FLOAT = 7;
PRIMITIVE_DOUBLE = 8;
}
message TypePatternArray {
// An unset or zero-valued dimensions will be interpreted as 1.
optional uint32 dimensions = 1;
optional TypePattern base_type = 2;
}