Version 2.11.0-251.0.dev
Merge commit '51f8304b71303565dc8ff75f6c558e2a18aba171' into 'dev'
diff --git a/pkg/front_end/test/incremental_load_from_dill_suite.dart b/pkg/front_end/test/incremental_load_from_dill_suite.dart
index 2d9449c..b1684fb 100644
--- a/pkg/front_end/test/incremental_load_from_dill_suite.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_suite.dart
@@ -762,9 +762,11 @@
result = checkExpectFile(data, worldNum, "", context, actualSerialized);
if (result != null) return result;
- result =
- checkClassHierarchy(compiler, component, data, worldNum, context);
- if (result != null) return result;
+ if (world["skipClassHierarchyTest"] != true) {
+ result =
+ checkClassHierarchy(compiler, component, data, worldNum, context);
+ if (result != null) return result;
+ }
int nonSyntheticLibraries = countNonSyntheticLibraries(component);
int nonSyntheticPlatformLibraries =
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.expect
index f65ae73..21b9bcb 100644
--- a/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.expect
@@ -45,7 +45,7 @@
return new self::Class::•();
}
static method test2<T extends self::Class* = self::Class*>(self::test2::T* t2) → dynamic {
- if(self::test2::T*.{core::Object::==}(self::SubClass*)) {
+ if(self::test2::T*.{core::Type::==}(self::SubClass*)) {
self::SubClass* subClass = self::BoundExtension|method2<self::Class*>(t2) as{TypeError} self::SubClass*;
}
}
diff --git a/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.transformed.expect
index 84f76d4..abe6de964 100644
--- a/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/type_variable_bound.dart.strong.transformed.expect
@@ -45,7 +45,7 @@
return new self::Class::•();
}
static method test2<T extends self::Class* = self::Class*>(self::test2::T* t2) → dynamic {
- if(self::test2::T*.{core::Object::==}(self::SubClass*)) {
+ if(self::test2::T*.{core::Type::==}(self::SubClass*)) {
self::SubClass* subClass = self::BoundExtension|method2<self::Class*>(t2) as{TypeError} self::SubClass*;
}
}
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect
index 0f1b8dd..5e97b8a 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect
@@ -87,24 +87,24 @@
core::print("hello ${x.{core::int::^}(y)}");
}
get a() → core::int*
- return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+ return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
get b() → core::int*
- return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+ return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
get c() → core::int* {
- return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+ return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
}
get d() → core::int* {
- return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+ return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
}
get e() → core::int*
- return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+ return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
get f() → core::int*
- return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+ return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
get g() → core::int* {
- return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+ return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
}
get h() → core::int* {
- return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+ return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
}
method i(core::int* x, core::int* y) → core::int*
return x.{core::int::^}(y);
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect
index 0f1b8dd..5e97b8a 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect
@@ -87,24 +87,24 @@
core::print("hello ${x.{core::int::^}(y)}");
}
get a() → core::int*
- return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+ return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
get b() → core::int*
- return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+ return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
get c() → core::int* {
- return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+ return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
}
get d() → core::int* {
- return this.{self::Key::runtimeType}.{core::Object::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+ return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
}
get e() → core::int*
- return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+ return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
get f() → core::int*
- return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+ return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
get g() → core::int* {
- return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+ return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
}
get h() → core::int* {
- return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Object::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+ return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
}
method i(core::int* x, core::int* y) → core::int*
return x.{core::int::^}(y);
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.expect b/pkg/front_end/testcases/general/expressions.dart.strong.expect
index bc2f8d2..9325380 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.expect
@@ -72,10 +72,10 @@
self::caller(({dynamic x = #C1}) → core::Null? {
core::print("<anon> was called with ${x}");
});
- core::print(core::int*.{core::Object::toString}());
+ core::print(core::int*.{core::Type::toString}());
core::print(core::int*);
core::print(let final core::Type* #t5 = core::int* in block {
- #t5.{core::Object::toString}();
+ #t5.{core::Type::toString}();
} =>#t5);
try {
core::print(invalid-expression "pkg/front_end/testcases/general/expressions.dart:74:16: Error: Method not found: 'int.toString'.
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
index 04c23db..4aced3e 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
@@ -72,10 +72,10 @@
self::caller(({dynamic x = #C1}) → core::Null? {
core::print("<anon> was called with ${x}");
});
- core::print(core::int*.{core::Object::toString}());
+ core::print(core::int*.{core::Type::toString}());
core::print(core::int*);
core::print(let final core::Type* #t5 = core::int* in block {
- #t5.{core::Object::toString}();
+ #t5.{core::Type::toString}();
} =>#t5);
try {
core::print(invalid-expression "pkg/front_end/testcases/general/expressions.dart:74:16: Error: Method not found: 'int.toString'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
index 5c1a339..b408161 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
@@ -72,10 +72,10 @@
self::caller(({dynamic x = #C1}) → core::Null? {
core::print("<anon> was called with ${x}");
});
- core::print(core::int*.{core::Object::toString}());
+ core::print(core::int*.{core::Type::toString}());
core::print(core::int*);
core::print(let final core::Type* #t5 = core::int* in block {
- #t5.{core::Object::toString}();
+ #t5.{core::Type::toString}();
} =>#t5);
try {
core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart:76:16: Error: Method not found: 'int.toString'.
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
index 4796426..3e91f0c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
@@ -72,10 +72,10 @@
self::caller(({dynamic x = #C1}) → core::Null? {
core::print("<anon> was called with ${x}");
});
- core::print(core::int*.{core::Object::toString}());
+ core::print(core::int*.{core::Type::toString}());
core::print(core::int*);
core::print(let final core::Type* #t5 = core::int* in block {
- #t5.{core::Object::toString}();
+ #t5.{core::Type::toString}();
} =>#t5);
try {
core::print(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart:76:16: Error: Method not found: 'int.toString'.
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml
new file mode 100644
index 0000000..60fdac4
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml
@@ -0,0 +1,64 @@
+# 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.md file.
+
+# Reproduce weirdness with abstract member-signatures and forwarding stubs from
+# https://github.com/flutter/flutter/issues/66122
+
+type: newworld
+target: DDC
+trackWidgetCreation: true
+worlds:
+ - entry: main.dart
+ skipClassHierarchyTest: true
+ sources:
+ main.dart: |
+ import 'package:flutter/framework.dart';
+ import 'after_layout.dart';
+ class _HotReloadIssueState extends State<HotReloadIssue>
+ with AfterLayoutMixin<HotReloadIssue> {
+ Widget build(BuildContext context) {}
+ void afterFirstLayout(BuildContext context) {}
+ }
+ class HotReloadIssue extends StatefulWidget {}
+
+ after_layout.dart:
+ import 'package:flutter/framework.dart';
+ mixin AfterLayoutMixin<T extends StatefulWidget> on State<T> {}
+
+ flutter/lib/framework.dart: |
+ mixin Diagnosticable {
+ String toString() {
+ return "foo";
+ }
+ }
+ abstract class State<T extends StatefulWidget> with Diagnosticable {
+ T? _widget;
+ }
+ class State2 extends State {}
+ class StatefulWidget {}
+ class Widget {}
+ class BuildContext {}
+ final State<StatefulWidget> state = new State2();
+ void foo() {
+ state._widget = null;
+ }
+ .dart_tool/package_config.json: |
+ {
+ "configVersion": 2,
+ "packages": [
+ {
+ "name": "flutter",
+ "rootUri": "../flutter",
+ "packageUri": "lib/"
+ }
+ ]
+ }
+ expectedLibraryCount: 3
+ - entry: main.dart
+ skipClassHierarchyTest: true
+ worldType: updated
+ invalidate:
+ - main.dart
+ expectInitializeFromDill: false
+ expectedLibraryCount: 3
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
new file mode 100644
index 0000000..bdece83
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.1.expect
@@ -0,0 +1,91 @@
+main = <No Member>;
+library from "org-dartlang-test:///after_layout.dart" as aft {
+
+ import "package:flutter/framework.dart";
+
+ abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/ {
+ abstract member-signature get /* from org-dartlang-test:///flutter/lib/framework.dart */ _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
+ abstract member-signature set /* from org-dartlang-test:///flutter/lib/framework.dart */ _widget(aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
+ abstract member-signature operator /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+ abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+ abstract member-signature method /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+ abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+ }
+}
+library from "package:flutter/framework.dart" as fra {
+
+ abstract class Diagnosticable extends dart.core::Object /*isMixinDeclaration*/ {
+ method toString() → dart.core::String {
+ return "foo";
+ }
+ }
+ abstract class _State&Object&Diagnosticable = dart.core::Object with fra::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → fra::_State&Object&Diagnosticable
+ : super dart.core::Object::•()
+ ;
+ }
+ abstract class State<T extends fra::StatefulWidget = fra::StatefulWidget> extends fra::_State&Object&Diagnosticable {
+ generic-covariant-impl field fra::State::T? _widget = null;
+ synthetic constructor •() → fra::State<fra::State::T>
+ : super fra::_State&Object&Diagnosticable::•()
+ ;
+ }
+ class State2 extends fra::State<fra::StatefulWidget> {
+ synthetic constructor •() → fra::State2
+ : super fra::State::•()
+ ;
+ }
+ class StatefulWidget extends dart.core::Object {
+ synthetic constructor •() → fra::StatefulWidget
+ : super dart.core::Object::•()
+ ;
+ }
+ class Widget extends dart.core::Object {
+ synthetic constructor •() → fra::Widget
+ : super dart.core::Object::•()
+ ;
+ }
+ class BuildContext extends dart.core::Object {
+ synthetic constructor •() → fra::BuildContext
+ : super dart.core::Object::•()
+ ;
+ }
+ static final field fra::State<fra::StatefulWidget> state = new fra::State2::•();
+ static method foo() → void {
+ fra::state.{fra::State::_widget} = null;
+ }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+ import "package:flutter/framework.dart";
+ import "org-dartlang-test:///after_layout.dart";
+
+ abstract class __HotReloadIssueState&State&AfterLayoutMixin = fra::State<main::HotReloadIssue*> with aft::AfterLayoutMixin<main::HotReloadIssue*> /*isAnonymousMixin*/ {
+ synthetic constructor •() → main::__HotReloadIssueState&State&AfterLayoutMixin*
+ : super fra::State::•()
+ ;
+ abstract member-signature get _widget() → main::HotReloadIssue*; -> fra::State::_widget
+ abstract member-signature set _widget(main::HotReloadIssue* _) → void; -> fra::State::_widget
+ abstract member-signature operator ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+ abstract member-signature get hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+ abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+ abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+ }
+ class _HotReloadIssueState extends main::__HotReloadIssueState&State&AfterLayoutMixin {
+ synthetic constructor •() → main::_HotReloadIssueState*
+ : super main::__HotReloadIssueState&State&AfterLayoutMixin::•()
+ ;
+ method build(fra::BuildContext* context) → fra::Widget* {}
+ method afterFirstLayout(fra::BuildContext* context) → void {}
+ }
+ class HotReloadIssue extends fra::StatefulWidget {
+ synthetic constructor •() → main::HotReloadIssue*
+ : super fra::StatefulWidget::•()
+ ;
+ abstract member-signature operator /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+ abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+ abstract member-signature method /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ toString() → dart.core::String*; -> dart.core::Object::toString
+ abstract member-signature method /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+ abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+ }
+}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
new file mode 100644
index 0000000..6924048
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/flutter_issue_66122.yaml.world.2.expect
@@ -0,0 +1,89 @@
+main = <No Member>;
+library from "org-dartlang-test:///after_layout.dart" as aft {
+
+ import "package:flutter/framework.dart";
+
+ abstract class AfterLayoutMixin<T extends fra::StatefulWidget* = fra::StatefulWidget*> extends fra::State<aft::AfterLayoutMixin::T*> /*isMixinDeclaration*/ {
+ abstract member-signature get /* from org-dartlang-test:///flutter/lib/framework.dart */ _widget() → aft::AfterLayoutMixin::T*; -> fra::State::_widget
+ abstract member-signature set /* from org-dartlang-test:///flutter/lib/framework.dart */ _widget(aft::AfterLayoutMixin::T* value) → void; -> fra::State::_widget
+ abstract member-signature operator /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+ abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+ abstract member-signature method /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+ abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+ }
+}
+library from "package:flutter/framework.dart" as fra {
+
+ abstract class Diagnosticable extends dart.core::Object /*isMixinDeclaration*/ {
+ method toString() → dart.core::String {
+ return "foo";
+ }
+ }
+ abstract class _State&Object&Diagnosticable = dart.core::Object with fra::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → fra::_State&Object&Diagnosticable
+ : super dart.core::Object::•()
+ ;
+ }
+ abstract class State<T extends fra::StatefulWidget = fra::StatefulWidget> extends fra::_State&Object&Diagnosticable {
+ generic-covariant-impl field fra::State::T? _widget = null;
+ synthetic constructor •() → fra::State<fra::State::T>
+ : super fra::_State&Object&Diagnosticable::•()
+ ;
+ }
+ class State2 extends fra::State<fra::StatefulWidget> {
+ synthetic constructor •() → fra::State2
+ : super fra::State::•()
+ ;
+ }
+ class StatefulWidget extends dart.core::Object {
+ synthetic constructor •() → fra::StatefulWidget
+ : super dart.core::Object::•()
+ ;
+ }
+ class Widget extends dart.core::Object {
+ synthetic constructor •() → fra::Widget
+ : super dart.core::Object::•()
+ ;
+ }
+ class BuildContext extends dart.core::Object {
+ synthetic constructor •() → fra::BuildContext
+ : super dart.core::Object::•()
+ ;
+ }
+ static final field fra::State<fra::StatefulWidget> state = new fra::State2::•();
+ static method foo() → void {
+ fra::state.{fra::State::_widget} = null;
+ }
+}
+library from "org-dartlang-test:///main.dart" as main {
+
+ import "package:flutter/framework.dart";
+ import "org-dartlang-test:///after_layout.dart";
+
+ abstract class __HotReloadIssueState&State&AfterLayoutMixin = fra::State<main::HotReloadIssue*> with aft::AfterLayoutMixin<main::HotReloadIssue*> /*isAnonymousMixin*/ {
+ synthetic constructor •() → main::__HotReloadIssueState&State&AfterLayoutMixin*
+ : super fra::State::•()
+ ;
+ forwarding-stub set _widget(main::HotReloadIssue* value) → void
+ return super.{fra::State::_widget} = value;
+ }
+ class _HotReloadIssueState extends main::__HotReloadIssueState&State&AfterLayoutMixin {
+ synthetic constructor •() → main::_HotReloadIssueState*
+ : super main::__HotReloadIssueState&State&AfterLayoutMixin::•()
+ ;
+ method build(fra::BuildContext* context) → fra::Widget* {}
+ method afterFirstLayout(fra::BuildContext* context) → void {}
+ forwarding-stub set _widget(main::HotReloadIssue* value) → void
+ return super.{fra::State::_widget} = value;
+ }
+ class HotReloadIssue extends fra::StatefulWidget {
+ synthetic constructor •() → main::HotReloadIssue*
+ : super fra::StatefulWidget::•()
+ ;
+ abstract member-signature operator /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ ==(dynamic other) → dart.core::bool*; -> dart.core::Object::==
+ abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ hashCode() → dart.core::int*; -> dart.core::Object::hashCode
+ abstract member-signature method /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ toString() → dart.core::String*; -> dart.core::Object::toString
+ abstract member-signature method /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
+ abstract member-signature get /* from org-dartlang-sdk:///lib/_internal/js_dev_runtime/patch/core_patch.dart */ runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
+ }
+}
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect
index acf0683..a948972 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.expect
@@ -57,7 +57,7 @@
return new self::Class::•();
}
static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
- if(self::test2::T.{core::Object::==}(self::SubClass)) {
+ if(self::test2::T.{core::Type::==}(self::SubClass)) {
self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
- 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
SubClass subClass = t2.method2();
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect
index 17743ab..e6c4be4 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.strong.transformed.expect
@@ -57,7 +57,7 @@
return new self::Class::•();
}
static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
- if(self::test2::T.{core::Object::==}(self::SubClass)) {
+ if(self::test2::T.{core::Type::==}(self::SubClass)) {
self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
- 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
SubClass subClass = t2.method2();
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect
index acf0683..a948972 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.expect
@@ -57,7 +57,7 @@
return new self::Class::•();
}
static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
- if(self::test2::T.{core::Object::==}(self::SubClass)) {
+ if(self::test2::T.{core::Type::==}(self::SubClass)) {
self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
- 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
SubClass subClass = t2.method2();
diff --git a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect
index 17743ab..e6c4be4 100644
--- a/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart.weak.transformed.expect
@@ -57,7 +57,7 @@
return new self::Class::•();
}
static method test2<T extends self::Class = self::Class>(self::test2::T t2) → dynamic {
- if(self::test2::T.{core::Object::==}(self::SubClass)) {
+ if(self::test2::T.{core::Type::==}(self::SubClass)) {
self::SubClass subClass = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart:26:28: Error: A value of type 'T' can't be assigned to a variable of type 'SubClass'.
- 'SubClass' is from 'pkg/front_end/testcases/nnbd/extension_type_variable_bound.dart'.
SubClass subClass = t2.method2();
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect b/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
index ee9eb9c..a93539c 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
@@ -439,28 +439,28 @@
self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:72:11: Error: Can't assign to a type literal.
use(--Func);
^^^^");
- self::C<dynamic>*.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
+ self::C<dynamic>*.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
C ??= 42;
^" : null;
- self::use(let final core::Type* #t1 = self::C<dynamic>* in #t1.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
+ self::use(let final core::Type* #t1 = self::C<dynamic>* in #t1.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
use(C ??= 42);
^" : #t1);
- dynamic.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
+ dynamic.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
dynamic ??= 42;
^^^^^^^" : null;
- self::use(let final core::Type* #t2 = dynamic in #t2.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
+ self::use(let final core::Type* #t2 = dynamic in #t2.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
use(dynamic ??= 42);
^^^^^^^" : #t2);
- self::C::T*.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
+ self::C::T*.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
T ??= 42;
^" : null;
- self::use(let final core::Type* #t3 = self::C::T* in #t3.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
+ self::use(let final core::Type* #t3 = self::C::T* in #t3.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
use(T ??= 42);
^" : #t3);
- () →* void.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
+ () →* void.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
Func ??= 42;
^^^^" : null;
- self::use(let final core::Type* #t4 = () →* void in #t4.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
+ self::use(let final core::Type* #t4 = () →* void in #t4.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
use(Func ??= 42);
^^^^" : #t4);
invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:83:5: Error: Can't assign to a type literal.
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
index 0099095..16c04e9 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.strong.transformed.expect
@@ -439,28 +439,28 @@
self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:72:11: Error: Can't assign to a type literal.
use(--Func);
^^^^");
- self::C<dynamic>*.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
+ self::C<dynamic>*.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Can't assign to a type literal.
C ??= 42;
^" : null;
- self::use(let final core::Type* #t1 = self::C<dynamic>* in #t1.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
+ self::use(let final core::Type* #t1 = self::C<dynamic>* in #t1.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Can't assign to a type literal.
use(C ??= 42);
^" : #t1);
- dynamic.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
+ dynamic.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Can't assign to a type literal.
dynamic ??= 42;
^^^^^^^" : null;
- self::use(let final core::Type* #t2 = dynamic in #t2.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
+ self::use(let final core::Type* #t2 = dynamic in #t2.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Can't assign to a type literal.
use(dynamic ??= 42);
^^^^^^^" : #t2);
- self::C::T*.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
+ self::C::T*.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Can't assign to a type literal.
T ??= 42;
^" : null;
- self::use(let final core::Type* #t3 = self::C::T* in #t3.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
+ self::use(let final core::Type* #t3 = self::C::T* in #t3.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Can't assign to a type literal.
use(T ??= 42);
^" : #t3);
- () →* void.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
+ () →* void.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Can't assign to a type literal.
Func ??= 42;
^^^^" : null;
- self::use(let final core::Type* #t4 = () →* void in #t4.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
+ self::use(let final core::Type* #t4 = () →* void in #t4.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Can't assign to a type literal.
use(Func ??= 42);
^^^^" : #t4);
invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:83:5: Error: Can't assign to a type literal.
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.strong.expect b/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
index 36ac25e..777322c 100644
--- a/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
@@ -23,7 +23,7 @@
invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:9:3: Error: Can't assign to a type literal.
Foo = null;
^^^";
- () →* void.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
+ () →* void.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
Foo ??= null;
^^^" : null;
invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:11:3: Error: Method not found: 'Foo'.
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
index 2fda16d..625cf29 100644
--- a/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/typedef.dart.strong.transformed.expect
@@ -23,7 +23,7 @@
invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:9:3: Error: Can't assign to a type literal.
Foo = null;
^^^";
- () →* void.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
+ () →* void.{core::Type::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Can't assign to a type literal.
Foo ??= null;
^^^" : null;
invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:11:3: Error: Method not found: 'Foo'.
diff --git a/sdk/lib/core/type.dart b/sdk/lib/core/type.dart
index d2e107b..65cef39 100644
--- a/sdk/lib/core/type.dart
+++ b/sdk/lib/core/type.dart
@@ -6,5 +6,53 @@
/**
* Runtime representation of a type.
+ *
+ * Type objects represent types.
+ * A type object can be created in several ways:
+ * * By a *type literal*, a type name occurring as an expression,
+ * like `Type type = int;`,
+ * or a type variable occurring as an expression, like `Type type = T;`.
+ * * By reading the run-time type of an object,
+ * like `Type type = o.runtimeType;`.
+ * * Through `dart:mirrors`.
+ *
+ * A type object is intended as an entry point for using `dart:mirrors`.
+ * The only operations supported are comparing to other type objects
+ * for equality, and converting it to a string for debugging.
*/
-abstract class Type {}
+abstract class Type {
+ /**
+ * A hash code for the type which is compatible with [operator==].
+ */
+ int get hashCode;
+
+ /**
+ * Whether [other] is a [Type] instance representing an equivalent type.
+ *
+ * The language specification dictates which types are considered
+ * to be the equivalent.
+ * If two types are equivalent, it's guaranteed that they are subtypes
+ * of each other,
+ * but there are also types which are subtypes of each other,
+ * and which are not equivalent (for example `dynamic` and `void`,
+ * or `FutureOr<Object>` and `Object`).
+ */
+ bool operator ==(Object other);
+
+ /**
+ * Returns a string which represents the underlying type.
+ *
+ * The string is only intended for providing information to a reader
+ * while debugging.
+ * There is no guaranteed format,
+ * the string value returned for a [Type] instances is entirely
+ * implementation dependent.
+ *
+ * The string should be consistent, so a `Type` object for the *same* type
+ * returns the same string throughout a program execution.
+ * The string may or may not contain parts corresponding to the
+ * source name of declaration of the type, if the type has a source name
+ * at all (some types reachable through `dart:mirrors` may not).
+ */
+ String toString();
+}
diff --git a/tools/VERSION b/tools/VERSION
index 09a704e..8b1debf 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 11
PATCH 0
-PRERELEASE 250
+PRERELEASE 251
PRERELEASE_PATCH 0
\ No newline at end of file