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