Browse Source

Add check to people trying to `foreign import` C files.

gingerBill 1 year ago
parent
commit
00344e1323
2 changed files with 23 additions and 0 deletions
  1. 16 0
      src/checker.cpp
  2. 7 0
      src/string.cpp

+ 16 - 0
src/checker.cpp

@@ -4806,6 +4806,22 @@ gb_internal void check_add_foreign_import_decl(CheckerContext *ctx, Ast *decl) {
 		return;
 	}
 
+	for (String const &path : fl->fullpaths) {
+		String ext = path_extension(path);
+		if (str_eq_ignore_case(ext, ".c") ||
+		    str_eq_ignore_case(ext, ".cpp") ||
+		    str_eq_ignore_case(ext, ".cxx") ||
+		    str_eq_ignore_case(ext, ".h") ||
+		    str_eq_ignore_case(ext, ".hpp") ||
+		    str_eq_ignore_case(ext, ".hxx") ||
+		    false
+		) {
+			error(fl->token, "With 'foreign import', you cannot import a %.*s file directory, you must precompile the library and link against that", LIT(ext));
+			break;
+		}
+	}
+
+
 	// if (fl->collection_name != "system") {
 	// 	char *c_str = gb_alloc_array(heap_allocator(), char, fullpath.len+1);
 	// 	defer (gb_free(heap_allocator(), c_str));

+ 7 - 0
src/string.cpp

@@ -104,6 +104,13 @@ gb_internal gb_inline bool str_eq_ignore_case(String const &a, String const &b)
 	return false;
 }
 
+template <isize N>
+gb_internal gb_inline bool str_eq_ignore_case(String const &a, char const (&b_)[N]) {
+	String b = {cast(u8 *)b_, N-1};
+	return str_eq_ignore_case(a, b);
+}
+
+
 gb_internal void string_to_lower(String *s) {
 	for (isize i = 0; i < s->len; i++) {
 		s->text[i] = gb_char_to_lower(s->text[i]);