[cfe,kernel] Add AstPrinter

This CL adds a Node.toText method together with an AstPrinter. These
facility and better toString implementation on AST nodes while allowing
for toString independent printing of AST to use in testing. This also
add support for an integrated toString of custom/internal nodes.

Some work is still needed in bringing the toString implementation on
all nodes to the old quality, and not all internal nodes have
customized textual representations yet. This work is left for future
CLs.

Change-Id: Ib0bf8a0bc02f489dfacdc8aa5f96da9c52f26058
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/150923
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Jens Johansen <jensj@google.com>
This commit is contained in:
Johnni Winther 2020-06-16 17:15:10 +00:00 committed by commit-bot@chromium.org
parent b2d41ab0a2
commit 7fce125300
92 changed files with 4579 additions and 1415 deletions

View file

@ -125,7 +125,9 @@ class IdValue {
static const String stmtPrefix = "stmt: ";
static const String errorPrefix = "error: ";
static IdValue decode(Uri sourceUri, Annotation annotation, String text) {
static IdValue decode(Uri sourceUri, Annotation annotation, String text,
{bool preserveWhitespaceInAnnotations: false,
bool preserveInfixWhitespace: false}) {
int offset = annotation.offset;
Id id;
String expected;
@ -182,8 +184,15 @@ class IdValue {
id = new NodeId(offset, IdKind.node);
expected = text;
}
// Remove newlines.
expected = expected.replaceAll(new RegExp(r'\s*(\n\s*)+\s*'), '');
if (preserveWhitespaceInAnnotations) {
// Keep all whitespace.
} else if (preserveInfixWhitespace) {
// Remove heading and trailing whitespace.
expected = expected.trim();
} else {
// Remove unneeded whitespace.
expected = expected.replaceAll(new RegExp(r'\s*(\n\s*)+\s*'), '');
}
return new IdValue(id, annotation, expected);
}
}

View file

@ -219,7 +219,9 @@ class MemberAnnotations<DataType> {
// TODO(johnniwinther): Support an empty marker set.
void computeExpectedMap(Uri sourceUri, String filename, AnnotatedCode code,
Map<String, MemberAnnotations<IdValue>> maps,
{void onFailure(String message)}) {
{void onFailure(String message),
bool preserveWhitespaceInAnnotations: false,
bool preserveInfixWhitespaceInAnnotations: false}) {
List<String> mapKeys = maps.keys.toList();
Map<String, AnnotatedCode> split = splitByPrefixes(code, mapKeys);
@ -229,7 +231,9 @@ void computeExpectedMap(Uri sourceUri, String filename, AnnotatedCode code,
Map<Id, IdValue> expectedValues = fileAnnotations[sourceUri];
for (Annotation annotation in code.annotations) {
String text = annotation.text;
IdValue idValue = IdValue.decode(sourceUri, annotation, text);
IdValue idValue = IdValue.decode(sourceUri, annotation, text,
preserveWhitespaceInAnnotations: preserveWhitespaceInAnnotations,
preserveInfixWhitespace: preserveInfixWhitespaceInAnnotations);
if (idValue.id.isGlobal) {
if (fileAnnotations.globalData.containsKey(idValue.id)) {
onFailure("Error in test '$filename': "
@ -259,7 +263,9 @@ void computeExpectedMap(Uri sourceUri, String filename, AnnotatedCode code,
TestData computeTestData(FileSystemEntity testFile,
{Iterable<String> supportedMarkers,
Uri createTestUri(Uri uri, String fileName),
void onFailure(String message)}) {
void onFailure(String message),
bool preserveWhitespaceInAnnotations: false,
bool preserveInfixWhitespaceInAnnotations: false}) {
Uri entryPoint;
String testName;
@ -300,7 +306,10 @@ TestData computeTestData(FileSystemEntity testFile,
}
computeExpectedMap(entryPoint, testFile.uri.pathSegments.last,
code[entryPoint], expectedMaps,
onFailure: onFailure);
onFailure: onFailure,
preserveWhitespaceInAnnotations: preserveWhitespaceInAnnotations,
preserveInfixWhitespaceInAnnotations:
preserveInfixWhitespaceInAnnotations);
Map<String, String> memorySourceFiles = {
entryPoint.path: code[entryPoint].sourceCode
};
@ -317,7 +326,10 @@ TestData computeTestData(FileSystemEntity testFile,
code[libFileUri] = annotatedLibCode;
computeExpectedMap(
libFileUri, libFileName, annotatedLibCode, expectedMaps,
onFailure: onFailure);
onFailure: onFailure,
preserveWhitespaceInAnnotations: preserveWhitespaceInAnnotations,
preserveInfixWhitespaceInAnnotations:
preserveInfixWhitespaceInAnnotations);
}
}
@ -713,7 +725,9 @@ Future<void> runTests<T>(Directory dataDir,
void onFailure(String message),
RunTestFunction<T> runTest,
List<String> skipList,
Map<String, List<String>> skipMap}) async {
Map<String, List<String>> skipMap,
bool preserveWhitespaceInAnnotations: false,
bool preserveInfixWhitespaceInAnnotations: false}) async {
MarkerOptions markerOptions =
new MarkerOptions.fromDataDir(dataDir, shouldFindScript: shards == 1);
// TODO(johnniwinther): Support --show to show actual data for an input.
@ -775,7 +789,10 @@ Future<void> runTests<T>(Directory dataDir,
TestData testData = computeTestData(entity,
supportedMarkers: markerOptions.supportedMarkers,
createTestUri: createTestUri,
onFailure: onFailure);
onFailure: onFailure,
preserveWhitespaceInAnnotations: preserveWhitespaceInAnnotations,
preserveInfixWhitespaceInAnnotations:
preserveInfixWhitespaceInAnnotations);
print('Test: ${testData.testFileUri}');
Map<String, TestResult<T>> results = await runTest(testData,

View file

@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart' as ir;
import 'package:kernel/src/printer.dart' as ir;
import 'package:kernel/text/ast_to_text.dart' as ir show debugNodeToString;
/// Collection of scope data collected for a single member.
@ -419,6 +420,12 @@ class TypeVariableTypeWithContext implements ir.Node {
'type=${type.toStringInternal()},context=${context.toStringInternal()},'
'kind=$kind,typeDeclaration=${typeDeclaration.toStringInternal()}';
@override
String toText(ir.AstTextStrategy strategy) => type.toText(strategy);
@override
void toTextInternal(ir.AstPrinter printer) => type.toTextInternal(printer);
@override
String leakingDebugToString() => ir.debugNodeToString(this);
}

View file

@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart' as ir;
import 'package:kernel/src/printer.dart' as ir;
import 'package:kernel/type_environment.dart' as ir;
import 'package:front_end/src/api_prototype/constant_evaluator.dart' as ir;
import 'package:front_end/src/api_unstable/dart2js.dart' as ir;
@ -204,4 +205,11 @@ class ConstantReference extends ir.TreeNode {
@override
String toStringInternal() => 'constant=${constant.toStringInternal()}';
@override
String toText(ir.AstTextStrategy strategy) => constant.toText(strategy);
@override
void toTextInternal(ir.AstPrinter printer) =>
constant.toTextInternal(printer);
}

View file

@ -9,6 +9,7 @@ import 'package:kernel/core_types.dart';
import 'package:kernel/kernel.dart';
import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/type_environment.dart';
import 'package:kernel/src/printer.dart';
import 'package:kernel/target/targets.dart';
import 'package:test/test.dart';
@ -17,6 +18,11 @@ import 'package:dev_compiler/src/kernel/nullable_inference.dart';
import 'package:dev_compiler/src/kernel/js_typerep.dart';
import 'package:dev_compiler/src/kernel/target.dart';
const AstTextStrategy astTextStrategy = AstTextStrategy(
includeLibraryNamesInTypes: true,
includeLibraryNamesInMembers: true,
useMultiline: false);
void main() {
test('empty main', () async {
await expectNotNull('main() {}', '');
@ -72,7 +78,7 @@ void main() {
test('constructor', () async {
await expectNotNull(
'library a; class C {} main() { new C(); }', 'new a::C::•()');
'library a; class C {} main() { new C(); }', 'new a::C()');
});
group('operator', () {
@ -249,8 +255,8 @@ void main() {
});
test('function expression', () async {
await expectNotNull('main() { () => null; f() {}; f; }',
'() → dart.core::Null? => null, f');
await expectNotNull(
'main() { () => null; f() {}; f; }', 'dart.core::Null? () => null, f');
});
test('cascades (kernel BlockExpression)', () async {
@ -302,7 +308,7 @@ void main() {
var y = (x = null) == null;
print(x);
print(y);
}''', '1, (x = null).{dart.core::Object::==}(null), y');
}''', '1, (x = null).{dart.core::Object.==}(null), y');
});
test('declaration from variable transitive', () async {
await expectNotNull('''main() {
@ -339,8 +345,8 @@ void main() {
}''',
// arithmetic operation results on `i` are themselves not null, even
// though `i` is nullable.
'0, i.{dart.core::num::<}(10), 10, i = i.{dart.core::num::+}(1), '
'i.{dart.core::num::+}(1), 1, i.{dart.core::num::>=}(10), 10');
'0, i.{dart.core::num.<}(10), 10, i = i.{dart.core::num.+}(1), '
'i.{dart.core::num.+}(1), 1, i.{dart.core::num.>=}(10), 10');
});
test('for-in', () async {
await expectNotNull('''main() {
@ -362,7 +368,7 @@ void main() {
print(z);
}
f(42);
}''', '0, () → void => dart.core::print("g"), "g", g, y, 1, z, f, 42');
}''', '0, void () => dart.core::print("g"), "g", g, y, 1, z, f, 42');
});
test('assignment to closure variable', () async {
await expectNotNull('''main() {
@ -391,8 +397,7 @@ void main() {
await expectNotNull('''main() {
var x = () => 42;
var y = (() => x = null);
}''',
'() → dart.core::int* => 42, 42, () → dart.core::Null? => x = null');
}''', 'dart.core::int* () => 42, 42, dart.core::Null? () => x = null');
});
test('do not depend on unrelated variables', () async {
await expectNotNull('''main() {
@ -481,7 +486,7 @@ void main() {
await expectNotNull(
'library b; $imports class C { @notNull m() {} } '
'main() { var c = new C(); c.m(); }',
'new b::C::•(), c.{b::C::m}(), c');
'new b::C(), c.{b::C.m}(), c');
});
});
}
@ -505,9 +510,9 @@ Future expectNotNull(String code, String expectedNotNull) async {
// Print integer values as integers
return BigInt.from(c.value).toString();
}
return c.toConstantText();
return c.toText(astTextStrategy);
}
return e.leakingDebugToString();
return e.toText(astTextStrategy);
})
// Filter out our own NotNull annotations. The library prefix changes
// per test, so just filter on the suffix.

View file

@ -19,6 +19,8 @@ import 'package:kernel/ast.dart'
transformList,
visitList;
import 'package:kernel/src/printer.dart';
import 'package:kernel/type_environment.dart' show StaticTypeContext;
import 'package:kernel/visitor.dart'
@ -106,8 +108,8 @@ class SpreadElement extends Expression with ControlFlowElement {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter state) {
// TODO(johnniwinther): Implement this.
}
}
@ -172,8 +174,8 @@ class IfElement extends Expression with ControlFlowElement {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter state) {
// TODO(johnniwinther): Implement this.
}
}
@ -234,8 +236,8 @@ class ForElement extends Expression with ControlFlowElement {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter state) {
// TODO(johnniwinther): Implement this.
}
}
@ -323,8 +325,8 @@ class ForInElement extends Expression with ControlFlowElement {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter state) {
// TODO(johnniwinther): Implement this.
}
}
@ -351,6 +353,16 @@ mixin ControlFlowMapEntry implements MapEntry {
@override
R accept<R>(TreeVisitor<R> v) => v.defaultTreeNode(this);
@override
String toStringInternal() => toText(defaultAstTextStrategy);
@override
String toText(AstTextStrategy strategy) {
AstPrinter state = new AstPrinter(strategy);
toTextInternal(state);
return state.getText();
}
}
/// A spread element in a map literal.
@ -387,8 +399,8 @@ class SpreadMapEntry extends TreeNode with ControlFlowMapEntry {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter state) {
// TODO(johnniwinther): Implement this.
}
}
@ -433,8 +445,8 @@ class IfMapEntry extends TreeNode with ControlFlowMapEntry {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter state) {
// TODO(johnniwinther): Implement this.
}
}
@ -480,8 +492,8 @@ class ForMapEntry extends TreeNode with ControlFlowMapEntry {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter state) {
// TODO(johnniwinther): Implement this.
}
}
@ -554,8 +566,8 @@ class ForInMapEntry extends TreeNode with ControlFlowMapEntry {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter state) {
// TODO(johnniwinther): Implement this.
}
}

View file

