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.ClassKind 23 import com.android.tools.metalava.model.ClassOrigin 24 import com.android.tools.metalava.model.ClassTypeItem 25 import com.android.tools.metalava.model.ConstructorItem 26 import com.android.tools.metalava.model.ItemDocumentationFactory 27 import com.android.tools.metalava.model.PackageItem 28 import com.android.tools.metalava.model.SourceFile 29 import com.android.tools.metalava.model.TypeParameterList 30 import com.android.tools.metalava.model.VisibilityLevel 31 import com.android.tools.metalava.model.item.DefaultClassItem 32 import com.intellij.psi.PsiClass 33 import com.intellij.psi.PsiCompiledFile 34 import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade 35 import org.jetbrains.uast.UClass 36 import org.jetbrains.uast.UFile 37 import org.jetbrains.uast.getParentOfType 38 39 internal class PsiClassItem 40 internal constructor( 41 override val codebase: PsiBasedCodebase, 42 val psiClass: PsiClass, 43 modifiers: BaseModifierList, 44 documentationFactory: ItemDocumentationFactory, 45 classKind: ClassKind, 46 containingClass: ClassItem?, 47 containingPackage: PackageItem, 48 qualifiedName: String, 49 typeParameterList: TypeParameterList, 50 origin: ClassOrigin, 51 superClassType: ClassTypeItem?, 52 interfaceTypes: List<ClassTypeItem> 53 ) : 54 DefaultClassItem( 55 codebase = codebase, 56 fileLocation = PsiFileLocation.fromPsiElement(psiClass), 57 itemLanguage = psiClass.itemLanguage, 58 modifiers = modifiers, 59 documentationFactory = documentationFactory, 60 variantSelectorsFactory = ApiVariantSelectors.MUTABLE_FACTORY, 61 source = null, 62 classKind = classKind, 63 containingClass = containingClass, 64 containingPackage = containingPackage, 65 qualifiedName = qualifiedName, 66 typeParameterList = typeParameterList, 67 origin = origin, 68 superClassType = superClassType, 69 interfaceTypes = interfaceTypes, 70 ), 71 ClassItem, 72 PsiItem { 73 psinull74 override fun psi() = psiClass 75 76 override var primaryConstructor: ConstructorItem? = null 77 internal set 78 79 override fun createClassTypeItemForThis() = 80 codebase.globalTypeItemFactory.getClassTypeForClass(this) 81 82 override fun sourceFile(): SourceFile? { 83 if (isNestedClass()) { 84 // Retrieve the SourceFile from the top level class. 85 return containingClass()?.sourceFile() 86 } 87 88 val containingFile = psiClass.containingFile ?: return null 89 if (containingFile is PsiCompiledFile) { 90 return null 91 } 92 93 val uFile = 94 if (psiClass is UClass) { 95 psiClass.getParentOfType(UFile::class.java) 96 } else { 97 null 98 } 99 100 return PsiSourceFile(codebase, containingFile, uFile) 101 } 102 103 /** Creates a constructor in this class */ createDefaultConstructornull104 override fun createDefaultConstructor(visibility: VisibilityLevel): PsiConstructorItem { 105 return PsiConstructorItem.createDefaultConstructor(codebase, this, psiClass, visibility) 106 } 107 isFileFacadenull108 override fun isFileFacade(): Boolean { 109 return psiClass.isKotlin() && 110 psiClass is UClass && 111 psiClass.javaPsi is KtLightClassForFacade 112 } 113 } 114