(
&self,
d: D,
span: &Span,
qualified_var_name: SmolStr,
field_name: Option<SmolStr>,
type_: &Type,
variant: T,
)
| 114 | } |
| 115 | |
| 116 | fn qualify_field<T>( |
| 117 | &self, |
| 118 | d: D, |
| 119 | span: &Span, |
| 120 | qualified_var_name: SmolStr, |
| 121 | field_name: Option<SmolStr>, |
| 122 | type_: &Type, |
| 123 | variant: T, |
| 124 | ) -> Option<QualifiedName> |
| 125 | where |
| 126 | T: FnOnce(SmolStr, Type) -> QualifiedName, |
| 127 | { |
| 128 | match type_ { |
| 129 | Type::Value => match field_name { |
| 130 | None => Some(variant(qualified_var_name, type_.clone())), |
| 131 | Some(_) => { |
| 132 | d.report(DiagnosticKind::NotStruct, span); |
| 133 | None |
| 134 | } |
| 135 | }, |
| 136 | Type::Struct { |
| 137 | name: type_name, |
| 138 | span: type_span, |
| 139 | } => match field_name { |
| 140 | None => { |
| 141 | eprintln!("attempted to qualify field without field name: {qualified_var_name} with type: {type_}"); |
| 142 | None |
| 143 | } |
| 144 | Some(field_name) => { |
| 145 | let struct_ = self.get_struct(type_name)?; |
| 146 | if !struct_.fields.iter().any(|field| field.name == field_name) { |
| 147 | d.report( |
| 148 | DiagnosticKind::StructDoesNotHaveField { |
| 149 | type_name: type_name.clone(), |
| 150 | field_name: field_name.clone(), |
| 151 | }, |
| 152 | type_span, |
| 153 | ); |
| 154 | None |
| 155 | } else { |
| 156 | Some(variant( |
| 157 | qualify_struct_var_name(&field_name, &qualified_var_name), |
| 158 | type_.clone(), |
| 159 | )) |
| 160 | } |
| 161 | } |
| 162 | }, |
| 163 | } |
| 164 | } |
| 165 | |
| 166 | pub fn qualify_name(&self, d: D, name: &Name) -> Option<QualifiedName> { |
| 167 | let basename = name.basename(); |
no test coverage detected