@@ -340,21 +340,66 @@ impl GridLayout {
340340 numbering_type : & mut Option < RowColExpressionType > ,
341341 diag : & mut BuildDiagnostics ,
342342 ) {
343- let mut get_expr = |name : & str | {
344- let mut is_number_literal = false ;
345- let expr = item_element. borrow_mut ( ) . bindings . get ( name) . map ( |e| {
346- let expr = & e. borrow ( ) . expression ;
347- is_number_literal =
348- check_number_literal_is_positive_integer ( expr, name, & * e. borrow ( ) , diag) ;
349- expr. clone ( )
350- } ) ;
351- ( expr, is_number_literal)
343+ // Some compile-time checks
344+ {
345+ let mut check_expr = |name : & str | {
346+ let mut is_number_literal = false ;
347+ let expr = item_element. borrow_mut ( ) . bindings . get ( name) . map ( |e| {
348+ let expr = & e. borrow ( ) . expression ;
349+ is_number_literal =
350+ check_number_literal_is_positive_integer ( expr, name, & * e. borrow ( ) , diag) ;
351+ expr. clone ( )
352+ } ) ;
353+ ( expr, is_number_literal)
354+ } ;
355+
356+ let ( row_expr, row_is_number_literal) = check_expr ( "row" ) ;
357+ let ( col_expr, col_is_number_literal) = check_expr ( "col" ) ;
358+ check_expr ( "rowspan" ) ;
359+ check_expr ( "colspan" ) ;
360+
361+ let mut check_numbering_consistency =
362+ |expr_type : RowColExpressionType , prop_name : & str | {
363+ if !matches ! ( expr_type, RowColExpressionType :: Literal ) {
364+ if let Some ( current_numbering_type) = numbering_type {
365+ if * current_numbering_type != expr_type {
366+ let element_ref = item_element. borrow ( ) ;
367+ let span: & dyn Spanned =
368+ if let Some ( binding) = element_ref. bindings . get ( prop_name) {
369+ & * binding. borrow ( )
370+ } else {
371+ & * element_ref
372+ } ;
373+ diag. push_error (
374+ format ! ( "Cannot mix auto-numbering and runtime expressions for the '{prop_name}' property" ) ,
375+ span,
376+ ) ;
377+ }
378+ } else {
379+ // Store the first auto or runtime expression case we see
380+ * numbering_type = Some ( expr_type) ;
381+ }
382+ }
383+ } ;
384+
385+ let row_expr_type =
386+ RowColExpressionType :: from_option_expr ( & row_expr, row_is_number_literal) ;
387+ check_numbering_consistency ( row_expr_type, "row" ) ;
388+
389+ let col_expr_type =
390+ RowColExpressionType :: from_option_expr ( & col_expr, col_is_number_literal) ;
391+ check_numbering_consistency ( col_expr_type, "col" ) ;
392+ }
393+
394+ let propref_or_default = |name : & ' static str | -> Option < RowColExpr > {
395+ crate :: layout:: binding_reference ( item_element, & name) . map ( |nr| RowColExpr :: Named ( nr) )
352396 } ;
353397
354- let ( row_expr, row_is_number_literal) = get_expr ( "row" ) ;
355- let ( col_expr, col_is_number_literal) = get_expr ( "col" ) ;
356- let ( rowspan_expr, _) = get_expr ( "rowspan" ) ;
357- let ( colspan_expr, _) = get_expr ( "colspan" ) ;
398+ // MAX means "auto", see to_layout_data()
399+ let row_expr = propref_or_default ( "row" ) ;
400+ let col_expr = propref_or_default ( "col" ) ;
401+ let rowspan_expr = propref_or_default ( "rowspan" ) ;
402+ let colspan_expr = propref_or_default ( "colspan" ) ;
358403
359404 self . add_element_with_coord_as_expr (
360405 item_element,
@@ -366,32 +411,6 @@ impl GridLayout {
366411 organized_data_prop,
367412 diag,
368413 ) ;
369-
370- let mut check_numbering_consistency = |expr_type : RowColExpressionType , prop_name : & str | {
371- if !matches ! ( expr_type, RowColExpressionType :: Literal ) {
372- if let Some ( current_numbering_type) = numbering_type {
373- if * current_numbering_type != expr_type {
374- item_element. borrow_mut ( ) . bindings . get ( prop_name) . map ( |binding| {
375- diag. push_error (
376- format ! ( "Cannot mix auto-numbering and runtime expressions for the '{prop_name}' property" ) ,
377- & * binding. borrow ( ) ,
378- ) ;
379- } ) ;
380- }
381- } else {
382- // Store the first auto or runtime expression case we see
383- * numbering_type = Some ( expr_type) ;
384- }
385- }
386- } ;
387-
388- let row_expr_type =
389- RowColExpressionType :: from_option_expr ( & row_expr, row_is_number_literal) ;
390- check_numbering_consistency ( row_expr_type, "row" ) ;
391-
392- let col_expr_type =
393- RowColExpressionType :: from_option_expr ( & col_expr, col_is_number_literal) ;
394- check_numbering_consistency ( col_expr_type, "col" ) ;
395414 }
396415
397416 fn add_element_with_coord (
@@ -407,14 +426,8 @@ impl GridLayout {
407426 self . add_element_with_coord_as_expr (
408427 item_element,
409428 false , // new_row
410- (
411- & Some ( Expression :: NumberLiteral ( row as _ , Unit :: None ) ) ,
412- & Some ( Expression :: NumberLiteral ( col as _ , Unit :: None ) ) ,
413- ) ,
414- (
415- & Some ( Expression :: NumberLiteral ( rowspan as _ , Unit :: None ) ) ,
416- & Some ( Expression :: NumberLiteral ( colspan as _ , Unit :: None ) ) ,
417- ) ,
429+ ( & Some ( RowColExpr :: Literal ( row) ) , & Some ( RowColExpr :: Literal ( col) ) ) ,
430+ ( & Some ( RowColExpr :: Literal ( rowspan) ) , & Some ( RowColExpr :: Literal ( colspan) ) ) ,
418431 layout_cache_prop_h,
419432 layout_cache_prop_v,
420433 organized_data_prop,
@@ -426,8 +439,8 @@ impl GridLayout {
426439 & mut self ,
427440 item_element : & ElementRc ,
428441 new_row : bool ,
429- ( row_expr, col_expr) : ( & Option < Expression > , & Option < Expression > ) ,
430- ( rowspan_expr, colspan_expr) : ( & Option < Expression > , & Option < Expression > ) ,
442+ ( row_expr, col_expr) : ( & Option < RowColExpr > , & Option < RowColExpr > ) ,
443+ ( rowspan_expr, colspan_expr) : ( & Option < RowColExpr > , & Option < RowColExpr > ) ,
431444 layout_cache_prop_h : & NamedReference ,
432445 layout_cache_prop_v : & NamedReference ,
433446 organized_data_prop : & NamedReference ,
@@ -463,12 +476,20 @@ impl GridLayout {
463476 set_prop_from_cache ( e, "row" , organized_data_prop, org_index + 2 , & None , diag) ;
464477 }
465478
479+ let expr_or_default = |expr : & Option < RowColExpr > , default : u16 | -> RowColExpr {
480+ match expr {
481+ Some ( RowColExpr :: Literal ( v) ) => RowColExpr :: Literal ( * v) ,
482+ Some ( RowColExpr :: Named ( nr) ) => RowColExpr :: Named ( nr. clone ( ) ) ,
483+ None => RowColExpr :: Literal ( default) ,
484+ }
485+ } ;
486+
466487 self . elems . push ( GridLayoutElement {
467488 new_row,
468- col_expr : col_expr . clone ( ) ,
469- row_expr : row_expr . clone ( ) ,
470- colspan_expr : colspan_expr . clone ( ) ,
471- rowspan_expr : rowspan_expr . clone ( ) ,
489+ col_expr : expr_or_default ( col_expr , u16 :: MAX ) , // MAX means "auto"
490+ row_expr : expr_or_default ( row_expr , u16 :: MAX ) ,
491+ colspan_expr : expr_or_default ( colspan_expr , 1 ) ,
492+ rowspan_expr : expr_or_default ( rowspan_expr , 1 ) ,
472493 item : layout_item. item . clone ( ) ,
473494 } ) ;
474495 }
0 commit comments