Browse Source

Build tag to make all declarations within a file private to the package `//+private`

gingerBill 4 years ago
parent
commit
8f9111e552
4 changed files with 10 additions and 3 deletions
  1. 4 3
      src/check_expr.cpp
  2. 3 0
      src/entity.cpp
  3. 2 0
      src/parser.cpp
  4. 1 0
      src/parser.hpp

+ 4 - 3
src/check_expr.cpp

@@ -3503,9 +3503,10 @@ Entity *check_selector(CheckerContext *c, Operand *operand, Ast *node, Type *typ
 				gbString sel_str = expr_to_string(selector);
 				error(op_expr, "'%s' is not exported by '%.*s'", sel_str, LIT(import_name));
 				gb_string_free(sel_str);
-				operand->mode = Addressing_Invalid;
-				operand->expr = node;
-				return nullptr;
+				// NOTE(bill): make the state valid still, even if it's "invalid"
+				// operand->mode = Addressing_Invalid;
+				// operand->expr = node;
+				// return nullptr;
 			}
 
 			if (entity->kind == Entity_ProcGroup) {

+ 3 - 0
src/entity.cpp

@@ -199,6 +199,9 @@ bool is_entity_exported(Entity *e, bool allow_builtin = false) {
 	if (e->flags & EntityFlag_NotExported) {
 		return false;
 	}
+	if (e->file != nullptr && e->file->is_private) {
+		return false;
+	}
 
 	String name = e->token.string;
 	switch (name.len) {

+ 2 - 0
src/parser.cpp

@@ -5176,6 +5176,8 @@ bool parse_file(Parser *p, AstFile *f) {
 						if (!parse_build_tag(tok, lc)) {
 							return false;
 						}
+					} else if (lc == "+private") {
+						f->is_private = true;
 					}
 				}
 			}

+ 1 - 0
src/parser.hpp

@@ -109,6 +109,7 @@ struct AstFile {
 	f64            time_to_tokenize; // seconds
 	f64            time_to_parse;    // seconds
 
+	bool is_private;
 	bool is_test;
 
 	CommentGroup *lead_comment;     // Comment (block) before the decl