@ -1899,7 +1899,7 @@ class ConstantEvaluator extends RecursiveVisitor<Constant> {
if (constant is DoubleConstant && intFolder.isInt(constant)) {
value = new BigInt.from(constant.value).toString();
} else {
value = constant.toString();
value = constant.value.toString();
}
Object last = concatenated.last;
if (last is StringBuffer) {

View file

@ -7,6 +7,7 @@ library fasta.fangorn;
import 'dart:core' hide MapEntry;
import 'package:kernel/ast.dart';
import 'package:kernel/src/printer.dart';
import '../problems.dart' show unsupported;
@ -761,7 +762,14 @@ class _VariablesDeclaration extends Statement {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
for (int index = 0; index < declarations.length; index++) {
if (index > 0) {
printer.write(', ');
}
printer.writeVariableDeclaration(declarations[index],
includeModifiersAndType: index == 0);
}
printer.write(';');
}
}

View file

@ -10,6 +10,7 @@ import 'package:kernel/ast.dart' hide MapEntry;
import 'package:kernel/src/assumptions.dart';
import 'package:kernel/src/legacy_erasure.dart';
import 'package:kernel/src/printer.dart';
import '../builder/field_builder.dart';
import '../constant_context.dart';
@ -58,8 +59,8 @@ abstract class ImplicitFieldType extends DartType {
}
@override
void toTypeTextInternal(StringBuffer sb, {bool verbose: false}) {
sb.write('<implicit-field-type:$fieldBuilder>');
void toTextInternal(AstPrinter printer) {
printer.write('<implicit-field-type:$fieldBuilder>');
}
void addOverride(ImplicitFieldType other);

View file

@ -7,6 +7,7 @@ library fasta.implicit_type_argument;
import 'package:kernel/ast.dart'
show DartType, DartTypeVisitor, DartTypeVisitor1, Nullability, Visitor;
import 'package:kernel/src/assumptions.dart';
import 'package:kernel/src/printer.dart';
import '../problems.dart' show unhandled, unsupported;
@ -49,8 +50,8 @@ class ImplicitTypeArgument extends DartType {
bool equals(Object other, Assumptions assumptions) => this == other;
@override
void toTypeTextInternal(StringBuffer sb, {bool verbose: false}) {
sb.write('<implicit-type-argument>');
void toTextInternal(AstPrinter printer) {
printer.write('<implicit-type-argument>');
}
@override

View file

@ -22,6 +22,7 @@ import 'dart:core' hide MapEntry;
import 'package:kernel/ast.dart';
import 'package:kernel/text/ast_to_text.dart' show Precedence, Printer;
import 'package:kernel/src/printer.dart';
import 'package:kernel/core_types.dart';
import '../fasta_codes.dart'
@ -279,8 +280,8 @@ class ForInStatementWithSynthesizedVariable extends InternalStatement {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter state) {
// TODO(johnniwinther): Implement this.
}
}
@ -326,8 +327,17 @@ class TryStatement extends InternalStatement {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
printer.write('try ');
printer.writeStatement(tryBlock);
for (Catch catchBlock in catchBlocks) {
printer.write(' ');
printer.writeCatch(catchBlock);
}
if (finallyBlock != null) {
printer.write(' finally ');
printer.writeStatement(finallyBlock);
}
}
}
@ -344,11 +354,6 @@ class SwitchCaseImpl extends SwitchCase {
String toString() {
return "SwitchCaseImpl(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
class BreakStatementImpl extends BreakStatement {
@ -365,8 +370,14 @@ class BreakStatementImpl extends BreakStatement {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
if (isContinue) {
printer.write('continue ');
} else {
printer.write('break ');
}
printer.write(printer.getLabelName(target));
printer.write(';');
}
}
@ -431,6 +442,11 @@ abstract class InternalExpression extends Expression {
ExpressionInferenceResult acceptInference(
InferenceVisitor visitor, DartType typeContext);
@override
void toTextInternal(AstPrinter printer) {
// TODO(johnniwinther): Implement this.
}
}
/// Front end specific implementation of [Argument].
@ -500,12 +516,6 @@ class ArgumentsImpl extends Arguments {
String toString() {
return "ArgumentsImpl(${toStringInternal()})";
}
@override
String toStringInternal() {
// TODO(jensj): Make (much) better.
return "";
}
}
/// Internal expression representing a cascade expression.
@ -575,8 +585,22 @@ class Cascade extends InternalExpression {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
printer.write('let ');
printer.writeVariableDeclaration(variable);
printer.write(' in cascade {');
printer.incIndentation();
for (Expression expression in expressions) {
printer.newLine();
printer.writeExpression(expression);
printer.write(';');
}
printer.decIndentation();
if (expressions.isNotEmpty) {
printer.newLine();
}
printer.write('} => ');
printer.write(printer.getVariableName(variable));
}
}
@ -624,8 +648,11 @@ class DeferredCheck extends InternalExpression {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
printer.write('let ');
printer.writeVariableDeclaration(variable);
printer.write(' in ');
printer.writeExpression(expression);
}
}
@ -661,8 +688,19 @@ class FactoryConstructorInvocationJudgment extends StaticInvocation
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
if (isConst) {
printer.write('const ');
} else {
printer.write('new ');
}
printer.writeClassName(target.enclosingClass.reference);
printer.writeTypeArguments(arguments.types);
if (target.name.name.isNotEmpty) {
printer.write('.');
printer.write(target.name.name);
}
printer.writeArguments(arguments, includeTypeArguments: false);
}
}
@ -683,11 +721,6 @@ class FunctionDeclarationImpl extends FunctionDeclaration {
String toString() {
return "FunctionDeclarationImpl(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Concrete shadow object representing a super initializer in kernel form.
@ -709,11 +742,6 @@ class InvalidSuperInitializerJudgment extends LocalInitializer
String toString() {
return "InvalidSuperInitializerJudgment(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an if-null expression.
@ -764,8 +792,11 @@ class IfNullExpression extends InternalExpression {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
printer.writeExpression(left, minimumPrecedence: Precedence.CONDITIONAL);
printer.write(' ?? ');
printer.writeExpression(right,
minimumPrecedence: Precedence.CONDITIONAL + 1);
}
}
@ -822,8 +853,12 @@ class IntJudgment extends IntLiteral implements ExpressionJudgment {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
if (literal == null) {
printer.write('$value');
} else {
printer.write(literal);
}
}
}
@ -861,8 +896,8 @@ class ShadowLargeIntLiteral extends IntLiteral implements ExpressionJudgment {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
printer.write(literal);
}
}
@ -880,11 +915,6 @@ class ShadowInvalidInitializer extends LocalInitializer
String toString() {
return "ShadowInvalidInitializer(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Concrete shadow object representing an invalid initializer in kernel form.
@ -908,11 +938,6 @@ class ShadowInvalidFieldInitializer extends LocalInitializer
String toString() {
return "ShadowInvalidFieldInitializer(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
class ExpressionInvocation extends InternalExpression {
@ -958,8 +983,9 @@ class ExpressionInvocation extends InternalExpression {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
printer.writeExpression(expression);
printer.writeArguments(arguments);
}
}
@ -987,11 +1013,6 @@ class NamedFunctionExpressionJudgment extends Let
String toString() {
return "NamedFunctionExpressionJudgment(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing a null-aware method invocation.
@ -1046,8 +1067,24 @@ class NullAwareMethodInvocation extends InternalExpression {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
Expression methodInvocation = invocation;
if (methodInvocation is MethodInvocation) {
Expression receiver = methodInvocation.receiver;
if (receiver is VariableGet && receiver.variable == variable) {
// Special-case the usual use of this node.
printer.writeExpression(variable.initializer);
printer.write('?.');
printer.writeInterfaceMemberName(
methodInvocation.interfaceTargetReference, methodInvocation.name);
printer.writeArguments(methodInvocation.arguments);
return;
}
}
printer.write('let ');
printer.writeVariableDeclaration(variable);
printer.write(' in null-aware ');
printer.writeExpression(methodInvocation);
}
}
@ -1103,8 +1140,23 @@ class NullAwarePropertyGet extends InternalExpression {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
Expression propertyGet = read;
if (propertyGet is PropertyGet) {
Expression receiver = propertyGet.receiver;
if (receiver is VariableGet && receiver.variable == variable) {
// Special-case the usual use of this node.
printer.writeExpression(variable.initializer);
printer.write('?.');
printer.writeInterfaceMemberName(
propertyGet.interfaceTargetReference, propertyGet.name);
return;
}
}
printer.write('let ');
printer.writeVariableDeclaration(variable);
printer.write(' in null-aware ');
printer.writeExpression(propertyGet);
}
}
@ -1160,8 +1212,25 @@ class NullAwarePropertySet extends InternalExpression {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
Expression propertySet = write;
if (propertySet is PropertySet) {
Expression receiver = propertySet.receiver;
if (receiver is VariableGet && receiver.variable == variable) {
// Special-case the usual use of this node.
printer.writeExpression(variable.initializer);
printer.write('?.');
printer.writeInterfaceMemberName(
propertySet.interfaceTargetReference, propertySet.name);
printer.write(' = ');
printer.writeExpression(propertySet.value);
return;
}
}
printer.write('let ');
printer.writeVariableDeclaration(variable);
printer.write(' in null-aware ');
printer.writeExpression(propertySet);
}
}
@ -1178,8 +1247,17 @@ class ReturnStatementImpl extends ReturnStatement {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
if (isArrow) {
printer.write('=>');
} else {
printer.write('return');
}
if (expression != null) {
printer.write(' ');
printer.writeExpression(expression);
}
printer.write(';');
}
}
@ -1351,6 +1429,13 @@ class VariableDeclarationImpl extends VariableDeclaration {
// This is set in `InferenceVisitor.visitVariableDeclaration` when late
// lowering is enabled.
DartType lateType;
@override
void toTextInternal(AstPrinter printer) {
printer.writeVariableDeclaration(this,
isLate: isLate || lateGetter != null, type: lateType ?? type);
printer.write(';');
}
}
/// Front end specific implementation of [VariableGet].
@ -1372,11 +1457,6 @@ class VariableGetImpl extends VariableGet {
String toString() {
return "VariableGetImpl(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Front end specific implementation of [LoadLibrary].
@ -1391,8 +1471,10 @@ class LoadLibraryImpl extends LoadLibrary {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
printer.write(import.name);
printer.write('.loadLibrary');
printer.writeArguments(arguments);
}
}
@ -1434,8 +1516,9 @@ class LoadLibraryTearOff extends InternalExpression {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
printer.write(import.name);
printer.write('.loadLibrary');
}
}
@ -1508,8 +1591,13 @@ class IfNullPropertySet extends InternalExpression {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
printer.write('let ');
printer.writeVariableDeclaration(variable);
printer.write(' in if-null ');
printer.writeExpression(read);
printer.write(' ?? ');
printer.writeExpression(write);
}
}
@ -1573,8 +1661,10 @@ class IfNullSet extends InternalExpression {
}
@override
String toStringInternal() {
return "";
void toTextInternal(AstPrinter printer) {
printer.writeExpression(read);
printer.write(' ?? ');
printer.writeExpression(write);
}
}
@ -1698,11 +1788,6 @@ class CompoundExtensionSet extends InternalExpression {
String toString() {
return "CompoundExtensionSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an compound property assignment.
@ -1792,11 +1877,6 @@ class CompoundPropertySet extends InternalExpression {
String toString() {
return "CompoundPropertySet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an compound property assignment.
@ -1862,11 +1942,6 @@ class PropertyPostIncDec extends InternalExpression {
String toString() {
return "PropertyPostIncDec(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an local variable post inc/dec expression.
@ -1920,11 +1995,6 @@ class LocalPostIncDec extends InternalExpression {
String toString() {
return "LocalPostIncDec(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an static member post inc/dec expression.
@ -1978,11 +2048,6 @@ class StaticPostIncDec extends InternalExpression {
String toString() {
return "StaticPostIncDec(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an static member post inc/dec expression.
@ -2036,11 +2101,6 @@ class SuperPostIncDec extends InternalExpression {
String toString() {
return "SuperPostIncDec(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an index get expression.
@ -2087,11 +2147,6 @@ class IndexGet extends InternalExpression {
String toString() {
return "IndexGet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an index set expression.
@ -2166,11 +2221,6 @@ class IndexSet extends InternalExpression {
String toString() {
return "IndexSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing a super index set expression.
@ -2232,11 +2282,6 @@ class SuperIndexSet extends InternalExpression {
String toString() {
return "SuperIndexSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an extension index set expression.
@ -2322,11 +2367,6 @@ class ExtensionIndexSet extends InternalExpression {
String toString() {
return "ExtensionIndexSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an if-null index assignment.
@ -2429,11 +2469,6 @@ class IfNullIndexSet extends InternalExpression {
String toString() {
return "IfNullIndexSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an if-null super index set expression.
@ -2521,11 +2556,6 @@ class IfNullSuperIndexSet extends InternalExpression {
String toString() {
return "IfNullSuperIndexSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an if-null super index set expression.
@ -2639,11 +2669,6 @@ class IfNullExtensionIndexSet extends InternalExpression {
String toString() {
return "IfNullExtensionIndexSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing a compound index assignment.
@ -2742,11 +2767,6 @@ class CompoundIndexSet extends InternalExpression {
String toString() {
return "CompoundIndexSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing a null-aware compound assignment.
@ -2859,11 +2879,6 @@ class NullAwareCompoundSet extends InternalExpression {
String toString() {
return "NullAwareCompoundSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an null-aware if-null property set.
@ -2951,11 +2966,6 @@ class NullAwareIfNullSet extends InternalExpression {
String toString() {
return "NullAwareIfNullSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing a compound super index assignment.
@ -3047,11 +3057,6 @@ class CompoundSuperIndexSet extends InternalExpression {
String toString() {
return "CompoundSuperIndexSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing a compound extension index assignment.
@ -3180,11 +3185,6 @@ class CompoundExtensionIndexSet extends InternalExpression {
String toString() {
return "CompoundExtensionIndexSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an assignment to an extension setter.
@ -3272,11 +3272,6 @@ class ExtensionSet extends InternalExpression {
String toString() {
return "ExtensionSet(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression representing an null-aware extension expression.
@ -3328,11 +3323,6 @@ class NullAwareExtension extends InternalExpression {
String toString() {
return "NullAwareExtension(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Front end specific implementation of [PropertySet].
@ -3353,11 +3343,6 @@ class PropertySetImpl extends PropertySet {
String toString() {
return "PropertySetImpl(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal representation of a read of an extension instance member.
@ -3409,11 +3394,6 @@ class ExtensionTearOff extends InternalExpression {
String toString() {
return "ExtensionTearOff(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression for an equals or not-equals expression.
@ -3459,11 +3439,6 @@ class EqualsExpression extends InternalExpression {
String toString() {
return "EqualsExpression(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression for a binary expression.
@ -3508,11 +3483,6 @@ class BinaryExpression extends InternalExpression {
String toString() {
return "BinaryExpression(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression for a unary expression.
@ -3550,11 +3520,6 @@ class UnaryExpression extends InternalExpression {
String toString() {
return "UnaryExpression(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Internal expression for a parenthesized expression.
@ -3591,11 +3556,6 @@ class ParenthesizedExpression extends InternalExpression {
String toString() {
return "ParenthesizedExpression(${toStringInternal()})";
}
@override
String toStringInternal() {
return "";
}
}
/// Creates a [Let] of [variable] with the given [body] using

View file

@ -275,23 +275,26 @@ class TypeLabeler implements DartTypeVisitor<void>, ConstantVisitor<void> {
void defaultConstant(Constant node) {}
void visitNullConstant(NullConstant node) {
result.add(node);
result.add('${node.value}');
}
void visitBoolConstant(BoolConstant node) {
result.add(node);
result.add('${node.value}');
}
void visitIntConstant(IntConstant node) {
result.add(node);
result.add('${node.value}');
}
void visitDoubleConstant(DoubleConstant node) {
result.add(node);
result.add('${node.value}');
}
void visitSymbolConstant(SymbolConstant node) {
result.add(node);
String text = node.libraryReference != null
? '#${node.libraryReference.asLibrary.importUri}::${node.name}'
: '#${node.name}';
result.add(text);
}
void visitStringConstant(StringConstant node) {

View file

@ -15,6 +15,7 @@ import 'package:kernel/ast.dart'
TypedefType,
Visitor;
import 'package:kernel/src/assumptions.dart';
import 'package:kernel/src/printer.dart';
import 'package:kernel/import_table.dart' show ImportTable;
@ -92,8 +93,8 @@ class UnknownType extends DartType {
UnknownType withDeclaredNullability(Nullability nullability) => this;
@override
void toTypeTextInternal(StringBuffer sb, {bool verbose: false}) {
sb.write('?');
void toTextInternal(AstPrinter printer) {
printer.write('?');
}
@override

View file

@ -72,7 +72,10 @@ main(List<String> args) async {
print("OK");
exitCode = 0;
} else {
print("Missing toString() on $toGo classes!");
String classes = classMap.values
.map((list) => list.map((cls) => cls.name).join(', '))
.join(', ');
print("Missing toString() on $toGo class(es): ${classes}");
if (args.length == 1 && args.single == "--interactive") {
for (Uri uri in classMap.keys) {

View file

@ -880,6 +880,7 @@ remedy
removal
remover
reparse
repeating
replacements
replacer
replaces
@ -1158,6 +1159,7 @@ universally
unlinked
unlower
unmark
unneeded
unordered
unpaired
unparsed
@ -1175,6 +1177,7 @@ url
urls
usage
usr
usual
usually
utf16
utf8

View file

@ -210,6 +210,8 @@ five
flagged
floor
fluctuate
foo"bar"baz
foo'bar'baz
foo1
foo10
foo12
@ -223,6 +225,9 @@ foo6
foo7
foo8
foo9
foo\"bar'baz
foo\"bar\"baz
foo\"bar\'baz
foos
forbidden
forces
@ -277,6 +282,23 @@ internet
interpolate
inv
invalidating
invocation1a
invocation1b
invocation2a
invocation2b
invocation3a
invocation3b
invocation4a
invocation4b
invocation5a
invocation5b
invocation6a
invocation6b
invocation7a
invocation7b
invocation7c
invocation7d
invocation7e
ioo
isolate
isolates
@ -502,6 +524,8 @@ superinterface
supermixin
supplement
suspension
t\b\f\u
t\u0008\f\u
tails
talk
templates
@ -539,6 +563,7 @@ unpacked
unregistered
untransformed
untrimmed
unusual
upload
uppercase
upward

View file

@ -15,7 +15,7 @@ class Class2<T> {
const Class2(
this.
/*normal.Class2.T%*/
/*normal|limited.Class2.T%*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class2.T%*/
field1);
}
@ -25,11 +25,11 @@ class Class3<T, S> extends Class2<T> {
const Class3(
T
/*normal.Class3.T%*/
/*normal|limited.Class3.T%*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class3.T%*/
field1,
this.
/*normal.Class3.S%*/
/*normal|limited.Class3.S%*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class3.S%*/
field2)
: super(field1);
@ -40,14 +40,14 @@ class Class4<T, S> extends Class3<T, S> {
const Class4(
T
/*normal.Class4.T%*/
/*normal|limited.Class4.T%*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class4.T%*/
field1,
S
/*normal.Class4.S%*/
/*normal|limited.Class4.S%*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class4.S%*/
shadowedField2,
this. /*normal.Class4.S%*/
this. /*normal|limited.Class4.S%*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class4.S%*/
field2)
: super(field1, shadowedField2);
@ -61,92 +61,96 @@ const doubleConstant = /*3.14*/ 3.14;
const stringConstant = /*foo*/ "foo";
const symbolConstant = /*#name*/ #name;
const privateSymbolConstant =
/*normal.#_privateName*/
/*normal|limited.#_privateName*/
/*verbose.#library org-dartlang-test:///a/b/c/main.dart::_privateName*/
#_privateName;
const listConstant1 = /*<dynamic>[]*/ [];
const listConstant1 = /*const <dynamic>[]*/ [];
const listConstant2 = <int>
/*normal.<int>[]*/
/*verbose.<dart.core::int>[]*/
/*normal|limited.const <int>[]*/
/*verbose.const <dart.core::int>[]*/
[];
const listConstant3 = <int>
/*normal.<int>[0]*/
/*verbose.<dart.core::int>[0]*/
/*normal|limited.const <int>[0]*/
/*verbose.const <dart.core::int>[0]*/
[0];
const listConstant4 = <int?>
/*normal.<int?>[0, 1]*/
/*verbose.<dart.core::int?>[0, 1]*/
/*normal|limited.const <int?>[0, 1]*/
/*verbose.const <dart.core::int?>[0, 1]*/
[0, 1];
const setConstant1 = <int>
/*normal.<int>{}*/
/*verbose.<dart.core::int>{}*/
/*normal|limited.const <int>{}*/
/*verbose.const <dart.core::int>{}*/
{};
const setConstant2 = <int>
/*normal.<int>{0}*/
/*verbose.<dart.core::int>{0}*/
/*normal|limited.const <int>{0}*/
/*verbose.const <dart.core::int>{0}*/
{0};
const setConstant3 = <int?>
/*normal.<int?>{0, 1}*/
/*verbose.<dart.core::int?>{0, 1}*/
/*normal|limited.const <int?>{0, 1}*/
/*verbose.const <dart.core::int?>{0, 1}*/
{0, 1};
const mapConstant1 = /*<dynamic, dynamic>{}*/ {};
const mapConstant1 = /*const <dynamic, dynamic>{}*/ {};
const mapConstant2 = <int, String>
/*normal.<int, String>{}*/
/*verbose.<dart.core::int, dart.core::String>{}*/
/*normal|limited.const <int, String>{}*/
/*verbose.const <dart.core::int, dart.core::String>{}*/
{};
const mapConstant3 = <int, String>
/*normal.<int, String>{0: foo}*/
/*verbose.<dart.core::int, dart.core::String>{0: foo}*/
/*normal|limited.const <int, String>{0: foo}*/
/*verbose.const <dart.core::int, dart.core::String>{0: foo}*/
{0: "foo"};
const mapConstant4 = <int, String?>
/*normal.<int, String?>{0: foo, 1: bar}*/
/*verbose.<dart.core::int, dart.core::String?>{0: foo, 1: bar}*/
/*normal|limited.const <int, String?>{0: foo, 1: bar}*/
/*verbose.const <dart.core::int, dart.core::String?>{0: foo, 1: bar}*/
{0: "foo", 1: "bar"};
const tearOffConstant =
/*normal.id*/
/*normal|limited.id*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::id*/
id;
const int Function(int) partialInitializationConstant =
/*normal.<int>id*/
/*verbose.<dart.core::int>library org-dartlang-test:///a/b/c/main.dart::id*/
/*normal|limited.id<int>*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::id<dart.core::int>*/
id;
const boolHasEnvironmentConstant = const
/*unevaluated{FileUriExpression()}*/
/*normal|limited.unevaluated{bool.hasEnvironment(foo)}*/
/*verbose.unevaluated{{org-dartlang-test:///a/b/c/main.dart}dart.core::bool.hasEnvironment(foo)}*/
bool.hasEnvironment("foo");
const boolFromEnvironmentConstant = const
/*unevaluated{FileUriExpression()}*/
/*normal|limited.unevaluated{bool.fromEnvironment(foo, defaultValue: true)}*/
/*verbose.unevaluated{{org-dartlang-test:///a/b/c/main.dart}dart.core::bool.fromEnvironment(foo, defaultValue: true)}*/
bool.fromEnvironment("foo", defaultValue: true);
const intFromEnvironmentConstant = const
/*unevaluated{FileUriExpression()}*/
/*normal|limited.unevaluated{int.fromEnvironment(foo, defaultValue: 87)}*/
/*verbose.unevaluated{{org-dartlang-test:///a/b/c/main.dart}dart.core::int.fromEnvironment(foo, defaultValue: 87)}*/
int.fromEnvironment("foo", defaultValue: 87);
const stringFromEnvironmentConstant = const
/*unevaluated{FileUriExpression()}*/
/*normal|limited.unevaluated{String.fromEnvironment(foo, defaultValue: bar)}*/
/*verbose.unevaluated{{org-dartlang-test:///a/b/c/main.dart}dart.core::String.fromEnvironment(foo, defaultValue: bar)}*/
String.fromEnvironment("foo", defaultValue: "bar");
const instanceConstant1 = const
/*normal.Class1<dynamic>{}*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class1<dynamic>{}*/
/*normal|limited.const Class1<dynamic>{}*/
/*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class1<dynamic>{}*/
Class1();
const instanceConstant2 = const
/*normal.Class1<int>{}*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class1<dart.core::int>{}*/
/*normal|limited.const Class1<int>{}*/
/*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class1<dart.core::int>{}*/
Class1<int>();
const instanceConstant3 = const
/*normal.Class1<int>{}*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class1<dart.core::int>{}*/
/*normal|limited.const Class1<int>{}*/
/*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class1<dart.core::int>{}*/
Class1<int>();
const instanceConstant4 = const
/*normal.Class2<int>{Class2.field1: 0}*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class2<dart.core::int>{Class2.field1: 0}*/
/*normal|limited.const Class2<int>{Class2.field1: 0}*/
/*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class2<dart.core::int>{library org-dartlang-test:///a/b/c/main.dart::Class2.field1: 0}*/
Class2(0);
const instanceConstant5 = const
/*normal.Class2<num>{Class2.field1: 42}*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class2<dart.core::num>{Class2.field1: 42}*/
/*normal|limited.const Class2<num>{Class2.field1: 42}*/
/*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class2<dart.core::num>{library org-dartlang-test:///a/b/c/main.dart::Class2.field1: 42}*/
Class2<num>(42);
const instanceConstant6 = const
/*normal.Class3<int, String>{Class3.field2: foo, Class2.field1: 42}*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class3<dart.core::int, dart.core::String>{Class3.field2: foo, Class2.field1: 42}*/
/*normal|limited.const Class3<int, String>{Class3.field2: foo, Class2.field1: 42}*/
/*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class3<dart.core::int, dart.core::String>{library org-dartlang-test:///a/b/c/main.dart::Class3.field2: foo, library org-dartlang-test:///a/b/c/main.dart::Class2.field1: 42}*/
Class3<int, String>(42, "foo");
const instanceConstant7 = const
/*normal.Class4<int, String?>{Class4.field2: baz, Class3.field2: foo, Class2.field1: 42}*/
/*verbose.library org-dartlang-test:///a/b/c/main.dart::Class4<dart.core::int, dart.core::String?>{Class4.field2: baz, Class3.field2: foo, Class2.field1: 42}*/
/*normal|limited.const Class4<int, String?>{Class4.field2: baz, Class3.field2: foo, Class2.field1: 42}*/
/*verbose.const library org-dartlang-test:///a/b/c/main.dart::Class4<dart.core::int, dart.core::String?>{library org-dartlang-test:///a/b/c/main.dart::Class4.field2: baz, library org-dartlang-test:///a/b/c/main.dart::Class3.field2: foo, library org-dartlang-test:///a/b/c/main.dart::Class2.field1: 42}*/
Class4<int, String?>(42, "foo", "baz");

View file

@ -16,14 +16,16 @@ class Class1<T> {
class Class2<T> {
final T field1;
const Class2(this. /*normal.Class2.T**/ /*verbose.test::Class2.T**/ field1);
const Class2(
this. /*normal|limited.Class2.T**/ /*verbose.test::Class2.T**/ field1);
}
class Class3<T, S> extends Class2<T> {
final S field2;
const Class3(T /*normal.Class3.T**/ /*verbose.test::Class3.T**/ field1,
this. /*normal.Class3.S**/ /*verbose.test::Class3.S**/ field2)
const Class3(
T /*normal|limited.Class3.T**/ /*verbose.test::Class3.T**/ field1,
this. /*normal|limited.Class3.S**/ /*verbose.test::Class3.S**/ field2)
: super(field1);
}
@ -31,9 +33,9 @@ class Class4<T, S> extends Class3<T, S> {
final S field2;
const Class4(
T /*normal.Class4.T**/ /*verbose.test::Class4.T**/ field1,
S /*normal.Class4.S**/ /*verbose.test::Class4.S**/ shadowedField2,
this. /*normal.Class4.S**/ /*verbose.test::Class4.S**/ field2)
T /*normal|limited.Class4.T**/ /*verbose.test::Class4.T**/ field1,
S /*normal|limited.Class4.S**/ /*verbose.test::Class4.S**/ shadowedField2,
this. /*normal|limited.Class4.S**/ /*verbose.test::Class4.S**/ field2)
: super(field1, shadowedField2);
}
@ -45,77 +47,91 @@ const doubleConstant = /*3.14*/ 3.14;
const stringConstant = /*foo*/ "foo";
const symbolConstant = /*#name*/ #name;
const privateSymbolConstant =
/*normal.#_privateName*/
/*normal|limited.#_privateName*/
/*verbose.#test::_privateName*/
#_privateName;
const listConstant1 = /*<dynamic>[]*/ [];
const listConstant2 =
<int> /*normal.<int*>[]*/ /*verbose.<dart.core::int*>[]*/ [];
const listConstant3 =
<int> /*normal.<int*>[0]*/ /*verbose.<dart.core::int*>[0]*/ [0];
const listConstant4 =
<int> /*normal.<int*>[0, 1]*/ /*verbose.<dart.core::int*>[0, 1]*/ [0, 1];
const setConstant1 =
<int> /*normal.<int*>{}*/ /*verbose.<dart.core::int*>{}*/ {};
const setConstant2 =
<int> /*normal.<int*>{0}*/ /*verbose.<dart.core::int*>{0}*/ {0};
const setConstant3 =
<int> /*normal.<int*>{0, 1}*/ /*verbose.<dart.core::int*>{0, 1}*/ {0, 1};
const mapConstant1 = /*<dynamic, dynamic>{}*/ {};
const listConstant1 = /*const <dynamic>[]*/ [];
const listConstant2 = <
int> /*normal|limited.const <int*>[]*/ /*verbose.const <dart.core::int*>[]*/ [];
const listConstant3 = <
int> /*normal|limited.const <int*>[0]*/ /*verbose.const <dart.core::int*>[0]*/ [
0
];
const listConstant4 = <
int> /*normal|limited.const <int*>[0, 1]*/ /*verbose.const <dart.core::int*>[0, 1]*/ [
0,
1
];
const setConstant1 = <
int> /*normal|limited.const <int*>{}*/ /*verbose.const <dart.core::int*>{}*/ {};
const setConstant2 = <
int> /*normal|limited.const <int*>{0}*/ /*verbose.const <dart.core::int*>{0}*/ {
0
};
const setConstant3 = <
int> /*normal|limited.const <int*>{0, 1}*/ /*verbose.const <dart.core::int*>{0, 1}*/ {
0,
1
};
const mapConstant1 = /*const <dynamic, dynamic>{}*/ {};
const mapConstant2 = <int, String>
/*normal.<int*, String*>{}*/
/*verbose.<dart.core::int*, dart.core::String*>{}*/
/*normal|limited.const <int*, String*>{}*/
/*verbose.const <dart.core::int*, dart.core::String*>{}*/
{};
const mapConstant3 = <int, String>
/*normal.<int*, String*>{0: foo}*/
/*verbose.<dart.core::int*, dart.core::String*>{0: foo}*/
/*normal|limited.const <int*, String*>{0: foo}*/
/*verbose.const <dart.core::int*, dart.core::String*>{0: foo}*/
{0: "foo"};
const mapConstant4 = <int, String>
/*normal.<int*, String*>{0: foo, 1: bar}*/
/*verbose.<dart.core::int*, dart.core::String*>{0: foo, 1: bar}*/
/*normal|limited.const <int*, String*>{0: foo, 1: bar}*/
/*verbose.const <dart.core::int*, dart.core::String*>{0: foo, 1: bar}*/
{0: "foo", 1: "bar"};
const tearOffConstant = /*normal.id*/ /*verbose.test::id*/ id;
const tearOffConstant = /*normal|limited.id*/ /*verbose.test::id*/ id;
const int Function(int) partialInitializationConstant =
/*normal.<int*>id*/
/*verbose.<dart.core::int*>test::id*/
/*normal|limited.id<int*>*/
/*verbose.test::id<dart.core::int*>*/
id;
const boolHasEnvironmentConstant = const
/*unevaluated{FileUriExpression()}*/
/*normal|limited.unevaluated{bool.hasEnvironment(foo)}*/
/*verbose.unevaluated{{org-dartlang-test:///a/b/c/main.dart}dart.core::bool.hasEnvironment(foo)}*/
bool.hasEnvironment("foo");
const boolFromEnvironmentConstant = const
/*unevaluated{FileUriExpression()}*/
/*normal|limited.unevaluated{bool.fromEnvironment(foo, defaultValue: true)}*/
/*verbose.unevaluated{{org-dartlang-test:///a/b/c/main.dart}dart.core::bool.fromEnvironment(foo, defaultValue: true)}*/
bool.fromEnvironment("foo", defaultValue: true);
const intFromEnvironmentConstant = const
/*unevaluated{FileUriExpression()}*/
/*normal|limited.unevaluated{int.fromEnvironment(foo, defaultValue: 87)}*/
/*verbose.unevaluated{{org-dartlang-test:///a/b/c/main.dart}dart.core::int.fromEnvironment(foo, defaultValue: 87)}*/
int.fromEnvironment("foo", defaultValue: 87);
const stringFromEnvironmentConstant = const
/*unevaluated{FileUriExpression()}*/
/*normal|limited.unevaluated{String.fromEnvironment(foo, defaultValue: bar)}*/
/*verbose.unevaluated{{org-dartlang-test:///a/b/c/main.dart}dart.core::String.fromEnvironment(foo, defaultValue: bar)}*/
String.fromEnvironment("foo", defaultValue: "bar");
const instanceConstant1 = const
/*normal.Class1<dynamic>{}*/
/*verbose.test::Class1<dynamic>{}*/
/*normal|limited.const Class1<dynamic>{}*/
/*verbose.const test::Class1<dynamic>{}*/
Class1();
const instanceConstant2 = const
/*normal.Class1<int*>{}*/
/*verbose.test::Class1<dart.core::int*>{}*/
/*normal|limited.const Class1<int*>{}*/
/*verbose.const test::Class1<dart.core::int*>{}*/
Class1<int>();
const instanceConstant3 = const
/*normal.Class1<int*>{}*/
/*verbose.test::Class1<dart.core::int*>{}*/
/*normal|limited.const Class1<int*>{}*/
/*verbose.const test::Class1<dart.core::int*>{}*/
Class1<int>();
const instanceConstant4 = const
/*normal.Class2<int*>{Class2.field1: 0}*/
/*verbose.test::Class2<dart.core::int*>{Class2.field1: 0}*/
/*normal|limited.const Class2<int*>{Class2.field1: 0}*/
/*verbose.const test::Class2<dart.core::int*>{test::Class2.field1: 0}*/
Class2(0);
const instanceConstant5 = const
/*normal.Class2<num*>{Class2.field1: 42}*/
/*verbose.test::Class2<dart.core::num*>{Class2.field1: 42}*/
/*normal|limited.const Class2<num*>{Class2.field1: 42}*/
/*verbose.const test::Class2<dart.core::num*>{test::Class2.field1: 42}*/
Class2<num>(42);
const instanceConstant6 = const
/*normal.Class3<int*, String*>{Class3.field2: foo, Class2.field1: 42}*/
/*verbose.test::Class3<dart.core::int*, dart.core::String*>{Class3.field2: foo, Class2.field1: 42}*/
/*normal|limited.const Class3<int*, String*>{Class3.field2: foo, Class2.field1: 42}*/
/*verbose.const test::Class3<dart.core::int*, dart.core::String*>{test::Class3.field2: foo, test::Class2.field1: 42}*/
Class3<int, String>(42, "foo");
const instanceConstant7 = const
/*normal.Class4<int*, String*>{Class4.field2: baz, Class3.field2: foo, Class2.field1: 42}*/
/*verbose.test::Class4<dart.core::int*, dart.core::String*>{Class4.field2: baz, Class3.field2: foo, Class2.field1: 42}*/
/*normal|limited.const Class4<int*, String*>{Class4.field2: baz, Class3.field2: foo, Class2.field1: 42}*/
/*verbose.const test::Class4<dart.core::int*, dart.core::String*>{test::Class4.field2: baz, test::Class3.field2: foo, test::Class2.field1: 42}*/
Class4<int, String>(42, "foo", "baz");

View file

@ -0,0 +1,485 @@
// Copyright (c) 2020, 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.
/*library: nnbd=true*/
library expressions;
import 'dart:math' deferred as prefix;
class Class {
Class();
Class.named();
var field;
get getter => 0;
set setter(/*dynamic*/ _) {}
method1() {}
method2(/*dynamic*/ a) {}
method3([/*dynamic*/ a]) {}
method4(/*dynamic*/ a, [/*dynamic*/ b]) {}
method5({/*dynamic*/ a}) {}
method6(/*dynamic*/ a, {/*dynamic*/ b}) {}
method7({/*dynamic*/ a, /*dynamic*/ b}) {}
genericMethod1<T>() {}
genericMethod2<T, S>() {}
_privateMethod() {}
static var staticField;
static get staticGetter => 42;
static set staticSetter(/*dynamic*/ _) {}
static staticMethod() {}
}
class SubClass extends Class {
/*member: SubClass.exprThis:this*/
exprThis() => this;
/*normal|limited.member: SubClass.exprSuperFieldGet:super.{Class.field}*/
/*verbose.member: SubClass.exprSuperFieldGet:super.{expressions::Class.field}*/
exprSuperFieldGet() => super.field;
/*normal|limited.member: SubClass.exprSuperGetterGet:super.{Class.getter}*/
/*verbose.member: SubClass.exprSuperGetterGet:super.{expressions::Class.getter}*/
exprSuperGetterGet() => super.getter;
/*normal|limited.member: SubClass.exprSuperMethodTearOff:super.{Class.method1}*/
/*verbose.member: SubClass.exprSuperMethodTearOff:super.{expressions::Class.method1}*/
exprSuperMethodTearOff() => super.method1;
/*normal|limited.member: SubClass.exprSuperFieldSet:super.{Class.field} = 42*/
/*verbose.member: SubClass.exprSuperFieldSet:super.{expressions::Class.field} = 42*/
exprSuperFieldSet() => super.field = 42;
/*normal|limited.member: SubClass.exprSuperSetterSet:super.{Class.setter} = 42*/
/*verbose.member: SubClass.exprSuperSetterSet:super.{expressions::Class.setter} = 42*/
exprSuperSetterSet() => super.setter = 42;
/*normal|limited.member: SubClass.exprSuperMethodInvocation:super.{Class.method1}()*/
/*verbose.member: SubClass.exprSuperMethodInvocation:super.{expressions::Class.method1}()*/
exprSuperMethodInvocation() => super.method1();
}
class GenericClass<T, S> {
GenericClass();
GenericClass.named();
}
var topLevelField;
get topLevelGetter => 42;
set topLevelSetter(/*dynamic*/ _) {}
topLevelMethod() {}
T genericTopLevelMethod1<T>(T /*T%*/ t) => t;
T genericTopLevelMethod2<T, S>(T /*T%*/ t, S /*S%*/ s) => t;
/*member: exprNullLiteral:null*/
exprNullLiteral() => null;
/*member: exprBoolLiteralTrue:true*/
exprBoolLiteralTrue() => true;
/*member: exprBoolLiteralFalse:false*/
exprBoolLiteralFalse() => false;
/*member: exprIntLiteral:42*/
exprIntLiteral() => 42;
/*member: exprDoubleLiteral:3.14*/
exprDoubleLiteral() => 3.14;
/*member: exprStringLiteralEmpty:""*/
exprStringLiteralEmpty() => "";
/*member: exprStringLiteralNonEmpty:"foo"*/
exprStringLiteralNonEmpty() => "foo";
/*member: exprStringLiteralSingleQuote:"foo'bar'baz"*/
exprStringLiteralSingleQuote() => "foo'bar'baz";
/*member: exprStringLiteralDoubleQuote:"foo\"bar\"baz"*/
exprStringLiteralDoubleQuote() => 'foo"bar"baz';
/*member: exprStringLiteralSingleDoubleQuote:"foo\"bar'baz"*/
exprStringLiteralSingleDoubleQuote() => "foo\"bar\'baz";
/*member: exprStringLiteralEscapes:"\r\n\t\u0008\f\u0000"*/
exprStringLiteralEscapes() => "\r\n\t\b\f\u0000";
/*member: exprSymbolLiteral:#foo*/
exprSymbolLiteral() => #foo;
/*normal|limited.member: exprPrivateSymbolLiteral:#_bar*/
/*verbose.member: exprPrivateSymbolLiteral:#expressions::_bar*/
exprPrivateSymbolLiteral() => #_bar;
/*normal|limited.member: exprTypeLiteral:Object*/
/*verbose.member: exprTypeLiteral:dart.core::Object*/
exprTypeLiteral() => Object;
/*member: exprVariableGet:variable*/
exprVariableGet(variable) => variable;
/*member: exprVariableSet:variable = 42*/
exprVariableSet(variable) => variable = 42;
/*normal|limited.member: exprInstanceFieldGet:variable.{Class.field}*/
/*verbose.member: exprInstanceFieldGet:variable.{expressions::Class.field}*/
exprInstanceFieldGet(Class variable) => variable.field;
/*normal|limited.member: exprInstanceGetterGet:variable.{Class.getter}*/
/*verbose.member: exprInstanceGetterGet:variable.{expressions::Class.getter}*/
exprInstanceGetterGet(Class variable) => variable.getter;
/*normal|limited.member: exprInstanceMethodTearOff:variable.{Class.method1}*/
/*verbose.member: exprInstanceMethodTearOff:variable.{expressions::Class.method1}*/
exprInstanceMethodTearOff(Class variable) => variable.method1;
/*member: exprDynamicGet:variable.field*/
exprDynamicGet(variable) => variable.field;
/*normal|limited.member: exprObjectGet:variable.{Object.runtimeType}*/
/*verbose.member: exprObjectGet:variable.{dart.core::Object.runtimeType}*/
exprObjectGet(variable) => variable.runtimeType;
/*normal|limited.member: exprInstanceFieldSet:variable.{Class.field} = 42*/
/*verbose.member: exprInstanceFieldSet:variable.{expressions::Class.field} = 42*/
exprInstanceFieldSet(Class variable) => variable.field = 42;
/*normal|limited.member: exprInstanceSetterSet:variable.{Class.setter} = 42*/
/*verbose.member: exprInstanceSetterSet:variable.{expressions::Class.setter} = 42*/
exprInstanceSetterSet(Class variable) => variable.setter = 42;
/*member: exprDynamicSet:variable.field = 42*/
exprDynamicSet(variable) => variable.field = 42;
/*normal|limited.member: exprInstanceInvocation1:variable.{Class.method1}()*/
/*verbose.member: exprInstanceInvocation1:variable.{expressions::Class.method1}()*/
exprInstanceInvocation1(Class variable) => variable.method1();
/*normal|limited.member: exprInstanceInvocation2:variable.{Class.method2}(42)*/
/*verbose.member: exprInstanceInvocation2:variable.{expressions::Class.method2}(42)*/
exprInstanceInvocation2(Class variable) => variable.method2(42);
/*normal|limited.member: exprInstanceInvocation3a:variable.{Class.method3}()*/
/*verbose.member: exprInstanceInvocation3a:variable.{expressions::Class.method3}()*/
exprInstanceInvocation3a(Class variable) => variable.method3();
/*normal|limited.member: exprInstanceInvocation3b:variable.{Class.method3}(42)*/
/*verbose.member: exprInstanceInvocation3b:variable.{expressions::Class.method3}(42)*/
exprInstanceInvocation3b(Class variable) => variable.method3(42);
/*normal|limited.member: exprInstanceInvocation4a:variable.{Class.method4}(42)*/
/*verbose.member: exprInstanceInvocation4a:variable.{expressions::Class.method4}(42)*/
exprInstanceInvocation4a(Class variable) => variable.method4(42);
/*normal|limited.member: exprInstanceInvocation4b:variable.{Class.method4}(42, 87)*/
/*verbose.member: exprInstanceInvocation4b:variable.{expressions::Class.method4}(42, 87)*/
exprInstanceInvocation4b(Class variable) => variable.method4(42, 87);
/*normal|limited.member: exprInstanceInvocation5a:variable.{Class.method5}()*/
/*verbose.member: exprInstanceInvocation5a:variable.{expressions::Class.method5}()*/
exprInstanceInvocation5a(Class variable) => variable.method5();
/*normal|limited.member: exprInstanceInvocation5b:variable.{Class.method5}(a: 42)*/
/*verbose.member: exprInstanceInvocation5b:variable.{expressions::Class.method5}(a: 42)*/
exprInstanceInvocation5b(Class variable) => variable.method5(a: 42);
/*normal|limited.member: exprInstanceInvocation6a:variable.{Class.method6}(42)*/
/*verbose.member: exprInstanceInvocation6a:variable.{expressions::Class.method6}(42)*/
exprInstanceInvocation6a(Class variable) => variable.method6(42);
/*normal|limited.member: exprInstanceInvocation6b:variable.{Class.method6}(42, b: 87)*/
/*verbose.member: exprInstanceInvocation6b:variable.{expressions::Class.method6}(42, b: 87)*/
exprInstanceInvocation6b(Class variable) => variable.method6(42, b: 87);
/*normal|limited.member: exprInstanceInvocation7a:variable.{Class.method7}()*/
/*verbose.member: exprInstanceInvocation7a:variable.{expressions::Class.method7}()*/
exprInstanceInvocation7a(Class variable) => variable.method7();
/*normal|limited.member: exprInstanceInvocation7b:variable.{Class.method7}(a: 42)*/
/*verbose.member: exprInstanceInvocation7b:variable.{expressions::Class.method7}(a: 42)*/
exprInstanceInvocation7b(Class variable) => variable.method7(a: 42);
/*normal|limited.member: exprInstanceInvocation7c:variable.{Class.method7}(b: 87)*/
/*verbose.member: exprInstanceInvocation7c:variable.{expressions::Class.method7}(b: 87)*/
exprInstanceInvocation7c(Class variable) => variable.method7(b: 87);
/*normal|limited.member: exprInstanceInvocation7d:variable.{Class.method7}(a: 42, b: 87)*/
/*verbose.member: exprInstanceInvocation7d:variable.{expressions::Class.method7}(a: 42, b: 87)*/
exprInstanceInvocation7d(Class variable) => variable.method7(a: 42, b: 87);
/*normal|limited.member: exprInstanceInvocation7e:variable.{Class.method7}(b: 87, a: 42)*/
/*verbose.member: exprInstanceInvocation7e:variable.{expressions::Class.method7}(b: 87, a: 42)*/
exprInstanceInvocation7e(Class variable) => variable.method7(b: 87, a: 42);
/*normal|limited.member: exprGenericInvocation1a:variable.{Class.genericMethod1}<dynamic>()*/
/*verbose.member: exprGenericInvocation1a:variable.{expressions::Class.genericMethod1}<dynamic>()*/
exprGenericInvocation1a(Class variable) => variable.genericMethod1();
/*normal|limited.member: exprGenericInvocation1b:variable.{Class.genericMethod1}<int>()*/
/*verbose.member: exprGenericInvocation1b:variable.{expressions::Class.genericMethod1}<dart.core::int>()*/
exprGenericInvocation1b(Class variable) => variable.genericMethod1<int>();
/*normal|limited.member: exprGenericInvocation2a:variable.{Class.genericMethod2}<dynamic, dynamic>()*/
/*verbose.member: exprGenericInvocation2a:variable.{expressions::Class.genericMethod2}<dynamic, dynamic>()*/
exprGenericInvocation2a(Class variable) => variable.genericMethod2();
/*normal|limited.member: exprGenericInvocation2b:variable.{Class.genericMethod2}<int, String>()*/
/*verbose.member: exprGenericInvocation2b:variable.{expressions::Class.genericMethod2}<dart.core::int, dart.core::String>()*/
exprGenericInvocation2b(Class variable) =>
variable.genericMethod2<int, String>();
/*member: exprDynamicInvocation:variable.method1()*/
exprDynamicInvocation(variable) => variable.method1();
/*normal|limited.member: exprObjectInvocation:variable.{Object.toString}()*/
/*verbose.member: exprObjectInvocation:variable.{dart.core::Object.toString}()*/
exprObjectInvocation(variable) => variable.toString();
/*normal|limited.member: exprPrivateInstanceInvocation:variable.{Class._privateMethod}()*/
/*verbose.member: exprPrivateInstanceInvocation:variable.{expressions::Class._privateMethod}()*/
exprPrivateInstanceInvocation(Class variable) => variable._privateMethod();
/*normal|limited.member: exprPrivateDynamicInvocation:variable._privateMethod()*/
/*verbose.member: exprPrivateDynamicInvocation:variable.expressions::_privateMethod()*/
exprPrivateDynamicInvocation(variable) => variable._privateMethod();
/*normal|limited.member: exprTopLevelFieldGet:topLevelField*/
/*verbose.member: exprTopLevelFieldGet:expressions::topLevelField*/
exprTopLevelFieldGet() => topLevelField;
/*normal|limited.member: exprTopLevelGetterGet:topLevelGetter*/
/*verbose.member: exprTopLevelGetterGet:expressions::topLevelGetter*/
exprTopLevelGetterGet() => topLevelGetter;
/*normal|limited.member: exprTopLevelMethodTearOff:topLevelMethod*/
/*verbose.member: exprTopLevelMethodTearOff:expressions::topLevelMethod*/
exprTopLevelMethodTearOff() => topLevelMethod;
/*normal|limited.member: exprTopLevelFieldSet:topLevelField = 42*/
/*verbose.member: exprTopLevelFieldSet:expressions::topLevelField = 42*/
exprTopLevelFieldSet() => topLevelField = 42;
/*normal|limited.member: exprTopLevelSetterSet:topLevelSetter = 42*/
/*verbose.member: exprTopLevelSetterSet:expressions::topLevelSetter = 42*/
exprTopLevelSetterSet() => topLevelSetter = 42;
/*normal|limited.member: exprTopLevelMethodInvocation:topLevelMethod()*/
/*verbose.member: exprTopLevelMethodInvocation:expressions::topLevelMethod()*/
exprTopLevelMethodInvocation() => topLevelMethod();
/*normal|limited.member: exprStaticFieldGet:Class.staticField*/
/*verbose.member: exprStaticFieldGet:expressions::Class.staticField*/
exprStaticFieldGet() => Class.staticField;
/*normal|limited.member: exprStaticGetterGet:Class.staticGetter*/
/*verbose.member: exprStaticGetterGet:expressions::Class.staticGetter*/
exprStaticGetterGet() => Class.staticGetter;
/*normal|limited.member: exprStaticMethodTearOff:Class.staticMethod*/
/*verbose.member: exprStaticMethodTearOff:expressions::Class.staticMethod*/
exprStaticMethodTearOff() => Class.staticMethod;
/*normal|limited.member: exprStaticFieldSet:Class.staticField = 42*/
/*verbose.member: exprStaticFieldSet:expressions::Class.staticField = 42*/
exprStaticFieldSet() => Class.staticField = 42;
/*normal|limited.member: exprStaticSetterSet:Class.staticSetter = 42*/
/*verbose.member: exprStaticSetterSet:expressions::Class.staticSetter = 42*/
exprStaticSetterSet() => Class.staticSetter = 42;
/*normal|limited.member: exprStaticMethodInvocation:Class.staticMethod()*/
/*verbose.member: exprStaticMethodInvocation:expressions::Class.staticMethod()*/
exprStaticMethodInvocation() => Class.staticMethod();
/*normal|limited.member: exprInstantiation1:genericTopLevelMethod1<int>*/
/*verbose.member: exprInstantiation1:expressions::genericTopLevelMethod1<dart.core::int>*/
int Function(int) exprInstantiation1 = genericTopLevelMethod1;
/*normal|limited.member: exprInstantiation2:genericTopLevelMethod2<bool, String>*/
/*verbose.member: exprInstantiation2:expressions::genericTopLevelMethod2<dart.core::bool, dart.core::String>*/
bool Function(bool, String) exprInstantiation2 = genericTopLevelMethod2;
/*member: exprNot:!b*/
exprNot(bool b) => !b;
/*member: exprAnd:a && b*/
exprAnd(bool a, bool b) => a && b;
/*member: exprOr:a || b*/
exprOr(bool a, bool b) => a || b;
/*normal|limited.member: exprConditional1:c ?{int} 0 : 1*/
/*verbose.member: exprConditional1:c ?{dart.core::int} 0 : 1*/
exprConditional1(bool c) => c ? 0 : 1;
/*normal|limited.member: exprConditional2:c ?{List<num>} <num>[] : <int>[]*/
/*verbose.member: exprConditional2:c ?{dart.core::List<dart.core::num>} <dart.core::num>[] : <dart.core::int>[]*/
exprConditional2(bool c) => c ? <num>[] : <int>[];
/*member: exprStringConcatenation:"foo${a}bar${b}"*/
exprStringConcatenation(int a, int b) => 'foo${a}bar$b';
/*normal|limited.member: exprNew:new Class()*/
/*verbose.member: exprNew:new expressions::Class()*/
exprNew() => new Class();
/*normal|limited.member: exprNewNamed:new Class.named()*/
/*verbose.member: exprNewNamed:new expressions::Class.named()*/
exprNewNamed() => new Class.named();
/*normal|limited.member: exprNewGeneric:new GenericClass<int, bool>()*/
/*verbose.member: exprNewGeneric:new expressions::GenericClass<dart.core::int, dart.core::bool>()*/
exprNewGeneric() => new GenericClass<int, bool>();
/*normal|limited.member: exprNewGenericNamed:new GenericClass<int, bool>.named()*/
/*verbose.member: exprNewGenericNamed:new expressions::GenericClass<dart.core::int, dart.core::bool>.named()*/
exprNewGenericNamed() => new GenericClass<int, bool>.named();
/*normal|limited.member: exprIs:o is List<int>*/
/*verbose.member: exprIs:o is{ForNonNullableByDefault} dart.core::List<dart.core::int>*/
exprIs(o) => o is List<int>;
/*normal|limited.member: exprAs:o as List<int>*/
/*verbose.member: exprAs:o as{ForNonNullableByDefault} dart.core::List<dart.core::int>*/
exprAs(o) => o as List<int>;
/*member: exprNullCheck:o!*/
exprNullCheck(o) => o!;
/*member: exprThrow:throw "foo"*/
exprThrow() => throw "foo";
/*member: exprEmptyList:<dynamic>[]*/
exprEmptyList() => [];
/*normal|limited.member: exprEmptyTypedList:<int>[]*/
/*verbose.member: exprEmptyTypedList:<dart.core::int>[]*/
exprEmptyTypedList() => <int>[];
/*normal|limited.member: exprList:<int>[0, 1]*/
/*verbose.member: exprList:<dart.core::int>[0, 1]*/
exprList() => [0, 1];
/*normal|limited.member: exprEmptySet:<int>{}*/
/*verbose.member: exprEmptySet:<dart.core::int>{}*/
exprEmptySet() => <int>{};
/*normal|limited.member: exprSet:<int>{0, 1}*/
/*verbose.member: exprSet:<dart.core::int>{0, 1}*/
exprSet() => {0, 1};
/*member: exprEmptyMap:<dynamic, dynamic>{}*/
exprEmptyMap() => {};
/*normal|limited.member: exprEmptyTypedMap:<int, String>{}*/
/*verbose.member: exprEmptyTypedMap:<dart.core::int, dart.core::String>{}*/
exprEmptyTypedMap() => <int, String>{};
/*normal|limited.member: exprMap:<int, String>{0: "foo", 1: "bar"}*/
/*verbose.member: exprMap:<dart.core::int, dart.core::String>{0: "foo", 1: "bar"}*/
exprMap() => {0: "foo", 1: "bar"};
/*member: exprAwait:await o*/
exprAwait(o) async => await o;
/*member: exprLoadLibrary:prefix.loadLibrary()*/
exprLoadLibrary() => prefix.loadLibrary();
/*normal|limited.member: exprCheckLibraryIsLoaded:let final dynamic #0 = prefix.checkLibraryIsLoaded() in max<int>(0, 1)*/
/*verbose.member: exprCheckLibraryIsLoaded:let final dynamic #0 = prefix.checkLibraryIsLoaded() in dart.math::max<dart.core::int>(0, 1)*/
exprCheckLibraryIsLoaded() => prefix.max(0, 1);
/*normal|limited.member: exprFunctionExpression:int (int i) => i*/
/*verbose.member: exprFunctionExpression:dart.core::int (dart.core::int i) => i*/
exprFunctionExpression() => (int i) => i;
/*normal.member: exprFunctionExpressionBlock:int (int i) {
return i;
}*/
/*verbose.member: exprFunctionExpressionBlock:dart.core::int (dart.core::int i) {
return i;
}*/
/*limited.member: exprFunctionExpressionBlock:int (int i) { return i; }*/
exprFunctionExpressionBlock() => (int i) {
return i;
};
/*normal|limited.member: exprGenericFunctionExpression:T% <T extends Object?>(T% t) => t*/
/*verbose.member: exprGenericFunctionExpression:T% <T extends dart.core::Object?>(T% t) => t*/
exprGenericFunctionExpression() => <T>(T t) => t;
/*normal.member: exprGenericFunctionExpressionBlock:T% <T extends Object?>(T% t) {
return t;
}*/
/*verbose.member: exprGenericFunctionExpressionBlock:T% <T extends dart.core::Object?>(T% t) {
return t;
}*/
/*limited.member: exprGenericFunctionExpressionBlock:T% <T extends Object?>(T% t) { return t; }*/
exprGenericFunctionExpressionBlock() => <T>(T t) {
return t;
};
/*normal|limited.member: exprNullAware:let final Class? #0 = variable in #0.{Object.==}(null) ?{dynamic} null : #0{Class}.{Class.field}*/
/*verbose.member: exprNullAware:let final expressions::Class? #0 = variable in #0.{dart.core::Object.==}(null) ?{dynamic} null : #0{expressions::Class}.{expressions::Class.field}*/
exprNullAware(Class? variable) => variable?.field;
/*normal|limited.member: exprIfNull:let final int? #0 = i in #0.{num.==}(null) ?{int} 42 : #0{int}*/
/*verbose.member: exprIfNull:let final dart.core::int? #0 = i in #0.{dart.core::num.==}(null) ?{dart.core::int} 42 : #0{dart.core::int}*/
exprIfNull(int? i) => i ?? 42;
/*normal|limited.member: exprNestedDeep:<Object>[1, <Object>[2, <Object>[3, <int>[4]]]]*/
/*verbose.member: exprNestedDeep:<dart.core::Object>[1, <dart.core::Object>[2, <dart.core::Object>[3, <dart.core::int>[4]]]]*/
exprNestedDeep() => [
1,
[
2,
[
3,
[4]
]
]
];
/*normal.member: exprNestedTooDeep:<Object>[1, <Object>[2, <Object>[3, <Object>[4, <int>[5]]]]]*/
/*verbose.member: exprNestedTooDeep:<dart.core::Object>[1, <dart.core::Object>[2, <dart.core::Object>[3, <dart.core::Object>[4, <dart.core::int>[5]]]]]*/
/*limited.member: exprNestedTooDeep:<Object>[1, <Object>[2, <Object>[3, <Object>[4, <int>[...]]]]]*/
exprNestedTooDeep() => [
1,
[
2,
[
3,
[
4,
[5]
]
]
]
];
/*normal|limited.member: exprManySiblings:<int>[1, 2, 3, 4]*/
/*verbose.member: exprManySiblings:<dart.core::int>[1, 2, 3, 4]*/
exprManySiblings() => [1, 2, 3, 4];
/*normal.member: exprTooManySiblings:<int>[1, 2, 3, 4, 5]*/
/*verbose.member: exprTooManySiblings:<dart.core::int>[1, 2, 3, 4, 5]*/
/*limited.member: exprTooManySiblings:<int>[...]*/
exprTooManySiblings() => [1, 2, 3, 4, 5];
/*normal|limited.member: exprPrecedence1:1.{int.unary-}().{num.*}(2).{num.+}(3.{num./}(4)).{double.-}(5)*/
/*verbose.member: exprPrecedence1:1.{dart.core::int.unary-}().{dart.core::num.*}(2).{dart.core::num.+}(3.{dart.core::num./}(4)).{dart.core::double.-}(5)*/
exprPrecedence1() => -1 * 2 + 3 / 4 - 5;
/*normal|limited.member: exprPrecedence2:1.{num.*}(2.{num.+}(3)).{num./}(4.{num.-}(5)).{double.unary-}()*/
/*verbose.member: exprPrecedence2:1.{dart.core::num.*}(2.{dart.core::num.+}(3)).{dart.core::num./}(4.{dart.core::num.-}(5)).{dart.core::double.unary-}()*/
exprPrecedence2() => -(1 * (2 + 3) / (4 - 5));
/*normal|limited.member: exprPrecedence3:b ?{int} 0 : 1.{num.+}(2)*/
/*verbose.member: exprPrecedence3:b ?{dart.core::int} 0 : 1.{dart.core::num.+}(2)*/
exprPrecedence3(bool b) => b ? 0 : 1 + 2;
/*normal|limited.member: exprPrecedence4:(b ?{int} 0 : 1).{num.+}(2)*/
/*verbose.member: exprPrecedence4:(b ?{dart.core::int} 0 : 1).{dart.core::num.+}(2)*/
exprPrecedence4(bool b) => (b ? 0 : 1) + 2;

View file

@ -1,2 +1,3 @@
normal=pkg/front_end/test/text_representation/text_representation_test.dart
verbose=pkg/front_end/test/text_representation/text_representation_test.dart
verbose=pkg/front_end/test/text_representation/text_representation_test.dart
limited=pkg/front_end/test/text_representation/text_representation_test.dart

View file

@ -0,0 +1,725 @@
// Copyright (c) 2020, 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.
/*library: nnbd=true*/
/*member: stmtEmpty:
;*/
stmtEmpty() {
;
}
/*member: stmtExpression:
o;*/
stmtExpression(o) {
o;
}
/*member: stmtEmptyBlock:
{}*/
stmtEmptyBlock(o) {
{}
}
/*normal|verbose.member: stmtBlock:
{
o;
}*/
/*limited.member: stmtBlock:
{ o; }*/
stmtBlock(o) {
{
o;
}
}
/*member: stmtAssert:
assert(b);*/
stmtAssert(bool b) {
assert(b);
}
/*member: stmtAssertMessage:
assert(b, m);*/
stmtAssertMessage(bool b, String m) {
assert(b, m);
}
/*normal|verbose.member: stmtLabeledStatement:
label0:
break label0;*/
/*limited.member: stmtLabeledStatement:
label0: break label0;*/
stmtLabeledStatement() {
label:
break label;
}
/*member: stmtWhileTrue:
while (true) {}*/
stmtWhileTrue() {
while (true) {}
}
/*normal|verbose.member: stmtWhileBreak:
label0:
while (b) break label0;*/
/*limited.member: stmtWhileBreak:
label0: while (b) break label0;*/
stmtWhileBreak(bool b) {
while (b) break;
}
/*member: stmtWhileEmptyBlock:
while (b) {}*/
stmtWhileEmptyBlock(bool b) {
while (b) {}
}
/*normal|verbose.member: stmtWhileBlockBreak:
label0:
while (b) {
break label0;
}*/
/*limited.member: stmtWhileBlockBreak:
label0: while (b) { break label0; }*/
stmtWhileBlockBreak(bool b) {
while (b) {
break;
}
}
/*member: stmtDoTrue:
do {} while (true);*/
stmtDoTrue() {
do {} while (true);
}
/*normal|verbose.member: stmtDoBreak:
label0:
do {
break label0;
} while (true);*/
/*limited.member: stmtDoBreak:
label0: do { break label0; } while (true);*/
stmtDoBreak() {
do {
break;
} while (true);
}
/*member: stmtForEmpty:
for (; ; ) ;*/
stmtForEmpty() {
for (;;);
}
/*normal.member: stmtFor:
for (int i = 0; i.{num.<}(list.{List.length}); i = i.{num.+}(1)) {
list.{List.[]}(i);
}*/
/*verbose.member: stmtFor:
for (dart.core::int i = 0; i.{dart.core::num.<}(list.{dart.core::List.length}); i = i.{dart.core::num.+}(1)) {
list.{dart.core::List.[]}(i);
}*/
/*limited.member: stmtFor:
for (int i = 0; i.{num.<}(list.{List.length}); i = i.{num.+}(1)) { list.{List.[]}(i); }*/
stmtFor(List list) {
for (int i = 0; i < list.length; i++) {
list[i];
}
}
/*normal.member: stmtForMulti:
for (int i = 0, j = 0; i.{num.<}(list.{List.length}); i = i.{num.+}(1), j = j.{num.+}(1)) {
list.{List.[]}(i);
}*/
/*verbose.member: stmtForMulti:
for (dart.core::int i = 0, j = 0; i.{dart.core::num.<}(list.{dart.core::List.length}); i = i.{dart.core::num.+}(1), j = j.{dart.core::num.+}(1)) {
list.{dart.core::List.[]}(i);
}*/
/*limited.member: stmtForMulti:
for (int i = 0, j = 0; i.{num.<}(list.{List.length}); i = i.{num.+}(1), j = j.{num.+}(1)) { list.{List.[]}(i); }*/
stmtForMulti(List list) {
for (int i = 0, j = 0; i < list.length; i++, j++) {
list[i];
}
}
/*member: stmtForInEmpty:
for (dynamic e in list) ;*/
stmtForInEmpty(List list) {
for (var e in list);
}
/*member: stmtForInEmptyBlock:
for (dynamic e in list) {}*/
stmtForInEmptyBlock(List list) {
for (var e in list) {}
}
/*normal|verbose.member: stmtForInBreak:
label0:
for (dynamic e in list) {
break label0;
}*/
/*limited.member: stmtForInBreak:
label0: for (dynamic e in list) { break label0; }*/
stmtForInBreak(List list) {
for (var e in list) {
break;
}
}
/*normal|verbose.member: stmtSwitch1:
label0:
switch (i) {
case 0:
break label0;
case 1:
continue "default:";
case 2:
case 3:
default:
return;
}*/
/*limited.member: stmtSwitch1:
label0: switch (i) { case 0: break label0; case 1: continue "default:"; case 2: case 3: default: return; }*/
stmtSwitch1(int i) {
switch (i) {
case 0:
break;
case 1:
continue label2;
label2:
case 2:
case 3:
default:
return;
}
}
/*normal|verbose.member: stmtSwitch2:
label0:
switch (i) {
case 0:
case 1:
break label0;
case 2:
case 3:
{
continue "case 0:";
}
default:
return;
}*/
/*limited.member: stmtSwitch2:
label0: switch (i) { case 0: case 1: break label0; case 2: case 3: { continue "case 0:"; } default: return; }*/
stmtSwitch2(int i) {
switch (i) {
label0:
case 0:
case 1:
break;
case 2:
case 3:
{
continue label0;
}
default:
return;
}
}
/*normal|verbose.member: stmtSwitch3:
label0:
switch (i) {
default:
break label0;
}*/
/*limited.member: stmtSwitch3:
label0: switch (i) { default: break label0; }*/
stmtSwitch3(int i) {
switch (i) {
default:
break;
}
}
/*member: stmtIf:
if (b) return;*/
stmtIf(bool b) {
if (b) return;
}
/*normal|verbose.member: stmtIfBlock:
if (b) {
return;
}*/
/*limited.member: stmtIfBlock:
if (b) { return; }*/
stmtIfBlock(bool b) {
if (b) {
return;
}
}
/*member: stmtIfThen:
if (b) return 0; else return 1;*/
stmtIfThen(bool b) {
if (b)
return 0;
else
return 1;
}
/*normal|verbose.member: stmtIfThenBlock:
if (b) {
return 0;
} else {
return 1;
}*/
/*limited.member: stmtIfThenBlock:
if (b) { return 0; } else { return 1; }*/
stmtIfThenBlock(bool b) {
if (b) {
return 0;
} else {
return 1;
}
}
/*member: stmtReturn:
return;*/
stmtReturn() {
return;
}
/*member: stmtReturnExpression:
return 1;*/
stmtReturnExpression() {
return 1;
}
/*member: stmtTryCatchExceptionEmpty:
try {} catch (e) {}*/
stmtTryCatchExceptionEmpty() {
try {} catch (e) {}
}
/*normal|limited.member: stmtTryCatchExplicitOnEmpty:
try {} on Object {}*/
/*verbose.member: stmtTryCatchExplicitOnEmpty:
try {} on dart.core::Object {}*/
stmtTryCatchExplicitOnEmpty() {
try {} on Object {}
}
/*member: stmtTryCatchExplicitOnExceptionEmpty:
try {} catch (e) {}*/
stmtTryCatchExplicitOnExceptionEmpty() {
try {} on Object catch (e) {}
}
/*normal|verbose.member: stmtTryCatchException:
try {
return;
} catch (e) {
return;
}*/
/*limited.member: stmtTryCatchException:
try { return; } catch (e) { return; }*/
stmtTryCatchException() {
try {
return;
} catch (e) {
return;
}
}
/*normal|verbose.member: stmtTryCatchExceptionStackTrace:
try {
return;
} catch (e, s) {
return;
}*/
/*limited.member: stmtTryCatchExceptionStackTrace:
try { return; } catch (e, s) { return; }*/
stmtTryCatchExceptionStackTrace() {
try {
return;
} catch (e, s) {
return;
}
}
/*normal.member: stmtTryCatchOnEmpty:
try {
return;
} on String {
return;
}*/
/*verbose.member: stmtTryCatchOnEmpty:
try {
return;
} on dart.core::String {
return;
}*/
/*limited.member: stmtTryCatchOnEmpty:
try { return; } on String { return; }*/
stmtTryCatchOnEmpty() {
try {
return;
} on String {
return;
}
}
/*normal.member: stmtTryCatchOnException:
try {
return;
} on String catch (e) {
return;
}*/
/*verbose.member: stmtTryCatchOnException:
try {
return;
} on dart.core::String catch (e) {
return;
}*/
/*limited.member: stmtTryCatchOnException:
try { return; } on String catch (e) { return; }*/
stmtTryCatchOnException() {
try {
return;
} on String catch (e) {
return;
}
}
/*normal.member: stmtTryCatchOnExceptionStackTrace:
try {
return;
} on String catch (e, s) {
return;
}*/
/*verbose.member: stmtTryCatchOnExceptionStackTrace:
try {
return;
} on dart.core::String catch (e, s) {
return;
}*/
/*limited.member: stmtTryCatchOnExceptionStackTrace:
try { return; } on String catch (e, s) { return; }*/
stmtTryCatchOnExceptionStackTrace() {
try {
return;
} on String catch (e, s) {
return;
}
}
/*normal.member: stmtTryCatchOnMultiple:
try {
return;
} on int catch (e) {
return;
} on String catch (e, s) {
return;
} catch (e) {
return;
}*/
/*verbose.member: stmtTryCatchOnMultiple:
try {
return;
} on dart.core::int catch (e) {
return;
} on dart.core::String catch (e, s) {
return;
} catch (e) {
return;
}*/
/*limited.member: stmtTryCatchOnMultiple:
try { return; } on int catch (e) { return; } on String catch (e, s) { return; } catch (e) { return; }*/
stmtTryCatchOnMultiple() {
try {
return;
} on int catch (e) {
return;
} on String catch (e, s) {
return;
} catch (e) {
return;
}
}
/*member: stmtTryFinallyEmpty:
try {} finally {}*/
stmtTryFinallyEmpty() {
try {} finally {}
}
/*normal|verbose.member: stmtTryFinally:
try {
return;
} finally {
return;
}*/
/*limited.member: stmtTryFinally:
try { return; } finally { return; }*/
stmtTryFinally() {
try {
return;
} finally {
return;
}
}
/*normal|verbose.member: stmtTryCatchFinally:
try {
return;
} catch (e) {
return;
} finally {
return;
}*/
/*limited.member: stmtTryCatchFinally:
try { return; } catch (e) { return; } finally { return; }*/
stmtTryCatchFinally() {
try {
return;
} catch (e) {
return;
} finally {
return;
}
}
/*normal|verbose.member: stmtTryCatchFinallyNested:
try {
try {
return;
} catch (e) {
return;
}
} finally {
return;
}*/
/*limited.member: stmtTryCatchFinallyNested:
try { try { return; } catch (e) { return; } } finally { return; }*/
stmtTryCatchFinallyNested() {
try {
try {
return;
} catch (e) {
return;
}
} finally {
return;
}
}
/*member: stmtYield:
yield 0;*/
stmtYield() sync* {
yield 0;
}
/*normal|limited.member: stmtYieldStar:
yield* <int>[0];*/
/*verbose.member: stmtYieldStar:
yield* <dart.core::int>[0];*/
stmtYieldStar() sync* {
yield* [0];
}
/*member: stmtVariableDeclaration:
dynamic o;*/
stmtVariableDeclaration() {
var o;
}
/*normal|limited.member: stmtVariableDeclarationInitializer:
int o = 42;*/
/*verbose.member: stmtVariableDeclarationInitializer:
dart.core::int o = 42;*/
stmtVariableDeclarationInitializer() {
var o = 42;
}
/*normal|limited.member: stmtVariableDeclarationFinal:
final int o = 42;*/
/*verbose.member: stmtVariableDeclarationFinal:
final dart.core::int o = 42;*/
stmtVariableDeclarationFinal() {
final o = 42;
}
/*normal|limited.member: stmtVariableDeclarationLate:
late int i = 42;*/
/*verbose.member: stmtVariableDeclarationLate:
late dart.core::int i = 42;*/
stmtVariableDeclarationLate() {
late int i = 42;
}
/*normal.member: stmtVariableDeclarations:
{
int i;
int j = 42;
}*/
/*verbose.member: stmtVariableDeclarations:
{
dart.core::int i;
dart.core::int j = 42;
}*/
/*limited.member: stmtVariableDeclarations:
{ int i; int j = 42; }*/
stmtVariableDeclarations() {
{
int i, j = 42;
}
}
/*normal|limited.member: stmtFunctionDeclarationPositional:
int localFunction(dynamic a, [dynamic b = 0]) => 0;*/
/*verbose.member: stmtFunctionDeclarationPositional:
dart.core::int localFunction(dynamic a, [dynamic b = 0]) => 0;*/
stmtFunctionDeclarationPositional() {
int localFunction(a, [b = 0]) => 0;
}
/*normal.member: stmtFunctionDeclarationNamed:
int localFunction(dynamic a, {dynamic b = 0, required dynamic c}) {
return 0;
}*/
/*verbose.member: stmtFunctionDeclarationNamed:
dart.core::int localFunction(dynamic a, {dynamic b = 0, required dynamic c}) {
return 0;
}*/
/*limited.member: stmtFunctionDeclarationNamed:
int localFunction(dynamic a, {dynamic b = 0, required dynamic c}) { return 0; }*/
stmtFunctionDeclarationNamed() {
int localFunction(a, {b: 0, required c}) {
return 0;
}
}
/*normal|limited.member: stmtFunctionDeclarationGeneric:
T% localFunction<T extends Object?, S extends num>(T% t, dynamic S) => t;*/
/*verbose.member: stmtFunctionDeclarationGeneric:
T% localFunction<T extends dart.core::Object?, S extends dart.core::num>(T% t, dynamic S) => t;*/
stmtFunctionDeclarationGeneric() {
T localFunction<T, S extends num>(T t, S) => t;
}
/*normal|verbose.member: stmtNestedDeep:
{
1;
{
2;
{
3;
{
4;
}
}
}
}*/
/*limited.member: stmtNestedDeep:
{ 1; { 2; { 3; { 4; } } } }*/
stmtNestedDeep() {
{
1;
{
2;
{
3;
{
4;
}
}
}
}
}
/*normal|verbose.member: stmtNestedTooDeep:
{
1;
{
2;
{
3;
{
4;
{
5;
{
6;
}
}
}
}
}
}*/
/*limited.member: stmtNestedTooDeep:
{ 1; { 2; { 3; { 4; { ... } } } } }*/
stmtNestedTooDeep() {
{
1;
{
2;
{
3;
{
4;
{
5;
{
6;
}
}
}
}
}
}
}
/*normal|verbose.member: stmtManySiblings:
{
1;
2;
3;
4;
}*/
/*limited.member: stmtManySiblings:
{ 1; 2; 3; 4; }*/
stmtManySiblings() {
{
1;
2;
3;
4;
}
}
/*normal|verbose.member: stmtTooManySiblings:
{
1;
2;
3;
4;
5;
}*/
/*limited.member: stmtTooManySiblings:
{ ... }*/
stmtTooManySiblings() {
{
1;
2;
3;
4;
5;
}
}

View file

@ -5,53 +5,72 @@
/*library: nnbd=true*/
library test;
import 'dart:async';
typedef void Typedef1();
typedef void Typedef2<T>(T o);
typedef Typedef3 = void Function();
typedef Typedef4<T> = void Function(T);
typedef Typedef5<T> = void Function<S>(T, S);
boolType(bool /*normal.bool*/ /*verbose.dart.core::bool*/ o1,
bool? /*normal.bool?*/ /*verbose.dart.core::bool?*/ o2) {}
numType(num /*normal.num*/ /*verbose.dart.core::num*/ o1,
num? /*normal.num?*/ /*verbose.dart.core::num?*/ o2) {}
intType(int /*normal.int*/ /*verbose.dart.core::int*/ o1,
int? /*normal.int?*/ /*verbose.dart.core::int?*/ o2) {}
doubleType(double /*normal.double*/ /*verbose.dart.core::double*/ o1,
double? /*normal.double?*/ /*verbose.dart.core::double?*/ o2) {}
stringType(String /*normal.String*/ /*verbose.dart.core::String*/ o1,
String? /*normal.String?*/ /*verbose.dart.core::String?*/ o2) {}
boolType(bool /*normal|limited.bool*/ /*verbose.dart.core::bool*/ o1,
bool? /*normal|limited.bool?*/ /*verbose.dart.core::bool?*/ o2) {}
numType(num /*normal|limited.num*/ /*verbose.dart.core::num*/ o1,
num? /*normal|limited.num?*/ /*verbose.dart.core::num?*/ o2) {}
intType(int /*normal|limited.int*/ /*verbose.dart.core::int*/ o1,
int? /*normal|limited.int?*/ /*verbose.dart.core::int?*/ o2) {}
doubleType(double /*normal|limited.double*/ /*verbose.dart.core::double*/ o1,
double? /*normal|limited.double?*/ /*verbose.dart.core::double?*/ o2) {}
stringType(String /*normal|limited.String*/ /*verbose.dart.core::String*/ o1,
String? /*normal|limited.String?*/ /*verbose.dart.core::String?*/ o2) {}
voidType(void /*void*/ o) {}
dynamicType(dynamic /*dynamic*/ o) {}
neverType(Never /*Never*/ o1, Never? /*Never?*/ o2) {}
objectType(Object /*normal.Object*/ /*verbose.dart.core::Object*/ o1,
Object? /*normal.Object?*/ /*verbose.dart.core::Object?*/ o2) {}
objectType(Object /*normal|limited.Object*/ /*verbose.dart.core::Object*/ o1,
Object? /*normal|limited.Object?*/ /*verbose.dart.core::Object?*/ o2) {}
genericType1(
List<int>
/*normal.List<int>*/
/*normal|limited.List<int>*/
/*verbose.dart.core::List<dart.core::int>*/
o1,
List<int>?
/*normal.List<int>?*/
/*normal|limited.List<int>?*/
/*verbose.dart.core::List<dart.core::int>?*/
o2,
List<int?>
/*normal.List<int?>*/
/*normal|limited.List<int?>*/
/*verbose.dart.core::List<dart.core::int?>*/
o3,
List<int?>?
/*normal.List<int?>?*/
/*normal|limited.List<int?>?*/
/*verbose.dart.core::List<dart.core::int?>?*/
o4) {}
genericType2(
Map<int, String>
/*normal.Map<int, String>*/
/*normal|limited.Map<int, String>*/
/*verbose.dart.core::Map<dart.core::int, dart.core::String>*/
o1,
Map<int, String?>?
/*normal.Map<int, String?>?*/
/*normal|limited.Map<int, String?>?*/
/*verbose.dart.core::Map<dart.core::int, dart.core::String?>?*/
o2) {}
futureOrType(
FutureOr<int>
/*normal|limited.FutureOr<int>*/
/*verbose.FutureOr<dart.core::int>*/
o1,
FutureOr<int>?
/*normal|limited.FutureOr<int>?*/
/*verbose.FutureOr<dart.core::int>?*/
o2,
FutureOr<int?>
/*normal|limited.FutureOr<int?>*/
/*verbose.FutureOr<dart.core::int?>*/
o3,
FutureOr<int?>?
/*normal|limited.FutureOr<int?>?*/
/*verbose.FutureOr<dart.core::int?>?*/
o4) {}
typeVariableType1<T>(T /*T%*/ o1, T? /*T?*/ o2) {}
typeVariableType2<T extends num>(T /*T*/ o1, T? /*T?*/ o2) {}
typeVariableType3<T extends S, S>(
@ -64,65 +83,65 @@ functionType1(void Function() /*void Function()*/ o1,
void Function()? /*void Function()?*/ o2) {}
functionType2(
int Function(int)
/*normal.int Function(int)*/
/*normal|limited.int Function(int)*/
/*verbose.dart.core::int Function(dart.core::int)*/
o1,
int? Function(int?)
/*normal.int? Function(int?)*/
/*normal|limited.int? Function(int?)*/
/*verbose.dart.core::int? Function(dart.core::int?)*/
o2) {}
functionType3(
int Function(int, String)
/*normal.int Function(int, String)*/
/*normal|limited.int Function(int, String)*/
/*verbose.dart.core::int Function(dart.core::int, dart.core::String)*/
o) {}
functionType4(
int Function([int])
/*normal.int Function([int])*/
/*normal|limited.int Function([int])*/
/*verbose.dart.core::int Function([dart.core::int])*/
o1,
int Function([int?])
/*normal.int Function([int?])*/
/*normal|limited.int Function([int?])*/
/*verbose.dart.core::int Function([dart.core::int?])*/
o2) {}
functionType5(
int Function([int, String])
/*normal.int Function([int, String])*/
/*normal|limited.int Function([int, String])*/
/*verbose.dart.core::int Function([dart.core::int, dart.core::String])*/
o) {}
functionType6(
int Function({int a})
/*normal.int Function({a: int})*/
/*verbose.dart.core::int Function({a: int})*/
/*normal|limited.int Function({a: int})*/
/*verbose.dart.core::int Function({a: dart.core::int})*/
o1,
int Function({int? a})
/*normal.int Function({a: int?})*/
/*verbose.dart.core::int Function({a: int?})*/
/*normal|limited.int Function({a: int?})*/
/*verbose.dart.core::int Function({a: dart.core::int?})*/
o2) {}
functionType7(
int Function({int a, String b})
/*normal.int Function({a: int, b: String})*/
/*verbose.dart.core::int Function({a: int, b: String})*/
/*normal|limited.int Function({a: int, b: String})*/
/*verbose.dart.core::int Function({a: dart.core::int, b: dart.core::String})*/
o) {}
functionType8(
int Function(int, {String b})
/*normal.int Function(int, {b: String})*/
/*verbose.dart.core::int Function(dart.core::int, {b: String})*/
/*normal|limited.int Function(int, {b: String})*/
/*verbose.dart.core::int Function(dart.core::int, {b: dart.core::String})*/
o) {}
functionType9(
int Function({required int a, String b})
/*normal.int Function({required a: int, b: String})*/
/*verbose.dart.core::int Function({required a: int, b: String})*/
/*normal|limited.int Function({required a: int, b: String})*/
/*verbose.dart.core::int Function({required a: dart.core::int, b: dart.core::String})*/
o) {}
functionType10(
int Function({int a, required String b})
/*normal.int Function({a: int, required b: String})*/
/*verbose.dart.core::int Function({a: int, required b: String})*/
/*normal|limited.int Function({a: int, required b: String})*/
/*verbose.dart.core::int Function({a: dart.core::int, required b: dart.core::String})*/
o) {}
functionType11(
int Function({required int a, required String b})
/*normal.int Function({required a: int, required b: String})*/
/*verbose.dart.core::int Function({required a: int, required b: String})*/
/*normal|limited.int Function({required a: int, required b: String})*/
/*verbose.dart.core::int Function({required a: dart.core::int, required b: dart.core::String})*/
o) {}
genericFunctionType1(void Function<T>() /*void Function<T>()*/ o) {}
genericFunctionType2(T Function<T>(T, T?) /*T% Function<T>(T%, T?)*/ o) {}
@ -130,83 +149,85 @@ genericFunctionType3(
T Function<T, S>(T, S, T?, S?) /*T% Function<T, S>(T%, S%, T?, S?)*/ o) {}
genericFunctionType4(
T Function<T extends num>([T, T?])
/*normal.T Function<T extends num>([T, T?])*/
/*normal|limited.T Function<T extends num>([T, T?])*/
/*verbose.T Function<T extends dart.core::num>([T, T?])*/
o) {}
// TODO(johnniwinther): Support interdependent function type variables.
//genericFunctionType5(T Function<T, S extends T>([T, S]) o) {}
//genericFunctionType6(T Function<T extends S, S>([T, S]) o) {}
typedefType1(Typedef1 /*normal.Typedef1*/ /*verbose.test::Typedef1*/ o) {}
typedefType1(
Typedef1 /*normal|limited.Typedef1*/ /*verbose.test::Typedef1*/ o) {}
typedefType2(
Typedef2
/*normal.Typedef2<dynamic>*/
/*normal|limited.Typedef2<dynamic>*/
/*verbose.test::Typedef2<dynamic>*/
o) {}
typedefType3(
Typedef2<int>
/*normal.Typedef2<int>*/
/*normal|limited.Typedef2<int>*/
/*verbose.test::Typedef2<dart.core::int>*/
o1,
Typedef2<int?>
/*normal.Typedef2<int?>*/
/*normal|limited.Typedef2<int?>*/
/*verbose.test::Typedef2<dart.core::int?>*/
o2) {}
typedefType4(Typedef3 /*normal.Typedef3*/ /*verbose.test::Typedef3*/ o) {}
typedefType4(
Typedef3 /*normal|limited.Typedef3*/ /*verbose.test::Typedef3*/ o) {}
typedefType5(
Typedef4
/*normal.Typedef4<dynamic>*/
/*normal|limited.Typedef4<dynamic>*/
/*verbose.test::Typedef4<dynamic>*/
o) {}
typedefType7(
Typedef4<int>
/*normal.Typedef4<int>*/
/*normal|limited.Typedef4<int>*/
/*verbose.test::Typedef4<dart.core::int>*/
o1,
Typedef4<int>?
/*normal.Typedef4<int>?*/
/*normal|limited.Typedef4<int>?*/
/*verbose.test::Typedef4<dart.core::int>?*/
o2) {}
typedefType8(
Typedef5
/*normal.Typedef5<dynamic>*/
/*normal|limited.Typedef5<dynamic>*/
/*verbose.test::Typedef5<dynamic>*/
o) {}
typedefType9(
Typedef5<int>
/*normal.Typedef5<int>*/
/*normal|limited.Typedef5<int>*/
/*verbose.test::Typedef5<dart.core::int>*/
o1,
Typedef5<int?>?
/*normal.Typedef5<int?>?*/
/*normal|limited.Typedef5<int?>?*/
/*verbose.test::Typedef5<dart.core::int?>?*/
o2) {}
method() {
var /*dynamic Function<T>(T%, T?)*/ o1 =
/*normal.typeVariableType1*/
/*normal|limited.typeVariableType1*/
/*verbose.test::typeVariableType1*/
typeVariableType1;
var /*normal.dynamic Function<T extends num>(T, T?)*/
var /*normal|limited.dynamic Function<T extends num>(T, T?)*/
/*verbose.dynamic Function<T extends dart.core::num>(T, T?)*/ o2 =
/*normal.typeVariableType2*/
/*normal|limited.typeVariableType2*/
/*verbose.test::typeVariableType2*/
typeVariableType2;
var /*dynamic Function<T extends S%, S>(T%, S%, T?, S?)*/ o3 =
/*normal.typeVariableType3*/
/*normal|limited.typeVariableType3*/
/*verbose.test::typeVariableType3*/
typeVariableType3;
var /*dynamic Function<T, S extends T%>(T%, S%, T?, S?)*/ o4 =
/*normal.typeVariableType4*/
/*normal|limited.typeVariableType4*/
/*verbose.test::typeVariableType4*/
typeVariableType4;
var /*normal.dynamic Function<T extends Object>(T, T?)*/
var /*normal|limited.dynamic Function<T extends Object>(T, T?)*/
/*verbose.dynamic Function<T extends dart.core::Object>(T, T?)*/ o5 =
/*normal.typeVariableType5*/
/*normal|limited.typeVariableType5*/
/*verbose.test::typeVariableType5*/
typeVariableType5;
var /*normal.dynamic Function<T extends Object?>(T%, T?)*/
var /*normal|limited.dynamic Function<T extends Object?>(T%, T?)*/
/*verbose.dynamic Function<T extends dart.core::Object?>(T%, T?)*/ o6 =
/*normal.typeVariableType6*/
/*normal|limited.typeVariableType6*/
/*verbose.test::typeVariableType6*/
typeVariableType6;

View file

@ -7,31 +7,41 @@
/*library: nnbd=false*/
library test;
import 'dart:async';
typedef void Typedef1();
typedef void Typedef2<T>(T o);
typedef Typedef3 = void Function();
typedef Typedef4<T> = void Function(T);
typedef Typedef5<T> = void Function<S>(T, S);
boolType(bool /*normal.bool**/ /*verbose.dart.core::bool**/ o) {}
numType(num /*normal.num**/ /*verbose.dart.core::num**/ o) {}
intType(int /*normal.int**/ /*verbose.dart.core::int**/ o) {}
doubleType(double /*normal.double**/ /*verbose.dart.core::double**/ o) {}
stringType(String /*normal.String**/ /*verbose.dart.core::String**/ o) {}
boolType(bool /*normal|limited.bool**/ /*verbose.dart.core::bool**/ o) {}
numType(num /*normal|limited.num**/ /*verbose.dart.core::num**/ o) {}
intType(int /*normal|limited.int**/ /*verbose.dart.core::int**/ o) {}
doubleType(
double /*normal|limited.double**/ /*verbose.dart.core::double**/ o) {}
stringType(
String /*normal|limited.String**/ /*verbose.dart.core::String**/ o) {}
voidType(void /*void*/ o) {}
dynamicType(dynamic /*dynamic*/ o) {}
neverType(Never /*Never**/ o) {}
objectType(Object /*normal.Object**/ /*verbose.dart.core::Object**/ o) {}
objectType(
Object /*normal|limited.Object**/ /*verbose.dart.core::Object**/ o) {}
genericType1(
List<int>
/*normal.List<int*>**/
/*normal|limited.List<int*>**/
/*verbose.dart.core::List<dart.core::int*>**/
o) {}
genericType2(
Map<int, String>
/*normal.Map<int*, String*>**/
/*normal|limited.Map<int*, String*>**/
/*verbose.dart.core::Map<dart.core::int*, dart.core::String*>**/
o) {}
futureOrType(
FutureOr<int>
/*normal|limited.FutureOr<int*>**/
/*verbose.FutureOr<dart.core::int*>**/
o) {}
typeVariableType1<T>(T /*T**/ o) {}
typeVariableType2<T extends num>(T /*T**/ o) {}
typeVariableType3<T extends S, S>(T /*T**/ o, S /*S**/ p) {}
@ -40,113 +50,114 @@ typeVariableType5<T extends Object>(T /*T**/ o) {}
functionType1(void Function() /*void Function()**/ o) {}
functionType2(
int Function(int)
/*normal.int* Function(int*)**/
/*normal|limited.int* Function(int*)**/
/*verbose.dart.core::int* Function(dart.core::int*)**/
o) {}
functionType3(
int Function(int, String)
/*normal.int* Function(int*, String*)**/
/*normal|limited.int* Function(int*, String*)**/
/*verbose.dart.core::int* Function(dart.core::int*, dart.core::String*)**/
o) {}
functionType4(
int Function([int])
/*normal.int* Function([int*])**/
/*normal|limited.int* Function([int*])**/
/*verbose.dart.core::int* Function([dart.core::int*])**/
o) {}
functionType5(
int Function([int, String])
/*normal.int* Function([int*, String*])**/
/*normal|limited.int* Function([int*, String*])**/
/*verbose.dart.core::int* Function([dart.core::int*, dart.core::String*])**/
o) {}
functionType6(
int Function({int a})
/*normal.int* Function({a: int*})**/
/*verbose.dart.core::int* Function({a: int*})**/
/*normal|limited.int* Function({a: int*})**/
/*verbose.dart.core::int* Function({a: dart.core::int*})**/
o) {}
functionType7(
int Function({int a, String b})
/*normal.int* Function({a: int*, b: String*})**/
/*verbose.dart.core::int* Function({a: int*, b: String*})**/
/*normal|limited.int* Function({a: int*, b: String*})**/
/*verbose.dart.core::int* Function({a: dart.core::int*, b: dart.core::String*})**/
o) {}
functionType8(
int Function(int, {String b})
/*normal.int* Function(int*, {b: String*})**/
/*verbose.dart.core::int* Function(dart.core::int*, {b: String*})**/
/*normal|limited.int* Function(int*, {b: String*})**/
/*verbose.dart.core::int* Function(dart.core::int*, {b: dart.core::String*})**/
o) {}
functionType9(
int Function({int a, String b})
/*normal.int* Function({a: int*, b: String*})**/
/*verbose.dart.core::int* Function({a: int*, b: String*})**/
/*normal|limited.int* Function({a: int*, b: String*})**/
/*verbose.dart.core::int* Function({a: dart.core::int*, b: dart.core::String*})**/
o) {}
genericFunctionType1(void Function<T>() /*void Function<T>()**/ o) {}
genericFunctionType2(T Function<T>(T) /*T* Function<T>(T*)**/ o) {}
genericFunctionType3(T Function<T, S>(T, S) /*T* Function<T, S>(T*, S*)**/ o) {}
genericFunctionType4(
T Function<T extends num>([T])
/*normal.T* Function<T extends num*>([T*])**/
/*normal|limited.T* Function<T extends num*>([T*])**/
/*verbose.T* Function<T extends dart.core::num*>([T*])**/
o) {}
// TODO(johnniwinther): Support interdependent function type variables.
//genericFunctionType5(T Function<T, S extends T>([T, S]) o) {}
//genericFunctionType6(T Function<T extends S, S>([T, S]) o) {}
typedefType1(Typedef1 /*normal.Typedef1**/ /*verbose.test::Typedef1**/ o) {}
typedefType1(
Typedef1 /*normal|limited.Typedef1**/ /*verbose.test::Typedef1**/ o) {}
typedefType2(
Typedef2
/*normal.Typedef2<dynamic>**/
/*normal|limited.Typedef2<dynamic>**/
/*verbose.test::Typedef2<dynamic>**/
o) {}
typedefType3(
Typedef2<int>
/*normal.Typedef2<int*>**/
/*normal|limited.Typedef2<int*>**/
/*verbose.test::Typedef2<dart.core::int*>**/
o) {}
typedefType4(
Typedef3
/*normal.Typedef3**/
/*normal|limited.Typedef3**/
/*verbose.test::Typedef3**/
o) {}
typedefType5(
Typedef4
/*normal.Typedef4<dynamic>**/
/*normal|limited.Typedef4<dynamic>**/
/*verbose.test::Typedef4<dynamic>**/
o) {}
typedefType7(
Typedef4<int>
/*normal.Typedef4<int*>**/
/*normal|limited.Typedef4<int*>**/
/*verbose.test::Typedef4<dart.core::int*>**/
o) {}
typedefType8(
Typedef5
/*normal.Typedef5<dynamic>**/
/*normal|limited.Typedef5<dynamic>**/
/*verbose.test::Typedef5<dynamic>**/
o) {}
typedefType9(
Typedef5<int>
/*normal.Typedef5<int*>**/
/*normal|limited.Typedef5<int*>**/
/*verbose.test::Typedef5<dart.core::int*>**/
o) {}
method() {
var /*dynamic Function<T>(T*)**/ o1 =
/*normal.typeVariableType1*/
/*normal|limited.typeVariableType1*/
/*verbose.test::typeVariableType1*/
typeVariableType1;
var /*normal.dynamic Function<T extends num*>(T*)**/
var /*normal|limited.dynamic Function<T extends num*>(T*)**/
/*verbose.dynamic Function<T extends dart.core::num*>(T*)**/ o2 =
/*normal.typeVariableType2*/
/*normal|limited.typeVariableType2*/
/*verbose.test::typeVariableType2*/
typeVariableType2;
var /*dynamic Function<T extends S*, S>(T*, S*)**/ o3 =
/*normal.typeVariableType3*/
/*normal|limited.typeVariableType3*/
/*verbose.test::typeVariableType3*/
typeVariableType3;
var /*dynamic Function<T, S extends T*>(T*, S*)**/ o4 =
/*normal.typeVariableType4*/
/*normal|limited.typeVariableType4*/
/*verbose.test::typeVariableType4*/
typeVariableType4;
var /*normal.dynamic Function<T extends Object*>(T*)**/
var /*normal|limited.dynamic Function<T extends Object*>(T*)**/
/*verbose.dynamic Function<T extends dart.core::Object*>(T*)**/ o5 =
/*normal.typeVariableType5*/
/*normal|limited.typeVariableType5*/
/*verbose.test::typeVariableType5*/
typeVariableType5;

View file

@ -0,0 +1,152 @@
// Copyright (c) 2020, 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.
import 'package:expect/expect.dart';
import 'package:kernel/ast.dart';
import 'text_representation_test.dart';
testExpression(Expression node, String normal,
{String verbose, String limited}) {
Expect.stringEquals(normal, node.toText(normalStrategy),
"Unexpected normal strategy text for ${node.runtimeType}");
Expect.stringEquals(verbose ?? normal, node.toText(verboseStrategy),
"Unexpected verbose strategy text for ${node.runtimeType}");
Expect.stringEquals(limited ?? normal, node.toText(limitedStrategy),
"Unexpected limited strategy text for ${node.runtimeType}");
}
testType(DartType node, String normal, {String verbose, String limited}) {
Expect.stringEquals(normal, node.toText(normalStrategy),
"Unexpected normal strategy text for ${node.runtimeType}");
Expect.stringEquals(verbose ?? normal, node.toText(verboseStrategy),
"Unexpected verbose strategy text for ${node.runtimeType}");
Expect.stringEquals(limited ?? normal, node.toText(limitedStrategy),
"Unexpected limited strategy text for ${node.runtimeType}");
}
main() {
testTypes();
testMembers();
}
void testTypes() {
testType(new InterfaceType.byReference(null, Nullability.nonNullable, []),
'<missing-class-reference>');
testType(new TypedefType.byReference(null, Nullability.nonNullable, []),
'<missing-typedef-reference>');
Reference unlinkedClassName = new Reference();
testType(
new InterfaceType.byReference(
unlinkedClassName, Nullability.nonNullable, []),
'<unlinked-class-reference>');
testType(
new TypedefType.byReference(
unlinkedClassName, Nullability.nonNullable, []),
'<unlinked-typedef-reference>');
CanonicalName root = new CanonicalName.root();
Reference rootReference = new Reference()..canonicalName = root;
testType(
new InterfaceType.byReference(rootReference, Nullability.nonNullable, []),
'<root>');
testType(
new TypedefType.byReference(rootReference, Nullability.nonNullable, []),
'<root>');
CanonicalName library = root.getChild('library');
Reference libraryReference = new Reference()..canonicalName = library;
testType(
new InterfaceType.byReference(
libraryReference, Nullability.nonNullable, []),
'library');
testType(
new TypedefType.byReference(
libraryReference, Nullability.nonNullable, []),
'library');
CanonicalName className = library.getChild('Class');
Reference classNameReference = new Reference()..canonicalName = className;
testType(
new InterfaceType.byReference(
classNameReference, Nullability.nonNullable, []),
'Class',
verbose: 'library::Class');
testType(
new TypedefType.byReference(
classNameReference, Nullability.nonNullable, []),
'Class',
verbose: 'library::Class');
}
void testMembers() {
testExpression(new PropertyGet(new IntLiteral(0), new Name('foo')), '''
0.foo''');
testExpression(new StaticGet(null), '''
<missing-member-reference>''');
Reference unlinkedMemberName = new Reference();
testExpression(
new PropertyGet.byReference(
new IntLiteral(0), new Name('foo'), unlinkedMemberName),
'''
0.foo''');
testExpression(new StaticGet.byReference(unlinkedMemberName), '''
<unlinked-member-reference>''');
CanonicalName root = new CanonicalName.root();
Reference rootReference = new Reference()..canonicalName = root;
testExpression(
new PropertyGet.byReference(
new IntLiteral(0), new Name('foo'), rootReference),
'''
0.foo''');
testExpression(new StaticGet.byReference(rootReference), '''
<root>''');
CanonicalName library = root.getChild('library');
Reference libraryReference = new Reference()..canonicalName = library;
testExpression(
new PropertyGet.byReference(
new IntLiteral(0), new Name('foo'), libraryReference),
'''
0.foo''');
testExpression(new StaticGet.byReference(libraryReference), '''
library''');
CanonicalName topLevelMemberName = library.getChild('member');
Reference topLevelMemberNameReference = new Reference()
..canonicalName = topLevelMemberName;
testExpression(
new PropertyGet.byReference(
new IntLiteral(0), new Name('foo'), topLevelMemberNameReference),
'''
0.foo''');
testExpression(new StaticGet.byReference(topLevelMemberNameReference), '''
member''', verbose: '''
library::member''');
CanonicalName className = library.getChild('Class');
Reference classNameReference = new Reference()..canonicalName = className;
testExpression(
new PropertyGet.byReference(
new IntLiteral(0), new Name('foo'), classNameReference),
'''
0.foo''');
testExpression(new StaticGet.byReference(classNameReference), '''
Class''', verbose: '''
library::Class''');
CanonicalName classMemberName = className.getChild('member');
Reference classMemberNameReference = new Reference()
..canonicalName = classMemberName;
testExpression(
new PropertyGet.byReference(
new IntLiteral(0), new Name('foo'), classMemberNameReference),
'''
0.foo''');
testExpression(new StaticGet.byReference(classMemberNameReference), '''
Class.member''', verbose: '''
library::Class.member''');
}

View file

@ -0,0 +1,657 @@
// Copyright (c) 2020, 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.
import 'package:expect/expect.dart';
import 'package:front_end/src/fasta/kernel/forest.dart';
import 'package:front_end/src/fasta/kernel/internal_ast.dart';
import 'package:kernel/ast.dart';
import 'text_representation_test.dart';
testStatement(Statement node, String normal, {String verbose, String limited}) {
Expect.stringEquals(normal, node.toText(normalStrategy),
"Unexpected normal strategy text for ${node.runtimeType}");
Expect.stringEquals(verbose ?? normal, node.toText(verboseStrategy),
"Unexpected verbose strategy text for ${node.runtimeType}");
Expect.stringEquals(limited ?? normal, node.toText(limitedStrategy),
"Unexpected limited strategy text for ${node.runtimeType}");
}
testExpression(Expression node, String normal,
{String verbose, String limited}) {
Expect.stringEquals(normal, node.toText(normalStrategy),
"Unexpected normal strategy text for ${node.runtimeType}");
Expect.stringEquals(verbose ?? normal, node.toText(verboseStrategy),
"Unexpected verbose strategy text for ${node.runtimeType}");
Expect.stringEquals(limited ?? normal, node.toText(limitedStrategy),
"Unexpected limited strategy text for ${node.runtimeType}");
}
final Uri dummyUri = Uri.parse('test:dummy');
main() {
_testVariableDeclarations();
_testTryStatement();
_testForInStatementWithSynthesizedVariable();
_testSwitchCaseImpl();
_testBreakStatementImpl();
_testCascade();
_testDeferredCheck();
_testFactoryConstructorInvocationJudgment();
_testFunctionDeclarationImpl();
_testIfNullExpression();
_testIntLiterals();
_testExpressionInvocation();
_testNamedFunctionExpressionJudgment();
_testNullAwareMethodInvocation();
_testNullAwarePropertyGet();
_testNullAwarePropertySet();
_testReturnStatementImpl();
_testVariableDeclarationImpl();
_testVariableGetImpl();
_testLoadLibraryImpl();
_testLoadLibraryTearOff();
_testIfNullPropertySet();
_testIfNullSet();
_testCompoundExtensionSet();
_testCompoundPropertySet();
_testPropertyPostIncDec();
_testLocalPostIncDec();
_testStaticPostIncDec();
_testSuperPostIncDec();
_testIndexGet();
_testIndexSet();
_testSuperIndexSet();
_testExtensionIndexSet();
_testIfNullIndexSet();
_testIfNullSuperIndexSet();
_testIfNullExtensionIndexSet();
_testCompoundIndexSet();
_testNullAwareCompoundSet();
_testNullAwareIfNullSet();
_testCompoundSuperIndexSet();
_testCompoundExtensionIndexSet();
_testExtensionSet();
_testNullAwareExtension();
_testPropertySetImpl();
_testExtensionTearOff();
_testEqualsExpression();
_testBinaryExpression();
_testUnaryExpression();
_testParenthesizedExpression();
_testSpreadElement();
_testIfElement();
_testForElement();
_testForInElement();
_testSpreadMapEntry();
_testIfMapEntry();
_testForMapEntry();
_testForInMapEntry();
}
void _testVariableDeclarations() {
testStatement(
const Forest().variablesDeclaration(
[new VariableDeclaration('a'), new VariableDeclaration('b')],
dummyUri),
'''
dynamic a, b;''');
testStatement(
const Forest().variablesDeclaration([
new VariableDeclaration('a', type: const VoidType()),
new VariableDeclaration('b', initializer: new NullLiteral())
], dummyUri),
'''
void a, b = null;''');
}
void _testTryStatement() {
Block emptyBlock1 = new Block([]);
Block emptyBlock2 = new Block([]);
Block returnBlock1 = new Block([new ReturnStatement()]);
Block returnBlock2 = new Block([new ReturnStatement()]);
Catch emptyCatchBlock =
new Catch(new VariableDeclaration('e'), new Block([]));
Catch emptyCatchBlockOnVoid = new Catch(
new VariableDeclaration('e'), new Block([]),
guard: const VoidType());
Catch returnCatchBlock = new Catch(
new VariableDeclaration('e'), new Block([new ReturnStatement()]));
Catch returnCatchBlockOnVoid = new Catch(
new VariableDeclaration('e'), new Block([new ReturnStatement()]),
guard: const VoidType());
testStatement(new TryStatement(emptyBlock1, [], emptyBlock2), '''
try {} finally {}''');
testStatement(new TryStatement(returnBlock1, [], returnBlock2), '''
try {
return;
} finally {
return;
}''', limited: '''
try { return; } finally { return; }''');
testStatement(new TryStatement(emptyBlock1, [emptyCatchBlock], null), '''
try {} catch (e) {}''');
testStatement(
new TryStatement(emptyBlock1, [emptyCatchBlockOnVoid], null), '''
try {} on void catch (e) {}''');
testStatement(
new TryStatement(
emptyBlock1, [emptyCatchBlockOnVoid, emptyCatchBlock], null),
'''
try {} on void catch (e) {} catch (e) {}''');
testStatement(
new TryStatement(
emptyBlock1, [emptyCatchBlockOnVoid, emptyCatchBlock], emptyBlock2),
'''
try {} on void catch (e) {} catch (e) {} finally {}''');
testStatement(new TryStatement(returnBlock1, [returnCatchBlock], null), '''
try {
return;
} catch (e) {
return;
}''', limited: '''
try { return; } catch (e) { return; }''');
testStatement(
new TryStatement(returnBlock1, [returnCatchBlockOnVoid], null), '''
try {
return;
} on void catch (e) {
return;
}''',
limited: '''
try { return; } on void catch (e) { return; }''');
testStatement(
new TryStatement(
returnBlock1, [returnCatchBlockOnVoid, returnCatchBlock], null),
'''
try {
return;
} on void catch (e) {
return;
} catch (e) {
return;
}''',
limited: '''
try { return; } on void catch (e) { return; } catch (e) { return; }''');
testStatement(
new TryStatement(returnBlock1, [returnCatchBlockOnVoid, returnCatchBlock],
returnBlock2),
'''
try {
return;
} on void catch (e) {
return;
} catch (e) {
return;
} finally {
return;
}''',
limited: '''
try { return; } on void catch (e) { return; } catch (e) { return; } finally { return; }''');
}
void _testForInStatementWithSynthesizedVariable() {
// TODO(johnniwinther): Test ForInStatementWithSynthesizedVariable
}
void _testSwitchCaseImpl() {
Expression expression = new NullLiteral();
Expression case0 = new IntLiteral(0);
Expression case1 = new IntLiteral(1);
Expression case2 = new IntLiteral(2);
Block emptyBlock = new Block([]);
Block returnBlock1 = new Block([new ReturnStatement()]);
Block returnBlock2 = new Block([new ReturnStatement()]);
testStatement(
new SwitchStatement(expression, [
new SwitchCaseImpl([case0], [0], emptyBlock, hasLabel: false)
]),
'''
switch (null) {
case 0:
}''',
limited: '''
switch (null) { case 0: }''');
testStatement(
new SwitchStatement(expression, [
new SwitchCaseImpl([], [0], emptyBlock,
hasLabel: false, isDefault: true)
]),
'''
switch (null) {
default:
}''',
limited: '''
switch (null) { default: }''');
testStatement(
new SwitchStatement(expression, [
new SwitchCaseImpl([case0, case1], [0, 1], returnBlock1,
hasLabel: false),
new SwitchCaseImpl([case2], [0], returnBlock2,
hasLabel: true, isDefault: true)
]),
'''
switch (null) {
case 0:
case 1:
return;
case 2:
default:
return;
}''',
limited: '''
switch (null) { case 0: case 1: return; case 2: default: return; }''');
}
void _testBreakStatementImpl() {
WhileStatement whileStatement =
new WhileStatement(new BoolLiteral(true), new Block([]));
LabeledStatement labeledStatement = new LabeledStatement(whileStatement);
testStatement(
new BreakStatementImpl(isContinue: false)
..target = labeledStatement
..targetStatement = whileStatement,
'''
break label0;''');
testStatement(
new BreakStatementImpl(isContinue: true)
..target = labeledStatement
..targetStatement = whileStatement,
'''
continue label0;''');
}
void _testCascade() {
VariableDeclaration variable =
new VariableDeclaration.forValue(new IntLiteral(0));
Cascade cascade = new Cascade(variable, isNullAware: false);
testExpression(cascade, '''
let final dynamic #0 = 0 in cascade {} => #0''');
cascade.addCascadeExpression(new PropertySet(
new VariableGet(variable), new Name('foo'), new IntLiteral(1)));
testExpression(cascade, '''
let final dynamic #0 = 0 in cascade {
#0.foo = 1;
} => #0''', limited: '''
let final dynamic #0 = 0 in cascade { #0.foo = 1; } => #0''');
cascade.addCascadeExpression(new PropertySet(
new VariableGet(variable), new Name('bar'), new IntLiteral(2)));
testExpression(cascade, '''
let final dynamic #0 = 0 in cascade {
#0.foo = 1;
#0.bar = 2;
} => #0''', limited: '''
let final dynamic #0 = 0 in cascade { #0.foo = 1; #0.bar = 2; } => #0''');
}
void _testDeferredCheck() {
Library library = new Library(dummyUri);
LibraryDependency dependency =
LibraryDependency.deferredImport(library, 'pre');
VariableDeclaration check =
new VariableDeclaration.forValue(new CheckLibraryIsLoaded(dependency));
testExpression(new DeferredCheck(check, new IntLiteral(0)), '''
let final dynamic #0 = pre.checkLibraryIsLoaded() in 0''');
}
void _testFactoryConstructorInvocationJudgment() {
Library library = new Library(dummyUri);
Class cls = new Class(name: 'Class');
library.addClass(cls);
Procedure factoryConstructor = new Procedure(
new Name(''), ProcedureKind.Factory, new FunctionNode(null));
cls.addMember(factoryConstructor);
testExpression(
new FactoryConstructorInvocationJudgment(
factoryConstructor, new ArgumentsImpl([])),
'''
new Class()''',
verbose: '''
new library test:dummy::Class()''');
testExpression(
new FactoryConstructorInvocationJudgment(
factoryConstructor,
new ArgumentsImpl([new IntLiteral(0)],
types: [const VoidType()],
named: [new NamedExpression('bar', new IntLiteral(1))])),
'''
new Class<void>(0, bar: 1)''',
verbose: '''
new library test:dummy::Class<void>(0, bar: 1)''');
factoryConstructor.name = new Name('foo');
testExpression(
new FactoryConstructorInvocationJudgment(
factoryConstructor,
new ArgumentsImpl([new IntLiteral(0)],
types: [const VoidType()],
named: [new NamedExpression('bar', new IntLiteral(1))])),
'''
new Class<void>.foo(0, bar: 1)''',
verbose: '''
new library test:dummy::Class<void>.foo(0, bar: 1)''');
}
void _testFunctionDeclarationImpl() {
testStatement(
new FunctionDeclarationImpl(new VariableDeclarationImpl('foo', 0),
new FunctionNode(new Block([]))),
'''
dynamic foo() {}''');
}
void _testIfNullExpression() {
testExpression(new IfNullExpression(new IntLiteral(0), new IntLiteral(1)), '''
0 ?? 1''');
}
void _testIntLiterals() {
testExpression(new IntJudgment(0, null), '0');
testExpression(new IntJudgment(0, 'foo'), 'foo');
testExpression(new ShadowLargeIntLiteral('bar', TreeNode.noOffset), 'bar');
}
void _testExpressionInvocation() {
testExpression(
new ExpressionInvocation(new IntLiteral(0), new ArgumentsImpl([])), '''
0()''');
testExpression(
new ExpressionInvocation(
new IntLiteral(0),
new ArgumentsImpl([
new IntLiteral(1)
], types: [
const VoidType(),
const DynamicType()
], named: [
new NamedExpression('foo', new IntLiteral(2)),
new NamedExpression('bar', new IntLiteral(3))
])),
'''
0<void, dynamic>(1, foo: 2, bar: 3)''');
}
void _testNamedFunctionExpressionJudgment() {
testExpression(
new NamedFunctionExpressionJudgment(new VariableDeclarationImpl('foo', 0,
initializer:
new FunctionExpression(new FunctionNode(new Block([]))))),
'''
let dynamic foo = dynamic () {} in foo''');
}
void _testNullAwareMethodInvocation() {
VariableDeclaration variable =
new VariableDeclaration.forValue(new IntLiteral(0));
// The usual use of this node.
testExpression(
new NullAwareMethodInvocation(
variable,
new MethodInvocation(new VariableGet(variable), new Name('foo'),
new ArgumentsImpl([]))),
'''
0?.foo()''');
// An unusual use of this node.
testExpression(
new NullAwareMethodInvocation(variable,
new PropertyGet(new VariableGet(variable), new Name('foo'))),
'''
let final dynamic #0 = 0 in null-aware #0.foo''');
}
void _testNullAwarePropertyGet() {
VariableDeclaration variable =
new VariableDeclaration.forValue(new IntLiteral(0));
// The usual use of this node.
testExpression(
new NullAwarePropertyGet(variable,
new PropertyGet(new VariableGet(variable), new Name('foo'))),
'''
0?.foo''');
// An unusual use of this node.
testExpression(
new NullAwarePropertyGet(
variable,
new MethodInvocation(new VariableGet(variable), new Name('foo'),
new ArgumentsImpl([]))),
'''
let final dynamic #0 = 0 in null-aware #0.foo()''');
}
void _testNullAwarePropertySet() {
VariableDeclaration variable =
new VariableDeclaration.forValue(new IntLiteral(0));
testExpression(
new NullAwarePropertySet(
variable,
new PropertySet(
new VariableGet(variable), new Name('foo'), new IntLiteral(1))),
'''
0?.foo = 1''');
testExpression(
new NullAwarePropertySet(
variable,
new MethodInvocation(new VariableGet(variable), new Name('foo'),
new ArgumentsImpl([]))),
'''
let final dynamic #0 = 0 in null-aware #0.foo()''');
}
void _testReturnStatementImpl() {
testStatement(new ReturnStatementImpl(false), '''
return;''');
testStatement(new ReturnStatementImpl(true), '''
=>;''');
testStatement(new ReturnStatementImpl(false, new IntLiteral(0)), '''
return 0;''');
testStatement(new ReturnStatementImpl(true, new IntLiteral(0)), '''
=> 0;''');
}
void _testVariableDeclarationImpl() {
testStatement(new VariableDeclarationImpl('foo', 0), '''
dynamic foo;''');
testStatement(
new VariableDeclarationImpl('foo', 0, initializer: new IntLiteral(0)), '''
dynamic foo = 0;''');
testStatement(
new VariableDeclarationImpl('foo', 0,
type: const VoidType(),
initializer: new IntLiteral(0),
isFinal: true,
isRequired: true),
'''
required final void foo;''');
testStatement(
new VariableDeclarationImpl('foo', 0,
type: const VoidType(), initializer: new IntLiteral(0), isLate: true),
'''
late void foo = 0;''');
testStatement(
new VariableDeclarationImpl('foo', 0,
type: const VoidType(), initializer: new IntLiteral(0))
..lateGetter = new VariableDeclarationImpl('foo#getter', 0),
'''
late void foo = 0;''');
testStatement(
new VariableDeclarationImpl('foo', 0,
type: const VoidType(), initializer: new IntLiteral(0))
..lateGetter = new VariableDeclarationImpl('foo#getter', 0)
..lateType = const DynamicType(),
'''
late dynamic foo = 0;''');
}
void _testVariableGetImpl() {
VariableDeclaration variable = new VariableDeclaration('foo');
testExpression(
new VariableGetImpl(variable, null, null, forNullGuardedAccess: false),
'''
foo''');
testExpression(
new VariableGetImpl(variable, null, null, forNullGuardedAccess: true), '''
foo''');
testExpression(
new VariableGetImpl(variable, null, null, forNullGuardedAccess: false)
..promotedType = const VoidType(),
'''
foo{void}''');
}
void _testLoadLibraryImpl() {
Library library = new Library(dummyUri);
LibraryDependency dependency =
LibraryDependency.deferredImport(library, 'pre');
testExpression(new LoadLibraryImpl(dependency, new ArgumentsImpl([])), '''
pre.loadLibrary()''');
testExpression(
new LoadLibraryImpl(dependency, new ArgumentsImpl([new IntLiteral(0)])),
'''
pre.loadLibrary(0)''');
}
void _testLoadLibraryTearOff() {
Library library = new Library(dummyUri);
LibraryDependency dependency =
LibraryDependency.deferredImport(library, 'pre');
testExpression(new LoadLibraryTearOff(dependency, null), '''
pre.loadLibrary''');
Procedure procedure = new Procedure(new Name('get#loadLibrary'),
ProcedureKind.Getter, new FunctionNode(new Block([])));
testExpression(new LoadLibraryTearOff(dependency, procedure), '''
pre.loadLibrary''');
}
void _testIfNullPropertySet() {
VariableDeclaration variable =
new VariableDeclarationImpl.forValue(new IntLiteral(0));
testExpression(
new IfNullPropertySet(
variable,
new PropertyGet(new VariableGet(variable), new Name('foo')),
new PropertySet(
new VariableGet(variable), new Name('foo'), new IntLiteral(1)),
forEffect: false),
'''
let final dynamic #0 = 0 in if-null #0.foo ?? #0.foo = 1''');
testExpression(
new IfNullPropertySet(
variable,
new PropertyGet(new VariableGet(variable), new Name('foo')),
new PropertySet(
new VariableGet(variable), new Name('foo'), new IntLiteral(1)),
forEffect: true),
'''
let final dynamic #0 = 0 in if-null #0.foo ?? #0.foo = 1''');
}
void _testIfNullSet() {
VariableDeclaration variable = new VariableDeclaration('foo');
testExpression(
new IfNullSet(new VariableGet(variable),
new VariableSet(variable, new IntLiteral(1)),
forEffect: false),
'''
foo ?? foo = 1''');
testExpression(
new IfNullSet(new VariableGet(variable),
new VariableSet(variable, new IntLiteral(1)),
forEffect: true),
'''
foo ?? foo = 1''');
}
void _testCompoundExtensionSet() {}
void _testCompoundPropertySet() {}
void _testPropertyPostIncDec() {}
void _testLocalPostIncDec() {}
void _testStaticPostIncDec() {}
void _testSuperPostIncDec() {}
void _testIndexGet() {}
void _testIndexSet() {}
void _testSuperIndexSet() {}
void _testExtensionIndexSet() {}
void _testIfNullIndexSet() {}
void _testIfNullSuperIndexSet() {}
void _testIfNullExtensionIndexSet() {}
void _testCompoundIndexSet() {}
void _testNullAwareCompoundSet() {}
void _testNullAwareIfNullSet() {}
void _testCompoundSuperIndexSet() {}
void _testCompoundExtensionIndexSet() {}
void _testExtensionSet() {}
void _testNullAwareExtension() {}
void _testPropertySetImpl() {}
void _testExtensionTearOff() {}
void _testEqualsExpression() {}
void _testBinaryExpression() {}
void _testUnaryExpression() {}
void _testParenthesizedExpression() {}
void _testSpreadElement() {}
void _testIfElement() {}
void _testForElement() {}
void _testForInElement() {}
void _testSpreadMapEntry() {}
void _testIfMapEntry() {}
void _testForMapEntry() {}
void _testForInMapEntry() {}

View file

@ -13,9 +13,56 @@ import 'package:front_end/src/api_prototype/experimental_flags.dart'
import 'package:front_end/src/base/nnbd_mode.dart';
import 'package:front_end/src/testing/id_testing_helper.dart';
import 'package:kernel/ast.dart';
import 'package:kernel/src/printer.dart';
const String normalMarker = 'normal';
const String verboseMarker = 'verbose';
const String limitedMarker = 'limited';
const String statementMarker = 'stmt';
const String expressionMarker = 'expr';
const AstTextStrategy normalStrategy = const AstTextStrategy(
includeLibraryNamesInMembers: false,
includeLibraryNamesInTypes: false,
includeAuxiliaryProperties: false,
useMultiline: true,
maxExpressionDepth: null,
maxExpressionsLength: null,
maxStatementDepth: null,
maxStatementsLength: null);
const AstTextStrategy verboseStrategy = const AstTextStrategy(
includeLibraryNamesInMembers: true,
includeLibraryNamesInTypes: true,
includeAuxiliaryProperties: true,
useMultiline: true,
maxExpressionDepth: null,
maxExpressionsLength: null,
maxStatementDepth: null,
maxStatementsLength: null);
const AstTextStrategy limitedStrategy = const AstTextStrategy(
includeLibraryNamesInMembers: false,
includeLibraryNamesInTypes: false,
includeAuxiliaryProperties: false,
useMultiline: false,
maxExpressionDepth: 5,
maxExpressionsLength: 4,
maxStatementDepth: 5,
maxStatementsLength: 4);
AstTextStrategy getStrategy(String marker) {
switch (marker) {
case normalMarker:
return normalStrategy;
case verboseMarker:
return verboseStrategy;
case limitedMarker:
return limitedStrategy;
}
throw new UnsupportedError("Unexpected marker '${marker}'.");
}
main(List<String> args) async {
Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
@ -23,9 +70,11 @@ main(List<String> args) async {
args: args,
createUriForFileName: createUriForFileName,
onFailure: onFailure,
preserveWhitespaceInAnnotations: true,
runTest: runTestFor(const TextRepresentationDataComputer(), [
const TextRepresentationConfig(normalMarker, 'normal'),
const TextRepresentationConfig(verboseMarker, 'verbose'),
const TextRepresentationConfig(limitedMarker, 'limited'),
]));
}
@ -52,7 +101,7 @@ class TextRepresentationDataComputer extends DataComputer<String> {
Map<Id, ActualData<String>> actualMap,
{bool verbose}) {
new TextRepresentationDataExtractor(
compilerResult, actualMap, config.marker == verboseMarker)
compilerResult, actualMap, getStrategy(config.marker))
.computeForLibrary(library);
}
@ -64,7 +113,7 @@ class TextRepresentationDataComputer extends DataComputer<String> {
Map<Id, ActualData<String>> actualMap,
{bool verbose}) {
member.accept(new TextRepresentationDataExtractor(
compilerResult, actualMap, config.marker == verboseMarker));
compilerResult, actualMap, getStrategy(config.marker)));
}
@override
@ -72,10 +121,10 @@ class TextRepresentationDataComputer extends DataComputer<String> {
}
class TextRepresentationDataExtractor extends CfeDataExtractor<String> {
final bool verbose;
final AstTextStrategy strategy;
TextRepresentationDataExtractor(InternalCompilerResult compilerResult,
Map<Id, ActualData<String>> actualMap, this.verbose)
Map<Id, ActualData<String>> actualMap, this.strategy)
: super(compilerResult, actualMap);
@override
@ -83,16 +132,61 @@ class TextRepresentationDataExtractor extends CfeDataExtractor<String> {
return 'nnbd=${node.isNonNullableByDefault}';
}
@override
visitProcedure(Procedure node) {
if (!node.name.name.startsWith(expressionMarker) &&
!node.name.name.startsWith(statementMarker)) {
node.function.accept(this);
}
computeForMember(node);
}
@override
visitField(Field node) {
if (!node.name.name.startsWith(expressionMarker) &&
!node.name.name.startsWith(statementMarker)) {
node.initializer?.accept(this);
}
computeForMember(node);
}
@override
String computeMemberValue(Id id, Member node) {
if (node.name.name == 'stmtVariableDeclarationMulti') {
print(node);
}
if (node.name.name.startsWith(expressionMarker)) {
if (node is Procedure) {
Statement body = node.function.body;
if (body is ReturnStatement) {
return body.expression.toText(strategy);
}
} else if (node is Field && node.initializer != null) {
return node.initializer.toText(strategy);
}
} else if (node.name.name.startsWith(statementMarker)) {
if (node is Procedure) {
Statement body = node.function.body;
if (body is Block && body.statements.length == 1) {
// Prefix with newline to make multiline text representations more
// readable.
return '\n${body.statements.single.toText(strategy)}';
}
}
}
return null;
}
@override
String computeNodeValue(Id id, TreeNode node) {
if (node is ConstantExpression) {
return node.constant.toConstantText(verbose: verbose);
return node.constant.toText(strategy);
} else if (node is VariableDeclaration) {
DartType type = node.type;
if (type is FunctionType && type.typedefType != null) {
return type.typedefType.toTypeText(verbose: verbose);
return type.typedefType.toText(strategy);
} else {
return type.toTypeText(verbose: verbose);
return type.toText(strategy);
}
}
return null;

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,453 @@
// Copyright (c) 2020, 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.
import '../ast.dart';
import 'text_util.dart';
/// AST printer strategy used by default in `Node.toString`.
///
/// Don't use this for testing. Instead use [astTextStrategyForTesting] or
/// make an explicit strategy for the test to avoid test dependency on the
/// `Node.toString` implementation.
const AstTextStrategy defaultAstTextStrategy = const AstTextStrategy();
/// Strategy used for printing AST nodes.
///
/// This is used to avoid dependency on the `Node.toString` implementations
/// in testing.
const AstTextStrategy astTextStrategyForTesting = const AstTextStrategy(
includeLibraryNamesInMembers: true,
includeLibraryNamesInTypes: true,
includeAuxiliaryProperties: false,
useMultiline: false);
class AstTextStrategy {
/// If `true`, references to classes and typedefs in types are prefixed by the
/// name of their enclosing library.
final bool includeLibraryNamesInTypes;
/// If `true`, references to members, classes and typedefs are prefixed by the
/// name of their enclosing library.
final bool includeLibraryNamesInMembers;
/// If `true`, auxiliary node properties are on include in the textual
/// representation.
final bool includeAuxiliaryProperties;
/// If `true`, newlines are used to separate statements.
final bool useMultiline;
/// If [useMultiline] is `true`, [indentation] is used for indentation.
final String indentation;
/// If non-null, a maximum of [maxStatementDepth] nested statements are
/// printed. If exceeded, '...' is printed instead.
final int maxStatementDepth;
/// If non-null, a maximum of [maxStatementsLength] statements are printed
/// within the same block.
final int maxStatementsLength;
/// If non-null, a maximum of [maxExpressionDepth] nested expression are
/// printed. If exceeded, '...' is printed instead.
final int maxExpressionDepth;
/// If non-null, a maximum of [maxExpressionsLength] expression are printed
/// within the same list of expressions, for instance in list/set literals.
/// If exceeded, '...' is printed instead.
final int maxExpressionsLength;
const AstTextStrategy(
{this.includeLibraryNamesInTypes: false,
this.includeLibraryNamesInMembers: false,
this.includeAuxiliaryProperties: false,
this.useMultiline: true,
this.indentation: ' ',
this.maxStatementDepth: null,
this.maxStatementsLength: null,
this.maxExpressionDepth: null,
this.maxExpressionsLength: null});
}
class AstPrinter {
final AstTextStrategy _strategy;
final StringBuffer _sb = new StringBuffer();
int _statementLevel = 0;
int _expressionLevel = 0;
int _indentationLevel = 0;
Map<LabeledStatement, String> _labelNames;
Map<VariableDeclaration, String> _variableNames;
AstPrinter(this._strategy);
bool get includeAuxiliaryProperties => _strategy.includeAuxiliaryProperties;
void incIndentation() {
_indentationLevel++;
}
void decIndentation() {
_indentationLevel--;
}
void write(String value) {
_sb.write(value);
}
void writeClassName(Reference reference, {bool forType: false}) {
_sb.write(qualifiedClassNameToStringByReference(reference,
includeLibraryName: forType
? _strategy.includeLibraryNamesInTypes
: _strategy.includeLibraryNamesInMembers));
}
void writeTypedefName(Reference reference) {
_sb.write(qualifiedTypedefNameToStringByReference(reference,
includeLibraryName: _strategy.includeLibraryNamesInTypes));
}
void writeExtensionName(Reference reference) {
_sb.write(qualifiedExtensionNameToStringByReference(reference,
includeLibraryName: _strategy.includeLibraryNamesInMembers));
}
void writeMemberName(Reference reference) {
_sb.write(qualifiedMemberNameToStringByReference(reference,
includeLibraryName: _strategy.includeLibraryNamesInMembers));
}
void writeInterfaceMemberName(Reference reference, Name name) {
if (name != null && (reference == null || reference.node == null)) {
writeName(name);
} else {
write('{');
_sb.write(qualifiedMemberNameToStringByReference(reference,
includeLibraryName: _strategy.includeLibraryNamesInMembers));
write('}');
}
}
void writeName(Name name) {
_sb.write(nameToString(name,
includeLibraryName: _strategy.includeLibraryNamesInMembers));
}
void writeNamedType(NamedType node) {
node.toTextInternal(this);
}
void writeTypeParameterName(TypeParameter parameter) {
_sb.write(qualifiedTypeParameterNameToString(parameter,
includeLibraryName: _strategy.includeLibraryNamesInTypes));
}
void newLine() {
if (_strategy.useMultiline) {
_sb.writeln();
_sb.write(_strategy.indentation * _indentationLevel);
} else {
_sb.write(' ');
}
}
String getLabelName(LabeledStatement node) {
_labelNames ??= {};
return _labelNames[node] ??= 'label${_labelNames.length}';
}
String getVariableName(VariableDeclaration node) {
if (node.name != null) {
return node.name;
}
_variableNames ??= {};
return _variableNames[node] ??= '#${_variableNames.length}';
}
String getSwitchCaseName(SwitchCase node) {
if (node.isDefault) {
return '"default:"';
} else {
return '"case ${node.expressions.first.toText(_strategy)}:"';
}
}
void writeStatement(Statement node) {
int oldStatementLevel = _statementLevel;
_statementLevel++;
if (_strategy.maxStatementDepth != null &&
_statementLevel > _strategy.maxStatementDepth) {
_sb.write('...');
} else {
node.toTextInternal(this);
}
_statementLevel = oldStatementLevel;
}
void writeExpression(Expression node, {int minimumPrecedence}) {
int oldExpressionLevel = _expressionLevel;
_expressionLevel++;
if (_strategy.maxExpressionDepth != null &&
_expressionLevel > _strategy.maxExpressionDepth) {
_sb.write('...');
} else {
bool needsParentheses =
minimumPrecedence != null && node.precedence < minimumPrecedence;
if (needsParentheses) {
_sb.write('(');
}
node.toTextInternal(this);
if (needsParentheses) {
_sb.write(')');
}
}
_expressionLevel = oldExpressionLevel;
}
void writeNamedExpression(NamedExpression node) {
node.toTextInternal(this);
}
void writeCatch(Catch node) {
node.toTextInternal(this);
}
void writeSwitchCase(SwitchCase node) {
node.toTextInternal(this);
}
void writeType(DartType node) {
node.toTextInternal(this);
}
void writeConstant(Constant node) {
node.toTextInternal(this);
}
void writeMapEntry(MapEntry node) {
node.toTextInternal(this);
}
/// Writes [types] to the printer buffer separated by ', '.
void writeTypes(List<DartType> types) {
for (int index = 0; index < types.length; index++) {
if (index > 0) {
_sb.write(', ');
}
writeType(types[index]);
}
}
/// If [types] is non-empty, writes [types] to the printer buffer delimited by
/// '<' and '>', and separated by ', '.
void writeTypeArguments(List<DartType> types) {
if (types.isNotEmpty) {
_sb.write('<');
writeTypes(types);
_sb.write('>');
}
}
/// If [typeParameters] is non-empty, writes [typeParameters] to the printer
/// buffer delimited by '<' and '>', and separated by ', '.
///
/// The bound of a type parameter is included, as 'T extends Bound', if the
/// bound is neither `Object?` nor `Object*`.
void writeTypeParameters(List<TypeParameter> typeParameters) {
if (typeParameters.isNotEmpty) {
_sb.write("<");
String comma = "";
for (TypeParameter typeParameter in typeParameters) {
_sb.write(comma);
_sb.write(typeParameter.name);
DartType bound = typeParameter.bound;
bool isTopObject(DartType type) {
if (type is InterfaceType &&
type.className.node != null &&
type.classNode.name == 'Object') {
Uri uri = type.classNode.enclosingLibrary?.importUri;
return uri?.scheme == 'dart' &&
uri?.path == 'core' &&
(type.nullability == Nullability.legacy ||
type.nullability == Nullability.nullable);
}
return false;
}
if (!isTopObject(bound) || isTopObject(typeParameter.defaultType)) {
// Include explicit bounds only.
_sb.write(' extends ');
writeType(bound);
}
comma = ", ";
}
_sb.write(">");
}
}
/// Writes [expressions] to the printer buffer separated by ', '.
void writeExpressions(List<Expression> expressions) {
if (expressions.isNotEmpty &&
_strategy.maxExpressionDepth != null &&
_expressionLevel + 1 > _strategy.maxExpressionDepth) {
// The maximum expression depth will be exceeded for all [expressions].
// Print the list as one occurrence '...' instead one per expression.
_sb.write('...');
} else if (_strategy.maxExpressionsLength != null &&
expressions.length > _strategy.maxExpressionsLength) {
_sb.write('...');
} else {
for (int index = 0; index < expressions.length; index++) {
if (index > 0) {
_sb.write(', ');
}
writeExpression(expressions[index]);
}
}
}
/// Writes [statements] to the printer buffer delimited by '{' and '}'.
///
/// If using a multiline strategy, the statements printed on separate lines
/// that are indented one level.
void writeBlock(List<Statement> statements) {
if (statements.isEmpty) {
write('{}');
} else {
write('{');
incIndentation();
writeStatements(statements);
decIndentation();
newLine();
write('}');
}
}
/// Writes [statements] to the printer buffer.
///
/// If using a multiline strategy, the statements printed on separate lines
/// that are indented one level.
void writeStatements(List<Statement> statements) {
if (statements.isNotEmpty &&
_strategy.maxStatementDepth != null &&
_statementLevel + 1 > _strategy.maxStatementDepth) {
// The maximum statement depth will be exceeded for all [statements].
// Print the list as one occurrence '...' instead one per statement.
_sb.write(' ...');
} else if (_strategy.maxStatementsLength != null &&
statements.length > _strategy.maxStatementsLength) {
_sb.write(' ...');
} else {
for (Statement statement in statements) {
newLine();
writeStatement(statement);
}
}
}
/// Writes arguments [node] to the printer buffer.
///
/// If [includeTypeArguments] is `true` type arguments in [node] are included.
/// Otherwise only the positional and named arguments are included.
void writeArguments(Arguments node, {bool includeTypeArguments: true}) {
node.toTextInternal(this, includeTypeArguments: includeTypeArguments);
}
/// Writes the variable declaration [node] to the printer buffer.
///
/// If [includeModifiersAndType] is `true`, the declaration is prefixed by
/// the modifiers and declared type of the variable. Otherwise only the
/// name and the initializer, if present, are included.
///
/// If [isLate] and [type] are provided, these values are used instead of
/// the corresponding properties on [node].
void writeVariableDeclaration(VariableDeclaration node,
{bool includeModifiersAndType: true, bool isLate, DartType type}) {
if (includeModifiersAndType) {
if (node.isRequired) {
_sb.write('required ');
}
if (isLate ?? node.isLate) {
_sb.write('late ');
}
if (node.isFinal) {
_sb.write('final ');
}
if (node.isConst) {
_sb.write('const ');
}
writeType(type ?? node.type);
_sb.write(' ');
}
_sb.write(getVariableName(node));
if (node.initializer != null && !node.isRequired) {
_sb.write(' = ');
writeExpression(node.initializer);
}
}
void writeFunctionNode(FunctionNode node, String name) {
writeType(node.returnType);
_sb.write(' ');
_sb.write(name);
if (node.typeParameters.isNotEmpty) {
_sb.write('<');
for (int index = 0; index < node.typeParameters.length; index++) {
if (index > 0) {
_sb.write(', ');
}
_sb.write(node.typeParameters[index].name);
_sb.write(' extends ');
writeType(node.typeParameters[index].bound);
}
_sb.write('>');
}
_sb.write('(');
for (int index = 0; index < node.positionalParameters.length; index++) {
if (index > 0) {
_sb.write(', ');
}
if (index == node.requiredParameterCount) {
_sb.write('[');
}
writeVariableDeclaration(node.positionalParameters[index]);
}
if (node.requiredParameterCount < node.positionalParameters.length) {
_sb.write(']');
}
if (node.namedParameters.isNotEmpty) {
if (node.positionalParameters.isNotEmpty) {
_sb.write(', ');
}
_sb.write('{');
for (int index = 0; index < node.namedParameters.length; index++) {
if (index > 0) {
_sb.write(', ');
}
writeVariableDeclaration(node.namedParameters[index]);
}
_sb.write('}');
}
_sb.write(')');
Statement body = node.body;
if (body != null) {
if (body is ReturnStatement) {
_sb.write(' => ');
writeExpression(body.expression);
} else {
_sb.write(' ');
writeStatement(body);
}
} else {
_sb.write(';');
}
}
void writeConstantMapEntry(ConstantMapEntry node) {
node.toTextInternal(this);
}
/// Returns the text written to this printer.
String getText() => _sb.toString();
}

View file

@ -18,6 +18,16 @@ String nullabilityToString(Nullability nullability) {
throw "Unknown Nullability: $nullability";
}
String nameToString(Name node, {bool includeLibraryName: false}) {
if (node == null) {
return 'null';
} else if (node.library != null && includeLibraryName) {
return '${libraryNameToString(node.library)}::${node.name}';
} else {
return node.name;
}
}
String libraryNameToString(Library node) {
return node == null ? 'null' : node.name ?? 'library ${node.importUri}';
}
@ -33,6 +43,47 @@ String qualifiedClassNameToString(Class node,
}
}
String qualifiedCanonicalNameToString(CanonicalName canonicalName,
{bool includeLibraryName: false}) {
if (canonicalName.isRoot) {
return '<root>';
} else if (canonicalName.parent.isRoot) {
return canonicalName.name;
} else if (canonicalName.parent.parent.isRoot) {
if (!includeLibraryName) {
return canonicalName.name;
}
String parentName = qualifiedCanonicalNameToString(canonicalName.parent,
includeLibraryName: includeLibraryName);
return '$parentName::${canonicalName.name}';
} else {
String parentName = qualifiedCanonicalNameToString(canonicalName.parent,
includeLibraryName: includeLibraryName);
return '$parentName.${canonicalName.name}';
}
}
String qualifiedClassNameToStringByReference(Reference reference,
{bool includeLibraryName: false}) {
if (reference == null) {
return '<missing-class-reference>';
} else {
Class node = reference.node;
if (node != null) {
return qualifiedClassNameToString(node,
includeLibraryName: includeLibraryName);
} else {
CanonicalName canonicalName = reference.canonicalName;
if (canonicalName != null) {
return qualifiedCanonicalNameToString(canonicalName,
includeLibraryName: includeLibraryName);
} else {
return '<unlinked-class-reference>';
}
}
}
}
String classNameToString(Class node) {
return node == null
? 'null'
@ -50,6 +101,27 @@ String qualifiedExtensionNameToString(Extension node,
}
}
String qualifiedExtensionNameToStringByReference(Reference reference,
{bool includeLibraryName: false}) {
if (reference == null) {
return '<missing-extension-reference>';
} else {
Extension node = reference.node;
if (node != null) {
return qualifiedExtensionNameToString(node,
includeLibraryName: includeLibraryName);
} else {
CanonicalName canonicalName = reference.canonicalName;
if (canonicalName != null) {
return qualifiedCanonicalNameToString(canonicalName,
includeLibraryName: includeLibraryName);
} else {
return '<unlinked-extension-reference>';
}
}
}
}
String extensionNameToString(Extension node) {
return node == null
? 'null'
@ -68,6 +140,27 @@ String qualifiedTypedefNameToString(Typedef node,
}
}
String qualifiedTypedefNameToStringByReference(Reference reference,
{bool includeLibraryName: false}) {
if (reference == null) {
return '<missing-typedef-reference>';
} else {
Typedef node = reference.node;
if (node != null) {
return qualifiedTypedefNameToString(node,
includeLibraryName: includeLibraryName);
} else {
CanonicalName canonicalName = reference.canonicalName;
if (canonicalName != null) {
return qualifiedCanonicalNameToString(canonicalName,
includeLibraryName: includeLibraryName);
} else {
return '<unlinked-typedef-reference>';
}
}
}
}
String typedefNameToString(Typedef node) {
return node == null
? 'null'
@ -90,6 +183,27 @@ String qualifiedMemberNameToString(Member node,
}
}
String qualifiedMemberNameToStringByReference(Reference reference,
{bool includeLibraryName: false}) {
if (reference == null) {
return '<missing-member-reference>';
} else {
Member node = reference.node;
if (node != null) {
return qualifiedMemberNameToString(node,
includeLibraryName: includeLibraryName);
} else {
CanonicalName canonicalName = reference.canonicalName;
if (canonicalName != null) {
return qualifiedCanonicalNameToString(canonicalName,
includeLibraryName: includeLibraryName);
} else {
return '<unlinked-member-reference>';
}
}
}
}
String memberNameToString(Member node) {
return node.name?.name ??
"null-named member ${node.runtimeType} ${node.hashCode}";
@ -121,3 +235,44 @@ String typeParameterNameToString(TypeParameter node) {
return node.name ??
"null-named TypeParameter ${node.runtimeType} ${node.hashCode}";
}
String getEscapedCharacter(int codeUnit) {
switch (codeUnit) {
case 9:
return r'\t';
case 10:
return r'\n';
case 11:
return r'\v';
case 12:
return r'\f';
case 13:
return r'\r';
case 34:
return r'\"';
case 36:
return r'\$';
case 92:
return r'\\';
default:
if (codeUnit < 32 || codeUnit > 126) {
return r'\u' + '$codeUnit'.padLeft(4, '0');
} else {
return null;
}
}
}
String escapeString(String string) {
StringBuffer buffer;
for (int i = 0; i < string.length; ++i) {
String character = getEscapedCharacter(string.codeUnitAt(i));
if (character != null) {
buffer ??= new StringBuffer(string.substring(0, i));
buffer.write(character);
} else {
buffer?.write(string[i]);
}
}
return buffer == null ? string : buffer.toString();
}

View file

@ -10,6 +10,7 @@ import 'dart:convert' show json;
import '../ast.dart';
import '../import_table.dart';
import '../src/text_util.dart';
abstract class Namer<T> {
int index = 0;
@ -1386,47 +1387,6 @@ class Printer extends Visitor<Null> {
writeExpression(node.otherwise);
}
String getEscapedCharacter(int codeUnit) {
switch (codeUnit) {
case 9:
return r'\t';
case 10:
return r'\n';
case 11:
return r'\v';
case 12:
return r'\f';
case 13:
return r'\r';
case 34:
return r'\"';
case 36:
return r'\$';
case 92:
return r'\\';
default:
if (codeUnit < 32 || codeUnit > 126) {
return r'\u' + '$codeUnit'.padLeft(4, '0');
} else {
return null;
}
}
}
String escapeString(String string) {
StringBuffer buffer;
for (int i = 0; i < string.length; ++i) {
String character = getEscapedCharacter(string.codeUnitAt(i));
if (character != null) {
buffer ??= new StringBuffer(string.substring(0, i));
buffer.write(character);
} else {
buffer?.write(string[i]);
}
}
return buffer == null ? string : buffer.toString();
}
visitStringConcatenation(StringConcatenation node) {
if (state == WORD) {
writeSpace();
@ -2269,7 +2229,45 @@ class Printer extends Visitor<Null> {
writeIndentation();
writeConstantReference(node);
writeSpaced('=');
endLine('$node');
endLine('${node.runtimeType}');
}
visitNullConstant(NullConstant node) {
writeIndentation();
writeConstantReference(node);
writeSpaced('=');
endLine('${node.value}');
}
visitBoolConstant(BoolConstant node) {
writeIndentation();
writeConstantReference(node);
writeSpaced('=');
endLine('${node.value}');
}
visitIntConstant(IntConstant node) {
writeIndentation();
writeConstantReference(node);
writeSpaced('=');
endLine('${node.value}');
}
visitDoubleConstant(DoubleConstant node) {
writeIndentation();
writeConstantReference(node);
writeSpaced('=');
endLine('${node.value}');
}
visitSymbolConstant(SymbolConstant node) {
writeIndentation();
writeConstantReference(node);
writeSpaced('=');
String text = node.libraryReference != null
? '#${node.libraryReference.asLibrary.importUri}::${node.name}'
: '#${node.name}';
endLine('${text}');
}
visitListConstant(ListConstant node) {

View file

@ -5,6 +5,7 @@
library vm.metadata.call_site_attributes;
import 'package:kernel/ast.dart';
import 'package:kernel/src/printer.dart';
/// Metadata for annotating call sites with various attributes.
class CallSiteAttributesMetadata {
@ -13,7 +14,8 @@ class CallSiteAttributesMetadata {
const CallSiteAttributesMetadata({this.receiverType});
@override
String toString() => "receiverType:$receiverType";
String toString() =>
"receiverType:${receiverType.toText(astTextStrategyForTesting)}";
}
/// Repository for [CallSiteAttributesMetadata].

View file

@ -5,6 +5,7 @@
library vm.metadata.direct_call;
import 'package:kernel/ast.dart';
import 'package:kernel/src/printer.dart';
/// Metadata for annotating method invocations converted to direct calls.
class DirectCallMetadata {
@ -20,7 +21,8 @@ class DirectCallMetadata {
Member get target => _targetReference.asMember;
@override
String toString() => "${target}${checkReceiverForNull ? '??' : ''}";
String toString() => "${target.toText(astTextStrategyForTesting)}"
"${checkReceiverForNull ? '??' : ''}";
}
/// Repository for [DirectCallMetadata].

View file

@ -5,6 +5,7 @@
library vm.metadata.inferred_type;
import 'package:kernel/ast.dart';
import 'package:kernel/src/printer.dart';
/// Metadata for annotating nodes with an inferred type information.
class InferredType {
@ -68,7 +69,7 @@ class InferredType {
String toString() {
final StringBuffer buf = new StringBuffer();
if (concreteClass != null) {
buf.write(concreteClass);
buf.write(concreteClass.toText(astTextStrategyForTesting));
} else if (isInt) {
buf.write('int');
} else {
@ -79,15 +80,18 @@ class InferredType {
}
if (exactTypeArguments != null) {
buf.write('<');
buf.write(
exactTypeArguments.map((t) => t != null ? "$t" : "?").join(", "));
buf.write(exactTypeArguments
.map(
(t) => t != null ? "${t.toText(astTextStrategyForTesting)}" : "?")
.join(", "));
buf.write('>');
}
if (skipCheck) {
buf.write(' (skip check)');
}
if (_constantValue != null) {
buf.write(' (value: $_constantValue)');
buf.write(
' (value: ${_constantValue.toText(astTextStrategyForTesting)})');
}
if (receiverNotInt) {
buf.write(' (receiver not int)');

View file

@ -8,7 +8,6 @@ library vm.transformations.type_flow.calls;
import 'dart:core' hide Type;
import 'package:kernel/ast.dart';
import 'package:kernel/src/text_util.dart';
import 'types.dart';
import 'utils.dart';
@ -118,7 +117,7 @@ class DirectSelector extends Selector {
@override
String toString() => 'direct ${_callKindPrefix}'
'[${qualifiedMemberNameToString(member, includeLibraryName: true)}]';
'[${nodeToText(member)}]';
}
/// Interface call via known interface target [member].
@ -138,7 +137,7 @@ class InterfaceSelector extends Selector {
@override
String toString() => '${_callKindPrefix}'
'[${qualifiedMemberNameToString(member, includeLibraryName: true)}]';
'[${nodeToText(member)}]';
}
/// Virtual call (using 'this' as a receiver).
@ -155,7 +154,7 @@ class VirtualSelector extends InterfaceSelector {
@override
String toString() => 'virtual ${_callKindPrefix}'
'[${qualifiedMemberNameToString(member, includeLibraryName: true)}]';
'[${nodeToText(member)}]';
}
/// Dynamic call.
@ -179,7 +178,7 @@ class DynamicSelector extends Selector {
other is DynamicSelector && super == (other) && other.name == name;
@override
String toString() => 'dynamic ${_callKindPrefix}[$name]';
String toString() => 'dynamic ${_callKindPrefix}[${nodeToText(name)}]';
}
/// Arguments passed to a call, including implicit receiver argument.

View file

@ -192,7 +192,7 @@ class Join extends Statement {
void accept(StatementVisitor visitor) => visitor.visitJoin(this);
@override
String dump() => "$label = _Join [${staticType.toTypeText(verbose: true)}]"
String dump() => "$label = _Join [${nodeToText(staticType)}]"
" (${values.join(", ")})";
@override
@ -372,8 +372,8 @@ class Extract extends Statement {
void accept(StatementVisitor visitor) => visitor.visitExtract(this);
@override
String dump() =>
"$label = _Extract ($arg[$referenceClass/$paramIndex]${nullability.suffix})";
String dump() => "$label = _Extract ($arg[${nodeToText(referenceClass)}"
"/$paramIndex]${nullability.suffix})";
@override
Type apply(List<Type> computedTypes, TypeHierarchy typeHierarchy,
@ -480,7 +480,7 @@ class CreateRuntimeType extends Statement {
void accept(StatementVisitor visitor) => visitor.visitCreateRuntimeType(this);
@override
String dump() => "$label = _CreateRuntimeType ($klass @ "
String dump() => "$label = _CreateRuntimeType (${nodeToText(klass)} @ "
"${flattenedTypeArgs.take(klass.typeParameters.length)}"
"${nullability.suffix})";
@ -541,7 +541,7 @@ class TypeCheck extends Statement {
@override
String dump() {
String result = "$label = _TypeCheck ($arg against $type)";
result += " (for ${node})";
result += " (for ${nodeToText(node)})";
return result;
}

View file

@ -11,8 +11,6 @@ import 'package:kernel/ast.dart';
import 'package:kernel/core_types.dart';
import 'package:kernel/src/text_util.dart';
import 'utils.dart';
/// Dart class representation used in type flow analysis.
@ -34,8 +32,7 @@ class TFClass {
bool operator ==(other) => identical(this, other);
@override
String toString() =>
qualifiedClassNameToString(classNode, includeLibraryName: true);
String toString() => nodeToText(classNode);
}
abstract class GenericInterfacesInfo {
@ -548,7 +545,7 @@ class ConeType extends Type {
(other is ConeType) && identical(this.cls, other.cls);
@override
String toString() => "_T ($cls)+";
String toString() => "_T (${cls})+";
@override
int get order => TypeOrder.Cone.index;
@ -767,7 +764,7 @@ class ConcreteType extends Type implements Comparable<ConcreteType> {
buf.write("<${typeArgs.take(numImmediateTypeArgs).join(', ')}>");
}
if (constant != null) {
buf.write(", $constant");
buf.write(", ${nodeToText(constant)}");
}
buf.write(")");
return buf.toString();
@ -957,8 +954,8 @@ class RuntimeType extends Type {
@override
String toString() {
final head = _type is InterfaceType
? "${(_type as InterfaceType).classNode}"
: "$_type";
? "${nodeToText((_type as InterfaceType).classNode)}"
: "${nodeToText(_type)}";
final typeArgsStrs = (numImmediateTypeArgs == 0)
? ""
: "<${typeArgs.take(numImmediateTypeArgs).map((t) => "$t").join(", ")}>";

View file

@ -7,6 +7,9 @@
library vm.transformations.type_flow.utils;
import 'package:kernel/ast.dart';
import 'package:kernel/src/printer.dart';
String nodeToText(Node node) => node.toText(astTextStrategyForTesting);
const bool kPrintTrace =
const bool.fromEnvironment('global.type.flow.print.trace');

View file

@ -8,6 +8,7 @@ import 'package:kernel/target/targets.dart';
import 'package:kernel/ast.dart';
import 'package:kernel/kernel.dart';
import 'package:kernel/binary/ast_to_binary.dart';
import 'package:kernel/src/printer.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';
@ -37,7 +38,7 @@ runTestCase(Uri source) async {
for (Class messageClass in messageClasses) {
expect(messageClass.enclosingLibrary.classes.contains(messageClass),
messageClass.name.endsWith('Keep'),
reason: '$messageClass');
reason: '${messageClass.toText(astTextStrategyForTesting)}');
}
final systemTempDir = Directory.systemTemp;

View file

@ -90,7 +90,7 @@ ConstantPool {
assert(condition);
}
static method test2(() →* dart.core::bool* condition, () →* dart.core::String* message) → void {
assert([@vm.call-site-attributes.metadata=receiverType:FunctionType(bool* Function()*)] condition.call(), [@vm.call-site-attributes.metadata=receiverType:FunctionType(String* Function()*)] message.call());
assert([@vm.call-site-attributes.metadata=receiverType:dart.core::bool* Function()*] condition.call(), [@vm.call-site-attributes.metadata=receiverType:dart.core::String* Function()*] message.call());
}
static method main() → dynamic {}
}

View file

@ -980,7 +980,7 @@ Function 'get:runtimeType', getter, abstract, debuggable
}
static get platformScript() → dynamic {
if(#lib::VMLibraryHooks::_cachedScript.{dart.core::Object::==}(null) && !#lib::VMLibraryHooks::_computeScriptUri.{dart.core::Object::==}(null)) {
#lib::VMLibraryHooks::_cachedScript = [@vm.call-site-attributes.metadata=receiverType:DynamicType(dynamic)] #lib::VMLibraryHooks::_computeScriptUri.call();
#lib::VMLibraryHooks::_cachedScript = [@vm.call-site-attributes.metadata=receiverType:dynamic] #lib::VMLibraryHooks::_computeScriptUri.call();
}
return #lib::VMLibraryHooks::_cachedScript;
}

View file

@ -2370,13 +2370,13 @@ Function 'get:runtimeType', getter, abstract, debuggable
dart.core::print(<dart.core::Type*>[#lib::A::T1*, #lib::A::T2*, #lib::A::foo::T3*, #lib::A::foo::T4*, T5*, T6*, T7*, T8*]);
#lib::callWithArgs<#lib::A::T1*, #lib::A::T2*, #lib::A::foo::T3*, #lib::A::foo::T4*, T5*, T6*, T7*, T8*>();
};
[@vm.call-site-attributes.metadata=receiverType:FunctionType(Null? Function()*)] nested3.call();
[@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function()*] nested3.call();
}
[@vm.call-site-attributes.metadata=receiverType:FunctionType(void Function<T7, T8>()*)] nested2.call<#lib::C7*, #lib::C8*>();
[@vm.call-site-attributes.metadata=receiverType:FunctionType(void Function<T7, T8>()*)] nested2.call<dart.core::List<#lib::C7*>*, dart.core::List<#lib::C8*>*>();
[@vm.call-site-attributes.metadata=receiverType:void Function<T7, T8>()*] nested2.call<#lib::C7*, #lib::C8*>();
[@vm.call-site-attributes.metadata=receiverType:void Function<T7, T8>()*] nested2.call<dart.core::List<#lib::C7*>*, dart.core::List<#lib::C8*>*>();
}
[@vm.call-site-attributes.metadata=receiverType:FunctionType(void Function<T5, T6>()*)] nested1.call<#lib::C5*, #lib::C6*>();
[@vm.call-site-attributes.metadata=receiverType:FunctionType(void Function<T5, T6>()*)] nested1.call<dart.core::List<#lib::C5*>*, dart.core::List<#lib::C6*>*>();
[@vm.call-site-attributes.metadata=receiverType:void Function<T5, T6>()*] nested1.call<#lib::C5*, #lib::C6*>();
[@vm.call-site-attributes.metadata=receiverType:void Function<T5, T6>()*] nested1.call<dart.core::List<#lib::C5*>*, dart.core::List<#lib::C6*>*>();
}
abstract member-signature get _identityHashCode() → dart.core::int*;
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*;
@ -2408,12 +2408,12 @@ Function 'get:runtimeType', getter, abstract, debuggable
z = x.{dart.core::num::+}(2);
w = this.{#lib::B::foo}.{dart.core::num::+}(y);
}
[@vm.call-site-attributes.metadata=receiverType:FunctionType(void Function()*)] closure2.call();
[@vm.call-site-attributes.metadata=receiverType:void Function()*] closure2.call();
dart.core::print(w);
}
};
[@vm.call-site-attributes.metadata=receiverType:FunctionType(Null? Function(int*)*)] closure1.call(10);
[@vm.call-site-attributes.metadata=receiverType:FunctionType(Null? Function(int*)*)] closure1.call(11);
[@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function(dart.core::int*)*] closure1.call(10);
[@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function(dart.core::int*)*] closure1.call(11);
dart.core::print(y);
dart.core::print(z);
}
@ -2424,7 +2424,7 @@ Function 'get:runtimeType', getter, abstract, debuggable
() →* dart.core::Null? closure3 = () → dart.core::Null? {
this.{#lib::B::foo} = x;
};
[@vm.call-site-attributes.metadata=receiverType:FunctionType(Null? Function()*)] closure3.call();
[@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function()*] closure3.call();
}
}
abstract member-signature get _identityHashCode() → dart.core::int*;
@ -2447,8 +2447,8 @@ Function 'get:runtimeType', getter, abstract, debuggable
dart.core::List<dart.core::Function*>* getI = <dart.core::Function*>[];
dart.core::List<dart.core::Function*>* setI = <dart.core::Function*>[];
for (dart.core::int* i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
[@vm.call-site-attributes.metadata=receiverType:InterfaceType(List<Function*>*)] getI.{dart.core::List::add}(() → dart.core::int* => i.{dart.core::num::+}(delta));
[@vm.call-site-attributes.metadata=receiverType:InterfaceType(List<Function*>*)] setI.{dart.core::List::add}((dart.core::int* ii) → dart.core::Null? {
[@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function*>*] getI.{dart.core::List::add}(() → dart.core::int* => i.{dart.core::num::+}(delta));
[@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function*>*] setI.{dart.core::List::add}((dart.core::int* ii) → dart.core::Null? {
i = ii.{dart.core::num::+}(delta);
});
}
@ -2462,7 +2462,7 @@ Function 'get:runtimeType', getter, abstract, debuggable
() →* dart.core::Null? inc = () → dart.core::Null? {
i = i.{dart.core::num::+}(1);
};
[@vm.call-site-attributes.metadata=receiverType:FunctionType(Null? Function()*)] inc.call();
[@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function()*] inc.call();
dart.core::print(i);
}
}
@ -2489,7 +2489,7 @@ Function 'get:runtimeType', getter, abstract, debuggable
method bar() → dynamic {
return () → dart.core::Null? {
function inner() → dart.core::Null? {}
[@vm.call-site-attributes.metadata=receiverType:FunctionType(Null? Function()*)] inner.call();
[@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function()*] inner.call();
};
}
abstract member-signature get _identityHashCode() → dart.core::int*;
@ -2513,11 +2513,11 @@ Function 'get:runtimeType', getter, abstract, debuggable
abstract method evalArg2() → dart.core::int*;
abstract method getE() → #lib::E*;
method testCallThroughGetter1() → dart.core::int*
return let final dart.core::int* #t1 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t2 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:FunctionType(int* Function(int*, int*)*)] this.{#lib::E::foo1}.call(#t1, #t2);
return let final dart.core::int* #t1 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t2 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:dart.core::int* Function(dart.core::int*, dart.core::int*)*] this.{#lib::E::foo1}.call(#t1, #t2);
method testCallThroughGetter2() → dart.core::int*
return let final dart.core::int* #t3 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t4 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:FunctionType(int* Function<T>(T*, T*)*)] this.{#lib::E::foo2}.call<dart.core::int*>(#t3, #t4);
return let final dart.core::int* #t3 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t4 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:dart.core::int* Function<T>(T*, T*)*] this.{#lib::E::foo2}.call<dart.core::int*>(#t3, #t4);
method testCallThroughGetter3() → dart.core::int*
return let final #lib::E* #t5 = this.{#lib::E::getE}() in let final dart.core::int* #t6 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t7 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:FunctionType(int* Function<T>(T*, T*)*)] #t5.{#lib::E::foo2}.call<dart.core::int*>(#t6, #t7);
return let final #lib::E* #t5 = this.{#lib::E::getE}() in let final dart.core::int* #t6 = this.{#lib::E::evalArg1}() in let final dart.core::int* #t7 = this.{#lib::E::evalArg2}() in [@vm.call-site-attributes.metadata=receiverType:dart.core::int* Function<T>(T*, T*)*] #t5.{#lib::E::foo2}.call<dart.core::int*>(#t6, #t7);
abstract member-signature get _identityHashCode() → dart.core::int*;
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → dart.core::bool*;
abstract member-signature method _simpleInstanceOf(dynamic type) → dart.core::bool*;
@ -2534,7 +2534,7 @@ Function 'get:runtimeType', getter, abstract, debuggable
(dart.core::int*) →* dart.core::Null? inc = (dart.core::int* y) → dart.core::Null? {
x = x.{dart.core::num::+}(y);
};
[@vm.call-site-attributes.metadata=receiverType:FunctionType(Null? Function(int*)*)] inc.call(3);
[@vm.call-site-attributes.metadata=receiverType:dart.core::Null? Function(dart.core::int*)*] inc.call(3);
return x;
}
static method callWithArgs<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic, T3 extends dart.core::Object* = dynamic, T4 extends dart.core::Object* = dynamic, T5 extends dart.core::Object* = dynamic, T6 extends dart.core::Object* = dynamic, T7 extends dart.core::Object* = dynamic, T8 extends dart.core::Object* = dynamic>() → void {

View file

@ -584,7 +584,7 @@ ConstantPool {
method testSuperGet() → dynamic
return super.{#lib::Base1::bar};
method testSuperCallViaGetter() → dynamic
return [@vm.call-site-attributes.metadata=receiverType:DynamicType(dynamic)] super.{#lib::Base1::bar}.call<dart.core::int*>("param");
return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{#lib::Base1::bar}.call<dart.core::int*>("param");
method testSuperSet() → dynamic {
super.{#lib::Base1::bazz} = 3;
}
@ -618,7 +618,7 @@ ConstantPool {
method testSuperGet() → dynamic
return super.{#lib::Base2::bar};
method testSuperCallViaGetter() → dynamic
return [@vm.call-site-attributes.metadata=receiverType:DynamicType(dynamic)] super.{#lib::Base2::bar}.call<dart.core::int*>("param");
return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{#lib::Base2::bar}.call<dart.core::int*>("param");
method testSuperSet() → dynamic {
super.{#lib::Base2::bazz} = 3;
}

View file

@ -1033,7 +1033,7 @@ ConstantPool {
y = 3;
}
}
[@vm.call-site-attributes.metadata=receiverType:FunctionType(void Function()*)] foo.call();
[@vm.call-site-attributes.metadata=receiverType:void Function()*] foo.call();
dart.core::print(y);
}
on dynamic catch(final dynamic e, final dart.core::StackTrace* st) {
@ -1099,7 +1099,7 @@ ConstantPool {
dart.core::print(x);
dart.core::print(y);
}
[@vm.call-site-attributes.metadata=receiverType:FunctionType(void Function()*)] foo.call();
[@vm.call-site-attributes.metadata=receiverType:void Function()*] foo.call();
continue #L4;
}
finally {
@ -1143,7 +1143,7 @@ ConstantPool {
}
finally {
dart.core::print(x);
[@vm.call-site-attributes.metadata=receiverType:DynamicType(dynamic)] y.call();
[@vm.call-site-attributes.metadata=receiverType:dynamic] y.call();
}
}
static method testTryCatchFinally() → dynamic {

View file

@ -883,7 +883,7 @@ ConstantPool {
if(y is #lib::C<dynamic, #lib::D::Q*, dart.core::List<#lib::D::P*>*>*) {
dart.core::print("22");
}
[@vm.call-site-attributes.metadata=receiverType:InterfaceType(D<D.P*, D.Q*>*)] this.{#lib::D::foo} = y as{TypeError,ForDynamic} dart.core::Map<#lib::D::P*, #lib::D::Q*>*;
[@vm.call-site-attributes.metadata=receiverType:#lib::D<#lib::D.P*, #lib::D.Q*>*] this.{#lib::D::foo} = y as{TypeError,ForDynamic} dart.core::Map<#lib::D::P*, #lib::D::Q*>*;
}
method foo3<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic>(dynamic z) → dynamic {
if(z is #lib::A<#lib::D::foo3::T1*>*) {

View file

@ -6,7 +6,7 @@ RESULT: _T {}?
RESULT: _T {}?
------------ bool_expressions ------------
t0* = _Call direct [#lib::foo] ()
t1 = _TypeCheck (t0 against dart.core::bool*) (for AsExpression(foo, as bool*))
t1 = _TypeCheck (t0 against dart.core::bool*) (for #lib::foo() as dart.core::bool*)
t2* = _Call direct [#lib::bar] ()
t3* = _Call [dart.core::num.+] (_T (dart.core::int)+, _T (dart.core::_Smi, 1))
i_0 = _Join [dart.core::int*] (_T (dart.core::_Smi, 0), t3)
@ -14,13 +14,13 @@ t5* = _Call [dart.core::num.<] (i_0, _T (dart.core::_Smi, 10))
t6* = _Call direct [#lib::bar] ()
t7* = _Call direct [#lib::foo] ()
t8 = _Join [dynamic] (_T (dart.core::bool, true), t7)
t9 = _TypeCheck (t8 against dart.core::bool*) (for AsExpression( ? true : foo, as bool*))
t9 = _TypeCheck (t8 against dart.core::bool*) (for (x{dart.core::bool*} ?{dynamic} true : #lib::foo()) as dart.core::bool*)
t10* = _Call direct [#lib::bar] ()
t11* = _Call direct [#lib::bar] ()
t12* = _Call direct [#lib::foo] ()
t13 = _TypeCheck (t12 against dart.core::bool*) (for AsExpression(foo, as bool*))
t13 = _TypeCheck (t12 against dart.core::bool*) (for #lib::foo() as dart.core::bool*)
t14* = _Call direct [#lib::foo] ()
t15 = _TypeCheck (t14 against dart.core::bool*) (for AsExpression(foo, as bool*))
t15 = _TypeCheck (t14 against dart.core::bool*) (for #lib::foo() as dart.core::bool*)
y_0 = _Join [dart.core::bool*] (_T (dart.core::bool), _T (dart.core::bool, true))
RESULT: _T {}?
------------ main ------------

View file

@ -38,7 +38,7 @@ t5 = _Call direct [#lib::B.] (_T (#lib::B))
t6 = _Call [#lib::A.foo1] (%aa, _T (#lib::B))
t7 = _Narrow (%aa to _T ANY)
t8* = _Call get [#lib::A.foo2] (t7)
t9 = _TypeCheck (t8 against dart.core::int*) (for AsExpression(.foo2 as int*))
t9 = _TypeCheck (t8 against dart.core::int*) (for aa.{#lib::A.foo2} as dart.core::int*)
t10 = _Call set [#lib::A.foo3] (t7, t9)
t11* = _Call get [#lib::A.foo1] (t7)
t12* = _Call get [#lib::A.foo2] (t7)

View file

@ -12,13 +12,13 @@ RESULT: t2
%this = _Parameter #0 [_T (#lib::C)+]
%x = _Parameter #1
t2 = _Extract (%this[#lib::C/0]*)
t3 = _TypeCheck (%x against t2) (for VariableDeclaration(x))
t3 = _TypeCheck (%x against t2) (for #lib::C.T* x;)
RESULT: t3
------------ C.id2 ------------
%this = _Parameter #0 [_T (#lib::C)+]
%x = _Parameter #1
t2 = _Extract (%this[#lib::C/0]*)
t3 = _TypeCheck (%x against t2) (for VariableDeclaration(x))
t3 = _TypeCheck (%x against t2) (for #lib::C.T* x;)
RESULT: t3
------------ D. ------------
%this = _Parameter #0 [_T (#lib::D)+]
@ -77,7 +77,7 @@ RESULT: _T {}?
%x = _Parameter #1
t2 = _Extract (%this[#lib::C2/0]*)
t3 = _CreateRuntimeType (dart.core::Comparable @ (t2)*)
t4 = _TypeCheck (%x against t3) (for VariableDeclaration(x))
t4 = _TypeCheck (%x against t3) (for dart.core::Comparable<#lib::C2.T*>* x;)
RESULT: t4
------------ C2.id4 ------------
%this = _Parameter #0 [_T (#lib::C2)+]
@ -85,7 +85,7 @@ RESULT: t4
t2 = _Extract (%this[#lib::C2/0]*)
t3 = _CreateRuntimeType (#lib::I @ (t2)*)
t4 = _CreateRuntimeType (#lib::K @ (t3)*)
t5 = _TypeCheck (%x against t4) (for VariableDeclaration(x))
t5 = _TypeCheck (%x against t4) (for #lib::K<#lib::I<#lib::C2.T*>*>* x;)
RESULT: t5
------------ main ------------
t0 = _Call direct [#lib::C.] (_T (#lib::C<dart.core::int*>))

View file

@ -17,9 +17,9 @@ RESULT: _T {}?
%key = _Parameter #1
%value = _Parameter #2
t3 = _Extract (%this[#lib::_NotRealHashMap/0]*)
t4 = _TypeCheck (%key against t3) (for VariableDeclaration(key))
t4 = _TypeCheck (%key against t3) (for #lib::_NotRealHashMap.K* key;)
t5 = _Extract (%this[#lib::_NotRealHashMap/1]*)
t6 = _TypeCheck (%value against t5) (for VariableDeclaration(value))
t6 = _TypeCheck (%value against t5) (for #lib::_NotRealHashMap.V* value;)
RESULT: _T {}?
------------ InheritedElement. ------------
%this = _Parameter #0 [_T (#lib::InheritedElement)+]

View file

@ -20,7 +20,7 @@ RESULT: t1
RESULT: _T {}?
------------ _constList1 ------------
RESULT: _T (dart.core::_ImmutableList, ListConstant<int*>([1, 2, 3]))
RESULT: _T (dart.core::_ImmutableList, const <dart.core::int*>[1, 2, 3])
------------ _constList2 ------------
RESULT: _T (dart.core::_ImmutableList, ListConstant<Object*>([hi, 33, null, -5]))
RESULT: _T (dart.core::_ImmutableList, const <dart.core::Object*>[hi, 33, null, -5])

View file

@ -28,13 +28,13 @@ t1* = _Call direct get [#lib::TestEnum._name] (%this)
RESULT: t1
------------ TestEnum.values ------------
RESULT: _T (dart.core::_ImmutableList, ListConstant<TestEnum*>([#lib::TestEnum {index: 0, #lib::_name: TestEnum.v1, }, #lib::TestEnum {index: 1, #lib::_name: TestEnum.v2, }]))
RESULT: _T (dart.core::_ImmutableList, const <#lib::TestEnum*>[const #lib::TestEnum{#lib::TestEnum.index: 0, #lib::TestEnum._name: TestEnum.v1}, const #lib::TestEnum{#lib::TestEnum.index: 1, #lib::TestEnum._name: TestEnum.v2}])
------------ TestEnum.v1 ------------
RESULT: _T (#lib::TestEnum, #lib::TestEnum {index: 0, #lib::_name: TestEnum.v1, })
RESULT: _T (#lib::TestEnum, const #lib::TestEnum{#lib::TestEnum.index: 0, #lib::TestEnum._name: TestEnum.v1})
------------ TestEnum.v2 ------------
RESULT: _T (#lib::TestEnum, #lib::TestEnum {index: 1, #lib::_name: TestEnum.v2, })
RESULT: _T (#lib::TestEnum, const #lib::TestEnum{#lib::TestEnum.index: 1, #lib::TestEnum._name: TestEnum.v2})
------------ foo ------------
%x = _Parameter #0 [_T ANY?]
RESULT: _T {}?
@ -71,10 +71,10 @@ RESULT: x_0
t2 = _Call direct [#lib::C1.] (_T (#lib::C1))
t3 = _Call direct [#lib::C2.] (_T (#lib::C2))
t4* = _Call direct [#lib::foo] (_T (#lib::C2))
t5 = _TypeCheck (t4 against dart.core::bool*) (for AsExpression(foo, as bool*))
t5 = _TypeCheck (t4 against dart.core::bool*) (for #lib::foo(x = new #lib::C2()) as dart.core::bool*)
t6 = _Call direct [#lib::C3.] (_T (#lib::C3))
t7* = _Call direct [#lib::foo] (_T (#lib::C3))
t8 = _TypeCheck (t7 against dart.core::bool*) (for AsExpression(foo, as bool*))
t8 = _TypeCheck (t7 against dart.core::bool*) (for #lib::foo(x = new #lib::C3()) as dart.core::bool*)
x_0 = _Join [dynamic] (_T (#lib::C2), _T (#lib::C3))
t10 = _Call direct [#lib::bar] (x_0)
RESULT: x_0
@ -82,10 +82,10 @@ RESULT: x_0
t0 = _Call direct [#lib::C1.] (_T (#lib::C1))
t1 = _Call direct [#lib::C2.] (_T (#lib::C2))
t2* = _Call direct [#lib::foo] (_T (#lib::C2))
t3 = _TypeCheck (t2 against dart.core::bool*) (for AsExpression(foo, as bool*))
t3 = _TypeCheck (t2 against dart.core::bool*) (for #lib::foo(x = new #lib::C2()) as dart.core::bool*)
t4 = _Call direct [#lib::C3.] (_T (#lib::C3))
t5* = _Call direct [#lib::foo] (_T (#lib::C3))
t6 = _TypeCheck (t5 against dart.core::bool*) (for AsExpression(foo, as bool*))
t6 = _TypeCheck (t5 against dart.core::bool*) (for #lib::foo(x = new #lib::C3()) as dart.core::bool*)
t7 = _Call direct [#lib::bar] (_T (#lib::C3))
x_0 = _Join [dynamic] (_T (#lib::C2), _T (#lib::C3))
RESULT: x_0
@ -104,7 +104,7 @@ t4 = _Call direct [#lib::baz] (x_0)
RESULT: _T {}?
------------ if6b ------------
%x = _Parameter #0 [_T ANY?]
t1 = _TypeCheck (%x against dart.core::bool*) (for AsExpression( as bool*))
t1 = _TypeCheck (%x against dart.core::bool*) (for x as dart.core::bool*)
t2 = _Call direct [#lib::foo] (_T (dart.core::bool, true))
t3 = _Call direct [#lib::bar] (_T (dart.core::bool, false))
x_0 = _Join [dynamic] (_T (dart.core::bool, true), _T (dart.core::bool, false))
@ -129,8 +129,8 @@ t2 = _Call direct [#lib::foo] (t1)
RESULT: _T {}?
------------ if9 ------------
%x = _Parameter #0 [_T (#lib::TestEnum)+?]
t1* = _Call [#lib::TestEnum.==] (%x, _T (#lib::TestEnum, #lib::TestEnum {index: 0, #lib::_name: TestEnum.v1, }))
t2 = _Call direct [#lib::foo] (_T (#lib::TestEnum, #lib::TestEnum {index: 0, #lib::_name: TestEnum.v1, }))
t1* = _Call [#lib::TestEnum.==] (%x, _T (#lib::TestEnum, const #lib::TestEnum{#lib::TestEnum.index: 0, #lib::TestEnum._name: TestEnum.v1}))
t2 = _Call direct [#lib::foo] (_T (#lib::TestEnum, const #lib::TestEnum{#lib::TestEnum.index: 0, #lib::TestEnum._name: TestEnum.v1}))
RESULT: _T {}?
------------ conditional1 ------------
%cond1 = _Parameter #0 [_T (dart.core::bool)+?]
@ -138,7 +138,7 @@ RESULT: _T {}?
t2 = _Call direct [#lib::C1.] (_T (#lib::C1))
t3 = _Call direct [#lib::C2.] (_T (#lib::C2))
t4* = _Call direct [#lib::foo] (_T (#lib::C2))
t5 = _TypeCheck (t4 against dart.core::bool*) (for AsExpression(foo, as bool*))
t5 = _TypeCheck (t4 against dart.core::bool*) (for #lib::foo(x = new #lib::C2()) as dart.core::bool*)
t6 = _Call direct [#lib::C3.] (_T (#lib::C3))
t7 = _Call direct [#lib::C4.] (_T (#lib::C4))
x_0 = _Join [dynamic] (_T (#lib::C3), _T (#lib::C4))
@ -153,7 +153,7 @@ RESULT: _T {}?
t2 = _Call direct [#lib::C1.] (_T (#lib::C1))
t3 = _Call direct [#lib::C2.] (_T (#lib::C2))
t4* = _Call direct [#lib::foo] (_T (#lib::C2))
t5 = _TypeCheck (t4 against dart.core::bool*) (for AsExpression(foo, as bool*))
t5 = _TypeCheck (t4 against dart.core::bool*) (for #lib::foo(x = new #lib::C2()) as dart.core::bool*)
t6 = _Call direct [#lib::C3.] (_T (#lib::C3))
t7 = _Call direct [#lib::C4.] (_T (#lib::C4))
t8* = _Call direct [#lib::foo] (_T (dart.core::_GrowableList<#lib::C4*>))
@ -165,7 +165,7 @@ RESULT: _T {}?
t0 = _Call direct [#lib::C1.] (_T (#lib::C1))
x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C2))
t2* = _Call direct [#lib::foo] (x_0)
t3 = _TypeCheck (t2 against dart.core::bool*) (for AsExpression(foo, as bool*))
t3 = _TypeCheck (t2 against dart.core::bool*) (for #lib::foo(x) as dart.core::bool*)
t4 = _Call direct [#lib::C2.] (_T (#lib::C2))
t5 = _Call direct [#lib::bar] (x_0)
RESULT: x_0
@ -177,13 +177,13 @@ t3 = _Call direct [#lib::C2.] (_T (#lib::C2))
t4 = _Call direct [#lib::bar] (_T (#lib::C2))
t5 = _Call direct [#lib::C3.] (_T (#lib::C3))
t6* = _Call direct [#lib::bar] (_T (#lib::C3))
t7 = _TypeCheck (t6 against dart.core::bool*) (for AsExpression(bar, as bool*))
t7 = _TypeCheck (t6 against dart.core::bool*) (for #lib::bar(x = new #lib::C3()) as dart.core::bool*)
RESULT: _T (#lib::C3)
------------ loop3 ------------
t0 = _Call direct [#lib::C1.] (_T (#lib::C1))
t1 = _Call direct [#lib::C2.] (_T (#lib::C2))
t2* = _Call direct [#lib::foo] (_T (#lib::C2))
t3 = _TypeCheck (t2 against dart.core::bool*) (for AsExpression(foo, as bool*))
t3 = _TypeCheck (t2 against dart.core::bool*) (for #lib::foo(x = new #lib::C2()) as dart.core::bool*)
t4 = _Call direct [#lib::C3.] (_T (#lib::C3))
t5 = _Call direct [#lib::bar] (_T (#lib::C2))
RESULT: _T (#lib::C2)
@ -191,7 +191,7 @@ RESULT: _T (#lib::C2)
t0 = _Call direct [#lib::C1.] (_T (#lib::C1))
t1 = _Call direct [#lib::C2.] (_T (#lib::C2))
t2 = _Call direct [#lib::foo] (_T (#lib::C2))
t3* = _Call get [dart.core::Iterable.iterator] (_T (dart.core::_GrowableList<DynamicType(dynamic)?>))
t3* = _Call get [dart.core::Iterable.iterator] (_T (dart.core::_GrowableList<dynamic?>))
t4* = _Call [dart.core::Iterator.moveNext] (t3)
t5 = _Narrow (t3 to _T ANY)
t6 = _Call get [dart.core::Iterator.current] (t5)
@ -203,10 +203,10 @@ RESULT: x_0
t0 = _Call direct [#lib::C1.] (_T (#lib::C1))
x_0 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C3))
t2* = _Call direct [#lib::foo] (x_0)
t3 = _TypeCheck (t2 against dart.core::bool*) (for AsExpression(foo, as bool*))
t3 = _TypeCheck (t2 against dart.core::bool*) (for #lib::foo(x) as dart.core::bool*)
t4 = _Call direct [#lib::C2.] (_T (#lib::C2))
t5* = _Call direct [#lib::bar] (_T (#lib::C2))
t6 = _TypeCheck (t5 against dart.core::bool*) (for AsExpression(bar, as bool*))
t6 = _TypeCheck (t5 against dart.core::bool*) (for #lib::bar(x) as dart.core::bool*)
t7 = _Call direct [#lib::C3.] (_T (#lib::C3))
x_1 = _Join [dynamic] (x_0, _T (#lib::C2))
RESULT: x_1
@ -215,10 +215,10 @@ t0 = _Call direct [#lib::C1.] (_T (#lib::C1))
x_1 = _Join [dynamic] (_T (#lib::C3), _T (#lib::C2))
x_0 = _Join [dynamic] (_T (#lib::C1), x_1)
t3* = _Call direct [#lib::foo] (x_0)
t4 = _TypeCheck (t3 against dart.core::bool*) (for AsExpression(foo, as bool*))
t4 = _TypeCheck (t3 against dart.core::bool*) (for #lib::foo(x) as dart.core::bool*)
t5 = _Call direct [#lib::C2.] (_T (#lib::C2))
t6* = _Call direct [#lib::bar] (_T (#lib::C2))
t7 = _TypeCheck (t6 against dart.core::bool*) (for AsExpression(bar, as bool*))
t7 = _TypeCheck (t6 against dart.core::bool*) (for #lib::bar(x) as dart.core::bool*)
t8 = _Call direct [#lib::C3.] (_T (#lib::C3))
RESULT: x_0
------------ try1 ------------
@ -271,7 +271,7 @@ x_2 = _Join [dynamic] (_T (#lib::C1), _T (#lib::C3))
RESULT: x_2
------------ cast1 ------------
%x = _Parameter #0 [_T ANY?]
t1 = _TypeCheck (%x against #lib::C1*) (for AsExpression( as C1*))
t1 = _TypeCheck (%x against #lib::C1*) (for x as #lib::C1*)
t2 = _Call direct [#lib::foo] (t1)
t3 = _Call direct [#lib::bar] (t1)
RESULT: _T {}?

View file

@ -30,11 +30,11 @@ class B extends core::Object {
}
[@vm.unboxing-info.metadata=(b)->i]static method foo([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (core::List<core::int*>*) →* void a) → core::int* {
@#C9 core::int* x = 2;
return [@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] x.{core::num::+}(2);
return [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] x.{core::num::+}(2);
}
@#C11
static method main(core::List<core::String*>* args) → dynamic {
self::A::staticMethod();
[@vm.direct-call.metadata=B.instanceMethod] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•().{self::B::instanceMethod}();
[@vm.direct-call.metadata=#lib::B.instanceMethod] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•().{self::B::instanceMethod}();
self::foo(null);
}

View file

@ -27,13 +27,13 @@ class A extends core::Object {
return;
}
on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
[@vm.direct-call.metadata=_AsyncAwaitCompleter.completeError] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::Completer::completeError}(exception, stack_trace);
[@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.completeError] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::Completer::completeError}(exception, stack_trace);
}
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
[@vm.direct-call.metadata=_AsyncAwaitCompleter.start] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
return [@vm.direct-call.metadata=_AsyncAwaitCompleter.future] [@vm.inferred-type.metadata=dart.async::_Future] :async_completer.{asy::Completer::future};
[@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.start] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
return [@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.future] [@vm.inferred-type.metadata=dart.async::_Future] :async_completer.{asy::Completer::future};
}
}
class B extends core::Object {
@ -62,13 +62,13 @@ static method baz() → asy::Future<dynamic>* /* originally async */ {
return;
}
on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
[@vm.direct-call.metadata=_AsyncAwaitCompleter.completeError] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::Completer::completeError}(exception, stack_trace);
[@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.completeError] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::Completer::completeError}(exception, stack_trace);
}
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
[@vm.direct-call.metadata=_AsyncAwaitCompleter.start] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
return [@vm.direct-call.metadata=_AsyncAwaitCompleter.future] [@vm.inferred-type.metadata=dart.async::_Future] :async_completer.{asy::Completer::future};
[@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.start] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
return [@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.future] [@vm.inferred-type.metadata=dart.async::_Future] :async_completer.{asy::Completer::future};
}
static method main() → dynamic /* originally async */ {
final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
@ -86,18 +86,18 @@ static method main() → dynamic /* originally async */ {
{
:async_temporary_0 = [@vm.inferred-type.metadata=#lib::A] self::foo();
[yield] let dynamic #t1 = asy::_awaitHelper([@vm.inferred-type.metadata=dart.async::_Future] self::baz(), :async_op_then, :async_op_error, :async_op) in null;
[yield] let dynamic #t2 = asy::_awaitHelper([@vm.direct-call.metadata=A.bar??] [@vm.inferred-type.metadata=dart.async::_Future (receiver not int)] _in::unsafeCast<dynamic>(:async_temporary_0).bar(:result), :async_op_then, :async_op_error, :async_op) in null;
[yield] let dynamic #t2 = asy::_awaitHelper([@vm.direct-call.metadata=#lib::A.bar??] [@vm.inferred-type.metadata=dart.async::_Future (receiver not int)] _in::unsafeCast<dynamic>(:async_temporary_0).bar(:result), :async_op_then, :async_op_error, :async_op) in null;
:result;
}
asy::_completeOnAsyncReturn(:async_completer, :return_value);
return;
}
on dynamic catch(dynamic exception, core::StackTrace* stack_trace) {
[@vm.direct-call.metadata=_AsyncAwaitCompleter.completeError] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::Completer::completeError}(exception, stack_trace);
[@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.completeError] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::Completer::completeError}(exception, stack_trace);
}
:async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
:async_op_then = asy::_asyncThenWrapperHelper(:async_op);
:async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
[@vm.direct-call.metadata=_AsyncAwaitCompleter.start] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
return [@vm.direct-call.metadata=_AsyncAwaitCompleter.future] [@vm.inferred-type.metadata=dart.async::_Future] :async_completer.{asy::Completer::future};
[@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.start] [@vm.inferred-type.metadata=!? (skip check)] :async_completer.{asy::_AsyncAwaitCompleter::start}(:async_op);
return [@vm.direct-call.metadata=dart.async::_AsyncAwaitCompleter.future] [@vm.inferred-type.metadata=dart.async::_Future] :async_completer.{asy::Completer::future};
}

View file

@ -4,19 +4,19 @@ import "dart:core" as core;
import "dart:_internal" as _in;
[@vm.unboxing-info.metadata=(i)->b]static method isPrime([@vm.inferred-type.metadata=int] dynamic n) → core::bool* {
if(_in::unsafeCast<core::bool*>([@vm.direct-call.metadata=_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool] n.<(2)))
if(_in::unsafeCast<core::bool*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool] n.<(2)))
return false;
for (core::int* i = 2; [@vm.direct-call.metadata=_IntegerImplementation.<=] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=_IntegerImplementation.*] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::*}(i).{core::num::<=}(_in::unsafeCast<core::num>(n)); i = [@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
if([@vm.direct-call.metadata=_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=_IntegerImplementation.%] [@vm.inferred-type.metadata=int] n.%(i).{core::Object::==}(0))
for (core::int* i = 2; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<=] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation.*] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::*}(i).{core::num::<=}(_in::unsafeCast<core::num>(n)); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
if([@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation.%] [@vm.inferred-type.metadata=int] n.%(i).{core::Object::==}(0))
return false;
}
return true;
}
[@vm.unboxing-info.metadata=(i)->b]static method nThPrimeNumber([@vm.inferred-type.metadata=dart.core::_Smi (value: 50000)] core::int* n) → core::int* {
core::int* counter = 0;
for (core::int* i = 1; ; i = [@vm.direct-call.metadata=_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
for (core::int* i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
if([@vm.inferred-type.metadata=dart.core::bool] self::isPrime(i))
counter = [@vm.direct-call.metadata=_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] counter.{core::num::+}(1);
counter = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] counter.{core::num::+}(1);
if([@vm.inferred-type.metadata=dart.core::bool] counter.{core::num::==}(n)) {
return i;
}
@ -31,11 +31,11 @@ static method run() → void {
}
static method main(core::List<core::String*>* args) → dynamic {
core::Stopwatch* timer = let final core::Stopwatch #t1 = new core::Stopwatch::•() in block {
[@vm.direct-call.metadata=Stopwatch.start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}();
[@vm.direct-call.metadata=dart.core::Stopwatch.start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}();
} =>#t1;
for (core::int* i = 0; [@vm.direct-call.metadata=_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100); i = [@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
self::run();
}
[@vm.direct-call.metadata=Stopwatch.stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}();
core::print("Elapsed ${[@vm.direct-call.metadata=Stopwatch.elapsedMilliseconds] timer.{core::Stopwatch::elapsedMilliseconds}}ms");
[@vm.direct-call.metadata=dart.core::Stopwatch.stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}();
core::print("Elapsed ${[@vm.direct-call.metadata=dart.core::Stopwatch.elapsedMilliseconds] timer.{core::Stopwatch::elapsedMilliseconds}}ms");
}

View file

@ -13,14 +13,14 @@ class _Vector extends core::Object {
: self::_Vector::_offset = 0, self::_Vector::_length = size, self::_Vector::_elements = [@vm.inferred-type.metadata=dart.typed_data::_Float64List] typ::Float64List::•(size), super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1] [@vm.unboxing-info.metadata=(b)->d] operator []([@vm.inferred-type.metadata=!] core::int* i) → core::double*
return [@vm.direct-call.metadata=_Float64List.[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=_Vector._elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}([@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}([@vm.direct-call.metadata=_Vector._offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset}));
return [@vm.direct-call.metadata=dart.typed_data::_Float64List.[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector._elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector._offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset}));
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2] operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int* i, core::double* value) → void {
let dynamic #t1 = [@vm.direct-call.metadata=_Vector._elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements} in let dynamic #t2 = [@vm.direct-call.metadata=_Vector._offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset} in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
let dynamic #t1 = [@vm.direct-call.metadata=#lib::_Vector._elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements} in let dynamic #t2 = [@vm.direct-call.metadata=#lib::_Vector._offset] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] this.{self::_Vector::_offset} in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
}
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3] [@vm.unboxing-info.metadata=(b)->d] operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector* a) → core::double* {
core::double* result = 0.0;
for (core::int* i = 0; [@vm.direct-call.metadata=_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=_Vector._length] [@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1))
result = [@vm.direct-call.metadata=_Double.+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] result.{core::double::+}([@vm.direct-call.metadata=_Double.*] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=_Vector.[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=_Vector.[]??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] a.{self::_Vector::[]}(i)));
for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector._length] [@vm.inferred-type.metadata=dart.core::_Smi (value: 10)] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1))
result = [@vm.direct-call.metadata=dart.core::_Double.+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double.*] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector.[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector.[]??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] a.{self::_Vector::[]}(i)));
return result;
}
}
@ -28,11 +28,11 @@ class _Vector extends core::Object {
[@vm.inferred-type.metadata=dart.core::_Double?]static field core::double* x = 0.0;
static method main(core::List<core::String*>* args) → dynamic {
core::Stopwatch* timer = let final core::Stopwatch #t3 = new core::Stopwatch::•() in block {
[@vm.direct-call.metadata=Stopwatch.start] [@vm.inferred-type.metadata=!? (skip check)] #t3.{core::Stopwatch::start}();
[@vm.direct-call.metadata=dart.core::Stopwatch.start] [@vm.inferred-type.metadata=!? (skip check)] #t3.{core::Stopwatch::start}();
} =>#t3;
for (core::int* i = 0; [@vm.direct-call.metadata=_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100000000); i = [@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
self::x = [@vm.direct-call.metadata=_Double.+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=dart.core::_Double?] self::x.{core::double::+}([@vm.direct-call.metadata=_Vector.*??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=#lib::_Vector?] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector?] self::v));
for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation.<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100000000); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
self::x = [@vm.direct-call.metadata=dart.core::_Double.+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=dart.core::_Double?] self::x.{core::double::+}([@vm.direct-call.metadata=#lib::_Vector.*??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=#lib::_Vector?] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector?] self::v));
}
[@vm.direct-call.metadata=Stopwatch.stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}();
core::print("Elapsed ${[@vm.direct-call.metadata=Stopwatch.elapsedMilliseconds] timer.{core::Stopwatch::elapsedMilliseconds}}ms, result ${self::x}");
[@vm.direct-call.metadata=dart.core::Stopwatch.stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}();
core::print("Elapsed ${[@vm.direct-call.metadata=dart.core::Stopwatch.elapsedMilliseconds] timer.{core::Stopwatch::elapsedMilliseconds}}ms, result ${self::x}");
}

View file

@ -23,7 +23,7 @@ class E<S extends core::Object* = dynamic, T extends core::Object* = dynamic> ex
: super self::C::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method foo() → dynamic
return [@vm.inferred-type.metadata=#lib::D<InterfaceType(String*)>] super.{self::C::foo}();
return [@vm.inferred-type.metadata=#lib::D<dart.core::String*>] super.{self::C::foo}();
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method bar() → dynamic
return new self::D::•<self::E::S*>();
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] method baz() → dynamic
@ -59,18 +59,18 @@ class C2<T extends core::Object* = dynamic> extends core::Object {
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] method id3([@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.0)] generic-covariant-impl core::Comparable<self::C2::T*>* x) → dynamic
return x;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] method id4([@vm.inferred-type.metadata=#lib::K<InterfaceType(J*)> (skip check)] generic-covariant-impl self::K<self::I<self::C2::T*>*>* x) → dynamic
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] method id4([@vm.inferred-type.metadata=#lib::K<#lib::J*> (skip check)] generic-covariant-impl self::K<self::I<self::C2::T*>*>* x) → dynamic
return x;
}
static method main() → dynamic {
core::print([@vm.direct-call.metadata=C.foo] [@vm.inferred-type.metadata=#lib::D<InterfaceType(int*)> (skip check)] new self::C::•<core::int*>().{self::C::foo}());
core::print([@vm.direct-call.metadata=E.foo] [@vm.inferred-type.metadata=#lib::D<InterfaceType(String*)> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::foo}());
core::print([@vm.direct-call.metadata=E.bar] [@vm.inferred-type.metadata=#lib::D<InterfaceType(int*)> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::bar}());
core::print([@vm.direct-call.metadata=E.baz] [@vm.inferred-type.metadata=#lib::D<InterfaceType(String*)> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::baz}());
core::print([@vm.direct-call.metadata=#lib::C.foo] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::C::•<core::int*>().{self::C::foo}());
core::print([@vm.direct-call.metadata=#lib::E.foo] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::foo}());
core::print([@vm.direct-call.metadata=#lib::E.bar] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::bar}());
core::print([@vm.direct-call.metadata=#lib::E.baz] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::baz}());
self::C<self::X*>* c = new self::C::•<self::Y*>();
[@vm.call-site-attributes.metadata=receiverType:InterfaceType(C<X*>*)] [@vm.direct-call.metadata=C.id1] [@vm.inferred-type.metadata=!? (skip check)] c.{self::C::id1}(new self::Y::•());
[@vm.call-site-attributes.metadata=receiverType:InterfaceType(C<X*>*)] [@vm.direct-call.metadata=C.id2] c.{self::C::id2}(new self::Z::•());
[@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X*>*] [@vm.direct-call.metadata=#lib::C.id1] [@vm.inferred-type.metadata=!? (skip check)] c.{self::C::id1}(new self::Y::•());
[@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X*>*] [@vm.direct-call.metadata=#lib::C.id2] c.{self::C::id2}(new self::Z::•());
self::C2<core::num*>* c2 = new self::C2::•<core::num*>();
[@vm.call-site-attributes.metadata=receiverType:InterfaceType(C2<num*>*)] [@vm.direct-call.metadata=C2.id3] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id3}(3.0);
[@vm.call-site-attributes.metadata=receiverType:InterfaceType(C2<num*>*)] [@vm.direct-call.metadata=C2.id4] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id4}(new self::K::•<self::J*>());
[@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num*>*] [@vm.direct-call.metadata=#lib::C2.id3] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id3}(3.0);
[@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num*>*] [@vm.direct-call.metadata=#lib::C2.id4] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id4}(new self::K::•<self::J*>());
}

View file

@ -10,16 +10,16 @@ class Element extends core::Object {
;
}
class InheritedElement extends self::Element {
[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<InterfaceType(Element*), InterfaceType(Object*)>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] final field core::Map<self::Element*, core::Object*>* _dependents = <self::Element*, core::Object*>{};
[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] final field core::Map<self::Element*, core::Object*>* _dependents = <self::Element*, core::Object*>{};
synthetic constructor •() → self::InheritedElement*
: super self::Element::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method setDependencies([@vm.inferred-type.metadata=!] self::Element* dependent, [@vm.inferred-type.metadata=dart.core::_Smi?] core::Object* value) → void {
[@vm.call-site-attributes.metadata=receiverType:InterfaceType(Map<Element*, Object*>*)] [@vm.direct-call.metadata=__InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin.[]=] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=InheritedElement._dependents] [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<InterfaceType(Element*), InterfaceType(Object*)>] this.{self::InheritedElement::_dependents}.{core::Map::[]=}(dependent, value);
[@vm.call-site-attributes.metadata=receiverType:dart.core::Map<#lib::Element*, dart.core::Object*>*] [@vm.direct-call.metadata=dart.collection::__InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin.[]=] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::InheritedElement._dependents] [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] this.{self::InheritedElement::_dependents}.{core::Map::[]=}(dependent, value);
}
}
static method main() → dynamic {
self::InheritedElement* ie = new self::InheritedElement::•();
[@vm.direct-call.metadata=InheritedElement.setDependencies] [@vm.inferred-type.metadata=!? (skip check)] ie.{self::InheritedElement::setDependencies}(ie, 0);
[@vm.direct-call.metadata=InheritedElement.setDependencies] [@vm.inferred-type.metadata=!? (skip check)] ie.{self::InheritedElement::setDependencies}(new self::Element::•(), null);
[@vm.direct-call.metadata=#lib::InheritedElement.setDependencies] [@vm.inferred-type.metadata=!? (skip check)] ie.{self::InheritedElement::setDependencies}(ie, 0);
[@vm.direct-call.metadata=#lib::InheritedElement.setDependencies] [@vm.inferred-type.metadata=!? (skip check)] ie.{self::InheritedElement::setDependencies}(new self::Element::•(), null);
}

View file

@ -33,19 +33,19 @@ static get getD() → dynamic
core::print([@vm.inferred-type.metadata=dart.core::_Double (value: 100.0)] self::getD);
}
static method testStrings([@vm.inferred-type.metadata=#lib::A] self::A* a0, [@vm.inferred-type.metadata=dart.core::_OneByteString (value: bazz)] core::String* a1) → void {
core::print([@vm.direct-call.metadata=A.foo] [@vm.inferred-type.metadata=dart.core::_OneByteString (value: foo)] a0.{self::A::foo});
core::print([@vm.direct-call.metadata=A.getBar] [@vm.inferred-type.metadata=dart.core::_OneByteString (skip check) (value: bar)] a0.{self::A::getBar}());
core::print([@vm.direct-call.metadata=#lib::A.foo] [@vm.inferred-type.metadata=dart.core::_OneByteString (value: foo)] a0.{self::A::foo});
core::print([@vm.direct-call.metadata=#lib::A.getBar] [@vm.inferred-type.metadata=dart.core::_OneByteString (skip check) (value: bar)] a0.{self::A::getBar}());
core::print(a1);
}
static method testPassEnum([@vm.inferred-type.metadata=#lib::B (value: #lib::B {index: 1, #lib::_name: B.b2, })] self::B* arg) → void {
static method testPassEnum([@vm.inferred-type.metadata=#lib::B (value: const #lib::B{#lib::B.index: 1, #lib::B._name: B.b2})] self::B* arg) → void {
self::testPassEnum2(arg);
}
static method testPassEnum2([@vm.inferred-type.metadata=#lib::B (value: #lib::B {index: 1, #lib::_name: B.b2, })] self::B* arg) → void {
static method testPassEnum2([@vm.inferred-type.metadata=#lib::B (value: const #lib::B{#lib::B.index: 1, #lib::B._name: B.b2})] self::B* arg) → void {
core::print(arg);
}
static method getList() → dynamic
return #C6;
static method testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<int*>([1, 2, 3]))] dynamic arg1, [[@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<int*>([4, 5]))] dynamic arg2 = #C9]) → void {
static method testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: const <dart.core::int*>[1, 2, 3])] dynamic arg1, [[@vm.inferred-type.metadata=dart.core::_ImmutableList (value: const <dart.core::int*>[4, 5])] dynamic arg2 = #C9]) → void {
core::print(arg1);
core::print(arg2);
}
@ -56,5 +56,5 @@ static method main() → dynamic {
self::testDouble(3.14);
self::testStrings(new self::A::•(), "bazz");
self::testPassEnum(#C11);
self::testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: ListConstant<int*>([1, 2, 3]))] self::getList());
self::testList([@vm.inferred-type.metadata=dart.core::_ImmutableList (value: const <dart.core::int*>[1, 2, 3])] self::getList());
}

View file

@ -40,16 +40,16 @@ static method callerA1([@vm.inferred-type.metadata=!] self::A* aa) → void {
[@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
}
static method callerA2([@vm.inferred-type.metadata=#lib::B] self::A* aa) → void {
[@vm.direct-call.metadata=B.foo] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
[@vm.direct-call.metadata=#lib::B.foo] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
}
static method callerA3([@vm.inferred-type.metadata=#lib::C] self::A* aa) → void {
[@vm.direct-call.metadata=C.foo] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
[@vm.direct-call.metadata=#lib::C.foo] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
}
static method callerA4([@vm.inferred-type.metadata=#lib::D?] self::A* aa) → void {
[@vm.direct-call.metadata=C.foo??] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
[@vm.direct-call.metadata=#lib::C.foo??] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
}
static method callerE1([@vm.inferred-type.metadata=dart.core::_OneByteString (value: abc)] dynamic x) → void {
[@vm.direct-call.metadata=_StringBase.toString] [@vm.inferred-type.metadata=!? (skip check) (receiver not int)] x.{core::Object::toString}();
[@vm.direct-call.metadata=dart.core::_StringBase.toString] [@vm.inferred-type.metadata=!? (skip check) (receiver not int)] x.{core::Object::toString}();
}
static method callerE2([@vm.inferred-type.metadata=#lib::E?] dynamic x) → void {
[@vm.inferred-type.metadata=!? (receiver not int)] x.{core::Object::toString}();

View file

@ -3,6 +3,6 @@ import self as self;
import "dart:core" as core;
static method main() → dynamic {
dynamic x = [@vm.inferred-type.metadata=dart.core::_List<InterfaceType(int*)>] core::_List::•<core::int*>(10);
[@vm.direct-call.metadata=_IntegerImplementation.+??] [@vm.direct-call.metadata=_List.[]] [@vm.inferred-type.metadata=int? (receiver not int)] x.[](0).+(10);
dynamic x = [@vm.inferred-type.metadata=dart.core::_List<dart.core::int*>] core::_List::•<core::int*>(10);
[@vm.direct-call.metadata=dart.core::_IntegerImplementation.+??] [@vm.direct-call.metadata=dart.core::_List.[]] [@vm.inferred-type.metadata=int? (receiver not int)] x.[](0).+(10);
}

View file

@ -10,26 +10,26 @@ class C<T extends core::Object* = dynamic> extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method test2c([@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] generic-covariant-impl FutureOr<self::C::T*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method test3c([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(int*)> (skip check)] generic-covariant-impl asy::Future<self::C::T*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method test4c([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(int*)> (skip check)] generic-covariant-impl FutureOr<self::C::T*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method test2r([@vm.inferred-type.metadata=#lib::C<InterfaceType(int*)> (skip check)] generic-covariant-impl self::C<FutureOr<self::C::T*>*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] method test3r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Future<int*>*)> (skip check)] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] method test4r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Future<int*>*)> (skip check)] generic-covariant-impl self::C<FutureOr<self::C::T*>*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] method test5r([@vm.inferred-type.metadata=#lib::C<FutureOrType(FutureOr<int*>?)>] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16] method test6r([@vm.inferred-type.metadata=#lib::C<FutureOrType(FutureOr<int*>?)> (skip check)] generic-covariant-impl self::C<FutureOr<self::C::T*>*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18] method test7r([@vm.inferred-type.metadata=#lib::C<FutureOrType(FutureOr<int*>?)>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20] method test8r([@vm.inferred-type.metadata=#lib::C<InterfaceType(Future<int*>*)>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl asy::Future<self::C::T*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl FutureOr<self::C::T*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method test2r([@vm.inferred-type.metadata=#lib::C<dart.core::int*> (skip check)] generic-covariant-impl self::C<FutureOr<self::C::T*>*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] method test3r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] method test4r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<FutureOr<self::C::T*>*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:13,getterSelectorId:14] method test5r([@vm.inferred-type.metadata=#lib::C<FutureOr<dart.core::int*>?>] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:15,getterSelectorId:16] method test6r([@vm.inferred-type.metadata=#lib::C<FutureOr<dart.core::int*>?> (skip check)] generic-covariant-impl self::C<FutureOr<self::C::T*>*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:17,getterSelectorId:18] method test7r([@vm.inferred-type.metadata=#lib::C<FutureOr<dart.core::int*>?>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:19,getterSelectorId:20] method test8r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
}
static method main() → dynamic {
dynamic c = new self::C::•<core::int*>();
[@vm.direct-call.metadata=C.test2c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test2c(3);
[@vm.direct-call.metadata=C.test3c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test3c([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(int*)>] asy::Future::value<core::int*>(3));
[@vm.direct-call.metadata=C.test4c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test4c([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(int*)>] asy::Future::value<core::int*>(3));
[@vm.direct-call.metadata=C.test2r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test2r(new self::C::•<core::int*>());
[@vm.direct-call.metadata=C.test3r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test3r(new self::C::•<asy::Future<core::int*>*>());
[@vm.direct-call.metadata=C.test4r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test4r(new self::C::•<asy::Future<core::int*>*>());
[@vm.direct-call.metadata=C.test5r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test5r(new self::C::•<FutureOr<core::int*>*>());
[@vm.direct-call.metadata=C.test6r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test6r(new self::C::•<FutureOr<core::int*>*>());
[@vm.direct-call.metadata=C.test7r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test7r(new self::C::•<FutureOr<core::int*>*>());
[@vm.direct-call.metadata=C.test8r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test8r(new self::C::•<asy::Future<core::int*>*>());
[@vm.direct-call.metadata=#lib::C.test2c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test2c(3);
[@vm.direct-call.metadata=#lib::C.test3c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*>] asy::Future::value<core::int*>(3));
[@vm.direct-call.metadata=#lib::C.test4c] [@vm.inferred-type.metadata=!? (receiver not int)] c.test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*>] asy::Future::value<core::int*>(3));
[@vm.direct-call.metadata=#lib::C.test2r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test2r(new self::C::•<core::int*>());
[@vm.direct-call.metadata=#lib::C.test3r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test3r(new self::C::•<asy::Future<core::int*>*>());
[@vm.direct-call.metadata=#lib::C.test4r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test4r(new self::C::•<asy::Future<core::int*>*>());
[@vm.direct-call.metadata=#lib::C.test5r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test5r(new self::C::•<FutureOr<core::int*>*>());
[@vm.direct-call.metadata=#lib::C.test6r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test6r(new self::C::•<FutureOr<core::int*>*>());
[@vm.direct-call.metadata=#lib::C.test7r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test7r(new self::C::•<FutureOr<core::int*>*>());
[@vm.direct-call.metadata=#lib::C.test8r] [@vm.inferred-type.metadata=!? (receiver not int)] c.test8r(new self::C::•<asy::Future<core::int*>*>());
}

View file

@ -16,11 +16,11 @@ class B extends self::A {
;
}
[@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
static method foo1_a1([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(B*)>] dynamic x) → void {}
static method foo1_a1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {}
static method foo1_a2([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
static method foo1_a3([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(B*)>] dynamic x) → void {}
static method foo1_a3([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {}
static method foo1_a4([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
static method foo1([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(B*)>] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B] self::A* a2, [@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(B*)>] FutureOr<self::A*>* a3, [@vm.inferred-type.metadata=#lib::B] FutureOr<self::A*>* a4) → void {
static method foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B] self::A* a2, [@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] FutureOr<self::A*>* a3, [@vm.inferred-type.metadata=#lib::B] FutureOr<self::A*>* a4) → void {
self::foo1_a1(a1);
self::foo1_a2(a2);
self::foo1_a3(a3);
@ -37,8 +37,8 @@ static method foo2([@vm.inferred-type.metadata=dart.async::_Future?] asy::Future
self::foo2_a4(a4);
}
static method getDynamic() → dynamic
return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Function*)] self::unknown.call();
return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
static method main(core::List<core::String*>* args) → dynamic {
self::foo1([@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(B*)>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•(), [@vm.inferred-type.metadata=dart.async::_Future<InterfaceType(B*)>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•());
self::foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•(), [@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•());
self::foo2(self::getDynamic() as{TypeError,ForDynamic} asy::Future<self::A*>*, self::getDynamic() as{TypeError,ForDynamic} self::A*, self::getDynamic() as{TypeError,ForDynamic} FutureOr<self::A*>*, self::getDynamic() as{TypeError,ForDynamic} FutureOr<self::A*>*);
}

View file

@ -54,7 +54,7 @@ abstract class StreamView extends self::Stream {
: self::StreamView::_stream = stream, super self::Stream::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method foobar([@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData, {[@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → self::StreamSubscription* {
return [@vm.direct-call.metadata=StreamView._stream] [@vm.inferred-type.metadata=!] this.{self::StreamView::_stream}.{self::Stream::foobar}(onData, onError: onError);
return [@vm.direct-call.metadata=#lib::StreamView._stream] [@vm.inferred-type.metadata=!] this.{self::StreamView::_stream}.{self::Stream::foobar}(onData, onError: onError);
}
}
class ByteStream extends self::StreamView {
@ -83,32 +83,32 @@ static method round0() → void {
}
static method round1({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1}) → void {
self::ByteStream* x = new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
[@vm.direct-call.metadata=ByteStream.super_foobar1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar1}(onData);
[@vm.direct-call.metadata=#lib::ByteStream.super_foobar1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar1}(onData);
}
static method round2({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → void {
new self::_ControllerStream::•();
self::Stream* x = new self::_GeneratedStreamImpl::•();
x = new self::ByteStream::•(x);
[@vm.direct-call.metadata=StreamView.foobar] [@vm.inferred-type.metadata=!? (skip check)] x.{self::Stream::foobar}(onData, onError: onError);
[@vm.direct-call.metadata=#lib::StreamView.foobar] [@vm.inferred-type.metadata=!? (skip check)] x.{self::Stream::foobar}(onData, onError: onError);
}
static method round3({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::Function* onError = #C1}) → void {
self::Stream* x = new self::_GeneratedStreamImpl::•();
x = new self::ByteStream::•(x);
x = new self::_ControllerStream::•();
[@vm.direct-call.metadata=_StreamImpl.foobar] [@vm.inferred-type.metadata=!? (skip check)] x.{self::Stream::foobar}(onData, onError: onError);
[@vm.direct-call.metadata=#lib::_StreamImpl.foobar] [@vm.inferred-type.metadata=!? (skip check)] x.{self::Stream::foobar}(onData, onError: onError);
}
static method round4({[@vm.inferred-type.metadata=dart.core::Null? (value: null)] (dynamic) →* void onData = #C1}) → void {
self::ByteStream* x = new self::ByteStream::•(new self::_ControllerStream::•());
self::Stream* y = [@vm.direct-call.metadata=ByteStream.super_stream] [@vm.inferred-type.metadata=!] x.{self::ByteStream::super_stream};
self::Stream* z = [@vm.direct-call.metadata=StreamView._stream] [@vm.inferred-type.metadata=!] x.{self::StreamView::_stream};
if([@vm.direct-call.metadata=Object.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] y.{self::Stream::==}(z)) {
[@vm.direct-call.metadata=ByteStream.super_foobar2] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar2}(onData);
self::Stream* y = [@vm.direct-call.metadata=#lib::ByteStream.super_stream] [@vm.inferred-type.metadata=!] x.{self::ByteStream::super_stream};
self::Stream* z = [@vm.direct-call.metadata=#lib::StreamView._stream] [@vm.inferred-type.metadata=!] x.{self::StreamView::_stream};
if([@vm.direct-call.metadata=dart.core::Object.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] y.{self::Stream::==}(z)) {
[@vm.direct-call.metadata=#lib::ByteStream.super_foobar2] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar2}(onData);
}
}
static method round5() → void {
self::ByteStream* x = new self::ByteStream::•(new self::_GeneratedStreamImpl::•());
new self::_HandleErrorStream::•();
[@vm.direct-call.metadata=ByteStream.super_foobar3] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar3}();
[@vm.direct-call.metadata=#lib::ByteStream.super_foobar3] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar3}();
}
static method main(core::List<core::String*>* args) → dynamic {
new self::_GeneratedStreamImpl::•();

View file

@ -34,11 +34,11 @@ class DeepCaller1 extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method barL1() → dynamic
return [@vm.direct-call.metadata=DeepCaller1.barL2] [@vm.inferred-type.metadata=!? (skip check)] this.{self::DeepCaller1::barL2}();
return [@vm.direct-call.metadata=#lib::DeepCaller1.barL2] [@vm.inferred-type.metadata=!? (skip check)] this.{self::DeepCaller1::barL2}();
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method barL2() → dynamic
return [@vm.direct-call.metadata=DeepCaller1.barL3] [@vm.inferred-type.metadata=!? (skip check)] this.{self::DeepCaller1::barL3}();
return [@vm.direct-call.metadata=#lib::DeepCaller1.barL3] [@vm.inferred-type.metadata=!? (skip check)] this.{self::DeepCaller1::barL3}();
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method barL3() → dynamic
return [@vm.direct-call.metadata=DeepCaller1.barL4] [@vm.inferred-type.metadata=!? (skip check)] this.{self::DeepCaller1::barL4}();
return [@vm.direct-call.metadata=#lib::DeepCaller1.barL4] [@vm.inferred-type.metadata=!? (skip check)] this.{self::DeepCaller1::barL4}();
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] method barL4() → dynamic
return self::field1;
}
@ -53,26 +53,26 @@ class DeepCaller2 extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method barL1([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
return [@vm.direct-call.metadata=DeepCaller2.barL2] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL2}(dd);
return [@vm.direct-call.metadata=#lib::DeepCaller2.barL2] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL2}(dd);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method barL2([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
return [@vm.direct-call.metadata=DeepCaller2.barL3] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL3}(dd);
return [@vm.direct-call.metadata=#lib::DeepCaller2.barL3] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL3}(dd);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method barL3([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
return [@vm.direct-call.metadata=DeepCaller2.barL4] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL4}(dd);
return [@vm.direct-call.metadata=#lib::DeepCaller2.barL4] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL4}(dd);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] method barL4([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
return [@vm.direct-call.metadata=D.field2] [@vm.inferred-type.metadata=!] dd.{self::D::field2};
return [@vm.direct-call.metadata=#lib::D.field2] [@vm.inferred-type.metadata=!] dd.{self::D::field2};
}
[@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
static field core::Object* field1 = [@vm.inferred-type.metadata=!] self::getValue();
static method getDynamic() → dynamic
return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Function*)] self::unknown.call();
return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
static method getValue() → core::Object* {
self::A* aa = self::getDynamic() as{TypeError,ForDynamic} self::A*;
return [@vm.inferred-type.metadata=!] aa.{self::A::foo}();
}
static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1* x) → dynamic
return [@vm.direct-call.metadata=DeepCaller1.barL1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::DeepCaller1::barL1}();
return [@vm.direct-call.metadata=#lib::DeepCaller1.barL1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::DeepCaller1::barL1}();
static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2* x) → dynamic
return [@vm.direct-call.metadata=DeepCaller2.barL1] [@vm.inferred-type.metadata=! (skip check)] x.{self::DeepCaller2::barL1}(new self::D::•());
return [@vm.direct-call.metadata=#lib::DeepCaller2.barL1] [@vm.inferred-type.metadata=! (skip check)] x.{self::DeepCaller2::barL1}(new self::D::•());
static method createC() → dynamic {
new self::C::•();
}

View file

@ -25,15 +25,15 @@ class Intermediate extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method bar([@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=B.foo??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] aa.{self::A::foo}();
return [@vm.direct-call.metadata=#lib::B.foo??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] aa.{self::A::foo}();
}
[@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
static method use1([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, [@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=Intermediate.bar] [@vm.inferred-type.metadata=#lib::T1 (skip check)] i.{self::Intermediate::bar}(aa);
return [@vm.direct-call.metadata=#lib::Intermediate.bar] [@vm.inferred-type.metadata=#lib::T1 (skip check)] i.{self::Intermediate::bar}(aa);
static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, [@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=Intermediate.bar] [@vm.inferred-type.metadata=#lib::T1 (skip check)] i.{self::Intermediate::bar}(aa);
return [@vm.direct-call.metadata=#lib::Intermediate.bar] [@vm.inferred-type.metadata=#lib::T1 (skip check)] i.{self::Intermediate::bar}(aa);
static method getDynamic() → dynamic
return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Function*)] self::unknown.call();
return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
static method allocateB() → dynamic {
new self::B::•();
}

View file

@ -53,13 +53,13 @@ class Intermediate extends core::Object {
}
[@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
static method use1([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
return [@vm.direct-call.metadata=Intermediate.bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
return [@vm.direct-call.metadata=#lib::Intermediate.bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
return [@vm.direct-call.metadata=Intermediate.bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
return [@vm.direct-call.metadata=#lib::Intermediate.bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
static method use3([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
return [@vm.direct-call.metadata=Intermediate.bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
return [@vm.direct-call.metadata=#lib::Intermediate.bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
static method getDynamic() → dynamic
return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Function*)] self::unknown.call();
return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
static method allocateB() → dynamic {
new self::B::•();
}

View file

@ -49,7 +49,7 @@ static method use_bar(dynamic x) → dynamic
static method use_bazz(dynamic x) → dynamic
return [@vm.inferred-type.metadata=#lib::T3] x.bazz();
static method getDynamic() → dynamic
return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Function*)] self::unknown.call();
return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
static method allocateA() → dynamic {
new self::A::•();
}

View file

@ -24,36 +24,36 @@ class DeepCaller1 extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method barL1([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=DeepCaller1.barL2] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL2}(aa);
return [@vm.direct-call.metadata=#lib::DeepCaller1.barL2] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL2}(aa);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method barL2([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=DeepCaller1.barL3] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL3}(aa);
return [@vm.direct-call.metadata=#lib::DeepCaller1.barL3] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL3}(aa);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] method barL3([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=DeepCaller1.barL4] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL4}(aa);
return [@vm.direct-call.metadata=#lib::DeepCaller1.barL4] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL4}(aa);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] method barL4([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=A.field1??] [@vm.inferred-type.metadata=#lib::T1] aa.{self::A::field1};
return [@vm.direct-call.metadata=#lib::A.field1??] [@vm.inferred-type.metadata=#lib::T1] aa.{self::A::field1};
}
class DeepCaller2 extends core::Object {
synthetic constructor •() → self::DeepCaller2*
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method barL1([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=DeepCaller2.barL2] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL2}(aa);
return [@vm.direct-call.metadata=#lib::DeepCaller2.barL2] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL2}(aa);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method barL2([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=DeepCaller2.barL3] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL3}(aa);
return [@vm.direct-call.metadata=#lib::DeepCaller2.barL3] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL3}(aa);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10] method barL3([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=DeepCaller2.barL4] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL4}(aa);
return [@vm.direct-call.metadata=#lib::DeepCaller2.barL4] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL4}(aa);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12] method barL4([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=A.field2??] [@vm.inferred-type.metadata=!] aa.{self::A::field2};
return [@vm.direct-call.metadata=#lib::A.field2??] [@vm.inferred-type.metadata=!] aa.{self::A::field2};
}
[@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1* x, [@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=DeepCaller1.barL1] [@vm.inferred-type.metadata=#lib::T1 (skip check)] x.{self::DeepCaller1::barL1}(aa);
return [@vm.direct-call.metadata=#lib::DeepCaller1.barL1] [@vm.inferred-type.metadata=#lib::T1 (skip check)] x.{self::DeepCaller1::barL1}(aa);
static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2* x, [@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
return [@vm.direct-call.metadata=DeepCaller2.barL1] [@vm.inferred-type.metadata=! (skip check)] x.{self::DeepCaller2::barL1}(aa);
return [@vm.direct-call.metadata=#lib::DeepCaller2.barL1] [@vm.inferred-type.metadata=! (skip check)] x.{self::DeepCaller2::barL1}(aa);
static method getDynamic() → dynamic
return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Function*)] self::unknown.call();
return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
static method setField2([@vm.inferred-type.metadata=#lib::A] self::A* aa, [@vm.inferred-type.metadata=#lib::T2] dynamic value) → void {
[@vm.direct-call.metadata=A.field2] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::field2} = value;
[@vm.direct-call.metadata=#lib::A.field2] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::field2} = value;
}
static method main(core::List<core::String*>* args) → dynamic {
new self::A::•();

View file

@ -28,8 +28,8 @@ class Q<T extends core::Object* = dynamic> extends core::Object {
: self::Q::result = result, super core::Object::•()
;
}
static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<InterfaceType(T1*)>] core::List<self::T1*>* list) → dynamic {
[@vm.direct-call.metadata=T3.run] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=T1.go??] [@vm.inferred-type.metadata=#lib::T3 (skip check)] [@vm.direct-call.metadata=Q.result??] [@vm.direct-call.metadata=ListIterable.first] [@vm.inferred-type.metadata=#lib::Q?] [@vm.direct-call.metadata=_ListBase&Object&ListMixin.map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<InterfaceType(T1*), ?> (skip check)] list.{core::Iterable::map}<self::Q<self::T1*>*>((self::T1* t1) → self::Q<self::T1*>* => new self::Q::•<self::T1*>(t1)).{core::Iterable::first}.{self::Q::result}.{self::T1::go}().{self::T3::run}();
static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::T1*>] core::List<self::T1*>* list) → dynamic {
[@vm.direct-call.metadata=#lib::T3.run] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::T1.go??] [@vm.inferred-type.metadata=#lib::T3 (skip check)] [@vm.direct-call.metadata=#lib::Q.result??] [@vm.direct-call.metadata=dart._internal::ListIterable.first] [@vm.inferred-type.metadata=#lib::Q?] [@vm.direct-call.metadata=dart.collection::_ListBase&Object&ListMixin.map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<#lib::T1*, ?> (skip check)] list.{core::Iterable::map}<self::Q<self::T1*>*>((self::T1* t1) → self::Q<self::T1*>* => new self::Q::•<self::T1*>(t1)).{core::Iterable::first}.{self::Q::result}.{self::T1::go}().{self::T3::run}();
}
static method foo2NewValue() → self::Q<dynamic>*
return new self::Q::•<self::T2*>(new self::T2::•());

View file

@ -23,18 +23,18 @@ class Point extends core::Object /*hasConstConstructor*/ {
: self::Point::x = x, super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method newPoint1() → self::Point*
return new self::Point::•([@vm.direct-call.metadata=Point.x] [@vm.inferred-type.metadata=!] this.{self::Point::x});
return new self::Point::•([@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!] this.{self::Point::x});
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method newPoint2() → self::Point*
return new self::Point::•([@vm.direct-call.metadata=Point.x] [@vm.inferred-type.metadata=!] this.{self::Point::x});
return new self::Point::•([@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!] this.{self::Point::x});
}
static method getX([@vm.inferred-type.metadata=#lib::Point] dynamic point) → dynamic {
[@vm.direct-call.metadata=Point.x] [@vm.inferred-type.metadata=!? (receiver not int)] point.x;
[@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!? (receiver not int)] point.x;
}
static method main() → dynamic {
self::Point* a = new self::Point::•(new self::T1::•());
core::print([@vm.direct-call.metadata=Point.x] [@vm.inferred-type.metadata=!] a.{self::Point::x});
core::print([@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!] a.{self::Point::x});
self::Point* c = new self::Point::•(new self::T2::•());
[@vm.direct-call.metadata=Point.x] [@vm.inferred-type.metadata=!] c.{self::Point::x}.{self::I::foo}();
self::getX([@vm.direct-call.metadata=Point.newPoint1] [@vm.inferred-type.metadata=#lib::Point (skip check)] a.{self::Point::newPoint1}());
self::getX([@vm.direct-call.metadata=Point.newPoint2] [@vm.inferred-type.metadata=#lib::Point (skip check)] a.{self::Point::newPoint2}());
[@vm.direct-call.metadata=#lib::Point.x] [@vm.inferred-type.metadata=!] c.{self::Point::x}.{self::I::foo}();
self::getX([@vm.direct-call.metadata=#lib::Point.newPoint1] [@vm.inferred-type.metadata=#lib::Point (skip check)] a.{self::Point::newPoint1}());
self::getX([@vm.direct-call.metadata=#lib::Point.newPoint2] [@vm.inferred-type.metadata=#lib::Point (skip check)] a.{self::Point::newPoint2}());
}

View file

@ -18,14 +18,14 @@ class TestNamedOrderSub extends self::TestNamedOrderBase {
[@vm.inferred-type.metadata=int] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] field core::int* x;
constructor •() → self::TestNamedOrderSub*
: self::TestNamedOrderSub::x = [@vm.inferred-type.metadata=int] self::dec(), dynamic #t5 = [@vm.inferred-type.metadata=int] self::inc(), dynamic #t6 = [@vm.inferred-type.metadata=int] self::inc(), dynamic #t7 = [@vm.inferred-type.metadata=int] self::inc(), dynamic #t8 = [@vm.inferred-type.metadata=int] self::dec(), super self::TestNamedOrderBase::•(#t5, #t8, #t7, #t6) {
exp::Expect::equals([@vm.direct-call.metadata=TestNamedOrderSub.x] [@vm.inferred-type.metadata=int] this.{self::TestNamedOrderSub::x}, 0);
exp::Expect::equals([@vm.direct-call.metadata=#lib::TestNamedOrderSub.x] [@vm.inferred-type.metadata=int] this.{self::TestNamedOrderSub::x}, 0);
}
}
[@vm.inferred-type.metadata=int?]static field core::int* global = 0;
[@vm.unboxing-info.metadata=()->i]static method inc() → core::int*
return self::global = [@vm.direct-call.metadata=_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] [@vm.inferred-type.metadata=int?] self::global.{core::num::+}(1);
return self::global = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+??] [@vm.inferred-type.metadata=int (skip check)] [@vm.inferred-type.metadata=int?] self::global.{core::num::+}(1);
[@vm.unboxing-info.metadata=()->i]static method dec() → core::int*
return self::global = [@vm.inferred-type.metadata=int] math::max<core::int*>(0, self::global = [@vm.direct-call.metadata=_IntegerImplementation.-??] [@vm.inferred-type.metadata=int (skip check)] [@vm.inferred-type.metadata=int?] self::global.{core::num::-}(1));
return self::global = [@vm.inferred-type.metadata=int] math::max<core::int*>(0, self::global = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.-??] [@vm.inferred-type.metadata=int (skip check)] [@vm.inferred-type.metadata=int?] self::global.{core::num::-}(1));
[@vm.unboxing-info.metadata=(i)->b]static method testNamedOrder([@vm.inferred-type.metadata=int] core::int* w, [@vm.inferred-type.metadata=int] core::int* x, [@vm.inferred-type.metadata=int] core::int* y, [@vm.inferred-type.metadata=int] core::int* z) → void {
exp::Expect::equals(w, 1);
exp::Expect::equals(z, 2);

View file

@ -49,11 +49,11 @@ class B extends self::A {
return new self::T1::•();
}
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3] no-such-method-forwarder get bar() → dynamic
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Symbol*), DynamicType(dynamic)>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] no-such-method-forwarder method foo() → dynamic
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Symbol*), DynamicType(dynamic)>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic a5 = #C1]) → dynamic
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Symbol*), DynamicType(dynamic)>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B.noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
}
abstract class C extends core::Object {
synthetic constructor •() → self::C*
@ -68,11 +68,11 @@ class D extends self::C implements self::A {
: super self::C::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3] no-such-method-forwarder get bar() → dynamic
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Symbol*), DynamicType(dynamic)>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] no-such-method-forwarder method foo() → dynamic
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Symbol*), DynamicType(dynamic)>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:4,getterSelectorId:5] no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi (value: 2)] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi (value: 3)] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi (value: 4)] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic a5 = #C1]) → dynamic
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Symbol*), DynamicType(dynamic)>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C.noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
}
class E extends core::Object implements self::A {
synthetic constructor •() → self::E*
@ -82,7 +82,7 @@ class E extends core::Object implements self::A {
return new self::T4::•();
}
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:3] no-such-method-forwarder get bar() → dynamic
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=E.noSuchMethod] [@vm.inferred-type.metadata=#lib::T4 (skip check)] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<InterfaceType(Symbol*), DynamicType(dynamic)>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::E.noSuchMethod] [@vm.inferred-type.metadata=#lib::T4 (skip check)] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
}
class F extends core::Object {
synthetic constructor •() → self::F*
@ -114,14 +114,14 @@ class H extends core::Object {
[@vm.inferred-type.metadata=#lib::D?]static field self::A* dd = new self::D::•();
[@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
static method getDynamic() → dynamic
return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Function*)] self::unknown.call();
return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
static method main(core::List<core::String*>* args) → dynamic {
core::print([@vm.direct-call.metadata=B.foo??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::foo}());
core::print([@vm.direct-call.metadata=B.bar??] [@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bar});
core::print([@vm.direct-call.metadata=B.bazz??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bazz}(1, 2, 3, 4));
core::print([@vm.direct-call.metadata=D.foo??] [@vm.inferred-type.metadata=#lib::T2 (skip check)] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::foo}());
core::print([@vm.direct-call.metadata=D.bar??] [@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::bar});
core::print([@vm.direct-call.metadata=D.bazz??] [@vm.inferred-type.metadata=#lib::T2 (skip check)] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::bazz}(1, 2, 3, 4));
core::print([@vm.direct-call.metadata=#lib::B.foo??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::foo}());
core::print([@vm.direct-call.metadata=#lib::B.bar??] [@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bar});
core::print([@vm.direct-call.metadata=#lib::B.bazz??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bazz}(1, 2, 3, 4));
core::print([@vm.direct-call.metadata=#lib::D.foo??] [@vm.inferred-type.metadata=#lib::T2 (skip check)] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::foo}());
core::print([@vm.direct-call.metadata=#lib::D.bar??] [@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::bar});
core::print([@vm.direct-call.metadata=#lib::D.bazz??] [@vm.inferred-type.metadata=#lib::T2 (skip check)] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::bazz}(1, 2, 3, 4));
new self::E::•();
self::A* xx = self::getDynamic() as{TypeError,ForDynamic} self::A*;
core::print([@vm.inferred-type.metadata=!] xx.{self::A::bar});
@ -131,6 +131,6 @@ static method main(core::List<core::String*>* args) → dynamic {
dynamic gg = new self::G::•();
core::print([@vm.inferred-type.metadata=#lib::T5 (receiver not int)] gg.noSuchMethod(null, null));
dynamic hh = new self::H::•();
core::print([@vm.direct-call.metadata=H.foo] [@vm.inferred-type.metadata=#lib::T6 (receiver not int)] hh.foo(right: 2, left: 1));
core::print([@vm.direct-call.metadata=#lib::H.foo] [@vm.inferred-type.metadata=#lib::T6 (receiver not int)] hh.foo(right: 2, left: 1));
core::print([@vm.inferred-type.metadata=#lib::T7 (receiver not int)] hh.foo(left: 1, top: 2));
}

View file

@ -13,17 +13,17 @@ class A extends core::Object {
}
[@vm.inferred-type.metadata=#lib::A?]static field self::A staticField = let core::String #t1 = "hi" in let core::String #t2 = "bye" in new self::A::•(#t1, #t2);
static method testNonNullable([@vm.inferred-type.metadata=#lib::A?] self::A a) → dynamic
return _in::unsafeCast<core::String>([@vm.direct-call.metadata=A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable});
return _in::unsafeCast<core::String>([@vm.direct-call.metadata=#lib::A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable});
static method testNullable([@vm.inferred-type.metadata=#lib::A?] self::A a) → dynamic
return [@vm.direct-call.metadata=A.nullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString?] a.{self::A::nullable}!;
return [@vm.direct-call.metadata=#lib::A.nullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString?] a.{self::A::nullable}!;
static method testAlwaysNull([@vm.inferred-type.metadata=#lib::A?] self::A a) → dynamic
return [@vm.direct-call.metadata=A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull}!;
return [@vm.direct-call.metadata=#lib::A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull}!;
static method main() → void {
final core::List<self::A> list = <self::A>[let core::String #t3 = "foo" in let core::Null? #t4 = null in let core::Null? #t5 = null in new self::A::•(#t3, #t4, alwaysNull: #t5), self::staticField];
{
core::Iterator<self::A> :sync-for-iterator = [@vm.direct-call.metadata=_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<InterfaceType(A)>] list.{core::Iterable::iterator};
for (; [@vm.direct-call.metadata=ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(); ) {
self::A a = [@vm.direct-call.metadata=ListIterator.current] [@vm.inferred-type.metadata=#lib::A?] :sync-for-iterator.{core::Iterator::current};
core::Iterator<self::A> :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::A>] list.{core::Iterable::iterator};
for (; [@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(); ) {
self::A a = [@vm.direct-call.metadata=dart._internal::ListIterator.current] [@vm.inferred-type.metadata=#lib::A?] :sync-for-iterator.{core::Iterator::current};
{
self::testNonNullable(a);
self::testNullable(a);

View file

@ -13,49 +13,49 @@ class A extends core::Object {
}
[@vm.inferred-type.metadata=#lib::A?]static field self::A* staticField = let core::String* #t1 = "hi" in let core::String* #t2 = "bye" in new self::A::•(#t1, #t2);
static method testNonNullableIf1([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic {
if(let dynamic #t3 = [@vm.direct-call.metadata=A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable} in false) {
if(let dynamic #t3 = [@vm.direct-call.metadata=#lib::A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable} in false) {
core::print("null");
}
}
static method testNullableIf1([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic {
if([@vm.direct-call.metadata=A.nullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString?] a.{self::A::nullable}.{core::String::==}(null)) {
if([@vm.direct-call.metadata=#lib::A.nullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString?] a.{self::A::nullable}.{core::String::==}(null)) {
core::print("null");
}
}
static method testAlwaysNullIf1([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic {
if(let dynamic #t4 = [@vm.direct-call.metadata=A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull} in true) {
if(let dynamic #t4 = [@vm.direct-call.metadata=#lib::A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull} in true) {
core::print("null");
}
}
static method testNonNullableIf2([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic {
if(!(let dynamic #t5 = [@vm.direct-call.metadata=A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable} in false) && _in::unsafeCast<core::bool*>([@vm.inferred-type.metadata=dart.core::bool] self::someCondition())) {
if(!(let dynamic #t5 = [@vm.direct-call.metadata=#lib::A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable} in false) && _in::unsafeCast<core::bool*>([@vm.inferred-type.metadata=dart.core::bool] self::someCondition())) {
core::print("not null");
}
}
static method testNullableIf2([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic {
if(![@vm.direct-call.metadata=A.nullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString?] a.{self::A::nullable}.{core::String::==}(null) && _in::unsafeCast<core::bool*>([@vm.inferred-type.metadata=dart.core::bool] self::someCondition())) {
if(![@vm.direct-call.metadata=#lib::A.nullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString?] a.{self::A::nullable}.{core::String::==}(null) && _in::unsafeCast<core::bool*>([@vm.inferred-type.metadata=dart.core::bool] self::someCondition())) {
core::print("not null");
}
}
static method testAlwaysNullIf2([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic {
if(!(let dynamic #t6 = [@vm.direct-call.metadata=A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull} in true) && _in::unsafeCast<core::bool*>([@vm.inferred-type.metadata=dart.core::bool] self::someCondition())) {
if(!(let dynamic #t6 = [@vm.direct-call.metadata=#lib::A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull} in true) && _in::unsafeCast<core::bool*>([@vm.inferred-type.metadata=dart.core::bool] self::someCondition())) {
core::print("not null");
}
}
static method testNonNullableCondExpr([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic
return !(let dynamic #t7 = [@vm.direct-call.metadata=A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable} in false) ?{core::String*} "not null" : "null";
return !(let dynamic #t7 = [@vm.direct-call.metadata=#lib::A.nonNullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString] a.{self::A::nonNullable} in false) ?{core::String*} "not null" : "null";
static method testNullableCondExpr([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic
return ![@vm.direct-call.metadata=A.nullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString?] a.{self::A::nullable}.{core::String::==}(null) ?{core::String*} "not null" : "null";
return ![@vm.direct-call.metadata=#lib::A.nullable??] [@vm.inferred-type.metadata=dart.core::_OneByteString?] a.{self::A::nullable}.{core::String::==}(null) ?{core::String*} "not null" : "null";
static method testAlwaysNullCondExpr([@vm.inferred-type.metadata=#lib::A?] self::A* a) → dynamic
return !(let dynamic #t8 = [@vm.direct-call.metadata=A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull} in true) ?{core::String*} "not null" : "null";
return !(let dynamic #t8 = [@vm.direct-call.metadata=#lib::A.alwaysNull??] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] a.{self::A::alwaysNull} in true) ?{core::String*} "not null" : "null";
static method someCondition() → dynamic
return [@vm.direct-call.metadata=_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1);
return [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1);
static method main() → void {
final core::List<self::A*>* list = <self::A*>[let core::String* #t9 = "foo" in let core::Null? #t10 = null in let core::Null? #t11 = null in new self::A::•(#t9, #t10, alwaysNull: #t11), self::staticField];
{
core::Iterator<self::A*>* :sync-for-iterator = [@vm.direct-call.metadata=_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<InterfaceType(A*)>] list.{core::Iterable::iterator};
for (; [@vm.direct-call.metadata=ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(); ) {
self::A* a = [@vm.direct-call.metadata=ListIterator.current] [@vm.inferred-type.metadata=#lib::A?] :sync-for-iterator.{core::Iterator::current};
core::Iterator<self::A*>* :sync-for-iterator = [@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<#lib::A*>] list.{core::Iterable::iterator};
for (; [@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] :sync-for-iterator.{core::Iterator::moveNext}(); ) {
self::A* a = [@vm.direct-call.metadata=dart._internal::ListIterator.current] [@vm.inferred-type.metadata=#lib::A?] :sync-for-iterator.{core::Iterator::current};
{
self::testNonNullableIf1(a);
self::testNullableIf1(a);

View file

@ -19,7 +19,7 @@ class A extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method method1(self::T0* t0) → void {
[@vm.direct-call.metadata=T2.foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
[@vm.direct-call.metadata=#lib::T2.foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
}
}
abstract class B extends core::Object {
@ -30,7 +30,7 @@ class C extends core::Object implements self::B {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method method2(covariant self::T0* t0) → void {
[@vm.direct-call.metadata=T2.foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
[@vm.direct-call.metadata=#lib::T2.foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
}
}
class D extends core::Object {
@ -38,26 +38,26 @@ class D extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method method3(self::T0* t0) → void {
[@vm.direct-call.metadata=T2.foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
[@vm.direct-call.metadata=#lib::T2.foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
}
}
[@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
static method func1([@vm.inferred-type.metadata=#lib::T2?] self::T0* t0) → void {
[@vm.direct-call.metadata=T2.foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
[@vm.direct-call.metadata=#lib::T2.foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
}
static method func2(self::T0* t0) → void {
[@vm.direct-call.metadata=T2.foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
[@vm.direct-call.metadata=#lib::T2.foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
}
static method getDynamic() → dynamic
return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Function*)] self::unknown.call();
return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
static method use(dynamic x) → dynamic
return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Function*)] self::unknown.call(x);
return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call(x);
static method main(core::List<core::String*>* args) → dynamic {
self::func1(self::getDynamic() as{TypeError,ForDynamic} self::T0*);
self::use(#C1);
self::use(new self::A::•().{self::A::method1});
self::B* bb = self::getDynamic() as{TypeError,ForDynamic} self::B*;
[@vm.direct-call.metadata=C.method2??] [@vm.inferred-type.metadata=!? (skip check)] bb.{self::B::method2}(self::getDynamic());
[@vm.direct-call.metadata=#lib::C.method2??] [@vm.inferred-type.metadata=!? (skip check)] bb.{self::B::method2}(self::getDynamic());
self::getDynamic().method3(self::getDynamic());
new self::T2::•();
new self::A::•();

View file

@ -3,29 +3,29 @@ import self as self;
import "dart:core" as core;
class A extends core::Object {
[@vm.inferred-type.metadata=dart.core::_GrowableList<DynamicType(dynamic)>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] final field core::List<dynamic>* afield;
constructor •([@vm.inferred-type.metadata=dart.core::_GrowableList<DynamicType(dynamic)>] core::List<dynamic>* afield) → self::A*
[@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] final field core::List<dynamic>* afield;
constructor •([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::List<dynamic>* afield) → self::A*
: self::A::afield = afield, super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method toString() → core::String*
return [@vm.direct-call.metadata=_GrowableList.toString] [@vm.inferred-type.metadata=!? (skip check) (receiver not int)] [@vm.direct-call.metadata=A.afield] [@vm.inferred-type.metadata=dart.core::_GrowableList<DynamicType(dynamic)>] this.{self::A::afield}.{core::Object::toString}();
return [@vm.direct-call.metadata=dart.core::_GrowableList.toString] [@vm.inferred-type.metadata=!? (skip check) (receiver not int)] [@vm.direct-call.metadata=#lib::A.afield] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] this.{self::A::afield}.{core::Object::toString}();
}
class B extends core::Object {
synthetic constructor •() → self::B*
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method _foo([@vm.inferred-type.metadata=dart._internal::ListIterator<InterfaceType(int*)>] core::Iterator<core::int*>* iter) → core::List<dynamic>* {
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method _foo([@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>] core::Iterator<core::int*>* iter) → core::List<dynamic>* {
core::List<dynamic>* result = <dynamic>[];
while ([@vm.direct-call.metadata=ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] iter.{core::Iterator::moveNext}()) {
if([@vm.direct-call.metadata=_IntegerImplementation.<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=ListIterator.current] [@vm.inferred-type.metadata=int?] iter.{core::Iterator::current}.{core::num::<}(0)) {
while ([@vm.direct-call.metadata=dart._internal::ListIterator.moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] iter.{core::Iterator::moveNext}()) {
if([@vm.direct-call.metadata=dart.core::_IntegerImplementation.<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart._internal::ListIterator.current] [@vm.inferred-type.metadata=int?] iter.{core::Iterator::current}.{core::num::<}(0)) {
return result;
}
[@vm.call-site-attributes.metadata=receiverType:InterfaceType(List<dynamic>*)] [@vm.direct-call.metadata=_GrowableList.add] [@vm.inferred-type.metadata=!? (skip check)] result.{core::List::add}(new self::A::•([@vm.direct-call.metadata=B._foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<DynamicType(dynamic)> (skip check)] this.{self::B::_foo}(iter)));
[@vm.call-site-attributes.metadata=receiverType:dart.core::List<dynamic>*] [@vm.direct-call.metadata=dart.core::_GrowableList.add] [@vm.inferred-type.metadata=!? (skip check)] result.{core::List::add}(new self::A::•([@vm.direct-call.metadata=#lib::B._foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] this.{self::B::_foo}(iter)));
}
return result;
}
}
static method main() → void {
core::List<dynamic>* list = [@vm.direct-call.metadata=B._foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<DynamicType(dynamic)> (skip check)] new self::B::•().{self::B::_foo}([@vm.direct-call.metadata=_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<InterfaceType(int*)>]<core::int*>[1, 2, 3].{core::Iterable::iterator});
core::List<dynamic>* list = [@vm.direct-call.metadata=#lib::B._foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] new self::B::•().{self::B::_foo}([@vm.direct-call.metadata=dart.core::_GrowableList.iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>]<core::int*>[1, 2, 3].{core::Iterable::iterator});
core::print(list);
}

View file

@ -2,7 +2,7 @@ library #lib;
import self as self;
import "dart:core" as core;
[@vm.unboxing-info.metadata=(b)->i]static method foo([@vm.inferred-type.metadata=dart.core::_GrowableList<InterfaceType(int*)>] core::List<core::int*>* x) → dynamic
return [@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=_GrowableList.[]] [@vm.inferred-type.metadata=int? (skip check)] x.{core::List::[]}(0));
[@vm.unboxing-info.metadata=(b)->i]static method foo([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::List<core::int*>* x) → dynamic
return [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=int? (skip check)] x.{core::List::[]}(0));
static method main() → dynamic
return [@vm.inferred-type.metadata=dart.core::Null? (value: null)] core::print([@vm.inferred-type.metadata=int] self::foo(<core::int*>[1]));

View file

@ -18,10 +18,10 @@ abstract class _SplayTree<Node extends self::_SplayTreeNode<self::_SplayTree::No
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method add(generic-covariant-impl self::_SplayTree::Node n) → dynamic {
self::_SplayTree::Node? root = [@vm.direct-call.metadata=SplayTreeMap._root] [@vm.inferred-type.metadata=#lib::_SplayTreeMapNode] this.{self::_SplayTree::_root};
self::_SplayTree::Node? root = [@vm.direct-call.metadata=#lib::SplayTreeMap._root] [@vm.inferred-type.metadata=#lib::_SplayTreeMapNode] this.{self::_SplayTree::_root};
if(false)
return;
core::print([@vm.direct-call.metadata=_SplayTreeNode.left] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] root{self::_SplayTree::Node}.{self::_SplayTreeNode::left});
core::print([@vm.direct-call.metadata=#lib::_SplayTreeNode.left] [@vm.inferred-type.metadata=dart.core::Null? (value: null)] root{self::_SplayTree::Node}.{self::_SplayTreeNode::left});
}
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5] abstract get /*isNullableByDefault*/ _root() → self::_SplayTree::Node?;
}
@ -32,5 +32,5 @@ class SplayTreeMap<V extends core::Object? = dynamic> extends self::_SplayTree<s
;
}
static method main() → void {
[@vm.call-site-attributes.metadata=receiverType:InterfaceType(SplayTreeMap<dynamic>)] [@vm.direct-call.metadata=_SplayTree.add] new self::SplayTreeMap::•<dynamic>().{self::_SplayTree::add}(new self::_SplayTreeMapNode::•<dynamic>());
[@vm.call-site-attributes.metadata=receiverType:#lib::SplayTreeMap<dynamic>] [@vm.direct-call.metadata=#lib::_SplayTree.add] new self::SplayTreeMap::•<dynamic>().{self::_SplayTree::add}(new self::_SplayTreeMapNode::•<dynamic>());
}

View file

@ -20,7 +20,7 @@ class A1 extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = #C1]) → void {
[@vm.direct-call.metadata=A1.foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A1::foo} = _in::unsafeCast<self::T1*>(a5);
[@vm.direct-call.metadata=#lib::A1.foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A1::foo} = _in::unsafeCast<self::T1*>(a5);
}
}
class B1 extends core::Object {
@ -43,7 +43,7 @@ class A2 extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = #C1]) → void {
[@vm.direct-call.metadata=A2.foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A2::foo} = a6;
[@vm.direct-call.metadata=#lib::A2.foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A2::foo} = a6;
}
}
abstract class B2Base extends core::Object {
@ -52,14 +52,14 @@ abstract class B2Base extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:11] get aa2() → dynamic
return [@vm.direct-call.metadata=B2Base._aa] [@vm.inferred-type.metadata=#lib::A2] this.{self::B2Base::_aa};
return [@vm.direct-call.metadata=#lib::B2Base._aa] [@vm.inferred-type.metadata=#lib::A2] this.{self::B2Base::_aa};
}
class B2 extends self::B2Base {
synthetic constructor •() → self::B2*
: super self::B2Base::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:14,getterSelectorId:15] method doSuperCall() → void {
[@vm.call-site-attributes.metadata=receiverType:DynamicType(dynamic)] [@vm.direct-call.metadata=A2.call] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.inferred-type.metadata=#lib::A2] super.{self::B2Base::aa2}.call(1, 2, 3, 4, 5, new self::T2::•());
[@vm.call-site-attributes.metadata=receiverType:dynamic] [@vm.direct-call.metadata=#lib::A2.call] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.inferred-type.metadata=#lib::A2] super.{self::B2Base::aa2}.call(1, 2, 3, 4, 5, new self::T2::•());
}
}
class T3 extends core::Object {
@ -76,7 +76,7 @@ class A3 extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = #C1]) → void {
[@vm.direct-call.metadata=A3.foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A3::foo} = a7;
[@vm.direct-call.metadata=#lib::A3.foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A3::foo} = a7;
}
}
class B3 extends core::Object {
@ -99,7 +99,7 @@ class A4 extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a7 = #C1, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = #C1]) → void {
[@vm.direct-call.metadata=A4.foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A4::foo} = a8;
[@vm.direct-call.metadata=#lib::A4.foo] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A4::foo} = a8;
}
}
class B4 extends core::Object {
@ -108,7 +108,7 @@ class B4 extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false,getterSelectorId:22] get aa4() → dynamic
return [@vm.direct-call.metadata=B4._aa] [@vm.inferred-type.metadata=#lib::A4] this.{self::B4::_aa};
return [@vm.direct-call.metadata=#lib::B4._aa] [@vm.inferred-type.metadata=#lib::A4] this.{self::B4::_aa};
}
[@vm.inferred-type.metadata=dart.core::bool?]static field core::bool* ok;
[@vm.inferred-type.metadata=#lib::B3?]static field dynamic bb3 = new self::B3::•();
@ -117,32 +117,32 @@ class B4 extends core::Object {
[@vm.inferred-type.metadata=dart.core::_Closure?]static field core::Function* unknown4 = () → dynamic => self::bb4;
static method test1() → void {
self::B1* bb = new self::B1::•();
let final self::B1* #t1 = bb in let final core::int* #t2 = 1 in let final core::int* #t3 = 2 in let final core::int* #t4 = 3 in let final core::int* #t5 = 4 in let final self::T1* #t6 = new self::T1::•() in [@vm.call-site-attributes.metadata=receiverType:InterfaceType(A1*)] [@vm.direct-call.metadata=A1.call] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=B1.aa1] [@vm.inferred-type.metadata=#lib::A1] #t1.{self::B1::aa1}.{self::A1::call}(#t2, #t3, #t4, #t5, #t6);
let final self::B1* #t1 = bb in let final core::int* #t2 = 1 in let final core::int* #t3 = 2 in let final core::int* #t4 = 3 in let final core::int* #t5 = 4 in let final self::T1* #t6 = new self::T1::•() in [@vm.call-site-attributes.metadata=receiverType:#lib::A1*] [@vm.direct-call.metadata=#lib::A1.call] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::B1.aa1] [@vm.inferred-type.metadata=#lib::A1] #t1.{self::B1::aa1}.{self::A1::call}(#t2, #t3, #t4, #t5, #t6);
self::ok = false;
[@vm.direct-call.metadata=T1.doTest1??] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=A1.foo] [@vm.inferred-type.metadata=#lib::T1?] [@vm.direct-call.metadata=B1.aa1] [@vm.inferred-type.metadata=#lib::A1] bb.{self::B1::aa1}.{self::A1::foo}.{self::T1::doTest1}();
[@vm.direct-call.metadata=#lib::T1.doTest1??] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::A1.foo] [@vm.inferred-type.metadata=#lib::T1?] [@vm.direct-call.metadata=#lib::B1.aa1] [@vm.inferred-type.metadata=#lib::A1] bb.{self::B1::aa1}.{self::A1::foo}.{self::T1::doTest1}();
exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
}
static method test2() → void {
self::B2* bb = new self::B2::•();
[@vm.direct-call.metadata=B2.doSuperCall] [@vm.inferred-type.metadata=!? (skip check)] bb.{self::B2::doSuperCall}();
[@vm.direct-call.metadata=#lib::B2.doSuperCall] [@vm.inferred-type.metadata=!? (skip check)] bb.{self::B2::doSuperCall}();
self::ok = false;
[@vm.direct-call.metadata=T2.doTest2??] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.direct-call.metadata=A2.foo] [@vm.inferred-type.metadata=#lib::T2? (receiver not int)] [@vm.direct-call.metadata=B2Base.aa2] [@vm.inferred-type.metadata=#lib::A2] bb.{self::B2Base::aa2}.foo.doTest2();
[@vm.direct-call.metadata=#lib::T2.doTest2??] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.direct-call.metadata=#lib::A2.foo] [@vm.inferred-type.metadata=#lib::T2? (receiver not int)] [@vm.direct-call.metadata=#lib::B2Base.aa2] [@vm.inferred-type.metadata=#lib::A2] bb.{self::B2Base::aa2}.foo.doTest2();
exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
}
static method getDynamic3() → dynamic
return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Function*)] self::unknown3.call();
return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown3.call();
static method test3() → void {
self::getDynamic3().aa3(1, 2, 3, 4, 5, 6, new self::T3::•());
self::ok = false;
[@vm.direct-call.metadata=T3.doTest3??] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.direct-call.metadata=A3.foo] [@vm.inferred-type.metadata=#lib::T3? (receiver not int)] [@vm.direct-call.metadata=B3.aa3??] [@vm.inferred-type.metadata=#lib::A3 (receiver not int)] [@vm.inferred-type.metadata=#lib::B3?] self::bb3.aa3.foo.doTest3();
[@vm.direct-call.metadata=#lib::T3.doTest3??] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.direct-call.metadata=#lib::A3.foo] [@vm.inferred-type.metadata=#lib::T3? (receiver not int)] [@vm.direct-call.metadata=#lib::B3.aa3??] [@vm.inferred-type.metadata=#lib::A3 (receiver not int)] [@vm.inferred-type.metadata=#lib::B3?] self::bb3.aa3.foo.doTest3();
exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
}
static method getDynamic4() → dynamic
return [@vm.call-site-attributes.metadata=receiverType:InterfaceType(Function*)] self::unknown4.call();
return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown4.call();
static method test4() → void {
self::getDynamic4().aa4(1, 2, 3, 4, 5, 6, 7, new self::T4::•());
self::ok = false;
[@vm.direct-call.metadata=T4.doTest4??] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.direct-call.metadata=A4.foo] [@vm.inferred-type.metadata=#lib::T4? (receiver not int)] [@vm.inferred-type.metadata=#lib::A4] self::getDynamic4().aa4.foo.doTest4();
[@vm.direct-call.metadata=#lib::T4.doTest4??] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.direct-call.metadata=#lib::A4.foo] [@vm.inferred-type.metadata=#lib::T4? (receiver not int)] [@vm.inferred-type.metadata=#lib::A4] self::getDynamic4().aa4.foo.doTest4();
exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
}
static method main() → void {

View file

@ -12,18 +12,18 @@ class B extends self::A {
: super self::A::•()
;
[@vm.procedure-attributes.metadata=hasThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method foo() → core::int*
return [@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=! (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=B.foo] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError,ForDynamic} core::num) as{TypeError} core::int*;
return [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=! (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B.foo] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError,ForDynamic} core::num) as{TypeError} core::int*;
}
class TearOffDynamicMethod extends core::Object {
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] field dynamic bazz;
constructor •(dynamic arg) → self::TearOffDynamicMethod*
: self::TearOffDynamicMethod::bazz = arg.foo, super core::Object::•() {
[@vm.call-site-attributes.metadata=receiverType:DynamicType(dynamic)] [@vm.direct-call.metadata=TearOffDynamicMethod.bazz] this.{self::TearOffDynamicMethod::bazz}.call();
[@vm.call-site-attributes.metadata=receiverType:dynamic] [@vm.direct-call.metadata=#lib::TearOffDynamicMethod.bazz] this.{self::TearOffDynamicMethod::bazz}.call();
}
}
static method knownResult() → dynamic
return new self::B::•();
static method main(core::List<core::String*>* args) → dynamic {
core::Function* closure = () → self::B* => new self::B::•();
new self::TearOffDynamicMethod::•([@vm.call-site-attributes.metadata=receiverType:InterfaceType(Function*)] closure.call());
new self::TearOffDynamicMethod::•([@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] closure.call());
}

View file

@ -14,7 +14,7 @@ class B extends self::A {
: super self::A::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method foo() → core::int*
return _in::unsafeCast<core::int*>([@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=B.bar] [@vm.inferred-type.metadata=dart.core::_Smi (value: 3) (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar())));
return _in::unsafeCast<core::int*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B.bar] [@vm.inferred-type.metadata=dart.core::_Smi (value: 3) (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar())));
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method bar() → core::int*
return 3;
}
@ -27,5 +27,5 @@ class TearOffInterfaceMethod extends core::Object {
static method knownResult() → dynamic
return new self::B::•();
static method main(core::List<core::String*>* args) → dynamic {
[@vm.call-site-attributes.metadata=receiverType:DynamicType(dynamic)] [@vm.direct-call.metadata=TearOffInterfaceMethod.bazz] new self::TearOffInterfaceMethod::•(new self::B::•()).{self::TearOffInterfaceMethod::bazz}.call();
[@vm.call-site-attributes.metadata=receiverType:dynamic] [@vm.direct-call.metadata=#lib::TearOffInterfaceMethod.bazz] new self::TearOffInterfaceMethod::•(new self::B::•()).{self::TearOffInterfaceMethod::bazz}.call();
}

View file

@ -14,28 +14,28 @@ class B extends self::A {
: super self::A::•()
;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method foo() → core::int*
return _in::unsafeCast<core::int*>([@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=B.foo] [@vm.inferred-type.metadata=int? (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
return _in::unsafeCast<core::int*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B.foo] [@vm.inferred-type.metadata=int? (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
}
abstract class Base extends core::Object {
synthetic constructor •() → self::Base*
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method foo() → core::int*
return _in::unsafeCast<core::int*>([@vm.direct-call.metadata=_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] 3.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=B.foo] [@vm.inferred-type.metadata=int? (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
return _in::unsafeCast<core::int*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] 3.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B.foo] [@vm.inferred-type.metadata=int? (receiver not int)] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method doCall(dynamic x) → core::int*
return [@vm.call-site-attributes.metadata=receiverType:DynamicType(dynamic)] x.call() as{TypeError,ForDynamic} core::int*;
return [@vm.call-site-attributes.metadata=receiverType:dynamic] x.call() as{TypeError,ForDynamic} core::int*;
}
class TearOffSuperMethod extends self::Base {
synthetic constructor •() → self::TearOffSuperMethod*
: super self::Base::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method bar() → core::int*
return [@vm.direct-call.metadata=Base.doCall] [@vm.inferred-type.metadata=int? (skip check)] this.{self::Base::doCall}(super.{self::Base::foo});
return [@vm.direct-call.metadata=#lib::Base.doCall] [@vm.inferred-type.metadata=int? (skip check)] this.{self::Base::doCall}(super.{self::Base::foo});
}
[@vm.inferred-type.metadata=#lib::B?]static field self::A* aa = new self::B::•();
static method knownResult() → dynamic
return new self::B::•();
static method main(core::List<core::String*>* args) → dynamic {
[@vm.direct-call.metadata=TearOffSuperMethod.bar] [@vm.inferred-type.metadata=!? (skip check)] new self::TearOffSuperMethod::•().{self::TearOffSuperMethod::bar}();
[@vm.direct-call.metadata=B.foo??] [@vm.inferred-type.metadata=!? (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::aa.{self::A::foo}();
[@vm.direct-call.metadata=#lib::TearOffSuperMethod.bar] [@vm.inferred-type.metadata=!? (skip check)] new self::TearOffSuperMethod::•().{self::TearOffSuperMethod::bar}();
[@vm.direct-call.metadata=#lib::B.foo??] [@vm.inferred-type.metadata=!? (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::aa.{self::A::foo}();
}

View file

@ -14,11 +14,11 @@ class B<T extends core::Object* = dynamic> extends self::A<self::B::T*> {
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method testT1([@vm.inferred-type.metadata=dart.core::_Smi (value: 42)] dynamic x) → dynamic
return _in::unsafeCast<self::B::T*>(x);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method testT2negative([@vm.inferred-type.metadata=#lib::A<InterfaceType(String*)>] dynamic x) → dynamic
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4] method testT2negative([@vm.inferred-type.metadata=#lib::A<dart.core::String*>] dynamic x) → dynamic
return x as self::B::T*;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method testAOfT1([@vm.inferred-type.metadata=#lib::A<InterfaceType(A<int*>*)>] dynamic x) → dynamic
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6] method testAOfT1([@vm.inferred-type.metadata=#lib::A<#lib::A<dart.core::int*>*>] dynamic x) → dynamic
return _in::unsafeCast<self::A<self::B::T*>*>(x);
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method testAOfT2negative([@vm.inferred-type.metadata=#lib::A<InterfaceType(A<num*>*)>] dynamic x) → dynamic
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8] method testAOfT2negative([@vm.inferred-type.metadata=#lib::A<#lib::A<dart.core::num*>*>] dynamic x) → dynamic
return x as self::A<self::B::T*>*;
}
[@vm.unboxing-info.metadata=(i)->i]static method testInt1([@vm.inferred-type.metadata=dart.core::_Smi (value: 42)] dynamic x) → dynamic
@ -29,15 +29,15 @@ static method testDynamic([@vm.inferred-type.metadata=dart.core::_OneByteString
return _in::unsafeCast<dynamic>(x);
static method testObject([@vm.inferred-type.metadata=dart.core::_OneByteString (value: bye)] dynamic x) → dynamic
return x;
static method testBOfInt([@vm.inferred-type.metadata=#lib::B<InterfaceType(int*)>] dynamic x) → dynamic
static method testBOfInt([@vm.inferred-type.metadata=#lib::B<dart.core::int*>] dynamic x) → dynamic
return _in::unsafeCast<self::B<core::int*>*>(x);
static method testAOfInt([@vm.inferred-type.metadata=#lib::B<InterfaceType(int*)>] dynamic x) → dynamic
static method testAOfInt([@vm.inferred-type.metadata=#lib::B<dart.core::int*>] dynamic x) → dynamic
return _in::unsafeCast<self::A<core::int*>*>(x);
static method testAOfNum([@vm.inferred-type.metadata=#lib::B<InterfaceType(int*)>] dynamic x) → dynamic
static method testAOfNum([@vm.inferred-type.metadata=#lib::B<dart.core::int*>] dynamic x) → dynamic
return _in::unsafeCast<self::A<core::num*>*>(x);
static method testAOfAOfB1([@vm.inferred-type.metadata=#lib::A<InterfaceType(A<B<dynamic>*>*)>] dynamic x) → dynamic
static method testAOfAOfB1([@vm.inferred-type.metadata=#lib::A<#lib::A<#lib::B<dynamic>*>*>] dynamic x) → dynamic
return _in::unsafeCast<self::A<self::A<self::B<dynamic>*>*>*>(x);
static method testAOfAOfB2negative([@vm.inferred-type.metadata=#lib::A<InterfaceType(A<A<dynamic>*>*)>] dynamic x) → dynamic
static method testAOfAOfB2negative([@vm.inferred-type.metadata=#lib::A<#lib::A<#lib::A<dynamic>*>*>] dynamic x) → dynamic
return x as self::A<self::A<self::B<dynamic>*>*>*;
static method main() → void {
self::testInt1(42);
@ -49,8 +49,8 @@ static method main() → void {
self::testAOfNum(new self::B::•<core::int*>());
self::testAOfAOfB1(new self::A::•<self::A<self::B<dynamic>*>*>());
self::testAOfAOfB2negative(new self::A::•<self::A<self::A<dynamic>*>*>());
[@vm.direct-call.metadata=B.testT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int*>().{self::B::testT1}(42);
[@vm.direct-call.metadata=B.testT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int*>*>().{self::B::testT2negative}(new self::A::•<core::String*>());
[@vm.direct-call.metadata=B.testAOfT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int*>*>().{self::B::testAOfT1}(new self::A::•<self::A<core::int*>*>());
[@vm.direct-call.metadata=B.testAOfT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int*>*>().{self::B::testAOfT2negative}(new self::A::•<self::A<core::num*>*>());
[@vm.direct-call.metadata=#lib::B.testT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int*>().{self::B::testT1}(42);
[@vm.direct-call.metadata=#lib::B.testT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int*>*>().{self::B::testT2negative}(new self::A::•<core::String*>());
[@vm.direct-call.metadata=#lib::B.testAOfT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int*>*>().{self::B::testAOfT1}(new self::A::•<self::A<core::int*>*>());
[@vm.direct-call.metadata=#lib::B.testAOfT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<self::A<core::int*>*>().{self::B::testAOfT2negative}(new self::A::•<self::A<core::num*>*>());
}

View file

@ -37,17 +37,17 @@ static method testObject([@vm.inferred-type.metadata=dart.core::Null? (value: nu
return x;
static method testNullableObject([@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic x) → dynamic
return x;
static method testAOfNum1([@vm.inferred-type.metadata=#lib::B<InterfaceType(int)>] dynamic x) → dynamic
static method testAOfNum1([@vm.inferred-type.metadata=#lib::B<dart.core::int>] dynamic x) → dynamic
return _in::unsafeCast<self::A<core::num>>(x);
static method testAOfNum2([@vm.inferred-type.metadata=#lib::B<InterfaceType(int?)>] dynamic x) → dynamic
static method testAOfNum2([@vm.inferred-type.metadata=#lib::B<dart.core::int?>] dynamic x) → dynamic
return _in::unsafeCast<self::A<core::num>>(x);
static method testAOfNum3([@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic x) → dynamic
return _in::unsafeCast<self::A<core::num>>(x);
static method testAOfNullableNum([@vm.inferred-type.metadata=#lib::B<InterfaceType(int?)>] dynamic x) → dynamic
static method testAOfNullableNum([@vm.inferred-type.metadata=#lib::B<dart.core::int?>] dynamic x) → dynamic
return _in::unsafeCast<self::A<core::num?>>(x);
static method testNullableAOfNum([@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic x) → dynamic
return _in::unsafeCast<self::A<core::num>?>(x);
static method testNullableAOfNullableNum([@vm.inferred-type.metadata=#lib::B<InterfaceType(int?)>] dynamic x) → dynamic
static method testNullableAOfNullableNum([@vm.inferred-type.metadata=#lib::B<dart.core::int?>] dynamic x) → dynamic
return _in::unsafeCast<self::A<core::num?>?>(x);
static method main() → void {
self::testInt1(42);
@ -63,9 +63,9 @@ static method main() → void {
self::testAOfNullableNum(new self::B::•<core::int?>());
self::testNullableAOfNum(null);
self::testNullableAOfNullableNum(new self::B::•<core::int?>());
[@vm.direct-call.metadata=B.testT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testT1}(42);
[@vm.direct-call.metadata=B.testT2] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testT2}(null);
[@vm.direct-call.metadata=B.testT3] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int?>().{self::B::testT3}(null);
[@vm.direct-call.metadata=B.testNullableT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testNullableT1}(42);
[@vm.direct-call.metadata=B.testNullableT2] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testNullableT2}(null);
[@vm.direct-call.metadata=#lib::B.testT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testT1}(42);
[@vm.direct-call.metadata=#lib::B.testT2] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testT2}(null);
[@vm.direct-call.metadata=#lib::B.testT3] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int?>().{self::B::testT3}(null);
[@vm.direct-call.metadata=#lib::B.testNullableT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testNullableT1}(42);
[@vm.direct-call.metadata=#lib::B.testNullableT2] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testNullableT2}(null);
}

View file

@ -37,19 +37,19 @@ static method testObjectNegative([@vm.inferred-type.metadata=dart.core::Null? (v
return let dynamic #t1 = x in true ?{core::Object} #t1 as{ForNonNullableByDefault} core::Object : #t1{core::Object};
static method testNullableObject([@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic x) → dynamic
return x;
static method testAOfNum1([@vm.inferred-type.metadata=#lib::B<InterfaceType(int)>] dynamic x) → dynamic
static method testAOfNum1([@vm.inferred-type.metadata=#lib::B<dart.core::int>] dynamic x) → dynamic
return _in::unsafeCast<self::A<core::num>>(x);
static method testAOfNum2negative([@vm.inferred-type.metadata=#lib::B<InterfaceType(int?)>] dynamic x) → dynamic
static method testAOfNum2negative([@vm.inferred-type.metadata=#lib::B<dart.core::int?>] dynamic x) → dynamic
return x as{ForNonNullableByDefault} self::A<core::num>;
static method testAOfNum3negative([@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic x) → dynamic
return x as{ForNonNullableByDefault} self::A<core::num>;
static method testAOfNullableNum([@vm.inferred-type.metadata=#lib::B<InterfaceType(int?)>] dynamic x) → dynamic
static method testAOfNullableNum([@vm.inferred-type.metadata=#lib::B<dart.core::int?>] dynamic x) → dynamic
return _in::unsafeCast<self::A<core::num?>>(x);
static method testNullableAOfNum([@vm.inferred-type.metadata=dart.core::Null? (value: null)] dynamic x) → dynamic
return _in::unsafeCast<self::A<core::num>?>(x);
static method testNullableAOfNumNegative([@vm.inferred-type.metadata=#lib::B<InterfaceType(int?)>] dynamic x) → dynamic
static method testNullableAOfNumNegative([@vm.inferred-type.metadata=#lib::B<dart.core::int?>] dynamic x) → dynamic
return x as{ForNonNullableByDefault} self::A<core::num>?;
static method testNullableAOfNullableNum([@vm.inferred-type.metadata=#lib::B<InterfaceType(int?)>] dynamic x) → dynamic
static method testNullableAOfNullableNum([@vm.inferred-type.metadata=#lib::B<dart.core::int?>] dynamic x) → dynamic
return _in::unsafeCast<self::A<core::num?>?>(x);
static method main() → void {
self::testInt1(42);
@ -66,9 +66,9 @@ static method main() → void {
self::testNullableAOfNum(null);
self::testNullableAOfNumNegative(new self::B::•<core::int?>());
self::testNullableAOfNullableNum(new self::B::•<core::int?>());
[@vm.direct-call.metadata=B.testT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testT1}(42);
[@vm.direct-call.metadata=B.testT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testT2negative}(null);
[@vm.direct-call.metadata=B.testT3] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int?>().{self::B::testT3}(null);
[@vm.direct-call.metadata=B.testNullableT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testNullableT1}(42);
[@vm.direct-call.metadata=B.testNullableT2] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testNullableT2}(null);
[@vm.direct-call.metadata=#lib::B.testT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testT1}(42);
[@vm.direct-call.metadata=#lib::B.testT2negative] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testT2negative}(null);
[@vm.direct-call.metadata=#lib::B.testT3] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int?>().{self::B::testT3}(null);
[@vm.direct-call.metadata=#lib::B.testNullableT1] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testNullableT1}(42);
[@vm.direct-call.metadata=#lib::B.testNullableT2] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•<core::int>().{self::B::testNullableT2}(null);
}

View file

@ -21,31 +21,31 @@ class A extends core::Object {
: self::A::unboxedSmi = unboxedSmi, self::A::unboxedInt = unboxedInt, self::A::unboxedDouble = unboxedDouble, self::A::boxedNullableInt = boxedNullableInt, self::A::boxedNullableDouble = boxedNullableDouble, self::A::boxedNonNullableIntOrDouble = boxedNonNullableIntOrDouble, self::A::boxedNullableIntOrDouble = boxedNullableIntOrDouble, self::A::boxedNullableX = boxedNullableX, self::A::boxedX = boxedX, super core::Object::•()
;
}
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kTrue = [@vm.direct-call.metadata=_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1) ?{core::bool*} true : false;
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kFalse = [@vm.direct-call.metadata=_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(2) ?{core::bool*} true : false;
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kTrue = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1) ?{core::bool*} true : false;
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kFalse = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(2) ?{core::bool*} true : false;
static get mint() → core::int*
return -6144092014192636707;
static get smiOrMint() → core::int*
return [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : [@vm.inferred-type.metadata=int] self::mint;
static method main() → dynamic {
final self::A* a = new self::A::•([@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null, [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null, new self::X::•());
[@vm.direct-call.metadata=A.unboxedSmi] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedSmi} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2;
[@vm.direct-call.metadata=A.unboxedInt] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedInt} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2;
[@vm.direct-call.metadata=A.unboxedDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2;
[@vm.direct-call.metadata=A.boxedNullableInt] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableInt} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null;
[@vm.direct-call.metadata=A.boxedNullableDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null;
[@vm.direct-call.metadata=A.boxedNonNullableIntOrDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNonNullableIntOrDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1;
[@vm.direct-call.metadata=A.boxedNullableIntOrDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableIntOrDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null;
[@vm.direct-call.metadata=A.boxedNullableX] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableX} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null;
[@vm.direct-call.metadata=A.boxedX] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedX} = new self::X::•();
self::use([@vm.direct-call.metadata=A.unboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi] a.{self::A::unboxedSmi});
self::use([@vm.direct-call.metadata=A.unboxedInt] [@vm.inferred-type.metadata=int] a.{self::A::unboxedInt});
self::use([@vm.direct-call.metadata=A.unboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double] a.{self::A::unboxedDouble});
self::use([@vm.direct-call.metadata=A.boxedNullableInt] [@vm.inferred-type.metadata=int?] a.{self::A::boxedNullableInt});
self::use([@vm.direct-call.metadata=A.boxedNullableDouble] [@vm.inferred-type.metadata=dart.core::_Double?] a.{self::A::boxedNullableDouble});
self::use([@vm.direct-call.metadata=A.boxedNonNullableIntOrDouble] [@vm.inferred-type.metadata=!] a.{self::A::boxedNonNullableIntOrDouble});
self::use([@vm.direct-call.metadata=A.boxedNullableIntOrDouble] a.{self::A::boxedNullableIntOrDouble});
self::use([@vm.direct-call.metadata=A.boxedNullableX] [@vm.inferred-type.metadata=#lib::X?] a.{self::A::boxedNullableX});
self::use([@vm.direct-call.metadata=A.boxedX] [@vm.inferred-type.metadata=#lib::X] a.{self::A::boxedX});
[@vm.direct-call.metadata=#lib::A.unboxedSmi] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedSmi} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} 1 : 2;
[@vm.direct-call.metadata=#lib::A.unboxedInt] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedInt} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : 2;
[@vm.direct-call.metadata=#lib::A.unboxedDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::unboxedDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : 2.2;
[@vm.direct-call.metadata=#lib::A.boxedNullableInt] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableInt} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::int*} [@vm.inferred-type.metadata=int] self::smiOrMint : null;
[@vm.direct-call.metadata=#lib::A.boxedNullableDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::double*} 1.1 : null;
[@vm.direct-call.metadata=#lib::A.boxedNonNullableIntOrDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNonNullableIntOrDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1;
[@vm.direct-call.metadata=#lib::A.boxedNullableIntOrDouble] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableIntOrDouble} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{core::num*} [@vm.inferred-type.metadata=dart.core::bool?] self::kFalse ?{core::num*} [@vm.inferred-type.metadata=int] self::smiOrMint : 1.1 : null;
[@vm.direct-call.metadata=#lib::A.boxedNullableX] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedNullableX} = [@vm.inferred-type.metadata=dart.core::bool?] self::kTrue ?{self::X*} new self::X::•() : null;
[@vm.direct-call.metadata=#lib::A.boxedX] [@vm.inferred-type.metadata=!? (skip check)] a.{self::A::boxedX} = new self::X::•();
self::use([@vm.direct-call.metadata=#lib::A.unboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi] a.{self::A::unboxedSmi});
self::use([@vm.direct-call.metadata=#lib::A.unboxedInt] [@vm.inferred-type.metadata=int] a.{self::A::unboxedInt});
self::use([@vm.direct-call.metadata=#lib::A.unboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double] a.{self::A::unboxedDouble});
self::use([@vm.direct-call.metadata=#lib::A.boxedNullableInt] [@vm.inferred-type.metadata=int?] a.{self::A::boxedNullableInt});
self::use([@vm.direct-call.metadata=#lib::A.boxedNullableDouble] [@vm.inferred-type.metadata=dart.core::_Double?] a.{self::A::boxedNullableDouble});
self::use([@vm.direct-call.metadata=#lib::A.boxedNonNullableIntOrDouble] [@vm.inferred-type.metadata=!] a.{self::A::boxedNonNullableIntOrDouble});
self::use([@vm.direct-call.metadata=#lib::A.boxedNullableIntOrDouble] a.{self::A::boxedNullableIntOrDouble});
self::use([@vm.direct-call.metadata=#lib::A.boxedNullableX] [@vm.inferred-type.metadata=#lib::X?] a.{self::A::boxedNullableX});
self::use([@vm.direct-call.metadata=#lib::A.boxedX] [@vm.inferred-type.metadata=#lib::X] a.{self::A::boxedX});
}
static method use(dynamic object) → void {}

View file

@ -95,23 +95,23 @@ static get mint() → core::int*
return -6144092014192636707;
static method main() → dynamic {
final core::List<core::Object*>* values = <core::Object*>[new self::Impl1::•(), new self::BaseImpl2::•(), new self::SubImpl3::•()];
final self::Impl1* a = [@vm.direct-call.metadata=_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("0")) as self::Impl1*;
final self::BaseImpl2* b = [@vm.direct-call.metadata=_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("1")) as self::BaseImpl2*;
final self::SubImpl3* c = [@vm.direct-call.metadata=_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("2")) as self::SubImpl3*;
final self::Interface* d = [@vm.direct-call.metadata=_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("2")) as self::Interface*;
[@vm.direct-call.metadata=Impl1.takePositional??] [@vm.inferred-type.metadata=!? (skip check)] a.{self::Impl1::takePositional}(1, 1, 1.1, null, null, 1, null, null, new self::X::•());
final self::Impl1* a = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("0")) as self::Impl1*;
final self::BaseImpl2* b = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("1")) as self::BaseImpl2*;
final self::SubImpl3* c = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("2")) as self::SubImpl3*;
final self::Interface* d = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("2")) as self::Interface*;
[@vm.direct-call.metadata=#lib::Impl1.takePositional??] [@vm.inferred-type.metadata=!? (skip check)] a.{self::Impl1::takePositional}(1, 1, 1.1, null, null, 1, null, null, new self::X::•());
b.{self::BaseImpl2::takePositional}(2, 2, 2.2, 2, 2.2, 2.2, 2, new self::X::•(), new self::X::•());
[@vm.direct-call.metadata=SubImpl3.takePositional??] [@vm.inferred-type.metadata=!? (skip check)] c.{self::SubImpl3::takePositional}(3, [@vm.inferred-type.metadata=int] self::mint, 3.3, [@vm.inferred-type.metadata=int] self::mint, 3.3, 3.3, 3.3, new self::X::•(), new self::X::•());
[@vm.direct-call.metadata=#lib::SubImpl3.takePositional??] [@vm.inferred-type.metadata=!? (skip check)] c.{self::SubImpl3::takePositional}(3, [@vm.inferred-type.metadata=int] self::mint, 3.3, [@vm.inferred-type.metadata=int] self::mint, 3.3, 3.3, 3.3, new self::X::•(), new self::X::•());
d.{self::Interface::takePositional}(3, [@vm.inferred-type.metadata=int] self::mint, 3.3, [@vm.inferred-type.metadata=int] self::mint, 3.3, 3.3, 3.3, new self::X::•(), new self::X::•());
self::use([@vm.direct-call.metadata=Impl1.returnUnboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnUnboxedSmi}(null));
self::use([@vm.direct-call.metadata=Impl1.returnUnboxedInt] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnUnboxedInt}(null));
self::use([@vm.direct-call.metadata=Impl1.returnUnboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 1.1)] a.{self::Impl1::returnUnboxedDouble}(null));
self::use([@vm.direct-call.metadata=Impl1.returnBoxedNullableInt] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableInt}(null));
self::use([@vm.direct-call.metadata=Impl1.returnBoxedNullableDouble] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableDouble}(null));
self::use([@vm.direct-call.metadata=Impl1.returnBoxedIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnBoxedIntOrDouble}(null));
self::use([@vm.direct-call.metadata=Impl1.returnBoxedNullableIntOrDouble] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableIntOrDouble}(null));
self::use([@vm.direct-call.metadata=Impl1.returnBoxedNullableX] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableX}(null));
self::use([@vm.direct-call.metadata=Impl1.returnBoxedX] [@vm.inferred-type.metadata=#lib::X (skip check)] a.{self::Impl1::returnBoxedX}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnUnboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnUnboxedSmi}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnUnboxedInt] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnUnboxedInt}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnUnboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 1.1)] a.{self::Impl1::returnUnboxedDouble}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableInt] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableInt}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableDouble] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableDouble}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnBoxedIntOrDouble}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableIntOrDouble] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableIntOrDouble}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableX] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableX}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedX] [@vm.inferred-type.metadata=#lib::X (skip check)] a.{self::Impl1::returnBoxedX}(null));
self::use([@vm.inferred-type.metadata=dart.core::_Smi] b.{self::BaseImpl2::returnUnboxedSmi}(null));
self::use([@vm.inferred-type.metadata=int] b.{self::BaseImpl2::returnUnboxedInt}(null));
self::use([@vm.inferred-type.metadata=dart.core::_Double] b.{self::BaseImpl2::returnUnboxedDouble}(null));
@ -121,15 +121,15 @@ static method main() → dynamic {
self::use([@vm.inferred-type.metadata=!] b.{self::BaseImpl2::returnBoxedNullableIntOrDouble}(null));
self::use([@vm.inferred-type.metadata=#lib::X] b.{self::BaseImpl2::returnBoxedNullableX}(null));
self::use([@vm.inferred-type.metadata=#lib::X] b.{self::BaseImpl2::returnBoxedX}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnUnboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] c.{self::SubImpl3::returnUnboxedSmi}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnUnboxedInt] [@vm.inferred-type.metadata=int (skip check)] c.{self::SubImpl3::returnUnboxedInt}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnUnboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnUnboxedDouble}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnBoxedNullableInt] [@vm.inferred-type.metadata=int (skip check)] c.{self::SubImpl3::returnBoxedNullableInt}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnBoxedNullableDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedNullableDouble}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnBoxedIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedIntOrDouble}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnBoxedNullableIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedNullableIntOrDouble}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnBoxedNullableX] [@vm.inferred-type.metadata=#lib::X (skip check)] c.{self::SubImpl3::returnBoxedNullableX}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnBoxedX] [@vm.inferred-type.metadata=#lib::X (skip check)] c.{self::SubImpl3::returnBoxedX}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnUnboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] c.{self::SubImpl3::returnUnboxedSmi}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnUnboxedInt] [@vm.inferred-type.metadata=int (skip check)] c.{self::SubImpl3::returnUnboxedInt}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnUnboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnUnboxedDouble}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableInt] [@vm.inferred-type.metadata=int (skip check)] c.{self::SubImpl3::returnBoxedNullableInt}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedNullableDouble}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedIntOrDouble}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedNullableIntOrDouble}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableX] [@vm.inferred-type.metadata=#lib::X (skip check)] c.{self::SubImpl3::returnBoxedNullableX}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedX] [@vm.inferred-type.metadata=#lib::X (skip check)] c.{self::SubImpl3::returnBoxedX}(null));
self::use([@vm.inferred-type.metadata=dart.core::_Smi] d.{self::Interface::returnUnboxedSmi}(null));
self::use([@vm.inferred-type.metadata=int] d.{self::Interface::returnUnboxedInt}(null));
self::use([@vm.inferred-type.metadata=dart.core::_Double] d.{self::Interface::returnUnboxedDouble}(null));

View file

@ -95,23 +95,23 @@ static get mint() → core::int*
return -6144092014192636707;
static method main() → dynamic {
final core::List<core::Object*>* values = <core::Object*>[new self::Impl1::•(), new self::BaseImpl2::•(), new self::SubImpl3::•()];
final self::Impl1* a = [@vm.direct-call.metadata=_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("0")) as self::Impl1*;
final self::BaseImpl2* b = [@vm.direct-call.metadata=_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("1")) as self::BaseImpl2*;
final self::SubImpl3* c = [@vm.direct-call.metadata=_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("2")) as self::SubImpl3*;
final self::Interface* d = [@vm.direct-call.metadata=_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("2")) as self::Interface*;
[@vm.direct-call.metadata=Impl1.takePositional??] [@vm.inferred-type.metadata=!? (skip check)] a.{self::Impl1::takePositional}(1, 1, 1.1, null, null, 1, null, null, new self::X::•());
final self::Impl1* a = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("0")) as self::Impl1*;
final self::BaseImpl2* b = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("1")) as self::BaseImpl2*;
final self::SubImpl3* c = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("2")) as self::SubImpl3*;
final self::Interface* d = [@vm.direct-call.metadata=dart.core::_GrowableList.[]] [@vm.inferred-type.metadata=!? (skip check)] values.{core::List::[]}([@vm.inferred-type.metadata=int] core::int::parse("2")) as self::Interface*;
[@vm.direct-call.metadata=#lib::Impl1.takePositional??] [@vm.inferred-type.metadata=!? (skip check)] a.{self::Impl1::takePositional}(1, 1, 1.1, null, null, 1, null, null, new self::X::•());
b.{self::BaseImpl2::takePositional}(2, 2, 2.2, 2, 2.2, 2.2, 2, new self::X::•(), new self::X::•());
[@vm.direct-call.metadata=SubImpl3.takePositional??] [@vm.inferred-type.metadata=!? (skip check)] c.{self::SubImpl3::takePositional}(3, [@vm.inferred-type.metadata=int] self::mint, 3.3, [@vm.inferred-type.metadata=int] self::mint, 3.3, 3.3, 3.3, new self::X::•(), new self::X::•());
[@vm.direct-call.metadata=#lib::SubImpl3.takePositional??] [@vm.inferred-type.metadata=!? (skip check)] c.{self::SubImpl3::takePositional}(3, [@vm.inferred-type.metadata=int] self::mint, 3.3, [@vm.inferred-type.metadata=int] self::mint, 3.3, 3.3, 3.3, new self::X::•(), new self::X::•());
d.{self::Interface::takePositional}(3, [@vm.inferred-type.metadata=int] self::mint, 3.3, [@vm.inferred-type.metadata=int] self::mint, 3.3, 3.3, 3.3, new self::X::•(), new self::X::•());
self::use([@vm.direct-call.metadata=Impl1.returnUnboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnUnboxedSmi}(null));
self::use([@vm.direct-call.metadata=Impl1.returnUnboxedInt] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnUnboxedInt}(null));
self::use([@vm.direct-call.metadata=Impl1.returnUnboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 1.1)] a.{self::Impl1::returnUnboxedDouble}(null));
self::use([@vm.direct-call.metadata=Impl1.returnBoxedNullableInt] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableInt}(null));
self::use([@vm.direct-call.metadata=Impl1.returnBoxedNullableDouble] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableDouble}(null));
self::use([@vm.direct-call.metadata=Impl1.returnBoxedIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnBoxedIntOrDouble}(null));
self::use([@vm.direct-call.metadata=Impl1.returnBoxedNullableIntOrDouble] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableIntOrDouble}(null));
self::use([@vm.direct-call.metadata=Impl1.returnBoxedNullableX] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableX}(null));
self::use([@vm.direct-call.metadata=Impl1.returnBoxedX] [@vm.inferred-type.metadata=#lib::X (skip check)] a.{self::Impl1::returnBoxedX}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnUnboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnUnboxedSmi}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnUnboxedInt] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnUnboxedInt}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnUnboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 1.1)] a.{self::Impl1::returnUnboxedDouble}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableInt] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableInt}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableDouble] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableDouble}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 1)] a.{self::Impl1::returnBoxedIntOrDouble}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableIntOrDouble] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableIntOrDouble}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedNullableX] [@vm.inferred-type.metadata=dart.core::Null? (skip check) (value: null)] a.{self::Impl1::returnBoxedNullableX}(null));
self::use([@vm.direct-call.metadata=#lib::Impl1.returnBoxedX] [@vm.inferred-type.metadata=#lib::X (skip check)] a.{self::Impl1::returnBoxedX}(null));
self::use([@vm.inferred-type.metadata=dart.core::_Smi] b.{self::BaseImpl2::returnUnboxedSmi}(null));
self::use([@vm.inferred-type.metadata=int] b.{self::BaseImpl2::returnUnboxedInt}(null));
self::use([@vm.inferred-type.metadata=dart.core::_Double] b.{self::BaseImpl2::returnUnboxedDouble}(null));
@ -121,15 +121,15 @@ static method main() → dynamic {
self::use([@vm.inferred-type.metadata=!] b.{self::BaseImpl2::returnBoxedNullableIntOrDouble}(null));
self::use([@vm.inferred-type.metadata=#lib::X] b.{self::BaseImpl2::returnBoxedNullableX}(null));
self::use([@vm.inferred-type.metadata=#lib::X] b.{self::BaseImpl2::returnBoxedX}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnUnboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] c.{self::SubImpl3::returnUnboxedSmi}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnUnboxedInt] [@vm.inferred-type.metadata=int (skip check)] c.{self::SubImpl3::returnUnboxedInt}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnUnboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnUnboxedDouble}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnBoxedNullableInt] [@vm.inferred-type.metadata=int (skip check)] c.{self::SubImpl3::returnBoxedNullableInt}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnBoxedNullableDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedNullableDouble}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnBoxedIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedIntOrDouble}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnBoxedNullableIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedNullableIntOrDouble}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnBoxedNullableX] [@vm.inferred-type.metadata=#lib::X (skip check)] c.{self::SubImpl3::returnBoxedNullableX}(null));
self::use([@vm.direct-call.metadata=SubImpl3.returnBoxedX] [@vm.inferred-type.metadata=#lib::X (skip check)] c.{self::SubImpl3::returnBoxedX}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnUnboxedSmi] [@vm.inferred-type.metadata=dart.core::_Smi (skip check) (value: 3)] c.{self::SubImpl3::returnUnboxedSmi}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnUnboxedInt] [@vm.inferred-type.metadata=int (skip check)] c.{self::SubImpl3::returnUnboxedInt}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnUnboxedDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnUnboxedDouble}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableInt] [@vm.inferred-type.metadata=int (skip check)] c.{self::SubImpl3::returnBoxedNullableInt}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedNullableDouble}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedIntOrDouble}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableIntOrDouble] [@vm.inferred-type.metadata=dart.core::_Double (skip check) (value: 3.3)] c.{self::SubImpl3::returnBoxedNullableIntOrDouble}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedNullableX] [@vm.inferred-type.metadata=#lib::X (skip check)] c.{self::SubImpl3::returnBoxedNullableX}(null));
self::use([@vm.direct-call.metadata=#lib::SubImpl3.returnBoxedX] [@vm.inferred-type.metadata=#lib::X (skip check)] c.{self::SubImpl3::returnBoxedX}(null));
self::use([@vm.inferred-type.metadata=dart.core::_Smi] d.{self::Interface::returnUnboxedSmi}(null));
self::use([@vm.inferred-type.metadata=int] d.{self::Interface::returnUnboxedInt}(null));
self::use([@vm.inferred-type.metadata=dart.core::_Double] d.{self::Interface::returnUnboxedDouble}(null));

View file

@ -7,8 +7,8 @@ class X extends core::Object {
: super core::Object::•()
;
}
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kTrue = [@vm.direct-call.metadata=_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1) ?{core::bool*} true : false;
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kFalse = [@vm.direct-call.metadata=_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(2) ?{core::bool*} true : false;
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kTrue = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1) ?{core::bool*} true : false;
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kFalse = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(2) ?{core::bool*} true : false;
static get mint() → core::int*
return -6144092014192636707;
static get smiOrMint() → core::int*

View file

@ -7,8 +7,8 @@ class X extends core::Object {
: super core::Object::•()
;
}
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kTrue = [@vm.direct-call.metadata=_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1) ?{core::bool*} true : false;
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kFalse = [@vm.direct-call.metadata=_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(2) ?{core::bool*} true : false;
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kTrue = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(1) ?{core::bool*} true : false;
[@vm.inferred-type.metadata=dart.core::bool?]static final field core::bool* kFalse = [@vm.direct-call.metadata=dart.core::_IntegerImplementation.==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.inferred-type.metadata=int] core::int::parse("1").{core::num::==}(2) ?{core::bool*} true : false;
static get mint() → core::int*
return -6144092014192636707;
static get smiOrMint() → core::int*

View file

@ -16,5 +16,5 @@ class C extends core::Object {
}
static method main() → void {
null;
[@vm.direct-call.metadata=C.instanceField] [@vm.inferred-type.metadata=!? (skip check)] new self::C::•().{self::C::instanceField} = null;
[@vm.direct-call.metadata=#lib::C.instanceField] [@vm.inferred-type.metadata=!? (skip check)] new self::C::•().{self::C::instanceField} = null;
}

View file

@ -58,11 +58,11 @@ static method main() → void {
new self::B::•("hi");
self::C<core::num*>* c = new self::D::•();
exp::Expect::throws<dynamic>(() → core::Null? {
[@vm.call-site-attributes.metadata=receiverType:InterfaceType(C<num*>*)] [@vm.direct-call.metadata=D.bar] c.{self::C::bar} = 3.14;
[@vm.call-site-attributes.metadata=receiverType:#lib::C<dart.core::num*>*] [@vm.direct-call.metadata=#lib::D.bar] c.{self::C::bar} = 3.14;
});
self::E* e = new self::F::•();
exp::Expect::equals(42, [@vm.direct-call.metadata=F.bar] [@vm.inferred-type.metadata=dart.core::_Smi (value: 42)] e.{self::E::bar});
exp::Expect::equals(42, [@vm.direct-call.metadata=#lib::F.bar] [@vm.inferred-type.metadata=dart.core::_Smi (value: 42)] e.{self::E::bar});
exp::Expect::isTrue(![@vm.inferred-type.metadata=dart.core::bool] core::identical(#C2, #C4));
[@vm.direct-call.metadata=I.foo] [@vm.inferred-type.metadata=!? (skip check)] new self::I::•().{self::I::foo}();
[@vm.direct-call.metadata=#lib::I.foo] [@vm.inferred-type.metadata=!? (skip check)] new self::I::•().{self::I::foo}();
5;
}

View file

@ -7,7 +7,7 @@ class A extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method use() → dynamic {
[@vm.direct-call.metadata=A.x] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A::x} = 3;
[@vm.direct-call.metadata=#lib::A.x] [@vm.inferred-type.metadata=!? (skip check)] this.{self::A::x} = 3;
}
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3] set /*isNullableByDefault*/ x(core::int value) → void;
}
@ -17,13 +17,13 @@ class B extends core::Object {
: super core::Object::•()
;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] method use() → dynamic {
[@vm.direct-call.metadata=B.x] [@vm.inferred-type.metadata=!? (skip check)] this.{self::B::x} = 3;
[@vm.direct-call.metadata=#lib::B.x] [@vm.inferred-type.metadata=!? (skip check)] this.{self::B::x} = 3;
}
}
[@vm.inferred-type.metadata=dart.core::_Smi?]late static final field core::int staticLateB;
static method main() → void {
[@vm.direct-call.metadata=A.use] [@vm.inferred-type.metadata=!? (skip check)] new self::A::•().{self::A::use}();
[@vm.direct-call.metadata=B.use] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•().{self::B::use}();
[@vm.direct-call.metadata=#lib::A.use] [@vm.inferred-type.metadata=!? (skip check)] new self::A::•().{self::A::use}();
[@vm.direct-call.metadata=#lib::B.use] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•().{self::B::use}();
4;
self::staticLateB = 4;
}