From e3bd99d5105c8ec4c690a82d3767dc06a3e145dd Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Thu, 12 Mar 2015 15:16:47 +0300 Subject: [PATCH] JS: fix clash between sources and metadata in one library --- build.xml | 1 + .../idea/caches/resolve/JsAnalyzerFacade.kt | 14 +++-- .../navigation/DecompiledNavigationUtils.java | 13 ++-- .../decompiler/navigation/JsMetaFileUtils.kt | 63 +++++++++++-------- 4 files changed, 56 insertions(+), 35 deletions(-) diff --git a/build.xml b/build.xml index 82e577b539c..3f8ce0a9c04 100644 --- a/build.xml +++ b/build.xml @@ -355,6 +355,7 @@ + diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsAnalyzerFacade.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsAnalyzerFacade.kt index 2777fc4f624..0faf74c4cbb 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsAnalyzerFacade.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsAnalyzerFacade.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.context.GlobalContext import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.di.InjectorForLazyResolve +import org.jetbrains.kotlin.idea.framework.JsHeaderLibraryDetectionUtil import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS import org.jetbrains.kotlin.js.resolve.KotlinJsCheckerProvider import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap @@ -61,12 +62,15 @@ public object JsAnalyzerFacade : AnalyzerFacade(descriptor, javaClass()) if (containingPackageFragment == null) return null val module = DescriptorUtils.getContainingModule(descriptor) assert(module is ModuleDescriptorImpl) - var moduleName = getModuleName(module) - - return getKotlinJavascriptLibrary(moduleName, project) -} - -fun getKotlinJavascriptLibrary(libraryName: String, project: Project): Library? { - var library: Library? = null - val jsModules = ModuleManager.getInstance(project).getModules().filter { (ProjectStructureUtil.isJsKotlinModule(it)) } - jsModules.forEach { module -> - ModuleRootManager.getInstance(module).orderEntries().librariesOnly().forEachLibrary { - if (it.getName() == libraryName) { library = it; false } else true - } - } - - return library + return getKotlinJavascriptLibrary(module, project) } fun getKotlinJavascriptLibrary(file: VirtualFile, project: Project): Library? { val module = file.getUserData(JsMetaFileVirtualFileHolder.MODULE_DESCRIPTOR_KEY) if (module == null) return null - var moduleName = getModuleName(module) - - return getKotlinJavascriptLibrary(moduleName, project) + return getKotlinJavascriptLibrary(module, project) } -private fun getModuleName(module: ModuleDescriptor): String { - var moduleName = module.getName().asString() - moduleName = moduleName.substring(1, moduleName.length() - 1) - if (moduleName.startsWith(LIBRARY_NAME_PREFIX)) { - moduleName = moduleName.substring(LIBRARY_NAME_PREFIX.length()) +private fun Library.isWithoutSources(): Boolean = + !JsHeaderLibraryDetectionUtil.isJsHeaderLibraryWithSources(this.getFiles(OrderRootType.CLASSES).toList()) + +// getName() could return null for module level library +private fun Library.safeGetName(): String = this.getName() ?: "null" + +private fun getKotlinJavascriptLibrary(module: ModuleDescriptor, project: Project): Library? { + val libraryName = getLibraryName(module) + if (libraryName == null) return null + + val jsIdeaModules = ModuleManager.getInstance(project).getModules().filter { (ProjectStructureUtil.isJsKotlinModule(it)) } + for(ideaModule in jsIdeaModules) { + for(orderEntry in ModuleRootManager.getInstance(ideaModule).getOrderEntries()) { + if (orderEntry is LibraryOrderEntry) { + val library = orderEntry.getLibrary() + if (library != null && library.safeGetName() == libraryName && library.isWithoutSources()) { + return library + } + } + } } - return moduleName + return null +} + +private fun getLibraryName(module: ModuleDescriptor): String? { + var moduleName = module.getName().asString() + moduleName = moduleName.substring(1, moduleName.length() - 1) + + if (!moduleName.startsWith(LIBRARY_NAME_PREFIX)) return null + + return moduleName.substring(LIBRARY_NAME_PREFIX.length()) } class JsMetaFileVirtualFileHolder private(val myProject: Project) { - default object { + class object { public val MODULE_DESCRIPTOR_KEY: Key = Key.create("MODULE_DESCRIPTOR") public val PACKAGE_FQNAME_KEY: Key = Key.create("PACKAGE_FQNAME_KEY") private val JS_META_FILE_HOLDER_KEY: Key = Key.create("JS_META_FILE_HOLDER_KEY")