Find files relative to build macro caller

This commit is contained in:
2021-04-24 20:34:47 -06:00
parent 7a5c47a951
commit 665e4a3ca7
40 changed files with 59 additions and 51 deletions

View File

@@ -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);

View File

@@ -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");

View File

@@ -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);

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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);

View File

@@ -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());

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -1,4 +1,4 @@
package asciilib; package asciilib;
@:build(kiss.Kiss.build("src/asciilib/Game.kiss")) @:build(kiss.Kiss.build())
class Game {} class Game {}

View File

@@ -1,4 +1,4 @@
package asciilib; package asciilib;
@:build(kiss.Kiss.build("src/asciilib/Graphics.kiss")) @:build(kiss.Kiss.build())
class Graphics {} class Graphics {}

View File

@@ -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> {}

View File

@@ -1,4 +1,4 @@
package asciilib; package asciilib;
@:build(kiss.Kiss.build("src/asciilib/Letters.kiss")) @:build(kiss.Kiss.build())
class Letters {} class Letters {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -1,4 +1,4 @@
package; package;
@:build(kiss.Kiss.build("source/FSM.kiss")) @:build(kiss.Kiss.build())
class FSM {} class FSM {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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 {}

View File

@@ -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")

View File

@@ -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 {}

View File

@@ -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 {}