mirror of
https://github.com/github/codeql.git
synced 2026-04-28 10:15:14 +02:00
Rust: Path resolution before variable resolution
This commit is contained in:
@@ -2,7 +2,7 @@ import rust
|
||||
import codeql.rust.internal.PathResolution
|
||||
import utils.test.PathResolutionInlineExpectationsTest
|
||||
|
||||
query predicate resolveDollarCrate(RelevantPath p, Crate c) {
|
||||
query predicate resolveDollarCrate(PathExt p, Crate c) {
|
||||
c = resolvePath(p) and
|
||||
p.isDollarCrate() and
|
||||
p.fromSource() and
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
private import codeql.util.Boolean
|
||||
private import codeql.rust.controlflow.ControlFlowGraph
|
||||
private import codeql.rust.elements.internal.VariableImpl::Impl as VariableImpl
|
||||
private import rust
|
||||
|
||||
newtype TCompletion =
|
||||
@@ -123,13 +124,7 @@ class BooleanCompletion extends ConditionalCompletion, TBooleanCompletion {
|
||||
*/
|
||||
private predicate cannotCauseMatchFailure(Pat pat) {
|
||||
pat instanceof RangePat or
|
||||
// Identifier patterns that are in fact path patterns can cause failures. For
|
||||
// instance `None`. Only if an `@ ...` part is present can we be sure that
|
||||
// it's an actual identifier pattern. As a heuristic, if the identifier starts
|
||||
// with a lower case letter, then we assume that it's an identifier. This
|
||||
// works for code that follows the Rust naming convention for enums and
|
||||
// constants.
|
||||
pat = any(IdentPat p | p.hasPat() or p.getName().getText().charAt(0).isLowercase()) or
|
||||
pat = any(IdentPat p | p.hasPat() or VariableImpl::variableDecl(_, p.getName(), _)) or
|
||||
pat instanceof WildcardPat or
|
||||
pat instanceof RestPat or
|
||||
pat instanceof RefPat or
|
||||
|
||||
@@ -82,7 +82,7 @@ module Impl {
|
||||
}
|
||||
|
||||
private predicate callHasTraitQualifier(CallExpr call, Trait qualifier) {
|
||||
exists(RelevantPath qualifierPath |
|
||||
exists(PathExt qualifierPath |
|
||||
callHasQualifier(call, _, qualifierPath) and
|
||||
qualifier = resolvePath(qualifierPath) and
|
||||
// When the qualifier is `Self` and resolves to a trait, it's inside a
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
*/
|
||||
|
||||
private import codeql.rust.elements.internal.generated.Const
|
||||
private import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl
|
||||
private import codeql.rust.elements.internal.IdentPatImpl::Impl as IdentPatImpl
|
||||
private import codeql.rust.elements.internal.PathExprImpl::Impl as PathExprImpl
|
||||
private import codeql.rust.internal.PathResolution
|
||||
|
||||
@@ -36,14 +38,30 @@ module Impl {
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
class ConstAccess extends PathExprImpl::PathExpr {
|
||||
private Const c;
|
||||
|
||||
ConstAccess() { c = resolvePath(this.getPath()) }
|
||||
|
||||
abstract class ConstAccess extends AstNodeImpl::AstNode {
|
||||
/** Gets the constant being accessed. */
|
||||
Const getConst() { result = c }
|
||||
abstract Const getConst();
|
||||
|
||||
override string getAPrimaryQlClass() { result = "ConstAccess" }
|
||||
}
|
||||
|
||||
private class PathExprConstAccess extends ConstAccess, PathExprImpl::PathExpr {
|
||||
private Const c;
|
||||
|
||||
PathExprConstAccess() { c = resolvePath(this.getPath()) }
|
||||
|
||||
override Const getConst() { result = c }
|
||||
|
||||
override string getAPrimaryQlClass() { result = ConstAccess.super.getAPrimaryQlClass() }
|
||||
}
|
||||
|
||||
private class IdentPatConstAccess extends ConstAccess, IdentPatImpl::IdentPat {
|
||||
private Const c;
|
||||
|
||||
IdentPatConstAccess() { c = resolvePath(this) }
|
||||
|
||||
override Const getConst() { result = c }
|
||||
|
||||
override string getAPrimaryQlClass() { result = ConstAccess.super.getAPrimaryQlClass() }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,8 @@ module Impl {
|
||||
|
||||
override string toStringImpl() { result = this.getName() }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "FormatTemplateVariableAccess" }
|
||||
|
||||
/** Gets the name of the variable */
|
||||
string getName() { result = argument.getName() }
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
* INTERNAL: Do not use.
|
||||
*/
|
||||
|
||||
private import rust
|
||||
private import codeql.rust.elements.internal.generated.PathExpr
|
||||
|
||||
/**
|
||||
@@ -25,5 +26,11 @@ module Impl {
|
||||
override string toStringImpl() { result = this.toAbbreviatedString() }
|
||||
|
||||
override string toAbbreviatedString() { result = this.getPath().toStringImpl() }
|
||||
|
||||
override string getAPrimaryQlClass() {
|
||||
if this instanceof VariableAccess
|
||||
then result = "VariableAccess"
|
||||
else result = super.getAPrimaryQlClass()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
private import rust
|
||||
private import codeql.rust.controlflow.ControlFlowGraph
|
||||
private import codeql.rust.internal.PathResolution as PathResolution
|
||||
private import codeql.rust.elements.internal.generated.ParentChild as ParentChild
|
||||
private import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl
|
||||
private import codeql.rust.elements.internal.PathImpl::Impl as PathImpl
|
||||
private import codeql.rust.elements.internal.PathExprBaseImpl::Impl as PathExprBaseImpl
|
||||
private import codeql.rust.elements.internal.FormatTemplateVariableAccessImpl::Impl as FormatTemplateVariableAccessImpl
|
||||
private import codeql.util.DenseRank
|
||||
|
||||
@@ -98,7 +99,7 @@ module Impl {
|
||||
* pattern.
|
||||
*/
|
||||
cached
|
||||
private predicate variableDecl(AstNode definingNode, Name name, string text) {
|
||||
predicate variableDecl(AstNode definingNode, Name name, string text) {
|
||||
Cached::ref() and
|
||||
exists(SelfParam sp |
|
||||
name = sp.getName() and
|
||||
@@ -117,11 +118,7 @@ module Impl {
|
||||
not exists(getOutermostEnclosingOrPat(pat)) and definingNode = name
|
||||
) and
|
||||
text = name.getText() and
|
||||
// exclude for now anything starting with an uppercase character, which may be a reference to
|
||||
// an enum constant (e.g. `None`). This excludes static and constant variables (UPPERCASE),
|
||||
// which we don't appear to recognize yet anyway. This also assumes programmers follow the
|
||||
// naming guidelines, which they generally do, but they're not enforced.
|
||||
not text.charAt(0).isUppercase() and
|
||||
not PathResolution::identPatIsResolvable(pat) and
|
||||
// exclude parameters from functions without a body as these are trait method declarations
|
||||
// without implementations
|
||||
not exists(Function f | not f.hasBody() and f.getAParam().getPat() = pat) and
|
||||
@@ -666,7 +663,7 @@ module Impl {
|
||||
}
|
||||
|
||||
/** A variable access. */
|
||||
class VariableAccess extends PathExprBaseImpl::PathExprBase {
|
||||
class VariableAccess extends PathExprBase {
|
||||
private string name;
|
||||
private Variable v;
|
||||
|
||||
@@ -677,10 +674,6 @@ module Impl {
|
||||
|
||||
/** Holds if this access is a capture. */
|
||||
predicate isCapture() { this.getEnclosingCfgScope() != v.getEnclosingCfgScope() }
|
||||
|
||||
override string toStringImpl() { result = name }
|
||||
|
||||
override string getAPrimaryQlClass() { result = "VariableAccess" }
|
||||
}
|
||||
|
||||
/** Holds if `e` occurs in the LHS of an assignment or compound assignment. */
|
||||
@@ -722,7 +715,7 @@ module Impl {
|
||||
}
|
||||
|
||||
/** A nested function access. */
|
||||
class NestedFunctionAccess extends PathExprBaseImpl::PathExprBase {
|
||||
class NestedFunctionAccess extends PathExprBase {
|
||||
private Function f;
|
||||
|
||||
NestedFunctionAccess() { nestedFunctionAccess(_, f, this) }
|
||||
|
||||
@@ -115,13 +115,11 @@ module Stages {
|
||||
predicate backref() {
|
||||
1 = 1
|
||||
or
|
||||
exists(resolvePath(_))
|
||||
exists(resolvePathIgnoreVariableShadowing(_))
|
||||
or
|
||||
exists(any(ItemNode i).getASuccessor(_, _, _))
|
||||
or
|
||||
exists(any(ImplOrTraitItemNode i).getASelfPath())
|
||||
or
|
||||
any(TypeParamItemNode i).hasTraitBound()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,9 @@ private module Cached {
|
||||
TFormatArgsArgIndex(Expr e) { e = any(FormatArgsArg a).getExpr() } or
|
||||
TItemNode(ItemNode i)
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate isMacroCallLocation(Location loc) { loc = any(MacroCall m).getLocation() }
|
||||
|
||||
/**
|
||||
* Gets an element, of kind `kind`, that element `use` uses, if any.
|
||||
*/
|
||||
@@ -44,7 +47,7 @@ private module Cached {
|
||||
Definition definitionOf(Use use, string kind) {
|
||||
result = use.getDefinition() and
|
||||
kind = use.getUseType() and
|
||||
not result.getLocation() = any(MacroCall m).getLocation()
|
||||
not isMacroCallLocation(result.getLocation())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,49 @@
|
||||
/**
|
||||
* Provides functionality for resolving paths, using the predicate `resolvePath`.
|
||||
*
|
||||
* Path resolution needs to happen before variable resolution, because otherwise
|
||||
* we cannot know whether an identifier pattern binds a new variable or whether it
|
||||
* refers to a constructor or constant:
|
||||
*
|
||||
* ```rust
|
||||
* let x = ...; // `x` is only a variable if it does not resolve to a constructor/constant
|
||||
* ```
|
||||
*
|
||||
* Even though variable names typically start with a lowercase letter and constructors
|
||||
* with an uppercase letter, this is not enforced by the Rust language.
|
||||
*
|
||||
* Variables may shadow declarations, so variable resolution also needs to affect
|
||||
* path resolution:
|
||||
*
|
||||
* ```rust
|
||||
* fn foo() {} // (1)
|
||||
*
|
||||
* fn bar() {
|
||||
* let f = foo; // `foo` here refers to (1) via path resolution
|
||||
* let foo = f(); // (2)
|
||||
* foo // `foo` here refers to (2) via variable resolution
|
||||
* }
|
||||
* ```
|
||||
*
|
||||
* So it may seem that path resolution and variable resolution must happen in mutual
|
||||
* recursion, but we would like to keep the inherently global path resolution logic
|
||||
* separate from the inherently local variable resolution logic. We acheive this by
|
||||
*
|
||||
* - First computing global path resolution, where variable shadowing is ignored,
|
||||
* exposed as the internal predicate `resolvePathIgnoreVariableShadowing`.
|
||||
* - `resolvePathIgnoreVariableShadowing` is sufficient to determine whether an
|
||||
* identifier pattern resolves to a constructor/constant, since if it does, it cannot
|
||||
* be shadowed by a variable. We expose this as the predicate `identPatIsResolvable`.
|
||||
* - Variable resolution can then be computed as a local property, using only the
|
||||
* global information from `identPatIsResolvable`.
|
||||
* - Finally, path resolution can be computed by restricting
|
||||
* `resolvePathIgnoreVariableShadowing` to paths that are not resolvable via
|
||||
* variable resolution.
|
||||
*/
|
||||
|
||||
private import rust
|
||||
private import codeql.rust.elements.internal.generated.ParentChild
|
||||
private import codeql.rust.elements.internal.AstNodeImpl::Impl as AstNodeImpl
|
||||
private import codeql.rust.elements.internal.CallExprImpl::Impl as CallExprImpl
|
||||
private import codeql.rust.internal.CachedStages
|
||||
private import codeql.rust.frameworks.stdlib.Builtins as Builtins
|
||||
@@ -184,7 +224,7 @@ abstract class ItemNode extends Locatable {
|
||||
pragma[nomagic]
|
||||
final Attr getAttr(string name) {
|
||||
result = this.getAnAttr() and
|
||||
result.getMeta().getPath().(RelevantPath).isUnqualified(name)
|
||||
result.getMeta().getPath().(PathExt).isUnqualified(name)
|
||||
}
|
||||
|
||||
final predicate hasAttr(string name) { exists(this.getAttr(name)) }
|
||||
@@ -1160,34 +1200,6 @@ final class TypeParamItemNode extends TypeItemNode instanceof TypeParam {
|
||||
|
||||
ItemNode resolveABound() { result = resolvePath(this.getABoundPath()) }
|
||||
|
||||
/**
|
||||
* Holds if this type parameter has a trait bound. Examples:
|
||||
*
|
||||
* ```rust
|
||||
* impl<T> Foo<T> { ... } // has no trait bound
|
||||
*
|
||||
* impl<T: Trait> Foo<T> { ... } // has trait bound
|
||||
*
|
||||
* impl<T> Foo<T> where T: Trait { ... } // has trait bound
|
||||
* ```
|
||||
*/
|
||||
cached
|
||||
predicate hasTraitBound() { Stages::PathResolutionStage::ref() and exists(this.getABoundPath()) }
|
||||
|
||||
/**
|
||||
* Holds if this type parameter has no trait bound. Examples:
|
||||
*
|
||||
* ```rust
|
||||
* impl<T> Foo<T> { ... } // has no trait bound
|
||||
*
|
||||
* impl<T: Trait> Foo<T> { ... } // has trait bound
|
||||
*
|
||||
* impl<T> Foo<T> where T: Trait { ... } // has trait bound
|
||||
* ```
|
||||
*/
|
||||
pragma[nomagic]
|
||||
predicate hasNoTraitBound() { not this.hasTraitBound() }
|
||||
|
||||
override string getName() { result = TypeParam.super.getName().getText() }
|
||||
|
||||
override Namespace getNamespace() { result.isType() }
|
||||
@@ -1526,20 +1538,22 @@ private predicate declares(ItemNode item, Namespace ns, string name) {
|
||||
)
|
||||
}
|
||||
|
||||
/** A path that does not access a local variable. */
|
||||
class RelevantPath extends Path {
|
||||
RelevantPath() { not this = any(VariableAccess va).(PathExpr).getPath() }
|
||||
/**
|
||||
* A `Path` or an `IdentPat`.
|
||||
*
|
||||
* `IdentPat`s are included in order to resolve unqualified references to
|
||||
* constructors in patterns.
|
||||
*/
|
||||
abstract class PathExt extends AstNode {
|
||||
abstract string getText();
|
||||
|
||||
/** Holds if this is an unqualified path with the textual value `name`. */
|
||||
pragma[nomagic]
|
||||
predicate isUnqualified(string name) {
|
||||
not exists(this.getQualifier()) and
|
||||
not exists(UseTree tree |
|
||||
tree.hasPath() and
|
||||
this = getAUseTreeUseTree(tree).getPath().getQualifier*()
|
||||
) and
|
||||
name = this.getText()
|
||||
}
|
||||
abstract predicate isUnqualified(string name);
|
||||
|
||||
abstract Path getQualifier();
|
||||
|
||||
abstract string toStringDebug();
|
||||
|
||||
/**
|
||||
* Holds if this is an unqualified path with the textual value `name` and
|
||||
@@ -1561,6 +1575,33 @@ class RelevantPath extends Path {
|
||||
predicate isDollarCrate() { this.isUnqualified("$crate", _) }
|
||||
}
|
||||
|
||||
private class PathExtPath extends PathExt instanceof Path {
|
||||
override string getText() { result = Path.super.getText() }
|
||||
|
||||
override predicate isUnqualified(string name) {
|
||||
not exists(Path.super.getQualifier()) and
|
||||
not exists(UseTree tree |
|
||||
tree.hasPath() and
|
||||
this = getAUseTreeUseTree(tree).getPath().getQualifier*()
|
||||
) and
|
||||
name = Path.super.getText()
|
||||
}
|
||||
|
||||
override Path getQualifier() { result = Path.super.getQualifier() }
|
||||
|
||||
override string toStringDebug() { result = Path.super.toStringDebug() }
|
||||
}
|
||||
|
||||
private class PathExtIdentPat extends PathExt, IdentPat {
|
||||
override string getText() { result = this.getName().getText() }
|
||||
|
||||
override predicate isUnqualified(string name) { name = this.getText() }
|
||||
|
||||
override Path getQualifier() { none() }
|
||||
|
||||
override string toStringDebug() { result = this.getText() }
|
||||
}
|
||||
|
||||
private predicate isModule(ItemNode m) { m instanceof Module }
|
||||
|
||||
/** Holds if source file `source` contains the module `m`. */
|
||||
@@ -1584,7 +1625,7 @@ private ItemNode getOuterScope(ItemNode i) {
|
||||
pragma[nomagic]
|
||||
private predicate unqualifiedPathLookup(ItemNode ancestor, string name, Namespace ns, ItemNode encl) {
|
||||
// lookup in the immediately enclosing item
|
||||
exists(RelevantPath path |
|
||||
exists(PathExt path |
|
||||
path.isUnqualified(name, encl) and
|
||||
ancestor = encl and
|
||||
not name = ["crate", "$crate", "super", "self"]
|
||||
@@ -1620,7 +1661,7 @@ private ItemNode getASuccessor(
|
||||
|
||||
private predicate isSourceFile(ItemNode source) { source instanceof SourceFileItemNode }
|
||||
|
||||
private predicate hasCratePath(ItemNode i) { any(RelevantPath path).isCratePath(_, i) }
|
||||
private predicate hasCratePath(ItemNode i) { any(PathExt path).isCratePath(_, i) }
|
||||
|
||||
private predicate hasChild(ItemNode parent, ItemNode child) { child.getImmediateParent() = parent }
|
||||
|
||||
@@ -1632,7 +1673,7 @@ private predicate sourceFileHasCratePathTc(ItemNode i1, ItemNode i2) =
|
||||
* `name` may be looked up inside `ancestor`.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private predicate keywordLookup(ItemNode ancestor, string name, RelevantPath p) {
|
||||
private predicate keywordLookup(ItemNode ancestor, string name, PathExt p) {
|
||||
// For `crate`, jump directly to the root module
|
||||
exists(ItemNode i | p.isCratePath(name, i) |
|
||||
ancestor instanceof SourceFile and
|
||||
@@ -1646,7 +1687,7 @@ private predicate keywordLookup(ItemNode ancestor, string name, RelevantPath p)
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private ItemNode unqualifiedPathLookup(RelevantPath p, Namespace ns, SuccessorKind kind) {
|
||||
private ItemNode unqualifiedPathLookup(PathExt p, Namespace ns, SuccessorKind kind) {
|
||||
exists(ItemNode ancestor, string name |
|
||||
result = getASuccessor(ancestor, pragma[only_bind_into](name), ns, kind, _) and
|
||||
kind.isInternalOrBoth()
|
||||
@@ -1661,7 +1702,7 @@ private ItemNode unqualifiedPathLookup(RelevantPath p, Namespace ns, SuccessorKi
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate isUnqualifiedSelfPath(RelevantPath path) { path.isUnqualified("Self") }
|
||||
private predicate isUnqualifiedSelfPath(PathExt path) { path.isUnqualified("Self") }
|
||||
|
||||
/** Provides the input to `TraitIsVisible`. */
|
||||
signature predicate relevantTraitVisibleSig(Element element, Trait trait);
|
||||
@@ -1744,14 +1785,14 @@ private module DollarCrateResolution {
|
||||
isDollarCrateSupportedMacroExpansion(_, expansion)
|
||||
}
|
||||
|
||||
private predicate isDollarCratePath(RelevantPath p) { p.isDollarCrate() }
|
||||
private predicate isDollarCratePath(PathExt p) { p.isDollarCrate() }
|
||||
|
||||
private predicate isInDollarCrateMacroExpansion(RelevantPath p, AstNode expansion) =
|
||||
private predicate isInDollarCrateMacroExpansion(PathExt p, AstNode expansion) =
|
||||
doublyBoundedFastTC(hasParent/2, isDollarCratePath/1, isDollarCrateSupportedMacroExpansion/1)(p,
|
||||
expansion)
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate isInDollarCrateMacroExpansionFromFile(File macroDefFile, RelevantPath p) {
|
||||
private predicate isInDollarCrateMacroExpansionFromFile(File macroDefFile, PathExt p) {
|
||||
exists(Path macroDefPath, AstNode expansion |
|
||||
isDollarCrateSupportedMacroExpansion(macroDefPath, expansion) and
|
||||
isInDollarCrateMacroExpansion(p, expansion) and
|
||||
@@ -1766,17 +1807,17 @@ private module DollarCrateResolution {
|
||||
* calls.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
predicate resolveDollarCrate(RelevantPath p, CrateItemNode crate) {
|
||||
predicate resolveDollarCrate(PathExt p, CrateItemNode crate) {
|
||||
isInDollarCrateMacroExpansionFromFile(crate.getASourceFile().getFile(), p)
|
||||
}
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private ItemNode resolvePathCand0(RelevantPath path, Namespace ns) {
|
||||
private ItemNode resolvePathCand0(PathExt path, Namespace ns) {
|
||||
exists(ItemNode res |
|
||||
res = unqualifiedPathLookup(path, ns, _) and
|
||||
if
|
||||
not any(RelevantPath parent).getQualifier() = path and
|
||||
not any(PathExt parent).getQualifier() = path and
|
||||
isUnqualifiedSelfPath(path) and
|
||||
res instanceof ImplItemNode
|
||||
then result = res.(ImplItemNodeImpl).resolveSelfTyCand()
|
||||
@@ -1791,13 +1832,16 @@ private ItemNode resolvePathCand0(RelevantPath path, Namespace ns) {
|
||||
result = resolveUseTreeListItem(_, _, path, _) and
|
||||
ns = result.getNamespace()
|
||||
or
|
||||
result = resolveBuiltin(path.getSegment().getTypeRepr()) and
|
||||
not path.getSegment().hasTraitTypeRepr() and
|
||||
ns.isType()
|
||||
exists(PathSegment seg |
|
||||
seg = path.(Path).getSegment() and
|
||||
result = resolveBuiltin(seg.getTypeRepr()) and
|
||||
not seg.hasTraitTypeRepr() and
|
||||
ns.isType()
|
||||
)
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private ItemNode resolvePathCandQualifier(RelevantPath qualifier, RelevantPath path, string name) {
|
||||
private ItemNode resolvePathCandQualifier(PathExt qualifier, PathExt path, string name) {
|
||||
qualifier = path.getQualifier() and
|
||||
result = resolvePathCand(qualifier) and
|
||||
name = path.getText()
|
||||
@@ -1845,9 +1889,7 @@ private predicate checkQualifiedVisibility(
|
||||
* qualifier of `path` and `qualifier` resolves to `q`, if any.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private ItemNode resolvePathCandQualified(
|
||||
RelevantPath qualifier, ItemNode q, RelevantPath path, Namespace ns
|
||||
) {
|
||||
private ItemNode resolvePathCandQualified(PathExt qualifier, ItemNode q, PathExt path, Namespace ns) {
|
||||
exists(string name, SuccessorKind kind, UseOption useOpt |
|
||||
q = resolvePathCandQualifier(qualifier, path, name) and
|
||||
result = getASuccessor(q, name, ns, kind, useOpt) and
|
||||
@@ -1856,12 +1898,14 @@ private ItemNode resolvePathCandQualified(
|
||||
}
|
||||
|
||||
/** Holds if path `p` must be looked up in namespace `n`. */
|
||||
private predicate pathUsesNamespace(Path p, Namespace n) {
|
||||
private predicate pathUsesNamespace(PathExt p, Namespace n) {
|
||||
n.isValue() and
|
||||
(
|
||||
p = any(PathExpr pe).getPath()
|
||||
or
|
||||
p = any(TupleStructPat tsp).getPath()
|
||||
or
|
||||
p instanceof PathExtIdentPat
|
||||
)
|
||||
or
|
||||
n.isType() and
|
||||
@@ -1937,7 +1981,7 @@ private predicate macroUseEdge(
|
||||
* result in non-monotonic recursion.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
private ItemNode resolvePathCand(RelevantPath path) {
|
||||
private ItemNode resolvePathCand(PathExt path) {
|
||||
exists(Namespace ns |
|
||||
result = resolvePathCand0(path, ns) and
|
||||
if path = any(ImplItemNode i).getSelfPath()
|
||||
@@ -1950,7 +1994,13 @@ private ItemNode resolvePathCand(RelevantPath path) {
|
||||
else
|
||||
if path = any(PathTypeRepr p).getPath()
|
||||
then result instanceof TypeItemNode
|
||||
else any()
|
||||
else
|
||||
if path instanceof IdentPat
|
||||
then
|
||||
result instanceof VariantItemNode or
|
||||
result instanceof StructItemNode or
|
||||
result instanceof ConstItemNode
|
||||
else any()
|
||||
|
|
||||
pathUsesNamespace(path, ns)
|
||||
or
|
||||
@@ -1967,7 +2017,7 @@ private ItemNode resolvePathCand(RelevantPath path) {
|
||||
}
|
||||
|
||||
/** Get a trait that should be visible when `path` resolves to `node`, if any. */
|
||||
private Trait getResolvePathTraitUsed(RelevantPath path, AssocItemNode node) {
|
||||
private Trait getResolvePathTraitUsed(PathExt path, AssocItemNode node) {
|
||||
exists(TypeItemNode type, ImplItemNodeImpl impl |
|
||||
node = resolvePathCandQualified(_, type, path, _) and
|
||||
typeImplEdge(type, impl, _, _, node, _) and
|
||||
@@ -1979,9 +2029,9 @@ private predicate pathTraitUsed(Element path, Trait trait) {
|
||||
trait = getResolvePathTraitUsed(path, _)
|
||||
}
|
||||
|
||||
/** Gets the item that `path` resolves to, if any. */
|
||||
/** INTERNAL: Do not use; use `resolvePath` instead. */
|
||||
cached
|
||||
ItemNode resolvePath(RelevantPath path) {
|
||||
ItemNode resolvePathIgnoreVariableShadowing(PathExt path) {
|
||||
result = resolvePathCand(path) and
|
||||
not path = any(Path parent | exists(resolvePathCand(parent))).getQualifier() and
|
||||
(
|
||||
@@ -1994,29 +2044,43 @@ ItemNode resolvePath(RelevantPath path) {
|
||||
or
|
||||
// if `path` is the qualifier of a resolvable `parent`, then we should
|
||||
// resolve `path` to something consistent with what `parent` resolves to
|
||||
exists(RelevantPath parent |
|
||||
resolvePathCandQualified(path, result, parent, _) = resolvePath(parent)
|
||||
exists(PathExt parent |
|
||||
resolvePathCandQualified(path, result, parent, _) = resolvePathIgnoreVariableShadowing(parent)
|
||||
)
|
||||
}
|
||||
|
||||
private predicate isUseTreeSubPath(UseTree tree, RelevantPath path) {
|
||||
/**
|
||||
* Holds if `ip` resolves to some constructor.
|
||||
*/
|
||||
// use `forceLocal` once we implement overlay support
|
||||
pragma[nomagic]
|
||||
predicate identPatIsResolvable(IdentPat ip) { exists(resolvePathIgnoreVariableShadowing(ip)) }
|
||||
|
||||
/** Gets the item that `path` resolves to, if any. */
|
||||
pragma[nomagic]
|
||||
ItemNode resolvePath(PathExt path) {
|
||||
result = resolvePathIgnoreVariableShadowing(path) and
|
||||
not path = any(VariableAccess va).(PathExpr).getPath()
|
||||
}
|
||||
|
||||
private predicate isUseTreeSubPath(UseTree tree, PathExt path) {
|
||||
path = tree.getPath()
|
||||
or
|
||||
exists(RelevantPath mid |
|
||||
exists(PathExt mid |
|
||||
isUseTreeSubPath(tree, mid) and
|
||||
path = mid.getQualifier()
|
||||
)
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private predicate isUseTreeSubPathUnqualified(UseTree tree, RelevantPath path, string name) {
|
||||
private predicate isUseTreeSubPathUnqualified(UseTree tree, PathExt path, string name) {
|
||||
isUseTreeSubPath(tree, path) and
|
||||
not exists(path.getQualifier()) and
|
||||
name = path.getText()
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private ItemNode resolveUseTreeListItem(Use use, UseTree tree, RelevantPath path, SuccessorKind kind) {
|
||||
private ItemNode resolveUseTreeListItem(Use use, UseTree tree, PathExt path, SuccessorKind kind) {
|
||||
exists(UseOption useOpt | checkQualifiedVisibility(use, result, kind, useOpt) |
|
||||
exists(UseTree midTree, ItemNode mid, string name |
|
||||
mid = resolveUseTreeListItem(use, midTree) and
|
||||
@@ -2033,9 +2097,7 @@ private ItemNode resolveUseTreeListItem(Use use, UseTree tree, RelevantPath path
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
private ItemNode resolveUseTreeListItemQualifier(
|
||||
Use use, UseTree tree, RelevantPath path, string name
|
||||
) {
|
||||
private ItemNode resolveUseTreeListItemQualifier(Use use, UseTree tree, PathExt path, string name) {
|
||||
result = resolveUseTreeListItem(use, tree, path.getQualifier(), _) and
|
||||
name = path.getText()
|
||||
}
|
||||
@@ -2187,7 +2249,7 @@ private module Debug {
|
||||
}
|
||||
|
||||
predicate debugUnqualifiedPathLookup(
|
||||
RelevantPath p, string name, Namespace ns, ItemNode ancestor, string path
|
||||
PathExt p, string name, Namespace ns, ItemNode ancestor, string path
|
||||
) {
|
||||
p = getRelevantLocatable() and
|
||||
exists(ItemNode encl |
|
||||
@@ -2197,14 +2259,19 @@ private module Debug {
|
||||
path = p.toStringDebug()
|
||||
}
|
||||
|
||||
ItemNode debugUnqualifiedPathLookup(PathExt p, Namespace ns, SuccessorKind kind) {
|
||||
p = getRelevantLocatable() and
|
||||
result = unqualifiedPathLookup(p, ns, kind)
|
||||
}
|
||||
|
||||
predicate debugItemNode(ItemNode item) { item = getRelevantLocatable() }
|
||||
|
||||
ItemNode debugResolvePath(RelevantPath path) {
|
||||
ItemNode debugResolvePath(PathExt path) {
|
||||
path = getRelevantLocatable() and
|
||||
result = resolvePath(path)
|
||||
}
|
||||
|
||||
ItemNode debugResolveUseTreeListItem(Use use, UseTree tree, RelevantPath path, SuccessorKind kind) {
|
||||
ItemNode debugResolveUseTreeListItem(Use use, UseTree tree, PathExt path, SuccessorKind kind) {
|
||||
use = getRelevantLocatable() and
|
||||
result = resolveUseTreeListItem(use, tree, path, kind)
|
||||
}
|
||||
|
||||
@@ -660,7 +660,7 @@ macro_expansion.rs:
|
||||
# 71| getSegment(): [PathSegment] i32
|
||||
# 71| getIdentifier(): [NameRef] i32
|
||||
# 72| getTailExpr(): [CastExpr] a as ...
|
||||
# 72| getExpr(): [PathExpr,VariableAccess] a
|
||||
# 72| getExpr(): [VariableAccess] a
|
||||
# 72| getPath(): [Path] a
|
||||
# 72| getSegment(): [PathSegment] a
|
||||
# 72| getIdentifier(): [NameRef] a
|
||||
@@ -738,7 +738,7 @@ macro_expansion.rs:
|
||||
# 84| getFunctionBody(): [BlockExpr] { ... }
|
||||
# 84| getStmtList(): [StmtList] StmtList
|
||||
# 84| getTailExpr(): [MatchExpr] match self { ... }
|
||||
# 83| getScrutinee(): [PathExpr,VariableAccess] self
|
||||
# 83| getScrutinee(): [VariableAccess] self
|
||||
# 83| getPath(): [Path] self
|
||||
# 83| getSegment(): [PathSegment] self
|
||||
# 83| getIdentifier(): [NameRef] self
|
||||
@@ -751,7 +751,7 @@ macro_expansion.rs:
|
||||
# 85| getArgList(): [ArgList] ArgList
|
||||
# 83| getArg(0): [StringLiteralExpr] "field"
|
||||
# 85| getArg(1): [RefExpr] &field
|
||||
# 85| getExpr(): [PathExpr,VariableAccess] field
|
||||
# 85| getExpr(): [VariableAccess] field
|
||||
# 85| getPath(): [Path] field
|
||||
# 85| getSegment(): [PathSegment] field
|
||||
# 85| getIdentifier(): [NameRef] field
|
||||
@@ -760,7 +760,7 @@ macro_expansion.rs:
|
||||
# 83| getArgList(): [ArgList] ArgList
|
||||
# 83| getArg(0): [StringLiteralExpr] "MyDerive"
|
||||
# 83| getIdentifier(): [NameRef] debug_struct
|
||||
# 83| getReceiver(): [PathExpr,VariableAccess] f
|
||||
# 83| getReceiver(): [VariableAccess] f
|
||||
# 83| getPath(): [Path] f
|
||||
# 83| getSegment(): [PathSegment] f
|
||||
# 83| getIdentifier(): [NameRef] f
|
||||
@@ -836,11 +836,11 @@ macro_expansion.rs:
|
||||
# 89| getStmtList(): [StmtList] StmtList
|
||||
# 89| getTailExpr(): [MatchExpr] match ... { ... }
|
||||
# 88| getScrutinee(): [TupleExpr] TupleExpr
|
||||
# 88| getField(0): [PathExpr,VariableAccess] self
|
||||
# 88| getField(0): [VariableAccess] self
|
||||
# 88| getPath(): [Path] self
|
||||
# 88| getSegment(): [PathSegment] self
|
||||
# 88| getIdentifier(): [NameRef] self
|
||||
# 88| getField(1): [PathExpr,VariableAccess] other
|
||||
# 88| getField(1): [VariableAccess] other
|
||||
# 88| getPath(): [Path] other
|
||||
# 88| getSegment(): [PathSegment] other
|
||||
# 88| getIdentifier(): [NameRef] other
|
||||
@@ -1076,7 +1076,7 @@ proc_macro.rs:
|
||||
# 6| getMacroCallExpansion(): [MatchExpr] match ... { ... }
|
||||
# 6| getScrutinee(): [CallExpr] ...::parse::<...>(...)
|
||||
# 6| getArgList(): [ArgList] ArgList
|
||||
# 6| getArg(0): [PathExpr,VariableAccess] attr
|
||||
# 6| getArg(0): [VariableAccess] attr
|
||||
# 6| getPath(): [Path] attr
|
||||
# 6| getSegment(): [PathSegment] attr
|
||||
# 6| getIdentifier(): [NameRef] attr
|
||||
@@ -1098,7 +1098,7 @@ proc_macro.rs:
|
||||
# 6| getIdentifier(): [NameRef] parse
|
||||
# 6| getMatchArmList(): [MatchArmList] MatchArmList
|
||||
# 6| getArm(0): [MatchArm] ... => data
|
||||
# 6| getExpr(): [PathExpr,VariableAccess] data
|
||||
# 6| getExpr(): [VariableAccess] data
|
||||
# 6| getPath(): [Path] data
|
||||
# 6| getSegment(): [PathSegment] data
|
||||
# 6| getIdentifier(): [NameRef] data
|
||||
@@ -1124,7 +1124,7 @@ proc_macro.rs:
|
||||
# 6| getArg(0): [MethodCallExpr] err.to_compile_error()
|
||||
# 6| getArgList(): [ArgList] ArgList
|
||||
# 6| getIdentifier(): [NameRef] to_compile_error
|
||||
# 6| getReceiver(): [PathExpr,VariableAccess] err
|
||||
# 6| getReceiver(): [VariableAccess] err
|
||||
# 6| getPath(): [Path] err
|
||||
# 6| getSegment(): [PathSegment] err
|
||||
# 6| getIdentifier(): [NameRef] err
|
||||
@@ -1168,7 +1168,7 @@ proc_macro.rs:
|
||||
# 7| getMacroCallExpansion(): [MatchExpr] match ... { ... }
|
||||
# 7| getScrutinee(): [CallExpr] ...::parse::<...>(...)
|
||||
# 7| getArgList(): [ArgList] ArgList
|
||||
# 7| getArg(0): [PathExpr,VariableAccess] item
|
||||
# 7| getArg(0): [VariableAccess] item
|
||||
# 7| getPath(): [Path] item
|
||||
# 7| getSegment(): [PathSegment] item
|
||||
# 7| getIdentifier(): [NameRef] item
|
||||
@@ -1190,7 +1190,7 @@ proc_macro.rs:
|
||||
# 7| getIdentifier(): [NameRef] parse
|
||||
# 7| getMatchArmList(): [MatchArmList] MatchArmList
|
||||
# 7| getArm(0): [MatchArm] ... => data
|
||||
# 7| getExpr(): [PathExpr,VariableAccess] data
|
||||
# 7| getExpr(): [VariableAccess] data
|
||||
# 7| getPath(): [Path] data
|
||||
# 7| getSegment(): [PathSegment] data
|
||||
# 7| getIdentifier(): [NameRef] data
|
||||
@@ -1216,7 +1216,7 @@ proc_macro.rs:
|
||||
# 7| getArg(0): [MethodCallExpr] err.to_compile_error()
|
||||
# 7| getArgList(): [ArgList] ArgList
|
||||
# 7| getIdentifier(): [NameRef] to_compile_error
|
||||
# 7| getReceiver(): [PathExpr,VariableAccess] err
|
||||
# 7| getReceiver(): [VariableAccess] err
|
||||
# 7| getPath(): [Path] err
|
||||
# 7| getSegment(): [PathSegment] err
|
||||
# 7| getIdentifier(): [NameRef] err
|
||||
@@ -1273,7 +1273,7 @@ proc_macro.rs:
|
||||
# 10| getInitializer(): [MethodCallExpr] ast.clone()
|
||||
# 10| getArgList(): [ArgList] ArgList
|
||||
# 10| getIdentifier(): [NameRef] clone
|
||||
# 10| getReceiver(): [PathExpr,VariableAccess] ast
|
||||
# 10| getReceiver(): [VariableAccess] ast
|
||||
# 10| getPath(): [Path] ast
|
||||
# 10| getSegment(): [PathSegment] ast
|
||||
# 10| getIdentifier(): [NameRef] ast
|
||||
@@ -1283,7 +1283,7 @@ proc_macro.rs:
|
||||
# 11| getExpr(): [AssignmentExpr] ... = ...
|
||||
# 11| getLhs(): [FieldExpr] ... .ident
|
||||
# 11| getContainer(): [FieldExpr] new_ast.sig
|
||||
# 11| getContainer(): [PathExpr,VariableAccess] new_ast
|
||||
# 11| getContainer(): [VariableAccess] new_ast
|
||||
# 11| getPath(): [Path] new_ast
|
||||
# 11| getSegment(): [PathSegment] new_ast
|
||||
# 11| getIdentifier(): [NameRef] new_ast
|
||||
@@ -1320,14 +1320,14 @@ proc_macro.rs:
|
||||
# 11| getArg(0): [FormatArgsArg] FormatArgsArg
|
||||
# 11| getExpr(): [FieldExpr] ... .ident
|
||||
# 11| getContainer(): [FieldExpr] ast.sig
|
||||
# 11| getContainer(): [PathExpr,VariableAccess] ast
|
||||
# 11| getContainer(): [VariableAccess] ast
|
||||
# 11| getPath(): [Path] ast
|
||||
# 11| getSegment(): [PathSegment] ast
|
||||
# 11| getIdentifier(): [NameRef] ast
|
||||
# 11| getIdentifier(): [NameRef] sig
|
||||
# 11| getIdentifier(): [NameRef] ident
|
||||
# 11| getArg(1): [FormatArgsArg] FormatArgsArg
|
||||
# 11| getExpr(): [PathExpr,VariableAccess] i
|
||||
# 11| getExpr(): [VariableAccess] i
|
||||
# 11| getPath(): [Path] i
|
||||
# 11| getSegment(): [PathSegment] i
|
||||
# 11| getIdentifier(): [NameRef] i
|
||||
@@ -1359,7 +1359,7 @@ proc_macro.rs:
|
||||
# 11| getIdentifier(): [NameRef] span
|
||||
# 11| getReceiver(): [FieldExpr] ... .ident
|
||||
# 11| getContainer(): [FieldExpr] ast.sig
|
||||
# 11| getContainer(): [PathExpr,VariableAccess] ast
|
||||
# 11| getContainer(): [VariableAccess] ast
|
||||
# 11| getPath(): [Path] ast
|
||||
# 11| getSegment(): [PathSegment] ast
|
||||
# 11| getIdentifier(): [NameRef] ast
|
||||
@@ -1375,14 +1375,14 @@ proc_macro.rs:
|
||||
# 11| getIdentifier(): [NameRef] Ident
|
||||
# 11| getSegment(): [PathSegment] new
|
||||
# 11| getIdentifier(): [NameRef] new
|
||||
# 12| getTailExpr(): [PathExpr,VariableAccess] new_ast
|
||||
# 12| getTailExpr(): [VariableAccess] new_ast
|
||||
# 12| getPath(): [Path] new_ast
|
||||
# 12| getSegment(): [PathSegment] new_ast
|
||||
# 12| getIdentifier(): [NameRef] new_ast
|
||||
# 9| getIdentifier(): [NameRef] map
|
||||
# 8| getReceiver(): [ParenExpr] (...)
|
||||
# 8| getExpr(): [RangeExpr] 0..number
|
||||
# 8| getEnd(): [PathExpr,VariableAccess] number
|
||||
# 8| getEnd(): [VariableAccess] number
|
||||
# 8| getPath(): [Path] number
|
||||
# 8| getSegment(): [PathSegment] number
|
||||
# 8| getIdentifier(): [NameRef] number
|
||||
@@ -1614,7 +1614,7 @@ proc_macro.rs:
|
||||
# 16| getInitializer(): [MethodCallExpr] items.quote_into_iter()
|
||||
# 15| getArgList(): [ArgList] ArgList
|
||||
# 15| getIdentifier(): [NameRef] quote_into_iter
|
||||
# 16| getReceiver(): [PathExpr,VariableAccess] items
|
||||
# 16| getReceiver(): [VariableAccess] items
|
||||
# 16| getPath(): [Path] items
|
||||
# 16| getSegment(): [PathSegment] items
|
||||
# 16| getIdentifier(): [NameRef] items
|
||||
@@ -1625,11 +1625,11 @@ proc_macro.rs:
|
||||
# 15| getName(): [Name] i
|
||||
# 15| getStatement(1): [LetStmt] let ... = ...
|
||||
# 15| getInitializer(): [BinaryExpr] ... | ...
|
||||
# 15| getLhs(): [PathExpr,VariableAccess] has_iter
|
||||
# 15| getLhs(): [VariableAccess] has_iter
|
||||
# 15| getPath(): [Path] has_iter
|
||||
# 15| getSegment(): [PathSegment] has_iter
|
||||
# 15| getIdentifier(): [NameRef] has_iter
|
||||
# 15| getRhs(): [PathExpr,VariableAccess] i
|
||||
# 15| getRhs(): [VariableAccess] i
|
||||
# 15| getPath(): [Path] i
|
||||
# 15| getSegment(): [PathSegment] i
|
||||
# 15| getIdentifier(): [NameRef] i
|
||||
@@ -1646,7 +1646,7 @@ proc_macro.rs:
|
||||
# 16| getTokenTree(): [TokenTree] TokenTree
|
||||
# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
|
||||
# 15| getStatement(3): [LetStmt] let _ = has_iter
|
||||
# 15| getInitializer(): [PathExpr,VariableAccess] has_iter
|
||||
# 15| getInitializer(): [VariableAccess] has_iter
|
||||
# 15| getPath(): [Path] has_iter
|
||||
# 15| getSegment(): [PathSegment] has_iter
|
||||
# 15| getIdentifier(): [NameRef] has_iter
|
||||
@@ -1764,7 +1764,7 @@ proc_macro.rs:
|
||||
# 16| getScrutinee(): [MethodCallExpr] items.next()
|
||||
# 15| getArgList(): [ArgList] ArgList
|
||||
# 15| getIdentifier(): [NameRef] next
|
||||
# 16| getReceiver(): [PathExpr,VariableAccess] items
|
||||
# 16| getReceiver(): [VariableAccess] items
|
||||
# 16| getPath(): [Path] items
|
||||
# 16| getSegment(): [PathSegment] items
|
||||
# 16| getIdentifier(): [NameRef] items
|
||||
@@ -1772,7 +1772,7 @@ proc_macro.rs:
|
||||
# 15| getArm(0): [MatchArm] ... => ...
|
||||
# 15| getExpr(): [CallExpr] ...::RepInterp(...)
|
||||
# 15| getArgList(): [ArgList] ArgList
|
||||
# 15| getArg(0): [PathExpr] _x
|
||||
# 15| getArg(0): [VariableAccess] _x
|
||||
# 15| getPath(): [Path] _x
|
||||
# 15| getSegment(): [PathSegment] _x
|
||||
# 15| getIdentifier(): [NameRef] _x
|
||||
@@ -1876,12 +1876,12 @@ proc_macro.rs:
|
||||
# 16| getExpr(): [CallExpr] ...::to_tokens(...)
|
||||
# 16| getArgList(): [ArgList] ArgList
|
||||
# 16| getArg(0): [RefExpr] &items
|
||||
# 16| getExpr(): [PathExpr,VariableAccess] items
|
||||
# 16| getExpr(): [VariableAccess] items
|
||||
# 16| getPath(): [Path] items
|
||||
# 16| getSegment(): [PathSegment] items
|
||||
# 16| getIdentifier(): [NameRef] items
|
||||
# 15| getArg(1): [RefExpr] &mut _s
|
||||
# 15| getExpr(): [PathExpr] _s
|
||||
# 15| getExpr(): [VariableAccess] _s
|
||||
# 15| getPath(): [Path] _s
|
||||
# 15| getSegment(): [PathSegment] _s
|
||||
# 15| getIdentifier(): [NameRef] _s
|
||||
@@ -1993,7 +1993,7 @@ proc_macro.rs:
|
||||
# 15| getIdentifier(): [NameRef] quote_token_with_context
|
||||
# 16| getTokenTree(): [TokenTree] TokenTree
|
||||
# 15| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
|
||||
# 15| getTailExpr(): [PathExpr] _s
|
||||
# 15| getTailExpr(): [VariableAccess] _s
|
||||
# 15| getPath(): [Path] _s
|
||||
# 15| getSegment(): [PathSegment] _s
|
||||
# 15| getIdentifier(): [NameRef] _s
|
||||
@@ -2040,7 +2040,7 @@ proc_macro.rs:
|
||||
# 22| getMacroCallExpansion(): [MatchExpr] match ... { ... }
|
||||
# 22| getScrutinee(): [CallExpr] ...::parse::<...>(...)
|
||||
# 22| getArgList(): [ArgList] ArgList
|
||||
# 22| getArg(0): [PathExpr,VariableAccess] item
|
||||
# 22| getArg(0): [VariableAccess] item
|
||||
# 22| getPath(): [Path] item
|
||||
# 22| getSegment(): [PathSegment] item
|
||||
# 22| getIdentifier(): [NameRef] item
|
||||
@@ -2062,7 +2062,7 @@ proc_macro.rs:
|
||||
# 22| getIdentifier(): [NameRef] parse
|
||||
# 22| getMatchArmList(): [MatchArmList] MatchArmList
|
||||
# 22| getArm(0): [MatchArm] ... => data
|
||||
# 22| getExpr(): [PathExpr,VariableAccess] data
|
||||
# 22| getExpr(): [VariableAccess] data
|
||||
# 22| getPath(): [Path] data
|
||||
# 22| getSegment(): [PathSegment] data
|
||||
# 22| getIdentifier(): [NameRef] data
|
||||
@@ -2088,7 +2088,7 @@ proc_macro.rs:
|
||||
# 22| getArg(0): [MethodCallExpr] err.to_compile_error()
|
||||
# 22| getArgList(): [ArgList] ArgList
|
||||
# 22| getIdentifier(): [NameRef] to_compile_error
|
||||
# 22| getReceiver(): [PathExpr,VariableAccess] err
|
||||
# 22| getReceiver(): [VariableAccess] err
|
||||
# 22| getPath(): [Path] err
|
||||
# 22| getSegment(): [PathSegment] err
|
||||
# 22| getIdentifier(): [NameRef] err
|
||||
@@ -2123,7 +2123,7 @@ proc_macro.rs:
|
||||
# 23| getInitializer(): [MethodCallExpr] ast.clone()
|
||||
# 23| getArgList(): [ArgList] ArgList
|
||||
# 23| getIdentifier(): [NameRef] clone
|
||||
# 23| getReceiver(): [PathExpr,VariableAccess] ast
|
||||
# 23| getReceiver(): [VariableAccess] ast
|
||||
# 23| getPath(): [Path] ast
|
||||
# 23| getSegment(): [PathSegment] ast
|
||||
# 23| getIdentifier(): [NameRef] ast
|
||||
@@ -2133,7 +2133,7 @@ proc_macro.rs:
|
||||
# 24| getExpr(): [AssignmentExpr] ... = ...
|
||||
# 24| getLhs(): [FieldExpr] ... .ident
|
||||
# 24| getContainer(): [FieldExpr] new_ast.sig
|
||||
# 24| getContainer(): [PathExpr,VariableAccess] new_ast
|
||||
# 24| getContainer(): [VariableAccess] new_ast
|
||||
# 24| getPath(): [Path] new_ast
|
||||
# 24| getSegment(): [PathSegment] new_ast
|
||||
# 24| getIdentifier(): [NameRef] new_ast
|
||||
@@ -2170,7 +2170,7 @@ proc_macro.rs:
|
||||
# 24| getArg(0): [FormatArgsArg] FormatArgsArg
|
||||
# 24| getExpr(): [FieldExpr] ... .ident
|
||||
# 24| getContainer(): [FieldExpr] ast.sig
|
||||
# 24| getContainer(): [PathExpr,VariableAccess] ast
|
||||
# 24| getContainer(): [VariableAccess] ast
|
||||
# 24| getPath(): [Path] ast
|
||||
# 24| getSegment(): [PathSegment] ast
|
||||
# 24| getIdentifier(): [NameRef] ast
|
||||
@@ -2203,7 +2203,7 @@ proc_macro.rs:
|
||||
# 24| getIdentifier(): [NameRef] span
|
||||
# 24| getReceiver(): [FieldExpr] ... .ident
|
||||
# 24| getContainer(): [FieldExpr] ast.sig
|
||||
# 24| getContainer(): [PathExpr,VariableAccess] ast
|
||||
# 24| getContainer(): [VariableAccess] ast
|
||||
# 24| getPath(): [Path] ast
|
||||
# 24| getSegment(): [PathSegment] ast
|
||||
# 24| getIdentifier(): [NameRef] ast
|
||||
@@ -2317,12 +2317,12 @@ proc_macro.rs:
|
||||
# 26| getExpr(): [CallExpr] ...::to_tokens(...)
|
||||
# 26| getArgList(): [ArgList] ArgList
|
||||
# 26| getArg(0): [RefExpr] &ast
|
||||
# 26| getExpr(): [PathExpr,VariableAccess] ast
|
||||
# 26| getExpr(): [VariableAccess] ast
|
||||
# 26| getPath(): [Path] ast
|
||||
# 26| getSegment(): [PathSegment] ast
|
||||
# 26| getIdentifier(): [NameRef] ast
|
||||
# 25| getArg(1): [RefExpr] &mut _s
|
||||
# 25| getExpr(): [PathExpr] _s
|
||||
# 25| getExpr(): [VariableAccess] _s
|
||||
# 25| getPath(): [Path] _s
|
||||
# 25| getSegment(): [PathSegment] _s
|
||||
# 25| getIdentifier(): [NameRef] _s
|
||||
@@ -2362,12 +2362,12 @@ proc_macro.rs:
|
||||
# 27| getExpr(): [CallExpr] ...::to_tokens(...)
|
||||
# 27| getArgList(): [ArgList] ArgList
|
||||
# 27| getArg(0): [RefExpr] &new_ast
|
||||
# 27| getExpr(): [PathExpr,VariableAccess] new_ast
|
||||
# 27| getExpr(): [VariableAccess] new_ast
|
||||
# 27| getPath(): [Path] new_ast
|
||||
# 27| getSegment(): [PathSegment] new_ast
|
||||
# 27| getIdentifier(): [NameRef] new_ast
|
||||
# 25| getArg(1): [RefExpr] &mut _s
|
||||
# 25| getExpr(): [PathExpr] _s
|
||||
# 25| getExpr(): [VariableAccess] _s
|
||||
# 25| getPath(): [Path] _s
|
||||
# 25| getSegment(): [PathSegment] _s
|
||||
# 25| getIdentifier(): [NameRef] _s
|
||||
@@ -2424,7 +2424,7 @@ proc_macro.rs:
|
||||
# 25| getIdentifier(): [NameRef] quote_token_with_context
|
||||
# 27| getTokenTree(): [TokenTree] TokenTree
|
||||
# 25| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
|
||||
# 25| getTailExpr(): [PathExpr] _s
|
||||
# 25| getTailExpr(): [VariableAccess] _s
|
||||
# 25| getPath(): [Path] _s
|
||||
# 25| getSegment(): [PathSegment] _s
|
||||
# 25| getIdentifier(): [NameRef] _s
|
||||
@@ -2504,7 +2504,7 @@ proc_macro.rs:
|
||||
# 38| getMacroCallExpansion(): [MatchExpr] match ... { ... }
|
||||
# 38| getScrutinee(): [CallExpr] ...::parse::<...>(...)
|
||||
# 38| getArgList(): [ArgList] ArgList
|
||||
# 38| getArg(0): [PathExpr,VariableAccess] input
|
||||
# 38| getArg(0): [VariableAccess] input
|
||||
# 38| getPath(): [Path] input
|
||||
# 38| getSegment(): [PathSegment] input
|
||||
# 38| getIdentifier(): [NameRef] input
|
||||
@@ -2526,7 +2526,7 @@ proc_macro.rs:
|
||||
# 38| getIdentifier(): [NameRef] parse
|
||||
# 38| getMatchArmList(): [MatchArmList] MatchArmList
|
||||
# 38| getArm(0): [MatchArm] ... => data
|
||||
# 38| getExpr(): [PathExpr,VariableAccess] data
|
||||
# 38| getExpr(): [VariableAccess] data
|
||||
# 38| getPath(): [Path] data
|
||||
# 38| getSegment(): [PathSegment] data
|
||||
# 38| getIdentifier(): [NameRef] data
|
||||
@@ -2552,7 +2552,7 @@ proc_macro.rs:
|
||||
# 38| getArg(0): [MethodCallExpr] err.to_compile_error()
|
||||
# 38| getArgList(): [ArgList] ArgList
|
||||
# 38| getIdentifier(): [NameRef] to_compile_error
|
||||
# 38| getReceiver(): [PathExpr,VariableAccess] err
|
||||
# 38| getReceiver(): [VariableAccess] err
|
||||
# 38| getPath(): [Path] err
|
||||
# 38| getSegment(): [PathSegment] err
|
||||
# 38| getIdentifier(): [NameRef] err
|
||||
@@ -2586,7 +2586,7 @@ proc_macro.rs:
|
||||
# 39| getStatement(1): [LetStmt] let ... = ...
|
||||
# 39| getInitializer(): [RefExpr] &...
|
||||
# 39| getExpr(): [FieldExpr] ast.ident
|
||||
# 39| getContainer(): [PathExpr,VariableAccess] ast
|
||||
# 39| getContainer(): [VariableAccess] ast
|
||||
# 39| getPath(): [Path] ast
|
||||
# 39| getSegment(): [PathSegment] ast
|
||||
# 39| getIdentifier(): [NameRef] ast
|
||||
@@ -2623,7 +2623,7 @@ proc_macro.rs:
|
||||
# 40| getTokenTree(): [TokenTree] TokenTree
|
||||
# 40| getMacroCallExpansion(): [FormatArgsExpr] FormatArgsExpr
|
||||
# 40| getArg(0): [FormatArgsArg] FormatArgsArg
|
||||
# 40| getExpr(): [PathExpr,VariableAccess] name
|
||||
# 40| getExpr(): [VariableAccess] name
|
||||
# 40| getPath(): [Path] name
|
||||
# 40| getSegment(): [PathSegment] name
|
||||
# 40| getIdentifier(): [NameRef] name
|
||||
@@ -2652,7 +2652,7 @@ proc_macro.rs:
|
||||
# 40| getArg(1): [MethodCallExpr] name.span()
|
||||
# 40| getArgList(): [ArgList] ArgList
|
||||
# 40| getIdentifier(): [NameRef] span
|
||||
# 40| getReceiver(): [PathExpr,VariableAccess] name
|
||||
# 40| getReceiver(): [VariableAccess] name
|
||||
# 40| getPath(): [Path] name
|
||||
# 40| getSegment(): [PathSegment] name
|
||||
# 40| getIdentifier(): [NameRef] name
|
||||
@@ -2776,7 +2776,7 @@ proc_macro.rs:
|
||||
# 42| getExpr(): [CallExpr] ...::push_ident(...)
|
||||
# 42| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -2812,12 +2812,12 @@ proc_macro.rs:
|
||||
# 42| getExpr(): [CallExpr] ...::to_tokens(...)
|
||||
# 42| getArgList(): [ArgList] ArgList
|
||||
# 42| getArg(0): [RefExpr] &const_ident
|
||||
# 42| getExpr(): [PathExpr,VariableAccess] const_ident
|
||||
# 42| getExpr(): [VariableAccess] const_ident
|
||||
# 42| getPath(): [Path] const_ident
|
||||
# 42| getSegment(): [PathSegment] const_ident
|
||||
# 42| getIdentifier(): [NameRef] const_ident
|
||||
# 41| getArg(1): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -2867,7 +2867,7 @@ proc_macro.rs:
|
||||
# 41| getExpr(): [CallExpr] ...::push_colon(...)
|
||||
# 41| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -2906,7 +2906,7 @@ proc_macro.rs:
|
||||
# 42| getExpr(): [CallExpr] ...::push_ident(...)
|
||||
# 42| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -2952,7 +2952,7 @@ proc_macro.rs:
|
||||
# 41| getExpr(): [CallExpr] ...::push_eq(...)
|
||||
# 41| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -2991,7 +2991,7 @@ proc_macro.rs:
|
||||
# 42| getExpr(): [CallExpr] ...::parse(...)
|
||||
# 42| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3037,7 +3037,7 @@ proc_macro.rs:
|
||||
# 41| getExpr(): [CallExpr] ...::push_semi(...)
|
||||
# 41| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3076,7 +3076,7 @@ proc_macro.rs:
|
||||
# 44| getExpr(): [CallExpr] ...::push_ident(...)
|
||||
# 44| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3122,7 +3122,7 @@ proc_macro.rs:
|
||||
# 44| getExpr(): [CallExpr] ...::push_ident(...)
|
||||
# 44| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3168,7 +3168,7 @@ proc_macro.rs:
|
||||
# 44| getExpr(): [CallExpr] ...::push_ident(...)
|
||||
# 44| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3204,12 +3204,12 @@ proc_macro.rs:
|
||||
# 44| getExpr(): [CallExpr] ...::to_tokens(...)
|
||||
# 44| getArgList(): [ArgList] ArgList
|
||||
# 44| getArg(0): [RefExpr] &name
|
||||
# 44| getExpr(): [PathExpr,VariableAccess] name
|
||||
# 44| getExpr(): [VariableAccess] name
|
||||
# 44| getPath(): [Path] name
|
||||
# 44| getSegment(): [PathSegment] name
|
||||
# 44| getIdentifier(): [NameRef] name
|
||||
# 41| getArg(1): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3259,7 +3259,7 @@ proc_macro.rs:
|
||||
# 45| getExpr(): [CallExpr] ...::push_group(...)
|
||||
# 45| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3384,7 +3384,7 @@ proc_macro.rs:
|
||||
# 45| getExpr(): [CallExpr] ...::push_ident(...)
|
||||
# 45| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3430,7 +3430,7 @@ proc_macro.rs:
|
||||
# 45| getExpr(): [CallExpr] ...::push_ident(...)
|
||||
# 45| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3476,7 +3476,7 @@ proc_macro.rs:
|
||||
# 41| getExpr(): [CallExpr] ...::push_group(...)
|
||||
# 41| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3552,7 +3552,7 @@ proc_macro.rs:
|
||||
# 41| getExpr(): [CallExpr] ...::push_rarrow(...)
|
||||
# 41| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3591,7 +3591,7 @@ proc_macro.rs:
|
||||
# 45| getExpr(): [CallExpr] ...::push_ident(...)
|
||||
# 45| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3637,7 +3637,7 @@ proc_macro.rs:
|
||||
# 46| getExpr(): [CallExpr] ...::push_group(...)
|
||||
# 46| getArgList(): [ArgList] ArgList
|
||||
# 41| getArg(0): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3687,12 +3687,12 @@ proc_macro.rs:
|
||||
# 46| getExpr(): [CallExpr] ...::to_tokens(...)
|
||||
# 46| getArgList(): [ArgList] ArgList
|
||||
# 46| getArg(0): [RefExpr] &const_ident
|
||||
# 46| getExpr(): [PathExpr,VariableAccess] const_ident
|
||||
# 46| getExpr(): [VariableAccess] const_ident
|
||||
# 46| getPath(): [Path] const_ident
|
||||
# 46| getSegment(): [PathSegment] const_ident
|
||||
# 46| getIdentifier(): [NameRef] const_ident
|
||||
# 41| getArg(1): [RefExpr] &mut _s
|
||||
# 41| getExpr(): [PathExpr] _s
|
||||
# 41| getExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3706,7 +3706,7 @@ proc_macro.rs:
|
||||
# 41| getIdentifier(): [NameRef] ToTokens
|
||||
# 41| getSegment(): [PathSegment] to_tokens
|
||||
# 41| getIdentifier(): [NameRef] to_tokens
|
||||
# 41| getTailExpr(): [PathExpr] _s
|
||||
# 41| getTailExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3752,7 +3752,7 @@ proc_macro.rs:
|
||||
# 41| getIdentifier(): [NameRef] quote_token_with_context
|
||||
# 45| getTokenTree(): [TokenTree] TokenTree
|
||||
# 41| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
|
||||
# 41| getTailExpr(): [PathExpr] _s
|
||||
# 41| getTailExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
@@ -3798,7 +3798,7 @@ proc_macro.rs:
|
||||
# 41| getIdentifier(): [NameRef] quote_token_with_context
|
||||
# 44| getTokenTree(): [TokenTree] TokenTree
|
||||
# 41| getMacroCallExpansion(): [MacroBlockExpr] MacroBlockExpr
|
||||
# 41| getTailExpr(): [PathExpr] _s
|
||||
# 41| getTailExpr(): [VariableAccess] _s
|
||||
# 41| getPath(): [Path] _s
|
||||
# 41| getSegment(): [PathSegment] _s
|
||||
# 41| getIdentifier(): [NameRef] _s
|
||||
|
||||
@@ -798,7 +798,7 @@ mod patterns {
|
||||
Some(y) => { // $ item=Some
|
||||
None // $ item=None
|
||||
}
|
||||
None => // $ MISSING: item=None
|
||||
None => // $ item=None
|
||||
None // $ item=None
|
||||
};
|
||||
match y {
|
||||
@@ -827,7 +827,7 @@ mod patterns {
|
||||
_ => 0
|
||||
};
|
||||
match x {
|
||||
Some(z) => z, // $ item=Some $ MISSING: item=constz
|
||||
Some(z) => z, // $ item=Some item=constz
|
||||
_ => 0
|
||||
};
|
||||
}
|
||||
|
||||
@@ -405,6 +405,7 @@ resolvePath
|
||||
| main.rs:797:24:797:26 | i32 | {EXTERNAL LOCATION} | struct i32 |
|
||||
| main.rs:798:13:798:16 | Some | {EXTERNAL LOCATION} | Some |
|
||||
| main.rs:799:17:799:20 | None | {EXTERNAL LOCATION} | None |
|
||||
| main.rs:801:13:801:16 | None | {EXTERNAL LOCATION} | None |
|
||||
| main.rs:802:17:802:20 | None | {EXTERNAL LOCATION} | None |
|
||||
| main.rs:811:19:811:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option |
|
||||
| main.rs:811:26:811:28 | i32 | {EXTERNAL LOCATION} | struct i32 |
|
||||
@@ -413,6 +414,8 @@ resolvePath
|
||||
| main.rs:823:17:823:20 | Some | {EXTERNAL LOCATION} | Some |
|
||||
| main.rs:825:13:825:16 | Some | {EXTERNAL LOCATION} | Some |
|
||||
| main.rs:830:13:830:16 | Some | {EXTERNAL LOCATION} | Some |
|
||||
| main.rs:830:18:830:18 | z | main.rs:817:5:819:12 | Const |
|
||||
| main.rs:830:24:830:24 | z | main.rs:817:5:819:12 | Const |
|
||||
| main.rs:837:5:837:6 | my | main.rs:1:1:1:7 | mod my |
|
||||
| main.rs:837:5:837:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
|
||||
| main.rs:837:5:837:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
|
||||
|
||||
@@ -5,7 +5,7 @@ import TestUtils
|
||||
|
||||
query predicate mod(Module m) { toBeTested(m) }
|
||||
|
||||
query predicate resolvePath(Path p, ItemNode i) {
|
||||
query predicate resolvePath(PathExt p, ItemNode i) {
|
||||
toBeTested(p) and
|
||||
not p.isFromMacroExpansion() and
|
||||
i = resolvePath(p)
|
||||
|
||||
@@ -1865,6 +1865,7 @@ edges
|
||||
| main.rs:794:13:794:19 | Some(...) | main.rs:796:13:796:13 | _ | no-match |
|
||||
| main.rs:794:18:794:18 | z | main.rs:794:18:794:18 | z | |
|
||||
| main.rs:794:18:794:18 | z | main.rs:795:17:795:17 | z | match |
|
||||
| main.rs:794:18:794:18 | z | main.rs:796:13:796:13 | _ | no-match |
|
||||
| main.rs:795:17:795:17 | z | main.rs:793:9:797:9 | match x { ... } | |
|
||||
| main.rs:796:13:796:13 | _ | main.rs:796:18:796:18 | 0 | match |
|
||||
| main.rs:796:18:796:18 | 0 | main.rs:793:9:797:9 | match x { ... } | |
|
||||
|
||||
@@ -198,11 +198,11 @@ definition
|
||||
| main.rs:752:5:752:13 | <captured exit> x | main.rs:745:13:745:13 | x |
|
||||
| main.rs:759:13:759:13 | x | main.rs:759:13:759:13 | x |
|
||||
| main.rs:760:13:760:13 | y | main.rs:760:13:760:13 | y |
|
||||
| main.rs:769:13:769:16 | N0ne | main.rs:769:13:769:16 | N0ne |
|
||||
| main.rs:776:13:776:22 | test_alias | main.rs:776:13:776:22 | test_alias |
|
||||
| main.rs:778:13:778:16 | test | main.rs:778:13:778:16 | test |
|
||||
| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x |
|
||||
| main.rs:789:18:789:18 | x | main.rs:789:18:789:18 | x |
|
||||
| main.rs:794:18:794:18 | z | main.rs:794:18:794:18 | z |
|
||||
read
|
||||
| main.rs:5:14:5:14 | s | main.rs:5:14:5:14 | s | main.rs:7:20:7:20 | s |
|
||||
| main.rs:10:14:10:14 | i | main.rs:10:14:10:14 | i | main.rs:12:20:12:20 | i |
|
||||
@@ -413,12 +413,12 @@ read
|
||||
| main.rs:752:5:752:13 | <captured exit> x | main.rs:745:13:745:13 | x | main.rs:753:15:753:15 | x |
|
||||
| main.rs:759:13:759:13 | x | main.rs:759:13:759:13 | x | main.rs:761:19:761:19 | x |
|
||||
| main.rs:760:13:760:13 | y | main.rs:760:13:760:13 | y | main.rs:768:15:768:15 | y |
|
||||
| main.rs:769:13:769:16 | N0ne | main.rs:769:13:769:16 | N0ne | main.rs:770:17:770:20 | N0ne |
|
||||
| main.rs:776:13:776:22 | test_alias | main.rs:776:13:776:22 | test_alias | main.rs:779:13:779:22 | test_alias |
|
||||
| main.rs:778:13:778:16 | test | main.rs:778:13:778:16 | test | main.rs:780:9:780:12 | test |
|
||||
| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | main.rs:788:15:788:15 | x |
|
||||
| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | main.rs:793:15:793:15 | x |
|
||||
| main.rs:789:18:789:18 | x | main.rs:789:18:789:18 | x | main.rs:790:20:790:20 | x |
|
||||
| main.rs:794:18:794:18 | z | main.rs:794:18:794:18 | z | main.rs:795:17:795:17 | z |
|
||||
firstRead
|
||||
| main.rs:5:14:5:14 | s | main.rs:5:14:5:14 | s | main.rs:7:20:7:20 | s |
|
||||
| main.rs:10:14:10:14 | i | main.rs:10:14:10:14 | i | main.rs:12:20:12:20 | i |
|
||||
@@ -587,11 +587,11 @@ firstRead
|
||||
| main.rs:752:5:752:13 | <captured exit> x | main.rs:745:13:745:13 | x | main.rs:753:15:753:15 | x |
|
||||
| main.rs:759:13:759:13 | x | main.rs:759:13:759:13 | x | main.rs:761:19:761:19 | x |
|
||||
| main.rs:760:13:760:13 | y | main.rs:760:13:760:13 | y | main.rs:768:15:768:15 | y |
|
||||
| main.rs:769:13:769:16 | N0ne | main.rs:769:13:769:16 | N0ne | main.rs:770:17:770:20 | N0ne |
|
||||
| main.rs:776:13:776:22 | test_alias | main.rs:776:13:776:22 | test_alias | main.rs:779:13:779:22 | test_alias |
|
||||
| main.rs:778:13:778:16 | test | main.rs:778:13:778:16 | test | main.rs:780:9:780:12 | test |
|
||||
| main.rs:787:13:787:13 | x | main.rs:787:13:787:13 | x | main.rs:788:15:788:15 | x |
|
||||
| main.rs:789:18:789:18 | x | main.rs:789:18:789:18 | x | main.rs:790:20:790:20 | x |
|
||||
| main.rs:794:18:794:18 | z | main.rs:794:18:794:18 | z | main.rs:795:17:795:17 | z |
|
||||
adjacentReads
|
||||
| main.rs:27:5:27:6 | x2 | main.rs:25:13:25:14 | x2 | main.rs:28:15:28:16 | x2 | main.rs:29:10:29:11 | x2 |
|
||||
| main.rs:41:9:41:10 | x3 | main.rs:41:9:41:10 | x3 | main.rs:42:15:42:16 | x3 | main.rs:44:9:44:10 | x3 |
|
||||
|
||||
@@ -767,7 +767,7 @@ mod patterns {
|
||||
};
|
||||
match y { // $ read_access=y1
|
||||
N0ne => // n0ne
|
||||
N0ne // $ MISSING: read_access=n0ne
|
||||
N0ne // $ read_access=n0ne
|
||||
}
|
||||
}
|
||||
|
||||
@@ -792,7 +792,7 @@ mod patterns {
|
||||
};
|
||||
match x { // $ read_access=x1
|
||||
Some(z) =>
|
||||
z, // $ SPURIOUS: read_access=z
|
||||
z,
|
||||
_ => 0
|
||||
};
|
||||
}
|
||||
|
||||
@@ -145,11 +145,11 @@ variable
|
||||
| main.rs:759:13:759:13 | x |
|
||||
| main.rs:760:13:760:13 | y |
|
||||
| main.rs:762:18:762:18 | y |
|
||||
| main.rs:769:13:769:16 | N0ne |
|
||||
| main.rs:776:13:776:22 | test_alias |
|
||||
| main.rs:778:13:778:16 | test |
|
||||
| main.rs:787:13:787:13 | x |
|
||||
| main.rs:789:18:789:18 | x |
|
||||
| main.rs:794:18:794:18 | z |
|
||||
variableAccess
|
||||
| main.rs:7:20:7:20 | s | main.rs:5:14:5:14 | s |
|
||||
| main.rs:12:20:12:20 | i | main.rs:10:14:10:14 | i |
|
||||
@@ -374,12 +374,12 @@ variableAccess
|
||||
| main.rs:753:15:753:15 | x | main.rs:745:13:745:13 | x |
|
||||
| main.rs:761:19:761:19 | x | main.rs:759:13:759:13 | x |
|
||||
| main.rs:768:15:768:15 | y | main.rs:760:13:760:13 | y |
|
||||
| main.rs:770:17:770:20 | N0ne | main.rs:769:13:769:16 | N0ne |
|
||||
| main.rs:779:13:779:22 | test_alias | main.rs:776:13:776:22 | test_alias |
|
||||
| main.rs:780:9:780:12 | test | main.rs:778:13:778:16 | test |
|
||||
| main.rs:788:15:788:15 | x | main.rs:787:13:787:13 | x |
|
||||
| main.rs:790:20:790:20 | x | main.rs:789:18:789:18 | x |
|
||||
| main.rs:793:15:793:15 | x | main.rs:787:13:787:13 | x |
|
||||
| main.rs:795:17:795:17 | z | main.rs:794:18:794:18 | z |
|
||||
variableWriteAccess
|
||||
| main.rs:27:5:27:6 | x2 | main.rs:25:13:25:14 | x2 |
|
||||
| main.rs:29:5:29:6 | x2 | main.rs:25:13:25:14 | x2 |
|
||||
@@ -594,12 +594,12 @@ variableReadAccess
|
||||
| main.rs:753:15:753:15 | x | main.rs:745:13:745:13 | x |
|
||||
| main.rs:761:19:761:19 | x | main.rs:759:13:759:13 | x |
|
||||
| main.rs:768:15:768:15 | y | main.rs:760:13:760:13 | y |
|
||||
| main.rs:770:17:770:20 | N0ne | main.rs:769:13:769:16 | N0ne |
|
||||
| main.rs:779:13:779:22 | test_alias | main.rs:776:13:776:22 | test_alias |
|
||||
| main.rs:780:9:780:12 | test | main.rs:778:13:778:16 | test |
|
||||
| main.rs:788:15:788:15 | x | main.rs:787:13:787:13 | x |
|
||||
| main.rs:790:20:790:20 | x | main.rs:789:18:789:18 | x |
|
||||
| main.rs:793:15:793:15 | x | main.rs:787:13:787:13 | x |
|
||||
| main.rs:795:17:795:17 | z | main.rs:794:18:794:18 | z |
|
||||
variableInitializer
|
||||
| main.rs:20:9:20:10 | x1 | main.rs:20:14:20:16 | "a" |
|
||||
| main.rs:25:13:25:14 | x2 | main.rs:25:18:25:18 | 4 |
|
||||
|
||||
Reference in New Issue
Block a user