From b4b2d9ceccf5131043cf7ab1815341ae3c485e13 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Wed, 28 Feb 2024 00:56:22 +0200 Subject: [PATCH] refactor: remove extern/const where possible --- cli/src/generate/render.rs | 14 +++++++++++--- cli/src/generate/templates/PARSER_NAME.h | 2 +- cli/src/generate/templates/py-binding.c | 4 ++-- cli/src/tests/detect_language.rs | 11 ++++++++--- docs/section-2-using-parsers.md | 8 ++++---- 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/cli/src/generate/render.rs b/cli/src/generate/render.rs index 33684e72..4578e3e7 100644 --- a/cli/src/generate/render.rs +++ b/cli/src/generate/render.rs @@ -263,7 +263,6 @@ impl Generator { fn add_pragmas(&mut self) { add_line!(self, "#if defined(__GNUC__) || defined(__clang__)"); - add_line!(self, "#pragma GCC diagnostic push"); add_line!( self, "#pragma GCC diagnostic ignored \"-Wmissing-field-initializers\"" @@ -1342,14 +1341,23 @@ impl Generator { add_line!(self, ""); } + add_line!(self, "#ifdef TS_PUBLIC"); + add_line!(self, "#undef TS_PUBLIC"); + add_line!(self, "#endif"); + add_line!(self, ""); add_line!(self, "#ifdef _WIN32"); - add_line!(self, "#define extern __declspec(dllexport)"); + add_line!(self, "#define TS_PUBLIC __declspec(dllexport)"); + add_line!(self, "#else"); + add_line!( + self, + "#define TS_PUBLIC __attribute__((visibility(\"default\")))" + ); add_line!(self, "#endif"); add_line!(self, ""); add_line!( self, - "extern const TSLanguage *{language_function_name}(void) {{", + "TS_PUBLIC const TSLanguage *{language_function_name}() {{", ); indent!(self); add_line!(self, "static const TSLanguage language = {{"); diff --git a/cli/src/generate/templates/PARSER_NAME.h b/cli/src/generate/templates/PARSER_NAME.h index 7150f82e..3dbbfd10 100644 --- a/cli/src/generate/templates/PARSER_NAME.h +++ b/cli/src/generate/templates/PARSER_NAME.h @@ -7,7 +7,7 @@ typedef struct TSLanguage TSLanguage; extern "C" { #endif -extern const TSLanguage *tree_sitter_PARSER_NAME(void); +const TSLanguage *tree_sitter_PARSER_NAME(void); #ifdef __cplusplus } diff --git a/cli/src/generate/templates/py-binding.c b/cli/src/generate/templates/py-binding.c index 5edbea71..e2fed9b3 100644 --- a/cli/src/generate/templates/py-binding.c +++ b/cli/src/generate/templates/py-binding.c @@ -2,10 +2,10 @@ typedef struct TSLanguage TSLanguage; -extern const TSLanguage *tree_sitter_LOWER_PARSER_NAME(void); +TSLanguage *tree_sitter_LOWER_PARSER_NAME(void); static PyObject* _binding_language(PyObject *self, PyObject *args) { - return PyLong_FromVoidPtr((void *)tree_sitter_LOWER_PARSER_NAME()); + return PyLong_FromVoidPtr(tree_sitter_LOWER_PARSER_NAME()); } static PyMethodDef methods[] = { diff --git a/cli/src/tests/detect_language.rs b/cli/src/tests/detect_language.rs index 6ff02d63..8bc79ff5 100644 --- a/cli/src/tests/detect_language.rs +++ b/cli/src/tests/detect_language.rs @@ -97,10 +97,15 @@ fn tree_sitter_dir(package_json: &str, name: &str) -> tempfile::TempDir { format!( r##" #include "tree_sitter/parser.h" - #ifdef _WIN32 - #define extern __declspec(dllexport) + #ifdef TS_PUBLIC + #undef TS_PUBLIC #endif - extern const TSLanguage *tree_sitter_{name}(void) {{}} + #ifdef _WIN32 + #define TS_PUBLIC __declspec(dllexport) + #else + #define TS_PUBLIC __attribute__((visibility("default"))) + #endif + TS_PUBLIC const TSLanguage *tree_sitter_{name}() {{}} "## ), ) diff --git a/docs/section-2-using-parsers.md b/docs/section-2-using-parsers.md index 51c2da3f..2b5e04b8 100644 --- a/docs/section-2-using-parsers.md +++ b/docs/section-2-using-parsers.md @@ -51,7 +51,7 @@ Here's an example of a simple C program that uses the Tree-sitter [JSON parser]( // Declare the `tree_sitter_json` function, which is // implemented by the `tree-sitter-json` library. -extern const TSLanguage *tree_sitter_json(); +const TSLanguage *tree_sitter_json(void); int main() { // Create a parser. @@ -326,9 +326,9 @@ Conceptually, it can be represented by three syntax trees with overlapping range #include // These functions are each implemented in their own repo. -extern const TSLanguage *tree_sitter_embedded_template(); -extern const TSLanguage *tree_sitter_html(); -extern const TSLanguage *tree_sitter_ruby(); +const TSLanguage *tree_sitter_embedded_template(void); +const TSLanguage *tree_sitter_html(void); +const TSLanguage *tree_sitter_ruby(void); int main(int argc, const char **argv) { const char *text = argv[1];