• 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.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