@@ -146,7 +146,7 @@ private fun ImportContext2.convertToCandidates(itemsPaths: List<ItemUsePath>): L
146
146
itemsPsi.flatMap { itemPsi ->
147
147
paths.map { path ->
148
148
val qualifiedItem = QualifiedNamedItem2 (itemPsi, path.path, path.crate)
149
- val importInfo = qualifiedItem.toImportInfo(rootDefMap, rootModData)
149
+ val importInfo = qualifiedItem.toImportInfo(rootDefMap, rootModData, path.needExternCrate )
150
150
ImportCandidate2 (qualifiedItem, importInfo)
151
151
}
152
152
}
@@ -163,7 +163,8 @@ private data class ModUsePath(
163
163
/* * corresponds to `path.first()` */
164
164
val crate : Crate ,
165
165
/* * corresponds to `path.last()` */
166
- val mod : ModData
166
+ val mod : ModData ,
167
+ val needExternCrate : Boolean ,
167
168
) {
168
169
override fun toString (): String = path.joinToString(" ::" )
169
170
}
@@ -175,7 +176,7 @@ private fun ImportContext2.getAllModPaths(): List<ModUsePath> {
175
176
for ((crateName, defMap) in defMaps.all) {
176
177
val filterCrate = { crate: CratePersistentId -> crate == defMap.crate || crate !in explicitCrates }
177
178
val crate = project.crateGraph.findCrateById(defMap.crate) ? : continue
178
- val rootPath = ModUsePath (arrayOf(crateName), crate, defMap.root)
179
+ val rootPath = ModUsePath (arrayOf(crateName), crate, defMap.root, needExternCrate = defMap.crate !in explicitCrates )
179
180
visitVisibleModules(rootPath, filterCrate, result::add)
180
181
}
181
182
return result
@@ -211,7 +212,7 @@ private fun ImportContext2.findPathsToModulesInScope(path: ModUsePath): List<Mod
211
212
it.isModOrEnum && checkVisibility(it, path.mod)
212
213
} ? : return @mapNotNull null
213
214
val childModData = rootDefMap.tryCastToModData(childMod) ? : return @mapNotNull null
214
- ModUsePath (path.path + name, path.crate, childModData)
215
+ path.copy (path = path .path + name, mod = childModData)
215
216
}
216
217
217
218
private data class InitialDefMaps (
@@ -293,7 +294,8 @@ private data class ItemUsePath(
293
294
val crate : Crate ,
294
295
/* * corresponds to `path.last()` */
295
296
val item : VisItem ,
296
- val namespace : Namespace
297
+ val namespace : Namespace ,
298
+ val needExternCrate : Boolean ,
297
299
) {
298
300
fun toItemWithNamespace (): ItemWithNamespace = ItemWithNamespace (item.path, item.isModOrEnum, namespace)
299
301
@@ -317,7 +319,7 @@ private fun ImportContext2.getPerNsPaths(modPath: ModUsePath, perNs: PerNs, name
317
319
checkVisibility(it, modPath.mod)
318
320
&& (type == ImportContext2 .Type .OTHER || ! hasVisibleItemInRootScope(name, namespace))
319
321
}
320
- .map { ItemUsePath (modPath.path + name, modPath.crate, it, namespace) }
322
+ .map { ItemUsePath (modPath.path + name, modPath.crate, it, namespace, modPath.needExternCrate ) }
321
323
}
322
324
323
325
private fun ImportContext2.hasVisibleItemInRootScope (name : String , namespace : Namespace ): Boolean {
@@ -331,7 +333,7 @@ private fun ImportContext2.getTraitsPathsInMod(modPath: ModUsePath, traits: Set<
331
333
.flatMap { (name, perNs) ->
332
334
perNs.types
333
335
.filter { checkVisibility(it, modPath.mod) && it.path in traits }
334
- .map { ItemUsePath (modPath.path + name, modPath.crate, it, Namespace .Types ) }
336
+ .map { ItemUsePath (modPath.path + name, modPath.crate, it, Namespace .Types , modPath.needExternCrate ) }
335
337
}
336
338
337
339
@@ -388,15 +390,16 @@ private fun ImportContext2.isUsefulTraitImport(usePath: String): Boolean {
388
390
|| element.canBeAccessedByTraitName
389
391
}
390
392
391
- private fun QualifiedNamedItem2.toImportInfo (defMap : CrateDefMap , modData : ModData ): ImportInfo {
393
+ private fun QualifiedNamedItem2.toImportInfo (defMap : CrateDefMap , modData : ModData , needExternCrate : Boolean ): ImportInfo {
392
394
val crateName = path.first()
393
395
return if (crateName == " crate" ) {
394
396
val usePath = path.joinToString(" ::" ).let {
395
397
if (defMap.isAtLeastEdition2018) it else it.removePrefix(" crate::" )
396
398
}
397
399
ImportInfo .LocalImportInfo (usePath)
398
400
} else {
399
- val needInsertExternCrateItem = ! defMap.isAtLeastEdition2018 && ! defMap.hasExternCrateInCrateRoot(crateName)
401
+ val needInsertExternCrateItem = needExternCrate
402
+ || ! defMap.isAtLeastEdition2018 && ! defMap.hasExternCrateInCrateRoot(crateName)
400
403
val crateRelativePath = path.copyOfRange(1 , path.size).joinToString(" ::" )
401
404
ImportInfo .ExternCrateImportInfo (
402
405
crate = containingCrate,
0 commit comments