parser/vfmt: handle array len and default in array init
							parent
							
								
									478ebed069
								
							
						
					
					
						commit
						33a9822548
					
				| 
						 | 
				
			
			@ -654,9 +654,11 @@ pub:
 | 
			
		|||
	has_val         bool
 | 
			
		||||
	mod             string
 | 
			
		||||
	len_expr        Expr
 | 
			
		||||
	cap_expr        Expr
 | 
			
		||||
	default_expr    Expr
 | 
			
		||||
	has_len         bool
 | 
			
		||||
	has_cap         bool
 | 
			
		||||
	cap_expr        Expr
 | 
			
		||||
	has_default     bool
 | 
			
		||||
pub mut:
 | 
			
		||||
	is_interface    bool // array of interfaces e.g. `[]Animal` `[Dog{}, Cat{}]`
 | 
			
		||||
	interface_types []table.Type // [Dog, Cat]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -970,18 +970,41 @@ fn (mut f Fmt) array_init(it ast.ArrayInit) {
 | 
			
		|||
			}
 | 
			
		||||
			f.write('map[${mk}]${mv}')
 | 
			
		||||
			f.write('{')
 | 
			
		||||
			if it.has_len {
 | 
			
		||||
				f.write('len: ')
 | 
			
		||||
				f.expr(it.len_expr)
 | 
			
		||||
			}
 | 
			
		||||
			if it.has_cap {
 | 
			
		||||
				f.write('cap: ')
 | 
			
		||||
				f.expr(it.cap_expr)
 | 
			
		||||
			}
 | 
			
		||||
			if it.has_default {
 | 
			
		||||
				f.write('default: ')
 | 
			
		||||
				f.expr(it.default_expr)
 | 
			
		||||
			}
 | 
			
		||||
			f.write('}')
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		f.write(f.type_to_str(it.typ))
 | 
			
		||||
		f.write('{')
 | 
			
		||||
		// TODO copypasta
 | 
			
		||||
		if it.has_len {
 | 
			
		||||
			f.write('len: ')
 | 
			
		||||
			f.expr(it.len_expr)
 | 
			
		||||
			if it.has_cap || it.has_default {
 | 
			
		||||
				f.write(', ')
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if it.has_cap {
 | 
			
		||||
			f.write('cap: ')
 | 
			
		||||
			f.expr(it.cap_expr)
 | 
			
		||||
			if it.has_default {
 | 
			
		||||
				f.write(', ')
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if it.has_default {
 | 
			
		||||
			f.write('default: ')
 | 
			
		||||
			f.expr(it.default_expr)
 | 
			
		||||
		}
 | 
			
		||||
		f.write('}')
 | 
			
		||||
		return
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,5 +9,6 @@ fn main() {
 | 
			
		|||
		make_flag('darwin', '-framework', 'Cocoa'),
 | 
			
		||||
		make_flag('windows', '-l', 'gdi32')
 | 
			
		||||
	]
 | 
			
		||||
	x := []int{len: 10, cap: 100, default: 1}
 | 
			
		||||
	_ := expected_flags
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,8 +72,10 @@ fn (mut p Parser) array_init() ast.ArrayInit {
 | 
			
		|||
	}
 | 
			
		||||
	mut has_len := false
 | 
			
		||||
	mut has_cap := false
 | 
			
		||||
	mut has_default := false
 | 
			
		||||
	mut len_expr := ast.Expr{}
 | 
			
		||||
	mut cap_expr := ast.Expr{}
 | 
			
		||||
	mut default_expr := ast.Expr{}
 | 
			
		||||
	if p.tok.kind == .lcbr && exprs.len == 0 {
 | 
			
		||||
		// `[]int{ len: 10, cap: 100}` syntax
 | 
			
		||||
		p.next()
 | 
			
		||||
| 
						 | 
				
			
			@ -90,7 +92,8 @@ fn (mut p Parser) array_init() ast.ArrayInit {
 | 
			
		|||
					cap_expr = p.expr(0)
 | 
			
		||||
				}
 | 
			
		||||
				'default' {
 | 
			
		||||
					p.expr(0)
 | 
			
		||||
					has_default = true
 | 
			
		||||
					default_expr = p.expr(0)
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					p.error('wrong field `$key`, expecting `len`, `cap`, or `default`')
 | 
			
		||||
| 
						 | 
				
			
			@ -118,7 +121,9 @@ fn (mut p Parser) array_init() ast.ArrayInit {
 | 
			
		|||
		has_len: has_len
 | 
			
		||||
		len_expr: len_expr
 | 
			
		||||
		has_cap: has_cap
 | 
			
		||||
		has_default: has_default
 | 
			
		||||
		cap_expr: cap_expr
 | 
			
		||||
		default_expr: default_expr
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue