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