20faaa5d94
Change-Id: Ib18f554c1076f27a3f7c0df5a36410da41a1f467 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/148784 Reviewed-by: Paul Berry <paulberry@google.com> Reviewed-by: Sigmund Cherem <sigmund@google.com>
159 lines
5.4 KiB
Dart
159 lines
5.4 KiB
Dart
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
// @dart = 2.7
|
|
|
|
/*member: Class.:[exact=Class]*/
|
|
class Class {
|
|
/*member: Class.field:[exact=JSUInt31]*/
|
|
var field = 42;
|
|
|
|
/*member: Class.method:[null]*/
|
|
method([/*[null|exact=JSUInt31]*/ a, /*[null|exact=JSUInt31]*/ b]) {}
|
|
}
|
|
|
|
/*member: main:[null]*/
|
|
main() {
|
|
new Class();
|
|
statementOrderFieldAccess(null);
|
|
statementOrderFieldUpdate(null);
|
|
statementOrderInvocation(null);
|
|
receiverVsArgument(null);
|
|
argumentsOrder(null);
|
|
operatorOrder(null);
|
|
updateVsRhs(null);
|
|
logicalOr(null);
|
|
conditionalCondition(null);
|
|
conditionalBothBranches(null);
|
|
conditionalOneBranchOnly(null);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Accesses in statements.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: statementOrderFieldAccess:[null]*/
|
|
@pragma('dart2js:assumeDynamic')
|
|
statementOrderFieldAccess(/*[null|subclass=Object]*/ o) {
|
|
o.field;
|
|
o. /*[subclass=Object]*/ field;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Updates in statements.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: statementOrderFieldUpdate:[null]*/
|
|
@pragma('dart2js:assumeDynamic')
|
|
statementOrderFieldUpdate(/*[null|subclass=Object]*/ o) {
|
|
o.field = 42;
|
|
o. /*update: [subclass=Object]*/ field = 42;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Invocations in statements.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: statementOrderInvocation:[null]*/
|
|
@pragma('dart2js:assumeDynamic')
|
|
statementOrderInvocation(/*[null|subclass=Object]*/ o) {
|
|
o.method(null);
|
|
o. /*invoke: [subclass=Object]*/ method(null);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Access in argument before method call.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: receiverVsArgument:[null]*/
|
|
@pragma('dart2js:assumeDynamic')
|
|
receiverVsArgument(/*[null|subclass=Object]*/ o) {
|
|
// TODO(johnniwinther): The arguments should refine the receiver.
|
|
o.method(o.field);
|
|
o. /*[subclass=Object]*/ field;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Access in multiple arguments.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: argumentsOrder:[null]*/
|
|
@pragma('dart2js:assumeDynamic')
|
|
argumentsOrder(/*[null|subclass=Object]*/ o) {
|
|
// TODO(johnniwinther): The arguments should refine the receiver.
|
|
o.method(o.field, o. /*[subclass=Object]*/ field);
|
|
o. /*[subclass=Object]*/ field;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Access in both sides of an operator call.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: operatorOrder:[null]*/
|
|
@pragma('dart2js:assumeDynamic')
|
|
operatorOrder(/*[null|subclass=Object]*/ o) {
|
|
o.field /*invoke: [exact=JSUInt31]*/ < o. /*[subclass=Object]*/ field;
|
|
o. /*[subclass=Object]*/ field;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Assign after access in right-hand side.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: updateVsRhs:[null]*/
|
|
@pragma('dart2js:assumeDynamic')
|
|
updateVsRhs(/*[null|subclass=Object]*/ o) {
|
|
// TODO(johnniwinther): The right-hand side should refine the left-hand side
|
|
// receiver.
|
|
o.field = o.field;
|
|
o. /*[subclass=Object]*/ field;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Access in both sides of a logical or.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: logicalOr:[null]*/
|
|
@pragma('dart2js:assumeDynamic')
|
|
logicalOr(/*[null|subclass=Object]*/ o) {
|
|
o.field || o. /*[subclass=Object]*/ field;
|
|
o. /*[subclass=Object]*/ field;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Access in condition of a conditional expression.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: conditionalCondition:[null]*/
|
|
@pragma('dart2js:assumeDynamic')
|
|
conditionalCondition(/*[null|subclass=Object]*/ o) {
|
|
o.field ? o. /*[subclass=Object]*/ field : o. /*[subclass=Object]*/ field;
|
|
o. /*[subclass=Object]*/ field;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Access both branches of a conditional expression.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: conditionalBothBranches:[null]*/
|
|
@pragma('dart2js:assumeDynamic')
|
|
conditionalBothBranches(/*[null|subclass=Object]*/ o) {
|
|
// ignore: DEAD_CODE
|
|
true ? o.field : o.field;
|
|
o. /*[subclass=Object]*/ field;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// Access in only one branch of a conditional expression.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*member: conditionalOneBranchOnly:[null]*/
|
|
@pragma('dart2js:assumeDynamic')
|
|
conditionalOneBranchOnly(/*[null|subclass=Object]*/ o) {
|
|
// ignore: DEAD_CODE
|
|
true ? o.field : null;
|
|
o.field;
|
|
o. /*[subclass=Object]*/ field;
|
|
}
|