1 /* 2 * Copyright (C) 2025 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.psi 18 19 import com.android.tools.metalava.model.ApiVariantSelectors 20 import com.android.tools.metalava.model.BaseModifierList 21 import com.android.tools.metalava.model.TypeItem 22 import com.android.tools.metalava.model.TypeParameterList 23 import com.android.tools.metalava.model.item.DefaultPackageItem 24 import com.android.tools.metalava.model.item.DefaultTypeAliasItem 25 import com.android.tools.metalava.reporter.FileLocation 26 import com.intellij.psi.PsiElement 27 import org.jetbrains.kotlin.psi.KtTypeAlias 28 29 internal class PsiTypeAliasItem 30 private constructor( 31 override val codebase: PsiBasedCodebase, 32 private val ktTypeAlias: KtTypeAlias, 33 fileLocation: FileLocation, 34 modifiers: BaseModifierList, 35 aliasedType: TypeItem, 36 qualifiedName: String, 37 typeParameterList: TypeParameterList, 38 containingPackage: DefaultPackageItem, 39 ) : 40 DefaultTypeAliasItem( 41 codebase, 42 fileLocation, 43 modifiers, 44 PsiItemDocumentation.factory(ktTypeAlias, codebase), 45 ApiVariantSelectors.MUTABLE_FACTORY, 46 aliasedType, 47 qualifiedName, 48 typeParameterList, 49 containingPackage, 50 ), 51 PsiItem { 52 psinull53 override fun psi(): PsiElement { 54 return ktTypeAlias 55 } 56 57 companion object { 58 /** 59 * Tries to create a [PsiTypeAliasItem] from the [ktTypeAlias]. May return null if the 60 * qualified name or type of the type alias can't be resolved. 61 */ createnull62 fun create(ktTypeAlias: KtTypeAlias, codebase: PsiBasedCodebase): PsiTypeAliasItem? { 63 val qualifiedName = ktTypeAlias.getClassId()?.asFqNameString() ?: return null 64 65 val (typeParameterList, typeItemFactory) = 66 PsiTypeParameterList.create( 67 codebase, 68 codebase.globalTypeItemFactory, 69 "typealias $qualifiedName", 70 ktTypeAlias 71 ) 72 val aliasedType = typeItemFactory.getTypeForKtElement(ktTypeAlias) ?: return null 73 74 val packageName = qualifiedName.substringBeforeLast(".") 75 val containingPackage = codebase.findOrCreatePackage(packageName) 76 77 val modifiers = PsiModifierItem.createForKtDeclaration(codebase, ktTypeAlias) 78 79 return PsiTypeAliasItem( 80 codebase = codebase, 81 ktTypeAlias = ktTypeAlias, 82 fileLocation = PsiFileLocation.fromPsiElement(ktTypeAlias), 83 modifiers = modifiers, 84 aliasedType = aliasedType, 85 qualifiedName = qualifiedName, 86 typeParameterList = typeParameterList, 87 containingPackage = containingPackage, 88 ) 89 } 90 } 91 } 92