Change class hierarchy of KotlinSourceRootType. Deadlock during concurrent classloading fixed

#KT-30137 Fixed

Original commit: 325ed8eb32
This commit is contained in:
Andrey Uskov
2019-02-28 00:26:53 +03:00
parent 1a65bb03f7
commit 7be0178830
12 changed files with 88 additions and 49 deletions
@@ -13,8 +13,6 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType
sealed class KotlinResourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaResourceRootProperties>(), sealed class KotlinResourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaResourceRootProperties>(),
JpsModuleSourceRootType<JavaResourceRootProperties>, KotlinRootType { JpsModuleSourceRootType<JavaResourceRootProperties>, KotlinRootType {
object Resource : KotlinResourceRootType(false)
object TestResource : KotlinResourceRootType(true)
override fun createDefaultProperties() = override fun createDefaultProperties() =
JpsJavaExtensionService.getInstance().createResourceRootProperties("", false) JpsJavaExtensionService.getInstance().createResourceRootProperties("", false)
@@ -25,3 +23,6 @@ sealed class KotlinResourceRootType(val isTest: Boolean) : JpsElementTypeBase<Ja
override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other) override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other)
} }
object ResourceKotlinRootType : KotlinResourceRootType(false)
object TestResourceKotlinRootType : KotlinResourceRootType(true)
@@ -13,8 +13,6 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType
sealed class KotlinResourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaResourceRootProperties>(), sealed class KotlinResourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaResourceRootProperties>(),
JpsModuleSourceRootType<JavaResourceRootProperties>, KotlinRootType { JpsModuleSourceRootType<JavaResourceRootProperties>, KotlinRootType {
object Resource : KotlinResourceRootType(false)
object TestResource : KotlinResourceRootType(true)
override fun createDefaultProperties() = override fun createDefaultProperties() =
JpsJavaExtensionService.getInstance().createResourceRootProperties("", false) JpsJavaExtensionService.getInstance().createResourceRootProperties("", false)
@@ -23,3 +21,6 @@ sealed class KotlinResourceRootType(val isTest: Boolean) : JpsElementTypeBase<Ja
override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other) override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other)
} }
object ResourceKotlinRootType : KotlinResourceRootType(false)
object TestResourceKotlinRootType : KotlinResourceRootType(true)
@@ -13,12 +13,13 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType
sealed class KotlinResourceRootType() : JpsElementTypeBase<JavaResourceRootProperties>(), sealed class KotlinResourceRootType() : JpsElementTypeBase<JavaResourceRootProperties>(),
JpsModuleSourceRootType<JavaResourceRootProperties> { JpsModuleSourceRootType<JavaResourceRootProperties> {
object Resource : KotlinResourceRootType()
object TestResource : KotlinResourceRootType() {
override fun isForTests() = true
}
override fun createDefaultProperties() = override fun createDefaultProperties() =
JpsJavaExtensionService.getInstance().createResourceRootProperties("", false) JpsJavaExtensionService.getInstance().createResourceRootProperties("", false)
} }
object ResourceKotlinRootType : KotlinResourceRootType()
object TestResourceKotlinRootType : KotlinResourceRootType() {
override fun isForTests() = true
}
@@ -13,8 +13,6 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType
sealed class KotlinResourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaResourceRootProperties>(), sealed class KotlinResourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaResourceRootProperties>(),
JpsModuleSourceRootType<JavaResourceRootProperties>, KotlinRootType { JpsModuleSourceRootType<JavaResourceRootProperties>, KotlinRootType {
object Resource : KotlinResourceRootType(false)
object TestResource : KotlinResourceRootType(true)
override fun createDefaultProperties() = override fun createDefaultProperties() =
JpsJavaExtensionService.getInstance().createResourceRootProperties("", false) JpsJavaExtensionService.getInstance().createResourceRootProperties("", false)
@@ -23,3 +21,6 @@ sealed class KotlinResourceRootType(val isTest: Boolean) : JpsElementTypeBase<Ja
override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other) override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other)
} }
object ResourceKotlinRootType : KotlinResourceRootType(false)
object TestResourceKotlinRootType : KotlinResourceRootType(true)
@@ -12,14 +12,10 @@ import org.jetbrains.jps.model.java.JpsJavaExtensionService
import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.jps.model.module.JpsModuleSourceRootType
sealed class KotlinSourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaSourceRootProperties>(), JpsModuleSourceRootType<JavaSourceRootProperties>, KotlinRootType { sealed class KotlinSourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaSourceRootProperties>(), JpsModuleSourceRootType<JavaSourceRootProperties>, KotlinRootType {
object Source : KotlinSourceRootType(false)
object TestSource : KotlinSourceRootType(true)
override fun createDefaultProperties() = JpsJavaExtensionService.getInstance().createSourceRootProperties("") override fun createDefaultProperties() = JpsJavaExtensionService.getInstance().createSourceRootProperties("")
companion object {
val ALL_SOURCES = setOf(Source, TestSource)
}
override fun isTestRoot() = isTest override fun isTestRoot() = isTest
@@ -28,3 +24,8 @@ sealed class KotlinSourceRootType(val isTest: Boolean) : JpsElementTypeBase<Java
override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other) override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other)
} }
object SourceKotlinRootType : KotlinSourceRootType(false)
object TestSourceKotlinRootType : KotlinSourceRootType(true)
val ALL_KOTLIN_SOURCE_ROOT_TYPES = setOf(SourceKotlinRootType, TestSourceKotlinRootType)
@@ -12,17 +12,18 @@ import org.jetbrains.jps.model.java.JpsJavaExtensionService
import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.jps.model.module.JpsModuleSourceRootType
sealed class KotlinSourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaSourceRootProperties>(), JpsModuleSourceRootType<JavaSourceRootProperties>, KotlinRootType { sealed class KotlinSourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaSourceRootProperties>(), JpsModuleSourceRootType<JavaSourceRootProperties>, KotlinRootType {
object Source : KotlinSourceRootType(false)
object TestSource : KotlinSourceRootType(true)
override fun createDefaultProperties() = JpsJavaExtensionService.getInstance().createSourceRootProperties("") override fun createDefaultProperties() = JpsJavaExtensionService.getInstance().createSourceRootProperties("")
companion object {
val ALL_SOURCES = setOf(Source, TestSource)
}
override fun isTestRoot() = isTest override fun isTestRoot() = isTest
override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other) override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other)
} }
object SourceKotlinRootType : KotlinSourceRootType(false)
object TestSourceKotlinRootType : KotlinSourceRootType(true)
val ALL_KOTLIN_SOURCE_ROOT_TYPES = setOf(SourceKotlinRootType, TestSourceKotlinRootType)
@@ -12,16 +12,15 @@ import org.jetbrains.jps.model.java.JpsJavaExtensionService
import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.jps.model.module.JpsModuleSourceRootType
sealed class KotlinSourceRootType() : JpsElementTypeBase<JavaSourceRootProperties>(), JpsModuleSourceRootType<JavaSourceRootProperties> { sealed class KotlinSourceRootType() : JpsElementTypeBase<JavaSourceRootProperties>(), JpsModuleSourceRootType<JavaSourceRootProperties> {
object Source : KotlinSourceRootType()
object TestSource : KotlinSourceRootType() {
override fun isForTests() = true
}
override fun createDefaultProperties() = JpsJavaExtensionService.getInstance().createSourceRootProperties("") override fun createDefaultProperties() = JpsJavaExtensionService.getInstance().createSourceRootProperties("")
companion object {
val ALL_SOURCES = setOf(Source, TestSource)
}
} }
object SourceKotlinRootType : KotlinSourceRootType()
object TestSourceKotlinRootType : KotlinSourceRootType() {
override fun isForTests() = true
}
val ALL_KOTLIN_SOURCE_ROOT_TYPES = setOf(SourceKotlinRootType, TestSourceKotlinRootType)
@@ -12,17 +12,20 @@ import org.jetbrains.jps.model.java.JpsJavaExtensionService
import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.jps.model.module.JpsModuleSourceRootType
sealed class KotlinSourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaSourceRootProperties>(), JpsModuleSourceRootType<JavaSourceRootProperties>, KotlinRootType { sealed class KotlinSourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaSourceRootProperties>(), JpsModuleSourceRootType<JavaSourceRootProperties>, KotlinRootType {
object Source : KotlinSourceRootType(false)
object TestSource : KotlinSourceRootType(true)
override fun createDefaultProperties() = JpsJavaExtensionService.getInstance().createSourceRootProperties("") override fun createDefaultProperties() = JpsJavaExtensionService.getInstance().createSourceRootProperties("")
companion object {
val ALL_SOURCES = setOf(Source, TestSource)
}
override fun isTestRoot() = isTest override fun isTestRoot() = isTest
fun isForTests() = isTest
override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other) override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other)
} }
object SourceKotlinRootType : KotlinSourceRootType(false)
object TestSourceKotlinRootType : KotlinSourceRootType(true)
val ALL_KOTLIN_SOURCE_ROOT_TYPES = setOf(SourceKotlinRootType, TestSourceKotlinRootType)
@@ -0,0 +1,31 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.config
import org.jetbrains.jps.model.ex.JpsElementTypeBase
import org.jetbrains.jps.model.java.JavaSourceRootProperties
import org.jetbrains.jps.model.java.JavaSourceRootType
import org.jetbrains.jps.model.java.JpsJavaExtensionService
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
sealed class KotlinSourceRootType(val isTest: Boolean) : JpsElementTypeBase<JavaSourceRootProperties>(), JpsModuleSourceRootType<JavaSourceRootProperties>, KotlinRootType {
override fun createDefaultProperties() = JpsJavaExtensionService.getInstance().createSourceRootProperties("")
override fun isTestRoot() = isTest
fun isForTests() = isTest
override fun equals(other: Any?) = if (super.equals(other)) true else isSameRootType(this, other)
}
object SourceKotlinRootType : KotlinSourceRootType(false)
object TestSourceKotlinRootType : KotlinSourceRootType(true)
val ALL_KOTLIN_SOURCE_ROOT_TYPES = setOf(SourceKotlinRootType, TestSourceKotlinRootType)
@@ -27,12 +27,12 @@ sealed class KotlinSourceRootPropertiesSerializer(
typeId: String typeId: String
) : JpsModuleSourceRootPropertiesSerializer<JavaSourceRootProperties>(type, typeId) { ) : JpsModuleSourceRootPropertiesSerializer<JavaSourceRootProperties>(type, typeId) {
object Source : KotlinSourceRootPropertiesSerializer( object Source : KotlinSourceRootPropertiesSerializer(
KotlinSourceRootType.Source, SourceKotlinRootType,
KOTLIN_SOURCE_ROOT_TYPE_ID KOTLIN_SOURCE_ROOT_TYPE_ID
) )
object TestSource : KotlinSourceRootPropertiesSerializer( object TestSource : KotlinSourceRootPropertiesSerializer(
KotlinSourceRootType.TestSource, TestSourceKotlinRootType,
KOTLIN_TEST_ROOT_TYPE_ID KOTLIN_TEST_ROOT_TYPE_ID
) )
@@ -59,12 +59,12 @@ sealed class KotlinResourceRootPropertiesSerializer(
typeId: String typeId: String
) : JpsModuleSourceRootPropertiesSerializer<JavaResourceRootProperties>(type, typeId) { ) : JpsModuleSourceRootPropertiesSerializer<JavaResourceRootProperties>(type, typeId) {
object Resource : KotlinResourceRootPropertiesSerializer( object Resource : KotlinResourceRootPropertiesSerializer(
KotlinResourceRootType.Resource, ResourceKotlinRootType,
KOTLIN_RESOURCE_ROOT_TYPE_ID KOTLIN_RESOURCE_ROOT_TYPE_ID
) )
object TestResource : KotlinResourceRootPropertiesSerializer( object TestResource : KotlinResourceRootPropertiesSerializer(
KotlinResourceRootType.TestResource, TestResourceKotlinRootType,
KOTLIN_TEST_RESOURCE_ROOT_TYPE_ID KOTLIN_TEST_RESOURCE_ROOT_TYPE_ID
) )
override fun loadProperties(sourceRootTag: Element): JavaResourceRootProperties { override fun loadProperties(sourceRootTag: Element): JavaResourceRootProperties {
@@ -12,7 +12,8 @@ import org.jetbrains.jps.builders.java.ResourcesTargetType
import org.jetbrains.jps.builders.storage.BuildDataPaths import org.jetbrains.jps.builders.storage.BuildDataPaths
import org.jetbrains.jps.incremental.ResourcesTarget import org.jetbrains.jps.incremental.ResourcesTarget
import org.jetbrains.jps.model.java.JavaResourceRootProperties import org.jetbrains.jps.model.java.JavaResourceRootProperties
import org.jetbrains.kotlin.config.KotlinResourceRootType import org.jetbrains.kotlin.config.ResourceKotlinRootType
import org.jetbrains.kotlin.config.TestResourceKotlinRootType
class KotlinResourcesRootProvider : AdditionalRootsProviderService<ResourceRootDescriptor>(ResourcesTargetType.ALL_TYPES) { class KotlinResourcesRootProvider : AdditionalRootsProviderService<ResourceRootDescriptor>(ResourcesTargetType.ALL_TYPES) {
override fun getAdditionalRoots( override fun getAdditionalRoots(
@@ -26,7 +27,7 @@ class KotlinResourcesRootProvider : AdditionalRootsProviderService<ResourceRootD
// Add source roots with type KotlinResourceRootType. // Add source roots with type KotlinResourceRootType.
// See the note in KotlinSourceRootProvider // See the note in KotlinSourceRootProvider
val kotlinResourceRootType = if (target.isTests) KotlinResourceRootType.TestResource else KotlinResourceRootType.Resource val kotlinResourceRootType = if (target.isTests) TestResourceKotlinRootType else ResourceKotlinRootType
module.getSourceRoots(kotlinResourceRootType).forEach { module.getSourceRoots(kotlinResourceRootType).forEach {
result.add( result.add(
ResourceRootDescriptor( ResourceRootDescriptor(
@@ -16,8 +16,7 @@ import org.jetbrains.jps.model.java.JavaSourceRootProperties
import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.jps.model.java.JavaSourceRootType
import org.jetbrains.jps.model.module.JpsModule import org.jetbrains.jps.model.module.JpsModule
import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.jps.model.module.JpsModuleSourceRootType
import org.jetbrains.kotlin.config.KotlinResourceRootType import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.config.KotlinSourceRootType
import org.jetbrains.kotlin.jps.model.expectedByModules import org.jetbrains.kotlin.jps.model.expectedByModules
import org.jetbrains.kotlin.jps.model.isTestModule import org.jetbrains.kotlin.jps.model.isTestModule
import org.jetbrains.kotlin.jps.model.sourceSetModules import org.jetbrains.kotlin.jps.model.sourceSetModules
@@ -39,7 +38,7 @@ class KotlinSourceRootProvider : AdditionalRootsProviderService<JavaSourceRootDe
// `ModuleBuildTarget.computeAllTargets`. `ModuleBuildTarget` is required for incremental compilation. // `ModuleBuildTarget.computeAllTargets`. `ModuleBuildTarget` is required for incremental compilation.
// We cannot define our own `ModuleBuildTarget` since it is final and `ModuleBuildTarget` supports only `JavaSourceRootDescriptor`. // We cannot define our own `ModuleBuildTarget` since it is final and `ModuleBuildTarget` supports only `JavaSourceRootDescriptor`.
// So the only one way to support `KotlinSourceRootType` is to add a fake `JavaSourceRootDescriptor` for each source root with that type. // So the only one way to support `KotlinSourceRootType` is to add a fake `JavaSourceRootDescriptor` for each source root with that type.
val kotlinSourceRootType = if (target.isTests) KotlinSourceRootType.TestSource else KotlinSourceRootType.Source val kotlinSourceRootType = if (target.isTests) TestSourceKotlinRootType else SourceKotlinRootType
module.getSourceRoots(kotlinSourceRootType).forEach { module.getSourceRoots(kotlinSourceRootType).forEach {
result.add( result.add(
JavaSourceRootDescriptor( JavaSourceRootDescriptor(
@@ -95,8 +94,8 @@ class KotlinSourceRootProvider : AdditionalRootsProviderService<JavaSourceRootDe
private val JpsModuleSourceRootType<*>.isTestsRootType private val JpsModuleSourceRootType<*>.isTestsRootType
get() = when (this) { get() = when (this) {
is KotlinSourceRootType -> this == KotlinSourceRootType.TestSource is KotlinSourceRootType -> this == TestSourceKotlinRootType
is KotlinResourceRootType -> this == KotlinResourceRootType.TestResource is KotlinResourceRootType -> this == TestResourceKotlinRootType
// for compatibility: // for compatibility:
is JavaSourceRootType -> this == JavaSourceRootType.TEST_SOURCE is JavaSourceRootType -> this == JavaSourceRootType.TEST_SOURCE
is JavaResourceRootType -> this == JavaResourceRootType.TEST_RESOURCE is JavaResourceRootType -> this == JavaResourceRootType.TEST_RESOURCE