Browse Source

Add `intrinsics.is_package_imported(<string>)`

gingerBill 4 years ago
parent
commit
a3a891a7f4
3 changed files with 31 additions and 2 deletions
  1. 3 0
      core/intrinsics/intrinsics.odin
  2. 23 0
      src/check_builtin.cpp
  3. 5 2
      src/checker_builtin_procs.hpp

+ 3 - 0
core/intrinsics/intrinsics.odin

@@ -2,6 +2,9 @@
 //+ignore
 package intrinsics
 
+// Package-Related
+is_package_imported :: proc(package_name: string) -> bool ---
+
 // Types
 simd_vector :: proc($N: int, $T: typeid) -> type/#simd[N]T
 soa_struct :: proc($N: int, $T: typeid) -> type/#soa[N]T

+ 23 - 0
src/check_builtin.cpp

@@ -1871,6 +1871,29 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
 		operand->type = alloc_type_simd_vector(count, elem);
 		break;
 	}
+	
+	case BuiltinProc_is_package_imported: {
+		bool value = false;
+
+		if (!is_type_string(operand->type) && (operand->mode != Addressing_Constant)) {
+			error(ce->args[0], "Expected a constant string for '%.*s'", LIT(builtin_name));
+		} else if (operand->value.kind == ExactValue_String) {
+			String pkg_name = operand->value.value_string;
+			// TODO(bill): probably should have this be a `StringMap` eventually
+			for_array(i, c->info->packages.entries) {
+				AstPackage *pkg = c->info->packages.entries[i].value;
+				if (pkg->name == pkg_name) {
+					value = true;
+					break;
+				}
+			}
+		}
+		
+		operand->mode = Addressing_Constant;
+		operand->type = t_untyped_bool;
+		operand->value = exact_value_bool(value);
+		break;
+	}
 
 	case BuiltinProc_soa_struct: {
 		Operand x = {};

+ 5 - 2
src/checker_builtin_procs.hpp

@@ -36,6 +36,8 @@ enum BuiltinProcId {
 	BuiltinProc_DIRECTIVE, // NOTE(bill): This is used for specialized hash-prefixed procedures
 
 	// "Intrinsics"
+	BuiltinProc_is_package_imported,
+	
 	BuiltinProc_simd_vector,
 	BuiltinProc_soa_struct,
 
@@ -230,7 +232,6 @@ BuiltinProc__type_simple_boolean_end,
 
 BuiltinProc__type_end,
 
-
 	BuiltinProc_COUNT,
 };
 gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
@@ -270,6 +271,8 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
 
 
 	// "Intrinsics"
+	{STR_LIT("is_package_imported"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
+		
 	{STR_LIT("simd_vector"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, // Type
 	{STR_LIT("soa_struct"),  2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, // Type
 
@@ -459,6 +462,6 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
 
 	{STR_LIT("type_equal_proc"),  1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 	{STR_LIT("type_hasher_proc"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
-
+	
 	{STR_LIT(""), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
 };