blob: cef03af5e7957a2348641930dcf127de168c1d3f [file] [log] [blame]
// 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;
}