Faster startup avoiding unnecessary class loading in HelloWorld.java

This commit is contained in:
Alexander Podkhalyuzin
2019-05-29 14:43:43 +02:00
committed by Vladimir Dolzhenko
parent c853ae49a2
commit 4babde5b46
6 changed files with 53 additions and 28 deletions
@@ -23,9 +23,12 @@ import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.idea.caches.project.ScriptDependenciesInfo
import org.jetbrains.kotlin.idea.caches.project.ScriptDependenciesSourceInfo
import org.jetbrains.kotlin.idea.caches.project.getModuleInfoByVirtualFile
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager
class ScriptDependenciesResolveScopeProvider : ResolveScopeProvider() {
override fun getResolveScope(file: VirtualFile, project: Project): GlobalSearchScope? {
if (ScriptDependenciesManager.getInstance(project).getAllScriptsDependenciesClassFiles().isEmpty()) return null
val moduleInfo = getModuleInfoByVirtualFile(project, file) ?: return null
val scriptDependenciesModuleInfo = (moduleInfo as? ScriptDependenciesInfo)
?: (moduleInfo as? ScriptDependenciesSourceInfo)?.binariesModuleInfo
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.idea.configuration.ui.notifications
import com.intellij.facet.ProjectFacetManager
import com.intellij.ide.util.PropertiesComponent
import com.intellij.notification.*
import com.intellij.openapi.actionSystem.AnActionEvent
@@ -13,6 +14,7 @@ import com.intellij.openapi.application.runWriteAction
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.project.Project
import com.intellij.psi.codeStyle.CodeStyleSettingsManager
import org.jetbrains.kotlin.idea.facet.KotlinFacetType
import org.jetbrains.kotlin.idea.formatter.*
import org.jetbrains.kotlin.idea.util.isDefaultOfficialCodeStyle
@@ -20,6 +22,8 @@ private const val KOTLIN_UPDATE_CODE_STYLE_GROUP_ID = "Update Kotlin code style"
private const val KOTLIN_UPDATE_CODE_STYLE_PROPERTY_NAME = "update.kotlin.code.style.notified"
fun notifyKotlinStyleUpdateIfNeeded(project: Project) {
val modulesWithFacet = ProjectFacetManager.getInstance(project).getModulesWithFacet(KotlinFacetType.TYPE_ID)
if (modulesWithFacet.isEmpty()) return
if (!isDefaultOfficialCodeStyle) return
val isProjectSettings = CodeStyleSettingsManager.getInstance(project).USE_PER_PROJECT_SETTINGS
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.idea
import com.intellij.facet.ProjectFacetManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.JdkOrderEntry
import com.intellij.openapi.roots.ModuleRootManager
@@ -16,6 +17,7 @@ import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.SearchScope
import org.jetbrains.kotlin.idea.caches.project.implementingModules
import org.jetbrains.kotlin.idea.core.isInTestSourceContentKotlinAware
import org.jetbrains.kotlin.idea.facet.KotlinFacetType
import org.jetbrains.kotlin.idea.project.platform
import org.jetbrains.kotlin.idea.util.isInSourceContentWithoutInjected
import org.jetbrains.kotlin.platform.isCommon
@@ -23,6 +25,8 @@ import org.jetbrains.kotlin.platform.jvm.isJvm
class CommonModuleResolveScopeEnlarger : ResolveScopeEnlarger() {
override fun getAdditionalResolveScope(file: VirtualFile, project: Project): SearchScope? {
val modulesWithFacet = ProjectFacetManager.getInstance(project).getModulesWithFacet(KotlinFacetType.TYPE_ID)
if (modulesWithFacet.isEmpty()) return null
val module = ProjectFileIndex.getInstance(project).getModuleForFile(file) ?: return null
if (!module.platform.isCommon()) return null
@@ -5,13 +5,15 @@
package org.jetbrains.kotlin.idea.framework
import com.intellij.facet.ProjectFacetManager
import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.StartupActivity
import org.jetbrains.kotlin.idea.facet.KotlinFacetType
import org.jetbrains.kotlin.idea.project.platform
import org.jetbrains.kotlin.idea.util.projectStructure.allModules
import org.jetbrains.kotlin.platform.isCommon
import org.jetbrains.kotlin.platform.js.isJs
import org.jetbrains.kotlin.platform.konan.isNative
/**
* This StartupActivity creates KotlinSdk for projects containing non-jvm modules.
@@ -21,11 +23,14 @@ import org.jetbrains.kotlin.platform.js.isJs
class CreateKotlinSdkActivity : StartupActivity, DumbAware {
override fun runActivity(project: Project) {
val kotlinSdkIsRequired = project.allModules().any {
it.platform.isJs() || it.platform.isCommon()
}
if (kotlinSdkIsRequired) {
KotlinSdkType.setUpIfNeeded()
val modulesWithFacet = ProjectFacetManager.getInstance(project).getModulesWithFacet(KotlinFacetType.TYPE_ID)
if (modulesWithFacet.isNotEmpty()) {
KotlinSdkType.setUpIfNeeded {
modulesWithFacet.any {
val platform = it.platform
platform.isJs() || platform.isNative() || platform.isCommon()
}
}
}
}
}
@@ -30,10 +30,12 @@ class KotlinSdkType : SdkType("KotlinSDK") {
val defaultHomePath: String
get() = PathUtil.kotlinPathsForIdeaPlugin.homePath.absolutePath
fun setUpIfNeeded() {
@JvmOverloads
fun setUpIfNeeded(checkIfNeeded: () -> Boolean = { true }) {
with(ProjectSdksModel()) {
reset(null)
if (sdks.any { it.sdkType is KotlinSdkType }) return
if (!checkIfNeeded()) return //do not create Kotlin SDK
addSdk(INSTANCE, defaultHomePath, null)
ApplicationManager.getApplication().invokeAndWait {
runWriteAction { apply(null, true) }
@@ -5,10 +5,12 @@
package org.jetbrains.kotlin.idea.framework
import com.intellij.facet.ProjectFacetManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.StartupActivity
import org.jetbrains.kotlin.idea.configuration.BuildSystemType
import org.jetbrains.kotlin.idea.configuration.getBuildSystemType
import org.jetbrains.kotlin.idea.facet.KotlinFacetType
import org.jetbrains.kotlin.idea.project.platform
import org.jetbrains.kotlin.idea.statistics.FUSEventGroups
import org.jetbrains.kotlin.idea.statistics.KotlinFUSLogger
@@ -21,27 +23,32 @@ import org.jetbrains.kotlin.platform.konan.isNative
class TargetRetrieveActivity : StartupActivity {
override fun runActivity(project: Project) {
project.allModules().forEach {
val buildSystem = it.getBuildSystemType()
// TODO(dsavvinov): review that
val platform = when {
it.platform.isJvm() -> "jvm"
it.platform.isJs() -> "js"
it.platform.isCommon() -> "common"
it.platform.isNative() -> "native"
else -> "unknown"
}
when {
buildSystem == BuildSystemType.JPS ->
KotlinFUSLogger.log(
FUSEventGroups.JPSTarget,
platform
)
buildSystem.toString().toLowerCase().contains("maven") ->
KotlinFUSLogger.log(
FUSEventGroups.MavenTarget,
platform
)
//todo: log later to avoid loading during startup
val modulesWithFacet = ProjectFacetManager.getInstance(project).getModulesWithFacet(KotlinFacetType.TYPE_ID)
if (modulesWithFacet.isNotEmpty()) {
modulesWithFacet.forEach {
val buildSystem = it.getBuildSystemType()
// TODO(dsavvinov): review that
val platform = when {
it.platform.isJvm() -> "jvm"
it.platform.isJs() -> "js"
it.platform.isCommon() -> "common"
it.platform.isNative() -> "native"
else -> "unknown"
}
when {
buildSystem == BuildSystemType.JPS ->
KotlinFUSLogger.log(
FUSEventGroups.JPSTarget,
platform
)
buildSystem.toString().toLowerCase().contains("maven") ->
KotlinFUSLogger.log(
FUSEventGroups.MavenTarget,
platform
)
}
}
}
}