kiss insertion

This commit is contained in:
2022-06-08 01:36:36 +00:00
parent 7679517e85
commit e051d312b0
3 changed files with 49 additions and 4 deletions

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.macro.ExprTools;
import haxe.io.Path; import haxe.io.Path;
import kiss.Stream; import kiss.Stream;
import kiss.Reader; import kiss.Reader;
@@ -56,8 +57,10 @@ typedef KissState = {
collectedBlocks:Map<String, Array<ReaderExp>>, collectedBlocks:Map<String, Array<ReaderExp>>,
inStaticFunction:Bool inStaticFunction:Bool
}; };
#end
class Kiss { class Kiss {
#if macro
public static function defaultKissState():KissState { public static function defaultKissState():KissState {
var className = Context.getLocalClass().get().name; var className = Context.getLocalClass().get().name;
@@ -202,7 +205,34 @@ class Kiss {
return macro {}; return macro {};
} }
#end
public static macro function exp(kissCode:ExprOf<String>) {
var pos = kissCode.pos;
var kissCode = ExprTools.getValue(kissCode);
/*
var lineNumber =
var pos = {
file: pos.file,
absoluteChar: pos.min,
line: lineNumber;
column:
};
*/
return _try(() -> {
var exp = null;
var stream = Stream.fromString(kissCode/*, pos*/);
var k = defaultKissState();
Reader.readAndProcess(stream, k, (nextExp) -> {
if (exp == null) {
exp = readerExpToHaxeExpr(nextExp, k);
} else {
throw KissError.fromExp(nextExp, "can't have multiple top-level expressions in Kiss.exp() input");
}
});
return exp;
});
}
#if macro
/** /**
Build macro: add fields to a class from a corresponding .kiss file Build macro: add fields to a class from a corresponding .kiss file
**/ **/
@@ -535,5 +565,5 @@ class Kiss {
public static function convert(k:KissState, exp:ReaderExp) { public static function convert(k:KissState, exp:ReaderExp) {
return readerExpToHaxeExpr(exp, k); return readerExpToHaxeExpr(exp, k);
} }
#end
} }
#end

View File

@@ -50,8 +50,18 @@ class Stream {
} }
#end #end
public static function fromString(content:String) { public static function fromString(content:String, position:Position = null) {
return new Stream("string", content); var file = "string";
if (position != null) {
file = position.file;
}
var s = new Stream(file, content);
if (position != null) {
s.line = position.line;
s.column = position.column;
s.absoluteChar = position.absoluteChar;
}
return s;
} }
private function new(file:String, content:String) { private function new(file:String, content:String) {

View File

@@ -6,6 +6,7 @@ import kiss.Prelude;
import kiss.List; import kiss.List;
import kiss.Stream; import kiss.Stream;
import haxe.ds.Option; import haxe.ds.Option;
import kiss.Kiss;
using StringTools; using StringTools;
@@ -19,6 +20,10 @@ class BasicTestCase extends Test {
_testHaxeInsertion(); _testHaxeInsertion();
} }
function testKissInsertion() {
Assert.equals(10, Kiss.exp('(+ 5 2 3)'));
}
function testStaticFunction() { function testStaticFunction() {
Assert.equals(6, BasicTestCase.myFloor(6.5)); Assert.equals(6, BasicTestCase.myFloor(6.5));
} }