From 6d8ebac6f894da4faebe9a727c749ace9cc89b7c Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Wed, 27 Sep 2023 09:59:26 +0200 Subject: [PATCH] feat: Infer variable type from its initial value closes #194 --- CHANGELOG.md | 1 + example.png | Bin 33414 -> 44166 bytes src/parser.zig | 175 +++++++++++++++++++++++++------ src/reporter.zig | 1 + src/token.zig | 2 + tests/065-inferred-var-type.buzz | 21 ++++ 6 files changed, 168 insertions(+), 32 deletions(-) create mode 100644 tests/065-inferred-var-type.buzz diff --git a/CHANGELOG.md b/CHANGELOG.md index 44de4754..72790f90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ - `map.sort`, `map.forEach`, `map.map`, `map.filter`, `map.reduce`, `map.diff`, `map.intersect`, `map.clone` - `list.clone` - Number literals can embed `_`: `1_000_000.300_245` +- Type can be inferred when declaring a variable/constant with the `var` or `const` keyword: `var something = "hello"` ## Changed diff --git a/example.png b/example.png index 7cc17b28c79ff353605eb9c641e0f1dd20c4b354..441fe1c1bace01efb777892e77f06677682f39ec 100644 GIT binary patch literal 44166 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 literal 33414 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 diff --git a/src/parser.zig b/src/parser.zig index b7aab24d..4b61cf40 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -429,6 +429,7 @@ pub const Parser = struct { .{ .prefix = null, .infix = null, .precedence = .None }, // any .{ .prefix = null, .infix = null, .precedence = .None }, // zdef .{ .prefix = typeOfExpression, .infix = null, .precedence = .Unary }, // typeof + .{ .prefix = null, .infix = null, .precedence = .None }, // var }; pub const ScriptImport = struct { @@ -1240,8 +1241,17 @@ pub const Parser = struct { try self.enumDeclaration() else if (!constant and try self.match(.Fun)) try self.funDeclaration() + else if (!constant and try self.match(.Var)) + try self.varDeclaration( + false, + null, + .Semicolon, + false, + true, + ) else if (try self.match(.Pat)) try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .Pattern }), .Semicolon, constant, @@ -1249,6 +1259,7 @@ pub const Parser = struct { ) else if (try self.match(.Ud)) try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .UserData }), .Semicolon, constant, @@ -1256,6 +1267,7 @@ pub const Parser = struct { ) else if (try self.match(.Str)) try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .String }), .Semicolon, constant, @@ -1263,6 +1275,7 @@ pub const Parser = struct { ) else if (try self.match(.Int)) try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .Integer }), .Semicolon, constant, @@ -1270,6 +1283,7 @@ pub const Parser = struct { ) else if (try self.match(.Float)) try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .Float }), .Semicolon, constant, @@ -1277,6 +1291,7 @@ pub const Parser = struct { ) else if (try self.match(.Bool)) try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .Bool }), .Semicolon, constant, @@ -1284,6 +1299,7 @@ pub const Parser = struct { ) else if (try self.match(.Type)) try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .Type }), .Semicolon, constant, @@ -1291,6 +1307,7 @@ pub const Parser = struct { ) else if (try self.match(.Any)) try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .def_type = .Any }), .Semicolon, constant, @@ -1298,6 +1315,7 @@ pub const Parser = struct { ) else if (self.parser.current_token != null and self.parser.current_token.?.token_type == .Identifier and self.parser.current_token.?.lexeme.len == 1 and self.parser.current_token.?.lexeme[0] == '_') try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .def_type = .Any }), .Semicolon, constant, @@ -1305,6 +1323,7 @@ pub const Parser = struct { ) else if (try self.match(.Fib)) try self.varDeclaration( + false, try self.parseFiberType(null), .Semicolon, constant, @@ -1312,6 +1331,7 @@ pub const Parser = struct { ) else if (try self.match(.Obj)) try self.varDeclaration( + false, try self.parseObjType(null), .Semicolon, constant, @@ -1325,6 +1345,7 @@ pub const Parser = struct { try self.testStatement() else if (try self.match(.Function)) try self.varDeclaration( + false, try self.parseFunctionType(null), .Semicolon, constant, @@ -1364,8 +1385,17 @@ pub const Parser = struct { // Things we can match with the first token if (!constant and try self.match(.Fun)) { return try self.funDeclaration(); + } else if (!constant and try self.match(.Var)) { + return try self.varDeclaration( + false, + null, + .Semicolon, + false, + true, + ); } else if (try self.match(.Str)) { return try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .String }), .Semicolon, constant, @@ -1373,6 +1403,7 @@ pub const Parser = struct { ); } else if (try self.match(.Pat)) { return try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .Pattern }), .Semicolon, constant, @@ -1380,6 +1411,7 @@ pub const Parser = struct { ); } else if (try self.match(.Ud)) { return try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .UserData }), .Semicolon, constant, @@ -1387,6 +1419,7 @@ pub const Parser = struct { ); } else if (try self.match(.Int)) { return try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .Integer }), .Semicolon, constant, @@ -1394,6 +1427,7 @@ pub const Parser = struct { ); } else if (try self.match(.Float)) { return try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .Float }), .Semicolon, constant, @@ -1401,6 +1435,7 @@ pub const Parser = struct { ); } else if (try self.match(.Bool)) { return try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .Bool }), .Semicolon, constant, @@ -1408,6 +1443,7 @@ pub const Parser = struct { ); } else if (try self.match(.Any)) { return try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .def_type = .Any }), .Semicolon, constant, @@ -1415,6 +1451,7 @@ pub const Parser = struct { ); } else if (self.parser.current_token != null and self.parser.current_token.?.token_type == .Identifier and self.parser.current_token.?.lexeme.len == 1 and self.parser.current_token.?.lexeme[0] == '_') { return try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .def_type = .Any }), .Semicolon, constant, @@ -1422,6 +1459,7 @@ pub const Parser = struct { ); } else if (try self.match(.Type)) { return try self.varDeclaration( + false, try self.gc.type_registry.getTypeDef(.{ .optional = try self.match(.Question), .def_type = .Type }), .Semicolon, constant, @@ -1429,6 +1467,7 @@ pub const Parser = struct { ); } else if (try self.match(.Fib)) { return try self.varDeclaration( + false, try self.parseFiberType(null), .Semicolon, constant, @@ -1436,6 +1475,7 @@ pub const Parser = struct { ); } else if (try self.match(.Obj)) { return try self.varDeclaration( + false, try self.parseObjType(null), .Semicolon, constant, @@ -1447,6 +1487,7 @@ pub const Parser = struct { return try self.mapDeclaration(constant); } else if (try self.match(.Function)) { return try self.varDeclaration( + false, try self.parseFunctionType(null), .Semicolon, constant, @@ -1471,8 +1512,15 @@ pub const Parser = struct { } } + // Its a const variable declaration with omitted type if (constant) { - self.reportError(.syntax, "`const` not allowed here."); + return try self.varDeclaration( + true, + null, + .Semicolon, + true, + true, + ); } return try self.statement(hanging, loop_scope); @@ -2000,6 +2048,7 @@ pub const Parser = struct { var casted_type: ?*ObjTypeDef = null; if (try self.match(.Arrow)) { _ = try self.parseVariable( + false, try condition.type_def.?.cloneNonOptional(&self.gc.type_registry), true, "Expected optional unwrap identifier", @@ -2011,6 +2060,7 @@ pub const Parser = struct { casted_type = try self.parseTypeDef(null); _ = try self.parseVariable( + false, try casted_type.?.toInstance(self.gc.allocator, &self.gc.type_registry), true, "Expected casted identifier", @@ -2061,7 +2111,17 @@ pub const Parser = struct { // Should be either VarDeclaration or expression var init_declarations = std.ArrayList(*VarDeclarationNode).init(self.gc.allocator); while (!self.check(.Semicolon) and !self.check(.Eof)) { - try init_declarations.append(VarDeclarationNode.cast(try self.varDeclaration(try self.parseTypeDef(null), .Nothing, false, true)).?); + try init_declarations.append( + VarDeclarationNode.cast( + try self.varDeclaration( + false, + try self.parseTypeDef(null), + .Nothing, + false, + true, + ), + ).?, + ); self.markInitialized(); @@ -2118,6 +2178,7 @@ pub const Parser = struct { self.beginScope(); var key: ?*ParseNode = try self.varDeclaration( + false, try self.parseTypeDef(null), .Nothing, false, @@ -2126,6 +2187,7 @@ pub const Parser = struct { var value: ?*ParseNode = if (try self.match(.Comma)) try self.varDeclaration( + false, try self.parseTypeDef(null), .Nothing, false, @@ -2312,6 +2374,7 @@ pub const Parser = struct { const type_def = try self.parseTypeDef(null); _ = try self.parseVariable( + false, try type_def.toInstance(self.gc.allocator, &self.gc.type_registry), true, // function arguments are constant "Expected error identifier", @@ -2376,10 +2439,25 @@ pub const Parser = struct { return &node.node; } - fn varDeclaration(self: *Self, parsed_type: *ObjTypeDef, terminator: DeclarationTerminator, constant: bool, can_assign: bool) !*ParseNode { - const var_type = try parsed_type.toInstance(self.gc.allocator, &self.gc.type_registry); + fn varDeclaration( + self: *Self, + identifier_consumed: bool, + parsed_type: ?*ObjTypeDef, + terminator: DeclarationTerminator, + constant: bool, + can_assign: bool, + ) !*ParseNode { + var var_type = if (parsed_type) |ptype| + try ptype.toInstance(self.gc.allocator, &self.gc.type_registry) + else + try self.gc.type_registry.getTypeDef(.{ .def_type = .Void }); - const slot: usize = try self.parseVariable(var_type, constant, "Expected variable name."); + const slot: usize = try self.parseVariable( + identifier_consumed, + var_type, + constant, + "Expected variable name.", + ); const name = self.parser.previous_token.?; const start_location = name; @@ -2390,6 +2468,17 @@ pub const Parser = struct { try PlaceholderDef.link(var_type, value.?.type_def.?, .Assignment); } + if (parsed_type == null and value != null and value.?.type_def != null) { + self.current.?.locals[slot].type_def = value.?.type_def.?; + var_type = value.?.type_def.?; + } else if (parsed_type == null) { + self.reporter.reportErrorAt( + .inferred_type, + start_location, + "Could not infer variable type.", + ); + } + var node = try self.gc.allocator.create(VarDeclarationNode); node.* = VarDeclarationNode{ .name = name, @@ -2404,6 +2493,10 @@ pub const Parser = struct { node.node.end_location = self.parser.previous_token.?; node.node.type_def = node.type_def; + if (terminator == .Semicolon and !self.check(.Semicolon)) { + unreachable; + } + switch (terminator) { .OptComma => _ = try self.match(.Comma), .Comma => try self.consume(.Comma, "Expected `,` after variable declaration."), @@ -2417,40 +2510,53 @@ pub const Parser = struct { } fn userVarDeclaration(self: *Self, _: bool, constant: bool) !*ParseNode { - var user_type_name: Token = self.parser.previous_token.?.clone(); var var_type: ?*ObjTypeDef = null; - // Search for a global with that name - if (try self.resolveGlobal(null, user_type_name)) |slot| { - var_type = self.globals.items[slot].type_def; - } + const inferred_declaration = self.check(.Equal) and constant; - // If none found, create a placeholder - if (var_type == null) { - var placeholder_resolved_type: ObjTypeDef.TypeUnion = .{ - // TODO: token is wrong but what else can we put here? - .Placeholder = PlaceholderDef.init(self.gc.allocator, user_type_name), - }; + // If next token is `=`, means the identifier wasn't a user type but the variable name + // and the type needs to be inferred + if (!inferred_declaration) { + var user_type_name: Token = self.parser.previous_token.?.clone(); - placeholder_resolved_type.Placeholder.name = try self.gc.copyString( - user_type_name.lexeme, - ); + // Search for a global with that name + if (try self.resolveGlobal(null, user_type_name)) |slot| { + var_type = self.globals.items[slot].type_def; + } - var_type = try self.gc.type_registry.getTypeDef( - .{ - .def_type = .Placeholder, - .resolved_type = placeholder_resolved_type, - }, - ); + // If none found, create a placeholder + if (var_type == null) { + var placeholder_resolved_type: ObjTypeDef.TypeUnion = .{ + // TODO: token is wrong but what else can we put here? + .Placeholder = PlaceholderDef.init(self.gc.allocator, user_type_name), + }; - _ = try self.declarePlaceholder(user_type_name, var_type); - } + placeholder_resolved_type.Placeholder.name = try self.gc.copyString( + user_type_name.lexeme, + ); + + var_type = try self.gc.type_registry.getTypeDef( + .{ + .def_type = .Placeholder, + .resolved_type = placeholder_resolved_type, + }, + ); + + _ = try self.declarePlaceholder(user_type_name, var_type); + } - if (try self.match(.Question)) { - var_type = try var_type.?.cloneOptional(&self.gc.type_registry); + if (try self.match(.Question)) { + var_type = try var_type.?.cloneOptional(&self.gc.type_registry); + } } - return try self.varDeclaration(var_type.?, .Semicolon, constant, true); + return try self.varDeclaration( + inferred_declaration, + var_type, + .Semicolon, + constant, + true, + ); } fn zdefStatement(self: *Self) anyerror!*ParseNode { @@ -2839,6 +2945,7 @@ pub const Parser = struct { } return try self.varDeclaration( + false, try self.parseListType(null), .Semicolon, constant, @@ -2876,6 +2983,7 @@ pub const Parser = struct { } return try self.varDeclaration( + false, try self.parseMapType(null), .Semicolon, constant, @@ -4847,6 +4955,7 @@ pub const Parser = struct { var param_type: *ObjTypeDef = try (try self.parseTypeDef(function_node.node.type_def.?.resolved_type.?.Function.generic_types)).toInstance(self.gc.allocator, &self.gc.type_registry); var slot: usize = try self.parseVariable( + false, param_type, true, // function arguments are constant "Expected parameter name", @@ -5763,8 +5872,10 @@ pub const Parser = struct { return try self.gc.type_registry.getTypeDef(object_type); } - fn parseVariable(self: *Self, variable_type: *ObjTypeDef, constant: bool, error_message: []const u8) !usize { - try self.consume(.Identifier, error_message); + fn parseVariable(self: *Self, identifier_consumed: bool, variable_type: *ObjTypeDef, constant: bool, error_message: []const u8) !usize { + if (!identifier_consumed) { + try self.consume(.Identifier, error_message); + } return try self.declareVariable(variable_type, null, constant, true); } diff --git a/src/reporter.zig b/src/reporter.zig index d4f89e66..26158efb 100644 --- a/src/reporter.zig +++ b/src/reporter.zig @@ -99,6 +99,7 @@ pub const Error = enum(u8) { gc = 87, discarded_value = 88, unused_argument = 89, + inferred_type = 90, }; // Inspired by https://github.com/zesterer/ariadne diff --git a/src/token.zig b/src/token.zig index c246bfbb..461d8b72 100644 --- a/src/token.zig +++ b/src/token.zig @@ -175,6 +175,7 @@ pub const TokenType = enum { Any, // any Zdef, // zdef TypeOf, // typeof + Var, // var }; pub const keywords = std.ComptimeStringMap( @@ -231,5 +232,6 @@ pub const keywords = std.ComptimeStringMap( .{ "zdef", .Zdef }, .{ "type", .Type }, .{ "typeof", .TypeOf }, + .{ "var", .Var }, }, ); diff --git a/tests/065-inferred-var-type.buzz b/tests/065-inferred-var-type.buzz new file mode 100644 index 00000000..1ee43df7 --- /dev/null +++ b/tests/065-inferred-var-type.buzz @@ -0,0 +1,21 @@ +import "std"; + +object Person { + str name = "Joe", +} + +var integer = 42; +const floating = 42.42; + +test "Inferring variable declaration type" { + assert(integer is int, message: "Could infer global variable declaration type"); + assert(floating is float, message: "Could infer global constant declaration type"); + + var string = "hello"; + + assert(string is str, message: "Could infer variable declaration type"); + + const person = Person{}; + + assert(person is Person, message: "Could infer constant declaration type"); +} \ No newline at end of file