aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-05-28 20:59:06 +0100
committergingerBill <bill@gingerbill.org>2018-05-28 20:59:06 +0100
commit6eb505a6774ef1a801cd24e9adc75f1de738ca6e (patch)
tree1a5502efd7e605bc8c461596c00da8406e509a15 /src
parent619783ca1ba783d1248297127fa8e5d0a097d7ba (diff)
Comment based build tags for packages (basic and temporary)
Diffstat (limited to 'src')
-rw-r--r--src/build_settings.cpp1
-rw-r--r--src/checker.cpp14
-rw-r--r--src/parser.cpp88
-rw-r--r--src/parser.hpp1
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;