mirror of
https://github.com/odin-lang/Odin.git
synced 2026-04-20 21:35:19 +00:00
Allow for @indent for attributes that don't require any parameters; Add -ignore-unknown-attributes
This commit is contained in:
@@ -101,6 +101,7 @@ struct BuildContext {
|
||||
i32 optimization_level;
|
||||
bool show_timings;
|
||||
bool keep_temp_files;
|
||||
bool ignore_unknown_attributes;
|
||||
bool no_bounds_check;
|
||||
bool no_output_files;
|
||||
bool no_crt;
|
||||
|
||||
@@ -2150,7 +2150,9 @@ void check_decl_attributes(CheckerContext *c, Array<Ast *> const &attributes, De
|
||||
}
|
||||
|
||||
if (!proc(c, elem, name, value, ac)) {
|
||||
error(elem, "Unknown attribute element name '%.*s'", LIT(name));
|
||||
if (!build_context.ignore_unknown_attributes) {
|
||||
error(elem, "Unknown attribute element name '%.*s'", LIT(name));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -215,6 +215,7 @@ enum BuildFlagKind {
|
||||
BuildFlag_NoCRT,
|
||||
BuildFlag_UseLLD,
|
||||
BuildFlag_Vet,
|
||||
BuildFlag_IgnoreUnknownAttributes,
|
||||
|
||||
BuildFlag_COUNT,
|
||||
};
|
||||
@@ -258,6 +259,7 @@ bool parse_build_flags(Array<String> args) {
|
||||
add_flag(&build_flags, BuildFlag_NoCRT, str_lit("no-crt"), BuildFlagParam_None);
|
||||
add_flag(&build_flags, BuildFlag_UseLLD, str_lit("lld"), BuildFlagParam_None);
|
||||
add_flag(&build_flags, BuildFlag_Vet, str_lit("vet"), BuildFlagParam_None);
|
||||
add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("-ignore-unknown-attributes"), BuildFlagParam_None);
|
||||
|
||||
GB_ASSERT(args.count >= 3);
|
||||
Array<String> flag_args = array_slice(args, 3, args.count);
|
||||
@@ -569,6 +571,10 @@ bool parse_build_flags(Array<String> args) {
|
||||
case BuildFlag_Vet:
|
||||
build_context.vet = true;
|
||||
break;
|
||||
|
||||
case BuildFlag_IgnoreUnknownAttributes:
|
||||
build_context.ignore_unknown_attributes = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3650,30 +3650,38 @@ Ast *parse_foreign_decl(AstFile *f) {
|
||||
|
||||
Ast *parse_attribute(AstFile *f, Token token, TokenKind open_kind, TokenKind close_kind) {
|
||||
Array<Ast *> elems = {};
|
||||
Token open = expect_token(f, open_kind);
|
||||
f->expr_level++;
|
||||
if (f->curr_token.kind != close_kind) {
|
||||
elems = array_make<Ast *>(heap_allocator());
|
||||
while (f->curr_token.kind != close_kind &&
|
||||
f->curr_token.kind != Token_EOF) {
|
||||
Ast *elem = nullptr;
|
||||
elem = parse_ident(f);
|
||||
if (f->curr_token.kind == Token_Eq) {
|
||||
Token eq = expect_token(f, Token_Eq);
|
||||
Ast *value = parse_value(f);
|
||||
elem = ast_field_value(f, elem, value, eq);
|
||||
}
|
||||
Token open = {};
|
||||
Token close = {};
|
||||
|
||||
array_add(&elems, elem);
|
||||
if (f->curr_token.kind == Token_Ident) {
|
||||
elems = array_make<Ast *>(heap_allocator(), 0, 1);
|
||||
Ast *elem = parse_ident(f);
|
||||
array_add(&elems, elem);
|
||||
} else {
|
||||
open = expect_token(f, open_kind);
|
||||
f->expr_level++;
|
||||
if (f->curr_token.kind != close_kind) {
|
||||
elems = array_make<Ast *>(heap_allocator());
|
||||
while (f->curr_token.kind != close_kind &&
|
||||
f->curr_token.kind != Token_EOF) {
|
||||
Ast *elem = nullptr;
|
||||
elem = parse_ident(f);
|
||||
if (f->curr_token.kind == Token_Eq) {
|
||||
Token eq = expect_token(f, Token_Eq);
|
||||
Ast *value = parse_value(f);
|
||||
elem = ast_field_value(f, elem, value, eq);
|
||||
}
|
||||
|
||||
if (!allow_token(f, Token_Comma)) {
|
||||
break;
|
||||
array_add(&elems, elem);
|
||||
|
||||
if (!allow_token(f, Token_Comma)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
f->expr_level--;
|
||||
close = expect_closing(f, close_kind, str_lit("attribute"));
|
||||
}
|
||||
f->expr_level--;
|
||||
Token close = expect_closing(f, close_kind, str_lit("attribute"));
|
||||
|
||||
Ast *attribute = ast_attribute(f, token, open, close, elems);
|
||||
|
||||
Ast *decl = parse_stmt(f);
|
||||
|
||||
Reference in New Issue
Block a user