mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-15 11:53:49 +07:00
Fix without improper waiting IJPL-1005 FUSProjectHotStartUpMeasurer may wrongly report no editors were opened
GitOrigin-RevId: 192b6ec8d1edd52a1607467f17aae6f0991925fc
This commit is contained in:
committed by
intellij-monorepo-bot
parent
fa2cdc6fda
commit
d131301d1b
@@ -4,6 +4,7 @@
|
||||
package com.intellij.openapi.project.impl
|
||||
|
||||
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
|
||||
import com.intellij.concurrency.captureThreadContext
|
||||
import com.intellij.configurationStore.saveSettings
|
||||
import com.intellij.conversion.CannotConvertException
|
||||
import com.intellij.diagnostic.StartUpMeasurer
|
||||
@@ -57,6 +58,7 @@ import com.intellij.toolWindow.computeToolWindowBeans
|
||||
import com.intellij.ui.ScreenUtil
|
||||
import com.intellij.util.TimeoutUtil
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.Runnable
|
||||
import org.jetbrains.annotations.ApiStatus
|
||||
import java.awt.Dimension
|
||||
import java.awt.Frame
|
||||
@@ -204,25 +206,29 @@ internal class ProjectUiFrameAllocator(
|
||||
launch {
|
||||
val project = rawProjectDeferred.await()
|
||||
val startUpContextElementToPass = FUSProjectHotStartUpMeasurer.getStartUpContextElementToPass() ?: EmptyCoroutineContext
|
||||
|
||||
val onNoEditorsLeft = blockingContext {
|
||||
captureThreadContext(Runnable { FUSProjectHotStartUpMeasurer.reportNoMoreEditorsOnStartup(System.nanoTime()) })
|
||||
}
|
||||
|
||||
@Suppress("UsagesOfObsoleteApi")
|
||||
(project as ComponentManagerEx).getCoroutineScope().launch(startUpContextElementToPass + rootTask()) {
|
||||
try {
|
||||
launch {
|
||||
val frameHelper = deferredProjectFrameHelper.await()
|
||||
frameHelper.installDefaultProjectStatusBarWidgets(project)
|
||||
frameHelper.updateTitle(serviceAsync<FrameTitleBuilder>().getProjectTitle(project), project)
|
||||
}
|
||||
|
||||
reopeningEditorJob.join()
|
||||
postOpenEditors(
|
||||
deferredProjectFrameHelper = deferredProjectFrameHelper,
|
||||
fileEditorManager = project.serviceAsync<FileEditorManager>() as FileEditorManagerImpl,
|
||||
toolWindowInitJob = toolWindowInitJob,
|
||||
project = project,
|
||||
)
|
||||
launch {
|
||||
val frameHelper = deferredProjectFrameHelper.await()
|
||||
frameHelper.installDefaultProjectStatusBarWidgets(project)
|
||||
frameHelper.updateTitle(serviceAsync<FrameTitleBuilder>().getProjectTitle(project), project)
|
||||
}
|
||||
finally {
|
||||
FUSProjectHotStartUpMeasurer.reportNoMoreEditorsOnStartup(System.nanoTime())
|
||||
|
||||
reopeningEditorJob.join()
|
||||
postOpenEditors(
|
||||
deferredProjectFrameHelper = deferredProjectFrameHelper,
|
||||
fileEditorManager = project.serviceAsync<FileEditorManager>() as FileEditorManagerImpl,
|
||||
toolWindowInitJob = toolWindowInitJob,
|
||||
project = project,
|
||||
)
|
||||
}.invokeOnCompletion { throwable ->
|
||||
if (throwable != null) {
|
||||
onNoEditorsLeft.run()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -427,6 +433,9 @@ private suspend fun postOpenEditors(
|
||||
openProjectViewIfNeeded(project, toolWindowInitJob)
|
||||
findAndOpenReadmeIfNeeded(project)
|
||||
}
|
||||
blockingContext {
|
||||
FUSProjectHotStartUpMeasurer.reportNoMoreEditorsOnStartup(System.nanoTime())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -438,9 +447,12 @@ private suspend fun focusSelectedEditor(editorComponent: EditorsSplitters) {
|
||||
composite.preferredFocusedComponent?.requestFocusInWindow()
|
||||
}
|
||||
else {
|
||||
AsyncEditorLoader.waitForLoaded(textEditor.editor)
|
||||
FUSProjectHotStartUpMeasurer.firstOpenedEditor(composite.file)
|
||||
composite.preferredFocusedComponent?.requestFocusInWindow()
|
||||
blockingContext {
|
||||
AsyncEditorLoader.performWhenLoaded(textEditor.editor) {
|
||||
FUSProjectHotStartUpMeasurer.firstOpenedEditor(composite.file)
|
||||
composite.preferredFocusedComponent?.requestFocusInWindow()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.intellij.platform.ide.diagnostic.startUpPerformanceReporter
|
||||
|
||||
import com.intellij.concurrency.currentThreadContext
|
||||
import com.intellij.diagnostic.StartUpMeasurer
|
||||
import com.intellij.ide.impl.ProjectUtilCore
|
||||
import com.intellij.idea.IdeStarter
|
||||
@@ -197,8 +198,10 @@ object FUSProjectHotStartUpMeasurer {
|
||||
channel.trySend(Event.MarkupRestoredEvent(file.id))
|
||||
}
|
||||
|
||||
suspend fun firstOpenedEditor(file: VirtualFile) {
|
||||
if (!isProperContext()) return
|
||||
fun firstOpenedEditor(file: VirtualFile) {
|
||||
if (!currentThreadContext().isProperContext()) {
|
||||
return
|
||||
}
|
||||
channel.trySend(Event.FirstEditorEvent(SourceOfSelectedEditor.TextEditor, file, System.nanoTime()))
|
||||
}
|
||||
|
||||
@@ -212,8 +215,10 @@ object FUSProjectHotStartUpMeasurer {
|
||||
channel.trySend(Event.FirstEditorEvent(SourceOfSelectedEditor.FoundReadmeFile, readmeFile, nanoTime))
|
||||
}
|
||||
|
||||
suspend fun reportNoMoreEditorsOnStartup(nanoTime: Long) {
|
||||
if (!isProperContext()) return
|
||||
fun reportNoMoreEditorsOnStartup(nanoTime: Long) {
|
||||
if (!currentThreadContext().isProperContext()) {
|
||||
return
|
||||
}
|
||||
channel.trySend(Event.NoMoreEditorsEvent(nanoTime))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user