• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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