Tighten types for runtimeStatement and runtimeCall
Only ~29/100 calls for runtimeCall and ~2/31 calls for runtimeStatement
were using the single value option. Change to take a `List<Object>`
always and add list literals to those calls which were previously only
passing one value.
Update pubspec SDk constraint so that the analyzer will allow the `..?`
syntax.
Change-Id: Ib8eb8eb854a8aa04e36dc5cc713016a43b8e9325
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/103361
Reviewed-by: Nicholas Shahan <nshahan@google.com>
Commit-Queue: Nate Bosch <nbosch@google.com>
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index 9e1ecef..5e67b6c 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -696,7 +696,7 @@
// TODO(jmesserly): fuse this with notNull check.
// TODO(jmesserly): this does not correctly distinguish user casts from
// required-for-soundness casts.
- return runtimeCall('asInt(#)', jsFrom);
+ return runtimeCall('asInt(#)', [jsFrom]);
}
// A no-op in JavaScript.
@@ -1834,8 +1834,8 @@
ClassElement classElem, String jsPeerName, List<JS.Statement> body) {
var className = _emitTopLevelName(classElem);
if (jsTypeRep.isPrimitive(classElem.type)) {
- body.add(
- runtimeStatement('definePrimitiveHashCode(#.prototype)', className));
+ body.add(runtimeStatement(
+ 'definePrimitiveHashCode(#.prototype)', [className]));
}
body.add(runtimeStatement(
'registerExtension(#, #)', [js.string(jsPeerName), className]));
@@ -3044,7 +3044,7 @@
// If the type is a type literal expression in Dart code, wrap the raw
// runtime type in a "Type" instance.
if (!_isInForeignJS && _isTypeLiteral(node)) {
- typeName = runtimeCall('wrapType(#)', typeName);
+ typeName = runtimeCall('wrapType(#)', [typeName]);
}
return typeName;
@@ -3283,7 +3283,7 @@
if (_isExternal(member)) {
var nativeName = _extensionTypes.getNativePeers(c);
if (nativeName.isNotEmpty) {
- return runtimeCall('global.#', nativeName[0]);
+ return runtimeCall('global.#', [nativeName[0]]);
}
}
return _emitTopLevelName(c);
@@ -3321,7 +3321,8 @@
// Anonymous JS types do not have a corresponding concrete JS type so we
// have to use a helper to define them.
if (_isObjectLiteral(element)) {
- return runtimeCall('anonymousJSType(#)', js.escapedString(element.name));
+ return runtimeCall(
+ 'anonymousJSType(#)', [js.escapedString(element.name)]);
}
var jsName = _getJSNameWithoutGlobal(element);
if (jsName != null) {
@@ -4142,11 +4143,11 @@
if (conditionType is FunctionType &&
conditionType.parameters.isEmpty &&
conditionType.returnType == types.boolType) {
- jsCondition = runtimeCall('test(#())', jsCondition);
+ jsCondition = runtimeCall('test(#())', [jsCondition]);
} else if (conditionType != types.boolType) {
- jsCondition = runtimeCall('dassert(#)', jsCondition);
+ jsCondition = runtimeCall('dassert(#)', [jsCondition]);
} else if (isNullable(condition)) {
- jsCondition = runtimeCall('test(#)', jsCondition);
+ jsCondition = runtimeCall('test(#)', [jsCondition]);
}
return js.statement(' if (!#) #.assertFailed(#);', [
jsCondition,
@@ -4552,7 +4553,7 @@
if (expr == null) return null;
var jsExpr = _visitExpression(expr);
if (!isNullable(expr)) return jsExpr;
- return runtimeCall('notNull(#)', jsExpr);
+ return runtimeCall('notNull(#)', [jsExpr]);
}
JS.Expression _emitEqualityOperator(BinaryExpression node, Token op) {
@@ -5362,12 +5363,13 @@
@override
JS.Expression visitThrowExpression(ThrowExpression node) {
- return runtimeCall('throw(#)', _visitExpression(node.expression));
+ return runtimeCall('throw(#)', [_visitExpression(node.expression)]);
}
@override
JS.Expression visitRethrowExpression(RethrowExpression node) {
- return runtimeCall('rethrow(#)', _emitSimpleIdentifier(_rethrowParameter));
+ return runtimeCall(
+ 'rethrow(#)', [_emitSimpleIdentifier(_rethrowParameter)]);
}
/// Visits a statement, and ensures the resulting AST handles block scope
@@ -5774,7 +5776,7 @@
var jsExpr = _visitExpression(e);
parts.add(e.staticType == types.stringType && !isNullable(e)
? jsExpr
- : runtimeCall('str(#)', jsExpr));
+ : runtimeCall('str(#)', [jsExpr]));
}
}
if (parts.isEmpty) return js.string('');
@@ -6018,10 +6020,10 @@
}
if (node is AsExpression && CoercionReifier.isImplicit(node)) {
assert(node.staticType == types.boolType);
- return runtimeCall('dtest(#)', _visitExpression(node.expression));
+ return runtimeCall('dtest(#)', [_visitExpression(node.expression)]);
}
var result = _visitExpression(node);
- if (isNullable(node)) result = runtimeCall('test(#)', result);
+ if (isNullable(node)) result = runtimeCall('test(#)', [result]);
return result;
}
@@ -6290,7 +6292,7 @@
}
JS.Expression _throwUnsafe(String message) => runtimeCall(
- 'throw(Error(#))', js.escapedString("compile error: $message"));
+ 'throw(Error(#))', [js.escapedString("compile error: $message")]);
Null _unreachable(Object node) {
throw UnsupportedError('tried to generate an unreachable node: `$node`');
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index 619ed90..f18cc2e 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -202,34 +202,21 @@
///
/// For example:
///
- /// runtimeCall('asInt(#)', expr)
+ /// runtimeCall('asInt(#)', [<expr>])
///
/// Generates a JS AST representing:
///
/// dart.asInt(<expr>)
///
@protected
- JS.Expression runtimeCall(String code, [args]) {
- if (args != null) {
- var newArgs = <Object>[runtimeModule];
- if (args is Iterable) {
- newArgs.addAll(args);
- } else {
- newArgs.add(args);
- }
- args = newArgs;
- } else {
- args = runtimeModule;
- }
- return js.call('#.$code', args);
- }
+ JS.Expression runtimeCall(String code, [List<Object> args]) =>
+ js.call('#.$code', <Object>[runtimeModule, ...?args]);
/// Calls [runtimeCall] and uses `toStatement()` to convert the resulting
/// expression into a statement.
@protected
- JS.Statement runtimeStatement(String code, [args]) {
- return runtimeCall(code, args).toStatement();
- }
+ JS.Statement runtimeStatement(String code, [List<Object> args]) =>
+ runtimeCall(code, args).toStatement();
/// Emits a private name JS Symbol for [name] scoped to the Dart [library].
///
@@ -342,7 +329,7 @@
/// constant instance of a user-defined class stored in [expr].
@protected
JS.Expression canonicalizeConstObject(JS.Expression expr) =>
- cacheConst(runtimeCall('const(#)', expr));
+ cacheConst(runtimeCall('const(#)', [expr]));
/// Emits preamble for the module containing [libraries], and returns the
/// list of module items for further items to be added.
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index c65bf40..3413293 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -1546,7 +1546,7 @@
if (expr == null) return null;
var jsExpr = _visitExpression(expr);
if (!isNullable(expr)) return jsExpr;
- return runtimeCall('notNull(#)', jsExpr);
+ return runtimeCall('notNull(#)', [jsExpr]);
}
/// If the class has only factory constructors, and it can be mixed in,
@@ -1990,8 +1990,8 @@
Class c, String jsPeerName, List<JS.Statement> body) {
var className = _emitTopLevelName(c);
if (_typeRep.isPrimitive(c.rawType)) {
- body.add(
- runtimeStatement('definePrimitiveHashCode(#.prototype)', className));
+ body.add(runtimeStatement(
+ 'definePrimitiveHashCode(#.prototype)', [className]));
}
body.add(runtimeStatement(
'registerExtension(#, #)', [js.string(jsPeerName), className]));
@@ -2465,7 +2465,7 @@
// have to use a helper to define them.
if (isJSAnonymousType(c)) {
return runtimeCall(
- 'anonymousJSType(#)', js.escapedString(getLocalClassName(c)));
+ 'anonymousJSType(#)', [js.escapedString(getLocalClassName(c))]);
}
var jsName = _getJSNameWithoutGlobal(c);
if (jsName != null) {
@@ -3055,11 +3055,11 @@
if (node is AsExpression && node.isTypeError) {
assert(node.getStaticType(types) == types.boolType);
- return runtimeCall('dtest(#)', _visitExpression(node.operand));
+ return runtimeCall('dtest(#)', [_visitExpression(node.operand)]);
}
var result = _visitExpression(node);
- if (isNullable(node)) result = runtimeCall('test(#)', result);
+ if (isNullable(node)) result = runtimeCall('test(#)', [result]);
return result;
}
@@ -3179,11 +3179,11 @@
if (conditionType is FunctionType &&
conditionType.requiredParameterCount == 0 &&
conditionType.returnType == boolType) {
- jsCondition = runtimeCall('test(#())', jsCondition);
+ jsCondition = runtimeCall('test(#())', [jsCondition]);
} else if (conditionType != boolType) {
- jsCondition = runtimeCall('dassert(#)', jsCondition);
+ jsCondition = runtimeCall('dassert(#)', [jsCondition]);
} else if (isNullable(condition)) {
- jsCondition = runtimeCall('test(#)', jsCondition);
+ jsCondition = runtimeCall('test(#)', [jsCondition]);
}
return js.statement(' if (!#) #.assertFailed(#);', [
jsCondition,
@@ -4790,7 +4790,7 @@
}
parts.add(e.getStaticType(types) == types.stringType && !isNullable(e)
? jsExpr
- : runtimeCall('str(#)', jsExpr));
+ : runtimeCall('str(#)', [jsExpr]));
}
if (parts.isEmpty) return js.string('');
return JS.Expression.binary(parts, '+');
@@ -4926,7 +4926,7 @@
// TODO(jmesserly): fuse this with notNull check.
// TODO(jmesserly): this does not correctly distinguish user casts from
// required-for-soundness casts.
- return runtimeCall('asInt(#)', jsFrom);
+ return runtimeCall('asInt(#)', [jsFrom]);
}
// A no-op in JavaScript.
@@ -4954,7 +4954,7 @@
var typeRep = _emitType(type);
// If the type is a type literal expression in Dart code, wrap the raw
// runtime type in a "Type" instance.
- return _isInForeignJS ? typeRep : runtimeCall('wrapType(#)', typeRep);
+ return _isInForeignJS ? typeRep : runtimeCall('wrapType(#)', [typeRep]);
}
@override
@@ -4962,12 +4962,12 @@
@override
visitRethrow(Rethrow node) {
- return runtimeCall('rethrow(#)', _emitVariableRef(_rethrowParameter));
+ return runtimeCall('rethrow(#)', [_emitVariableRef(_rethrowParameter)]);
}
@override
visitThrow(Throw node) =>
- runtimeCall('throw(#)', _visitExpression(node.expression));
+ runtimeCall('throw(#)', [_visitExpression(node.expression)]);
@override
visitListLiteral(ListLiteral node) {
diff --git a/pkg/dev_compiler/pubspec.yaml b/pkg/dev_compiler/pubspec.yaml
index ea33a0b..7ca09fb 100644
--- a/pkg/dev_compiler/pubspec.yaml
+++ b/pkg/dev_compiler/pubspec.yaml
@@ -2,7 +2,7 @@
publish_to: none
environment:
- sdk: '>=2.1.0 <3.0.0'
+ sdk: '>=2.3.0 <3.0.0'
dependencies:
analyzer: any