From a608612e6b893941d1fb002de1da1580cfd4094f Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Mon, 11 Nov 2013 21:16:08 +0400 Subject: [PATCH] KT-4183 BuiltInsReferenceResolver$1 startup activity is slow #KT-4183 in progress --- .../references/BuiltInsReferenceResolver.java | 49 +++++++++++++------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java b/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java index 4d0d7c4cb24..b62dad83d01 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java +++ b/idea/src/org/jetbrains/jet/plugin/references/BuiltInsReferenceResolver.java @@ -17,8 +17,8 @@ package org.jetbrains.jet.plugin.references; import com.google.common.collect.Sets; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.AbstractProjectComponent; -import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.vfs.VfsUtil; @@ -56,8 +56,8 @@ import java.util.List; import java.util.Set; public class BuiltInsReferenceResolver extends AbstractProjectComponent { - private BindingContext bindingContext = null; - private Set builtInsSources = Sets.newHashSet(); + private volatile BindingContext bindingContext = null; + private volatile Set builtInsSources = Sets.newHashSet(); public BuiltInsReferenceResolver(Project project) { super(project); @@ -76,20 +76,39 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { private void initialize() { assert bindingContext == null : "Attempt to initialize twice"; - BindingTraceContext context = new BindingTraceContext(); - FakeJetNamespaceDescriptor jetNamespace = new FakeJetNamespaceDescriptor(); - context.record(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, KotlinBuiltIns.getInstance().getBuiltInsPackageFqName(), jetNamespace); + final List jetBuiltInsFiles = getJetBuiltInsFiles(); - WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, jetNamespace, RedeclarationHandler.THROW_EXCEPTION, - "Builtin classes scope"); - scope.changeLockLevel(WritableScope.LockLevel.BOTH); - jetNamespace.setMemberScope(scope); + final Runnable initializeRunnable = new Runnable() { + @Override + public void run() { + BindingTraceContext context = new BindingTraceContext(); + FakeJetNamespaceDescriptor jetNamespace = new FakeJetNamespaceDescriptor(); + context.record(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, + KotlinBuiltIns.getInstance().getBuiltInsPackageFqName(), jetNamespace); - List jetBuiltInsFiles = getJetBuiltInsFiles(); - TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, jetBuiltInsFiles); + WritableScopeImpl scope = new WritableScopeImpl(JetScope.EMPTY, jetNamespace, RedeclarationHandler.THROW_EXCEPTION, + "Builtin classes scope"); + scope.changeLockLevel(WritableScope.LockLevel.BOTH); + jetNamespace.setMemberScope(scope); - builtInsSources = Sets.newHashSet(jetBuiltInsFiles); - bindingContext = context.getBindingContext(); + TopDownAnalyzer.processStandardLibraryNamespace(myProject, context, scope, jetNamespace, jetBuiltInsFiles); + + builtInsSources = Sets.newHashSet(jetBuiltInsFiles); + bindingContext = context.getBindingContext(); + } + }; + + if (ApplicationManager.getApplication().isUnitTestMode()) { + initializeRunnable.run(); + } + else { + ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + @Override + public void run() { + ApplicationManager.getApplication().runReadAction(initializeRunnable); + } + }); + } } private List getJetBuiltInsFiles() { @@ -172,7 +191,6 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { @Nullable JetReferenceExpression referenceExpression ) { if (bindingContext == null) { - assert DumbService.getInstance(myProject).isDumb() : "Builtins component wasn't initialized properly"; return Collections.emptyList(); } @@ -184,7 +202,6 @@ public class BuiltInsReferenceResolver extends AbstractProjectComponent { @NotNull public Collection resolveBuiltInSymbol(@NotNull DeclarationDescriptor declarationDescriptor) { if (bindingContext == null) { - assert DumbService.getInstance(myProject).isDumb() : "Builtins component wasn't initialized properly"; return Collections.emptyList(); }