From 197e7841401a3daec02cfddd0282eafc223a7c64 Mon Sep 17 00:00:00 2001 From: Jon Ross-Perkins Date: Mon, 24 Feb 2025 18:07:10 -0800 Subject: [PATCH] Add parsing for partial types (#5009) --- toolchain/check/handle_operator.cpp | 5 +++++ toolchain/parse/node_kind.def | 1 + toolchain/parse/precedence.cpp | 2 ++ .../parse/testdata/operators/prefix.carbon | 18 ++++++++++++++++++ 4 files changed, 26 insertions(+) diff --git a/toolchain/check/handle_operator.cpp b/toolchain/check/handle_operator.cpp index 403fbc3ab750..ada2c8c88293 100644 --- a/toolchain/check/handle_operator.cpp +++ b/toolchain/check/handle_operator.cpp @@ -300,6 +300,11 @@ auto HandleParseNode(Context& context, Parse::PrefixOperatorNotId node_id) return true; } +auto HandleParseNode(Context& context, Parse::PrefixOperatorPartialId node_id) + -> bool { + return context.TODO(node_id, "partial operator"); +} + auto HandleParseNode(Context& context, Parse::PrefixOperatorPlusPlusId node_id) -> bool { return HandleUnaryOperator(context, node_id, {"Inc"}); diff --git a/toolchain/parse/node_kind.def b/toolchain/parse/node_kind.def index 1ff2fc68d40c..bf54e99969a2 100644 --- a/toolchain/parse/node_kind.def +++ b/toolchain/parse/node_kind.def @@ -244,6 +244,7 @@ CARBON_PARSE_NODE_KIND_PREFIX_OPERATOR(Const) CARBON_PARSE_NODE_KIND_PREFIX_OPERATOR(Not) CARBON_PARSE_NODE_KIND_PREFIX_OPERATOR(Minus) CARBON_PARSE_NODE_KIND_PREFIX_OPERATOR(MinusMinus) +CARBON_PARSE_NODE_KIND_PREFIX_OPERATOR(Partial) CARBON_PARSE_NODE_KIND_PREFIX_OPERATOR(PlusPlus) CARBON_PARSE_NODE_KIND_PREFIX_OPERATOR(Star) diff --git a/toolchain/parse/precedence.cpp b/toolchain/parse/precedence.cpp index c81f0155d75d..7500232a5835 100644 --- a/toolchain/parse/precedence.cpp +++ b/toolchain/parse/precedence.cpp @@ -164,6 +164,7 @@ auto PrecedenceGroup::ForLeading(Lex::TokenKind kind) return PrecedenceGroup(If); case Lex::TokenKind::Const: + case Lex::TokenKind::Partial: return PrecedenceGroup(TypePrefix); default: @@ -243,6 +244,7 @@ auto PrecedenceGroup::ForTrailing(Lex::TokenKind kind, bool infix) case Lex::TokenKind::Const: case Lex::TokenKind::MinusMinus: case Lex::TokenKind::Not: + case Lex::TokenKind::Partial: case Lex::TokenKind::PlusPlus: break; diff --git a/toolchain/parse/testdata/operators/prefix.carbon b/toolchain/parse/testdata/operators/prefix.carbon index 29d1f295ba74..f3d372ba0646 100644 --- a/toolchain/parse/testdata/operators/prefix.carbon +++ b/toolchain/parse/testdata/operators/prefix.carbon @@ -11,6 +11,9 @@ var n: i8 = -n; var b: bool = not true; +var c: const bool; +var d: partial C*; + // CHECK:STDOUT: - filename: prefix.carbon // CHECK:STDOUT: parse_tree: [ // CHECK:STDOUT: {kind: 'FileStart', text: ''}, @@ -32,5 +35,20 @@ var b: bool = not true; // CHECK:STDOUT: {kind: 'BoolLiteralTrue', text: 'true'}, // CHECK:STDOUT: {kind: 'PrefixOperatorNot', text: 'not', subtree_size: 2}, // CHECK:STDOUT: {kind: 'VariableDecl', text: ';', subtree_size: 9}, +// CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', text: 'c'}, +// CHECK:STDOUT: {kind: 'BoolTypeLiteral', text: 'bool'}, +// CHECK:STDOUT: {kind: 'PrefixOperatorConst', text: 'const', subtree_size: 2}, +// CHECK:STDOUT: {kind: 'VarBindingPattern', text: ':', subtree_size: 4}, +// CHECK:STDOUT: {kind: 'VariablePattern', text: 'var', subtree_size: 5}, +// CHECK:STDOUT: {kind: 'VariableDecl', text: ';', subtree_size: 7}, +// CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, +// CHECK:STDOUT: {kind: 'IdentifierNameNotBeforeParams', text: 'd'}, +// CHECK:STDOUT: {kind: 'IdentifierNameExpr', text: 'C'}, +// CHECK:STDOUT: {kind: 'PrefixOperatorPartial', text: 'partial', subtree_size: 2}, +// CHECK:STDOUT: {kind: 'PostfixOperatorStar', text: '*', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'VarBindingPattern', text: ':', subtree_size: 5}, +// CHECK:STDOUT: {kind: 'VariablePattern', text: 'var', subtree_size: 6}, +// CHECK:STDOUT: {kind: 'VariableDecl', text: ';', subtree_size: 8}, // CHECK:STDOUT: {kind: 'FileEnd', text: ''}, // CHECK:STDOUT: ]