diff options
| author | gingerBill <bill@gingerbill.org> | 2018-05-28 20:59:06 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2018-05-28 20:59:06 +0100 |
| commit | 6eb505a6774ef1a801cd24e9adc75f1de738ca6e (patch) | |
| tree | 1a5502efd7e605bc8c461596c00da8406e509a15 /src | |
| parent | 619783ca1ba783d1248297127fa8e5d0a097d7ba (diff) | |
Comment based build tags for packages (basic and temporary)
Diffstat (limited to 'src')
| -rw-r--r-- | src/build_settings.cpp | 1 | ||||
| -rw-r--r-- | src/checker.cpp | 14 | ||||
| -rw-r--r-- | src/parser.cpp | 88 | ||||
| -rw-r--r-- | src/parser.hpp | 1 |
4 files changed, 91 insertions, 13 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp index acef0e667..36e59f1f3 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -121,6 +121,7 @@ bool is_excluded_target_filename(String name) { } + TargetOsKind os1 = get_target_os_from_string(str1); TargetArchKind arch1 = get_target_arch_from_string(str1); TargetOsKind os2 = get_target_os_from_string(str2); diff --git a/src/checker.cpp b/src/checker.cpp index 8aadb348c..e72d954ff 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -2263,23 +2263,23 @@ void check_all_global_entities(Checker *c) { continue; } - CheckerContext ctx = c->init_ctx; GB_ASSERT(d->scope->is_file); AstFile *file = d->scope->file; add_curr_ast_file(&ctx, file); - Scope *package_scope = file->pkg->scope; + AstPackage *pkg = file->pkg; + GB_ASSERT(ctx.pkg != nullptr); GB_ASSERT(e->pkg != nullptr); if (e->token.string == "main") { if (e->kind != Entity_Procedure) { - if (package_scope->is_init) { + if (pkg->kind == Package_Init) { error(e->token, "'main' is reserved as the entry point procedure in the initial scope"); continue; } - } else if (package_scope->is_global) { + } else if (pkg->kind == Package_Runtime) { error(e->token, "'main' is reserved as the entry point procedure in the initial scope"); continue; } @@ -2290,7 +2290,7 @@ void check_all_global_entities(Checker *c) { check_entity_decl(&ctx, e, d, nullptr); - if (!package_scope->is_global) { + if (pkg->kind != Package_Runtime) { processing_preload = false; } @@ -3033,7 +3033,7 @@ void check_proc_bodies(Checker *c) { } void check_parsed_files(Checker *c) { -#if 1 +#if 0 Timings timings = {}; timings_init(&timings, str_lit("check_parsed_files"), 16); defer ({ @@ -3046,7 +3046,6 @@ void check_parsed_files(Checker *c) { #endif TIME_SECTION("map full filepaths to scope"); - add_type_info_type(&c->init_ctx, t_invalid); // Map full filepaths to Scopes @@ -3146,6 +3145,7 @@ void check_parsed_files(Checker *c) { } } + TIME_SECTION("check for type cycles"); // NOTE(bill): Check for illegal cyclic type declarations for_array(i, c->info.definitions) { Entity *e = c->info.definitions[i]; diff --git a/src/parser.cpp b/src/parser.cpp index 16a4defa5..5331302a6 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1063,6 +1063,8 @@ Token consume_comment(AstFile *f, isize *end_line_) { end_line++; } } + } else { + end_line++; } if (end_line_) *end_line_ = end_line; @@ -1107,8 +1109,9 @@ void comsume_comment_groups(AstFile *f, Token prev) { while (f->curr_token.kind == Token_Comment) { comment = consume_comment_group(f, 1, &end_line); } - - if (end_line+1 == f->curr_token.pos.line) { + if (end_line < 0) { + f->lead_comment = comment; + } else if (end_line+1 == f->curr_token.pos.line) { f->lead_comment = comment; } @@ -4214,6 +4217,65 @@ void parse_setup_file_decls(Parser *p, AstFile *f, String base_dir, Array<AstNod } } +bool parse_build_tag(Token token_for_pos, String s) { + String const prefix = str_lit("+build"); + GB_ASSERT(string_starts_with(s, prefix)); + s = string_trim_whitespace(substring(s, prefix.len, s.len)); + + if (s.len == 0) { + return true; + } + + auto platforms = array_make<String>(heap_allocator()); + defer (array_free(&platforms)); + + isize n = 0; + while (n < s.len) { + Rune rune = 0; + isize width = gb_utf8_decode(&s[n], s.len, &rune); + if (rune_is_whitespace(rune)) { + String f = substring(s, 0, n); + array_add(&platforms, f); + s = substring(s, n+width, s.len); + n = 0; + continue; + } else if (n+width == s.len) { + String f = substring(s, 0, n+width); + array_add(&platforms, f); + break; + } + n += width; + } + + + bool any_correct = false; + for_array(i, platforms) { + String p = platforms[i]; + TargetOsKind os = get_target_os_from_string(p); + TargetArchKind arch = get_target_arch_from_string(p); + if (os != TargetOs_Invalid) { + GB_ASSERT(arch == TargetArch_Invalid); + any_correct = true; + if (os == build_context.target_os) { + return true; + } + } else if (arch != TargetArch_Invalid) { + any_correct = true; + if (arch == build_context.target_arch) { + return true; + } + } + if (os == TargetOs_Invalid && arch == TargetArch_Invalid) { + error(token_for_pos, "Invalid build tag platform: %.*s", LIT(p)); + } + } + if (any_correct) { + return false; + } + + return true; +} + bool parse_file(Parser *p, AstFile *f) { if (f->tokens.count == 0) { return true; @@ -4247,8 +4309,26 @@ bool parse_file(Parser *p, AstFile *f) { } f->package_name = package_name.string; + if (docs.list.count > 0) { + for_array(i, docs.list) { + Token tok = docs.list[i]; GB_ASSERT(tok.kind == Token_Comment); + String str = tok.string; + if (string_starts_with(str, str_lit("//"))) { + String lc = string_trim_whitespace(substring(str, 2, str.len)); + if (lc.len > 0 && lc[0] == '+') { + if (string_starts_with(lc, str_lit("+build"))) { + if (!parse_build_tag(tok, lc)) { + return false; + } + } + } + } + } + } + AstNode *pd = ast_package_decl(f, f->package_token, package_name, docs, f->line_comment); expect_semicolon(f, pd); + f->pkg_decl = pd; if (f->error_count > 0) { return false; @@ -4346,10 +4426,6 @@ GB_THREAD_PROC(parse_worker_file_proc) { return cast(isize)err; } -void add_shared_package(Parser *p, String name, TokenPos pos) { - -} - ParseFileError parse_packages(Parser *p, String init_filename) { GB_ASSERT(init_filename.text[init_filename.len] == 0); diff --git a/src/parser.hpp b/src/parser.hpp index 2f88240ce..f15aad756 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -52,6 +52,7 @@ struct AstFile { AstPackage * pkg; Scope * scope; + AstNode * pkg_decl; String fullpath; gbArena arena; Tokenizer tokenizer; |