Merge pull request #21188 from paldepind/rust/self-path-assoc

Rust: Implement type inference for associated types for concrete types
This commit is contained in:
Simon Friis Vindum
2026-02-02 13:50:43 +01:00
committed by GitHub
10 changed files with 2055 additions and 1460 deletions

View File

@@ -110,18 +110,15 @@ pragma[nomagic]
private ItemNode getAChildSuccessor(ItemNode item, string name, SuccessorKind kind) {
item = result.getImmediateParent() and
name = result.getName() and
// Associated items in `impl` and `trait` blocks are handled elsewhere
not (item instanceof ImplOrTraitItemNode and result instanceof AssocItem) and
// type parameters are only available inside the declaring item
if result instanceof TypeParam
then kind.isInternal()
else
// associated items must always be qualified, also within the declaring
// item (using `Self`)
if item instanceof ImplOrTraitItemNode and result instanceof AssocItem
then kind.isExternal()
else
if result.isPublic()
then kind.isBoth()
else kind.isInternal()
if result.isPublic()
then kind.isBoth()
else kind.isInternal()
}
private module UseOption = Option<Use>;
@@ -327,30 +324,25 @@ abstract class ItemNode extends Locatable {
)
)
or
// a trait has access to the associated items of its supertraits
this =
any(TraitItemNodeImpl trait |
result = trait.resolveABoundCand().getASuccessor(name, kind, useOpt) and
kind.isExternalOrBoth() and
result instanceof AssocItemNode and
not trait.hasAssocItem(name)
)
result = trait.getAssocItem(name)
or
// a trait has access to the associated items of its supertraits
not trait.hasAssocItem(name) and
result = trait.resolveABoundCand().getASuccessor(name).(AssocItemNode)
) and
kind.isExternal() and
useOpt.isNone()
or
// items made available by an implementation where `this` is the implementing type
typeImplEdge(this, _, name, kind, result, useOpt)
typeImplEdge(this, _, name, result) and
kind.isExternal() and
useOpt.isNone()
or
// trait items with default implementations made available in an implementation
exists(ImplItemNodeImpl impl, TraitItemNode trait |
this = impl and
trait = impl.resolveTraitTyCand() and
result = trait.getASuccessor(name, kind, useOpt) and
// do not inherit default implementations from super traits; those are inherited by
// their `impl` blocks
result = trait.getAssocItem(name) and
result.(AssocItemNode).hasImplementation() and
kind.isExternalOrBoth() and
not impl.hasAssocItem(name)
)
implEdge(this, name, result) and
kind.isExternal() and
useOpt.isNone()
or
// type parameters have access to the associated items of its bounds
result =
@@ -413,14 +405,8 @@ abstract class ItemNode extends Locatable {
this instanceof SourceFile and
builtin(name, result)
or
exists(ImplOrTraitItemNode i |
name = "Self" and
this = i.getAnItemInSelfScope()
|
result = i.(Trait)
or
result = i.(ImplItemNodeImpl).resolveSelfTyCand()
)
name = "Self" and
this = result.(ImplOrTraitItemNode).getAnItemInSelfScope()
or
name = "crate" and
this = result.(CrateItemNode).getASourceFile()
@@ -755,7 +741,7 @@ abstract class ImplOrTraitItemNode extends ItemNode {
}
/** Gets an associated item belonging to this trait or `impl` block. */
abstract AssocItemNode getAnAssocItem();
AssocItemNode getAnAssocItem() { result = this.getADescendant() }
/** Gets the associated item named `name` belonging to this trait or `impl` block. */
pragma[nomagic]
@@ -807,12 +793,12 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
TraitItemNode resolveTraitTy() { result = resolvePath(this.getTraitPath()) }
override AssocItemNode getAnAssocItem() { result = this.getADescendant() }
override string getName() { result = "(impl)" }
override Namespace getNamespace() {
result.isType() // can be referenced with `Self`
// `impl` blocks are referred to using `Self` paths which can appear both as
// types and as values (when the implementing type is a tuple-like struct).
result.isType() or result.isValue()
}
override TypeParam getTypeParam(int i) { result = super.getGenericParamList().getTypeParam(i) }
@@ -985,6 +971,18 @@ private class ImplItemNodeImpl extends ImplItemNode {
}
TraitItemNodeImpl resolveTraitTyCand() { result = resolvePathCand(this.getTraitPath()) }
/**
* Gets the associated item named `name` in this impl block or the default
* inherited from the trait being implemented.
*/
AssocItemNode getAssocItemOrDefault(string name) {
result = this.getAssocItem(name)
or
not this.hasAssocItem(name) and
result = this.resolveTraitTyCand().getAssocItem(name) and
result.hasImplementation()
}
}
private class StructItemNode extends TypeItemTypeItemNode, ParameterizableItemNode instanceof Struct
@@ -1020,8 +1018,6 @@ final class TraitItemNode extends ImplOrTraitItemNode, TypeItemNode instanceof T
ItemNode resolveABound() { result = this.resolveBound(_) }
override AssocItemNode getAnAssocItem() { result = this.getADescendant() }
override string getName() { result = Trait.super.getName().getText() }
override Namespace getNamespace() { result.isType() }
@@ -1790,7 +1786,17 @@ private module DollarCrateResolution {
pragma[nomagic]
private ItemNode resolvePathCand0(PathExt path, Namespace ns) {
result = unqualifiedPathLookup(path, ns, _)
exists(ItemNode res |
res = unqualifiedPathLookup(path, ns, _) and
if
// `Self` paths that are not used as qualifiers (for instance `Self` in
// `fn(..) -> Self`) should resolve to the type being implemented.
not any(PathExt parent).getQualifier() = path and
isUnqualifiedSelfPath(path) and
res instanceof ImplItemNode
then result = res.(ImplItemNodeImpl).resolveSelfTyCand()
else result = res
)
or
DollarCrateResolution::resolveDollarCrate(path, result) and
ns = result.getNamespace()
@@ -1852,35 +1858,12 @@ private predicate checkQualifiedVisibility(
not i instanceof TypeParam
}
pragma[nomagic]
private predicate isImplSelfQualifiedPath(
ImplItemNode impl, PathExt qualifier, PathExt path, string name
) {
qualifier = impl.getASelfPath() and
qualifier = path.getQualifier() and
name = path.getText()
}
private ItemNode resolveImplSelfQualified(PathExt qualifier, PathExt path, Namespace ns) {
exists(ImplItemNode impl, string name |
isImplSelfQualifiedPath(impl, qualifier, path, name) and
result = impl.getAssocItem(name) and
ns = result.getNamespace()
)
}
/**
* Gets the item that `path` resolves to in `ns` when `qualifier` is the
* qualifier of `path` and `qualifier` resolves to `q`, if any.
*/
pragma[nomagic]
private ItemNode resolvePathCandQualified(PathExt qualifier, ItemNode q, PathExt path, Namespace ns) {
// Special case for `Self::Assoc`; this always refers to the associated
// item in the enclosing `impl` block, if available.
q = resolvePathCandQualifier(qualifier, path, _) and
result = resolveImplSelfQualified(qualifier, path, ns)
or
not exists(resolveImplSelfQualified(qualifier, path, ns)) and
exists(string name, SuccessorKind kind, UseOption useOpt |
q = resolvePathCandQualifier(qualifier, path, name) and
result = getASuccessor(q, name, ns, kind, useOpt) and
@@ -1940,6 +1923,37 @@ private predicate macroExportEdge(CrateItemNode crate, string name, MacroItemNod
name = macro.getName()
}
/**
* Holds if a `Self` path inside `impl` might refer to a function named `name`
* from another impl block.
*/
pragma[nomagic]
private predicate relevantSelfFunctionName(ImplItemNodeImpl impl, string name) {
any(Path path | path.getQualifier() = impl.getASelfPath()).getText() = name and
not impl.hasAssocItem(name)
}
/**
* Holds if `impl` has a `node` available externally at `name`.
*
* Since `Self` in an impl block resolves to the impl block, this corresponds to
* the items that should be available on `Self` within the `impl` block.
*/
private predicate implEdge(ImplItemNodeImpl impl, string name, ItemNode node) {
node = impl.getAssocItemOrDefault(name)
or
// Associated types from the implemented trait are available on `Self`.
not impl.hasAssocItem(name) and
node = impl.resolveTraitTyCand().getASuccessor(name).(TypeAliasItemNode)
or
// Items available on the implementing type are available on `Self`. We only
// add these edges when they are relevant. If a type has `n` impl blocks with
// `m` functions each, we would otherwise end up always constructing something
// proportional to `O(n * m)`.
relevantSelfFunctionName(impl, name) and
node = impl.resolveSelfTyCand().getASuccessor(name)
}
/**
* Holds if item `i` contains a `mod` or `extern crate` definition that
* makes the macro `macro` named `name` available using a `#[macro_use]`
@@ -2009,9 +2023,10 @@ private ItemNode resolvePathCand(PathExt path) {
/** Get a trait that should be visible when `path` resolves to `node`, if any. */
private Trait getResolvePathTraitUsed(PathExt path, AssocItemNode node) {
exists(TypeItemNode type, ImplItemNodeImpl impl |
node = resolvePathCandQualified(_, type, path, _) and
typeImplEdge(type, impl, _, _, node, _) and
exists(TypeItemNode type, ItemNode qual, ImplItemNodeImpl impl |
node = resolvePathCandQualified(_, qual, path, _) and
type = [qual, qual.(ImplItemNodeImpl).resolveSelfTyCand()] and
typeImplEdge(type, impl, _, node) and
result = impl.resolveTraitTyCand()
)
}
@@ -2179,15 +2194,17 @@ private predicate externCrateEdge(
/**
* Holds if `typeItem` is the implementing type of `impl` and the implementation
* makes `assoc` available as `name` at `kind`.
* makes `assoc` available as `name`.
*/
private predicate typeImplEdge(
TypeItemNode typeItem, ImplItemNodeImpl impl, string name, SuccessorKind kind,
AssocItemNode assoc, UseOption useOpt
TypeItemNode typeItem, ImplItemNodeImpl impl, string name, AssocItemNode assoc
) {
assoc = impl.getAssocItemOrDefault(name) and
typeItem = impl.resolveSelfTyCand() and
assoc = impl.getASuccessor(name, kind, useOpt) and
kind.isExternalOrBoth()
// Functions in `impl` blocks are made available on the implementing type
// (e.g., `S::fun` is valid) but associated types are not (e.g., `S::Output`
// is invalid).
not assoc instanceof TypeAlias
}
pragma[nomagic]

View File

@@ -75,7 +75,7 @@ abstract class Type extends TType {
abstract TypeParameter getPositionalTypeParameter(int i);
/** Gets the default type for the `i`th type parameter, if any. */
TypeMention getTypeParameterDefault(int i) { none() }
TypeRepr getTypeParameterDefault(int i) { none() }
/**
* Gets a type parameter of this type.
@@ -129,7 +129,7 @@ class DataType extends Type, TDataType {
result = TTypeParamTypeParameter(typeItem.getGenericParamList().getTypeParam(i))
}
override TypeMention getTypeParameterDefault(int i) {
override TypeRepr getTypeParameterDefault(int i) {
result = typeItem.getGenericParamList().getTypeParam(i).getDefaultType()
}
@@ -189,7 +189,7 @@ class TraitType extends Type, TTrait {
result.(SelfTypeParameter).getTrait() = trait
}
override TypeMention getTypeParameterDefault(int i) {
override TypeRepr getTypeParameterDefault(int i) {
result = trait.getGenericParamList().getTypeParam(i).getDefaultType()
}

View File

@@ -134,8 +134,8 @@ class TypePath = M1::TypePath;
module TypePath = M1::TypePath;
private module Input2 implements InputSig2<TypeMention> {
TypeMention getABaseTypeMention(Type t) { none() }
private module Input2 implements InputSig2<PreTypeMention> {
PreTypeMention getABaseTypeMention(Type t) { none() }
Type getATypeParameterConstraint(TypeParameter tp, TypePath path) {
exists(TypeMention tm | result = tm.getTypeAt(path) |
@@ -158,7 +158,7 @@ private module Input2 implements InputSig2<TypeMention> {
* inference module for more information.
*/
predicate conditionSatisfiesConstraint(
TypeAbstraction abs, TypeMention condition, TypeMention constraint, boolean transitive
TypeAbstraction abs, PreTypeMention condition, PreTypeMention constraint, boolean transitive
) {
// `impl` blocks implementing traits
transitive = false and
@@ -208,7 +208,7 @@ private module Input2 implements InputSig2<TypeMention> {
}
}
private module M2 = Make2<TypeMention, Input2>;
private module M2 = Make2<PreTypeMention, Input2>;
import M2
@@ -1960,7 +1960,7 @@ private module MethodResolution {
pragma[nomagic]
predicate hasTypeQualifiedCandidate(ImplItemNode impl) {
exists(getCallExprTypeQualifier(this, _)) and
CallExprImpl::getResolvedFunction(this) = impl.getASuccessor(_)
CallExprImpl::getResolvedFunction(this) = impl.getADescendant()
}
pragma[nomagic]

View File

@@ -10,7 +10,11 @@ private import TypeInference::Consistency as Consistency
import TypeInference::Consistency
query predicate illFormedTypeMention(TypeMention tm) {
Consistency::illFormedTypeMention(tm) and
// NOTE: We do not use `illFormedTypeMention` from the shared library as it is
// instantiated with `PreTypeMention` and we are interested in inconsistencies
// for `TypeMention`.
not exists(tm.getTypeAt(TypePath::nil())) and
exists(tm.getLocation()) and
// avoid overlap with `PathTypeMention`
not tm instanceof PathTypeReprMention and
// known limitation for type mentions that would mention an escaping type parameter
@@ -27,7 +31,8 @@ query predicate illFormedTypeMention(TypeMention tm) {
}
query predicate nonUniqueCertainType(AstNode n, TypePath path) {
Consistency::nonUniqueCertainType(n, path, _)
Consistency::nonUniqueCertainType(n, path, _) and
n.fromSource() // Only include inconsistencies in the source.
}
int getTypeInferenceInconsistencyCounts(string type) {

File diff suppressed because it is too large Load Diff

View File

@@ -606,6 +606,13 @@ mod trait_visibility {
// Only the `Foo` trait is visible
use m::Foo; // $ item=Foo
X::a_method(&x); // $ item=X_Foo::a_method
#[rustfmt::skip]
impl X { // $ item=X
fn test(&self) {
Self::a_method(self); // $ item=X_Foo::a_method
}
}
}
{
// Only the `Bar` trait is visible
@@ -722,7 +729,7 @@ mod m23 {
fn f(&self) {
println!("m23::<S as Trait1<S>>::f"); // $ item=println
} // I5
}
} // implTrait1forS
#[rustfmt::skip]
pub fn f() {
@@ -870,6 +877,71 @@ mod associated_types {
}
}
mod associated_types_subtrait {
trait Super {
type Out; // SuperAssoc
} // Super
trait Sub: Super // $ item=Super
{
fn f() -> Self::Out // $ item=SuperAssoc
; // Sub_f
} // Sub
struct S<ST>(
ST, // $ item=ST
);
#[rustfmt::skip]
impl Super for S<i32> { // $ item=Super item=S item=i32
type Out = char // $ item=char
; // S<i32>::Out
}
#[rustfmt::skip]
impl Super for S<bool> { // $ item=Super item=S item=bool
type Out = i64 // $ item=i64
; // S<bool>::Out
}
#[rustfmt::skip]
impl Sub for S<i32> { // $ item=Sub item=S item=i32
fn f() -> Self::Out { // $ item=SuperAssoc
'a'
}
}
#[rustfmt::skip]
impl Sub for S<bool> { // $ item=Sub item=S item=bool
fn f() -> Self::Out { // $ item=SuperAssoc
1
}
}
trait SuperAlt {
type Out; // SuperAltAssoc
} // SuperAlt
trait SubAlt: SuperAlt // $ item=SuperAlt
{
fn f(self) -> Self::Out // $ item=SuperAltAssoc
; // SubAlt_f
} // SubAlt
#[rustfmt::skip]
impl<A> SuperAlt for S<A> { // $ item=SuperAlt item=S item=A
type Out = A // $ item=A
; // S<A>::Out
}
#[rustfmt::skip]
impl<A> SubAlt for S<A> { // $ item=SubAlt item=S item=A
fn f(self) -> Self::Out { // $ item=SuperAltAssoc
self.0
}
}
}
use std::{self as ztd}; // $ item=std
fn use_ztd(x: ztd::string::String) {} // $ item=String

View File

@@ -19,21 +19,22 @@ mod
| main.rs:295:5:303:5 | mod m14 |
| main.rs:306:1:375:1 | mod m15 |
| main.rs:377:1:574:1 | mod m16 |
| main.rs:576:1:626:1 | mod trait_visibility |
| main.rs:576:1:633:1 | mod trait_visibility |
| main.rs:577:5:599:5 | mod m |
| main.rs:628:1:658:1 | mod m17 |
| main.rs:660:1:678:1 | mod m18 |
| main.rs:665:5:677:5 | mod m19 |
| main.rs:670:9:676:9 | mod m20 |
| main.rs:680:1:705:1 | mod m21 |
| main.rs:681:5:687:5 | mod m22 |
| main.rs:689:5:704:5 | mod m33 |
| main.rs:707:1:732:1 | mod m23 |
| main.rs:734:1:802:1 | mod m24 |
| main.rs:819:1:871:1 | mod associated_types |
| main.rs:877:1:896:1 | mod impl_with_attribute_macro |
| main.rs:898:1:939:1 | mod patterns |
| main.rs:941:1:985:1 | mod self_constructors |
| main.rs:635:1:665:1 | mod m17 |
| main.rs:667:1:685:1 | mod m18 |
| main.rs:672:5:684:5 | mod m19 |
| main.rs:677:9:683:9 | mod m20 |
| main.rs:687:1:712:1 | mod m21 |
| main.rs:688:5:694:5 | mod m22 |
| main.rs:696:5:711:5 | mod m33 |
| main.rs:714:1:739:1 | mod m23 |
| main.rs:741:1:809:1 | mod m24 |
| main.rs:826:1:878:1 | mod associated_types |
| main.rs:880:1:943:1 | mod associated_types_subtrait |
| main.rs:949:1:968:1 | mod impl_with_attribute_macro |
| main.rs:970:1:1011:1 | mod patterns |
| main.rs:1013:1:1057:1 | mod self_constructors |
| my2/mod.rs:1:1:1:16 | mod nested2 |
| my2/mod.rs:20:1:20:12 | mod my3 |
| my2/mod.rs:22:1:23:10 | mod mymod |
@@ -74,7 +75,7 @@ resolvePath
| main.rs:37:17:37:24 | ...::f | main.rs:26:9:28:9 | fn f |
| main.rs:39:17:39:23 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:40:17:40:17 | f | main.rs:26:9:28:9 | fn f |
| main.rs:47:9:47:13 | super | main.rs:1:1:1024:2 | SourceFile |
| main.rs:47:9:47:13 | super | main.rs:1:1:1096:2 | SourceFile |
| main.rs:47:9:47:17 | ...::m1 | main.rs:20:1:44:1 | mod m1 |
| main.rs:47:9:47:21 | ...::m2 | main.rs:25:5:43:5 | mod m2 |
| main.rs:47:9:47:24 | ...::g | main.rs:30:9:34:9 | fn g |
@@ -89,7 +90,7 @@ resolvePath
| main.rs:68:17:68:19 | Foo | main.rs:66:9:66:21 | struct Foo |
| main.rs:71:13:71:15 | Foo | main.rs:60:5:60:17 | struct Foo |
| main.rs:73:5:73:5 | f | main.rs:62:5:69:5 | fn f |
| main.rs:75:5:75:8 | self | main.rs:1:1:1024:2 | SourceFile |
| main.rs:75:5:75:8 | self | main.rs:1:1:1096:2 | SourceFile |
| main.rs:75:5:75:11 | ...::i | main.rs:78:1:90:1 | fn i |
| main.rs:79:5:79:11 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:81:13:81:15 | Foo | main.rs:55:1:55:13 | struct Foo |
@@ -111,7 +112,7 @@ resolvePath
| main.rs:112:9:112:15 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:118:9:118:15 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:122:9:122:15 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:125:13:125:17 | super | main.rs:1:1:1024:2 | SourceFile |
| main.rs:125:13:125:17 | super | main.rs:1:1:1096:2 | SourceFile |
| main.rs:125:13:125:21 | ...::m5 | main.rs:110:1:114:1 | mod m5 |
| main.rs:126:9:126:9 | f | main.rs:111:5:113:5 | fn f |
| main.rs:126:9:126:9 | f | main.rs:117:5:119:5 | fn f |
@@ -134,7 +135,7 @@ resolvePath
| main.rs:169:22:169:29 | MyStruct | main.rs:162:5:162:22 | struct MyStruct |
| main.rs:171:13:171:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:172:13:172:13 | f | main.rs:164:5:166:5 | fn f |
| main.rs:173:13:173:16 | Self | main.rs:162:5:162:22 | struct MyStruct |
| main.rs:173:13:173:16 | Self | main.rs:168:5:179:5 | impl MyTrait for MyStruct { ... } |
| main.rs:173:13:173:19 | ...::g | main.rs:176:9:178:9 | fn g |
| main.rs:177:13:177:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:182:10:182:17 | MyStruct | main.rs:162:5:162:22 | struct MyStruct |
@@ -198,7 +199,7 @@ resolvePath
| main.rs:341:10:341:15 | Trait1 | main.rs:307:5:311:5 | trait Trait1 |
| main.rs:342:11:342:11 | S | main.rs:338:5:338:13 | struct S |
| main.rs:344:13:344:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:345:13:345:16 | Self | main.rs:338:5:338:13 | struct S |
| main.rs:345:13:345:16 | Self | main.rs:340:5:352:5 | impl Trait1 for S { ... } |
| main.rs:345:13:345:19 | ...::g | main.rs:349:9:351:9 | fn g |
| main.rs:350:13:350:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:355:10:355:15 | Trait2 | main.rs:313:5:321:5 | trait Trait2 |
@@ -231,11 +232,11 @@ resolvePath
| main.rs:418:11:418:11 | S | main.rs:412:5:412:13 | struct S |
| main.rs:419:24:419:24 | S | main.rs:412:5:412:13 | struct S |
| main.rs:420:13:420:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:421:13:421:16 | Self | main.rs:412:5:412:13 | struct S |
| main.rs:421:13:421:16 | Self | main.rs:414:5:432:5 | impl Trait1::<...> for S { ... } |
| main.rs:421:13:421:19 | ...::g | main.rs:425:9:428:9 | fn g |
| main.rs:425:24:425:24 | S | main.rs:412:5:412:13 | struct S |
| main.rs:426:13:426:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:427:13:427:16 | Self | main.rs:412:5:412:13 | struct S |
| main.rs:427:13:427:16 | Self | main.rs:414:5:432:5 | impl Trait1::<...> for S { ... } |
| main.rs:427:13:427:19 | ...::c | main.rs:430:9:431:9 | Const |
| main.rs:430:18:430:18 | S | main.rs:412:5:412:13 | struct S |
| main.rs:430:22:430:22 | S | main.rs:412:5:412:13 | struct S |
@@ -243,10 +244,10 @@ resolvePath
| main.rs:436:7:436:7 | S | main.rs:412:5:412:13 | struct S |
| main.rs:438:11:438:11 | S | main.rs:412:5:412:13 | struct S |
| main.rs:439:24:439:24 | S | main.rs:412:5:412:13 | struct S |
| main.rs:440:13:440:16 | Self | main.rs:412:5:412:13 | struct S |
| main.rs:440:13:440:16 | Self | main.rs:434:5:444:5 | impl Trait2::<...> for S { ... } |
| main.rs:440:13:440:19 | ...::g | main.rs:425:9:428:9 | fn g |
| main.rs:441:13:441:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:442:13:442:16 | Self | main.rs:412:5:412:13 | struct S |
| main.rs:442:13:442:16 | Self | main.rs:434:5:444:5 | impl Trait2::<...> for S { ... } |
| main.rs:442:13:442:19 | ...::c | main.rs:430:9:431:9 | Const |
| main.rs:448:9:448:15 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:449:17:449:17 | S | main.rs:412:5:412:13 | struct S |
@@ -268,42 +269,42 @@ resolvePath
| main.rs:487:10:487:15 | Trait3 | main.rs:472:5:476:5 | trait Trait3 |
| main.rs:487:21:487:22 | S2 | main.rs:484:5:484:14 | struct S2 |
| main.rs:488:26:488:28 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:492:20:492:23 | Self | main.rs:484:5:484:14 | struct S2 |
| main.rs:492:20:492:23 | Self | main.rs:486:5:494:5 | impl Trait3 for S2 { ... } |
| main.rs:492:20:492:34 | ...::AssocType | main.rs:487:26:489:9 | type AssocType |
| main.rs:497:10:497:15 | Trait4 | main.rs:478:5:482:5 | trait Trait4 |
| main.rs:497:21:497:22 | S2 | main.rs:484:5:484:14 | struct S2 |
| main.rs:498:26:498:29 | bool | {EXTERNAL LOCATION} | struct bool |
| main.rs:502:13:502:16 | Self | main.rs:484:5:484:14 | struct S2 |
| main.rs:502:13:502:16 | Self | main.rs:496:5:506:5 | impl Trait4 for S2 { ... } |
| main.rs:502:13:502:19 | ...::f | main.rs:489:11:493:9 | fn f |
| main.rs:503:13:503:14 | S2 | main.rs:484:5:484:14 | struct S2 |
| main.rs:503:13:503:17 | ...::f | main.rs:489:11:493:9 | fn f |
| main.rs:504:20:504:23 | Self | main.rs:484:5:484:14 | struct S2 |
| main.rs:504:20:504:23 | Self | main.rs:496:5:506:5 | impl Trait4 for S2 { ... } |
| main.rs:504:20:504:34 | ...::AssocType | main.rs:497:26:499:9 | type AssocType |
| main.rs:511:23:511:26 | Self | main.rs:508:5:512:5 | trait Trait5 |
| main.rs:511:23:511:33 | ...::Assoc | main.rs:509:9:509:19 | type Assoc |
| main.rs:515:10:515:15 | Trait5 | main.rs:508:5:512:5 | trait Trait5 |
| main.rs:515:21:515:21 | S | main.rs:412:5:412:13 | struct S |
| main.rs:516:22:516:24 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:520:16:520:19 | Self | main.rs:412:5:412:13 | struct S |
| main.rs:520:16:520:19 | Self | main.rs:514:5:523:5 | impl Trait5 for S { ... } |
| main.rs:520:16:520:26 | ...::Assoc | main.rs:515:25:517:9 | type Assoc |
| main.rs:521:13:521:16 | Self | main.rs:412:5:412:13 | struct S |
| main.rs:521:13:521:16 | Self | main.rs:514:5:523:5 | impl Trait5 for S { ... } |
| main.rs:521:13:521:23 | ...::Assoc | main.rs:519:9:522:9 | fn Assoc |
| main.rs:525:19:525:20 | T3 | main.rs:525:15:525:16 | T3 |
| main.rs:528:10:528:15 | Trait5 | main.rs:508:5:512:5 | trait Trait5 |
| main.rs:528:21:528:27 | S3::<...> | main.rs:525:5:525:22 | struct S3 |
| main.rs:528:24:528:26 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:529:22:529:24 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:533:16:533:19 | Self | main.rs:525:5:525:22 | struct S3 |
| main.rs:533:16:533:19 | Self | main.rs:527:5:536:5 | impl Trait5 for S3::<...> { ... } |
| main.rs:533:16:533:26 | ...::Assoc | main.rs:528:31:530:9 | type Assoc |
| main.rs:534:13:534:16 | Self | main.rs:525:5:525:22 | struct S3 |
| main.rs:534:13:534:16 | Self | main.rs:527:5:536:5 | impl Trait5 for S3::<...> { ... } |
| main.rs:534:13:534:23 | ...::Assoc | main.rs:532:9:535:9 | fn Assoc |
| main.rs:539:10:539:15 | Trait5 | main.rs:508:5:512:5 | trait Trait5 |
| main.rs:539:21:539:28 | S3::<...> | main.rs:525:5:525:22 | struct S3 |
| main.rs:539:24:539:27 | bool | {EXTERNAL LOCATION} | struct bool |
| main.rs:540:22:540:25 | bool | {EXTERNAL LOCATION} | struct bool |
| main.rs:544:16:544:19 | Self | main.rs:525:5:525:22 | struct S3 |
| main.rs:544:16:544:19 | Self | main.rs:538:5:547:5 | impl Trait5 for S3::<...> { ... } |
| main.rs:544:16:544:26 | ...::Assoc | main.rs:539:32:541:9 | type Assoc |
| main.rs:545:14:545:17 | Self | main.rs:525:5:525:22 | struct S3 |
| main.rs:545:14:545:17 | Self | main.rs:538:5:547:5 | impl Trait5 for S3::<...> { ... } |
| main.rs:545:14:545:24 | ...::Assoc | main.rs:543:9:546:9 | fn Assoc |
| main.rs:550:10:550:16 | S3::<...> | main.rs:525:5:525:22 | struct S3 |
| main.rs:550:13:550:15 | i32 | {EXTERNAL LOCATION} | struct i32 |
@@ -336,237 +337,274 @@ resolvePath
| main.rs:607:17:607:22 | ...::Foo | main.rs:578:9:580:9 | trait Foo |
| main.rs:608:13:608:13 | X | main.rs:586:9:586:21 | struct X |
| main.rs:608:13:608:23 | ...::a_method | main.rs:588:26:591:13 | fn a_method |
| main.rs:612:17:612:17 | m | main.rs:577:5:599:5 | mod m |
| main.rs:612:17:612:22 | ...::Bar | main.rs:582:9:584:9 | trait Bar |
| main.rs:613:13:613:13 | X | main.rs:586:9:586:21 | struct X |
| main.rs:613:13:613:23 | ...::a_method | main.rs:594:26:597:13 | fn a_method |
| main.rs:617:17:617:17 | m | main.rs:577:5:599:5 | mod m |
| main.rs:617:17:617:22 | ...::Bar | main.rs:582:9:584:9 | trait Bar |
| main.rs:618:13:618:13 | X | main.rs:586:9:586:21 | struct X |
| main.rs:618:13:618:23 | ...::a_method | main.rs:594:26:597:13 | fn a_method |
| main.rs:623:13:623:13 | m | main.rs:577:5:599:5 | mod m |
| main.rs:623:13:623:18 | ...::Bar | main.rs:582:9:584:9 | trait Bar |
| main.rs:623:13:623:28 | ...::a_method | main.rs:583:13:583:31 | fn a_method |
| main.rs:636:10:636:16 | MyTrait | main.rs:629:5:631:5 | trait MyTrait |
| main.rs:637:9:637:9 | S | main.rs:633:5:633:13 | struct S |
| main.rs:639:13:639:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:645:7:645:13 | MyTrait | main.rs:629:5:631:5 | trait MyTrait |
| main.rs:646:10:646:10 | T | main.rs:644:10:644:10 | T |
| main.rs:648:9:648:9 | T | main.rs:644:10:644:10 | T |
| main.rs:648:9:648:12 | ...::f | main.rs:630:9:630:20 | fn f |
| main.rs:649:9:649:15 | MyTrait | main.rs:629:5:631:5 | trait MyTrait |
| main.rs:649:9:649:18 | ...::f | main.rs:630:9:630:20 | fn f |
| main.rs:654:9:654:9 | g | main.rs:643:5:650:5 | fn g |
| main.rs:655:11:655:11 | S | main.rs:633:5:633:13 | struct S |
| main.rs:662:9:662:15 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:667:13:667:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:672:17:672:23 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:673:17:673:21 | super | main.rs:665:5:677:5 | mod m19 |
| main.rs:673:17:673:24 | ...::f | main.rs:666:9:668:9 | fn f |
| main.rs:674:17:674:21 | super | main.rs:665:5:677:5 | mod m19 |
| main.rs:674:17:674:28 | ...::super | main.rs:660:1:678:1 | mod m18 |
| main.rs:674:17:674:31 | ...::f | main.rs:661:5:663:5 | fn f |
| main.rs:691:13:691:17 | super | main.rs:680:1:705:1 | mod m21 |
| main.rs:691:13:691:22 | ...::m22 | main.rs:681:5:687:5 | mod m22 |
| main.rs:691:13:691:30 | ...::MyEnum | main.rs:682:9:684:9 | enum MyEnum |
| main.rs:692:13:692:16 | self | main.rs:682:9:684:9 | enum MyEnum |
| main.rs:696:13:696:17 | super | main.rs:680:1:705:1 | mod m21 |
| main.rs:696:13:696:22 | ...::m22 | main.rs:681:5:687:5 | mod m22 |
| main.rs:696:13:696:32 | ...::MyStruct | main.rs:686:9:686:28 | struct MyStruct |
| main.rs:697:13:697:16 | self | main.rs:686:9:686:28 | struct MyStruct |
| main.rs:701:21:701:26 | MyEnum | main.rs:682:9:684:9 | enum MyEnum |
| main.rs:701:21:701:29 | ...::A | main.rs:683:13:683:13 | A |
| main.rs:702:21:702:28 | MyStruct | main.rs:686:9:686:28 | struct MyStruct |
| main.rs:718:10:720:5 | Trait1::<...> | main.rs:708:5:713:5 | trait Trait1 |
| main.rs:719:7:719:10 | Self | main.rs:715:5:715:13 | struct S |
| main.rs:721:11:721:11 | S | main.rs:715:5:715:13 | struct S |
| main.rs:723:13:723:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:729:17:729:17 | S | main.rs:715:5:715:13 | struct S |
| main.rs:745:15:745:15 | T | main.rs:744:26:744:26 | T |
| main.rs:750:9:750:24 | GenericStruct::<...> | main.rs:743:5:746:5 | struct GenericStruct |
| main.rs:750:23:750:23 | T | main.rs:749:10:749:10 | T |
| main.rs:752:9:752:9 | T | main.rs:749:10:749:10 | T |
| main.rs:752:12:752:17 | TraitA | main.rs:735:5:737:5 | trait TraitA |
| main.rs:761:9:761:24 | GenericStruct::<...> | main.rs:743:5:746:5 | struct GenericStruct |
| main.rs:761:23:761:23 | T | main.rs:760:10:760:10 | T |
| main.rs:763:9:763:9 | T | main.rs:760:10:760:10 | T |
| main.rs:763:12:763:17 | TraitB | main.rs:739:5:741:5 | trait TraitB |
| main.rs:764:9:764:9 | T | main.rs:760:10:760:10 | T |
| main.rs:764:12:764:17 | TraitA | main.rs:735:5:737:5 | trait TraitA |
| main.rs:775:10:775:15 | TraitA | main.rs:735:5:737:5 | trait TraitA |
| main.rs:775:21:775:31 | Implementor | main.rs:772:5:772:23 | struct Implementor |
| main.rs:777:13:777:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:782:10:782:15 | TraitB | main.rs:739:5:741:5 | trait TraitB |
| main.rs:782:21:782:31 | Implementor | main.rs:772:5:772:23 | struct Implementor |
| main.rs:611:18:611:18 | X | main.rs:586:9:586:21 | struct X |
| main.rs:613:21:613:24 | Self | main.rs:610:13:615:13 | impl X { ... } |
| main.rs:613:21:613:34 | ...::a_method | main.rs:588:26:591:13 | fn a_method |
| main.rs:619:17:619:17 | m | main.rs:577:5:599:5 | mod m |
| main.rs:619:17:619:22 | ...::Bar | main.rs:582:9:584:9 | trait Bar |
| main.rs:620:13:620:13 | X | main.rs:586:9:586:21 | struct X |
| main.rs:620:13:620:23 | ...::a_method | main.rs:594:26:597:13 | fn a_method |
| main.rs:624:17:624:17 | m | main.rs:577:5:599:5 | mod m |
| main.rs:624:17:624:22 | ...::Bar | main.rs:582:9:584:9 | trait Bar |
| main.rs:625:13:625:13 | X | main.rs:586:9:586:21 | struct X |
| main.rs:625:13:625:23 | ...::a_method | main.rs:594:26:597:13 | fn a_method |
| main.rs:630:13:630:13 | m | main.rs:577:5:599:5 | mod m |
| main.rs:630:13:630:18 | ...::Bar | main.rs:582:9:584:9 | trait Bar |
| main.rs:630:13:630:28 | ...::a_method | main.rs:583:13:583:31 | fn a_method |
| main.rs:643:10:643:16 | MyTrait | main.rs:636:5:638:5 | trait MyTrait |
| main.rs:644:9:644:9 | S | main.rs:640:5:640:13 | struct S |
| main.rs:646:13:646:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:652:7:652:13 | MyTrait | main.rs:636:5:638:5 | trait MyTrait |
| main.rs:653:10:653:10 | T | main.rs:651:10:651:10 | T |
| main.rs:655:9:655:9 | T | main.rs:651:10:651:10 | T |
| main.rs:655:9:655:12 | ...::f | main.rs:637:9:637:20 | fn f |
| main.rs:656:9:656:15 | MyTrait | main.rs:636:5:638:5 | trait MyTrait |
| main.rs:656:9:656:18 | ...::f | main.rs:637:9:637:20 | fn f |
| main.rs:661:9:661:9 | g | main.rs:650:5:657:5 | fn g |
| main.rs:662:11:662:11 | S | main.rs:640:5:640:13 | struct S |
| main.rs:669:9:669:15 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:674:13:674:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:679:17:679:23 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:680:17:680:21 | super | main.rs:672:5:684:5 | mod m19 |
| main.rs:680:17:680:24 | ...::f | main.rs:673:9:675:9 | fn f |
| main.rs:681:17:681:21 | super | main.rs:672:5:684:5 | mod m19 |
| main.rs:681:17:681:28 | ...::super | main.rs:667:1:685:1 | mod m18 |
| main.rs:681:17:681:31 | ...::f | main.rs:668:5:670:5 | fn f |
| main.rs:698:13:698:17 | super | main.rs:687:1:712:1 | mod m21 |
| main.rs:698:13:698:22 | ...::m22 | main.rs:688:5:694:5 | mod m22 |
| main.rs:698:13:698:30 | ...::MyEnum | main.rs:689:9:691:9 | enum MyEnum |
| main.rs:699:13:699:16 | self | main.rs:689:9:691:9 | enum MyEnum |
| main.rs:703:13:703:17 | super | main.rs:687:1:712:1 | mod m21 |
| main.rs:703:13:703:22 | ...::m22 | main.rs:688:5:694:5 | mod m22 |
| main.rs:703:13:703:32 | ...::MyStruct | main.rs:693:9:693:28 | struct MyStruct |
| main.rs:704:13:704:16 | self | main.rs:693:9:693:28 | struct MyStruct |
| main.rs:708:21:708:26 | MyEnum | main.rs:689:9:691:9 | enum MyEnum |
| main.rs:708:21:708:29 | ...::A | main.rs:690:13:690:13 | A |
| main.rs:709:21:709:28 | MyStruct | main.rs:693:9:693:28 | struct MyStruct |
| main.rs:725:10:727:5 | Trait1::<...> | main.rs:715:5:720:5 | trait Trait1 |
| main.rs:726:7:726:10 | Self | main.rs:722:5:722:13 | struct S |
| main.rs:728:11:728:11 | S | main.rs:722:5:722:13 | struct S |
| main.rs:730:13:730:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:736:17:736:17 | S | main.rs:722:5:722:13 | struct S |
| main.rs:752:15:752:15 | T | main.rs:751:26:751:26 | T |
| main.rs:757:9:757:24 | GenericStruct::<...> | main.rs:750:5:753:5 | struct GenericStruct |
| main.rs:757:23:757:23 | T | main.rs:756:10:756:10 | T |
| main.rs:759:9:759:9 | T | main.rs:756:10:756:10 | T |
| main.rs:759:12:759:17 | TraitA | main.rs:742:5:744:5 | trait TraitA |
| main.rs:768:9:768:24 | GenericStruct::<...> | main.rs:750:5:753:5 | struct GenericStruct |
| main.rs:768:23:768:23 | T | main.rs:767:10:767:10 | T |
| main.rs:770:9:770:9 | T | main.rs:767:10:767:10 | T |
| main.rs:770:12:770:17 | TraitB | main.rs:746:5:748:5 | trait TraitB |
| main.rs:771:9:771:9 | T | main.rs:767:10:767:10 | T |
| main.rs:771:12:771:17 | TraitA | main.rs:742:5:744:5 | trait TraitA |
| main.rs:782:10:782:15 | TraitA | main.rs:742:5:744:5 | trait TraitA |
| main.rs:782:21:782:31 | Implementor | main.rs:779:5:779:23 | struct Implementor |
| main.rs:784:13:784:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:790:24:790:34 | Implementor | main.rs:772:5:772:23 | struct Implementor |
| main.rs:791:23:791:35 | GenericStruct | main.rs:743:5:746:5 | struct GenericStruct |
| main.rs:797:9:797:36 | GenericStruct::<...> | main.rs:743:5:746:5 | struct GenericStruct |
| main.rs:797:9:797:50 | ...::call_trait_a | main.rs:754:9:756:9 | fn call_trait_a |
| main.rs:797:25:797:35 | Implementor | main.rs:772:5:772:23 | struct Implementor |
| main.rs:800:9:800:36 | GenericStruct::<...> | main.rs:743:5:746:5 | struct GenericStruct |
| main.rs:800:9:800:47 | ...::call_both | main.rs:766:9:769:9 | fn call_both |
| main.rs:800:25:800:35 | Implementor | main.rs:772:5:772:23 | struct Implementor |
| main.rs:806:3:806:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
| main.rs:806:3:806:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix |
| main.rs:810:6:810:12 | AStruct | main.rs:809:1:809:17 | struct AStruct |
| main.rs:812:7:812:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
| main.rs:812:7:812:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix |
| main.rs:815:7:815:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
| main.rs:815:7:815:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix |
| main.rs:820:9:820:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
| main.rs:820:9:820:19 | ...::marker | {EXTERNAL LOCATION} | mod marker |
| main.rs:820:9:820:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData |
| main.rs:821:9:821:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
| main.rs:821:9:821:19 | ...::result | {EXTERNAL LOCATION} | mod result |
| main.rs:821:9:821:27 | ...::Result | {EXTERNAL LOCATION} | enum Result |
| main.rs:829:19:829:22 | Self | main.rs:823:5:831:5 | trait Reduce |
| main.rs:829:19:829:29 | ...::Input | main.rs:824:9:824:19 | type Input |
| main.rs:830:14:830:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result |
| main.rs:830:21:830:24 | Self | main.rs:823:5:831:5 | trait Reduce |
| main.rs:830:21:830:32 | ...::Output | main.rs:825:21:826:20 | type Output |
| main.rs:830:35:830:38 | Self | main.rs:823:5:831:5 | trait Reduce |
| main.rs:830:35:830:45 | ...::Error | main.rs:824:21:825:19 | type Error |
| main.rs:834:17:834:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData |
| main.rs:834:29:834:33 | Input | main.rs:833:19:833:23 | Input |
| main.rs:835:17:835:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData |
| main.rs:835:29:835:33 | Error | main.rs:833:26:833:30 | Error |
| main.rs:842:11:842:16 | Reduce | main.rs:823:5:831:5 | trait Reduce |
| main.rs:843:13:846:9 | MyImpl::<...> | main.rs:833:5:836:5 | struct MyImpl |
| main.rs:844:13:844:17 | Input | main.rs:840:13:840:17 | Input |
| main.rs:845:13:845:17 | Error | main.rs:841:13:841:17 | Error |
| main.rs:848:22:851:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result |
| main.rs:849:13:849:17 | Input | main.rs:840:13:840:17 | Input |
| main.rs:850:13:850:16 | Self | main.rs:833:5:836:5 | struct MyImpl |
| main.rs:850:13:850:23 | ...::Error | main.rs:852:11:856:9 | type Error |
| main.rs:853:22:855:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option |
| main.rs:854:11:854:15 | Error | main.rs:841:13:841:17 | Error |
| main.rs:858:13:858:17 | Input | main.rs:840:13:840:17 | Input |
| main.rs:863:19:863:22 | Self | main.rs:833:5:836:5 | struct MyImpl |
| main.rs:863:19:863:29 | ...::Input | main.rs:848:9:852:9 | type Input |
| main.rs:864:14:867:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result |
| main.rs:865:13:865:16 | Self | main.rs:833:5:836:5 | struct MyImpl |
| main.rs:865:13:865:24 | ...::Output | main.rs:856:11:859:9 | type Output |
| main.rs:866:13:866:16 | Self | main.rs:833:5:836:5 | struct MyImpl |
| main.rs:866:13:866:23 | ...::Error | main.rs:852:11:856:9 | type Error |
| main.rs:873:5:873:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
| main.rs:873:11:873:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
| main.rs:875:15:875:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
| main.rs:875:15:875:25 | ...::string | {EXTERNAL LOCATION} | mod string |
| main.rs:875:15:875:33 | ...::String | {EXTERNAL LOCATION} | struct String |
| main.rs:885:7:885:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
| main.rs:885:7:885:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity |
| main.rs:886:10:886:15 | ATrait | main.rs:881:5:883:5 | trait ATrait |
| main.rs:886:21:886:23 | i64 | {EXTERNAL LOCATION} | struct i64 |
| main.rs:888:11:888:13 | i64 | {EXTERNAL LOCATION} | struct i64 |
| main.rs:894:17:894:19 | Foo | main.rs:879:5:879:15 | struct Foo |
| main.rs:900:22:900:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option |
| main.rs:900:29:900:31 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:901:17:901:20 | Some | {EXTERNAL LOCATION} | Some |
| main.rs:902:17:902:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option |
| main.rs:902:24:902:26 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:903:13:903:16 | Some | {EXTERNAL LOCATION} | Some |
| main.rs:904:17:904:20 | None | {EXTERNAL LOCATION} | None |
| main.rs:906:13:906:16 | None | {EXTERNAL LOCATION} | None |
| main.rs:907:17:907:20 | None | {EXTERNAL LOCATION} | None |
| main.rs:916:19:916:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option |
| main.rs:916:26:916:28 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:917:26:917:29 | test | main.rs:899:5:913:5 | fn test |
| main.rs:923:14:923:16 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:928:17:928:20 | Some | {EXTERNAL LOCATION} | Some |
| main.rs:930:13:930:16 | Some | {EXTERNAL LOCATION} | Some |
| main.rs:935:13:935:16 | Some | {EXTERNAL LOCATION} | Some |
| main.rs:935:18:935:18 | z | main.rs:922:5:924:12 | Const |
| main.rs:935:24:935:24 | z | main.rs:922:5:924:12 | Const |
| main.rs:943:24:943:26 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:946:10:946:20 | TupleStruct | main.rs:943:5:943:28 | struct TupleStruct |
| main.rs:948:19:948:21 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:948:27:948:30 | Self | main.rs:943:5:943:28 | struct TupleStruct |
| main.rs:949:21:949:24 | Self | main.rs:943:5:943:28 | struct TupleStruct |
| main.rs:950:31:950:34 | Self | main.rs:943:5:943:28 | struct TupleStruct |
| main.rs:956:12:956:14 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:960:10:960:21 | StructStruct | main.rs:955:5:957:5 | struct StructStruct |
| main.rs:962:19:962:21 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:962:27:962:30 | Self | main.rs:955:5:957:5 | struct StructStruct |
| main.rs:963:13:963:16 | Self | main.rs:955:5:957:5 | struct StructStruct |
| main.rs:969:13:969:15 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:974:10:974:15 | MyEnum | main.rs:967:5:971:5 | enum MyEnum |
| main.rs:975:25:975:27 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:977:17:977:20 | Self | main.rs:967:5:971:5 | enum MyEnum |
| main.rs:977:17:977:23 | ...::A | main.rs:968:9:970:9 | A |
| main.rs:988:5:988:6 | my | main.rs:1:1:1:7 | mod my |
| main.rs:988:5:988:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
| main.rs:988:5:988:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
| main.rs:988:5:988:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
| main.rs:988:5:988:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
| main.rs:989:5:989:6 | my | main.rs:1:1:1:7 | mod my |
| main.rs:989:5:989:9 | ...::f | my.rs:5:1:7:1 | fn f |
| main.rs:990:5:990:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
| main.rs:990:5:990:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
| main.rs:990:5:990:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
| main.rs:990:5:990:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:991:5:991:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:992:5:992:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
| main.rs:993:5:993:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) |
| main.rs:993:5:993:12 | ...::h | main.rs:57:1:76:1 | fn h |
| main.rs:994:5:994:6 | m1 | main.rs:20:1:44:1 | mod m1 |
| main.rs:994:5:994:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 |
| main.rs:994:5:994:13 | ...::g | main.rs:30:9:34:9 | fn g |
| main.rs:995:5:995:6 | m1 | main.rs:20:1:44:1 | mod m1 |
| main.rs:995:5:995:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 |
| main.rs:995:5:995:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 |
| main.rs:995:5:995:17 | ...::h | main.rs:37:27:41:13 | fn h |
| main.rs:996:5:996:6 | m4 | main.rs:46:1:53:1 | mod m4 |
| main.rs:996:5:996:9 | ...::i | main.rs:49:5:52:5 | fn i |
| main.rs:997:5:997:5 | h | main.rs:57:1:76:1 | fn h |
| main.rs:998:5:998:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:999:5:999:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
| main.rs:1000:5:1000:5 | j | main.rs:104:1:108:1 | fn j |
| main.rs:1001:5:1001:6 | m6 | main.rs:116:1:128:1 | mod m6 |
| main.rs:1001:5:1001:9 | ...::g | main.rs:121:5:127:5 | fn g |
| main.rs:1002:5:1002:6 | m7 | main.rs:130:1:149:1 | mod m7 |
| main.rs:1002:5:1002:9 | ...::f | main.rs:141:5:148:5 | fn f |
| main.rs:1003:5:1003:6 | m8 | main.rs:151:1:205:1 | mod m8 |
| main.rs:1003:5:1003:9 | ...::g | main.rs:189:5:204:5 | fn g |
| main.rs:1004:5:1004:6 | m9 | main.rs:207:1:215:1 | mod m9 |
| main.rs:1004:5:1004:9 | ...::f | main.rs:210:5:214:5 | fn f |
| main.rs:1005:5:1005:7 | m11 | main.rs:238:1:275:1 | mod m11 |
| main.rs:1005:5:1005:10 | ...::f | main.rs:243:5:246:5 | fn f |
| main.rs:1006:5:1006:7 | m15 | main.rs:306:1:375:1 | mod m15 |
| main.rs:1006:5:1006:10 | ...::f | main.rs:362:5:374:5 | fn f |
| main.rs:1007:5:1007:7 | m16 | main.rs:377:1:574:1 | mod m16 |
| main.rs:1007:5:1007:10 | ...::f | main.rs:446:5:470:5 | fn f |
| main.rs:1008:5:1008:20 | trait_visibility | main.rs:576:1:626:1 | mod trait_visibility |
| main.rs:1008:5:1008:23 | ...::f | main.rs:603:5:625:5 | fn f |
| main.rs:1009:5:1009:7 | m17 | main.rs:628:1:658:1 | mod m17 |
| main.rs:1009:5:1009:10 | ...::f | main.rs:652:5:657:5 | fn f |
| main.rs:1010:5:1010:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
| main.rs:1010:5:1010:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
| main.rs:1011:5:1011:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
| main.rs:1011:5:1011:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
| main.rs:1012:5:1012:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 |
| main.rs:1012:5:1012:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
| main.rs:1013:5:1013:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
| main.rs:1014:5:1014:12 | my_alias | main.rs:1:1:1:7 | mod my |
| main.rs:1014:5:1014:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
| main.rs:1015:5:1015:7 | m18 | main.rs:660:1:678:1 | mod m18 |
| main.rs:1015:5:1015:12 | ...::m19 | main.rs:665:5:677:5 | mod m19 |
| main.rs:1015:5:1015:17 | ...::m20 | main.rs:670:9:676:9 | mod m20 |
| main.rs:1015:5:1015:20 | ...::g | main.rs:671:13:675:13 | fn g |
| main.rs:1016:5:1016:7 | m23 | main.rs:707:1:732:1 | mod m23 |
| main.rs:1016:5:1016:10 | ...::f | main.rs:727:5:731:5 | fn f |
| main.rs:1017:5:1017:7 | m24 | main.rs:734:1:802:1 | mod m24 |
| main.rs:1017:5:1017:10 | ...::f | main.rs:788:5:801:5 | fn f |
| main.rs:1018:5:1018:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) |
| main.rs:1018:5:1018:11 | ...::h | main.rs:57:1:76:1 | fn h |
| main.rs:1019:5:1019:13 | z_changed | main.rs:807:1:807:9 | fn z_changed |
| main.rs:1020:5:1020:11 | AStruct | main.rs:809:1:809:17 | struct AStruct |
| main.rs:1020:5:1020:22 | ...::z_on_type | main.rs:813:5:813:17 | fn z_on_type |
| main.rs:1021:5:1021:11 | AStruct | main.rs:809:1:809:17 | struct AStruct |
| main.rs:1022:5:1022:29 | impl_with_attribute_macro | main.rs:877:1:896:1 | mod impl_with_attribute_macro |
| main.rs:1022:5:1022:35 | ...::test | main.rs:892:5:895:5 | fn test |
| main.rs:1023:5:1023:12 | patterns | main.rs:898:1:939:1 | mod patterns |
| main.rs:1023:5:1023:18 | ...::test | main.rs:899:5:913:5 | fn test |
| main.rs:789:10:789:15 | TraitB | main.rs:746:5:748:5 | trait TraitB |
| main.rs:789:21:789:31 | Implementor | main.rs:779:5:779:23 | struct Implementor |
| main.rs:791:13:791:19 | println | {EXTERNAL LOCATION} | MacroRules |
| main.rs:797:24:797:34 | Implementor | main.rs:779:5:779:23 | struct Implementor |
| main.rs:798:23:798:35 | GenericStruct | main.rs:750:5:753:5 | struct GenericStruct |
| main.rs:804:9:804:36 | GenericStruct::<...> | main.rs:750:5:753:5 | struct GenericStruct |
| main.rs:804:9:804:50 | ...::call_trait_a | main.rs:761:9:763:9 | fn call_trait_a |
| main.rs:804:25:804:35 | Implementor | main.rs:779:5:779:23 | struct Implementor |
| main.rs:807:9:807:36 | GenericStruct::<...> | main.rs:750:5:753:5 | struct GenericStruct |
| main.rs:807:9:807:47 | ...::call_both | main.rs:773:9:776:9 | fn call_both |
| main.rs:807:25:807:35 | Implementor | main.rs:779:5:779:23 | struct Implementor |
| main.rs:813:3:813:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
| main.rs:813:3:813:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix |
| main.rs:817:6:817:12 | AStruct | main.rs:816:1:816:17 | struct AStruct |
| main.rs:819:7:819:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
| main.rs:819:7:819:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix |
| main.rs:822:7:822:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
| main.rs:822:7:822:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix |
| main.rs:827:9:827:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
| main.rs:827:9:827:19 | ...::marker | {EXTERNAL LOCATION} | mod marker |
| main.rs:827:9:827:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData |
| main.rs:828:9:828:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
| main.rs:828:9:828:19 | ...::result | {EXTERNAL LOCATION} | mod result |
| main.rs:828:9:828:27 | ...::Result | {EXTERNAL LOCATION} | enum Result |
| main.rs:836:19:836:22 | Self | main.rs:830:5:838:5 | trait Reduce |
| main.rs:836:19:836:29 | ...::Input | main.rs:831:9:831:19 | type Input |
| main.rs:837:14:837:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result |
| main.rs:837:21:837:24 | Self | main.rs:830:5:838:5 | trait Reduce |
| main.rs:837:21:837:32 | ...::Output | main.rs:832:21:833:20 | type Output |
| main.rs:837:35:837:38 | Self | main.rs:830:5:838:5 | trait Reduce |
| main.rs:837:35:837:45 | ...::Error | main.rs:831:21:832:19 | type Error |
| main.rs:841:17:841:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData |
| main.rs:841:29:841:33 | Input | main.rs:840:19:840:23 | Input |
| main.rs:842:17:842:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData |
| main.rs:842:29:842:33 | Error | main.rs:840:26:840:30 | Error |
| main.rs:849:11:849:16 | Reduce | main.rs:830:5:838:5 | trait Reduce |
| main.rs:850:13:853:9 | MyImpl::<...> | main.rs:840:5:843:5 | struct MyImpl |
| main.rs:851:13:851:17 | Input | main.rs:847:13:847:17 | Input |
| main.rs:852:13:852:17 | Error | main.rs:848:13:848:17 | Error |
| main.rs:855:22:858:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result |
| main.rs:856:13:856:17 | Input | main.rs:847:13:847:17 | Input |
| main.rs:857:13:857:16 | Self | main.rs:845:5:877:5 | impl Reduce for MyImpl::<...> { ... } |
| main.rs:857:13:857:23 | ...::Error | main.rs:859:11:863:9 | type Error |
| main.rs:860:22:862:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option |
| main.rs:861:11:861:15 | Error | main.rs:848:13:848:17 | Error |
| main.rs:865:13:865:17 | Input | main.rs:847:13:847:17 | Input |
| main.rs:870:19:870:22 | Self | main.rs:845:5:877:5 | impl Reduce for MyImpl::<...> { ... } |
| main.rs:870:19:870:29 | ...::Input | main.rs:855:9:859:9 | type Input |
| main.rs:871:14:874:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result |
| main.rs:872:13:872:16 | Self | main.rs:845:5:877:5 | impl Reduce for MyImpl::<...> { ... } |
| main.rs:872:13:872:24 | ...::Output | main.rs:863:11:866:9 | type Output |
| main.rs:873:13:873:16 | Self | main.rs:845:5:877:5 | impl Reduce for MyImpl::<...> { ... } |
| main.rs:873:13:873:23 | ...::Error | main.rs:859:11:863:9 | type Error |
| main.rs:885:16:885:20 | Super | main.rs:881:5:883:5 | trait Super |
| main.rs:887:19:887:22 | Self | main.rs:885:5:889:5 | trait Sub |
| main.rs:887:19:887:27 | ...::Out | main.rs:882:9:882:17 | type Out |
| main.rs:892:9:892:10 | ST | main.rs:891:14:891:15 | ST |
| main.rs:896:10:896:14 | Super | main.rs:881:5:883:5 | trait Super |
| main.rs:896:20:896:25 | S::<...> | main.rs:891:5:893:6 | struct S |
| main.rs:896:22:896:24 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:897:20:897:23 | char | {EXTERNAL LOCATION} | struct char |
| main.rs:902:10:902:14 | Super | main.rs:881:5:883:5 | trait Super |
| main.rs:902:20:902:26 | S::<...> | main.rs:891:5:893:6 | struct S |
| main.rs:902:22:902:25 | bool | {EXTERNAL LOCATION} | struct bool |
| main.rs:903:20:903:22 | i64 | {EXTERNAL LOCATION} | struct i64 |
| main.rs:908:10:908:12 | Sub | main.rs:885:5:889:5 | trait Sub |
| main.rs:908:18:908:23 | S::<...> | main.rs:891:5:893:6 | struct S |
| main.rs:908:20:908:22 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:909:19:909:22 | Self | main.rs:907:5:912:5 | impl Sub for S::<...> { ... } |
| main.rs:909:19:909:27 | ...::Out | main.rs:882:9:882:17 | type Out |
| main.rs:915:10:915:12 | Sub | main.rs:885:5:889:5 | trait Sub |
| main.rs:915:18:915:24 | S::<...> | main.rs:891:5:893:6 | struct S |
| main.rs:915:20:915:23 | bool | {EXTERNAL LOCATION} | struct bool |
| main.rs:916:19:916:22 | Self | main.rs:914:5:919:5 | impl Sub for S::<...> { ... } |
| main.rs:916:19:916:27 | ...::Out | main.rs:882:9:882:17 | type Out |
| main.rs:925:19:925:26 | SuperAlt | main.rs:921:5:923:5 | trait SuperAlt |
| main.rs:927:23:927:26 | Self | main.rs:925:5:929:5 | trait SubAlt |
| main.rs:927:23:927:31 | ...::Out | main.rs:922:9:922:17 | type Out |
| main.rs:932:13:932:20 | SuperAlt | main.rs:921:5:923:5 | trait SuperAlt |
| main.rs:932:26:932:29 | S::<...> | main.rs:891:5:893:6 | struct S |
| main.rs:932:28:932:28 | A | main.rs:932:10:932:10 | A |
| main.rs:933:20:933:20 | A | main.rs:932:10:932:10 | A |
| main.rs:938:13:938:18 | SubAlt | main.rs:925:5:929:5 | trait SubAlt |
| main.rs:938:24:938:27 | S::<...> | main.rs:891:5:893:6 | struct S |
| main.rs:938:26:938:26 | A | main.rs:938:10:938:10 | A |
| main.rs:939:23:939:26 | Self | main.rs:937:5:942:5 | impl SubAlt for S::<...> { ... } |
| main.rs:939:23:939:31 | ...::Out | main.rs:922:9:922:17 | type Out |
| main.rs:945:5:945:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
| main.rs:945:11:945:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
| main.rs:947:15:947:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
| main.rs:947:15:947:25 | ...::string | {EXTERNAL LOCATION} | mod string |
| main.rs:947:15:947:33 | ...::String | {EXTERNAL LOCATION} | struct String |
| main.rs:957:7:957:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
| main.rs:957:7:957:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity |
| main.rs:958:10:958:15 | ATrait | main.rs:953:5:955:5 | trait ATrait |
| main.rs:958:21:958:23 | i64 | {EXTERNAL LOCATION} | struct i64 |
| main.rs:960:11:960:13 | i64 | {EXTERNAL LOCATION} | struct i64 |
| main.rs:966:17:966:19 | Foo | main.rs:951:5:951:15 | struct Foo |
| main.rs:972:22:972:32 | Option::<...> | {EXTERNAL LOCATION} | enum Option |
| main.rs:972:29:972:31 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:973:17:973:20 | Some | {EXTERNAL LOCATION} | Some |
| main.rs:974:17:974:27 | Option::<...> | {EXTERNAL LOCATION} | enum Option |
| main.rs:974:24:974:26 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:975:13:975:16 | Some | {EXTERNAL LOCATION} | Some |
| main.rs:976:17:976:20 | None | {EXTERNAL LOCATION} | None |
| main.rs:978:13:978:16 | None | {EXTERNAL LOCATION} | None |
| main.rs:979:17:979:20 | None | {EXTERNAL LOCATION} | None |
| main.rs:988:19:988:29 | Option::<...> | {EXTERNAL LOCATION} | enum Option |
| main.rs:988:26:988:28 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:989:26:989:29 | test | main.rs:971:5:985:5 | fn test |
| main.rs:995:14:995:16 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:1000:17:1000:20 | Some | {EXTERNAL LOCATION} | Some |
| main.rs:1002:13:1002:16 | Some | {EXTERNAL LOCATION} | Some |
| main.rs:1007:13:1007:16 | Some | {EXTERNAL LOCATION} | Some |
| main.rs:1007:18:1007:18 | z | main.rs:994:5:996:12 | Const |
| main.rs:1007:24:1007:24 | z | main.rs:994:5:996:12 | Const |
| main.rs:1015:24:1015:26 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:1018:10:1018:20 | TupleStruct | main.rs:1015:5:1015:28 | struct TupleStruct |
| main.rs:1020:19:1020:21 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:1020:27:1020:30 | Self | main.rs:1015:5:1015:28 | struct TupleStruct |
| main.rs:1021:21:1021:24 | Self | main.rs:1015:5:1015:28 | struct TupleStruct |
| main.rs:1022:31:1022:34 | Self | main.rs:1015:5:1015:28 | struct TupleStruct |
| main.rs:1028:12:1028:14 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:1032:10:1032:21 | StructStruct | main.rs:1027:5:1029:5 | struct StructStruct |
| main.rs:1034:19:1034:21 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:1034:27:1034:30 | Self | main.rs:1027:5:1029:5 | struct StructStruct |
| main.rs:1035:13:1035:16 | Self | main.rs:1027:5:1029:5 | struct StructStruct |
| main.rs:1041:13:1041:15 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:1046:10:1046:15 | MyEnum | main.rs:1039:5:1043:5 | enum MyEnum |
| main.rs:1047:25:1047:27 | i32 | {EXTERNAL LOCATION} | struct i32 |
| main.rs:1049:17:1049:20 | Self | main.rs:1045:5:1056:5 | impl MyEnum { ... } |
| main.rs:1049:17:1049:23 | ...::A | main.rs:1040:9:1042:9 | A |
| main.rs:1060:5:1060:6 | my | main.rs:1:1:1:7 | mod my |
| main.rs:1060:5:1060:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
| main.rs:1060:5:1060:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
| main.rs:1060:5:1060:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
| main.rs:1060:5:1060:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
| main.rs:1061:5:1061:6 | my | main.rs:1:1:1:7 | mod my |
| main.rs:1061:5:1061:9 | ...::f | my.rs:5:1:7:1 | fn f |
| main.rs:1062:5:1062:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
| main.rs:1062:5:1062:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
| main.rs:1062:5:1062:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
| main.rs:1062:5:1062:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:1063:5:1063:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:1064:5:1064:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
| main.rs:1065:5:1065:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) |
| main.rs:1065:5:1065:12 | ...::h | main.rs:57:1:76:1 | fn h |
| main.rs:1066:5:1066:6 | m1 | main.rs:20:1:44:1 | mod m1 |
| main.rs:1066:5:1066:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 |
| main.rs:1066:5:1066:13 | ...::g | main.rs:30:9:34:9 | fn g |
| main.rs:1067:5:1067:6 | m1 | main.rs:20:1:44:1 | mod m1 |
| main.rs:1067:5:1067:10 | ...::m2 | main.rs:25:5:43:5 | mod m2 |
| main.rs:1067:5:1067:14 | ...::m3 | main.rs:36:9:42:9 | mod m3 |
| main.rs:1067:5:1067:17 | ...::h | main.rs:37:27:41:13 | fn h |
| main.rs:1068:5:1068:6 | m4 | main.rs:46:1:53:1 | mod m4 |
| main.rs:1068:5:1068:9 | ...::i | main.rs:49:5:52:5 | fn i |
| main.rs:1069:5:1069:5 | h | main.rs:57:1:76:1 | fn h |
| main.rs:1070:5:1070:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:1071:5:1071:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
| main.rs:1072:5:1072:5 | j | main.rs:104:1:108:1 | fn j |
| main.rs:1073:5:1073:6 | m6 | main.rs:116:1:128:1 | mod m6 |
| main.rs:1073:5:1073:9 | ...::g | main.rs:121:5:127:5 | fn g |
| main.rs:1074:5:1074:6 | m7 | main.rs:130:1:149:1 | mod m7 |
| main.rs:1074:5:1074:9 | ...::f | main.rs:141:5:148:5 | fn f |
| main.rs:1075:5:1075:6 | m8 | main.rs:151:1:205:1 | mod m8 |
| main.rs:1075:5:1075:9 | ...::g | main.rs:189:5:204:5 | fn g |
| main.rs:1076:5:1076:6 | m9 | main.rs:207:1:215:1 | mod m9 |
| main.rs:1076:5:1076:9 | ...::f | main.rs:210:5:214:5 | fn f |
| main.rs:1077:5:1077:7 | m11 | main.rs:238:1:275:1 | mod m11 |
| main.rs:1077:5:1077:10 | ...::f | main.rs:243:5:246:5 | fn f |
| main.rs:1078:5:1078:7 | m15 | main.rs:306:1:375:1 | mod m15 |
| main.rs:1078:5:1078:10 | ...::f | main.rs:362:5:374:5 | fn f |
| main.rs:1079:5:1079:7 | m16 | main.rs:377:1:574:1 | mod m16 |
| main.rs:1079:5:1079:10 | ...::f | main.rs:446:5:470:5 | fn f |
| main.rs:1080:5:1080:20 | trait_visibility | main.rs:576:1:633:1 | mod trait_visibility |
| main.rs:1080:5:1080:23 | ...::f | main.rs:603:5:632:5 | fn f |
| main.rs:1081:5:1081:7 | m17 | main.rs:635:1:665:1 | mod m17 |
| main.rs:1081:5:1081:10 | ...::f | main.rs:659:5:664:5 | fn f |
| main.rs:1082:5:1082:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
| main.rs:1082:5:1082:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
| main.rs:1083:5:1083:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
| main.rs:1083:5:1083:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
| main.rs:1084:5:1084:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 |
| main.rs:1084:5:1084:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
| main.rs:1085:5:1085:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
| main.rs:1086:5:1086:12 | my_alias | main.rs:1:1:1:7 | mod my |
| main.rs:1086:5:1086:22 | ...::nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
| main.rs:1087:5:1087:7 | m18 | main.rs:667:1:685:1 | mod m18 |
| main.rs:1087:5:1087:12 | ...::m19 | main.rs:672:5:684:5 | mod m19 |
| main.rs:1087:5:1087:17 | ...::m20 | main.rs:677:9:683:9 | mod m20 |
| main.rs:1087:5:1087:20 | ...::g | main.rs:678:13:682:13 | fn g |
| main.rs:1088:5:1088:7 | m23 | main.rs:714:1:739:1 | mod m23 |
| main.rs:1088:5:1088:10 | ...::f | main.rs:734:5:738:5 | fn f |
| main.rs:1089:5:1089:7 | m24 | main.rs:741:1:809:1 | mod m24 |
| main.rs:1089:5:1089:10 | ...::f | main.rs:795:5:808:5 | fn f |
| main.rs:1090:5:1090:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) |
| main.rs:1090:5:1090:11 | ...::h | main.rs:57:1:76:1 | fn h |
| main.rs:1091:5:1091:13 | z_changed | main.rs:814:1:814:9 | fn z_changed |
| main.rs:1092:5:1092:11 | AStruct | main.rs:816:1:816:17 | struct AStruct |
| main.rs:1092:5:1092:22 | ...::z_on_type | main.rs:820:5:820:17 | fn z_on_type |
| main.rs:1093:5:1093:11 | AStruct | main.rs:816:1:816:17 | struct AStruct |
| main.rs:1094:5:1094:29 | impl_with_attribute_macro | main.rs:949:1:968:1 | mod impl_with_attribute_macro |
| main.rs:1094:5:1094:35 | ...::test | main.rs:964:5:967:5 | fn test |
| main.rs:1095:5:1095:12 | patterns | main.rs:970:1:1011:1 | mod patterns |
| main.rs:1095:5:1095:18 | ...::test | main.rs:971:5:985:5 | fn test |
| my2/mod.rs:4:5:4:11 | println | {EXTERNAL LOCATION} | MacroRules |
| my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
| my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
@@ -592,7 +630,7 @@ resolvePath
| my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g |
| my2/my3/mod.rs:4:5:4:5 | h | main.rs:57:1:76:1 | fn h |
| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:25:34 | SourceFile |
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:1024:2 | SourceFile |
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:1096:2 | SourceFile |
| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:57:1:76:1 | fn h |
| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:25:34 | SourceFile |
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |

View File

@@ -0,0 +1,2 @@
nonUniqueCertainType
| associated_types.rs:232:9:234:9 | { ... } | |

View File

@@ -46,6 +46,15 @@ impl GetSet for S {
}
}
impl AnotherGet for S {
type AnotherOutput = bool;
// S::get_another
fn get_another(&self) -> Self::AnotherOutput {
true
}
}
impl<T: Copy> GetSet for Wrapper<T> {
type Output = T;
@@ -55,6 +64,24 @@ impl<T: Copy> GetSet for Wrapper<T> {
}
}
struct Odd<OddT>(OddT);
impl GetSet for Odd<i32> {
type Output = bool;
fn get(&self) -> Self::Output {
true
}
}
impl GetSet for Odd<bool> {
type Output = char;
fn get(&self) -> Self::Output {
'a'
}
}
mod default_method_using_associated_type {
use super::*;
@@ -110,7 +137,111 @@ mod default_method_using_associated_type {
}
}
// Tests for signatures that access associated types from type parameters
mod concrete_type_access_associated_type {
use super::*;
fn using_as(
a: <S as GetSet>::Output,
b: <Wrapper<i32> as GetSet>::Output,
c: <Odd<i32> as GetSet>::Output,
d: <Odd<bool> as GetSet>::Output,
) {
let _a = a; // $ type=_a:S3
let _b = b; // $ type=_b:i32
let _c = c; // $ type=_c:bool
let _d = d; // $ type=_d:char
}
// NOTE: The below seems like it should work, but is currently rejected by
// the Rust compiler. This behavior does not seem to be documented and
// there's an open issue about it:
// https://github.com/rust-lang/rust/issues/104119
// fn without_as(
// a: S::Output,
// b: Wrapper<i32>::Output,
// c: Odd<i32>::Output,
// d: Odd<bool>::Output,
// ) {
// let _a = a; // $ type=_a:S3
// let _b = b; // $ type=_b:i32
// let _c = c; // $ type=_c:bool
// let _d = d; // $ type=_d:char
// }
impl Odd<i32> {
// Odd<i32>::proj
fn proj(&self) -> <Self as GetSet>::Output {
let x = Default::default(); // $ target=default
x // $ type=x:bool
}
}
impl Odd<bool> {
// Odd<bool>::proj
fn proj(&self) -> <Self as GetSet>::Output {
let x = Default::default(); // $ target=default
x // $ type=x:char
}
}
pub fn test() {
using_as(S3, 1, true, 'a'); // $ target=using_as
let _a = Odd(42i32).proj(); // $ target=Odd<i32>::proj type=_a:bool
let _b = Odd(true).proj(); // $ target=Odd<bool>::proj type=_b:char
}
}
// Tests a `<Type as Trait>::Assoc` type mention where the `Trait` type mention
// contains a generic.
//
// In `convert` below the type of `<S as Trans<T>>::Output` depends on how
// `convert` is called and thus the correct type cannot be determined when the
// `TypeMention` is constructed.
mod concrete_type_as_generic_access_associated_type {
use super::*;
trait Trans<T> {
type Output;
fn through(t: T) -> Self::Output;
}
impl Trans<bool> for S {
type Output = i32;
fn through(t: bool) -> Self::Output {
if t {
1
} else {
0
}
}
}
impl Trans<i32> for S {
type Output = bool;
fn through(t: i32) -> Self::Output {
t != 0 // $ target=ne
}
}
impl S {
// S::convert
fn convert<T>(&self, t: T) -> <S as Trans<T>>::Output
where
Self: Trans<T>,
{
S::through(t)
}
}
pub fn test() {
let s = S;
let _a = s.convert(true); // $ target=S::convert type=_a:i32 SPURIOUS: bool
let _b = s.convert(42); // $ target=S::convert type=_b:bool SPURIOUS: i32
}
}
// Tests for signatures that access associated types on type parameters
mod type_param_access_associated_type {
use super::*;
@@ -122,9 +253,20 @@ mod type_param_access_associated_type {
thing.get() // $ target=GetSet::get
}
fn tp_assoc_from_supertrait<T: AnotherGet>(thing: T) -> (T::Output, T::AnotherOutput) {
(
thing.get(), // $ target=GetSet::get
thing.get_another(), // $ target=AnotherGet::get_another
)
}
pub fn test() {
let _o1 = tp_with_as(S); // $ target=tp_with_as MISSING: type=_o1:S3
let _o2 = tp_without_as(S); // $ target=tp_without_as MISSING: type=_o2:S3
let (
_o3, // $ MISSING: type=_o3:S3
_o4, // $ MISSING: type=_o4:bool
) = tp_assoc_from_supertrait(S); // $ target=tp_assoc_from_supertrait
}
}
@@ -173,7 +315,7 @@ mod equality_on_associated_type {
T: GetSet<Output = i32>,
{
let _a = x.get(); // $ type=_a:i32 target=GetSet::get
let _b = x.get2(); // $ target=AssocNameClash::get2 MISSING: type=_b:char
let _b = x.get2(); // $ target=AssocNameClash::get2 type=_b:char
}
}
@@ -293,6 +435,21 @@ mod associated_type_in_supertrait {
}
}
impl Subtrait for Odd<i32> {
// Odd<i32>::get_content
fn get_content(&self) -> Self::Output {
// let _x = Self::get(self);
Default::default() // $ target=default
}
}
impl Subtrait for Odd<bool> {
// Odd<bool>::get_content
fn get_content(&self) -> Self::Output {
Default::default() // $ target=default
}
}
fn get_content<T: Subtrait>(item: &T) -> T::Output {
item.get_content() // $ target=Subtrait::get_content
}
@@ -304,10 +461,13 @@ mod associated_type_in_supertrait {
pub fn test() {
let item1 = MyType(42i64);
let _content1 = item1.get_content(); // $ target=MyType::get_content MISSING: type=_content1:i64
let _content1 = item1.get_content(); // $ target=MyType::get_content type=_content1:i64
let item2 = MyType(true);
let _content2 = get_content(&item2); // $ target=get_content MISSING: type=_content2:bool
let _content3 = Odd(42i32).get_content(); // $ target=Odd<i32>::get_content type=_content3:bool
let _content4 = Odd(true).get_content(); // $ target=Odd<bool>::get_content type=_content4:char
}
}
@@ -356,6 +516,8 @@ mod dyn_trait {
pub fn test() {
default_method_using_associated_type::test(); // $ target=test
concrete_type_access_associated_type::test(); // $ target=test
concrete_type_as_generic_access_associated_type::test(); // $ target=test
type_param_access_associated_type::test(); // $ target=test
generic_associated_type::test(); // $ target=test
multiple_associated_types::test(); // $ target=test