Skip to content

Commit

Permalink
Fix resolve stdlib macros in doctest injections
Browse files Browse the repository at this point in the history
  • Loading branch information
dima74 committed Sep 17, 2020
1 parent ff37680 commit b49e681
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 12 deletions.
4 changes: 2 additions & 2 deletions src/main/kotlin/org/rust/lang/core/resolve/ItemResolution.kt
Expand Up @@ -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.*
Expand Down Expand Up @@ -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)
}

Expand Down
13 changes: 8 additions & 5 deletions src/main/kotlin/org/rust/lang/core/resolve/NameResolution.kt
Expand Up @@ -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.*
Expand All @@ -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
Expand Down Expand Up @@ -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<RsElement>()?.containingMod
if (containingMod != null && shouldUseNewResolveIn(containingMod)) return result
if (result) return true

val element = context.contextOrSelf<RsElement>() ?: return false
Expand All @@ -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<RsElement>()?.containingCrate !is DoctestCrate) {
val containingMod = startElement.contextOrSelf<RsElement>()?.containingMod
if (containingMod != null && shouldUseNewResolveIn(containingMod)) {
check(result == null) { "we must encounter RsMod while processing scopes upward" }
return false
}
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down
8 changes: 5 additions & 3 deletions src/main/kotlin/org/rust/lang/core/resolve2/FacadeResolve.kt
Expand Up @@ -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.*
Expand All @@ -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
Expand Down
Expand Up @@ -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("""
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit b49e681

Please sign in to comment.