xref: /aosp_15_r20/tools/metalava/metalava-model/src/main/java/com/android/tools/metalava/model/TypeTransformer.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
18 
19 /**
20  * A visitor like pattern that can apply a transform to a [TypeItem].
21  *
22  * See [TypeItem.transform].
23  */
24 interface TypeTransformer {
transformnull25     fun transform(typeItem: ArrayTypeItem): ArrayTypeItem = typeItem
26 
27     fun transform(typeItem: ClassTypeItem): ClassTypeItem = typeItem
28 
29     fun transform(typeItem: LambdaTypeItem): LambdaTypeItem = typeItem
30 
31     fun transform(typeItem: PrimitiveTypeItem): PrimitiveTypeItem = typeItem
32 
33     fun transform(typeItem: VariableTypeItem): VariableTypeItem = typeItem
34 
35     fun transform(typeItem: WildcardTypeItem): WildcardTypeItem = typeItem
36 }
37 
38 /**
39  * A [TypeTransformer] that recursively calls [TypeItem.transform] on each [TypeItem]'s
40  * [TypeItem.modifiers] and any contained [TypeItem] and then substitutes those in to the [TypeItem]
41  * using the appropriate `substitute(TypeModifiers,...)` method.
42  */
43 open class BaseTypeTransformer : TypeTransformer {
44 
45     open fun transform(modifiers: TypeModifiers): TypeModifiers = modifiers
46 
47     override fun transform(typeItem: ArrayTypeItem): ArrayTypeItem {
48         return typeItem.substitute(
49             modifiers = transform(typeItem.modifiers),
50             componentType = typeItem.componentType.transform(this),
51         )
52     }
53 
54     override fun transform(typeItem: ClassTypeItem): ClassTypeItem {
55         return typeItem.substitute(
56             modifiers = transform(typeItem.modifiers),
57             outerClassType = typeItem.outerClassType?.transform(this),
58             arguments = typeItem.arguments.mapIfNotSame { it.transform(this) }
59         )
60     }
61 
62     override fun transform(typeItem: LambdaTypeItem): LambdaTypeItem {
63         return typeItem.substitute(
64             modifiers = transform(typeItem.modifiers),
65             outerClassType = typeItem.outerClassType?.transform(this),
66             arguments = typeItem.arguments.mapIfNotSame { it.transform(this) }
67         )
68     }
69 
70     override fun transform(typeItem: PrimitiveTypeItem): PrimitiveTypeItem {
71         return typeItem.substitute(
72             modifiers = transform(typeItem.modifiers),
73         )
74     }
75 
76     override fun transform(typeItem: VariableTypeItem): VariableTypeItem {
77         return typeItem.substitute(
78             modifiers = transform(typeItem.modifiers),
79         )
80     }
81 
82     override fun transform(typeItem: WildcardTypeItem): WildcardTypeItem {
83         return typeItem.substitute(
84             modifiers = transform(typeItem.modifiers),
85             extendsBound = typeItem.extendsBound?.transform(this),
86             superBound = typeItem.superBound?.transform(this),
87         )
88     }
89 }
90