diff --git a/kiss/src/kiss/FieldForms.hx b/kiss/src/kiss/FieldForms.hx index 8e71a176..38b5e705 100644 --- a/kiss/src/kiss/FieldForms.hx +++ b/kiss/src/kiss/FieldForms.hx @@ -100,6 +100,7 @@ class FieldForms { k.doc(formName, 1, 3, '($formName )'); k.fieldForms[formName] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { var name = Helpers.varName(formName, args[0]); + checkPrintFieldsCalledWarning(name, wholeExp, k); var access = fieldAccess(formName, name, args[0]); var type = Helpers.explicitType(args[0]); @@ -144,8 +145,8 @@ class FieldForms { static function funcOrMethod(formName:String, k:KissState) { k.doc(formName, 2, null, '($formName [] )'); k.fieldForms[formName] = (wholeExp:ReaderExp, args:Array, k:KissState) -> { - var name = Helpers.varName(formName, args[0]); + checkPrintFieldsCalledWarning(name, wholeExp, k); var access = fieldAccess(formName, name, args[0]); var inStaticFunction = access.indexOf(AStatic) != -1; var returnsValue = !isVoid(args[0]); @@ -178,4 +179,13 @@ class FieldForms { return f; } } + + static function checkPrintFieldsCalledWarning(name, exp:ReaderExp, k:KissState) { + if (k.printFieldsCalls.length > 0) { + KissError.warnFromExp(exp, 'new field "$name" defined here will not be printed by preceding print macro(s)'); + for (printCall in k.printFieldsCalls) { + KissError.warnFromExp(printCall, "print macro used here"); + } + } + } } diff --git a/kiss/src/kiss/Kiss.hx b/kiss/src/kiss/Kiss.hx index 79e046fb..d1c2fa4d 100644 --- a/kiss/src/kiss/Kiss.hx +++ b/kiss/src/kiss/Kiss.hx @@ -63,7 +63,8 @@ typedef KissState = { varsInScope:Array, localVarsInScope:Array, conversionStack:Array, - stateChanged:Bool + stateChanged:Bool, + printFieldsCalls:Array }; #end @@ -179,7 +180,8 @@ class Kiss { varsInScope: [], localVarsInScope: [], conversionStack: [], - stateChanged: false + stateChanged: false, + printFieldsCalls: [] }; k.doc = (form:String, minArgs:Null, maxArgs:Null, expectedForm = "", doc = "") -> { diff --git a/kiss/src/kiss/Macros.hx b/kiss/src/kiss/Macros.hx index 659aff9b..f43bc43c 100644 --- a/kiss/src/kiss/Macros.hx +++ b/kiss/src/kiss/Macros.hx @@ -1292,6 +1292,7 @@ class Macros { }; function printAll (locals:Bool, wholeExp:ReaderExp, exps:Array, k:KissState) { + k.printFieldsCalls.push(wholeExp); var b = wholeExp.expBuilder(); var list = if (locals) k.localVarsInScope else k.varsInScope; return b.begin([for (v in list) b.callSymbol("print", [b.symbol(v.name), b.str(v.name)])]); @@ -1303,6 +1304,7 @@ class Macros { k.doc("printLocalNulls", 0, 0, "(printLocalNulls)"); function printAllNulls (locals:Bool, wholeExp:ReaderExp, exps:Array, k:KissState) { + k.printFieldsCalls.push(wholeExp); var b = wholeExp.expBuilder(); var list = if (locals) k.localVarsInScope else k.varsInScope; return b.begin([for (v in list) { diff --git a/kiss/src/test/cases/BasicTestCase.kiss b/kiss/src/test/cases/BasicTestCase.kiss index 5ccc2f56..7c52d9d7 100644 --- a/kiss/src/test/cases/BasicTestCase.kiss +++ b/kiss/src/test/cases/BasicTestCase.kiss @@ -746,4 +746,12 @@ From:[(assert false (+ \"false \" \"should \" \"have \" \"been \" \"true\"))]" m (b [val] (+ val 2)) ] (localFunction c [val] (+ (a val) (b val))) - (Assert.equals 5 (c 1)))) \ No newline at end of file + (Assert.equals 5 (c 1)))) + +(function _testPrintMacrosCheck [] + (printAllNulls) + (var t "bad") + (let [u "good"] + (localVar v "bad") + (printLocalNulls)) + (Assert.pass)) \ No newline at end of file