aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-05-30 21:53:23 +0100
committergingerBill <bill@gingerbill.org>2024-05-30 21:53:23 +0100
commit8db87170a9f491145cb10a69e52c6c2674efdf71 (patch)
tree377c101902bfb709522c4d9180d6a79d337f2918 /src
parentba1e9c8abe38edf833dbe89f1c22456d1a692072 (diff)
Clean up `handle_link_name` handling of `link_suffix`
Diffstat (limited to 'src')
-rw-r--r--src/check_decl.cpp25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/check_decl.cpp b/src/check_decl.cpp
index 44b06d712..f2afce59c 100644
--- a/src/check_decl.cpp
+++ b/src/check_decl.cpp
@@ -725,23 +725,42 @@ gb_internal Entity *init_entity_foreign_library(CheckerContext *ctx, Entity *e)
}
gb_internal String handle_link_name(CheckerContext *ctx, Token token, String link_name, String link_prefix, String link_suffix) {
+ String original_link_name = link_name;
if (link_prefix.len > 0) {
- if (link_name.len > 0) {
+ if (original_link_name.len > 0) {
error(token, "'link_name' and 'link_prefix' cannot be used together");
} else {
- isize len = link_prefix.len + token.string.len + link_suffix.len;
+ isize len = link_prefix.len + token.string.len;
u8 *name = gb_alloc_array(permanent_allocator(), u8, len+1);
gb_memmove(name, &link_prefix[0], link_prefix.len);
gb_memmove(name+link_prefix.len, &token.string[0], token.string.len);
- gb_memmove(name+link_prefix.len+token.string.len, link_suffix.text, link_suffix.len);
name[len] = 0;
link_name = make_string(name, len);
}
}
+
+ if (link_suffix.len > 0) {
+ if (original_link_name.len > 0) {
+ error(token, "'link_name' and 'link_suffix' cannot be used together");
+ } else {
+ String new_name = token.string;
+ if (link_name != original_link_name) {
+ new_name = link_name;
+ }
+
+ isize len = new_name.len + link_suffix.len;
+ u8 *name = gb_alloc_array(permanent_allocator(), u8, len+1);
+ gb_memmove(name, &new_name[0], new_name.len);
+ gb_memmove(name+new_name.len, &link_suffix[0], link_suffix.len);
+ name[len] = 0;
+ link_name = make_string(name, len);
+ }
+ }
return link_name;
}
+
gb_internal void check_objc_methods(CheckerContext *ctx, Entity *e, AttributeContext const &ac) {
if (!(ac.objc_name.len || ac.objc_is_class_method || ac.objc_type)) {
return;