From 40e1d5bc23e786632e76ab86d9308be6f5ae5c7d Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 24 Apr 2017 13:35:16 +0300 Subject: [PATCH] Optimize KtFile::isScipt/getScript when file is not kts `isScript` gets invoked for each call (see org.jetbrains.kotlin.resolve.calls.CandidateResolver#checkOuterClassMemberIsAccessible) And currently it may work for O(|top-level-declarations|), that is rather slow e.g. for native stubs for gtk #KT-17562 Fixed --- .../src/org/jetbrains/kotlin/psi/KtFile.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtFile.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtFile.java index 52d61ca2d5e..929cbafaf15 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtFile.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtFile.java @@ -46,6 +46,7 @@ import java.util.List; public class KtFile extends PsiFileBase implements KtDeclarationContainer, KtAnnotated, KtElement, PsiClassOwner, PsiNamedElement { private final boolean isCompiled; + private Boolean isScript = null; public KtFile(FileViewProvider viewProvider, boolean compiled) { super(viewProvider, KotlinLanguage.INSTANCE); @@ -183,9 +184,22 @@ public class KtFile extends PsiFileBase implements KtDeclarationContainer, KtAnn @Override public void setPackageName(String packageName) { } + @Override + public void clearCaches() { + super.clearCaches(); + isScript = null; + } + @Nullable public KtScript getScript() { - return PsiTreeUtil.getChildOfType(this, KtScript.class); + if (isScript != null && !isScript) return null; + + KtScript result = PsiTreeUtil.getChildOfType(this, KtScript.class); + if (isScript == null) { + isScript = result != null; + } + + return result; } public boolean isScript() {