improve assert statement support

This commit is contained in:
Dave Holoway
2020-06-10 16:29:23 +01:00
parent c9ab48031e
commit 87a2d72ae3

View File

@@ -191,6 +191,7 @@ class SynchronizedStatement extends Statement {
} }
class AssertStatement extends Statement { class AssertStatement extends Statement {
expression = null; expression = null;
message = null;
} }
/** /**
@@ -313,7 +314,7 @@ function statementKeyword(tokens, locals, method, imports, typemap) {
case 'assert': case 'assert':
tokens.inc(); tokens.inc();
s = new AssertStatement(); s = new AssertStatement();
s.expression = expression(tokens, locals, method, imports, typemap); assertStatement(s, tokens, locals, method, imports, typemap);
semicolon(tokens); semicolon(tokens);
break; break;
default: default:
@@ -455,6 +456,28 @@ function synchronizedStatement(s, tokens, locals, method, imports, typemap) {
s.statement = nonVarDeclStatement(tokens, locals, method, imports, typemap); s.statement = nonVarDeclStatement(tokens, locals, method, imports, typemap);
} }
/**
* @param {AssertStatement} s
* @param {TokenList} tokens
* @param {Local[]} locals
* @param {SourceMC} method
* @param {ResolvedImport[]} imports
* @param {Map<string,JavaType>} typemap
*/
function assertStatement(s, tokens, locals, method, imports, typemap) {
s.expression = expression(tokens, locals, method, imports, typemap);
if (s.expression.variables[0] && !isAssignable(PrimitiveType.map.Z, s.expression.variables[0])) {
addproblem(tokens, ParseProblem.Error(tokens.current, `Boolean expression expected but type '${s.expression.variables[0].type.fullyDottedTypeName}' found`));
}
if (tokens.isValue(':')) {
s.message = expression(tokens, locals, method, imports, typemap);
if (s.message.variables[0] && (s.message.variables[0].type === PrimitiveType.map.V)) {
addproblem(tokens, ParseProblem.Error(tokens.current, `assert message expression cannot be void`));
}
}
}
/** /**
* @param {TryStatement} s * @param {TryStatement} s
* @param {TokenList} tokens * @param {TokenList} tokens