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