From 386ab71eb1b41b142e705fe24e5e53a184610d58 Mon Sep 17 00:00:00 2001 From: vlad20012 Date: Mon, 2 Sep 2019 17:06:13 +0300 Subject: [PATCH] Fix switch to AST when resolving nested macro with the new engine --- .../org/rust/lang/core/macros/RsExpandedElement.kt | 14 ++++++++++++-- .../org/rust/lang/core/resolve/NameResolution.kt | 2 +- .../rust/lang/core/stubs/StubImplementations.kt | 11 +++++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/org/rust/lang/core/macros/RsExpandedElement.kt b/src/main/kotlin/org/rust/lang/core/macros/RsExpandedElement.kt index 028a94a0d3d..9d03e54b99b 100644 --- a/src/main/kotlin/org/rust/lang/core/macros/RsExpandedElement.kt +++ b/src/main/kotlin/org/rust/lang/core/macros/RsExpandedElement.kt @@ -6,11 +6,11 @@ package org.rust.lang.core.macros import com.intellij.openapi.util.Key -import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement import org.rust.lang.core.psi.RsFile import org.rust.lang.core.psi.RsMacroArgument import org.rust.lang.core.psi.RsMacroCall +import org.rust.lang.core.psi.RsPath import org.rust.lang.core.psi.ext.* import org.rust.lang.core.stubs.index.RsIncludeMacroIndex @@ -144,10 +144,20 @@ private fun PsiElement.findElementExpandedFromNonRecursive(): PsiElement? { } private fun mapOffsetFromExpansionToCallBody(call: RsMacroCall, offset: Int): Int? { + return mapOffsetFromExpansionToCallBodyRelative(call, offset) + ?.fromBodyRelativeOffset(call) +} + +private fun mapOffsetFromExpansionToCallBodyRelative(call: RsMacroCall, offset: Int): Int? { val expansion = call.expansion ?: return null val fileOffset = call.expansionContext.expansionFileStartOffset return expansion.ranges.mapOffsetFromExpansionToCallBody(offset - fileOffset) - ?.fromBodyRelativeOffset(call) +} + +fun PsiElement.cameFromMacroCall(): Boolean { + val call = findMacroCallExpandedFromNonRecursive() ?: return false + val startOffset = (this as? RsPath)?.greenStub?.startOffset ?: startOffset + return mapOffsetFromExpansionToCallBodyRelative(call, startOffset) != null } /** 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 d3d216bdc35..72929387a77 100644 --- a/src/main/kotlin/org/rust/lang/core/resolve/NameResolution.kt +++ b/src/main/kotlin/org/rust/lang/core/resolve/NameResolution.kt @@ -718,7 +718,7 @@ fun processMacroCallPathResolveVariants(path: RsPath, isCompletion: Boolean, pro if (isCompletion) { processMacroCallVariantsInScope(path, processor) } else { - if (path.findElementExpandedFrom(strict = false) == null) { + if (!path.cameFromMacroCall()) { // Handles `#[macro_export(local_inner_macros)]` // this "recursive" macro resolve should not be a problem because // 1. we resolve the macro from which [path] is expanded, so it can't run into infinite recursion diff --git a/src/main/kotlin/org/rust/lang/core/stubs/StubImplementations.kt b/src/main/kotlin/org/rust/lang/core/stubs/StubImplementations.kt index 258378db5b1..5d83ea211b5 100644 --- a/src/main/kotlin/org/rust/lang/core/stubs/StubImplementations.kt +++ b/src/main/kotlin/org/rust/lang/core/stubs/StubImplementations.kt @@ -36,7 +36,7 @@ class RsFileStub : PsiFileStubImpl { object Type : IStubFileElementType(RsLanguage) { // Bump this number if Stub structure changes - override fun getStubVersion(): Int = 179 + override fun getStubVersion(): Int = 180 override fun getBuilder(): StubBuilder = object : DefaultStubBuilder() { override fun createStubForFile(file: PsiFile): StubElement<*> = RsFileStub(file as RsFile) @@ -719,7 +719,8 @@ class RsPathStub( parent: StubElement<*>?, elementType: IStubElementType<*, *>, val referenceName: String, val hasColonColon: Boolean, - val kind: PathKind + val kind: PathKind, + val startOffset: Int ) : StubBase(parent, elementType) { object Type : RsStubElementType("PATH") { @@ -729,13 +730,14 @@ class RsPathStub( RsPathImpl(stub, this) override fun createStub(psi: RsPath, parentStub: StubElement<*>?) = - RsPathStub(parentStub, this, psi.referenceName, psi.hasColonColon, psi.kind) + RsPathStub(parentStub, this, psi.referenceName, psi.hasColonColon, psi.kind, psi.startOffset) override fun deserialize(dataStream: StubInputStream, parentStub: StubElement<*>?) = RsPathStub(parentStub, this, dataStream.readName()!!.string, dataStream.readBoolean(), - dataStream.readEnum() + dataStream.readEnum(), + dataStream.readVarInt() ) override fun serialize(stub: RsPathStub, dataStream: StubOutputStream) = @@ -743,6 +745,7 @@ class RsPathStub( writeName(stub.referenceName) writeBoolean(stub.hasColonColon) writeEnum(stub.kind) + writeVarInt(stub.startOffset) } } }