diff options
| author | gingerBill <bill@gingerbill.org> | 2024-05-30 21:53:23 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2024-05-30 21:53:23 +0100 |
| commit | 8db87170a9f491145cb10a69e52c6c2674efdf71 (patch) | |
| tree | 377c101902bfb709522c4d9180d6a79d337f2918 /src | |
| parent | ba1e9c8abe38edf833dbe89f1c22456d1a692072 (diff) | |
Clean up `handle_link_name` handling of `link_suffix`
Diffstat (limited to 'src')
| -rw-r--r-- | src/check_decl.cpp | 25 |
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; |