@@ -208,55 +208,78 @@ impl<'a> AnalyzeContext<'a> {
208208 }
209209 }
210210
211- pub fn resolve_non_overloaded (
211+ pub fn resolve_non_overloaded_with_kind (
212212 & self ,
213213 named_entities : NamedEntities ,
214214 pos : & SrcPos ,
215215 kind_ok : & impl Fn ( & NamedEntityKind ) -> bool ,
216216 expected : & str ,
217217 ) -> AnalysisResult < Arc < NamedEntity > > {
218- match named_entities. into_non_overloaded ( ) {
219- Ok ( ent) => {
220- if kind_ok ( ent. actual_kind ( ) ) {
221- Ok ( ent)
222- } else {
223- let mut error = Diagnostic :: error (
224- pos,
225- format ! ( "Expected {}, got {}" , expected, ent. describe( ) ) ,
226- ) ;
227- if let Some ( decl_pos) = ent. decl_pos ( ) {
228- error. add_related ( decl_pos, "Defined here" ) ;
229- }
230- Err ( AnalysisError :: NotFatal ( error) )
231- }
232- }
233- Err ( overloaded) => {
234- let mut error =
235- Diagnostic :: error ( pos, format ! ( "Expected {}, got overloaded name" , expected) ) ;
236- for ent in overloaded. entities ( ) {
237- if let Some ( decl_pos) = ent. decl_pos ( ) {
238- error. add_related ( decl_pos, "Defined here" ) ;
239- }
218+ let ent = self . resolve_non_overloaded ( named_entities, pos, expected) ?;
219+ if kind_ok ( ent. actual_kind ( ) ) {
220+ Ok ( ent)
221+ } else {
222+ Err ( AnalysisError :: NotFatal ( ent. kind_error ( pos, expected) ) )
223+ }
224+ }
225+
226+ pub fn resolve_non_overloaded (
227+ & self ,
228+ named_entities : NamedEntities ,
229+ pos : & SrcPos ,
230+ expected : & str ,
231+ ) -> AnalysisResult < Arc < NamedEntity > > {
232+ named_entities. into_non_overloaded ( ) . map_err ( |overloaded| {
233+ let mut error =
234+ Diagnostic :: error ( pos, format ! ( "Expected {}, got overloaded name" , expected) ) ;
235+ for ent in overloaded. entities ( ) {
236+ if let Some ( decl_pos) = ent. decl_pos ( ) {
237+ error. add_related ( decl_pos, "Defined here" ) ;
240238 }
241- Err ( AnalysisError :: NotFatal ( error) )
242239 }
243- }
240+ AnalysisError :: NotFatal ( error)
241+ } )
244242 }
245243
246- pub fn resolve_type_mark (
244+ pub fn resolve_type_mark_name (
247245 & self ,
248246 region : & Region < ' _ > ,
249247 type_mark : & mut WithPos < SelectedName > ,
250248 ) -> AnalysisResult < Arc < NamedEntity > > {
251249 let entities = self . resolve_selected_name ( region, type_mark) ?;
252- self . resolve_non_overloaded (
250+ self . resolve_non_overloaded_with_kind (
253251 entities,
254252 type_mark. suffix_pos ( ) ,
255253 & NamedEntityKind :: is_type,
256254 "type" ,
257255 )
258256 }
259257
258+ pub fn resolve_type_mark (
259+ & self ,
260+ region : & Region < ' _ > ,
261+ type_mark : & mut WithPos < TypeMark > ,
262+ ) -> AnalysisResult < Arc < NamedEntity > > {
263+ if !type_mark. item . subtype {
264+ self . resolve_type_mark_name ( region, & mut type_mark. item . name )
265+ } else {
266+ let entities = self . resolve_selected_name ( region, & mut type_mark. item . name ) ?;
267+
268+ let pos = type_mark. item . name . suffix_pos ( ) ;
269+ let expected = "object or alias" ;
270+ let named_entity = self . resolve_non_overloaded ( entities, pos, expected) ?;
271+
272+ match named_entity. kind ( ) {
273+ NamedEntityKind :: Object ( obj) => Ok ( obj. subtype . type_mark ( ) . clone ( ) ) ,
274+ NamedEntityKind :: ObjectAlias { type_mark, .. } => Ok ( type_mark. clone ( ) ) ,
275+ NamedEntityKind :: ElementDeclaration ( subtype) => Ok ( subtype. type_mark ( ) . clone ( ) ) ,
276+ _ => Err ( AnalysisError :: NotFatal (
277+ named_entity. kind_error ( pos, expected) ,
278+ ) ) ,
279+ }
280+ }
281+ }
282+
260283 fn analyze_attribute_name (
261284 & self ,
262285 region : & Region < ' _ > ,
@@ -310,7 +333,7 @@ impl<'a> AnalyzeContext<'a> {
310333 ) -> FatalNullResult {
311334 match drange {
312335 DiscreteRange :: Discrete ( ref mut type_mark, ref mut range) => {
313- if let Err ( err) = self . resolve_type_mark ( region, type_mark) {
336+ if let Err ( err) = self . resolve_type_mark_name ( region, type_mark) {
314337 err. add_to ( diagnostics) ?;
315338 }
316339 if let Some ( ref mut range) = range {
@@ -438,28 +461,15 @@ impl<'a> AnalyzeContext<'a> {
438461 qexpr : & mut QualifiedExpression ,
439462 diagnostics : & mut dyn DiagnosticHandler ,
440463 ) -> FatalNullResult {
441- let QualifiedExpression { name, expr } = qexpr;
442- let entities = self . resolve_name ( region, & name. pos , & mut name. item , diagnostics) ?;
443-
444- if let Some ( entities) = entities {
445- match self . resolve_non_overloaded (
446- entities,
447- & name. pos ,
448- & NamedEntityKind :: is_type,
449- "type" ,
450- ) {
451- Ok ( target_type) => {
452- self . analyze_expression_with_target_type (
453- region,
454- & target_type,
455- expr,
456- diagnostics,
457- ) ?;
458- return Ok ( ( ) ) ;
459- }
460- Err ( err) => {
461- err. add_to ( diagnostics) ?;
462- }
464+ let QualifiedExpression { type_mark, expr } = qexpr;
465+
466+ match self . resolve_type_mark ( region, type_mark) {
467+ Ok ( target_type) => {
468+ self . analyze_expression_with_target_type ( region, & target_type, expr, diagnostics) ?;
469+ return Ok ( ( ) ) ;
470+ }
471+ Err ( e) => {
472+ e. add_to ( diagnostics) ?;
463473 }
464474 }
465475
@@ -963,6 +973,19 @@ fn ambiguous_overloaded_type(
963973 diagnostic
964974}
965975
976+ impl NamedEntity {
977+ fn kind_error ( & self , pos : & SrcPos , expected : & str ) -> Diagnostic {
978+ let mut error = Diagnostic :: error (
979+ pos,
980+ format ! ( "Expected {}, got {}" , expected, self . describe( ) ) ,
981+ ) ;
982+ if let Some ( decl_pos) = self . decl_pos ( ) {
983+ error. add_related ( decl_pos, "Defined here" ) ;
984+ }
985+ error
986+ }
987+ }
988+
966989fn overloaded_type_mismatch ( pos : & SrcPos , name : & Name , expected_type : & NamedEntity ) -> Diagnostic {
967990 Diagnostic :: error (
968991 pos,
0 commit comments