@@ -2064,37 +2064,75 @@ impl Local {
2064
2064
}
2065
2065
}
2066
2066
2067
+ // FIXME: Wrong name? This is could also be a registered attribute
2067
2068
#[ derive( Clone , Copy , Debug , PartialEq , Eq , Hash ) ]
2068
- pub struct BuiltinAttr ( usize ) ;
2069
+ pub struct BuiltinAttr {
2070
+ krate : Option < CrateId > ,
2071
+ idx : usize ,
2072
+ }
2069
2073
2070
2074
impl BuiltinAttr {
2071
- pub ( crate ) fn by_name ( name : & str ) -> Option < Self > {
2072
- // FIXME: def maps registered attrs?
2073
- hir_def:: builtin_attr:: find_builtin_attr_idx ( name) . map ( Self )
2075
+ // FIXME: consider crates\hir_def\src\nameres\attr_resolution.rs?
2076
+ pub ( crate ) fn by_name ( db : & dyn HirDatabase , krate : Crate , name : & str ) -> Option < Self > {
2077
+ if let builtin @ Some ( _) = Self :: builtin ( name) {
2078
+ return builtin;
2079
+ }
2080
+ let idx = db. crate_def_map ( krate. id ) . registered_attrs ( ) . iter ( ) . position ( |it| it == name) ?;
2081
+ Some ( BuiltinAttr { krate : Some ( krate. id ) , idx } )
2082
+ }
2083
+
2084
+ pub ( crate ) fn builtin ( name : & str ) -> Option < Self > {
2085
+ hir_def:: builtin_attr:: INERT_ATTRIBUTES
2086
+ . iter ( )
2087
+ . position ( |tool| tool. name == name)
2088
+ . map ( |idx| BuiltinAttr { krate : None , idx } )
2074
2089
}
2075
2090
2076
- pub fn name ( & self , _ : & dyn HirDatabase ) -> & str {
2091
+ pub fn name ( & self , db : & dyn HirDatabase ) -> SmolStr {
2077
2092
// FIXME: Return a `Name` here
2078
- hir_def:: builtin_attr:: INERT_ATTRIBUTES [ self . 0 ] . name
2093
+ match self . krate {
2094
+ Some ( krate) => db. crate_def_map ( krate) . registered_attrs ( ) [ self . idx ] . clone ( ) ,
2095
+ None => SmolStr :: new ( hir_def:: builtin_attr:: INERT_ATTRIBUTES [ self . idx ] . name ) ,
2096
+ }
2079
2097
}
2080
2098
2081
- pub fn template ( & self , _: & dyn HirDatabase ) -> AttributeTemplate {
2082
- hir_def:: builtin_attr:: INERT_ATTRIBUTES [ self . 0 ] . template
2099
+ pub fn template ( & self , _: & dyn HirDatabase ) -> Option < AttributeTemplate > {
2100
+ match self . krate {
2101
+ Some ( _) => None ,
2102
+ None => Some ( hir_def:: builtin_attr:: INERT_ATTRIBUTES [ self . idx ] . template ) ,
2103
+ }
2083
2104
}
2084
2105
}
2085
2106
2086
2107
#[ derive( Clone , Copy , Debug , PartialEq , Eq , Hash ) ]
2087
- pub struct ToolModule ( usize ) ;
2108
+ pub struct ToolModule {
2109
+ krate : Option < CrateId > ,
2110
+ idx : usize ,
2111
+ }
2088
2112
2089
2113
impl ToolModule {
2090
- pub ( crate ) fn by_name ( name : & str ) -> Option < Self > {
2091
- // FIXME: def maps registered tools
2092
- hir_def:: builtin_attr:: TOOL_MODULES . iter ( ) . position ( |& tool| tool == name) . map ( Self )
2114
+ // FIXME: consider crates\hir_def\src\nameres\attr_resolution.rs?
2115
+ pub ( crate ) fn by_name ( db : & dyn HirDatabase , krate : Crate , name : & str ) -> Option < Self > {
2116
+ if let builtin @ Some ( _) = Self :: builtin ( name) {
2117
+ return builtin;
2118
+ }
2119
+ let idx = db. crate_def_map ( krate. id ) . registered_tools ( ) . iter ( ) . position ( |it| it == name) ?;
2120
+ Some ( ToolModule { krate : Some ( krate. id ) , idx } )
2093
2121
}
2094
2122
2095
- pub fn name ( & self , _: & dyn HirDatabase ) -> & str {
2123
+ pub ( crate ) fn builtin ( name : & str ) -> Option < Self > {
2124
+ hir_def:: builtin_attr:: TOOL_MODULES
2125
+ . iter ( )
2126
+ . position ( |& tool| tool == name)
2127
+ . map ( |idx| ToolModule { krate : None , idx } )
2128
+ }
2129
+
2130
+ pub fn name ( & self , db : & dyn HirDatabase ) -> SmolStr {
2096
2131
// FIXME: Return a `Name` here
2097
- hir_def:: builtin_attr:: TOOL_MODULES [ self . 0 ]
2132
+ match self . krate {
2133
+ Some ( krate) => db. crate_def_map ( krate) . registered_tools ( ) [ self . idx ] . clone ( ) ,
2134
+ None => SmolStr :: new ( hir_def:: builtin_attr:: TOOL_MODULES [ self . idx ] ) ,
2135
+ }
2098
2136
}
2099
2137
}
2100
2138
0 commit comments