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.item
18 
19 import com.android.tools.metalava.model.ApiVariantSelectors
20 import com.android.tools.metalava.model.ApiVariantSelectorsFactory
21 import com.android.tools.metalava.model.BaseModifierList
22 import com.android.tools.metalava.model.Codebase
23 import com.android.tools.metalava.model.DefaultItem
24 import com.android.tools.metalava.model.ItemDocumentationFactory
25 import com.android.tools.metalava.model.ItemLanguage
26 import com.android.tools.metalava.model.SelectableItem
27 import com.android.tools.metalava.model.Showability
28 import com.android.tools.metalava.model.api.surface.ApiVariantSet
29 import com.android.tools.metalava.model.api.surface.MutableApiVariantSet
30 import com.android.tools.metalava.reporter.FileLocation
31 
32 abstract class DefaultSelectableItem(
33     codebase: Codebase,
34     fileLocation: FileLocation,
35     itemLanguage: ItemLanguage,
36     modifiers: BaseModifierList,
37     documentationFactory: ItemDocumentationFactory,
38     variantSelectorsFactory: ApiVariantSelectorsFactory,
39 ) :
40     DefaultItem(
41         codebase,
42         fileLocation,
43         itemLanguage,
44         modifiers,
45         documentationFactory,
46     ),
47     SelectableItem {
48 
49     final override var selectedApiVariants: ApiVariantSet = codebase.apiSurfaces.emptyVariantSet
50 
mutateSelectedApiVariantsnull51     override fun mutateSelectedApiVariants(mutator: MutableApiVariantSet.() -> Unit) {
52         val mutable = selectedApiVariants.toMutable()
53         mutable.mutator()
54         selectedApiVariants = mutable.toImmutable()
55     }
56 
57     final override var emit =
58         // Do not emit expect declarations in APIs.
59         !modifiers.isExpect()
60 
61     /**
62      * Create an [ApiVariantSelectors] appropriate for this [SelectableItem].
63      *
64      * The leaking of `this` is safe as the implementations do not access anything that has not been
65      * initialized.
66      */
67     override val variantSelectors = @Suppress("LeakingThis") variantSelectorsFactory(this)
68 
69     /**
70      * Manually delegate to [ApiVariantSelectors.originallyHidden] as property delegates are
71      * expensive.
72      */
73     final override val originallyHidden
74         get() = variantSelectors.originallyHidden
75 
76     /** Manually delegate to [ApiVariantSelectors.hidden] as property delegates are expensive. */
77     final override val hidden
78         get() = variantSelectors.hidden
79 
80     /** Manually delegate to [ApiVariantSelectors.removed] as property delegates are expensive. */
81     final override val removed: Boolean
82         get() = variantSelectors.removed
83 
84     final override val showability: Showability
85         get() = variantSelectors.showability
86 }
87