From fc0030f343d5a9b0db3164155dc6591259c559d8 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Wed, 17 Mar 2021 11:44:20 -0600 Subject: [PATCH] Allow &meta and :Void to co-exist --- src/kiss/FieldForms.hx | 24 +++++++++++++++--------- src/kiss/Helpers.hx | 2 +- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/kiss/FieldForms.hx b/src/kiss/FieldForms.hx index 671d7ae..82513d2 100644 --- a/src/kiss/FieldForms.hx +++ b/src/kiss/FieldForms.hx @@ -66,15 +66,26 @@ class FieldForms { static function fieldName(formName:String, nameExp:ReaderExp) { return switch (nameExp.def) { - case Symbol(name) | TypedExp(_, {pos: _, def: Symbol(name)}): + case Symbol(name): name; - case MetaExp(_, nameExp): + case MetaExp(_, nameExp) | TypedExp(_, nameExp): fieldName(formName, nameExp); default: - throw CompileError.fromExp(nameExp, 'The first argument to $formName should be a variable name or typed variable name.'); + throw CompileError.fromExp(nameExp, 'The first argument to $formName should be a variable name, :Typed variable name, and/or &meta variable name.'); }; } + static function isVoid(nameExp:ReaderExp) { + return switch (nameExp.def) { + case MetaExp(_, nameExp): + isVoid(nameExp); + case TypedExp("Void", _) | Symbol("new"): + true; + default: + false; + } + } + static function varOrProperty(formName:String, wholeExp:ReaderExp, args:Array, k:KissState):Field { wholeExp.checkNumArgs(2, 3, '($formName [optional: &mut] [optional :type] [variable] [value])'); @@ -98,12 +109,7 @@ class FieldForms { var name = fieldName(formName, args[0]); var access = fieldAccess(formName, name, args[0]); - var returnsValue = switch (args[0].def) { - case TypedExp("Void", _): - false; - default: - true; - }; + var returnsValue = !isVoid(args[0]); return { name: name, diff --git a/src/kiss/Helpers.hx b/src/kiss/Helpers.hx index d51b9f0..f4df8c9 100644 --- a/src/kiss/Helpers.hx +++ b/src/kiss/Helpers.hx @@ -71,7 +71,7 @@ class Helpers { case Symbol(name) | TypedExp(_, {pos: _, def: Symbol(name)}): name; default: - throw CompileError.fromExp(name, 'function name should be a symbol or typed symbol'); + throw CompileError.fromExp(name, 'function name should be a symbol or :Typed symbol'); }; } else { "";