diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index ceebabf4261..13f96f07473 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -146,7 +146,7 @@ public trait AnalyzerFacade diff --git a/compiler/frontend/src/org/jetbrains/kotlin/context/context.kt b/compiler/frontend/src/org/jetbrains/kotlin/context/context.kt index fbaf05fd45e..194fa0e1d11 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/context/context.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/context/context.kt @@ -51,14 +51,11 @@ public trait MutableModuleContext: ModuleContext { override val module: ModuleDescriptorImpl public fun setDependencies(vararg dependencies: ModuleDescriptorImpl) { - setDependencies(dependencies.toList()) + module.setDependencies(*dependencies) } public fun setDependencies(dependencies: List) { - for (dependency in dependencies) { - module.addDependencyOnModule(dependency) - } - module.seal() + module.setDependencies(dependencies) } public fun initializeModuleContents(packageFragmentProvider: PackageFragmentProvider) { diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsTest.java b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsTest.java index a6dfc81c447..5af3b85cba1 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsTest.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsTest.java @@ -327,13 +327,14 @@ public abstract class AbstractJetDiagnosticsTest extends BaseDiagnosticsTest { if (testModule == null) continue; ModuleDescriptorImpl module = modules.get(testModule); - module.addDependencyOnModule(module); + List dependencies = new ArrayList(); + dependencies.add(module); for (TestModule dependency : testModule.getDependencies()) { - module.addDependencyOnModule(modules.get(dependency)); + dependencies.add(modules.get(dependency)); } - module.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule()); - module.seal(); + dependencies.add(KotlinBuiltIns.getInstance().getBuiltInsModule()); + module.setDependencies(dependencies); } return modules; @@ -349,9 +350,7 @@ public abstract class AbstractJetDiagnosticsTest extends BaseDiagnosticsTest { @NotNull protected ModuleDescriptorImpl createSealedModule(@NotNull StorageManager storageManager) { ModuleDescriptorImpl moduleDescriptor = createModule("", storageManager); - moduleDescriptor.addDependencyOnModule(moduleDescriptor); - moduleDescriptor.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule()); - moduleDescriptor.seal(); + moduleDescriptor.setDependencies(moduleDescriptor, KotlinBuiltIns.getInstance().getBuiltInsModule()); return moduleDescriptor; } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsTestWithJsStdLib.java b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsTestWithJsStdLib.java index 41bf80b5679..5bec27f527e 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsTestWithJsStdLib.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/AbstractJetDiagnosticsTestWithJsStdLib.java @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.storage.StorageManager; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -81,15 +82,15 @@ public abstract class AbstractJetDiagnosticsTestWithJsStdLib extends AbstractJet protected ModuleDescriptorImpl createSealedModule(@NotNull StorageManager storageManager) { ModuleDescriptorImpl module = createModule("", storageManager); - module.addDependencyOnModule(module); + List dependencies = new ArrayList();; + dependencies.add(module); - for(ModuleDescriptorImpl moduleDescriptor : config.getModuleDescriptors()) { - module.addDependencyOnModule(moduleDescriptor); + for (ModuleDescriptorImpl moduleDescriptor : config.getModuleDescriptors()) { + dependencies.add(moduleDescriptor); } - module.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule()); - - module.seal(); + dependencies.add(KotlinBuiltIns.getInstance().getBuiltInsModule()); + module.setDependencies(dependencies); return module; } diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerTest.kt index 2367372294a..5c12656a58e 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerTest.kt @@ -48,9 +48,7 @@ public class BuiltInsSerializerTest : TestCaseWithTmpdir() { } module.initialize(packageFragmentProvider) - module.addDependencyOnModule(module) - module.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule()) - module.seal() + module.setDependencies(module, KotlinBuiltIns.getInstance().getBuiltInsModule()) RecursiveDescriptorComparator.validateAndCompareDescriptorWithFile( module.getPackage(TEST_PACKAGE_FQNAME)!!, diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt index fd50422e429..33e219def4b 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/js/KotlinJavascriptSerializerTest.kt @@ -86,9 +86,7 @@ public class KotlinJavascriptSerializerTest : TestCaseWithTmpdir() { .sure { "No package fragment provider was created" } module.initialize(provider) - module.addDependencyOnModule(module) - module.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule()) - module.seal() + module.setDependencies(module, KotlinBuiltIns.getInstance().getBuiltInsModule()) return module } diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt index 9e902dc67eb..240b7a40061 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt @@ -17,8 +17,8 @@ package org.jetbrains.kotlin.load.kotlin.reflect import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.descriptors.ModuleParameters import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.descriptors.ModuleParameters import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.di.InjectorForRuntimeDescriptorLoader import org.jetbrains.kotlin.name.Name @@ -36,9 +36,7 @@ public class RuntimeModuleData private constructor(private val injector: Injecto val storageManager = LockBasedStorageManager() val module = ModuleDescriptorImpl(Name.special(""), storageManager, ModuleParameters(listOf(), JavaToKotlinClassMap.INSTANCE)) - module.addDependencyOnModule(module) - module.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule()) - module.seal() + module.setDependencies(module, KotlinBuiltIns.getInstance().getBuiltInsModule()) val injector = InjectorForRuntimeDescriptorLoader(classLoader, module, storageManager) module.initialize(injector.getJavaDescriptorResolver().packageFragmentProvider) return RuntimeModuleData(injector) diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index 5363ce299f3..f7c80e56a14 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -126,8 +126,7 @@ public class KotlinBuiltIns { ); builtInsModule.initialize(packageFragmentProvider); - builtInsModule.addDependencyOnModule(builtInsModule); - builtInsModule.seal(); + builtInsModule.setDependencies(builtInsModule); builtinsPackageFragment = (BuiltinsPackageFragment) single(packageFragmentProvider.getPackageFragments(BUILT_INS_PACKAGE_FQ_NAME)); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt index 7597e4e27f8..16616354f95 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.storage.StorageManager -import java.util.ArrayList +import org.jetbrains.kotlin.utils.sure import java.util.LinkedHashSet import kotlin.properties.Delegates @@ -39,31 +39,21 @@ public class ModuleDescriptorImpl( throw IllegalArgumentException("Module name must be special: $moduleName") } } - private var isSealed = false - /* - * Sealed module cannot have its dependencies modified. Seal the module after you're done configuring it. - * Module will be sealed automatically as soon as you query its contents. - */ - public fun seal() { - if (isSealed) return - - assert(this in dependencies) { "Module $id is not contained in his own dependencies, this is probably a misconfiguration" } - isSealed = true - } - - private val dependencies: MutableList = ArrayList() + private var dependencies: ModuleDependencies? = null private var packageFragmentProviderForModuleContent: PackageFragmentProvider? = null private val packageFragmentProviderForWholeModuleWithDependencies by Delegates.lazy { - seal() - dependencies.forEach { + val moduleDependencies = dependencies.sure { "Dependencies of module $id were not set before querying module content" } + val dependenciesDescriptors = moduleDependencies.descriptors + assert(this in dependenciesDescriptors) { "Module ${id} is not contained in his own dependencies, this is probably a misconfiguration" } + dependenciesDescriptors.forEach { dependency -> assert(dependency.isInitialized) { "Dependency module ${dependency.id} was not initialized by the time contents of dependent module ${this.id} were queried" } } - CompositePackageFragmentProvider(dependencies.map { + CompositePackageFragmentProvider(dependenciesDescriptors.map { it.packageFragmentProviderForModuleContent!! }) } @@ -71,12 +61,17 @@ public class ModuleDescriptorImpl( public val isInitialized: Boolean get() = packageFragmentProviderForModuleContent != null - public fun addDependencyOnModule(dependency: ModuleDescriptorImpl) { - assert(!isSealed) { "Can't modify dependencies of sealed module $id" } - assert(dependency !in dependencies) { - "Trying to add dependency on module ${dependency.id} a second time for module ${this.id}, this is probably a misconfiguration" - } - dependencies.add(dependency) + public fun setDependencies(dependencies: ModuleDependencies) { + assert(this.dependencies == null) { "Dependencies of $id were already set" } + this.dependencies = dependencies + } + + public fun setDependencies(vararg descriptors: ModuleDescriptorImpl) { + setDependencies(descriptors.toList()) + } + + public fun setDependencies(descriptors: List) { + setDependencies(ModuleDependenciesImpl(descriptors)) } private val id: String @@ -84,7 +79,6 @@ public class ModuleDescriptorImpl( /* * Call initialize() to set module contents. Uninitialized module cannot be queried for its contents. - * Initialize() and seal() can be called in any order. */ public fun initialize(providerForModuleContent: PackageFragmentProvider) { assert(!isInitialized) { "Attempt to initialize module $id twice" } @@ -106,10 +100,15 @@ public class ModuleDescriptorImpl( public fun addFriend(friend: ModuleDescriptorImpl): Unit { assert(friend != this) { "Attempt to make module $id a friend to itself" } - assert(!isSealed) { "Attempt to add friend module ${friend.id} to sealed module $id" } friendModules.add(friend) } override val builtIns: KotlinBuiltIns get() = KotlinBuiltIns.getInstance() } + +public class ModuleDependenciesImpl(override val descriptors: List) : ModuleDependencies + +public interface ModuleDependencies { + public val descriptors: List +} diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DeserializerForDecompilerBase.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DeserializerForDecompilerBase.kt index c704d9408e0..e5165daf03b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DeserializerForDecompilerBase.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DeserializerForDecompilerBase.kt @@ -68,15 +68,13 @@ public abstract class DeserializerForDecompilerBase( init { moduleDescriptor.initialize(packageFragmentProvider) - moduleDescriptor.addDependencyOnModule(moduleDescriptor) - moduleDescriptor.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule()) val moduleContainingMissingDependencies = createDummyModule("module containing missing dependencies for decompiled sources") - moduleContainingMissingDependencies.addDependencyOnModule(moduleContainingMissingDependencies) + moduleContainingMissingDependencies.setDependencies(moduleContainingMissingDependencies) moduleContainingMissingDependencies.initialize( PackageFragmentProviderForMissingDependencies(moduleContainingMissingDependencies) ) - moduleDescriptor.addDependencyOnModule(moduleContainingMissingDependencies) - moduleDescriptor.seal() - moduleContainingMissingDependencies.seal() + moduleDescriptor.setDependencies( + moduleDescriptor, KotlinBuiltIns.getInstance().getBuiltInsModule(), moduleContainingMissingDependencies + ) } } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/KotlinJavaScriptDecompiledTextConsistencyTest.kt b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/KotlinJavaScriptDecompiledTextConsistencyTest.kt index f9d3159398a..20b3e408377 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/KotlinJavaScriptDecompiledTextConsistencyTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/KotlinJavaScriptDecompiledTextConsistencyTest.kt @@ -62,9 +62,7 @@ public class KotlinJavaScriptDecompiledTextConsistencyTest : TextConsistencyBase .sure { "No package fragment provider was created" } module.initialize(provider) - module.addDependencyOnModule(module) - module.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule()) - module.seal() + module.setDependencies(module, KotlinBuiltIns.getInstance().getBuiltInsModule()) return module } diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/config/Config.java b/js/js.frontend/src/org/jetbrains/kotlin/js/config/Config.java index 68059eb8755..0e5900abc98 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/config/Config.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/config/Config.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.js.config; import com.google.common.collect.Lists; import com.intellij.openapi.project.Project; import com.intellij.util.SmartList; +import kotlin.KotlinPackage; import kotlin.Unit; import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; @@ -164,11 +165,7 @@ public abstract class Config { } private static void setDependencies(ModuleDescriptorImpl module, List modules) { - for (ModuleDescriptorImpl moduleItem : modules) { - module.addDependencyOnModule(moduleItem); - } - module.addDependencyOnModule(KotlinBuiltIns.getInstance().getBuiltInsModule()); - module.seal(); + module.setDependencies(KotlinPackage.plus(modules, KotlinBuiltIns.getInstance().getBuiltInsModule())); } @NotNull