diff --git a/src/main/kotlin/org/rust/lang/core/resolve/ItemResolution.kt b/src/main/kotlin/org/rust/lang/core/resolve/ItemResolution.kt index b5d2d6a020b..a8de9bb8f20 100644 --- a/src/main/kotlin/org/rust/lang/core/resolve/ItemResolution.kt +++ b/src/main/kotlin/org/rust/lang/core/resolve/ItemResolution.kt @@ -18,7 +18,7 @@ import org.rust.lang.core.psi.ext.* import org.rust.lang.core.resolve.ref.RsReference import org.rust.lang.core.resolve.ref.advancedDeepResolve import org.rust.lang.core.resolve2.processItemDeclarations2 -import org.rust.lang.core.resolve2.shouldUseProcessItemDeclarations2 +import org.rust.lang.core.resolve2.shouldUseNewResolveIn import org.rust.openapiext.recursionGuard import org.rust.stdext.intersects import java.util.* @@ -67,7 +67,7 @@ fun processItemDeclarations( originalProcessor: RsResolveProcessor, ipm: ItemProcessingMode ): Boolean { - if (scope is RsMod && shouldUseProcessItemDeclarations2(scope)) { + if (scope is RsMod && shouldUseNewResolveIn(scope)) { return processItemDeclarations2(scope, ns, originalProcessor, ipm) } diff --git a/src/main/kotlin/org/rust/lang/core/resolve/NameResolution.kt b/src/main/kotlin/org/rust/lang/core/resolve/NameResolution.kt index b7f6247188c..9fbc998d6b2 100644 --- a/src/main/kotlin/org/rust/lang/core/resolve/NameResolution.kt +++ b/src/main/kotlin/org/rust/lang/core/resolve/NameResolution.kt @@ -31,7 +31,7 @@ import org.rust.lang.RsConstants import org.rust.lang.core.FeatureAvailability import org.rust.lang.core.IN_BAND_LIFETIMES import org.rust.lang.core.crate.Crate -import org.rust.lang.core.crate.impl.DoctestCrate +import org.rust.lang.core.crate.impl.CargoBasedCrate import org.rust.lang.core.macros.* import org.rust.lang.core.psi.* import org.rust.lang.core.psi.RsFile.Attributes.* @@ -47,6 +47,7 @@ import org.rust.lang.core.resolve.indexes.RsMacroIndex import org.rust.lang.core.resolve.ref.* import org.rust.lang.core.resolve2.isNewResolveEnabled import org.rust.lang.core.resolve2.processMacros +import org.rust.lang.core.resolve2.shouldUseNewResolveIn import org.rust.lang.core.stubs.index.RsNamedElementIndex import org.rust.lang.core.types.* import org.rust.lang.core.types.consts.CtInferVar @@ -877,7 +878,8 @@ private fun processMacrosExportedByCrate(crateRoot: RsFile, processor: RsResolve fun processMacroCallVariantsInScope(context: PsiElement, processor: RsResolveProcessor): Boolean { val result = MacroResolver.processMacrosInLexicalOrderUpward(context, processor) - if (context.project.isNewResolveEnabled) return result + val containingMod = context.contextOrSelf()?.containingMod + if (containingMod != null && shouldUseNewResolveIn(containingMod)) return result if (result) return true val element = context.contextOrSelf() ?: return false @@ -897,7 +899,8 @@ private class MacroResolver private constructor( if (result == true) return true // `startElement.parent is RsMod` => use `CrateDefMap` if new resolve is enabled - if (project.isNewResolveEnabled && startElement.contextOrSelf()?.containingCrate !is DoctestCrate) { + val containingMod = startElement.contextOrSelf()?.containingMod + if (containingMod != null && shouldUseNewResolveIn(containingMod)) { check(result == null) { "we must encounter RsMod while processing scopes upward" } return false } @@ -941,7 +944,7 @@ private class MacroResolver private constructor( if (expandedFrom != null && processExpandedFrom(expandedFrom)) return true val context = expandedFrom ?: element.context ?: return false - if (project.isNewResolveEnabled && context is RsMod && context.containingCrate !is DoctestCrate) { + if (context is RsMod && shouldUseNewResolveIn(context)) { if (processRemainedExportedMacros()) return true // process local imports return if (processMacros(context, processor)) true else null } @@ -969,7 +972,7 @@ private class MacroResolver private constructor( if (expandedFrom != null && processExpandedFrom(expandedFrom)) return true val parentPsi = expandedFrom ?: parentStub.psi - if (project.isNewResolveEnabled && parentPsi is RsMod && parentPsi.containingCrate !is DoctestCrate) { + if (parentPsi is RsMod && shouldUseNewResolveIn(parentPsi)) { if (processRemainedExportedMacros()) return true // process local imports return if (processMacros(parentPsi, processor)) true else null } diff --git a/src/main/kotlin/org/rust/lang/core/resolve2/FacadeResolve.kt b/src/main/kotlin/org/rust/lang/core/resolve2/FacadeResolve.kt index 327a15aa1b5..3d8a62ad280 100644 --- a/src/main/kotlin/org/rust/lang/core/resolve2/FacadeResolve.kt +++ b/src/main/kotlin/org/rust/lang/core/resolve2/FacadeResolve.kt @@ -10,6 +10,7 @@ import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS import org.rust.cargo.project.settings.rustSettings import org.rust.ide.utils.isEnabledByCfg import org.rust.lang.core.crate.Crate +import org.rust.lang.core.crate.impl.CargoBasedCrate import org.rust.lang.core.crate.impl.DoctestCrate import org.rust.lang.core.psi.* import org.rust.lang.core.psi.ext.* @@ -18,11 +19,12 @@ import org.rust.lang.core.resolve.ItemProcessingMode.WITHOUT_PRIVATE_IMPORTS import org.rust.openapiext.toPsiFile @Suppress("SimplifyBooleanWithConstants") -val Project.isNewResolveEnabled: Boolean get() = rustSettings.newResolveEnabled || true +val Project.isNewResolveEnabled: Boolean + get() = rustSettings.newResolveEnabled || true -fun shouldUseProcessItemDeclarations2(scope: RsMod) = +fun shouldUseNewResolveIn(scope: RsMod) = scope.project.isNewResolveEnabled - && scope.containingCrate !is DoctestCrate + && scope.containingCrate is CargoBasedCrate && scope.modName != TMP_MOD_NAME && !scope.isModInsideItem && scope.containingCrate != null diff --git a/src/test/kotlin/org/rust/lang/core/resolve/RsDoctestInjectionResolveTest.kt b/src/test/kotlin/org/rust/lang/core/resolve/RsDoctestInjectionResolveTest.kt index a212f99d291..5dc6b99cd23 100644 --- a/src/test/kotlin/org/rust/lang/core/resolve/RsDoctestInjectionResolveTest.kt +++ b/src/test/kotlin/org/rust/lang/core/resolve/RsDoctestInjectionResolveTest.kt @@ -5,12 +5,11 @@ package org.rust.lang.core.resolve -import org.junit.Ignore import org.rust.ProjectDescriptor import org.rust.WithDependencyRustProjectDescriptor import org.rust.WithStdlibAndDependencyRustProjectDescriptor +import org.rust.stdext.BothEditions -@Ignore // todo doctest class RsDoctestInjectionResolveTest : RsResolveTestBase() { @ProjectDescriptor(WithDependencyRustProjectDescriptor::class) fun `test resolve outer element`() = checkByCode(""" @@ -65,6 +64,18 @@ class RsDoctestInjectionResolveTest : RsResolveTestBase() { } """) + @BothEditions + @ProjectDescriptor(WithStdlibAndDependencyRustProjectDescriptor::class) + fun `test macro from stdlib`() = stubOnlyResolve(""" + //- lib.rs + /// ``` + /// fn main() { + /// println!("Hello, World!"); + /// } //^ ...libstd/macros.rs + /// ``` + pub fn foo() {} + """) + @ProjectDescriptor(WithDependencyRustProjectDescriptor::class) fun `test extra extern crate`() = stubOnlyResolve(""" //- lib.rs