Print a warning when field forms are used after a print macro. Close

This commit is contained in:
2022-12-06 03:52:59 +00:00
parent 685efc3de4
commit a86c223942
4 changed files with 26 additions and 4 deletions

View File

@@ -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");
}
}
}
}

View File

@@ -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 = "") -> {

View File

@@ -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) {

View File

@@ -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))