diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt index 7d18b8be21b..0e0745f3aec 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatform.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.resolve.jvm.platform +import org.jetbrains.kotlin.descriptors.PlatformKind import org.jetbrains.kotlin.platform.JvmBuiltIns import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.ImportPath @@ -47,4 +48,7 @@ object JvmPlatform : TargetPlatform("JVM") { } override val platformConfigurator: PlatformConfigurator = JvmPlatformConfigurator + + override val kind: PlatformKind + get() = PlatformKind.JVM } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index f3acd32a6ca..31435f7c933 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -27,10 +27,7 @@ import org.jetbrains.kotlin.container.ComponentProvider import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.context.withModule -import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentProvider -import org.jetbrains.kotlin.descriptors.PackagePartProvider +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.LazyModuleDependencies import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.name.FqName @@ -56,7 +53,7 @@ abstract class ResolverForProject { abstract val name: String abstract val allModules: Collection - override fun toString() = "$name" + override fun toString() = name } class EmptyResolverForProject : ResolverForProject() { @@ -160,8 +157,10 @@ abstract class AnalyzerFacade { targetEnvironment: TargetEnvironment = CompilerEnvironment, builtIns: KotlinBuiltIns = DefaultBuiltIns.Instance, delegateResolver: ResolverForProject = EmptyResolverForProject(), - packagePartProviderFactory: (M, ModuleContent) -> PackagePartProvider = { module, content -> PackagePartProvider.Empty }, - firstDependency: M? = null + packagePartProviderFactory: (M, ModuleContent) -> PackagePartProvider = { _, _ -> PackagePartProvider.Empty }, + firstDependency: M? = null, + modulePlatforms: (M) -> PlatformKind = { PlatformKind.DEFAULT }, + moduleSources: (M) -> SourceKind = { SourceKind.NONE } ): ResolverForProject { val storageManager = projectContext.storageManager fun createResolverForProject(): ResolverForProjectImpl { @@ -169,7 +168,8 @@ abstract class AnalyzerFacade { modules.forEach { module -> descriptorByModule[module] = - ModuleDescriptorImpl(module.name, storageManager, builtIns, module.capabilities) + ModuleDescriptorImpl(module.name, storageManager, builtIns, + modulePlatforms(module), moduleSources(module), module.capabilities) } return ResolverForProjectImpl(debugName, descriptorByModule, delegateResolver) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt index 2440afd16b0..8aa98d7a148 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TargetPlatform.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.composeContainer import org.jetbrains.kotlin.container.useInstance +import org.jetbrains.kotlin.descriptors.PlatformKind import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap import org.jetbrains.kotlin.resolve.calls.checkers.* import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator @@ -34,6 +35,8 @@ abstract class TargetPlatform(val platformName: String) { abstract val platformConfigurator: PlatformConfigurator abstract val defaultImports: List + abstract val kind: PlatformKind + object Default : TargetPlatform("Default") { override val defaultImports: List = ArrayList().apply { add(ImportPath("kotlin.*")) @@ -55,6 +58,9 @@ abstract class TargetPlatform(val platformName: String) { container.useInstance(TypeSpecificityComparator.NONE) } } + + override val kind: PlatformKind + get() = PlatformKind.DEFAULT } } diff --git a/compiler/tests-common/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.java b/compiler/tests-common/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.java index 4bc0155eb16..31bfc8226a0 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.java +++ b/compiler/tests-common/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.java @@ -48,10 +48,7 @@ import org.jetbrains.kotlin.context.ContextKt; import org.jetbrains.kotlin.context.GlobalContext; import org.jetbrains.kotlin.context.ModuleContext; import org.jetbrains.kotlin.context.SimpleGlobalContext; -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; -import org.jetbrains.kotlin.descriptors.ModuleDescriptor; -import org.jetbrains.kotlin.descriptors.PackagePartProvider; -import org.jetbrains.kotlin.descriptors.PackageViewDescriptor; +import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider; import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl; import org.jetbrains.kotlin.diagnostics.*; @@ -562,7 +559,9 @@ public abstract class AbstractDiagnosticsTest extends BaseDiagnosticsTest { ? Collections.emptyMap() : Collections.singletonMap(MultiTargetPlatform.CAPABILITY, platform); return new ModuleDescriptorImpl( - Name.special("<" + moduleName + ">"), storageManager, new JvmBuiltIns(storageManager), capabilities + Name.special("<" + moduleName + ">"), storageManager, new JvmBuiltIns(storageManager), + platform == MultiTargetPlatform.Common.INSTANCE ? PlatformKind.DEFAULT : PlatformKind.JVM, + SourceKind.TEST, capabilities ); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt index d043a38e34f..3353fefc978 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt @@ -26,6 +26,10 @@ interface ModuleDescriptor : DeclarationDescriptor { val builtIns: KotlinBuiltIns + val platformKind: PlatformKind + + val sourceKind: SourceKind + fun shouldSeeInternalsOf(targetModule: ModuleDescriptor): Boolean override fun substitute(substitutor: TypeSubstitutor): ModuleDescriptor { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/PlatformKind.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PlatformKind.kt new file mode 100644 index 00000000000..b735d8f0ece --- /dev/null +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/PlatformKind.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.descriptors + +enum class PlatformKind { + DEFAULT, + JVM, + JS +} \ No newline at end of file diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/SourceKind.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/SourceKind.kt new file mode 100644 index 00000000000..d44b7b2b9cb --- /dev/null +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/SourceKind.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.descriptors + +enum class SourceKind { + NONE, + PRODUCTION, + TEST +} \ No newline at end of file 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 c8f3772ee1d..71c49b802ea 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt @@ -17,9 +17,7 @@ package org.jetbrains.kotlin.descriptors.impl import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentProvider -import org.jetbrains.kotlin.descriptors.PackageViewDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -31,6 +29,8 @@ class ModuleDescriptorImpl @JvmOverloads constructor( moduleName: Name, private val storageManager: StorageManager, override val builtIns: KotlinBuiltIns, + override val platformKind: PlatformKind = PlatformKind.DEFAULT, + override val sourceKind: SourceKind = SourceKind.NONE, private val capabilities: Map, Any?> = emptyMap() ) : DeclarationDescriptorImpl(Annotations.EMPTY, moduleName), ModuleDescriptor { init { diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index 4ec981ad35a..e086a4a7d13 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -49,6 +49,18 @@ public class ErrorUtils { private static final ModuleDescriptor ERROR_MODULE; static { ERROR_MODULE = new ModuleDescriptor() { + @NotNull + @Override + public PlatformKind getPlatformKind() { + return PlatformKind.DEFAULT; + } + + @NotNull + @Override + public SourceKind getSourceKind() { + return SourceKind.NONE; + } + @Nullable @Override public T getCapability(@NotNull Capability capability) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleDependencyMapper.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleDependencyMapper.kt index 40c83ed471e..ab4e23396f5 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleDependencyMapper.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleDependencyMapper.kt @@ -29,7 +29,10 @@ import org.jetbrains.kotlin.analyzer.ResolverForProject import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.context.GlobalContextImpl import org.jetbrains.kotlin.context.withProject +import org.jetbrains.kotlin.descriptors.PlatformKind +import org.jetbrains.kotlin.descriptors.SourceKind import org.jetbrains.kotlin.idea.project.IdeaEnvironment +import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl import org.jetbrains.kotlin.psi.KtFile @@ -72,7 +75,19 @@ fun createModuleResolverProvider( debugName, globalContext.withProject(project), modulesToCreateResolversFor, modulesContent, jvmPlatformParameters, IdeaEnvironment, builtIns, delegateResolver, { m, c -> IDEPackagePartProvider(c.moduleContentScope) }, - sdk?.let { SdkInfo(project, it) } + sdk?.let { SdkInfo(project, it) }, + modulePlatforms = { moduleInfo -> + val module = (moduleInfo as? ModuleSourceInfo)?.module + module?.let { TargetPlatformDetector.getPlatform(module).kind } ?: PlatformKind.DEFAULT + }, + moduleSources = { moduleInfo -> + when (moduleInfo) { + is ModuleProductionSourceInfo -> SourceKind.PRODUCTION + is ModuleTestSourceInfo -> SourceKind.TEST + else -> SourceKind.NONE + } + } + ) return resolverForProject } diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt index 76d59bcdc4b..92df44c9f6b 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/JsPlatform.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.js.resolve import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.PlatformKind import org.jetbrains.kotlin.resolve.ImportPath import org.jetbrains.kotlin.resolve.PlatformConfigurator import org.jetbrains.kotlin.resolve.TargetPlatform @@ -29,4 +30,8 @@ object JsPlatform : TargetPlatform("JS") { val builtIns: KotlinBuiltIns get() = DefaultBuiltIns.Instance + + override val kind: PlatformKind + get() = PlatformKind.JS + }