xref: /aosp_15_r20/tools/metalava/metalava-model/src/main/java/com/android/tools/metalava/model/visitors/ApiType.kt (revision 115816f9299ab6ddd6b9673b81f34e707f6bacab)
1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.tools.metalava.model.visitors
18 
19 import com.android.tools.metalava.model.FilterPredicate
20 
21 /** Types of APIs emitted (or parsed etc.) */
22 enum class ApiType(val flagName: String, val displayName: String = flagName) {
23     /** The public API */
24     PUBLIC_API("api", "public") {
25 
getNonElidingFilternull26         override fun getNonElidingFilter(apiPredicateConfig: ApiPredicate.Config): FilterPredicate {
27             // This filter is for API signature files, where we don't need the "for stub purposes"
28             // APIs.
29             return ApiPredicate(
30                 includeApisForStubPurposes = false,
31                 config = apiPredicateConfig,
32             )
33         }
34 
getReferenceFilternull35         override fun getReferenceFilter(apiPredicateConfig: ApiPredicate.Config): FilterPredicate {
36             return ApiPredicate(config = apiPredicateConfig.copy(ignoreShown = true))
37         }
38     },
39 
40     /** The API that has been removed */
41     REMOVED("removed", "removed") {
42 
getNonElidingFilternull43         override fun getNonElidingFilter(apiPredicateConfig: ApiPredicate.Config): FilterPredicate {
44             // This filter is for API signature files, where we don't need the "for stub purposes"
45             // APIs.
46             return ApiPredicate(
47                 includeApisForStubPurposes = false,
48                 matchRemoved = true,
49                 config = apiPredicateConfig,
50             )
51         }
52 
getReferenceFilternull53         override fun getReferenceFilter(apiPredicateConfig: ApiPredicate.Config): FilterPredicate {
54             return ApiPredicate(
55                 ignoreRemoved = true,
56                 config = apiPredicateConfig.copy(ignoreShown = true),
57             )
58         }
59     },
60 
61     /** Everything */
62     ALL("all", "all") {
63 
getNonElidingFilternull64         override fun getNonElidingFilter(apiPredicateConfig: ApiPredicate.Config): FilterPredicate {
65             return FilterPredicate { it.emit }
66         }
67 
getEmitFilternull68         override fun getEmitFilter(apiPredicateConfig: ApiPredicate.Config): FilterPredicate {
69             return FilterPredicate { it.emit }
70         }
71 
getReferenceFilternull72         override fun getReferenceFilter(apiPredicateConfig: ApiPredicate.Config): FilterPredicate {
73             return FilterPredicate { true }
74         }
75     };
76 
getNonElidingFilternull77     protected abstract fun getNonElidingFilter(
78         apiPredicateConfig: ApiPredicate.Config
79     ): FilterPredicate
80 
81     open fun getEmitFilter(apiPredicateConfig: ApiPredicate.Config): FilterPredicate {
82         val nonElidingFilter =
83             MatchOverridingMethodPredicate(getNonElidingFilter(apiPredicateConfig))
84         val referenceFilter = getReferenceFilter(apiPredicateConfig)
85         return nonElidingFilter.and(elidingPredicate(referenceFilter, apiPredicateConfig))
86     }
87 
getReferenceFilternull88     abstract fun getReferenceFilter(apiPredicateConfig: ApiPredicate.Config): FilterPredicate
89 
90     /**
91      * Create an [ElidingPredicate] that wraps [wrappedPredicate] and uses information from the
92      * [apiPredicateConfig].
93      */
94     protected fun elidingPredicate(
95         wrappedPredicate: FilterPredicate,
96         apiPredicateConfig: ApiPredicate.Config
97     ) =
98         ElidingPredicate(
99             wrappedPredicate,
100             addAdditionalOverrides = apiPredicateConfig.addAdditionalOverrides,
101         )
102 
103     /**
104      * Get the [ApiFilters] for this [ApiType] that uses information from [apiPredicateConfig] to
105      * customize their behavior.
106      *
107      * The returned [ApiFilters.emit] will elide methods overrides that match the overridden method.
108      */
109     fun getApiFilters(apiPredicateConfig: ApiPredicate.Config) =
110         ApiFilters(
111             emit = getEmitFilter(apiPredicateConfig),
112             reference = getReferenceFilter(apiPredicateConfig),
113         )
114 
115     /**
116      * Get the [ApiFilters] for this [ApiType] that uses information from [apiPredicateConfig] to
117      * customize their behavior.
118      *
119      * The returned [ApiFilters.emit] will NOT elide methods overrides that match the overridden
120      * method.
121      */
122     fun getNonElidingApiFilters(apiPredicateConfig: ApiPredicate.Config) =
123         ApiFilters(
124             emit = getNonElidingFilter(apiPredicateConfig),
125             reference = getReferenceFilter(apiPredicateConfig),
126         )
127 
128     override fun toString(): String = displayName
129 }
130