Merge branch 'odin-lang:master' into master

This commit is contained in:
Hyp-X
2022-08-01 14:44:57 +02:00
committed by GitHub
2 changed files with 56 additions and 58 deletions
+36 -1
View File
@@ -552,13 +552,20 @@ unparen_expr :: proc(expr: ^Expr) -> (val: ^Expr) {
return return
} }
Field_Flags :: distinct bit_set[Field_Flag]
Field_Flag :: enum { Field_Flag :: enum {
Invalid,
Unknown,
Ellipsis, Ellipsis,
Using, Using,
No_Alias, No_Alias,
C_Vararg, C_Vararg,
Auto_Cast, Auto_Cast,
Any_Int, Any_Int,
Subtype,
By_Ptr,
Results, Results,
Tags, Tags,
@@ -566,11 +573,38 @@ Field_Flag :: enum {
Typeid_Token, Typeid_Token,
} }
Field_Flags :: distinct bit_set[Field_Flag] field_flag_strings := [Field_Flag]string{
.Invalid = "",
.Unknown = "",
.Ellipsis = "..",
.Using = "using",
.No_Alias = "#no_alias",
.C_Vararg = "#c_vararg",
.Auto_Cast = "auto_cast",
.Any_Int = "#any_int",
.Subtype = "#subtype",
.By_Ptr = "#by_ptr",
.Results = "results",
.Tags = "field tag",
.Default_Parameters = "default parameters",
.Typeid_Token = "typeid",
}
field_hash_flag_strings := []struct{key: string, flag: Field_Flag}{
{"no_alias", .No_Alias},
{"c_vararg", .C_Vararg},
{"any_int", .Any_Int},
{"subtype", .Subtype},
{"by_ptr", .By_Ptr},
}
Field_Flags_Struct :: Field_Flags{ Field_Flags_Struct :: Field_Flags{
.Using, .Using,
.Tags, .Tags,
.Subtype,
} }
Field_Flags_Record_Poly_Params :: Field_Flags{ Field_Flags_Record_Poly_Params :: Field_Flags{
.Typeid_Token, .Typeid_Token,
@@ -583,6 +617,7 @@ Field_Flags_Signature :: Field_Flags{
.C_Vararg, .C_Vararg,
.Auto_Cast, .Auto_Cast,
.Any_Int, .Any_Int,
.By_Ptr,
.Default_Parameters, .Default_Parameters,
} }
+20 -57
View File
@@ -1611,20 +1611,6 @@ new_ast_field :: proc(names: []^ast.Expr, type: ^ast.Expr, default_value: ^ast.E
return field return field
} }
Field_Prefix :: enum {
Invalid,
Unknown,
Using,
No_Alias,
C_Vararg,
Auto_Cast,
Any_Int,
}
Field_Prefixes :: distinct bit_set[Field_Prefix]
Expr_And_Flags :: struct { Expr_And_Flags :: struct {
expr: ^ast.Expr, expr: ^ast.Expr,
flags: ast.Field_Flags, flags: ast.Field_Flags,
@@ -1666,7 +1652,7 @@ convert_to_ident_list :: proc(p: ^Parser, list: []Expr_And_Flags, ignore_flags,
return idents[:] return idents[:]
} }
is_token_field_prefix :: proc(p: ^Parser) -> Field_Prefix { is_token_field_prefix :: proc(p: ^Parser) -> ast.Field_Flag {
#partial switch p.curr_tok.kind { #partial switch p.curr_tok.kind {
case .EOF: case .EOF:
return .Invalid return .Invalid
@@ -1681,22 +1667,19 @@ is_token_field_prefix :: proc(p: ^Parser) -> Field_Prefix {
defer advance_token(p) defer advance_token(p)
#partial switch p.curr_tok.kind { #partial switch p.curr_tok.kind {
case .Ident: case .Ident:
switch p.curr_tok.text { for kf in ast.field_hash_flag_strings {
case "no_alias": if p.curr_tok.text == kf.key {
return .No_Alias return kf.flag
case "c_vararg": }
return .C_Vararg
case "any_int":
return .Any_Int
} }
} }
return .Unknown return .Unknown
} }
return .Invalid return .Unknown
} }
parse_field_prefixes :: proc(p: ^Parser) -> ast.Field_Flags { parse_field_prefixes :: proc(p: ^Parser) -> (flags: ast.Field_Flags) {
counts: [len(Field_Prefix)]int counts: [len(ast.Field_Flag)]int
for { for {
kind := is_token_field_prefix(p) kind := is_token_field_prefix(p)
@@ -1712,31 +1695,17 @@ parse_field_prefixes :: proc(p: ^Parser) -> ast.Field_Flags {
counts[kind] += 1 counts[kind] += 1
} }
flags: ast.Field_Flags for kind in ast.Field_Flag {
for kind in Field_Prefix {
count := counts[kind] count := counts[kind]
switch kind { if kind == .Invalid || kind == .Unknown {
case .Invalid, .Unknown: // Ignore // Ignore
case .Using: } else {
if count > 1 { error(p, p.curr_tok.pos, "multiple 'using' in this field list") } if count > 1 { error(p, p.curr_tok.pos, "multiple '%s' in this field list", ast.field_flag_strings[kind]) }
if count > 0 { flags += {.Using} } if count > 0 { flags += {kind} }
case .No_Alias:
if count > 1 { error(p, p.curr_tok.pos, "multiple '#no_alias' in this field list") }
if count > 0 { flags += {.No_Alias} }
case .C_Vararg:
if count > 1 { error(p, p.curr_tok.pos, "multiple '#c_vararg' in this field list") }
if count > 0 { flags += {.C_Vararg} }
case .Auto_Cast:
if count > 1 { error(p, p.curr_tok.pos, "multiple 'auto_cast' in this field list") }
if count > 0 { flags += {.Auto_Cast} }
case .Any_Int:
if count > 1 { error(p, p.curr_tok.pos, "multiple '#any_int' in this field list") }
if count > 0 { flags += {.Any_Int} }
} }
} }
return flags return
} }
check_field_flag_prefixes :: proc(p: ^Parser, name_count: int, allowed_flags, set_flags: ast.Field_Flags) -> (flags: ast.Field_Flags) { check_field_flag_prefixes :: proc(p: ^Parser, name_count: int, allowed_flags, set_flags: ast.Field_Flags) -> (flags: ast.Field_Flags) {
@@ -1748,19 +1717,13 @@ check_field_flag_prefixes :: proc(p: ^Parser, name_count: int, allowed_flags, se
for flag in ast.Field_Flag { for flag in ast.Field_Flag {
if flag not_in allowed_flags && flag in flags { if flag not_in allowed_flags && flag in flags {
switch flag { #partial switch flag {
case .Using: case .Unknown, .Invalid:
error(p, p.curr_tok.pos, "'using' is not allowed within this field list") // ignore
case .No_Alias:
error(p, p.curr_tok.pos, "'#no_alias' is not allowed within this field list")
case .C_Vararg:
error(p, p.curr_tok.pos, "'#c_vararg' is not allowed within this field list")
case .Auto_Cast:
error(p, p.curr_tok.pos, "'auto_cast' is not allowed within this field list")
case .Any_Int:
error(p, p.curr_tok.pos, "'#any_int' is not allowed within this field list")
case .Tags, .Ellipsis, .Results, .Default_Parameters, .Typeid_Token: case .Tags, .Ellipsis, .Results, .Default_Parameters, .Typeid_Token:
panic("Impossible prefixes") panic("Impossible prefixes")
case:
error(p, p.curr_tok.pos, "'%s' is not allowed within this field list", ast.field_flag_strings[flag])
} }
flags -= {flag} flags -= {flag}
} }