fix a bug in printAll macros
This commit is contained in:
@@ -104,9 +104,10 @@ class FieldForms {
|
||||
var access = fieldAccess(formName, name, args[0]);
|
||||
|
||||
var type = Helpers.explicitType(args[0]);
|
||||
if (type != null)
|
||||
k.addVarInScope({name: name, type: type}, false);
|
||||
|
||||
k.addVarInScope(
|
||||
{name: name, type: type},
|
||||
false,
|
||||
access.indexOf(AStatic) != -1);
|
||||
|
||||
function varOrPropKind(args:Array<ReaderExp>) {
|
||||
return if (args.length > 1) {
|
||||
|
@@ -61,6 +61,7 @@ typedef KissState = {
|
||||
inStaticFunction:Bool,
|
||||
typeHints:Array<Var>,
|
||||
varsInScope:Array<Var>,
|
||||
varsInScopeAreStatic:Array<Bool>,
|
||||
localVarsInScope:Array<Var>,
|
||||
conversionStack:Array<ReaderExp>,
|
||||
stateChanged:Bool,
|
||||
@@ -178,6 +179,7 @@ class Kiss {
|
||||
inStaticFunction: false,
|
||||
typeHints: [],
|
||||
varsInScope: [],
|
||||
varsInScopeAreStatic: [],
|
||||
localVarsInScope: [],
|
||||
conversionStack: [],
|
||||
stateChanged: false,
|
||||
@@ -569,10 +571,11 @@ class Kiss {
|
||||
return expr;
|
||||
}
|
||||
|
||||
public static function addVarInScope(k: KissState, v:Var, local:Bool) {
|
||||
public static function addVarInScope(k: KissState, v:Var, local:Bool, isStatic:Bool=false) {
|
||||
if (v.type != null)
|
||||
k.typeHints.push(v);
|
||||
k.varsInScope.push(v);
|
||||
k.varsInScopeAreStatic.push(isStatic);
|
||||
if (local)
|
||||
k.localVarsInScope.push(v);
|
||||
}
|
||||
@@ -581,10 +584,12 @@ class Kiss {
|
||||
function removeLast(list:Array<Var>, v:Var) {
|
||||
var index = list.lastIndexOf(v);
|
||||
list.splice(index, 1);
|
||||
return index;
|
||||
}
|
||||
if (v.type != null)
|
||||
removeLast(k.typeHints, v);
|
||||
removeLast(k.varsInScope, v);
|
||||
var idx = removeLast(k.varsInScope, v);
|
||||
k.varsInScopeAreStatic.splice(idx, 1);
|
||||
if (local)
|
||||
removeLast(k.localVarsInScope, v);
|
||||
}
|
||||
|
@@ -1291,31 +1291,30 @@ class Macros {
|
||||
return Quasiquote(b.let(bindings, body)).withPosOf(wholeExp);
|
||||
};
|
||||
|
||||
function printAll (locals:Bool, wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
|
||||
function printAll (locals:Bool, nullCheck:Bool, wholeExp:ReaderExp, exps:Array<ReaderExp>, 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)])]);
|
||||
if (!locals && k.inStaticFunction) {
|
||||
list = [for (idx in 0...list.length) if (!k.varsInScopeAreStatic[idx]) continue; else list[idx]];
|
||||
}
|
||||
return b.begin([for (v in list) {
|
||||
var symbol = b.symbol(v.name);
|
||||
var pr = b.callSymbol("print", [symbol, b.str(v.name)]);
|
||||
if (nullCheck) {
|
||||
pr = b.callSymbol("unless", [symbol, pr]);
|
||||
}
|
||||
pr;
|
||||
}]);
|
||||
}
|
||||
k.doc("printAll", 0, 0, "(printAll)");
|
||||
macros["printAll"] = printAll.bind(false);
|
||||
macros["printAll"] = printAll.bind(false, false);
|
||||
k.doc("printLocals", 0, 0, "(printLocals)");
|
||||
macros["printLocals"] = printAll.bind(true);
|
||||
|
||||
k.doc("printLocalNulls", 0, 0, "(printLocalNulls)");
|
||||
function printAllNulls (locals:Bool, wholeExp:ReaderExp, exps:Array<ReaderExp>, 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) {
|
||||
var symbol = b.symbol(v.name);
|
||||
b.callSymbol("unless", [symbol,
|
||||
b.callSymbol("print", [symbol, b.str(v.name)])]);}]);
|
||||
};
|
||||
macros["printLocals"] = printAll.bind(true, false);
|
||||
k.doc("printAllNulls", 0, 0, "(printAllNulls)");
|
||||
macros["printAllNulls"] = printAllNulls.bind(false);
|
||||
macros["printAllNulls"] = printAll.bind(false, true);
|
||||
k.doc("printLocalNulls", 0, 0, "(printLocalNulls)");
|
||||
macros["printLocalNulls"] = printAllNulls.bind(true);
|
||||
macros["printLocalNulls"] = printAll.bind(true, true);
|
||||
|
||||
var savedVarFilename = null;
|
||||
k.doc("savedVarFile", 1, 1, '(savedVarFilename "<path>")');
|
||||
|
@@ -395,6 +395,12 @@ class BasicTestCase extends Test {
|
||||
function testWithFunctions() {
|
||||
_testWithFunctions();
|
||||
}
|
||||
|
||||
function testPrintMacrosCheck() {
|
||||
_testPrintMacrosCheck();
|
||||
}
|
||||
|
||||
var aNullToPrint = null;
|
||||
}
|
||||
|
||||
class BasicObject {
|
||||
|
@@ -748,6 +748,7 @@ From:[(assert false (+ \"false \" \"should \" \"have \" \"been \" \"true\"))]" m
|
||||
(localFunction c [val] (+ (a val) (b val)))
|
||||
(Assert.equals 5 (c 1))))
|
||||
|
||||
(var anotherNullToPrint null)
|
||||
(function _testPrintMacrosCheck []
|
||||
(printAllNulls)
|
||||
(var t "bad")
|
||||
|
Reference in New Issue
Block a user