mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 21:20:11 +01:00
This is achieving a similar goal as #3849, using placeholders instead of an ambiguous start node to clarify structure and incrementally simplify checking. The benefit isn't quite as big here because both paths are structs, and so checking is more consistent than paren exprs versus tuples. But I think this removes the only other multi-purpose parse node. This uses StructLiteral/StructTypeLiteral naming, reflecting equivalent SemIR naming. Note, I would lean towards renaming StructLiteral to StructValueLiteral, but I think consistency in naming takes precedence. Any renames of StructLiteral might be better in a separate PR. StructFieldType/StructFieldValue -> StructTypeField/StructField is trying to making the reading more consistent with StructTypeLiteral/StructLiteral. SemIR has StructTypeField but not a value equivalent.
35 lines
2.0 KiB
Plaintext
35 lines
2.0 KiB
Plaintext
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
// Exceptions. See /LICENSE for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
// AUTOUPDATE
|
|
|
|
// CHECK:STDERR: fail_dot_string_colon.carbon:[[@LINE+3]]:10: ERROR: Expected identifier after `.`.
|
|
// CHECK:STDERR: var x: {."hello": i32, .y: i32} = {};
|
|
// CHECK:STDERR: ^~~~~~~
|
|
var x: {."hello": i32, .y: i32} = {};
|
|
|
|
// CHECK:STDOUT: - filename: fail_dot_string_colon.carbon
|
|
// CHECK:STDOUT: parse_tree: [
|
|
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
|
|
// CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'},
|
|
// CHECK:STDOUT: {kind: 'IdentifierName', text: 'x'},
|
|
// CHECK:STDOUT: {kind: 'StructTypeLiteralStart', text: '{'},
|
|
// CHECK:STDOUT: {kind: 'IdentifierName', text: '"hello"', has_error: yes},
|
|
// CHECK:STDOUT: {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
|
|
// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
|
|
// CHECK:STDOUT: {kind: 'InvalidParse', text: ':', has_error: yes},
|
|
// CHECK:STDOUT: {kind: 'StructComma', text: ','},
|
|
// CHECK:STDOUT: {kind: 'IdentifierName', text: 'y'},
|
|
// CHECK:STDOUT: {kind: 'StructFieldDesignator', text: '.', subtree_size: 2},
|
|
// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'},
|
|
// CHECK:STDOUT: {kind: 'StructTypeField', text: ':', subtree_size: 4},
|
|
// CHECK:STDOUT: {kind: 'StructTypeLiteral', text: '}', has_error: yes, subtree_size: 11},
|
|
// CHECK:STDOUT: {kind: 'BindingPattern', text: ':', subtree_size: 13},
|
|
// CHECK:STDOUT: {kind: 'VariableInitializer', text: '='},
|
|
// CHECK:STDOUT: {kind: 'StructLiteralStart', text: '{'},
|
|
// CHECK:STDOUT: {kind: 'StructLiteral', text: '}', subtree_size: 2},
|
|
// CHECK:STDOUT: {kind: 'VariableDecl', text: ';', subtree_size: 18},
|
|
// CHECK:STDOUT: {kind: 'FileEnd', text: ''},
|
|
// CHECK:STDOUT: ]
|