aboutsummaryrefslogtreecommitdiff
path: root/src/formatter/args.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/formatter/args.c')
-rw-r--r--src/formatter/args.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/formatter/args.c b/src/formatter/args.c
new file mode 100644
index 00000000..9467c9fe
--- /dev/null
+++ b/src/formatter/args.c
@@ -0,0 +1,55 @@
+// Logic for formatting arguments and argument lists
+
+#include "../ast.h"
+#include "../stdlib/datatypes.h"
+#include "../stdlib/optionals.h"
+#include "../stdlib/text.h"
+#include "formatter.h"
+#include "types.h"
+
+OptionalText_t format_inline_arg(arg_ast_t *arg, Table_t comments) {
+ if (range_has_comment(arg->start, arg->end, comments)) return NONE_TEXT;
+ if (arg->name == NULL && arg->value) return must(format_inline_code(arg->value, comments));
+ Text_t code = Text$from_str(arg->name);
+ if (arg->type) code = Texts(code, ":", must(format_inline_type(arg->type, comments)));
+ if (arg->value) code = Texts(code, " = ", must(format_inline_code(arg->value, comments)));
+ return code;
+}
+
+Text_t format_arg(arg_ast_t *arg, Table_t comments, Text_t indent) {
+ OptionalText_t inline_arg = format_inline_arg(arg, comments);
+ if (inline_arg.length >= 0 && inline_arg.length <= MAX_WIDTH) return inline_arg;
+ if (arg->name == NULL && arg->value) return format_code(arg->value, comments, indent);
+ Text_t code = Text$from_str(arg->name);
+ if (arg->type) code = Texts(code, ":", format_type(arg->type, comments, indent));
+ if (arg->value) code = Texts(code, " = ", format_code(arg->value, comments, indent));
+ return code;
+}
+
+OptionalText_t format_inline_args(arg_ast_t *args, Table_t comments) {
+ Text_t code = EMPTY_TEXT;
+ for (; args; args = args->next) {
+ if (args->name && args->next && args->type == args->next->type && args->value == args->next->value) {
+ code = Texts(code, Text$from_str(args->name), ",");
+ } else {
+ code = Texts(code, must(format_inline_arg(args, comments)));
+ if (args->next) code = Texts(code, ", ");
+ }
+ if (args->next && range_has_comment(args->end, args->next->start, comments)) return NONE_TEXT;
+ }
+ return code;
+}
+
+Text_t format_args(arg_ast_t *args, Table_t comments, Text_t indent) {
+ OptionalText_t inline_args = format_inline_args(args, comments);
+ if (inline_args.length >= 0 && inline_args.length <= MAX_WIDTH) return inline_args;
+ Text_t code = EMPTY_TEXT;
+ for (; args; args = args->next) {
+ if (args->name && args->next && args->type == args->next->type && args->value == args->next->value) {
+ code = Texts(code, Text$from_str(args->name), ",");
+ } else {
+ add_line(&code, Texts(format_arg(args, comments, indent), ","), indent);
+ }
+ }
+ return code;
+}