toml: improve inline-table parsing (#12307)
							parent
							
								
									c526752419
								
							
						
					
					
						commit
						1b9eef74aa
					
				|  | @ -318,24 +318,38 @@ fn (p Parser) excerpt() string { | |||
| pub fn (mut p Parser) inline_table(mut tbl map[string]ast.Value) ? { | ||||
| 	util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'parsing inline table into ${ptr_str(tbl)}...') | ||||
| 
 | ||||
| 	mut previous_token_was_value := false | ||||
| 	for p.tok.kind != .eof { | ||||
| 		p.next() ? | ||||
| 		util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'parsing token "$p.tok.kind"') | ||||
| 		match p.tok.kind { | ||||
| 			.hash { | ||||
| 				// TODO table.comments << p.comment()
 | ||||
| 				c := p.comment() | ||||
| 				util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'skipping comment "$c.text"') | ||||
| 
 | ||||
| 		if previous_token_was_value { | ||||
| 			if p.tok.kind != .rcbr { | ||||
| 				p.expect(.comma) ? | ||||
| 			} | ||||
| 			previous_token_was_value = false | ||||
| 		} | ||||
| 
 | ||||
| 		match p.tok.kind { | ||||
| 			//.whitespace, .tab, .nl {
 | ||||
| 			//	util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'skipping "$p.tok.kind "$p.tok.lit"')
 | ||||
| 			//}
 | ||||
| 			.comma { | ||||
| 				if p.peek_tok.kind == .rcbr { | ||||
| 					p.next() ? // Forward to the peek_tok
 | ||||
| 					return error(@MOD + '.' + @STRUCT + '.' + @FN + | ||||
| 						' unexpected "$p.tok.kind" "$p.tok.lit" at this (excerpt): "...${p.excerpt()}..."') | ||||
| 				} | ||||
| 				if p.peek_tok.kind == .comma { | ||||
| 					p.next() ? // Forward to the peek_tok
 | ||||
| 					return error(@MOD + '.' + @STRUCT + '.' + @FN + | ||||
| 						' unexpected "$p.tok.kind" "$p.tok.lit" at this (excerpt): "...${p.excerpt()}..."') | ||||
| 				} | ||||
| 				util.printdbg(@MOD + '.' + @STRUCT + '.' + @FN, 'skipping comma table value seperator "$p.tok.lit"') | ||||
| 				continue | ||||
| 			} | ||||
| 			.rcbr { | ||||
| 				// ']' bracket
 | ||||
| 				// '}' bracket
 | ||||
| 				return | ||||
| 			} | ||||
| 			.bare, .quoted, .boolean, .number, .underscore { | ||||
|  | @ -359,23 +373,17 @@ pub fn (mut p Parser) inline_table(mut tbl map[string]ast.Value) ? { | |||
| 					return error(@MOD + '.' + @STRUCT + '.' + @FN + | ||||
| 						' dead end at "$p.tok.kind" "$p.tok.lit"') | ||||
| 				} | ||||
| 			} | ||||
| 			.lsbr { | ||||
| 				return error(@MOD + '.' + @STRUCT + '.' + @FN + | ||||
| 					' unexpected "$p.tok.kind" "$p.tok.lit" at this (excerpt): "...${p.excerpt()}..."') | ||||
| 			} | ||||
| 			.eof { | ||||
| 				return | ||||
| 				previous_token_was_value = true | ||||
| 			} | ||||
| 			else { | ||||
| 				return error(@MOD + '.' + @STRUCT + '.' + @FN + | ||||
| 					' could not parse $p.tok.kind ("$p.tok.lit") in this (excerpt): "...${p.excerpt()}..." token \n$p.tok') | ||||
| 					' unexpected "$p.tok.kind" "$p.tok.lit" at this (excerpt): "...${p.excerpt()}..."') | ||||
| 			} | ||||
| 		} | ||||
| 		if p.peek_tok.kind == .lsbr { | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 	// Make sure the inline-table actually use the return at .rcbr match branch.
 | ||||
| 	return error(@MOD + '.' + @STRUCT + '.' + @FN + | ||||
| 		' unexpected end of inline-table "$p.tok.kind" "$p.tok.lit" at this (excerpt): "...${p.excerpt()}..."') | ||||
| } | ||||
| 
 | ||||
| // array_of_tables parses next tokens into an array of `ast.Value`s.
 | ||||
|  |  | |||
|  | @ -38,14 +38,10 @@ const ( | |||
| 		'datetime/no-leads-with-milli.toml', | ||||
| 		'datetime/no-leads.toml', | ||||
| 		// Inline table
 | ||||
| 		'inline-table/empty.toml', | ||||
| 		'inline-table/double-comma.toml', | ||||
| 		'inline-table/trailing-comma.toml', | ||||
| 		'inline-table/linebreak-4.toml', | ||||
| 		'inline-table/linebreak-3.toml', | ||||
| 		'inline-table/linebreak-1.toml', | ||||
| 		'inline-table/linebreak-2.toml', | ||||
| 		'inline-table/no-comma.toml', | ||||
| 		// Key
 | ||||
| 		'key/duplicate.toml', | ||||
| 		'key/after-table.toml', | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue