Print a warning when field forms are used after a print macro. Close
This commit is contained in:
@@ -100,6 +100,7 @@ class FieldForms {
|
||||
k.doc(formName, 1, 3, '($formName <optional &mut> <optional :Type> <name> <optional value>)');
|
||||
k.fieldForms[formName] = (wholeExp:ReaderExp, args:Array<ReaderExp>, 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 <optional &dynamic> <optional :Type> <name> [<argNames...>] <body...>)');
|
||||
k.fieldForms[formName] = (wholeExp:ReaderExp, args:Array<ReaderExp>, 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -63,7 +63,8 @@ typedef KissState = {
|
||||
varsInScope:Array<Var>,
|
||||
localVarsInScope:Array<Var>,
|
||||
conversionStack:Array<ReaderExp>,
|
||||
stateChanged:Bool
|
||||
stateChanged:Bool,
|
||||
printFieldsCalls:Array<ReaderExp>
|
||||
};
|
||||
#end
|
||||
|
||||
@@ -179,7 +180,8 @@ class Kiss {
|
||||
varsInScope: [],
|
||||
localVarsInScope: [],
|
||||
conversionStack: [],
|
||||
stateChanged: false
|
||||
stateChanged: false,
|
||||
printFieldsCalls: []
|
||||
};
|
||||
|
||||
k.doc = (form:String, minArgs:Null<Int>, maxArgs:Null<Int>, expectedForm = "", doc = "") -> {
|
||||
|
@@ -1292,6 +1292,7 @@ class Macros {
|
||||
};
|
||||
|
||||
function printAll (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) 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<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) {
|
||||
|
@@ -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))))
|
||||
(Assert.equals 5 (c 1))))
|
||||
|
||||
(function _testPrintMacrosCheck []
|
||||
(printAllNulls)
|
||||
(var t "bad")
|
||||
(let [u "good"]
|
||||
(localVar v "bad")
|
||||
(printLocalNulls))
|
||||
(Assert.pass))
|
Reference in New Issue
Block a user