Find files relative to build macro caller
This commit is contained in:
@@ -5,6 +5,7 @@ import haxe.macro.Expr;
|
|||||||
import haxe.macro.Context;
|
import haxe.macro.Context;
|
||||||
import haxe.macro.PositionTools;
|
import haxe.macro.PositionTools;
|
||||||
import sys.io.File;
|
import sys.io.File;
|
||||||
|
import haxe.io.Path;
|
||||||
#end
|
#end
|
||||||
import kiss.Kiss;
|
import kiss.Kiss;
|
||||||
import kiss.cloner.Cloner;
|
import kiss.cloner.Cloner;
|
||||||
@@ -50,6 +51,8 @@ class EmbeddedScript {
|
|||||||
public static function build(dslFile:String, scriptFile:String):Array<Field> {
|
public static function build(dslFile:String, scriptFile:String):Array<Field> {
|
||||||
var k = Kiss.defaultKissState();
|
var k = Kiss.defaultKissState();
|
||||||
|
|
||||||
|
var classPath = Context.getPosInfos(Context.currentPos()).file;
|
||||||
|
var loadingDirectory = Path.directory(classPath);
|
||||||
var classFields = Context.getBuildFields();
|
var classFields = Context.getBuildFields();
|
||||||
|
|
||||||
var commandList:Array<Expr> = [];
|
var commandList:Array<Expr> = [];
|
||||||
@@ -57,6 +60,7 @@ class EmbeddedScript {
|
|||||||
// This brings in the DSL's functions and global variables.
|
// This brings in the DSL's functions and global variables.
|
||||||
// As a side-effect, it also fills the KissState with the macros and reader macros that make the DSL syntax
|
// As a side-effect, it also fills the KissState with the macros and reader macros that make the DSL syntax
|
||||||
classFields = classFields.concat(Kiss.build(dslFile, k));
|
classFields = classFields.concat(Kiss.build(dslFile, k));
|
||||||
|
scriptFile = Path.join([loadingDirectory, scriptFile]);
|
||||||
|
|
||||||
Reader.readAndProcess(Stream.fromFile(scriptFile), k, (nextExp) -> {
|
Reader.readAndProcess(Stream.fromFile(scriptFile), k, (nextExp) -> {
|
||||||
var fields = Kiss.readerExpToFields(nextExp, k, false);
|
var fields = Kiss.readerExpToFields(nextExp, k, false);
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import kiss.cloner.Cloner;
|
|||||||
using kiss.Helpers;
|
using kiss.Helpers;
|
||||||
using kiss.Reader;
|
using kiss.Reader;
|
||||||
using tink.MacroApi;
|
using tink.MacroApi;
|
||||||
|
using haxe.io.Path;
|
||||||
|
|
||||||
typedef ExprConversion = (ReaderExp) -> Expr;
|
typedef ExprConversion = (ReaderExp) -> Expr;
|
||||||
|
|
||||||
@@ -91,13 +92,17 @@ class Kiss {
|
|||||||
/**
|
/**
|
||||||
Build macro: add fields to a class from a corresponding .kiss file
|
Build macro: add fields to a class from a corresponding .kiss file
|
||||||
**/
|
**/
|
||||||
public static function build(kissFile:String, ?k:KissState, useClassFields = true):Array<Field> {
|
public static function build(?kissFile:String, ?k:KissState, useClassFields = true):Array<Field> {
|
||||||
|
var classPath = Context.getPosInfos(Context.currentPos()).file;
|
||||||
|
// (load... ) relative to the original file
|
||||||
|
var loadingDirectory = Path.directory(classPath);
|
||||||
|
if (kissFile == null) {
|
||||||
|
kissFile = classPath.withoutDirectory().withoutExtension().withExtension("kiss");
|
||||||
|
}
|
||||||
|
|
||||||
return _try(() -> {
|
return _try(() -> {
|
||||||
var classFields:Array<Field> = if (useClassFields) Context.getBuildFields() else [];
|
var classFields:Array<Field> = if (useClassFields) Context.getBuildFields() else [];
|
||||||
var stream = Stream.fromFile(kissFile);
|
var stream = Stream.fromFile(Path.join([loadingDirectory, kissFile]));
|
||||||
|
|
||||||
// (load... ) relative to the original file
|
|
||||||
var loadingDirectory = Path.directory(kissFile);
|
|
||||||
|
|
||||||
if (k == null)
|
if (k == null)
|
||||||
k = defaultKissState();
|
k = defaultKissState();
|
||||||
@@ -112,13 +117,12 @@ class Kiss {
|
|||||||
nextExp.checkNumArgs(1, 1, "(load \"[file]\")");
|
nextExp.checkNumArgs(1, 1, "(load \"[file]\")");
|
||||||
switch (loadArgs[0].def) {
|
switch (loadArgs[0].def) {
|
||||||
case StrExp(otherKissFile):
|
case StrExp(otherKissFile):
|
||||||
var filePath = Path.join([loadingDirectory, otherKissFile]);
|
if (!k.loadedFiles.exists(otherKissFile)) {
|
||||||
if (!k.loadedFiles.exists(filePath)) {
|
var loadedFields = Kiss.build(otherKissFile, k, false);
|
||||||
var loadedFields = Kiss.build(filePath, k, false);
|
|
||||||
for (field in loadedFields) {
|
for (field in loadedFields) {
|
||||||
classFields.push(field);
|
classFields.push(field);
|
||||||
}
|
}
|
||||||
k.loadedFiles[filePath] = true;
|
k.loadedFiles[otherKissFile] = true;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
throw CompileError.fromExp(loadArgs[0], "only argument to load should be a string literal");
|
throw CompileError.fromExp(loadArgs[0], "only argument to load should be a string literal");
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import haxe.ds.Option;
|
|||||||
|
|
||||||
using StringTools;
|
using StringTools;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("kiss/src/test/cases/BasicTestCase.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class BasicTestCase extends Test {
|
class BasicTestCase extends Test {
|
||||||
function testStaticVar() {
|
function testStaticVar() {
|
||||||
Assert.equals("Howdy", BasicTestCase.message);
|
Assert.equals("Howdy", BasicTestCase.message);
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ import utest.Test;
|
|||||||
import kiss.Prelude;
|
import kiss.Prelude;
|
||||||
import kiss.List;
|
import kiss.List;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("kiss/src/test/cases/CommentAtEndOfListTestCase.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class CommentAtEndOfListTestCase extends Test {}
|
class CommentAtEndOfListTestCase extends Test {}
|
||||||
|
|||||||
@@ -15,5 +15,5 @@ class DSLTestCase extends Test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@:build(kiss.EmbeddedScript.build("kiss/src/test/cases/DSL.kiss", "kiss/src/test/cases/DSLScript.dsl"))
|
@:build(kiss.EmbeddedScript.build("DSL.kiss", "DSLScript.dsl"))
|
||||||
class DSLScript extends EmbeddedScript {}
|
class DSLScript extends EmbeddedScript {}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import haxe.ds.Option;
|
|||||||
|
|
||||||
using StringTools;
|
using StringTools;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("kiss/src/test/cases/MacroTestCase.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class MacroTestCase extends Test {
|
class MacroTestCase extends Test {
|
||||||
function testMultipleFieldForms() {
|
function testMultipleFieldForms() {
|
||||||
Assert.equals(5, myVar);
|
Assert.equals(5, myVar);
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import utest.Test;
|
|||||||
import utest.Assert;
|
import utest.Assert;
|
||||||
import kiss.Prelude;
|
import kiss.Prelude;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("kiss/src/test/cases/ReaderMacroTestCase.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class ReaderMacroTestCase extends Test {
|
class ReaderMacroTestCase extends Test {
|
||||||
function testReadBang() {
|
function testReadBang() {
|
||||||
Assert.equals("String that takes the rest of the line", ReaderMacroTestCase.myLine());
|
Assert.equals("String that takes the rest of the line", ReaderMacroTestCase.myLine());
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ import kiss.Prelude;
|
|||||||
import kiss.List;
|
import kiss.List;
|
||||||
import year2020.Solutions as Solutions2020;
|
import year2020.Solutions as Solutions2020;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/Main.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Main {}
|
class Main {}
|
||||||
|
|||||||
@@ -6,5 +6,5 @@ import year2020.Util;
|
|||||||
|
|
||||||
using StringTools;
|
using StringTools;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/year2020/Adapters.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Adapters {}
|
class Adapters {}
|
||||||
|
|||||||
@@ -11,5 +11,5 @@ typedef ParentMap = Map<String, Map<String, Int>>;
|
|||||||
// Color IS CONTAINED IN these colors
|
// Color IS CONTAINED IN these colors
|
||||||
typedef ChildMap = Map<String, Array<String>>;
|
typedef ChildMap = Map<String, Array<String>>;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/year2020/Bags.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Bags {}
|
class Bags {}
|
||||||
|
|||||||
@@ -3,14 +3,14 @@ package year2020;
|
|||||||
import kiss.EmbeddedScript;
|
import kiss.EmbeddedScript;
|
||||||
import kiss.Prelude;
|
import kiss.Prelude;
|
||||||
|
|
||||||
@:build(kiss.EmbeddedScript.build("src/year2020/BootCodeDSL.kiss", "src/year2020/inputs/day8-example.txt"))
|
@:build(kiss.EmbeddedScript.build("BootCodeDSL.kiss", "inputs/day8-example.txt"))
|
||||||
class BootCodeExample extends EmbeddedScript {}
|
class BootCodeExample extends EmbeddedScript {}
|
||||||
|
|
||||||
@:build(kiss.EmbeddedScript.build("src/year2020/BootCodeDSL.kiss", "src/year2020/inputs/day8.txt"))
|
@:build(kiss.EmbeddedScript.build("BootCodeDSL.kiss", "inputs/day8.txt"))
|
||||||
class BootCodeReal extends EmbeddedScript {}
|
class BootCodeReal extends EmbeddedScript {}
|
||||||
|
|
||||||
@:build(kiss.EmbeddedScript.build("src/year2020/BootCodeFixDSL.kiss", "src/year2020/inputs/day8-example.txt"))
|
@:build(kiss.EmbeddedScript.build("BootCodeFixDSL.kiss", "inputs/day8-example.txt"))
|
||||||
class BootCodeFixExample extends EmbeddedScript {}
|
class BootCodeFixExample extends EmbeddedScript {}
|
||||||
|
|
||||||
@:build(kiss.EmbeddedScript.build("src/year2020/BootCodeFixDSL.kiss", "src/year2020/inputs/day8.txt"))
|
@:build(kiss.EmbeddedScript.build("BootCodeFixDSL.kiss", "inputs/day8.txt"))
|
||||||
class BootCodeFix extends EmbeddedScript {}
|
class BootCodeFix extends EmbeddedScript {}
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ import year2020.Util;
|
|||||||
|
|
||||||
using StringTools;
|
using StringTools;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/year2020/Customs.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Customs {}
|
class Customs {}
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ package year2020;
|
|||||||
import kiss.EmbeddedScript;
|
import kiss.EmbeddedScript;
|
||||||
import kiss.Prelude;
|
import kiss.Prelude;
|
||||||
|
|
||||||
@:build(kiss.EmbeddedScript.build("src/year2020/EvasionDSL.kiss", "src/year2020/inputs/day12.txt"))
|
@:build(kiss.EmbeddedScript.build("EvasionDSL.kiss", "inputs/day12.txt"))
|
||||||
class EvasionScript extends EmbeddedScript {}
|
class EvasionScript extends EmbeddedScript {}
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ typedef SeatsChanged = {
|
|||||||
changed:Bool
|
changed:Bool
|
||||||
};
|
};
|
||||||
|
|
||||||
@:build(kiss.EmbeddedScript.build("src/year2020/FerrySimDSL.kiss", "src/year2020/inputs/day11-example.txt"))
|
@:build(kiss.EmbeddedScript.build("FerrySimDSL.kiss", "inputs/day11-example.txt"))
|
||||||
class FerrySimExample extends EmbeddedScript {}
|
class FerrySimExample extends EmbeddedScript {}
|
||||||
|
|
||||||
@:build(kiss.EmbeddedScript.build("src/year2020/FerrySimDSL.kiss", "src/year2020/inputs/day11.txt"))
|
@:build(kiss.EmbeddedScript.build("FerrySimDSL.kiss", "inputs/day11.txt"))
|
||||||
class FerrySimReal extends EmbeddedScript {}
|
class FerrySimReal extends EmbeddedScript {}
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ import kiss.Stream;
|
|||||||
|
|
||||||
using StringTools;
|
using StringTools;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/year2020/Passports.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Passports {}
|
class Passports {}
|
||||||
|
|||||||
@@ -6,5 +6,5 @@ import year2020.Util;
|
|||||||
|
|
||||||
using StringTools;
|
using StringTools;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/year2020/Passwords.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Passwords {}
|
class Passwords {}
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ import year2020.Util;
|
|||||||
|
|
||||||
using StringTools;
|
using StringTools;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/year2020/Seating.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Seating {}
|
class Seating {}
|
||||||
|
|||||||
@@ -18,5 +18,5 @@ import year2020.Adapters;
|
|||||||
import year2020.FerrySim;
|
import year2020.FerrySim;
|
||||||
import year2020.Evasion;
|
import year2020.Evasion;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/year2020/Solutions.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Solutions {}
|
class Solutions {}
|
||||||
|
|||||||
@@ -2,5 +2,5 @@ package year2020;
|
|||||||
|
|
||||||
import kiss.Prelude;
|
import kiss.Prelude;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/year2020/SummingTuples.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class SummingTuples {}
|
class SummingTuples {}
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ package year2020;
|
|||||||
import kiss.Prelude;
|
import kiss.Prelude;
|
||||||
import year2020.Util;
|
import year2020.Util;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/year2020/Toboggan.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Toboggan {}
|
class Toboggan {}
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ import kiss.Prelude;
|
|||||||
|
|
||||||
using StringTools;
|
using StringTools;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/year2020/Util.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Util {}
|
class Util {}
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ package year2020;
|
|||||||
import kiss.Prelude;
|
import kiss.Prelude;
|
||||||
import year2020.SummingTuples;
|
import year2020.SummingTuples;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/year2020/XMAS.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class XMAS {}
|
class XMAS {}
|
||||||
|
|||||||
@@ -4,5 +4,5 @@ import kiss.Kiss;
|
|||||||
import kiss.Prelude;
|
import kiss.Prelude;
|
||||||
import asciilib.Surface;
|
import asciilib.Surface;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/Main.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Main {}
|
class Main {}
|
||||||
|
|||||||
@@ -11,5 +11,5 @@ typedef Color = {
|
|||||||
/**
|
/**
|
||||||
* The Colors class represents a 2D grid of colors. Under the hood, it's byte channels
|
* The Colors class represents a 2D grid of colors. Under the hood, it's byte channels
|
||||||
*/
|
*/
|
||||||
@:build(kiss.Kiss.build("src/asciilib/Colors.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Colors {}
|
class Colors {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package asciilib;
|
package asciilib;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/asciilib/Game.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Game {}
|
class Game {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package asciilib;
|
package asciilib;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/asciilib/Graphics.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Graphics {}
|
class Graphics {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package asciilib;
|
package asciilib;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/asciilib/Grid.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Grid<T> {}
|
class Grid<T> {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package asciilib;
|
package asciilib;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/asciilib/Letters.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Letters {}
|
class Letters {}
|
||||||
|
|||||||
@@ -2,5 +2,5 @@ package asciilib;
|
|||||||
|
|
||||||
import asciilib.Colors;
|
import asciilib.Colors;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/asciilib/Surface.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Surface {}
|
class Surface {}
|
||||||
|
|||||||
@@ -5,5 +5,5 @@ import sys.io.Process;
|
|||||||
import kiss.Kiss;
|
import kiss.Kiss;
|
||||||
import kiss.Prelude;
|
import kiss.Prelude;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/Main.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Main {}
|
class Main {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package;
|
package;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("source/Coin.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Coin extends FlxSprite {}
|
class Coin extends FlxSprite {}
|
||||||
|
|||||||
@@ -9,5 +9,5 @@ enum EnemyType
|
|||||||
BOSS;
|
BOSS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("source/Enemy.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Enemy extends FlxSprite {}
|
class Enemy extends FlxSprite {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package;
|
package;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("source/FSM.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class FSM {}
|
class FSM {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package;
|
package;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("source/Main.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Main extends Sprite {}
|
class Main extends Sprite {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package;
|
package;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("source/MenuState.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class MenuState extends FlxState {}
|
class MenuState extends FlxState {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package;
|
package;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("source/PlayState.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class PlayState extends FlxState {}
|
class PlayState extends FlxState {}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package;
|
package;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("source/Player.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Player extends FlxSprite {}
|
class Player extends FlxSprite {}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ typedef KissConfig = {
|
|||||||
init:() -> Void
|
init:() -> Void
|
||||||
};
|
};
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/Main.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Main {
|
class Main {
|
||||||
// TODO support EMeta(s:MetadataEntry, e:Expr) via Kiss so this signature can be moved to Main.kiss
|
// TODO support EMeta(s:MetadataEntry, e:Expr) via Kiss so this signature can be moved to Main.kiss
|
||||||
@:expose("activate")
|
@:expose("activate")
|
||||||
|
|||||||
@@ -10,5 +10,5 @@ import Externs;
|
|||||||
|
|
||||||
using StringTools;
|
using StringTools;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/Main.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Main {}
|
class Main {}
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ package;
|
|||||||
import kiss.Kiss;
|
import kiss.Kiss;
|
||||||
import kiss.Prelude;
|
import kiss.Prelude;
|
||||||
|
|
||||||
@:build(kiss.Kiss.build("src/Main.kiss"))
|
@:build(kiss.Kiss.build())
|
||||||
class Main {}
|
class Main {}
|
||||||
|
|||||||
Reference in New Issue
Block a user