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