about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-13 22:59:58 +0200
committerBaitinq <[email protected]>2025-07-13 22:59:58 +0200
commita6def52cb5c696ae9e1ca6b825dac0f0971a412f (patch)
treef7fa36081149d24197e8ce056d7a895527e67198 /src
parentBoostrap: Increase arena capacity (diff)
downloadpry-lang-a6def52cb5c696ae9e1ca6b825dac0f0971a412f.tar.gz
pry-lang-a6def52cb5c696ae9e1ca6b825dac0f0971a412f.tar.bz2
pry-lang-a6def52cb5c696ae9e1ca6b825dac0f0971a412f.zip
Boostrap: Support newtype
Diffstat (limited to 'src')
-rw-r--r--src/bootstrap/parser.pry26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index cf3c233..cf5cabd 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -622,6 +622,28 @@ let parser_parse_function_parameters = (p: *parser) => *slice {
 	return s;
 };
 
+/* TypeDefinition ::= "newtype" Type */
+let parser_parse_type_definition = (p: *parser) => *Node {
+	if parser_accept_token(p, TOKEN_TYPE) == cast(*token, null) {
+		return cast(*Node, null);
+	};
+
+	let typ = parser_parse_type(p);
+	if typ == cast(*Node, null) {
+		return cast(*Node, null);
+	};
+
+	let d = cast(*NODE_TYPE_SIMPLE_TYPE_DATA, arena_alloc((*p).arena, sizeof(NODE_TYPE_SIMPLE_TYPE_DATA)));
+	(*d).name = "";
+	(*d).underlying_type = typ;
+
+	let r = Node{};
+	r.type = NODE_TYPE_SIMPLE_TYPE;
+	r.data = cast(*void, d);
+
+	return create_node(p, r);
+};
+
 /* StructDefinition ::= "struct" LBRACE StructFields? RBRACE */
 let parser_parse_struct_definition = (p: *parser) => *Node {
 	if parser_accept_token(p, TOKEN_STRUCT) == cast(*token, null) {
@@ -789,6 +811,10 @@ let parser_parse_primary_expression = (p: *parser) => *Node {
 	if stmt != cast(*Node, null) {
 		return stmt;
 	};
+	let stmt = parser_accept_parse(p, parser_parse_type_definition);
+	if stmt != cast(*Node, null) {
+		return stmt;
+	};
 	let stmt = parser_accept_parse(p, parser_parse_struct_definition);
 	if stmt != cast(*Node, null) {
 		return stmt;