• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 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.ClassItem
22 import com.android.tools.metalava.model.ItemDocumentation.Companion.toItemDocumentationFactory
23 import com.android.tools.metalava.model.ItemDocumentationFactory
24 import com.android.tools.metalava.model.PackageItem
25 import com.android.tools.metalava.model.VisibilityLevel
26 import com.android.tools.metalava.model.item.DefaultPackageItem
27 import com.android.tools.metalava.model.item.PackageDoc
28 import com.android.tools.metalava.model.item.ResourceFile
29 import com.android.tools.metalava.reporter.FileLocation
30 import com.intellij.psi.PsiPackage
31 
32 internal class PsiPackageItem
33 internal constructor(
34     override val codebase: PsiBasedCodebase,
35     private val psiPackage: PsiPackage,
36     fileLocation: FileLocation,
37     modifiers: BaseModifierList,
38     documentationFactory: ItemDocumentationFactory,
39     qualifiedName: String,
40     containingPackage: PackageItem?,
41     overviewDocumentation: ResourceFile?,
42 ) :
43     DefaultPackageItem(
44         codebase = codebase,
45         fileLocation = fileLocation,
46         itemLanguage = psiPackage.itemLanguage,
47         modifiers = modifiers,
48         documentationFactory = documentationFactory,
49         variantSelectorsFactory = ApiVariantSelectors.MUTABLE_FACTORY,
50         qualifiedName = qualifiedName,
51         containingPackage = containingPackage,
52         overviewDocumentation = overviewDocumentation,
53     ),
54     PackageItem,
55     PsiItem {
56 
psinull57     override fun psi() = psiPackage
58 
59     // N.A. a package cannot be contained in a class
60     override fun containingClass(): ClassItem? = null
61 
62     companion object {
63         fun create(
64             codebase: PsiBasedCodebase,
65             psiPackage: PsiPackage,
66             packageDoc: PackageDoc,
67             containingPackage: PackageItem?,
68         ): PsiPackageItem {
69             val modifiers = PsiModifierItem.create(codebase, psiPackage)
70             if (modifiers.isPackagePrivate()) {
71                 // packages are always public (if not hidden explicitly with private)
72                 modifiers.setVisibilityLevel(VisibilityLevel.PUBLIC)
73             }
74             val qualifiedName = psiPackage.qualifiedName
75 
76             return PsiPackageItem(
77                 codebase = codebase,
78                 psiPackage = psiPackage,
79                 fileLocation = packageDoc.fileLocation,
80                 modifiers = modifiers,
81                 documentationFactory = packageDoc.commentFactory ?: "".toItemDocumentationFactory(),
82                 qualifiedName = qualifiedName,
83                 containingPackage = containingPackage,
84                 overviewDocumentation = packageDoc.overview,
85             )
86         }
87     }
88 }
89