[kernel] Update kernel encodings
* Add InstanceGetterInvocation for getter/field invocation in web
backends
* Add localFunction getter to LocalFunctionInvocation
* Remove isNot from EqualsCall and EqualsNull - the encoding didn't
carry its weight.
* Remove uses of Name.name
* Remove BottomType code from VM
TEST=existing
Change-Id: I99d05d35b9ef193d092cc151c99ad472dbd60834
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/188725
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 17d63df..3d43b0c 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -919,10 +919,8 @@
node, node.variable.parent, node.arguments, selector);
}
- TypeInformation _handleEqualsNull(ir.Expression node, ir.Expression operand,
- {bool isNot}) {
- assert(isNot != null);
- _potentiallyAddNullCheck(node, operand, isNot: isNot);
+ TypeInformation _handleEqualsNull(ir.Expression node, ir.Expression operand) {
+ _potentiallyAddNullCheck(node, operand);
return _types.boolType;
}
@@ -932,7 +930,7 @@
// receiver of the call to `==`, which doesn't happen in this case. Remove
// this when the ssa builder recognized `== null` directly.
_typeOfReceiver(node, node.expression);
- return _handleEqualsNull(node, node.expression, isNot: node.isNot);
+ return _handleEqualsNull(node, node.expression);
}
TypeInformation _handleMethodInvocation(
@@ -975,20 +973,22 @@
return type;
}
- TypeInformation _handleEqualsCall(ir.Expression node, ir.Expression left,
- TypeInformation leftType, ir.Expression right, TypeInformation rightType,
- {bool isNot}) {
- assert(isNot != null);
+ TypeInformation _handleEqualsCall(
+ ir.Expression node,
+ ir.Expression left,
+ TypeInformation leftType,
+ ir.Expression right,
+ TypeInformation rightType) {
// TODO(johnniwinther). This triggers the computation of the mask for the
// receiver of the call to `==`, which might not happen in this case. Remove
// this when the ssa builder recognized `== null` directly.
_typeOfReceiver(node, left);
if (_types.isNull(leftType)) {
// null == o
- return _handleEqualsNull(node, right, isNot: isNot);
+ return _handleEqualsNull(node, right);
} else if (_types.isNull(rightType)) {
// o == null
- return _handleEqualsNull(node, left, isNot: isNot);
+ return _handleEqualsNull(node, left);
}
Selector selector = Selector.binaryOperator('==');
ArgumentsTypes arguments = ArgumentsTypes([rightType], null);
@@ -1000,8 +1000,7 @@
TypeInformation visitEqualsCall(ir.EqualsCall node) {
TypeInformation leftType = visit(node.left);
TypeInformation rightType = visit(node.right);
- return _handleEqualsCall(node, node.left, leftType, node.right, rightType,
- isNot: node.isNot);
+ return _handleEqualsCall(node, node.left, leftType, node.right, rightType);
}
@override
@@ -1053,8 +1052,7 @@
ArgumentsTypes arguments = analyzeArguments(node.arguments);
if (selector.name == '==') {
return _handleEqualsCall(node, node.receiver, receiverType,
- node.arguments.positional.first, arguments.positional[0],
- isNot: false);
+ node.arguments.positional.first, arguments.positional[0]);
}
return _handleMethodInvocation(node, node.receiver, receiverType, selector,
@@ -1725,9 +1723,7 @@
}
}
- void _potentiallyAddNullCheck(ir.Expression node, ir.Expression receiver,
- {bool isNot}) {
- assert(isNot != null);
+ void _potentiallyAddNullCheck(ir.Expression node, ir.Expression receiver) {
if (!_accumulateIsChecks) return;
if (receiver is ir.VariableGet) {
Local local = _localsMap.getLocalVariable(receiver.variable);
@@ -1750,14 +1746,8 @@
node,
_closedWorld.commonElements.objectType,
excludeNull: true);
-
- if (isNot) {
- _setStateAfter(
- _state, stateAfterCheckWhenNotNull, stateAfterCheckWhenNull);
- } else {
- _setStateAfter(
- _state, stateAfterCheckWhenNull, stateAfterCheckWhenNotNull);
- }
+ _setStateAfter(
+ _state, stateAfterCheckWhenNull, stateAfterCheckWhenNotNull);
}
}
diff --git a/pkg/compiler/lib/src/ir/scope_visitor.dart b/pkg/compiler/lib/src/ir/scope_visitor.dart
index 1fa89f1..07e82b0 100644
--- a/pkg/compiler/lib/src/ir/scope_visitor.dart
+++ b/pkg/compiler/lib/src/ir/scope_visitor.dart
@@ -1107,12 +1107,8 @@
EvaluationComplexity visitLocalFunctionInvocation(
ir.LocalFunctionInvocation node) {
if (node.arguments.types.isNotEmpty) {
- assert(
- node.variable.parent is ir.LocalFunction,
- "Unexpected variable in local function invocation ${node} "
- "(${node.runtimeType}).");
VariableUse usage =
- new VariableUse.localTypeArgument(node.variable.parent, node);
+ new VariableUse.localTypeArgument(node.localFunction, node);
visitNodesInContext(node.arguments.types, usage);
}
visitArguments(node.arguments);
@@ -1145,7 +1141,7 @@
EvaluationComplexity visitPropertyGet(ir.PropertyGet node) {
node.receiver = _handleExpression(node.receiver);
EvaluationComplexity complexity = _lastExpressionComplexity;
- if (complexity.isConstant && node.name.name == 'length') {
+ if (complexity.isConstant && node.name.text == 'length') {
return _evaluateImplicitConstant(node);
}
return const EvaluationComplexity.lazy();
@@ -1155,7 +1151,7 @@
EvaluationComplexity visitInstanceGet(ir.InstanceGet node) {
node.receiver = _handleExpression(node.receiver);
EvaluationComplexity complexity = _lastExpressionComplexity;
- if (complexity.isConstant && node.name.name == 'length') {
+ if (complexity.isConstant && node.name.text == 'length') {
return _evaluateImplicitConstant(node);
}
return const EvaluationComplexity.lazy();
@@ -1171,7 +1167,7 @@
EvaluationComplexity visitDynamicGet(ir.DynamicGet node) {
node.receiver = _handleExpression(node.receiver);
EvaluationComplexity complexity = _lastExpressionComplexity;
- if (complexity.isConstant && node.name.name == 'length') {
+ if (complexity.isConstant && node.name.text == 'length') {
return _evaluateImplicitConstant(node);
}
return const EvaluationComplexity.lazy();
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 7ecbbe2..8dcffab 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -833,8 +833,7 @@
void handleEqualsCall(ir.Expression left, ir.DartType leftType,
ir.Expression right, ir.DartType rightType, ir.Member interfaceTarget) {}
- void _registerEqualsNull(TypeMap afterInvocation, ir.Expression expression,
- {bool isNot: false}) {
+ void _registerEqualsNull(TypeMap afterInvocation, ir.Expression expression) {
if (expression is ir.VariableGet &&
!_invalidatedVariables.contains(expression.variable)) {
// If `expression == null` is true, we promote the type of the
@@ -845,13 +844,8 @@
isTrue: false);
TypeMap ofItsDeclaredType = afterInvocation
.promote(expression.variable, expression.variable.type, isTrue: true);
- if (isNot) {
- typeMapWhenTrue = ofItsDeclaredType;
- typeMapWhenFalse = notOfItsDeclaredType;
- } else {
- typeMapWhenTrue = notOfItsDeclaredType;
- typeMapWhenFalse = ofItsDeclaredType;
- }
+ typeMapWhenTrue = notOfItsDeclaredType;
+ typeMapWhenFalse = ofItsDeclaredType;
}
}
@@ -968,7 +962,7 @@
@override
ir.DartType visitEqualsNull(ir.EqualsNull node) {
visitNode(node.expression);
- _registerEqualsNull(typeMap, node.expression, isNot: node.isNot);
+ _registerEqualsNull(typeMap, node.expression);
return super.visitEqualsNull(node);
}
@@ -984,7 +978,7 @@
@override
ir.DartType visitLocalFunctionInvocation(ir.LocalFunctionInvocation node) {
ArgumentTypes argumentTypes = _visitArguments(node.arguments);
- ir.FunctionDeclaration localFunction = node.variable.parent;
+ ir.FunctionDeclaration localFunction = node.localFunction;
ir.DartType returnType = super.visitLocalFunctionInvocation(node);
handleLocalFunctionInvocation(
node, localFunction, argumentTypes, returnType);
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index ba0057a..7a42127 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -2121,7 +2121,7 @@
break;
} else if (node is ir.Field) {
// Add the field name for closures in field initializers.
- String name = node.name?.name;
+ String name = node.name?.text;
if (name != null) parts.add(name);
}
current = current.parent;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index ef086e0..083df95 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -5277,9 +5277,7 @@
}
void _handleEquals(ir.Expression node, ir.Expression left,
- HInstruction leftInstruction, HInstruction rightInstruction,
- {bool isNot}) {
- assert(isNot != null);
+ HInstruction leftInstruction, HInstruction rightInstruction) {
_pushDynamicInvocation(
node,
_getStaticType(left),
@@ -5288,10 +5286,6 @@
<HInstruction>[leftInstruction, rightInstruction],
const <DartType>[],
_sourceInformationBuilder.buildCall(left, node));
- if (isNot) {
- push(new HNot(popBoolified(), _abstractValueDomain.boolType)
- ..sourceInformation = _sourceInformationBuilder.buildUnary(node));
- }
}
@override
@@ -5299,8 +5293,7 @@
node.expression.accept(this);
HInstruction receiverInstruction = pop();
return _handleEquals(node, node.expression, receiverInstruction,
- graph.addConstantNull(closedWorld),
- isNot: node.isNot);
+ graph.addConstantNull(closedWorld));
}
@override
@@ -5309,8 +5302,7 @@
HInstruction leftInstruction = pop();
node.right.accept(this);
HInstruction rightInstruction = pop();
- return _handleEquals(node, node.left, leftInstruction, rightInstruction,
- isNot: node.isNot);
+ return _handleEquals(node, node.left, leftInstruction, rightInstruction);
}
HInterceptor _interceptorFor(
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index b1341b9..faae4a6 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -4369,19 +4369,19 @@
@override
js_ast.Expression visitDynamicGet(DynamicGet node) {
- return _emitPropertyGet(node.receiver, null, node.name.name);
+ return _emitPropertyGet(node.receiver, null, node.name.text);
}
@override
js_ast.Expression visitInstanceGet(InstanceGet node) {
return _emitPropertyGet(
- node.receiver, node.interfaceTarget, node.name.name);
+ node.receiver, node.interfaceTarget, node.name.text);
}
@override
js_ast.Expression visitInstanceTearOff(InstanceTearOff node) {
return _emitPropertyGet(
- node.receiver, node.interfaceTarget, node.name.name);
+ node.receiver, node.interfaceTarget, node.name.text);
}
@override
@@ -4554,6 +4554,13 @@
}
@override
+ js_ast.Expression visitInstanceGetterInvocation(
+ InstanceGetterInvocation node) {
+ return _emitMethodCall(
+ node.receiver, node.interfaceTarget, node.arguments, node);
+ }
+
+ @override
js_ast.Expression visitLocalFunctionInvocation(LocalFunctionInvocation node) {
return _emitMethodCall(
VariableGet(node.variable)..fileOffset = node.fileOffset,
@@ -4565,13 +4572,13 @@
@override
js_ast.Expression visitEqualsCall(EqualsCall node) {
return _emitEqualityOperator(node.left, node.interfaceTarget, node.right,
- negated: node.isNot);
+ negated: false);
}
@override
js_ast.Expression visitEqualsNull(EqualsNull node) {
return _emitCoreIdenticalCall([node.expression, NullLiteral()],
- negated: node.isNot);
+ negated: false);
}
@override
@@ -4591,12 +4598,10 @@
/// list and the element type is known to be invariant so it can skip the
/// type check.
bool isNativeListInvariantAdd(InvocationExpression node) {
- if (node is MethodInvocation &&
- node.isInvariant &&
- node.name.name == 'add') {
+ Expression receiver;
+ if (receiver != null && node.name.text == 'add') {
// The call to add is marked as invariant, so the type check on the
// parameter to add is not needed.
- var receiver = node.receiver;
if (receiver is VariableGet &&
receiver.variable.isFinal &&
!receiver.variable.isLate) {
@@ -5560,6 +5565,13 @@
return _emitEqualityOperator(operand.receiver, operand.interfaceTarget,
operand.arguments.positional[0],
negated: true);
+ } else if (operand is EqualsCall) {
+ return _emitEqualityOperator(
+ operand.left, operand.interfaceTarget, operand.right,
+ negated: true);
+ } else if (operand is EqualsNull) {
+ return _emitCoreIdenticalCall([operand.expression, NullLiteral()],
+ negated: true);
} else if (operand is StaticInvocation &&
operand.target == _coreTypes.identicalProcedure) {
return _emitCoreIdenticalCall(operand.arguments.positional,
diff --git a/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart b/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart
index 413ae5e..933dce6 100644
--- a/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/scope_offset_test.dart
@@ -81,7 +81,7 @@
member.isForwardingStub ||
member.stubKind == ProcedureStubKind.ConcreteMixinStub
: (member is Field)
- ? member.name.name.contains(redirectingName)
+ ? member.name.text.contains(redirectingName)
: false;
if (!noBreakPointPossible) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index a759519..5b0237b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -609,11 +609,9 @@
Expression left = transform(node.left);
Expression right = transform(node.right);
if (_isNull(left)) {
- return new EqualsNull(right, isNot: node.isNot)
- ..fileOffset = node.fileOffset;
+ return new EqualsNull(right)..fileOffset = node.fileOffset;
} else if (_isNull(right)) {
- return new EqualsNull(left, isNot: node.isNot)
- ..fileOffset = node.fileOffset;
+ return new EqualsNull(left)..fileOffset = node.fileOffset;
}
node.left = left..parent = node;
node.right = right..parent = node;
@@ -1931,13 +1929,12 @@
return unevaluated(
node,
new EqualsCall(extract(left), extract(right),
- isNot: node.isNot,
functionType: node.functionType,
interfaceTarget: node.interfaceTarget)
..fileOffset = node.fileOffset);
}
- return _handleEquals(node, left, right, isNot: node.isNot);
+ return _handleEquals(node, left, right);
}
@override
@@ -1946,18 +1943,14 @@
if (expression is AbortConstant) return expression;
if (shouldBeUnevaluated) {
- return unevaluated(
- node,
- new EqualsNull(extract(expression), isNot: node.isNot)
- ..fileOffset = node.fileOffset);
+ return unevaluated(node,
+ new EqualsNull(extract(expression))..fileOffset = node.fileOffset);
}
- return _handleEquals(node, expression, nullConstant, isNot: node.isNot);
+ return _handleEquals(node, expression, nullConstant);
}
- Constant _handleEquals(Expression node, Constant left, Constant right,
- {bool isNot}) {
- assert(isNot != null);
+ Constant _handleEquals(Expression node, Constant left, Constant right) {
if (left is NullConstant ||
left is BoolConstant ||
left is IntConstant ||
@@ -1966,17 +1959,7 @@
right is NullConstant) {
// [DoubleConstant] uses [identical] to determine equality, so we need
// to take the special cases into account.
- Constant result =
- doubleSpecialCases(left, right) ?? makeBoolConstant(left == right);
- if (isNot) {
- if (result == trueConstant) {
- result = falseConstant;
- } else {
- assert(result == falseConstant);
- result = trueConstant;
- }
- }
- return result;
+ return doubleSpecialCases(left, right) ?? makeBoolConstant(left == right);
} else {
return createErrorConstant(
node,
@@ -1993,7 +1976,7 @@
// parsed as `!(a == b)` it is handled implicitly through ==.
if (arguments.length == 1 && op == '==') {
final Constant right = arguments[0];
- return _handleEquals(node, receiver, right, isNot: false);
+ return _handleEquals(node, receiver, right);
}
// This is a white-listed set of methods we need to support on constants.
@@ -2466,7 +2449,7 @@
return createErrorConstant(
node,
templateConstEvalInvalidStaticInvocation
- .withArguments(target.name.name));
+ .withArguments(target.name.text));
} else {
return createInvalidExpressionConstant(
node, 'No support for ${target.runtimeType} in a static tear-off.');
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index be077f9..3b061ee 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -94,6 +94,90 @@
}
@override
+ ExpressionInferenceResult visitDynamicGet(
+ DynamicGet node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitInstanceGet(
+ InstanceGet node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitInstanceTearOff(
+ InstanceTearOff node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitDynamicInvocation(
+ DynamicInvocation node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitDynamicSet(
+ DynamicSet node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitEqualsCall(
+ EqualsCall node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitEqualsNull(
+ EqualsNull node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitFunctionInvocation(
+ FunctionInvocation node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitInstanceInvocation(
+ InstanceInvocation node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitInstanceGetterInvocation(
+ InstanceGetterInvocation node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitInstanceSet(
+ InstanceSet node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitLocalFunctionInvocation(
+ LocalFunctionInvocation node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitStaticTearOff(
+ StaticTearOff node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
+ ExpressionInferenceResult visitFunctionTearOff(
+ FunctionTearOff node, DartType typeContext) {
+ return _unhandledExpression(node, typeContext);
+ }
+
+ @override
ExpressionInferenceResult visitFileUriExpression(
FileUriExpression node, DartType typeContext) {
return _unhandledExpression(node, typeContext);
@@ -3747,12 +3831,15 @@
if (inferrer.useNewMethodInvocationEncoding) {
if (_isNull(right)) {
- equals = new EqualsNull(left, isNot: isNot)..fileOffset = fileOffset;
+ equals = new EqualsNull(left)..fileOffset = fileOffset;
} else if (_isNull(left)) {
- equals = new EqualsNull(rightResult.expression, isNot: isNot)
+ equals = new EqualsNull(rightResult.expression)
..fileOffset = fileOffset;
}
if (equals != null) {
+ if (isNot) {
+ equals = new Not(equals)..fileOffset = fileOffset;
+ }
inferrer.flowAnalysis.equalityOp_end(
equals, rightResult.expression, rightResult.inferredType,
notEqual: isNot);
@@ -3798,10 +3885,11 @@
FunctionType functionType =
inferrer.getFunctionType(equalsTarget, leftType);
equals = new EqualsCall(left, right,
- isNot: isNot,
- functionType: functionType,
- interfaceTarget: equalsTarget.member)
+ functionType: functionType, interfaceTarget: equalsTarget.member)
..fileOffset = fileOffset;
+ if (isNot) {
+ equals = new Not(equals)..fileOffset = fileOffset;
+ }
} else {
assert(equalsTarget.isNever);
FunctionType functionType = new FunctionType([const DynamicType()],
@@ -3812,8 +3900,11 @@
instrumented: false)
.member;
equals = new EqualsCall(left, right,
- isNot: isNot, functionType: functionType, interfaceTarget: target)
+ functionType: functionType, interfaceTarget: target)
..fileOffset = fileOffset;
+ if (isNot) {
+ equals = new Not(equals)..fileOffset = fileOffset;
+ }
}
} else {
equals = new MethodInvocation(
@@ -5708,7 +5799,7 @@
node.fileOffset, receiver, receiverType, node.name, typeContext,
isThisReceiver: node.receiver is ThisExpression);
inferrer.flowAnalysis.propertyGet(
- node, node.receiver, node.name.name, readResult.inferredType);
+ node, node.receiver, node.name.text, readResult.inferredType);
ExpressionInferenceResult expressionInferenceResult =
inferrer.createNullAwareExpressionInferenceResult(
readResult.inferredType, readResult.expression, nullAwareGuards);
@@ -6867,97 +6958,6 @@
}
}
}
-
- @override
- ExpressionInferenceResult visitDynamicGet(
- DynamicGet node, DartType typeContext) {
- // TODO: implement visitDynamicGet
- throw new UnimplementedError();
- }
-
- @override
- ExpressionInferenceResult visitInstanceGet(
- InstanceGet node, DartType typeContext) {
- // TODO: implement visitInstanceGet
- throw new UnimplementedError();
- }
-
- @override
- ExpressionInferenceResult visitInstanceTearOff(
- InstanceTearOff node, DartType typeContext) {
- // TODO: implement visitInstanceTearOff
- throw new UnimplementedError();
- }
-
- @override
- ExpressionInferenceResult visitDynamicInvocation(
- DynamicInvocation node, DartType typeContext) {
- // TODO: implement visitDynamicInvocation
- throw new UnimplementedError();
- }
-
- @override
- ExpressionInferenceResult visitDynamicSet(
- DynamicSet node, DartType typeContext) {
- // TODO: implement visitDynamicSet
- throw new UnimplementedError();
- }
-
- @override
- ExpressionInferenceResult visitEqualsCall(
- EqualsCall node, DartType typeContext) {
- // TODO: implement visitEqualsCall
- throw new UnimplementedError();
- }
-
- @override
- ExpressionInferenceResult visitEqualsNull(
- EqualsNull node, DartType typeContext) {
- // TODO: implement visitEqualsNull
- throw new UnimplementedError();
- }
-
- @override
- ExpressionInferenceResult visitFunctionInvocation(
- FunctionInvocation node, DartType typeContext) {
- // TODO: implement visitFunctionInvocation
- throw new UnimplementedError();
- }
-
- @override
- ExpressionInferenceResult visitInstanceInvocation(
- InstanceInvocation node, DartType typeContext) {
- // TODO: implement visitInstanceInvocation
- throw new UnimplementedError();
- }
-
- @override
- ExpressionInferenceResult visitInstanceSet(
- InstanceSet node, DartType typeContext) {
- // TODO: implement visitInstanceSet
- throw new UnimplementedError();
- }
-
- @override
- ExpressionInferenceResult visitLocalFunctionInvocation(
- LocalFunctionInvocation node, DartType typeContext) {
- // TODO: implement visitLocalFunctionInvocation
- throw new UnimplementedError();
- }
-
- @override
- ExpressionInferenceResult visitStaticTearOff(
- StaticTearOff node, DartType typeContext) {
- // TODO: implement visitStaticTearOff
- throw new UnimplementedError();
- }
-
- @override
- ExpressionInferenceResult visitFunctionTearOff(
- FunctionTearOff node, DartType arg) {
- // TODO: implement visitFunctionTearOff
- throw new UnimplementedError();
- }
}
class ForInResult {
diff --git a/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart b/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
index 1f87bde..0e2ea27 100644
--- a/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/late_lowering.dart
@@ -106,8 +106,7 @@
new ConditionalExpression(
useNewMethodInvocationEncoding
? (new EqualsNull(
- new VariableGet(variable)..fileOffset = fileOffset,
- isNot: false)
+ new VariableGet(variable)..fileOffset = fileOffset)
..fileOffset = fileOffset)
: new MethodInvocation(
new VariableGet(variable)..fileOffset = fileOffset,
@@ -261,8 +260,7 @@
new ConditionalExpression(
useNewMethodInvocationEncoding
? (new EqualsNull(
- new VariableGet(variable)..fileOffset = fileOffset,
- isNot: false)
+ new VariableGet(variable)..fileOffset = fileOffset)
..fileOffset = fileOffset)
: new MethodInvocation(
new VariableGet(variable)..fileOffset = fileOffset,
@@ -278,8 +276,7 @@
useNewMethodInvocationEncoding
? (new EqualsNull(
createVariableRead(needsPromotion: false)
- ..fileOffset = fileOffset,
- isNot: false)
+ ..fileOffset = fileOffset)
..fileOffset = fileOffset)
: new MethodInvocation(
createVariableRead(needsPromotion: false)
@@ -381,8 +378,7 @@
new ConditionalExpression(
useNewMethodInvocationEncoding
? (new EqualsNull(
- new VariableGet(variable)..fileOffset = fileOffset,
- isNot: false)
+ new VariableGet(variable)..fileOffset = fileOffset)
..fileOffset = fileOffset)
: new MethodInvocation(
new VariableGet(variable)..fileOffset = fileOffset,
@@ -540,8 +536,7 @@
// }
return new IfStatement(
useNewMethodInvocationEncoding
- ? (new EqualsNull(createVariableRead()..fileOffset = fileOffset,
- isNot: false)
+ ? (new EqualsNull(createVariableRead()..fileOffset = fileOffset)
..fileOffset = fileOffset)
: new MethodInvocation(
createVariableRead()..fileOffset = fileOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
index 0866c33..ac5f466 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
@@ -946,22 +946,22 @@
Expression _createEqualsNull(Expression expression, {bool notEquals: false}) {
assert(expression != null);
assert(expression.fileOffset != TreeNode.noOffset);
+ Expression check;
if (useNewMethodInvocationEncoding) {
- return new EqualsNull(expression, isNot: notEquals)
- ..fileOffset = expression.fileOffset;
+ check = new EqualsNull(expression)..fileOffset = expression.fileOffset;
} else {
- Expression check = new MethodInvocation(
+ check = new MethodInvocation(
expression,
new Name('=='),
new Arguments(
[new NullLiteral()..fileOffset = expression.fileOffset]),
_objectEquals)
..fileOffset = expression.fileOffset;
- if (notEquals) {
- check = new Not(check)..fileOffset = expression.fileOffset;
- }
- return check;
}
+ if (notEquals) {
+ check = new Not(check)..fileOffset = expression.fileOffset;
+ }
+ return check;
}
Expression _createIndexSet(int fileOffset, Expression receiver,
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index d70f4c1..d01bde9 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -738,8 +738,7 @@
Expression nullCheck;
// TODO(johnniwinther): Avoid null-check for non-nullable expressions.
if (useNewMethodInvocationEncoding) {
- nullCheck = new EqualsNull(new VariableGet(t)..fileOffset = fileOffset,
- isNot: false)
+ nullCheck = new EqualsNull(new VariableGet(t)..fileOffset = fileOffset)
..fileOffset = fileOffset;
} else {
nullCheck = new MethodInvocation(
@@ -2910,7 +2909,8 @@
..fileOffset = fileOffset;
} else if (receiver is VariableGet) {
VariableDeclaration variable = receiver.variable;
- if (variable.parent is FunctionDeclaration) {
+ TreeNode parent = variable.parent;
+ if (parent is FunctionDeclaration) {
assert(inferredFunctionType != unknownFunction,
"Unknown function type for local function invocation.");
expression = new LocalFunctionInvocation(variable, arguments,
@@ -3403,7 +3403,7 @@
resultType: calleeType, interfaceTarget: originalTarget)
..fileOffset = fileOffset;
flowAnalysis.propertyGet(
- originalPropertyGet, originalReceiver, originalName.name, calleeType);
+ originalPropertyGet, originalReceiver, originalName.text, calleeType);
} else {
originalPropertyGet =
new PropertyGet(originalReceiver, originalName, originalTarget)
@@ -4246,7 +4246,7 @@
Expression createEqualsNull(
int fileOffset, Expression left, Member equalsMember) {
if (useNewMethodInvocationEncoding) {
- return new EqualsNull(left, isNot: false)..fileOffset = fileOffset;
+ return new EqualsNull(left)..fileOffset = fileOffset;
} else {
return new MethodInvocation(
left,
diff --git a/pkg/front_end/lib/src/testing/id_extractor.dart b/pkg/front_end/lib/src/testing/id_extractor.dart
index ebee200..e07b415 100644
--- a/pkg/front_end/lib/src/testing/id_extractor.dart
+++ b/pkg/front_end/lib/src/testing/id_extractor.dart
@@ -200,9 +200,9 @@
}
_visitInvocation(Expression node, Name name) {
- if (name.name == '[]') {
+ if (name.text == '[]') {
computeForNode(node, computeDefaultNodeId(node));
- } else if (name.name == '[]=') {
+ } else if (name.text == '[]=') {
computeForNode(node, createUpdateId(node));
} else {
if (node.fileOffset != TreeNode.noOffset) {
@@ -221,7 +221,7 @@
// This is an invocation of a named local function.
computeForNode(node, createInvokeId(node.receiver));
node.arguments.accept(this);
- } else if (node.name.name == '==' &&
+ } else if (node.name.text == '==' &&
receiver is VariableGet &&
receiver.variable.name == null) {
// This is a desugared `?.`.
@@ -273,6 +273,12 @@
}
@override
+ visitInstanceGetterInvocation(InstanceGetterInvocation node) {
+ _visitInvocation(node, node.name);
+ super.visitInstanceGetterInvocation(node);
+ }
+
+ @override
visitLoadLibrary(LoadLibrary node) {
computeForNode(node, createInvokeId(node));
}
diff --git a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.expect b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.expect
index b452cdb..ce47bb9 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.expect
@@ -171,7 +171,7 @@
}
static method expect(dynamic expected, dynamic actual) → dynamic {
self::enableRead = true;
- if(expected !={core::Object::==}{(core::Object*) →* core::bool*} actual)
+ if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
throw "Expected ${expected}, ${actual}";
}
diff --git a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.transformed.expect b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.transformed.expect
index 7462ff3..25ceba5 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/getter_call.dart.weak.transformed.expect
@@ -171,7 +171,7 @@
}
static method expect(dynamic expected, dynamic actual) → dynamic {
self::enableRead = true;
- if(expected !={core::Object::==}{(core::Object*) →* core::bool*} actual)
+ if(!(expected =={core::Object::==}{(core::Object*) →* core::bool*} actual))
throw "Expected ${expected}, ${actual}";
}
@@ -204,4 +204,4 @@
Evaluated: InstanceInvocation @ org-dartlang-testcase:///getter_call.dart:160:10 -> IntConstant(-23)
Evaluated: InstanceInvocation @ org-dartlang-testcase:///getter_call.dart:161:10 -> IntConstant(-11)
Evaluated: InstanceInvocation @ org-dartlang-testcase:///getter_call.dart:162:10 -> IntConstant(-11)
-Extra constant evaluation: evaluated: 321, effectively constant: 17
+Extra constant evaluation: evaluated: 322, effectively constant: 17
diff --git a/pkg/front_end/testcases/none/equals.dart.strong.expect b/pkg/front_end/testcases/none/equals.dart.strong.expect
index 905a90a..3c8e61d 100644
--- a/pkg/front_end/testcases/none/equals.dart.strong.expect
+++ b/pkg/front_end/testcases/none/equals.dart.strong.expect
@@ -129,347 +129,347 @@
static method test<T1 extends core::Function = core::Function, T2 extends (core::int) → core::int = (core::int) → core::int>(core::Object o, core::Object nonNullableObject, core::Object? nullableObject, self::Class<core::String> nonNullableClass, self::Class<core::String>? nullableClass, dynamic dyn, Never never, Never? nullableNever, Null nullTypedValue, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
core::print("EqualsNull (literal null)");
null == null;
- null != null;
+ !(null == null);
nonNullableObject == null;
- nonNullableObject != null;
+ !(nonNullableObject == null);
nonNullableObject == null;
- nonNullableObject != null;
+ !(nonNullableObject == null);
nullableObject == null;
- nullableObject != null;
+ !(nullableObject == null);
nullableObject == null;
- nullableObject != null;
+ !(nullableObject == null);
nullableClass == null;
- nullableClass != null;
+ !(nullableClass == null);
nullableClass == null;
- nullableClass != null;
+ !(nullableClass == null);
nonNullableClass == null;
- nonNullableClass != null;
+ !(nonNullableClass == null);
nonNullableClass == null;
- nonNullableClass != null;
+ !(nonNullableClass == null);
dyn == null;
- dyn != null;
+ !(dyn == null);
dyn == null;
- dyn != null;
+ !(dyn == null);
never == null;
- never != null;
+ !(never == null);
never == null;
- never != null;
+ !(never == null);
nullableNever == null;
- nullableNever != null;
+ !(nullableNever == null);
nullableNever == null;
- nullableNever != null;
+ !(nullableNever == null);
nullTypedValue == null;
- nullTypedValue != null;
+ !(nullTypedValue == null);
nullTypedValue == null;
- nullTypedValue != null;
+ !(nullTypedValue == null);
nonNullableFunction == null;
- nonNullableFunction != null;
+ !(nonNullableFunction == null);
nonNullableFunction == null;
- nonNullableFunction != null;
+ !(nonNullableFunction == null);
nullableFunction == null;
- nullableFunction != null;
+ !(nullableFunction == null);
nullableFunction == null;
- nullableFunction != null;
+ !(nullableFunction == null);
nonNullableFunctionType == null;
- nonNullableFunctionType != null;
+ !(nonNullableFunctionType == null);
nonNullableFunctionType == null;
- nonNullableFunctionType != null;
+ !(nonNullableFunctionType == null);
nullableFunctionType == null;
- nullableFunctionType != null;
+ !(nullableFunctionType == null);
nullableFunctionType == null;
- nullableFunctionType != null;
+ !(nullableFunctionType == null);
nonNullableTypeVariable1 == null;
- nonNullableTypeVariable1 != null;
+ !(nonNullableTypeVariable1 == null);
nonNullableTypeVariable1 == null;
- nonNullableTypeVariable1 != null;
+ !(nonNullableTypeVariable1 == null);
nullableTypeVariable1 == null;
- nullableTypeVariable1 != null;
+ !(nullableTypeVariable1 == null);
nullableTypeVariable1 == null;
- nullableTypeVariable1 != null;
+ !(nullableTypeVariable1 == null);
nonNullableTypeVariable2 == null;
- nonNullableTypeVariable2 != null;
+ !(nonNullableTypeVariable2 == null);
nonNullableTypeVariable2 == null;
- nonNullableTypeVariable2 != null;
+ !(nonNullableTypeVariable2 == null);
nullableTypeVariable2 == null;
- nullableTypeVariable2 != null;
+ !(nullableTypeVariable2 == null);
nullableTypeVariable2 == null;
- nullableTypeVariable2 != null;
+ !(nullableTypeVariable2 == null);
(let final Never #t1 = invalid-expression "pkg/front_end/testcases/none/equals.dart:115:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() == null;
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
- (let final Never #t2 = invalid-expression "pkg/front_end/testcases/none/equals.dart:116:26: Error: Too few positional arguments: 1 required, 0 given.
+ !((let final Never #t2 = invalid-expression "pkg/front_end/testcases/none/equals.dart:116:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() != null;
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
(let final Never #t3 = invalid-expression "pkg/front_end/testcases/none/equals.dart:117:34: Error: Too few positional arguments: 1 required, 0 given.
null == nonNullableClass.method();
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
- (let final Never #t4 = invalid-expression "pkg/front_end/testcases/none/equals.dart:118:34: Error: Too few positional arguments: 1 required, 0 given.
+ !((let final Never #t4 = invalid-expression "pkg/front_end/testcases/none/equals.dart:118:34: Error: Too few positional arguments: 1 required, 0 given.
null != nonNullableClass.method();
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
core::print("EqualsNull (constant null)");
(#C1) == null;
- (#C1) != null;
+ !((#C1) == null);
nonNullableObject == null;
- nonNullableObject != null;
+ !(nonNullableObject == null);
nonNullableObject == null;
- nonNullableObject != null;
+ !(nonNullableObject == null);
nullableObject == null;
- nullableObject != null;
+ !(nullableObject == null);
nullableObject == null;
- nullableObject != null;
+ !(nullableObject == null);
nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t5 = invalid-expression "pkg/front_end/testcases/none/equals.dart:134:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nonNullableClass == nullValue;
^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
- nonNullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t6 = invalid-expression "pkg/front_end/testcases/none/equals.dart:135:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+ !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t6 = invalid-expression "pkg/front_end/testcases/none/equals.dart:135:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nonNullableClass != nullValue;
- ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+ ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
nonNullableClass == null;
- nonNullableClass != null;
+ !(nonNullableClass == null);
nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t7 = invalid-expression "pkg/front_end/testcases/none/equals.dart:139:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nullableClass == nullValue;
^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
- nullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t8 = invalid-expression "pkg/front_end/testcases/none/equals.dart:140:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+ !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t8 = invalid-expression "pkg/front_end/testcases/none/equals.dart:140:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nullableClass != nullValue;
- ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+ ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
nullableClass == null;
- nullableClass != null;
+ !(nullableClass == null);
dyn == null;
- dyn != null;
+ !(dyn == null);
dyn == null;
- dyn != null;
+ !(dyn == null);
never == null;
- never != null;
+ !(never == null);
never == null;
- never != null;
+ !(never == null);
nullableNever == null;
- nullableNever != null;
+ !(nullableNever == null);
nullableNever == null;
- nullableNever != null;
+ !(nullableNever == null);
nullTypedValue == null;
- nullTypedValue != null;
+ !(nullTypedValue == null);
nullTypedValue == null;
- nullTypedValue != null;
+ !(nullTypedValue == null);
nonNullableFunction == null;
- nonNullableFunction != null;
+ !(nonNullableFunction == null);
nonNullableFunction == null;
- nonNullableFunction != null;
+ !(nonNullableFunction == null);
nullableFunction == null;
- nullableFunction != null;
+ !(nullableFunction == null);
nullableFunction == null;
- nullableFunction != null;
+ !(nullableFunction == null);
nonNullableFunctionType == null;
- nonNullableFunctionType != null;
+ !(nonNullableFunctionType == null);
nonNullableFunctionType == null;
- nonNullableFunctionType != null;
+ !(nonNullableFunctionType == null);
nullableFunctionType == null;
- nullableFunctionType != null;
+ !(nullableFunctionType == null);
nullableFunctionType == null;
- nullableFunctionType != null;
+ !(nullableFunctionType == null);
nonNullableTypeVariable1 == null;
- nonNullableTypeVariable1 != null;
+ !(nonNullableTypeVariable1 == null);
nonNullableTypeVariable1 == null;
- nonNullableTypeVariable1 != null;
+ !(nonNullableTypeVariable1 == null);
nullableTypeVariable1 == null;
- nullableTypeVariable1 != null;
+ !(nullableTypeVariable1 == null);
nullableTypeVariable1 == null;
- nullableTypeVariable1 != null;
+ !(nullableTypeVariable1 == null);
nonNullableTypeVariable2 == null;
- nonNullableTypeVariable2 != null;
+ !(nonNullableTypeVariable2 == null);
nonNullableTypeVariable2 == null;
- nonNullableTypeVariable2 != null;
+ !(nonNullableTypeVariable2 == null);
nullableTypeVariable2 == null;
- nullableTypeVariable2 != null;
+ !(nullableTypeVariable2 == null);
nullableTypeVariable2 == null;
- nullableTypeVariable2 != null;
+ !(nullableTypeVariable2 == null);
(let final Never #t9 = invalid-expression "pkg/front_end/testcases/none/equals.dart:204:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() == nullValue;
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
- (let final Never #t10 = invalid-expression "pkg/front_end/testcases/none/equals.dart:205:26: Error: Too few positional arguments: 1 required, 0 given.
+ !((let final Never #t10 = invalid-expression "pkg/front_end/testcases/none/equals.dart:205:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() != nullValue;
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
(let final Never #t11 = invalid-expression "pkg/front_end/testcases/none/equals.dart:206:39: Error: Too few positional arguments: 1 required, 0 given.
nullValue == nonNullableClass.method();
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
- (let final Never #t12 = invalid-expression "pkg/front_end/testcases/none/equals.dart:207:39: Error: Too few positional arguments: 1 required, 0 given.
+ !((let final Never #t12 = invalid-expression "pkg/front_end/testcases/none/equals.dart:207:39: Error: Too few positional arguments: 1 required, 0 given.
nullValue != nonNullableClass.method();
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
core::print("EqualsCall");
nonNullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nonNullableObject !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nonNullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableObject);
nonNullableObject =={core::Object::==}{(core::Object) → core::bool} o;
- nonNullableObject !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nonNullableObject =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
- o !={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableObject);
nullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nullableObject !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableObject;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableObject;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableObject);
nullableObject =={core::Object::==}{(core::Object) → core::bool} o;
- nullableObject !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nullableObject =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullableObject;
- o !={core::Object::==}{(core::Object) → core::bool} nullableObject;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableObject);
nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
- nonNullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
+ !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableClass);
nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t13 = invalid-expression "pkg/front_end/testcases/none/equals.dart:233:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nonNullableClass == o;
^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
- nonNullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t14 = invalid-expression "pkg/front_end/testcases/none/equals.dart:234:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+ !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t14 = invalid-expression "pkg/front_end/testcases/none/equals.dart:234:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nonNullableClass != o;
- ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+ ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
o =={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
- o !={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableClass);
nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
- nullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
+ !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableClass;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableClass;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableClass);
nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t15 = invalid-expression "pkg/front_end/testcases/none/equals.dart:242:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nullableClass == o;
^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
- nullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t16 = invalid-expression "pkg/front_end/testcases/none/equals.dart:243:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+ !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t16 = invalid-expression "pkg/front_end/testcases/none/equals.dart:243:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nullableClass != o;
- ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+ ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
o =={core::Object::==}{(core::Object) → core::bool} nullableClass;
- o !={core::Object::==}{(core::Object) → core::bool} nullableClass;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableClass);
dyn =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- dyn !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(dyn =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} dyn;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} dyn;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} dyn);
dyn =={core::Object::==}{(core::Object) → core::bool} o;
- dyn !={core::Object::==}{(core::Object) → core::bool} o;
+ !(dyn =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} dyn;
- o !={core::Object::==}{(core::Object) → core::bool} dyn;
+ !(o =={core::Object::==}{(core::Object) → core::bool} dyn);
never =={core::Object::==}{(dynamic) → Never} nullTypedValue;
- never !={core::Object::==}{(dynamic) → Never} nullTypedValue;
+ !(never =={core::Object::==}{(dynamic) → Never} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} never;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} never;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} never);
never =={core::Object::==}{(dynamic) → Never} o;
- never !={core::Object::==}{(dynamic) → Never} o;
+ !(never =={core::Object::==}{(dynamic) → Never} o);
o =={core::Object::==}{(core::Object) → core::bool} never;
- o !={core::Object::==}{(core::Object) → core::bool} never;
+ !(o =={core::Object::==}{(core::Object) → core::bool} never);
nullableNever =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nullableNever !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullableNever =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableNever;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableNever;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableNever);
nullableNever =={core::Object::==}{(core::Object) → core::bool} o;
- nullableNever !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nullableNever =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullableNever;
- o !={core::Object::==}{(core::Object) → core::bool} nullableNever;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableNever);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} o;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- o !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
- nonNullableFunction !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction);
nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} o;
- nonNullableFunction !={core::Function::==}{(core::Object) → core::bool} o;
+ !(nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
- o !={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction);
nullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
- nullableFunction !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunction;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableFunction;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunction);
nullableFunction =={core::Function::==}{(core::Object) → core::bool} o;
- nullableFunction !={core::Function::==}{(core::Object) → core::bool} o;
+ !(nullableFunction =={core::Function::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullableFunction;
- o !={core::Object::==}{(core::Object) → core::bool} nullableFunction;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableFunction);
nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nonNullableFunctionType !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType);
nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o;
- nonNullableFunctionType !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
- o !={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType);
nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nullableFunctionType !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType);
nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o;
- nullableFunctionType !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
- o !={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType);
nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
- nonNullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1);
nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o;
- nonNullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} o;
+ !(nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
- o !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1);
nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
- nullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1);
nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o;
- nullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} o;
+ !(nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
- o !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1);
nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nonNullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2);
nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o;
- nonNullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
- o !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2);
nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2);
nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o;
- nullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
- o !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2);
(let final Never #t17 = invalid-expression "pkg/front_end/testcases/none/equals.dart:355:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() == nullTypedValue;
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- (let final Never #t18 = invalid-expression "pkg/front_end/testcases/none/equals.dart:356:26: Error: Too few positional arguments: 1 required, 0 given.
+ !((let final Never #t18 = invalid-expression "pkg/front_end/testcases/none/equals.dart:356:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() != nullTypedValue;
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t19 = invalid-expression "pkg/front_end/testcases/none/equals.dart:357:44: Error: Too few positional arguments: 1 required, 0 given.
nullTypedValue == nonNullableClass.method();
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} (let final Never #t20 = invalid-expression "pkg/front_end/testcases/none/equals.dart:358:44: Error: Too few positional arguments: 1 required, 0 given.
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t20 = invalid-expression "pkg/front_end/testcases/none/equals.dart:358:44: Error: Too few positional arguments: 1 required, 0 given.
nullTypedValue != nonNullableClass.method();
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}));
(let final Never #t21 = invalid-expression "pkg/front_end/testcases/none/equals.dart:359:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() == o;
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} o;
- (let final Never #t22 = invalid-expression "pkg/front_end/testcases/none/equals.dart:360:26: Error: Too few positional arguments: 1 required, 0 given.
+ !((let final Never #t22 = invalid-expression "pkg/front_end/testcases/none/equals.dart:360:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() != o;
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) !={core::Object::==}{(core::Object) → core::bool} o;
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t23 = invalid-expression "pkg/front_end/testcases/none/equals.dart:361:31: Error: Too few positional arguments: 1 required, 0 given.
o == nonNullableClass.method();
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
- o !={core::Object::==}{(core::Object) → core::bool} (let final Never #t24 = invalid-expression "pkg/front_end/testcases/none/equals.dart:362:31: Error: Too few positional arguments: 1 required, 0 given.
+ !(o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t24 = invalid-expression "pkg/front_end/testcases/none/equals.dart:362:31: Error: Too few positional arguments: 1 required, 0 given.
o != nonNullableClass.method();
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}));
}
static method nullEqualsIndexGet(core::Map<core::int, core::String> map) → dynamic {
map.{core::Map::[]}(0){(core::Object?) → core::String?} == null;
diff --git a/pkg/front_end/testcases/none/equals.dart.weak.expect b/pkg/front_end/testcases/none/equals.dart.weak.expect
index 538a152..622fa6c8 100644
--- a/pkg/front_end/testcases/none/equals.dart.weak.expect
+++ b/pkg/front_end/testcases/none/equals.dart.weak.expect
@@ -130,347 +130,347 @@
static method test<T1 extends core::Function = core::Function, T2 extends (core::int) → core::int = (core::int) → core::int>(core::Object o, core::Object nonNullableObject, core::Object? nullableObject, self::Class<core::String> nonNullableClass, self::Class<core::String>? nullableClass, dynamic dyn, Never never, Never? nullableNever, Null nullTypedValue, core::Function nonNullableFunction, core::Function? nullableFunction, (core::int) → core::int nonNullableFunctionType, (core::int) →? core::int nullableFunctionType, self::test::T1 nonNullableTypeVariable1, self::test::T1? nullableTypeVariable1, self::test::T2 nonNullableTypeVariable2, self::test::T2? nullableTypeVariable2) → dynamic {
core::print("EqualsNull (literal null)");
null == null;
- null != null;
+ !(null == null);
nonNullableObject == null;
- nonNullableObject != null;
+ !(nonNullableObject == null);
nonNullableObject == null;
- nonNullableObject != null;
+ !(nonNullableObject == null);
nullableObject == null;
- nullableObject != null;
+ !(nullableObject == null);
nullableObject == null;
- nullableObject != null;
+ !(nullableObject == null);
nullableClass == null;
- nullableClass != null;
+ !(nullableClass == null);
nullableClass == null;
- nullableClass != null;
+ !(nullableClass == null);
nonNullableClass == null;
- nonNullableClass != null;
+ !(nonNullableClass == null);
nonNullableClass == null;
- nonNullableClass != null;
+ !(nonNullableClass == null);
dyn == null;
- dyn != null;
+ !(dyn == null);
dyn == null;
- dyn != null;
+ !(dyn == null);
(let final Never #t1 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null;
- (let final Never #t2 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) != null;
+ !((let final Never #t2 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null);
(let final Never #t3 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null;
- (let final Never #t4 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) != null;
+ !((let final Never #t4 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null);
nullableNever == null;
- nullableNever != null;
+ !(nullableNever == null);
nullableNever == null;
- nullableNever != null;
+ !(nullableNever == null);
nullTypedValue == null;
- nullTypedValue != null;
+ !(nullTypedValue == null);
nullTypedValue == null;
- nullTypedValue != null;
+ !(nullTypedValue == null);
nonNullableFunction == null;
- nonNullableFunction != null;
+ !(nonNullableFunction == null);
nonNullableFunction == null;
- nonNullableFunction != null;
+ !(nonNullableFunction == null);
nullableFunction == null;
- nullableFunction != null;
+ !(nullableFunction == null);
nullableFunction == null;
- nullableFunction != null;
+ !(nullableFunction == null);
nonNullableFunctionType == null;
- nonNullableFunctionType != null;
+ !(nonNullableFunctionType == null);
nonNullableFunctionType == null;
- nonNullableFunctionType != null;
+ !(nonNullableFunctionType == null);
nullableFunctionType == null;
- nullableFunctionType != null;
+ !(nullableFunctionType == null);
nullableFunctionType == null;
- nullableFunctionType != null;
+ !(nullableFunctionType == null);
nonNullableTypeVariable1 == null;
- nonNullableTypeVariable1 != null;
+ !(nonNullableTypeVariable1 == null);
nonNullableTypeVariable1 == null;
- nonNullableTypeVariable1 != null;
+ !(nonNullableTypeVariable1 == null);
nullableTypeVariable1 == null;
- nullableTypeVariable1 != null;
+ !(nullableTypeVariable1 == null);
nullableTypeVariable1 == null;
- nullableTypeVariable1 != null;
+ !(nullableTypeVariable1 == null);
nonNullableTypeVariable2 == null;
- nonNullableTypeVariable2 != null;
+ !(nonNullableTypeVariable2 == null);
nonNullableTypeVariable2 == null;
- nonNullableTypeVariable2 != null;
+ !(nonNullableTypeVariable2 == null);
nullableTypeVariable2 == null;
- nullableTypeVariable2 != null;
+ !(nullableTypeVariable2 == null);
nullableTypeVariable2 == null;
- nullableTypeVariable2 != null;
+ !(nullableTypeVariable2 == null);
(let final Never #t5 = invalid-expression "pkg/front_end/testcases/none/equals.dart:115:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() == null;
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
- (let final Never #t6 = invalid-expression "pkg/front_end/testcases/none/equals.dart:116:26: Error: Too few positional arguments: 1 required, 0 given.
+ !((let final Never #t6 = invalid-expression "pkg/front_end/testcases/none/equals.dart:116:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() != null;
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
(let final Never #t7 = invalid-expression "pkg/front_end/testcases/none/equals.dart:117:34: Error: Too few positional arguments: 1 required, 0 given.
null == nonNullableClass.method();
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
- (let final Never #t8 = invalid-expression "pkg/front_end/testcases/none/equals.dart:118:34: Error: Too few positional arguments: 1 required, 0 given.
+ !((let final Never #t8 = invalid-expression "pkg/front_end/testcases/none/equals.dart:118:34: Error: Too few positional arguments: 1 required, 0 given.
null != nonNullableClass.method();
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
core::print("EqualsNull (constant null)");
(#C1) == null;
- (#C1) != null;
+ !((#C1) == null);
nonNullableObject == null;
- nonNullableObject != null;
+ !(nonNullableObject == null);
nonNullableObject == null;
- nonNullableObject != null;
+ !(nonNullableObject == null);
nullableObject == null;
- nullableObject != null;
+ !(nullableObject == null);
nullableObject == null;
- nullableObject != null;
+ !(nullableObject == null);
nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t9 = invalid-expression "pkg/front_end/testcases/none/equals.dart:134:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nonNullableClass == nullValue;
^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
- nonNullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t10 = invalid-expression "pkg/front_end/testcases/none/equals.dart:135:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+ !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t10 = invalid-expression "pkg/front_end/testcases/none/equals.dart:135:23: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nonNullableClass != nullValue;
- ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+ ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
nonNullableClass == null;
- nonNullableClass != null;
+ !(nonNullableClass == null);
nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t11 = invalid-expression "pkg/front_end/testcases/none/equals.dart:139:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nullableClass == nullValue;
^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
- nullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t12 = invalid-expression "pkg/front_end/testcases/none/equals.dart:140:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
+ !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t12 = invalid-expression "pkg/front_end/testcases/none/equals.dart:140:20: Error: The argument type 'Object?' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nullableClass != nullValue;
- ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+ ^" in (#C1) as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
nullableClass == null;
- nullableClass != null;
+ !(nullableClass == null);
dyn == null;
- dyn != null;
+ !(dyn == null);
dyn == null;
- dyn != null;
+ !(dyn == null);
let final Never #t13 = (let final Never #t14 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
- let final Never #t15 = (let final Never #t16 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) != null in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+ let final Never #t15 = !((let final Never #t16 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
(let final Never #t17 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null;
- (let final Never #t18 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) != null;
+ !((let final Never #t18 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) == null);
nullableNever == null;
- nullableNever != null;
+ !(nullableNever == null);
nullableNever == null;
- nullableNever != null;
+ !(nullableNever == null);
nullTypedValue == null;
- nullTypedValue != null;
+ !(nullTypedValue == null);
nullTypedValue == null;
- nullTypedValue != null;
+ !(nullTypedValue == null);
nonNullableFunction == null;
- nonNullableFunction != null;
+ !(nonNullableFunction == null);
nonNullableFunction == null;
- nonNullableFunction != null;
+ !(nonNullableFunction == null);
nullableFunction == null;
- nullableFunction != null;
+ !(nullableFunction == null);
nullableFunction == null;
- nullableFunction != null;
+ !(nullableFunction == null);
nonNullableFunctionType == null;
- nonNullableFunctionType != null;
+ !(nonNullableFunctionType == null);
nonNullableFunctionType == null;
- nonNullableFunctionType != null;
+ !(nonNullableFunctionType == null);
nullableFunctionType == null;
- nullableFunctionType != null;
+ !(nullableFunctionType == null);
nullableFunctionType == null;
- nullableFunctionType != null;
+ !(nullableFunctionType == null);
nonNullableTypeVariable1 == null;
- nonNullableTypeVariable1 != null;
+ !(nonNullableTypeVariable1 == null);
nonNullableTypeVariable1 == null;
- nonNullableTypeVariable1 != null;
+ !(nonNullableTypeVariable1 == null);
nullableTypeVariable1 == null;
- nullableTypeVariable1 != null;
+ !(nullableTypeVariable1 == null);
nullableTypeVariable1 == null;
- nullableTypeVariable1 != null;
+ !(nullableTypeVariable1 == null);
nonNullableTypeVariable2 == null;
- nonNullableTypeVariable2 != null;
+ !(nonNullableTypeVariable2 == null);
nonNullableTypeVariable2 == null;
- nonNullableTypeVariable2 != null;
+ !(nonNullableTypeVariable2 == null);
nullableTypeVariable2 == null;
- nullableTypeVariable2 != null;
+ !(nullableTypeVariable2 == null);
nullableTypeVariable2 == null;
- nullableTypeVariable2 != null;
+ !(nullableTypeVariable2 == null);
(let final Never #t19 = invalid-expression "pkg/front_end/testcases/none/equals.dart:204:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() == nullValue;
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
- (let final Never #t20 = invalid-expression "pkg/front_end/testcases/none/equals.dart:205:26: Error: Too few positional arguments: 1 required, 0 given.
+ !((let final Never #t20 = invalid-expression "pkg/front_end/testcases/none/equals.dart:205:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() != nullValue;
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
(let final Never #t21 = invalid-expression "pkg/front_end/testcases/none/equals.dart:206:39: Error: Too few positional arguments: 1 required, 0 given.
nullValue == nonNullableClass.method();
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null;
- (let final Never #t22 = invalid-expression "pkg/front_end/testcases/none/equals.dart:207:39: Error: Too few positional arguments: 1 required, 0 given.
+ !((let final Never #t22 = invalid-expression "pkg/front_end/testcases/none/equals.dart:207:39: Error: Too few positional arguments: 1 required, 0 given.
nullValue != nonNullableClass.method();
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) != null;
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) == null);
core::print("EqualsCall");
nonNullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nonNullableObject !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nonNullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableObject);
nonNullableObject =={core::Object::==}{(core::Object) → core::bool} o;
- nonNullableObject !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nonNullableObject =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
- o !={core::Object::==}{(core::Object) → core::bool} nonNullableObject;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableObject);
nullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nullableObject !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullableObject =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableObject;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableObject;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableObject);
nullableObject =={core::Object::==}{(core::Object) → core::bool} o;
- nullableObject !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nullableObject =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullableObject;
- o !={core::Object::==}{(core::Object) → core::bool} nullableObject;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableObject);
nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
- nonNullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
+ !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableClass);
nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t23 = invalid-expression "pkg/front_end/testcases/none/equals.dart:233:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nonNullableClass == o;
^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
- nonNullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t24 = invalid-expression "pkg/front_end/testcases/none/equals.dart:234:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+ !(nonNullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t24 = invalid-expression "pkg/front_end/testcases/none/equals.dart:234:23: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nonNullableClass != o;
- ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+ ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
o =={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
- o !={core::Object::==}{(core::Object) → core::bool} nonNullableClass;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableClass);
nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
- nullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue;
+ !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableClass;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableClass;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableClass);
nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t25 = invalid-expression "pkg/front_end/testcases/none/equals.dart:242:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nullableClass == o;
^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
- nullableClass !={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t26 = invalid-expression "pkg/front_end/testcases/none/equals.dart:243:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
+ !(nullableClass =={self::Class::==}{(self::Class<core::String>) → core::bool} (let final Never #t26 = invalid-expression "pkg/front_end/testcases/none/equals.dart:243:20: Error: The argument type 'Object' can't be assigned to the parameter type 'Class<String>?'.
- 'Object' is from 'dart:core'.
- 'Class' is from 'pkg/front_end/testcases/none/equals.dart'.
nullableClass != o;
- ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?);
+ ^" in o as{TypeError,ForNonNullableByDefault} self::Class<core::String>?));
o =={core::Object::==}{(core::Object) → core::bool} nullableClass;
- o !={core::Object::==}{(core::Object) → core::bool} nullableClass;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableClass);
dyn =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- dyn !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(dyn =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} dyn;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} dyn;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} dyn);
dyn =={core::Object::==}{(core::Object) → core::bool} o;
- dyn !={core::Object::==}{(core::Object) → core::bool} o;
+ !(dyn =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} dyn;
- o !={core::Object::==}{(core::Object) → core::bool} dyn;
+ !(o =={core::Object::==}{(core::Object) → core::bool} dyn);
let final Never #t27 = (let final Never #t28 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} nullTypedValue in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
- let final Never #t29 = (let final Never #t30 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) !={core::Object::==}{(dynamic) → Never} nullTypedValue in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+ let final Never #t29 = !((let final Never #t30 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} nullTypedValue) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t31 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} (let final Never #t32 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t32 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")));
let final Never #t33 = (let final Never #t34 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} o in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
- let final Never #t35 = (let final Never #t36 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) !={core::Object::==}{(dynamic) → Never} o in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+ let final Never #t35 = !((let final Never #t36 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")) =={core::Object::==}{(dynamic) → Never} o) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t37 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
- o !={core::Object::==}{(core::Object) → core::bool} (let final Never #t38 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
+ !(o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t38 = never in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")));
nullableNever =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nullableNever !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullableNever =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableNever;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableNever;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableNever);
nullableNever =={core::Object::==}{(core::Object) → core::bool} o;
- nullableNever !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nullableNever =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullableNever;
- o !={core::Object::==}{(core::Object) → core::bool} nullableNever;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableNever);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} o;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- o !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
- nonNullableFunction !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction);
nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} o;
- nonNullableFunction !={core::Function::==}{(core::Object) → core::bool} o;
+ !(nonNullableFunction =={core::Function::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
- o !={core::Object::==}{(core::Object) → core::bool} nonNullableFunction;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunction);
nullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
- nullableFunction !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullableFunction =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunction;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableFunction;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunction);
nullableFunction =={core::Function::==}{(core::Object) → core::bool} o;
- nullableFunction !={core::Function::==}{(core::Object) → core::bool} o;
+ !(nullableFunction =={core::Function::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullableFunction;
- o !={core::Object::==}{(core::Object) → core::bool} nullableFunction;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableFunction);
nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nonNullableFunctionType !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType);
nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o;
- nonNullableFunctionType !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nonNullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
- o !={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableFunctionType);
nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nullableFunctionType !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType);
nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o;
- nullableFunctionType !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nullableFunctionType =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
- o !={core::Object::==}{(core::Object) → core::bool} nullableFunctionType;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableFunctionType);
nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
- nonNullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1);
nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o;
- nonNullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} o;
+ !(nonNullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
- o !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable1);
nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
- nullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1);
nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o;
- nullableTypeVariable1 !={core::Function::==}{(core::Object) → core::bool} o;
+ !(nullableTypeVariable1 =={core::Function::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
- o !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable1);
nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nonNullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2);
nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o;
- nonNullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nonNullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
- o !={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nonNullableTypeVariable2);
nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- nullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ !(nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2);
nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o;
- nullableTypeVariable2 !={core::Object::==}{(core::Object) → core::bool} o;
+ !(nullableTypeVariable2 =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
- o !={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2;
+ !(o =={core::Object::==}{(core::Object) → core::bool} nullableTypeVariable2);
(let final Never #t39 = invalid-expression "pkg/front_end/testcases/none/equals.dart:355:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() == nullTypedValue;
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
- (let final Never #t40 = invalid-expression "pkg/front_end/testcases/none/equals.dart:356:26: Error: Too few positional arguments: 1 required, 0 given.
+ !((let final Never #t40 = invalid-expression "pkg/front_end/testcases/none/equals.dart:356:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() != nullTypedValue;
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) !={core::Object::==}{(core::Object) → core::bool} nullTypedValue;
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} nullTypedValue);
nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t41 = invalid-expression "pkg/front_end/testcases/none/equals.dart:357:44: Error: Too few positional arguments: 1 required, 0 given.
nullTypedValue == nonNullableClass.method();
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
- nullTypedValue !={core::Object::==}{(core::Object) → core::bool} (let final Never #t42 = invalid-expression "pkg/front_end/testcases/none/equals.dart:358:44: Error: Too few positional arguments: 1 required, 0 given.
+ !(nullTypedValue =={core::Object::==}{(core::Object) → core::bool} (let final Never #t42 = invalid-expression "pkg/front_end/testcases/none/equals.dart:358:44: Error: Too few positional arguments: 1 required, 0 given.
nullTypedValue != nonNullableClass.method();
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}));
(let final Never #t43 = invalid-expression "pkg/front_end/testcases/none/equals.dart:359:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() == o;
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} o;
- (let final Never #t44 = invalid-expression "pkg/front_end/testcases/none/equals.dart:360:26: Error: Too few positional arguments: 1 required, 0 given.
+ !((let final Never #t44 = invalid-expression "pkg/front_end/testcases/none/equals.dart:360:26: Error: Too few positional arguments: 1 required, 0 given.
nonNullableClass.method() != o;
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) !={core::Object::==}{(core::Object) → core::bool} o;
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}) =={core::Object::==}{(core::Object) → core::bool} o);
o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t45 = invalid-expression "pkg/front_end/testcases/none/equals.dart:361:31: Error: Too few positional arguments: 1 required, 0 given.
o == nonNullableClass.method();
^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
- o !={core::Object::==}{(core::Object) → core::bool} (let final Never #t46 = invalid-expression "pkg/front_end/testcases/none/equals.dart:362:31: Error: Too few positional arguments: 1 required, 0 given.
+ !(o =={core::Object::==}{(core::Object) → core::bool} (let final Never #t46 = invalid-expression "pkg/front_end/testcases/none/equals.dart:362:31: Error: Too few positional arguments: 1 required, 0 given.
o != nonNullableClass.method();
- ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type});
+ ^" in nonNullableClass.{self::Class::method}{<inapplicable>}.(){() → invalid-type}));
}
static method nullEqualsIndexGet(core::Map<core::int, core::String> map) → dynamic {
map.{core::Map::[]}(0){(core::Object?) → core::String?} == null;
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
index be28553..81796a7 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.expect
@@ -65,7 +65,7 @@
self::expect("Mixin", m.{self::Mixin::method4}(0, 1){(core::int, core::int) → core::String});
}
static method expect(dynamic expected, dynamic actual) → void {
- if(expected !={core::Object::==}{(core::Object) → core::bool} actual)
+ if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → void f) → void {
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect
index be28553..81796a7 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.strong.transformed.expect
@@ -65,7 +65,7 @@
self::expect("Mixin", m.{self::Mixin::method4}(0, 1){(core::int, core::int) → core::String});
}
static method expect(dynamic expected, dynamic actual) → void {
- if(expected !={core::Object::==}{(core::Object) → core::bool} actual)
+ if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → void f) → void {
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
index be28553..81796a7 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.expect
@@ -65,7 +65,7 @@
self::expect("Mixin", m.{self::Mixin::method4}(0, 1){(core::int, core::int) → core::String});
}
static method expect(dynamic expected, dynamic actual) → void {
- if(expected !={core::Object::==}{(core::Object) → core::bool} actual)
+ if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → void f) → void {
diff --git a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect
index be28553..81796a7 100644
--- a/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/none/mixin_covariant.dart.weak.transformed.expect
@@ -65,7 +65,7 @@
self::expect("Mixin", m.{self::Mixin::method4}(0, 1){(core::int, core::int) → core::String});
}
static method expect(dynamic expected, dynamic actual) → void {
- if(expected !={core::Object::==}{(core::Object) → core::bool} actual)
+ if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → void f) → void {
diff --git a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.expect b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.expect
index 6bbacdb..a213a54 100644
--- a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.expect
+++ b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.expect
@@ -46,10 +46,10 @@
function local() → Null {}
local(){() → Null};
c =={core::Object::==}{(core::Object) → core::bool} d;
- c !={core::Object::==}{(core::Object) → core::bool} d;
+ !(c =={core::Object::==}{(core::Object) → core::bool} d);
c == null;
- c != null;
+ !(c == null);
d == null;
- d != null;
+ !(d == null);
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.transformed.expect b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.transformed.expect
index 6bbacdb..a213a54 100644
--- a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.strong.transformed.expect
@@ -46,10 +46,10 @@
function local() → Null {}
local(){() → Null};
c =={core::Object::==}{(core::Object) → core::bool} d;
- c !={core::Object::==}{(core::Object) → core::bool} d;
+ !(c =={core::Object::==}{(core::Object) → core::bool} d);
c == null;
- c != null;
+ !(c == null);
d == null;
- d != null;
+ !(d == null);
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.expect b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.expect
index 6bbacdb..a213a54 100644
--- a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.expect
+++ b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.expect
@@ -46,10 +46,10 @@
function local() → Null {}
local(){() → Null};
c =={core::Object::==}{(core::Object) → core::bool} d;
- c !={core::Object::==}{(core::Object) → core::bool} d;
+ !(c =={core::Object::==}{(core::Object) → core::bool} d);
c == null;
- c != null;
+ !(c == null);
d == null;
- d != null;
+ !(d == null);
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.transformed.expect b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.transformed.expect
index 6bbacdb..a213a54 100644
--- a/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/none/new_method_invocation_encodings.dart.weak.transformed.expect
@@ -46,10 +46,10 @@
function local() → Null {}
local(){() → Null};
c =={core::Object::==}{(core::Object) → core::bool} d;
- c !={core::Object::==}{(core::Object) → core::bool} d;
+ !(c =={core::Object::==}{(core::Object) → core::bool} d);
c == null;
- c != null;
+ !(c == null);
d == null;
- d != null;
+ !(d == null);
}
static method main() → dynamic {}
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index d4edbf5..b19ad56 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -147,7 +147,7 @@
type ComponentFile {
UInt32 magic = 0x90ABCDEF;
- UInt32 formatVersion = 56;
+ UInt32 formatVersion = 57;
Byte[10] shortSdkHash;
List<String> problemsAsJson; // Described in problems.md.
Library[] libraries;
@@ -741,6 +741,19 @@
MemberReference interfaceTargetOrigin; // May be NullReference.
}
+type InstanceGetterInvocation extends Expression {
+ Byte tag = 89;
+ Byte kind; // Index into InstanceAccessKind above.
+ Byte flags (isInvariant, isBoundsSafe);
+ FileOffset fileOffset;
+ Expression receiver;
+ Name name;
+ Arguments arguments;
+ DartType functionType;
+ MemberReference interfaceTarget;
+ MemberReference interfaceTargetOrigin; // May be NullReference.
+}
+
type DynamicInvocation extends Expression {
Byte tag = 124;
Byte kind; // Index into DynamicAccessKind above.
@@ -789,7 +802,6 @@
Byte tag = 15;
FileOffset fileOffset;
Expression expression;
- Byte isNot;
}
type EqualsCall extends Expression {
@@ -797,7 +809,6 @@
FileOffset fileOffset;
Expression left;
Expression right;
- Byte isNot;
DartType functionType;
MemberReference interfaceTarget;
MemberReference interfaceTargetOrigin; // May be NullReference.
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 7e38523..a52a42c 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -5329,6 +5329,169 @@
}
}
+/// An invocation of an instance getter or field with a statically known
+/// interface target.
+///
+/// This is used only for web backend in order to support invocation of
+/// native properties as functions. This node will be removed when this
+/// invocation style is no longer supported.
+class InstanceGetterInvocation extends InvocationExpression {
+ // Must match serialized bit positions.
+ static const int FlagInvariant = 1 << 0;
+ static const int FlagBoundsSafe = 1 << 1;
+
+ final InstanceAccessKind kind;
+ Expression receiver;
+
+ @override
+ Name name;
+
+ @override
+ Arguments arguments;
+
+ int flags = 0;
+
+ /// The static type of the invocation.
+ ///
+ /// This includes substituted type parameters from the static receiver type
+ /// and generic type arguments.
+ ///
+ /// For instance
+ ///
+ /// class A<T> {
+ /// Map<T, S> map<S>(S s) { ... }
+ /// }
+ /// m(A<String> a) {
+ /// a.map(0); // The function type is `Map<String, int> Function(int)`.
+ /// }
+ ///
+ FunctionType functionType;
+
+ Reference interfaceTargetReference;
+
+ InstanceGetterInvocation(InstanceAccessKind kind, Expression receiver,
+ Name name, Arguments arguments,
+ {required Procedure interfaceTarget, required FunctionType functionType})
+ : this.byReference(kind, receiver, name, arguments,
+ interfaceTargetReference:
+ getNonNullableMemberReferenceGetter(interfaceTarget),
+ functionType: functionType);
+
+ InstanceGetterInvocation.byReference(
+ this.kind, this.receiver, this.name, this.arguments,
+ {required this.interfaceTargetReference, required this.functionType})
+ // ignore: unnecessary_null_comparison
+ : assert(interfaceTargetReference != null),
+ // ignore: unnecessary_null_comparison
+ assert(functionType != null),
+ assert(functionType.typeParameters.isEmpty) {
+ receiver.parent = this;
+ arguments.parent = this;
+ }
+
+ Member get interfaceTarget => interfaceTargetReference.asProcedure;
+
+ void set interfaceTarget(Member target) {
+ interfaceTargetReference = getNonNullableMemberReferenceGetter(target);
+ }
+
+ /// If `true`, this call is known to be safe wrt. parameter covariance checks.
+ ///
+ /// This is for instance the case in code patterns like this
+ ///
+ /// List<int> list = <int>[];
+ /// list.add(0);
+ ///
+ /// where the `list` variable is known to hold a value of the same type as
+ /// the static type. In contrast the would not be the case in code patterns
+ /// like this
+ ///
+ /// List<num> list = <double>[];
+ /// list.add(0); // Runtime error `int` is not a subtype of `double`.
+ ///
+ bool get isInvariant => flags & FlagInvariant != 0;
+
+ void set isInvariant(bool value) {
+ flags = value ? (flags | FlagInvariant) : (flags & ~FlagInvariant);
+ }
+
+ /// If `true`, this call is known to be safe wrt. parameter covariance checks.
+ ///
+ /// This is for instance the case in code patterns like this
+ ///
+ /// List list = new List.filled(2, 0);
+ /// list[1] = 42;
+ ///
+ /// where the `list` is known to have a sufficient length for the update
+ /// in `list[1] = 42`.
+ bool get isBoundsSafe => flags & FlagBoundsSafe != 0;
+
+ void set isBoundsSafe(bool value) {
+ flags = value ? (flags | FlagBoundsSafe) : (flags & ~FlagBoundsSafe);
+ }
+
+ @override
+ DartType getStaticTypeInternal(StaticTypeContext context) =>
+ functionType.returnType;
+
+ @override
+ R accept<R>(ExpressionVisitor<R> v) => v.visitInstanceGetterInvocation(this);
+
+ @override
+ R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
+ v.visitInstanceGetterInvocation(this, arg);
+
+ @override
+ void visitChildren(Visitor v) {
+ receiver.accept(v);
+ interfaceTarget.acceptReference(v);
+ name.accept(v);
+ arguments.accept(v);
+ }
+
+ @override
+ void transformChildren(Transformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (arguments != null) {
+ arguments = v.transform(arguments);
+ arguments.parent = this;
+ }
+ }
+
+ @override
+ void transformOrRemoveChildren(RemovingTransformer v) {
+ // ignore: unnecessary_null_comparison
+ if (receiver != null) {
+ receiver = v.transform(receiver);
+ receiver.parent = this;
+ }
+ // ignore: unnecessary_null_comparison
+ if (arguments != null) {
+ arguments = v.transform(arguments);
+ arguments.parent = this;
+ }
+ }
+
+ @override
+ String toString() {
+ return "InstanceGetterInvocation($kind, ${toStringInternal()})";
+ }
+
+ @override
+ void toTextInternal(AstPrinter printer) {
+ printer.writeExpression(receiver,
+ minimumPrecedence: astToText.Precedence.PRIMARY);
+ printer.write('.');
+ printer.writeInterfaceMemberName(interfaceTargetReference, name);
+ printer.writeArguments(arguments);
+ }
+}
+
/// Access kind used by [FunctionInvocation] and [FunctionTearOff].
enum FunctionAccessKind {
/// An access to the 'call' method on an expression of static type `Function`.
@@ -5472,7 +5635,6 @@
/// An invocation of a local function declaration.
class LocalFunctionInvocation extends InvocationExpression {
/// The variable declaration for the function declaration.
- // TODO(johnniwinther): Should this be the `FunctionDeclaration` instead?
VariableDeclaration variable;
@override
@@ -5499,6 +5661,10 @@
arguments.parent = this;
}
+ /// The declaration for the invoked local function.
+ FunctionDeclaration get localFunction =>
+ variable.parent as FunctionDeclaration;
+
@override
Name get name => Name.callName;
@@ -5548,21 +5714,14 @@
}
}
-/// Nullness test of an expression, that is `e == null` or `e != null`.
+/// Nullness test of an expression, that is `e == null`.
///
-/// This is generated for code like `e1 == e2` and `e1 != e2` where `e1` or `e2`
-/// is `null`.
+/// This is generated for code like `e1 == e2` where `e1` or `e2` is `null`.
class EqualsNull extends Expression {
/// The expression tested for nullness.
Expression expression;
- /// If `true` this is an `e != null` test. Otherwise it is an `e == null`
- /// test.
- final bool isNot;
-
- EqualsNull(this.expression, {required this.isNot})
- // ignore: unnecessary_null_comparison
- : assert(isNot != null) {
+ EqualsNull(this.expression) {
expression.parent = this;
}
@@ -5608,18 +5767,14 @@
@override
void toTextInternal(AstPrinter printer) {
printer.writeExpression(expression, minimumPrecedence: precedence);
- if (isNot) {
- printer.write(' != null');
- } else {
- printer.write(' == null');
- }
+ printer.write(' == null');
}
}
-/// A test of equality, that is `e1 == e2` or `e1 != e2`.
+/// A test of equality, that is `e1 == e2`.
///
-/// This is generated for code like `e1 == e2` and `e1 != e2` where neither `e1`
-/// nor `e2` is `null`.
+/// This is generated for code like `e1 == e2` where neither `e1` nor `e2` is
+/// `null`.
class EqualsCall extends Expression {
Expression left;
Expression right;
@@ -5639,27 +5794,17 @@
///
FunctionType functionType;
- /// If `true` this is an `e1 != e2` test. Otherwise it is an `e1 == e2` test.
- final bool isNot;
-
Reference interfaceTargetReference;
EqualsCall(Expression left, Expression right,
- {required bool isNot,
- required FunctionType functionType,
- required Procedure interfaceTarget})
+ {required FunctionType functionType, required Procedure interfaceTarget})
: this.byReference(left, right,
- isNot: isNot,
functionType: functionType,
interfaceTargetReference:
getNonNullableMemberReferenceGetter(interfaceTarget));
EqualsCall.byReference(this.left, this.right,
- {required this.isNot,
- required this.functionType,
- required this.interfaceTargetReference})
- // ignore: unnecessary_null_comparison
- : assert(isNot != null) {
+ {required this.functionType, required this.interfaceTargetReference}) {
left.parent = this;
right.parent = this;
}
@@ -5726,11 +5871,7 @@
void toTextInternal(AstPrinter printer) {
int minimumPrecedence = precedence;
printer.writeExpression(left, minimumPrecedence: minimumPrecedence);
- if (isNot) {
- printer.write(' != ');
- } else {
- printer.write(' == ');
- }
+ printer.write(' == ');
printer.writeExpression(right, minimumPrecedence: minimumPrecedence + 1);
}
}
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 7da0618..5f9a62f3 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -1936,6 +1936,8 @@
return _readMethodInvocation();
case Tag.InstanceInvocation:
return _readInstanceInvocation();
+ case Tag.InstanceGetterInvocation:
+ return _readInstanceGetterInvocation();
case Tag.DynamicInvocation:
return _readDynamicInvocation();
case Tag.FunctionInvocation:
@@ -2193,6 +2195,18 @@
..flags = flags;
}
+ Expression _readInstanceGetterInvocation() {
+ InstanceAccessKind kind = InstanceAccessKind.values[readByte()];
+ int flags = readByte();
+ int offset = readOffset();
+ return new InstanceGetterInvocation.byReference(
+ kind, readExpression(), readName(), readArguments(),
+ functionType: readDartType() as FunctionType,
+ interfaceTargetReference: readNonNullInstanceMemberReference())
+ ..fileOffset = offset
+ ..flags = flags;
+ }
+
Expression _readDynamicInvocation() {
DynamicAccessKind kind = DynamicAccessKind.values[readByte()];
int offset = readOffset();
@@ -2223,21 +2237,20 @@
Expression _readLocalFunctionInvocation() {
int offset = readOffset();
readUInt30(); // offset of the variable declaration in the binary.
- return new LocalFunctionInvocation(readVariableReference(), readArguments(),
+ VariableDeclaration variable = readVariableReference();
+ return new LocalFunctionInvocation(variable, readArguments(),
functionType: readDartType() as FunctionType)
..fileOffset = offset;
}
Expression _readEqualsNull() {
int offset = readOffset();
- return new EqualsNull(readExpression(), isNot: readByte() == 1)
- ..fileOffset = offset;
+ return new EqualsNull(readExpression())..fileOffset = offset;
}
Expression _readEqualsCall() {
int offset = readOffset();
return new EqualsCall.byReference(readExpression(), readExpression(),
- isNot: readByte() == 1,
functionType: readDartType() as FunctionType,
interfaceTargetReference: readNonNullInstanceMemberReference())
..fileOffset = offset;
@@ -2768,8 +2781,8 @@
int offset = readOffset();
VariableDeclaration variable = readVariableDeclaration();
variableStack.add(variable); // Will be popped by the enclosing scope.
- FunctionNode function = readFunctionNode();
- return new FunctionDeclaration(variable, function)..fileOffset = offset;
+ return new FunctionDeclaration(variable, readFunctionNode())
+ ..fileOffset = offset;
}
void _readSwitchCaseInto(SwitchCase caseNode) {
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index f9409b0..2c431e2 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -1557,7 +1557,6 @@
writeOffset(node.fileOffset);
writeNode(node.left);
writeNode(node.right);
- writeByte(node.isNot ? 1 : 0);
writeDartType(node.functionType);
writeNonNullInstanceMemberReference(node.interfaceTargetReference);
}
@@ -1567,7 +1566,6 @@
writeByte(Tag.EqualsNull);
writeOffset(node.fileOffset);
writeNode(node.expression);
- writeByte(node.isNot ? 1 : 0);
}
@override
@@ -1595,6 +1593,19 @@
}
@override
+ void visitInstanceGetterInvocation(InstanceGetterInvocation node) {
+ writeByte(Tag.InstanceGetterInvocation);
+ writeByte(node.kind.index);
+ writeByte(node.flags);
+ writeOffset(node.fileOffset);
+ writeNode(node.receiver);
+ writeName(node.name);
+ writeArgumentsNode(node.arguments);
+ writeDartType(node.functionType);
+ writeNonNullInstanceMemberReference(node.interfaceTargetReference);
+ }
+
+ @override
void visitLocalFunctionInvocation(LocalFunctionInvocation node) {
writeByte(Tag.LocalFunctionInvocation);
writeOffset(node.fileOffset);
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index c91a5e6..3b8d1ee 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -90,6 +90,7 @@
static const int InstanceGet = 118;
static const int InstanceSet = 119;
static const int InstanceInvocation = 120;
+ static const int InstanceGetterInvocation = 89;
static const int InstanceTearOff = 121;
static const int DynamicGet = 122;
static const int DynamicSet = 123;
@@ -124,6 +125,7 @@
// Types
static const int TypedefType = 87;
+ // 89 is occupied by [InstanceGetterInvocation] (expression).
static const int InvalidType = 90;
static const int DynamicType = 91;
static const int VoidType = 92;
@@ -172,7 +174,7 @@
/// Internal version of kernel binary format.
/// Bump it when making incompatible changes in kernel binaries.
/// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
- static const int BinaryFormatVersion = 56;
+ static const int BinaryFormatVersion = 57;
}
abstract class ConstantTag {
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 69d6fd7..a04b607 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -466,7 +466,13 @@
visitFunctionDeclaration(FunctionDeclaration node) {
VariableDeclaration newVariable = clone(node.variable);
- return new FunctionDeclaration(newVariable, clone(node.function!));
+ // Create the declaration before cloning the body to support recursive
+ // [LocalFunctionInvocation] nodes.
+ FunctionDeclaration declaration =
+ new FunctionDeclaration(newVariable, null);
+ FunctionNode functionNode = clone(node.function!);
+ declaration.function = functionNode..parent = declaration;
+ return declaration;
}
void prepareTypeParameters(List<TypeParameter> typeParameters) {
@@ -637,14 +643,13 @@
@override
TreeNode visitEqualsCall(EqualsCall node) {
return new EqualsCall.byReference(clone(node.left), clone(node.right),
- isNot: node.isNot,
functionType: visitType(node.functionType) as FunctionType,
interfaceTargetReference: node.interfaceTargetReference);
}
@override
TreeNode visitEqualsNull(EqualsNull node) {
- return new EqualsNull(clone(node.expression), isNot: node.isNot);
+ return new EqualsNull(clone(node.expression));
}
@override
@@ -671,6 +676,14 @@
}
@override
+ TreeNode visitInstanceGetterInvocation(InstanceGetterInvocation node) {
+ return new InstanceGetterInvocation.byReference(
+ node.kind, clone(node.receiver), node.name, clone(node.arguments),
+ functionType: visitType(node.functionType) as FunctionType,
+ interfaceTargetReference: node.interfaceTargetReference);
+ }
+
+ @override
TreeNode visitInstanceSet(InstanceSet node) {
return new InstanceSet.byReference(
node.kind, clone(node.receiver), node.name, clone(node.value),
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index f8ffce6..26f4eec 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1501,11 +1501,7 @@
int precedence = Precedence.EQUALITY;
writeExpression(node.left, precedence);
writeSpace();
- if (node.isNot) {
- writeSymbol('!=');
- } else {
- writeSymbol('==');
- }
+ writeSymbol('==');
writeInterfaceTarget(Name.equalsName, node.interfaceTargetReference);
writeSymbol('{');
writeType(node.functionType);
@@ -1517,11 +1513,7 @@
visitEqualsNull(EqualsNull node) {
writeExpression(node.expression, Precedence.EQUALITY);
writeSpace();
- if (node.isNot) {
- writeSymbol('!=');
- } else {
- writeSymbol('==');
- }
+ writeSymbol('==');
writeSpace();
writeSymbol('null');
}
@@ -2739,6 +2731,9 @@
int visitInstanceInvocation(InstanceInvocation node) => CALLEE;
@override
+ int visitInstanceGetterInvocation(InstanceGetterInvocation node) => CALLEE;
+
+ @override
int visitDynamicInvocation(DynamicInvocation node) => CALLEE;
@override
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 7e0ad34..b1e4b75 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -747,43 +747,38 @@
}
TextSerializer<EqualsNull> equalsNullSerializer =
- new Wrapped<Tuple2<Expression, bool>, EqualsNull>(
- unwrapEqualsNull,
- wrapEqualsNull,
- new Tuple2Serializer(expressionSerializer, const DartBool()));
+ new Wrapped<Expression, EqualsNull>(
+ unwrapEqualsNull, wrapEqualsNull, expressionSerializer);
-Tuple2<Expression, bool> unwrapEqualsNull(EqualsNull expression) {
- return new Tuple2(expression.expression, expression.isNot);
+Expression unwrapEqualsNull(EqualsNull expression) {
+ return expression.expression;
}
-EqualsNull wrapEqualsNull(Tuple2<Expression, bool> tuple) {
- return new EqualsNull(tuple.first, isNot: tuple.second);
+EqualsNull wrapEqualsNull(Expression expression) {
+ return new EqualsNull(expression);
}
TextSerializer<EqualsCall> equalsCallSerializer = new Wrapped<
- Tuple5<Expression, Expression, bool, CanonicalName, DartType>,
- EqualsCall>(
+ Tuple4<Expression, Expression, CanonicalName, DartType>, EqualsCall>(
unwrapEqualsCall,
wrapEqualsCall,
- new Tuple5Serializer(expressionSerializer, expressionSerializer,
- const DartBool(), const CanonicalNameSerializer(), dartTypeSerializer));
+ new Tuple4Serializer(expressionSerializer, expressionSerializer,
+ const CanonicalNameSerializer(), dartTypeSerializer));
-Tuple5<Expression, Expression, bool, CanonicalName, DartType> unwrapEqualsCall(
+Tuple4<Expression, Expression, CanonicalName, DartType> unwrapEqualsCall(
EqualsCall expression) {
- return new Tuple5(
+ return new Tuple4(
expression.left,
expression.right,
- expression.isNot,
expression.interfaceTargetReference.canonicalName,
expression.functionType);
}
EqualsCall wrapEqualsCall(
- Tuple5<Expression, Expression, bool, CanonicalName, DartType> tuple) {
+ Tuple4<Expression, Expression, CanonicalName, DartType> tuple) {
return new EqualsCall.byReference(tuple.first, tuple.second,
- isNot: tuple.third,
- interfaceTargetReference: tuple.fourth.getReference(),
- functionType: tuple.fifth);
+ interfaceTargetReference: tuple.third.getReference(),
+ functionType: tuple.fourth);
}
TextSerializer<SuperMethodInvocation> superMethodInvocationSerializer =
diff --git a/pkg/kernel/lib/transformations/value_class.dart b/pkg/kernel/lib/transformations/value_class.dart
index 0264e0a..5a5f424 100644
--- a/pkg/kernel/lib/transformations/value_class.dart
+++ b/pkg/kernel/lib/transformations/value_class.dart
@@ -52,7 +52,7 @@
// V v;
// (v as dynamic).copyWith() as V
bool predicate(MethodInvocation node) {
- return node.name.name == "copyWith" &&
+ return node.name.text == "copyWith" &&
_isValueClassAsConstruct(node.receiver);
}
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index a42bdc8..d078850 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -1156,6 +1156,19 @@
}
@override
+ DartType visitInstanceGetterInvocation(InstanceGetterInvocation node) {
+ // TODO(johnniwinther): Use embedded static type.
+ Member target = node.interfaceTarget;
+ assert(
+ !(target is Procedure &&
+ environment.isSpecialCasedBinaryOperator(target)),
+ "Unexpected instance getter invocation target: $target");
+ visitExpression(node.receiver);
+ return handleCall(node.arguments, target.getterType,
+ receiver: getReceiverType(node, node.receiver, node.interfaceTarget));
+ }
+
+ @override
DartType visitInstanceSet(InstanceSet node) {
DartType value = visitExpression(node.value);
Substitution receiver =
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index ae54219..f4afa00 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -35,6 +35,8 @@
R visitDynamicInvocation(DynamicInvocation node) => defaultExpression(node);
R visitFunctionInvocation(FunctionInvocation node) => defaultExpression(node);
R visitInstanceInvocation(InstanceInvocation node) => defaultExpression(node);
+ R visitInstanceGetterInvocation(InstanceGetterInvocation node) =>
+ defaultExpression(node);
R visitEqualsNull(EqualsNull node) => defaultExpression(node);
R visitEqualsCall(EqualsCall node) => defaultExpression(node);
R visitMethodInvocation(MethodInvocation node) => defaultExpression(node);
@@ -207,6 +209,8 @@
R visitDynamicInvocation(DynamicInvocation node) => defaultExpression(node);
R visitFunctionInvocation(FunctionInvocation node) => defaultExpression(node);
R visitInstanceInvocation(InstanceInvocation node) => defaultExpression(node);
+ R visitInstanceGetterInvocation(InstanceGetterInvocation node) =>
+ defaultExpression(node);
R visitEqualsNull(EqualsNull node) => defaultExpression(node);
R visitEqualsCall(EqualsCall node) => defaultExpression(node);
R visitMethodInvocation(MethodInvocation node) => defaultExpression(node);
@@ -363,6 +367,8 @@
defaultExpression(node, arg);
R visitInstanceInvocation(InstanceInvocation node, A arg) =>
defaultExpression(node, arg);
+ R visitInstanceGetterInvocation(InstanceGetterInvocation node, A arg) =>
+ defaultExpression(node, arg);
R visitEqualsNull(EqualsNull node, A arg) => defaultExpression(node, arg);
R visitEqualsCall(EqualsCall node, A arg) => defaultExpression(node, arg);
R visitMethodInvocation(MethodInvocation node, A arg) =>
@@ -1450,6 +1456,8 @@
defaultExpression(node, arg);
R visitInstanceInvocation(InstanceInvocation node, T arg) =>
defaultExpression(node, arg);
+ R visitInstanceGetterInvocation(InstanceGetterInvocation node, T arg) =>
+ defaultExpression(node, arg);
R visitEqualsNull(EqualsNull node, T arg) => defaultExpression(node, arg);
R visitEqualsCall(EqualsCall node, T arg) => defaultExpression(node, arg);
R visitMethodInvocation(MethodInvocation node, T arg) =>
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
index 9f7415c..d8cacea 100644
--- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -232,7 +232,6 @@
case kInvalidType:
case kDynamicType:
case kVoidType:
- case kBottomType:
// those contain nothing.
break;
case kNeverType:
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 1da5a95..7324e81 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -2135,7 +2135,6 @@
case kInvalidType:
case kDynamicType:
case kVoidType:
- case kBottomType:
// those contain nothing.
return;
case kNeverType:
@@ -2985,11 +2984,6 @@
.ToNullability(nullability, Heap::kOld);
break;
}
- case kBottomType:
- // Map Bottom type to Null type until not emitted by CFE anymore.
- result_ = IG->object_store()->null_type();
- ASSERT(result_.IsNullable());
- break;
case kInterfaceType:
BuildInterfaceType(false);
break;
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 32f02f5..12d1c1e 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -1318,7 +1318,6 @@
case kInvalidType:
case kDynamicType:
case kVoidType:
- case kBottomType:
// those contain nothing.
return;
case kNeverType:
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 472de49..1c29a5b 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,8 +20,8 @@
static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
// Both version numbers are inclusive.
-static const uint32_t kMinSupportedKernelFormatVersion = 56;
-static const uint32_t kMaxSupportedKernelFormatVersion = 56;
+static const uint32_t kMinSupportedKernelFormatVersion = 57;
+static const uint32_t kMaxSupportedKernelFormatVersion = 57;
// Keep in sync with package:kernel/lib/binary/tag.dart
#define KERNEL_TAG_LIST(V) \
@@ -118,7 +118,6 @@
V(AsyncForInStatement, 80) \
V(AssertBlock, 81) \
V(TypedefType, 87) \
- V(BottomType, 89) \
V(NeverType, 98) \
V(InvalidType, 90) \
V(DynamicType, 91) \
@@ -132,6 +131,7 @@
V(InstanceGet, 118) \
V(InstanceSet, 119) \
V(InstanceInvocation, 120) \
+ V(InstanceGetterInvocation, 89) \
V(InstanceTearOff, 121) \
V(DynamicGet, 122) \
V(DynamicSet, 123) \