From 2c8defe7898c889de1f7f2f22db48e90c2b161b0 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sun, 19 Feb 2023 07:34:14 -0700 Subject: [PATCH] Add Context.buildFields to print macros. Close #111 --- kiss/src/kiss/Kiss.hx | 34 ++++++++++------ kiss/src/test/cases/BasicTestCase.hx | 9 ++++- kiss/src/test/cases/BasicTestCase.kiss | 56 ++++++++++++++++++++++---- 3 files changed, 77 insertions(+), 22 deletions(-) diff --git a/kiss/src/kiss/Kiss.hx b/kiss/src/kiss/Kiss.hx index 3f35e5a3..3d56f021 100644 --- a/kiss/src/kiss/Kiss.hx +++ b/kiss/src/kiss/Kiss.hx @@ -281,6 +281,26 @@ class Kiss { }); } #if macro + static function addContextFields(k:KissState, useClassFields:Bool) { + if (useClassFields) { + k.fieldList = Context.getBuildFields(); + for (field in k.fieldList) { + k.fieldDict[field.name] = field; + switch (field.kind) { + case FVar(t, e) | FProp(_, _, t, e): + var v = { + name: field.name, + type: t, + expr: e + }; + k.addVarInScope(v, false, field.access.indexOf(AStatic) != -1); + default: + } + + } + } + } + /** Build macro: add fields to a class from a corresponding .kiss file **/ @@ -308,12 +328,7 @@ class Kiss { if (k == null) k = defaultKissState(context); - if (useClassFields) { - k.fieldList = Context.getBuildFields(); - for (field in k.fieldList) { - k.fieldDict[field.name] = field; - } - } + k.addContextFields(useClassFields); k.loadingDirectory = loadingDirectory; var topLevelBegin = load(kissFile, k); @@ -423,12 +438,7 @@ class Kiss { if (k == null) k = defaultKissState(context); - if (useClassFields) { - k.fieldList = Context.getBuildFields(); - for (field in k.fieldList) { - k.fieldDict[field.name] = field; - } - } + k.addContextFields(useClassFields); for (file in kissFiles) { build(file, k, false, context); diff --git a/kiss/src/test/cases/BasicTestCase.hx b/kiss/src/test/cases/BasicTestCase.hx index 31bdfff1..2a92cd52 100644 --- a/kiss/src/test/cases/BasicTestCase.hx +++ b/kiss/src/test/cases/BasicTestCase.hx @@ -403,8 +403,13 @@ class BasicTestCase extends Test { _testWithTempSet(); } - function testPrintMacrosCheck() { - _testPrintMacrosCheck(); + var nullDefinedInHaxe = null; + static var staticNullDefinedInHaxe = null; + + function testPrintMacros() { + // TODO Test the warnings + _testPrintMacrosInstance(); + _testPrintMacrosStatic(); } function testTypeCase() { diff --git a/kiss/src/test/cases/BasicTestCase.kiss b/kiss/src/test/cases/BasicTestCase.kiss index 09a0d6c0..e163d0f6 100644 --- a/kiss/src/test/cases/BasicTestCase.kiss +++ b/kiss/src/test/cases/BasicTestCase.kiss @@ -768,14 +768,54 @@ From:[(assert false (+ \"false \" \"should \" \"have \" \"been \" \"true\"))]" m (assertEquals 3 v2)) (Assert.pass)) -(var anotherNullToPrint null) -(function _testPrintMacrosCheck [] - (printAllNulls) - (var t "bad") - (let [u "good"] - (localVar v "bad") - (printLocalNulls)) - (Assert.pass)) +(var &mut savedPrints []) +(function savePrint [] + (set savedPrints []) + ->:Void [:String s] (savedPrints.push s)) + +(prop anotherNullToPrint null) +(var anotherStaticNullToPrint null) + +(method _testPrintMacrosInstance [] + (withTempSet [Prelude.printStr (savePrint)] + (printAllNulls) + (Assert.isTrue (savedPrints.contains "anotherNullToPrint: null")) + (Assert.isTrue (savedPrints.contains "anotherStaticNullToPrint: null")) + (Assert.isTrue (savedPrints.contains "nullDefinedInHaxe: null")) + (Assert.isTrue (savedPrints.contains "staticNullDefinedInHaxe: null")) + + // TODO This statement prints a warning at compile-time, which won't + // appear in savedPrints, so it's harder to test... + (prop tp "bad") + + (let [u null] + // TODO this statement should print a warning at compile-time (#112) + (localVar v "bad") + + (set savedPrints []) + (printLocalNulls) + (Assert.isFalse (savedPrints.contains "anotherNullToPrint: null")) + (Assert.isFalse (savedPrints.contains "anotherStaticNullToPrint: null")) + (Assert.isTrue (savedPrints.contains "u: null"))))) + +(function _testPrintMacrosStatic [] + (withTempSet [Prelude.printStr (savePrint)] + (printAllNulls) + (Assert.isTrue (savedPrints.contains "anotherStaticNullToPrint: null")) + (Assert.isTrue (savedPrints.contains "staticNullDefinedInHaxe: null")) + + // TODO This statement prints a warning at compile-time, which won't + // appear in savedPrints, so it's harder to test... + (var ts "bad") + + (let [u null] + // TODO this statement should print a warning at compile-time (#112) + (localVar v "bad") + + (set savedPrints []) + (printLocalNulls) + (Assert.isFalse (savedPrints.contains "anotherStaticNullToPrint: null")) + (Assert.isTrue (savedPrints.contains "u: null"))))) (function :Void _testTypeCase [] (typeCase ["a"]