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.doc(formName, 1, 3, '($formName <optional &mut> <optional :Type> <name> <optional value>)');
|
||||||
k.fieldForms[formName] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
|
k.fieldForms[formName] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
|
||||||
var name = Helpers.varName(formName, args[0]);
|
var name = Helpers.varName(formName, args[0]);
|
||||||
|
checkPrintFieldsCalledWarning(name, wholeExp, k);
|
||||||
var access = fieldAccess(formName, name, args[0]);
|
var access = fieldAccess(formName, name, args[0]);
|
||||||
|
|
||||||
var type = Helpers.explicitType(args[0]);
|
var type = Helpers.explicitType(args[0]);
|
||||||
@@ -144,8 +145,8 @@ class FieldForms {
|
|||||||
static function funcOrMethod(formName:String, k:KissState) {
|
static function funcOrMethod(formName:String, k:KissState) {
|
||||||
k.doc(formName, 2, null, '($formName <optional &dynamic> <optional :Type> <name> [<argNames...>] <body...>)');
|
k.doc(formName, 2, null, '($formName <optional &dynamic> <optional :Type> <name> [<argNames...>] <body...>)');
|
||||||
k.fieldForms[formName] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
|
k.fieldForms[formName] = (wholeExp:ReaderExp, args:Array<ReaderExp>, k:KissState) -> {
|
||||||
|
|
||||||
var name = Helpers.varName(formName, args[0]);
|
var name = Helpers.varName(formName, args[0]);
|
||||||
|
checkPrintFieldsCalledWarning(name, wholeExp, k);
|
||||||
var access = fieldAccess(formName, name, args[0]);
|
var access = fieldAccess(formName, name, args[0]);
|
||||||
var inStaticFunction = access.indexOf(AStatic) != -1;
|
var inStaticFunction = access.indexOf(AStatic) != -1;
|
||||||
var returnsValue = !isVoid(args[0]);
|
var returnsValue = !isVoid(args[0]);
|
||||||
@@ -178,4 +179,13 @@ class FieldForms {
|
|||||||
return f;
|
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>,
|
varsInScope:Array<Var>,
|
||||||
localVarsInScope:Array<Var>,
|
localVarsInScope:Array<Var>,
|
||||||
conversionStack:Array<ReaderExp>,
|
conversionStack:Array<ReaderExp>,
|
||||||
stateChanged:Bool
|
stateChanged:Bool,
|
||||||
|
printFieldsCalls:Array<ReaderExp>
|
||||||
};
|
};
|
||||||
#end
|
#end
|
||||||
|
|
||||||
@@ -179,7 +180,8 @@ class Kiss {
|
|||||||
varsInScope: [],
|
varsInScope: [],
|
||||||
localVarsInScope: [],
|
localVarsInScope: [],
|
||||||
conversionStack: [],
|
conversionStack: [],
|
||||||
stateChanged: false
|
stateChanged: false,
|
||||||
|
printFieldsCalls: []
|
||||||
};
|
};
|
||||||
|
|
||||||
k.doc = (form:String, minArgs:Null<Int>, maxArgs:Null<Int>, expectedForm = "", doc = "") -> {
|
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) {
|
function printAll (locals:Bool, wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
|
||||||
|
k.printFieldsCalls.push(wholeExp);
|
||||||
var b = wholeExp.expBuilder();
|
var b = wholeExp.expBuilder();
|
||||||
var list = if (locals) k.localVarsInScope else k.varsInScope;
|
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)])]);
|
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)");
|
k.doc("printLocalNulls", 0, 0, "(printLocalNulls)");
|
||||||
function printAllNulls (locals:Bool, wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
|
function printAllNulls (locals:Bool, wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) {
|
||||||
|
k.printFieldsCalls.push(wholeExp);
|
||||||
var b = wholeExp.expBuilder();
|
var b = wholeExp.expBuilder();
|
||||||
var list = if (locals) k.localVarsInScope else k.varsInScope;
|
var list = if (locals) k.localVarsInScope else k.varsInScope;
|
||||||
return b.begin([for (v in list) {
|
return b.begin([for (v in list) {
|
||||||
|
@@ -746,4 +746,12 @@ From:[(assert false (+ \"false \" \"should \" \"have \" \"been \" \"true\"))]" m
|
|||||||
(b [val] (+ val 2))
|
(b [val] (+ val 2))
|
||||||
]
|
]
|
||||||
(localFunction c [val] (+ (a val) (b val)))
|
(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