(load [file])

This commit is contained in:
2020-12-09 19:04:11 -07:00
parent a980f879e7
commit 046798768f

View File

@@ -4,6 +4,7 @@ package kiss;
import haxe.Exception; import haxe.Exception;
import haxe.macro.Context; import haxe.macro.Context;
import haxe.macro.Expr; import haxe.macro.Expr;
import haxe.io.Path;
import kiss.Stream; import kiss.Stream;
import kiss.Reader; import kiss.Reader;
import kiss.FieldForms; import kiss.FieldForms;
@@ -58,6 +59,8 @@ class Kiss {
try { try {
var classFields = Context.getBuildFields(); var classFields = Context.getBuildFields();
var stream = new Stream(kissFile); var stream = new Stream(kissFile);
// (load... ) relative to the original file
var loadingDirectory = Path.directory(kissFile);
if (k == null) if (k == null)
k = defaultKissState(); k = defaultKissState();
@@ -66,17 +69,27 @@ class Kiss {
#if test #if test
Sys.println(nextExp.def.toString()); Sys.println(nextExp.def.toString());
#end #end
var field = readerExpToField(nextExp, k); switch (nextExp.def) {
if (field != null) { // (load... ) is the specialest of forms because it calls build() again and those fields need to be merged
#if test case CallExp({pos: _, def: Symbol("load")}, [{pos: _, def: StrExp(otherKissFile)}]):
switch (field.kind) { var filePath = Path.join([loadingDirectory, otherKissFile]);
case FVar(_, expr) | FFun({ret: _, args: _, expr: expr}): var loadedFields = Kiss.build(filePath, k);
Sys.println(expr.toString()); for (field in loadedFields) {
default: classFields.push(field);
throw CompileError.fromExp(nextExp, 'cannot print the expression of generated field $field'); }
} default:
#end var field = readerExpToField(nextExp, k);
classFields.push(field); if (field != null) {
#if test
switch (field.kind) {
case FVar(_, expr) | FFun({ret: _, args: _, expr: expr}):
Sys.println(expr.toString());
default:
throw CompileError.fromExp(nextExp, 'cannot print the expression of generated field $field');
}
#end
classFields.push(field);
}
} }
}); });
@@ -128,12 +141,6 @@ class Kiss {
specialForms[specialForm](exp, args, k); specialForms[specialForm](exp, args, k);
case CallExp(func, args): case CallExp(func, args):
ECall(convert(func), [for (argExp in args) convert(argExp)]).withMacroPosOf(exp); ECall(convert(func), [for (argExp in args) convert(argExp)]).withMacroPosOf(exp);
/*
// Typed expressions in the wild become casts:
case TypedExp(type, innerExp):
ECast(convert(innerExp), if (type.length > 0) Helpers.parseComplexType(type, exp) else null).withMacroPosOf(wholeExp);
*/
case ListExp(elements): case ListExp(elements):
var isMap = false; var isMap = false;
var arrayDecl = EArrayDecl([ var arrayDecl = EArrayDecl([