@@ -15,7 +15,9 @@ use crate::parse::context;
1515use crate :: parse:: extensions:: simple:: common;
1616use crate :: parse:: extensions:: simple:: derivations;
1717use crate :: parse:: extensions:: simple:: modules;
18+ use crate :: util;
1819use std:: collections:: HashSet ;
20+ use std:: fmt:: Write ;
1921use std:: sync:: Arc ;
2022
2123/// Builder for type classes.
@@ -286,11 +288,6 @@ pub fn parse_type_class(
286288 y : & mut context:: Context ,
287289 z : & mut modules:: Builder ,
288290) -> Result < ( ) > {
289- let mut builder = Builder {
290- definition : Default :: default ( ) ,
291- analysis_context : derivations:: AnalysisContext :: new ( Some ( z) ) ,
292- } ;
293-
294291 // Parse name.
295292 let name = yaml_required_field ! (
296293 x,
@@ -307,6 +304,17 @@ pub fn parse_type_class(
307304 . expect_not_yet_defined ( y) ;
308305 }
309306
307+ // Make identifier and builder.
308+ let mut identifier = y. make_extension_id ( ) ;
309+ if let Some ( name) = & name {
310+ identifier. names . push ( name. to_string ( ) ) ;
311+ }
312+ identifier. uri = z. identifier . uri . clone ( ) ;
313+ let mut builder = Builder {
314+ definition : identifier. into ( ) ,
315+ analysis_context : derivations:: AnalysisContext :: new ( Some ( z) ) ,
316+ } ;
317+
310318 // Parse parameters.
311319 builder. definition . parameter_slots =
312320 yaml_repeated_field ! ( x, y, "parameters" , parse_parameter, 0 , & mut builder) ?
@@ -333,14 +341,63 @@ pub fn parse_type_class(
333341 // Parse structure.
334342 yaml_field ! ( x, y, "structure" , parse_structure, & mut builder) ?;
335343
344+ // Describe the type class.
345+ let mut description = if builder. definition . structure . is_none ( ) {
346+ if builder. definition . parameter_slots . is_empty ( ) {
347+ "Opaque simple"
348+ } else {
349+ "Opaque compound"
350+ }
351+ } else if builder. definition . parameter_slots . is_empty ( ) {
352+ "Simple"
353+ } else {
354+ "Compound"
355+ }
356+ . to_string ( ) ;
357+ write ! ( description, " type class declaration: " ) . unwrap ( ) ;
358+ if let Some ( name) = & name {
359+ write ! ( description, "{name}" ) . unwrap ( ) ;
360+ } else {
361+ write ! ( description, "!" ) . unwrap ( ) ;
362+ }
363+ if !builder. definition . parameter_slots . is_empty ( ) {
364+ let mut parameters = builder
365+ . definition
366+ . parameter_slots
367+ . iter ( )
368+ . map ( |slot| {
369+ let mut description = String :: new ( ) ;
370+ if !slot. name . is_empty ( ) {
371+ write ! (
372+ description,
373+ "{}: " ,
374+ util:: string:: as_ident_or_string( & slot. name)
375+ )
376+ . unwrap ( ) ;
377+ } ;
378+ if slot. optional {
379+ write ! ( description, "opt " ) . unwrap ( ) ;
380+ } ;
381+ if let meta:: pattern:: Value :: Intersection ( isec) = & slot. pattern {
382+ write ! ( description, "{}" , isec. last( ) . unwrap( ) ) . unwrap ( ) ;
383+ } else {
384+ write ! ( description, "{}" , slot. pattern) . unwrap ( ) ;
385+ } ;
386+ description
387+ } )
388+ . join ( ", " ) ;
389+ if builder. definition . parameters_variadic {
390+ write ! ( parameters, "..." ) . unwrap ( ) ;
391+ }
392+ write ! ( description, "<{parameters}>" ) . unwrap ( ) ;
393+ }
394+ describe ! ( y, Misc , "{description}" ) ;
395+
336396 // Register the type class.
337397 if let Some ( name) = name {
338398 z. type_classes
339399 . define_item ( name, Arc :: new ( builder. definition ) , true ) ;
340400 }
341401
342- // Describe the type class.
343- // TODO
344-
345402 Ok ( ( ) )
346403}
0 commit comments