Browse Source

Move unconditionally exporting Objective-C methods to the right location

Harold Brenes 4 tháng trước cách đây
mục cha
commit
6d18560ca3
2 tập tin đã thay đổi với 13 bổ sung18 xóa
  1. 13 1
      src/check_decl.cpp
  2. 0 17
      src/checker.cpp

+ 13 - 1
src/check_decl.cpp

@@ -1000,7 +1000,7 @@ gb_internal String handle_link_name(CheckerContext *ctx, Token token, String lin
 }
 
 
-gb_internal void check_objc_methods(CheckerContext *ctx, Entity *e, AttributeContext const &ac) {
+gb_internal void check_objc_methods(CheckerContext *ctx, Entity *e, AttributeContext &ac) {
 	if (!(ac.objc_name.len || ac.objc_is_class_method || ac.objc_type)) {
 		return;
 	}
@@ -1046,6 +1046,18 @@ gb_internal void check_objc_methods(CheckerContext *ctx, Entity *e, AttributeCon
 					} else if (proc.result_count > 1) {
 						error(e->token, "Objective-C method implementations may return at most 1 value");
 					} else {
+						// Always export unconditionally
+						// NOTE(harold): This means check_objc_methods() MUST be called before
+						//				 e->Procedure.is_export is set in check_proc_decl()!
+						if (ac.is_export) {
+							error(e->token, "Explicit export not allowed when @(objc_implement) is set. It set exported implicitly");
+						}
+						if (ac.link_name != "") {
+							error(e->token, "Explicit linkage not allowed when @(objc_implement) is set. It set to \"strong\" implicitly");
+						}
+
+						ac.is_export = true;
+						ac.linkage   = STR_LIT("strong");
 
 						auto method = ObjcMethodData{ ac, e };
 						method.ac.objc_selector = ac.objc_selector != "" ? ac.objc_selector : ac.objc_name;

+ 0 - 17
src/checker.cpp

@@ -3353,11 +3353,6 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) {
 		ac->test = true;
 		return true;
 	} else if (name == "export") {
-		if (ac->objc_is_implementation) { // TODO(harold): Remove from here, this needs to be checked after all attributes are set.
-			error(value, "Setting @(export) explicitly is not allowed when @(objc_implement) is set. It is exported implicitly.");
-			return false;
-		}
-
 		ExactValue ev = check_decl_attribute_value(c, value);
 		if (ev.kind == ExactValue_Invalid) {
 			ac->is_export = true;
@@ -3369,12 +3364,6 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) {
 		}
 		return true;
 	} else if (name == "linkage") {
-
-		if (ac->objc_is_implementation) {	// TODO(harold): Remove from here, this needs to be checked after all attributes are set.
-			error(value, "Explicit linkage not allowed when @(objc_implement) is set. It is set implicitly");
-			return false;
-		}
-
 		ExactValue ev = check_decl_attribute_value(c, value);
 		if (ev.kind != ExactValue_String) {
 			error(value, "Expected either a string 'linkage'");
@@ -3695,12 +3684,6 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) {
 			error(elem, "Expected a boolean value, or no value, for '%.*s'", LIT(name));
 		}
 
-		// This implies exported, strongly linked
-		if (ac->objc_is_implementation) {
-			ac->is_export = true;
-			ac->linkage   = str_lit("strong");
-		}
-
 		return true;
 	} else if (name == "objc_selector") {
 		ExactValue ev = check_decl_attribute_value(c, value);