Cache the result of hasTopLevelCallables() for a KtFile

#KT-19885 Fixed
This commit is contained in:
Dmitry Jemerov
2017-08-31 18:53:34 +02:00
parent 839f197a1e
commit f74416a151
5 changed files with 30 additions and 19 deletions
@@ -27,6 +27,7 @@ import com.intellij.util.IncorrectOperationException
import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
import org.jetbrains.kotlin.psi.psiUtil.getChildOfType
@@ -43,8 +44,12 @@ open class KtFile(viewProvider: FileViewProvider, val isCompiled: Boolean) :
PsiNamedElement,
PsiModifiableCodeBlock {
@Volatile
private var isScript: Boolean? = null
@Volatile
private var hasTopLeveCallables: Boolean? = null
val importList: KtImportList?
get() = findChildByTypeOrClass(KtStubElementTypes.IMPORT_LIST, KtImportList::class.java)
@@ -153,10 +158,25 @@ open class KtFile(viewProvider: FileViewProvider, val isCompiled: Boolean) :
override fun clearCaches() {
super.clearCaches()
isScript = null
hasTopLeveCallables = null
}
fun isScript(): Boolean = stub?.isScript() ?: isScriptByTree
fun hasTopLevelCallables(): Boolean {
hasTopLeveCallables?.let { return it }
val result = declarations.any {
(it is KtProperty ||
it is KtNamedFunction ||
it is KtScript ||
it is KtTypeAlias) && !it.hasModifier(KtTokens.HEADER_KEYWORD)
}
hasTopLeveCallables = result
return result
}
override fun accept(visitor: PsiElementVisitor) {
if (visitor is KtVisitor<*, *>) {
@Suppress("UNCHECKED_CAST")