mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
Move unconditionally exporting Objective-C methods to the right location
This commit is contained in:
+13
-1
@@ -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)) {
|
if (!(ac.objc_name.len || ac.objc_is_class_method || ac.objc_type)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1046,6 +1046,18 @@ gb_internal void check_objc_methods(CheckerContext *ctx, Entity *e, AttributeCon
|
|||||||
} else if (proc.result_count > 1) {
|
} else if (proc.result_count > 1) {
|
||||||
error(e->token, "Objective-C method implementations may return at most 1 value");
|
error(e->token, "Objective-C method implementations may return at most 1 value");
|
||||||
} else {
|
} 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 };
|
auto method = ObjcMethodData{ ac, e };
|
||||||
method.ac.objc_selector = ac.objc_selector != "" ? ac.objc_selector : ac.objc_name;
|
method.ac.objc_selector = ac.objc_selector != "" ? ac.objc_selector : ac.objc_name;
|
||||||
|
|||||||
@@ -3353,11 +3353,6 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) {
|
|||||||
ac->test = true;
|
ac->test = true;
|
||||||
return true;
|
return true;
|
||||||
} else if (name == "export") {
|
} 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);
|
ExactValue ev = check_decl_attribute_value(c, value);
|
||||||
if (ev.kind == ExactValue_Invalid) {
|
if (ev.kind == ExactValue_Invalid) {
|
||||||
ac->is_export = true;
|
ac->is_export = true;
|
||||||
@@ -3369,12 +3364,6 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else if (name == "linkage") {
|
} 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);
|
ExactValue ev = check_decl_attribute_value(c, value);
|
||||||
if (ev.kind != ExactValue_String) {
|
if (ev.kind != ExactValue_String) {
|
||||||
error(value, "Expected either a string 'linkage'");
|
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));
|
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;
|
return true;
|
||||||
} else if (name == "objc_selector") {
|
} else if (name == "objc_selector") {
|
||||||
ExactValue ev = check_decl_attribute_value(c, value);
|
ExactValue ev = check_decl_attribute_value(c, value);
|
||||||
|
|||||||
Reference in New Issue
Block a user