Explorar o código

Add parsing for partial types (#5009)

Jon Ross-Perkins hai 1 ano
pai
achega
197e784140

+ 5 - 0
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"});

+ 1 - 0
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)
 

+ 2 - 0
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;
 

+ 18 - 0
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:   ]