Version 2.0.0-dev.56.0
Merge commit '2a7188523e6ff00c068136200e32e65f4200fdc9' into dev
diff --git a/.packages b/.packages
index 68a0766..5e2e043 100644
--- a/.packages
+++ b/.packages
@@ -17,6 +17,7 @@
barback:third_party/pkg/barback/lib
bazel_worker:third_party/pkg/bazel_worker/lib
boolean_selector:third_party/pkg/boolean_selector/lib
+build_integration:pkg/build_integration/lib
charcode:third_party/pkg/charcode/lib
charted:third_party/observatory_pub_packages/packages/charted/lib
cli_util:third_party/pkg/cli_util/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 563a2fb..e02675e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,21 @@
+## 2.0.0-dev.57.0
+
+* Support Javascript Promise APIs as a Dart Future. In Javascript a Promise has two
+ callbacks one for success and one for failure. For success the Future returns the
+ value e.g.,
+
+BackgroundFetchManager.get is exposed as:
+
+```dart
+ Future<BackgroundFetchRegistration> get(String id)
+```
+
+usage could be:
+
+ BackgroundFetchRegistration result = await fetchMgr.get('abc');
+
+ The underlying JS Promise to Future mechanism will be exposed as a public API in a future checkin.
+
## 2.0.0-dev.56.0
### Language
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index e949c17..db27347 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -1130,7 +1130,7 @@
.toList();
processOptionsForDriver(info, options, optionMap);
ContextRoot contextRoot =
- new ContextRoot(folder.path, containedExcludedPaths);
+ new ContextRoot(pathContext, folder.path, containedExcludedPaths);
if (optionsFile != null) {
contextRoot.optionsFilePath = optionsFile.path;
}
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 77fd41b..1af301c 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -65,6 +65,11 @@
SearchEngine searchEngine;
/**
+ * The workspace for rename refactorings.
+ */
+ RefactoringWorkspace refactoringWorkspace;
+
+ /**
* The object used to manage uncompleted refactorings.
*/
_RefactoringManager refactoringManager;
@@ -74,6 +79,8 @@
*/
EditDomainHandler(AnalysisServer server) : super(server) {
searchEngine = server.searchEngine;
+ refactoringWorkspace =
+ new RefactoringWorkspace(server.driverMap.values, searchEngine);
_newRefactoringManager();
}
@@ -589,7 +596,7 @@
// try RENAME
{
RenameRefactoring renameRefactoring = new RenameRefactoring(
- searchEngine, server.getAstProvider(file), element);
+ refactoringWorkspace, server.getAstProvider(file), element);
if (renameRefactoring != null) {
kinds.add(RefactoringKind.RENAME);
}
@@ -614,7 +621,7 @@
* Initializes [refactoringManager] with a new instance.
*/
void _newRefactoringManager() {
- refactoringManager = new _RefactoringManager(server, searchEngine);
+ refactoringManager = new _RefactoringManager(server, refactoringWorkspace);
}
static int _getNumberOfScanParseErrors(List<engine.AnalysisError> errors) {
@@ -695,6 +702,7 @@
const <RefactoringProblem>[];
final AnalysisServer server;
+ final RefactoringWorkspace refactoringWorkspace;
final SearchEngine searchEngine;
StreamSubscription subscriptionToReset;
@@ -711,7 +719,8 @@
Request request;
EditGetRefactoringResult result;
- _RefactoringManager(this.server, this.searchEngine) {
+ _RefactoringManager(this.server, this.refactoringWorkspace)
+ : searchEngine = refactoringWorkspace.searchEngine {
_reset();
}
@@ -978,7 +987,7 @@
// do create the refactoring
refactoring = new RenameRefactoring(
- searchEngine, server.getAstProvider(file), element);
+ refactoringWorkspace, server.getAstProvider(file), element);
feedback = new RenameFeedback(
feedbackOffset, feedbackLength, 'kind', 'oldName');
}
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 19c6a82..8497b25 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -560,10 +560,8 @@
}
// Use the returned expression as the field initializer.
if (expression != null) {
- AstNode beginNodeToReplace = getter.name;
String code = 'final';
if (getter.returnType != null) {
- beginNodeToReplace = getter.returnType;
code += ' ' + _getNodeText(getter.returnType);
}
code += ' ' + _getNodeText(getter.name);
@@ -571,7 +569,8 @@
code += ' = ' + _getNodeText(expression);
}
code += ';';
- SourceRange replacementRange = range.startEnd(beginNodeToReplace, getter);
+ SourceRange replacementRange =
+ range.startEnd(getter.returnType ?? getter.propertyKeyword, getter);
DartChangeBuilder changeBuilder = new DartChangeBuilder(session);
await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
builder.addSimpleReplacement(replacementRange, code);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
index 96243dd..74f5d98 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/refactoring.dart
@@ -23,6 +23,7 @@
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
import 'package:analyzer/src/dart/element/ast_provider.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart'
show RefactoringMethodParameter, SourceChange;
@@ -378,6 +379,25 @@
}
/**
+ * Information about the workspace refactorings operate it.
+ */
+class RefactoringWorkspace {
+ final Iterable<AnalysisDriver> drivers;
+ final SearchEngine searchEngine;
+
+ RefactoringWorkspace(this.drivers, this.searchEngine);
+
+ /**
+ * Whether the file with the given [path] is in a context root.
+ */
+ bool containsFile(String path) {
+ return drivers.any((driver) {
+ return driver.contextRoot.containsFile(path);
+ });
+ }
+}
+
+/**
* Abstract [Refactoring] for renaming some [Element].
*/
abstract class RenameRefactoring implements Refactoring {
@@ -386,8 +406,8 @@
* maybe `null` if there is no support for renaming [Element]s of the given
* type.
*/
- factory RenameRefactoring(
- SearchEngine searchEngine, AstProvider astProvider, Element element) {
+ factory RenameRefactoring(RefactoringWorkspace workspace,
+ AstProvider astProvider, Element element) {
if (element == null) {
return null;
}
@@ -395,28 +415,27 @@
element = (element as PropertyAccessorElement).variable;
}
if (element.enclosingElement is CompilationUnitElement) {
- return new RenameUnitMemberRefactoringImpl(searchEngine, element);
+ return new RenameUnitMemberRefactoringImpl(workspace, element);
}
if (element is ConstructorElement) {
return new RenameConstructorRefactoringImpl(
- searchEngine, astProvider, element);
+ workspace, astProvider, element);
}
if (element is ImportElement) {
- return new RenameImportRefactoringImpl(
- searchEngine, astProvider, element);
+ return new RenameImportRefactoringImpl(workspace, astProvider, element);
}
if (element is LabelElement) {
- return new RenameLabelRefactoringImpl(searchEngine, element);
+ return new RenameLabelRefactoringImpl(workspace, element);
}
if (element is LibraryElement) {
- return new RenameLibraryRefactoringImpl(searchEngine, element);
+ return new RenameLibraryRefactoringImpl(workspace, element);
}
if (element is LocalElement) {
- return new RenameLocalRefactoringImpl(searchEngine, astProvider, element);
+ return new RenameLocalRefactoringImpl(workspace, astProvider, element);
}
if (element.enclosingElement is ClassElement) {
return new RenameClassMemberRefactoringImpl(
- searchEngine, astProvider, element);
+ workspace, astProvider, element);
}
return null;
}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename.dart b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
index db79f49..716b2de13 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename.dart
@@ -12,44 +12,14 @@
import 'package:analysis_server/src/services/search/search_engine.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/generated/java_core.dart';
-import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer_plugin/utilities/range_factory.dart';
-import 'package:path/path.dart' as pathos;
-
-bool isElementInPubCache(Element element) {
- Source source = element.source;
- String path = source.fullName;
- return isPathInPubCache(path);
-}
-
-bool isElementInSdkOrPubCache(Element element) {
- Source source = element.source;
- String path = source.fullName;
- return source.isInSystemLibrary || isPathInPubCache(path);
-}
-
-bool isPathInPubCache(String path) {
- List<String> parts = pathos.split(path);
- if (parts.contains('.pub-cache')) {
- return true;
- }
- for (int i = 0; i < parts.length - 1; i++) {
- if (parts[i] == 'Pub' && parts[i + 1] == 'Cache') {
- return true;
- }
- if (parts[i] == 'third_party' &&
- (parts[i + 1] == 'pkg' || parts[i + 1] == 'pkg_tested')) {
- return true;
- }
- }
- return false;
-}
/**
* An abstract implementation of [RenameRefactoring].
*/
abstract class RenameRefactoringImpl extends RefactoringImpl
implements RenameRefactoring {
+ final RefactoringWorkspace workspace;
final SearchEngine searchEngine;
final Element _element;
final String elementKindName;
@@ -58,8 +28,8 @@
String newName;
- RenameRefactoringImpl(SearchEngine searchEngine, Element element)
- : searchEngine = searchEngine,
+ RenameRefactoringImpl(this.workspace, Element element)
+ : searchEngine = workspace.searchEngine,
_element = element,
elementKindName = element.kind.displayName,
oldName = _getDisplayName(element);
@@ -97,9 +67,9 @@
getElementQualifiedName(element));
result.addFatalError(message);
}
- if (isElementInPubCache(element)) {
+ if (!workspace.containsFile(element.source.fullName)) {
String message = format(
- "The {0} '{1}' is defined in a pub package, so cannot be renamed.",
+ "The {0} '{1}' is defined outside of the project, so cannot be renamed.",
getElementKindName(element),
getElementQualifiedName(element));
result.addFatalError(message);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 9c10cdb..7c58a69 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -41,8 +41,8 @@
_ClassMemberValidator _validator;
RenameClassMemberRefactoringImpl(
- SearchEngine searchEngine, this.astProvider, Element element)
- : super(searchEngine, element);
+ RefactoringWorkspace workspace, this.astProvider, Element element)
+ : super(workspace, element);
@override
String get refactoringName {
@@ -102,7 +102,7 @@
List<SourceReference> nameRefs = getSourceReferences(nameMatches);
for (SourceReference reference in nameRefs) {
// ignore references from SDK and pub cache
- if (isElementInSdkOrPubCache(reference.element)) {
+ if (!workspace.containsFile(reference.element.source.fullName)) {
continue;
}
// check the element being renamed is accessible
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
index e079875..ccdb578 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_constructor.dart
@@ -27,9 +27,9 @@
class RenameConstructorRefactoringImpl extends RenameRefactoringImpl {
final AstProvider astProvider;
- RenameConstructorRefactoringImpl(
- SearchEngine searchEngine, this.astProvider, ConstructorElement element)
- : super(searchEngine, element);
+ RenameConstructorRefactoringImpl(RefactoringWorkspace workspace,
+ this.astProvider, ConstructorElement element)
+ : super(workspace, element);
@override
ConstructorElement get element => super.element as ConstructorElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
index 2adca4d..826fcf0 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_import.dart
@@ -27,8 +27,8 @@
final AstProvider astProvider;
RenameImportRefactoringImpl(
- SearchEngine searchEngine, this.astProvider, ImportElement element)
- : super(searchEngine, element);
+ RefactoringWorkspace workspace, this.astProvider, ImportElement element)
+ : super(workspace, element);
@override
ImportElement get element => super.element as ImportElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
index 651fc7ac..e8a62c9 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_label.dart
@@ -8,15 +8,15 @@
import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
import 'package:analysis_server/src/services/refactoring/refactoring.dart';
import 'package:analysis_server/src/services/refactoring/rename.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
import 'package:analyzer/dart/element/element.dart';
/**
* A [Refactoring] for renaming [LabelElement]s.
*/
class RenameLabelRefactoringImpl extends RenameRefactoringImpl {
- RenameLabelRefactoringImpl(SearchEngine searchEngine, LabelElement element)
- : super(searchEngine, element);
+ RenameLabelRefactoringImpl(
+ RefactoringWorkspace workspace, LabelElement element)
+ : super(workspace, element);
@override
LabelElement get element => super.element as LabelElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
index 1c72c89..ac8326b 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_library.dart
@@ -8,7 +8,6 @@
import 'package:analysis_server/src/services/refactoring/naming_conventions.dart';
import 'package:analysis_server/src/services/refactoring/refactoring.dart';
import 'package:analysis_server/src/services/refactoring/rename.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
import 'package:analyzer/dart/element/element.dart';
/**
@@ -16,8 +15,8 @@
*/
class RenameLibraryRefactoringImpl extends RenameRefactoringImpl {
RenameLibraryRefactoringImpl(
- SearchEngine searchEngine, LibraryElement element)
- : super(searchEngine, element);
+ RefactoringWorkspace workspace, LibraryElement element)
+ : super(workspace, element);
@override
LibraryElement get element => super.element as LibraryElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
index eca6220..d452e7d 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_local.dart
@@ -12,7 +12,6 @@
import 'package:analysis_server/src/services/refactoring/refactoring.dart';
import 'package:analysis_server/src/services/refactoring/rename.dart';
import 'package:analysis_server/src/services/search/hierarchy.dart';
-import 'package:analysis_server/src/services/search/search_engine.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/dart/element/element.dart';
@@ -29,9 +28,9 @@
List<LocalElement> elements = [];
RenameLocalRefactoringImpl(
- SearchEngine searchEngine, this.astProvider, LocalElement element)
+ RefactoringWorkspace workspace, this.astProvider, LocalElement element)
: unitCache = new ResolvedUnitCache(astProvider),
- super(searchEngine, element);
+ super(workspace, element);
@override
LocalElement get element => super.element as LocalElement;
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
index fea2831..5f483a9 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart
@@ -42,8 +42,9 @@
* A [Refactoring] for renaming compilation unit member [Element]s.
*/
class RenameUnitMemberRefactoringImpl extends RenameRefactoringImpl {
- RenameUnitMemberRefactoringImpl(SearchEngine searchEngine, Element element)
- : super(searchEngine, element);
+ RenameUnitMemberRefactoringImpl(
+ RefactoringWorkspace workspace, Element element)
+ : super(workspace, element);
@override
String get refactoringName {
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 8cf628e..8060d58 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -137,7 +137,8 @@
resourceProvider,
new MemoryByteStore(),
fileContentOverlay,
- new ContextRoot(resourceProvider.convertPath('/project'), []),
+ new ContextRoot(resourceProvider.pathContext,
+ resourceProvider.convertPath('/project'), []),
sourceFactory,
new AnalysisOptionsImpl()..strongMode = true);
scheduler.start();
diff --git a/pkg/analysis_server/test/abstract_single_unit.dart b/pkg/analysis_server/test/abstract_single_unit.dart
index 1ea09b0..1e9c3ef 100644
--- a/pkg/analysis_server/test/abstract_single_unit.dart
+++ b/pkg/analysis_server/test/abstract_single_unit.dart
@@ -31,7 +31,7 @@
@override
void setUp() {
super.setUp();
- testFile = resourceProvider.convertPath('/test.dart');
+ testFile = resourceProvider.convertPath('/project/test.dart');
}
void addTestSource(String code, [Uri uri]) {
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index 752c8af..986c6ae 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -104,7 +104,7 @@
}
test_addTypeAnnotation_BAD_privateType_closureParameter() async {
- addSource('/my_lib.dart', '''
+ addSource('/project/my_lib.dart', '''
library my_lib;
class A {}
class _B extends A {}
@@ -120,7 +120,7 @@
}
test_addTypeAnnotation_BAD_privateType_declaredIdentifier() async {
- addSource('/my_lib.dart', '''
+ addSource('/project/my_lib.dart', '''
library my_lib;
class A {}
class _B extends A {}
@@ -141,7 +141,7 @@
test_addTypeAnnotation_BAD_privateType_list() async {
// This is now failing because we're suggesting "List" rather than nothing.
// Is it really better to produce nothing?
- addSource('/my_lib.dart', '''
+ addSource('/project/my_lib.dart', '''
library my_lib;
class A {}
class _B extends A {}
@@ -162,7 +162,7 @@
}
test_addTypeAnnotation_BAD_privateType_variable() async {
- addSource('/my_lib.dart', '''
+ addSource('/project/my_lib.dart', '''
library my_lib;
class A {}
class _B extends A {}
@@ -279,7 +279,7 @@
}
test_addTypeAnnotation_declaredIdentifier_OK_addImport_dartUri() async {
- addSource('/my_lib.dart', r'''
+ addSource('/project/my_lib.dart', r'''
import 'dart:async';
List<Future<int>> getFutures() => null;
''');
@@ -416,7 +416,7 @@
}
test_addTypeAnnotation_local_OK_addImport_dartUri() async {
- addSource('/my_lib.dart', r'''
+ addSource('/project/my_lib.dart', r'''
import 'dart:async';
Future<int> getFutureInt() => null;
''');
@@ -438,7 +438,7 @@
test_addTypeAnnotation_local_OK_addImport_notLibraryUnit() async {
// prepare library
- addSource('/my_lib.dart', r'''
+ addSource('/project/my_lib.dart', r'''
import 'dart:async';
Future<int> getFutureInt() => null;
''');
@@ -455,8 +455,8 @@
}
''';
// add sources
- addSource('/app.dart', appCode);
- testSource = addSource('/test.dart', testCode);
+ addSource('/project/app.dart', appCode);
+ testSource = addSource('/project/test.dart', testCode);
// resolve
await resolveTestUnit(testCode);
// prepare the assist
@@ -465,7 +465,7 @@
change = assist.change;
// verify
{
- var testFileEdit = change.getFileEdit(convertPath('/app.dart'));
+ var testFileEdit = change.getFileEdit(convertPath('/project/app.dart'));
var resultCode = SourceEdit.applySequence(appCode, testFileEdit.edits);
expect(resultCode, '''
library my_app;
@@ -476,7 +476,7 @@
''');
}
{
- var testFileEdit = change.getFileEdit(convertPath('/test.dart'));
+ var testFileEdit = change.getFileEdit(convertPath('/project/test.dart'));
var resultCode = SourceEdit.applySequence(testCode, testFileEdit.edits);
expect(resultCode, '''
part of my_app;
@@ -488,10 +488,10 @@
}
test_addTypeAnnotation_local_OK_addImport_relUri() async {
- addSource('/aa/bbb/lib_a.dart', r'''
+ addSource('/project/aa/bbb/lib_a.dart', r'''
class MyClass {}
''');
- addSource('/ccc/lib_b.dart', r'''
+ addSource('/project/ccc/lib_b.dart', r'''
import '../aa/bbb/lib_a.dart';
MyClass newMyClass() => null;
''');
@@ -1680,6 +1680,34 @@
''');
}
+ test_convertToFinalField_OK_noReturnType() async {
+ await resolveTestUnit('''
+class A {
+ get foo => 42;
+}
+''');
+ await assertHasAssistAt(
+ 'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
+class A {
+ final foo = 42;
+}
+''');
+ }
+
+ test_convertToFinalField_OK_noReturnType_static() async {
+ await resolveTestUnit('''
+class A {
+ static get foo => 42;
+}
+''');
+ await assertHasAssistAt(
+ 'get foo', DartAssistKind.CONVERT_INTO_FINAL_FIELD, '''
+class A {
+ static final foo = 42;
+}
+''');
+ }
+
test_convertToFinalField_OK_notNull() async {
await resolveTestUnit('''
class A {
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index cde73fd..62b0d84 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -1100,7 +1100,7 @@
test_addMissingRequiredArg_cons_single() async {
_addMetaPackageSource();
- addSource('/libA.dart', r'''
+ addSource('/project/libA.dart', r'''
library libA;
import 'package:meta/meta.dart';
@@ -1128,7 +1128,7 @@
test_addMissingRequiredArg_cons_single_closure() async {
_addMetaPackageSource();
- addSource('/libA.dart', r'''
+ addSource('/project/libA.dart', r'''
library libA;
import 'package:meta/meta.dart';
@@ -1158,7 +1158,7 @@
test_addMissingRequiredArg_cons_single_closure_2() async {
_addMetaPackageSource();
- addSource('/libA.dart', r'''
+ addSource('/project/libA.dart', r'''
library libA;
import 'package:meta/meta.dart';
@@ -1188,7 +1188,7 @@
test_addMissingRequiredArg_cons_single_closure_3() async {
_addMetaPackageSource();
- addSource('/libA.dart', r'''
+ addSource('/project/libA.dart', r'''
library libA;
import 'package:meta/meta.dart';
@@ -1218,7 +1218,7 @@
test_addMissingRequiredArg_cons_single_closure_4() async {
_addMetaPackageSource();
- addSource('/libA.dart', r'''
+ addSource('/project/libA.dart', r'''
library libA;
import 'package:meta/meta.dart';
@@ -1248,7 +1248,7 @@
test_addMissingRequiredArg_cons_single_list() async {
_addMetaPackageSource();
- addSource('/libA.dart', r'''
+ addSource('/project/libA.dart', r'''
library libA;
import 'package:meta/meta.dart';
@@ -1495,13 +1495,13 @@
}
test_changeToStaticAccess_method_importType() async {
- addSource('/libA.dart', r'''
+ addSource('/project/libA.dart', r'''
library libA;
class A {
static foo() {}
}
''');
- addSource('/libB.dart', r'''
+ addSource('/project/libB.dart', r'''
library libB;
import 'libA.dart';
class B extends A {}
@@ -1556,13 +1556,13 @@
}
test_changeToStaticAccess_property_importType() async {
- addSource('/libA.dart', r'''
+ addSource('/project/libA.dart', r'''
library libA;
class A {
static get foo => null;
}
''');
- addSource('/libB.dart', r'''
+ addSource('/project/libB.dart', r'''
library libB;
import 'libA.dart';
class B extends A {}
@@ -1748,7 +1748,7 @@
class A {}
''';
- addSource('/lib.dart', libCode);
+ addSource('/project/lib.dart', libCode);
await resolveTestUnit('''
import 'lib.dart' as lib;
@@ -1764,7 +1764,7 @@
List<SourceFileEdit> fileEdits = change.edits;
expect(fileEdits, hasLength(1));
SourceFileEdit fileEdit = change.edits[0];
- expect(fileEdit.file, convertPath('/lib.dart'));
+ expect(fileEdit.file, convertPath('/project/lib.dart'));
expect(SourceEdit.applySequence(libCode, fileEdit.edits), r'''
library my.lib;
@@ -2165,11 +2165,11 @@
}
test_createConstructorSuperImplicit_importType() async {
- addSource('/libA.dart', r'''
+ addSource('/project/libA.dart', r'''
library libA;
class A {}
''');
- addSource('/libB.dart', r'''
+ addSource('/project/libB.dart', r'''
library libB;
import 'libA.dart';
class B {
@@ -2314,7 +2314,7 @@
}
test_createField_getter_qualified_instance_differentLibrary() async {
- addSource('/other.dart', '''
+ addSource('/project/other.dart', '''
/**
* A comment to push the offset of the braces for the following class
* declaration past the end of the content of the test file. Used to catch an
@@ -2343,7 +2343,7 @@
int test;
}
''',
- target: '/other.dart');
+ target: '/project/other.dart');
}
test_createField_getter_qualified_instance_dynamicType() async {
@@ -2493,11 +2493,11 @@
}
test_createField_importType() async {
- addSource('/libA.dart', r'''
+ addSource('/project/libA.dart', r'''
library libA;
class A {}
''');
- addSource('/libB.dart', r'''
+ addSource('/project/libB.dart', r'''
library libB;
import 'libA.dart';
A getA() => null;
@@ -2938,7 +2938,7 @@
}
test_createGetter_qualified_instance_differentLibrary() async {
- addSource('/other.dart', '''
+ addSource('/project/other.dart', '''
/**
* A comment to push the offset of the braces for the following class
* declaration past the end of the content of the test file. Used to catch an
@@ -2967,7 +2967,7 @@
int get test => null;
}
''',
- target: '/other.dart');
+ target: '/project/other.dart');
}
test_createGetter_qualified_instance_dynamicType() async {
@@ -3879,11 +3879,11 @@
}
test_creationFunction_forFunctionType_importType() async {
- addSource('/libA.dart', r'''
+ addSource('/project/libA.dart', r'''
library libA;
class A {}
''');
- addSource('/libB.dart', r'''
+ addSource('/project/libB.dart', r'''
library libB;
import 'libA.dart';
useFunction(int g(A a)) {}
@@ -5370,7 +5370,7 @@
}
test_undefinedFunction_create_importType() async {
- addSource('/lib.dart', r'''
+ addSource('/project/lib.dart', r'''
library lib;
import 'dart:async';
Future getFuture() => null;
@@ -6082,8 +6082,8 @@
class D {
}
''';
- addSource('/test2.dart', code2);
- addSource('/test3.dart', r'''
+ addSource('/project/test2.dart', code2);
+ addSource('/project/test3.dart', r'''
library test3;
class E {}
''');
@@ -6101,7 +6101,7 @@
List<SourceFileEdit> fileEdits = change.edits;
expect(fileEdits, hasLength(1));
SourceFileEdit fileEdit = change.edits[0];
- expect(fileEdit.file, convertPath('/test2.dart'));
+ expect(fileEdit.file, convertPath('/project/test2.dart'));
expect(SourceEdit.applySequence(code2, fileEdit.edits), r'''
library test2;
import 'test3.dart' as bbb;
@@ -6119,7 +6119,7 @@
}
class E {}
''';
- addSource('/test2.dart', code2);
+ addSource('/project/test2.dart', code2);
await resolveTestUnit('''
library test;
import 'test2.dart' as test2;
@@ -6134,7 +6134,7 @@
List<SourceFileEdit> fileEdits = change.edits;
expect(fileEdits, hasLength(1));
SourceFileEdit fileEdit = change.edits[0];
- expect(fileEdit.file, convertPath('/test2.dart'));
+ expect(fileEdit.file, convertPath('/project/test2.dart'));
expect(SourceEdit.applySequence(code2, fileEdit.edits), r'''
library test2;
class D {
diff --git a/pkg/analysis_server/test/services/correction/organize_directives_test.dart b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
index 459b78c..9576897 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -96,8 +96,8 @@
}
test_remove_unresolvedDirectives() async {
- addSource('/existing_part1.dart', 'part of lib;');
- addSource('/existing_part2.dart', 'part of lib;');
+ addSource('/project/existing_part1.dart', 'part of lib;');
+ addSource('/project/existing_part2.dart', 'part of lib;');
await _computeUnitAndErrors(r'''
library lib;
diff --git a/pkg/analysis_server/test/services/correction/status_test.dart b/pkg/analysis_server/test/services/correction/status_test.dart
index 776fa14..cce27cd 100644
--- a/pkg/analysis_server/test/services/correction/status_test.dart
+++ b/pkg/analysis_server/test/services/correction/status_test.dart
@@ -29,7 +29,7 @@
Element element = findElement('MyClass');
// check
Location location = newLocation_fromElement(element);
- expect(location.file, convertPath('/test.dart'));
+ expect(location.file, convertPath('/project/test.dart'));
expect(location.offset, 6);
expect(location.length, 7);
expect(location.startLine, 1);
@@ -52,7 +52,7 @@
sourceRange);
// check
Location location = newLocation_fromMatch(match);
- expect(location.file, convertPath('/test.dart'));
+ expect(location.file, convertPath('/project/test.dart'));
expect(location.offset, sourceRange.offset);
expect(location.length, sourceRange.length);
}
@@ -65,7 +65,7 @@
AstNode node = findNodeAtString('main');
// check
Location location = newLocation_fromNode(node);
- expect(location.file, convertPath('/test.dart'));
+ expect(location.file, convertPath('/project/test.dart'));
expect(location.offset, node.offset);
expect(location.length, node.length);
}
@@ -75,7 +75,7 @@
SourceRange sourceRange = new SourceRange(10, 20);
// check
Location location = newLocation_fromUnit(testUnit, sourceRange);
- expect(location.file, convertPath('/test.dart'));
+ expect(location.file, convertPath('/project/test.dart'));
expect(location.offset, sourceRange.offset);
expect(location.length, sourceRange.length);
}
diff --git a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
index 3d8633c..3bb9141 100644
--- a/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
+++ b/pkg/analysis_server/test/services/refactoring/abstract_rename.dart
@@ -55,7 +55,8 @@
* Fails if no [RenameRefactoring] can be created.
*/
void createRenameRefactoringForElement(Element element) {
- refactoring = new RenameRefactoring(searchEngine, astProvider, element);
+ var workspace = new RefactoringWorkspace([driver], searchEngine);
+ refactoring = new RenameRefactoring(workspace, astProvider, element);
expect(refactoring, isNotNull, reason: "No refactoring for '$element'.");
}
diff --git a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
index 7712c7d..6702055 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_getter_to_method_test.dart
@@ -87,7 +87,7 @@
}
test_change_multipleFiles() async {
- await indexUnit('/other.dart', r'''
+ await indexUnit('/project/other.dart', r'''
class A {
int get test => 1;
}
diff --git a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
index e9cb4d8..60f38f8 100644
--- a/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/convert_method_to_getter_test.dart
@@ -89,7 +89,7 @@
}
test_change_multipleFiles() async {
- await indexUnit('/other.dart', r'''
+ await indexUnit('/project/other.dart', r'''
class A {
int test() => 1;
}
diff --git a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
index bcdb836..59f1a21 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -2837,7 +2837,7 @@
}
void _addLibraryReturningAsync() {
- addSource('/asyncLib.dart', r'''
+ addSource('/project/asyncLib.dart', r'''
library asyncLib;
import 'dart:async';
Future<int> newFuture() => null;
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index f248500..00006c5 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -157,7 +157,7 @@
test() {}
}
''');
- await indexUnit('/lib.dart', '''
+ await indexUnit('/project/lib.dart', '''
library my.lib;
import 'test.dart';
@@ -356,7 +356,7 @@
newName() {} // marker
}
''';
- await indexUnit('/lib.dart', libCode);
+ await indexUnit('/project/lib.dart', libCode);
await indexTestUnit('''
import 'lib.dart';
class B extends A {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
index 1434a05..2f0f4a3 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_constructor_test.dart
@@ -230,8 +230,8 @@
}
test_newInstance_nullElement() async {
- RenameRefactoring refactoring =
- new RenameRefactoring(searchEngine, null, null);
+ var workspace = new RefactoringWorkspace([driver], searchEngine);
+ var refactoring = new RenameRefactoring(workspace, null, null);
expect(refactoring, isNull);
}
diff --git a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
index 1acca7d..19d2a4d 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_library_test.dart
@@ -40,7 +40,7 @@
}
test_createChange() async {
- addSource('/part.dart', '''
+ addSource('/project/part.dart', '''
part of my.app;
''');
await indexTestUnit('''
@@ -57,13 +57,13 @@
library the.new.name;
part 'part.dart';
''');
- assertFileChangeResult('/part.dart', '''
+ assertFileChangeResult('/project/part.dart', '''
part of the.new.name;
''');
}
test_createChange_hasWhitespaces() async {
- addSource('/part.dart', '''
+ addSource('/project/part.dart', '''
part of my . app;
''');
await indexTestUnit('''
@@ -80,7 +80,7 @@
library the.new.name;
part 'part.dart';
''');
- assertFileChangeResult('/part.dart', '''
+ assertFileChangeResult('/project/part.dart', '''
part of the.new.name;
''');
}
diff --git a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
index 505843c..6b8c273 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_local_test.dart
@@ -447,7 +447,7 @@
A({test});
}
''');
- await indexUnit('/test2.dart', '''
+ await indexUnit('/project/test2.dart', '''
import 'test.dart';
main() {
new A(test: 2);
@@ -463,7 +463,7 @@
A({newName});
}
''');
- assertFileChangeResult('/test2.dart', '''
+ assertFileChangeResult('/project/test2.dart', '''
import 'test.dart';
main() {
new A(newName: 2);
@@ -472,7 +472,7 @@
}
test_createChange_parameter_named_updateHierarchy() async {
- await indexUnit('/test2.dart', '''
+ await indexUnit('/project/test2.dart', '''
library test2;
class A {
void foo({int test: 1}) {
@@ -516,7 +516,7 @@
}
}
''');
- assertFileChangeResult('/test2.dart', '''
+ assertFileChangeResult('/project/test2.dart', '''
library test2;
class A {
void foo({int newName: 1}) {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
index 6285bbd..e5c22bf 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart
@@ -69,7 +69,7 @@
await indexTestUnit('''
class Test {}
''');
- await indexUnit(convertPath('/lib.dart'), '''
+ await indexUnit(convertPath('/project/lib.dart'), '''
library my.lib;
import 'test.dart';
@@ -109,7 +109,7 @@
await indexTestUnit('''
class Test {}
''');
- await indexUnit(convertPath('/lib.dart'), '''
+ await indexUnit(convertPath('/project/lib.dart'), '''
library my.lib;
import 'test.dart';
class A {
@@ -214,44 +214,6 @@
assertRefactoringStatusOK(status);
}
- test_checkInitialConditions_inPubCache_posix() async {
- addSource('/.pub-cache/lib.dart', r'''
-class A {}
-''');
- await indexTestUnit('''
-import "${convertPathForImport('/.pub-cache/lib.dart')}";
-main() {
- A a;
-}
-''');
- createRenameRefactoringAtString('A a');
- // check status
- refactoring.newName = 'NewName';
- RefactoringStatus status = await refactoring.checkInitialConditions();
- assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL,
- expectedMessage:
- "The class 'A' is defined in a pub package, so cannot be renamed.");
- }
-
- test_checkInitialConditions_inPubCache_windows() async {
- addSource('/Pub/Cache/lib.dart', r'''
-class A {}
-''');
- await indexTestUnit('''
-import "${convertPathForImport('/Pub/Cache/lib.dart')}";
-main() {
- A a;
-}
-''');
- createRenameRefactoringAtString('A a');
- // check status
- refactoring.newName = 'NewName';
- RefactoringStatus status = await refactoring.checkInitialConditions();
- assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL,
- expectedMessage:
- "The class 'A' is defined in a pub package, so cannot be renamed.");
- }
-
test_checkInitialConditions_inSDK() async {
await indexTestUnit('''
main() {
@@ -267,6 +229,25 @@
"The class 'String' is defined in the SDK, so cannot be renamed.");
}
+ test_checkInitialConditions_outsideOfProject() async {
+ addSource('/other/lib.dart', r'''
+class A {}
+''');
+ await indexTestUnit('''
+import "${convertPathForImport('/other/lib.dart')}";
+main() {
+ A a;
+}
+''');
+ createRenameRefactoringAtString('A a');
+ // check status
+ refactoring.newName = 'NewName';
+ RefactoringStatus status = await refactoring.checkInitialConditions();
+ assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL,
+ expectedMessage:
+ "The class 'A' is defined outside of the project, so cannot be renamed.");
+ }
+
test_checkNewName_ClassElement() async {
await indexTestUnit('''
class Test {}
@@ -483,7 +464,7 @@
}
test_createChange_FunctionElement_imported() async {
- await indexUnit('/foo.dart', r'''
+ await indexUnit('/project/foo.dart', r'''
test() {}
foo() {}
''');
@@ -510,7 +491,7 @@
foo();
}
''');
- assertFileChangeResult('/foo.dart', '''
+ assertFileChangeResult('/project/foo.dart', '''
newName() {}
foo() {}
''');
diff --git a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
index ef5fb8f..5fd654d 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
@@ -33,6 +33,10 @@
});
}
+ContextRoot _newContextRoot(String root, {List<String> exclude: const []}) {
+ return new ContextRoot(path.context, root, exclude);
+}
+
@reflectiveTest
class BuiltInPluginInfoTest {
TestNotificationManager notificationManager;
@@ -45,7 +49,7 @@
}
test_addContextRoot() {
- ContextRoot contextRoot1 = new ContextRoot('/pkg1', []);
+ ContextRoot contextRoot1 = _newContextRoot('/pkg1');
plugin.addContextRoot(contextRoot1);
expect(plugin.contextRoots, [contextRoot1]);
plugin.addContextRoot(contextRoot1);
@@ -60,8 +64,8 @@
}
test_removeContextRoot() {
- ContextRoot contextRoot1 = new ContextRoot('/pkg1', []);
- ContextRoot contextRoot2 = new ContextRoot('/pkg2', []);
+ ContextRoot contextRoot1 = _newContextRoot('/pkg1');
+ ContextRoot contextRoot2 = _newContextRoot('/pkg2');
plugin.addContextRoot(contextRoot1);
expect(plugin.contextRoots, unorderedEquals([contextRoot1]));
plugin.addContextRoot(contextRoot2);
@@ -119,7 +123,7 @@
test_addContextRoot() {
String optionsFilePath = '/pkg1/analysis_options.yaml';
- ContextRoot contextRoot1 = new ContextRoot('/pkg1', []);
+ ContextRoot contextRoot1 = _newContextRoot('/pkg1');
contextRoot1.optionsFilePath = optionsFilePath;
PluginSession session = new PluginSession(plugin);
TestServerCommunicationChannel channel =
@@ -144,8 +148,8 @@
}
test_removeContextRoot() {
- ContextRoot contextRoot1 = new ContextRoot('/pkg1', []);
- ContextRoot contextRoot2 = new ContextRoot('/pkg2', []);
+ ContextRoot contextRoot1 = _newContextRoot('/pkg1');
+ ContextRoot contextRoot2 = _newContextRoot('/pkg2');
plugin.addContextRoot(contextRoot1);
expect(plugin.contextRoots, unorderedEquals([contextRoot1]));
plugin.addContextRoot(contextRoot2);
@@ -202,7 +206,7 @@
io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
await withPlugin(test: (String pluginPath) async {
- ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+ ContextRoot contextRoot = _newContextRoot(pkgPath);
await manager.addPluginToContextRoot(contextRoot, pluginPath);
await manager.stopAll();
});
@@ -217,7 +221,7 @@
// io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
// String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
// await withPubspecPlugin(test: (String pluginPath) async {
-// ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+// ContextRoot contextRoot = _newContextRoot(pkgPath);
// await manager.addPluginToContextRoot(contextRoot, pluginPath);
// String packagesPath =
// resourceProvider.pathContext.join(pluginPath, '.packages');
@@ -238,7 +242,7 @@
await withPlugin(
pluginName: 'plugin2',
test: (String plugin2Path) async {
- ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+ ContextRoot contextRoot = _newContextRoot(pkgPath);
await manager.addPluginToContextRoot(contextRoot, plugin1Path);
await manager.addPluginToContextRoot(contextRoot, plugin2Path);
@@ -264,7 +268,7 @@
await withPlugin(
pluginName: 'plugin2',
test: (String plugin2Path) async {
- ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+ ContextRoot contextRoot = _newContextRoot(pkgPath);
await manager.addPluginToContextRoot(contextRoot, plugin1Path);
await manager.addPluginToContextRoot(contextRoot, plugin2Path);
@@ -285,7 +289,7 @@
await withPlugin(
pluginName: 'plugin1',
test: (String plugin1Path) async {
- ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+ ContextRoot contextRoot = _newContextRoot(pkgPath);
await manager.addPluginToContextRoot(contextRoot, plugin1Path);
List<PluginInfo> plugins = manager.pluginsForContextRoot(contextRoot);
expect(plugins, hasLength(1));
@@ -311,7 +315,7 @@
await withPlugin(
pluginName: 'plugin2',
test: (String plugin2Path) async {
- ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+ ContextRoot contextRoot = _newContextRoot(pkgPath);
await manager.addPluginToContextRoot(contextRoot, plugin1Path);
await manager.addPluginToContextRoot(contextRoot, plugin2Path);
@@ -333,7 +337,7 @@
io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
await withPlugin(test: (String pluginPath) async {
- ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+ ContextRoot contextRoot = _newContextRoot(pkgPath);
await manager.addPluginToContextRoot(contextRoot, pluginPath);
List<PluginInfo> plugins = manager.pluginsForContextRoot(contextRoot);
@@ -349,7 +353,7 @@
io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
await withPlugin(test: (String pluginPath) async {
- ContextRoot contextRoot = new ContextRoot(pkgPath, []);
+ ContextRoot contextRoot = _newContextRoot(pkgPath);
await manager.addPluginToContextRoot(contextRoot, pluginPath);
manager.removedContextRoot(contextRoot);
@@ -370,8 +374,8 @@
await withPlugin(
pluginName: 'plugin2',
test: (String plugin2Path) async {
- ContextRoot contextRoot1 = new ContextRoot(pkg1Path, []);
- ContextRoot contextRoot2 = new ContextRoot(pkg2Path, []);
+ ContextRoot contextRoot1 = _newContextRoot(pkg1Path);
+ ContextRoot contextRoot2 = _newContextRoot(pkg2Path);
await manager.addPluginToContextRoot(contextRoot1, plugin1Path);
await manager.addPluginToContextRoot(contextRoot1, plugin2Path);
await manager.addPluginToContextRoot(contextRoot2, plugin1Path);
@@ -415,7 +419,7 @@
}
void test_broadcastRequest_none() {
- ContextRoot contextRoot = new ContextRoot('/pkg1', []);
+ ContextRoot contextRoot = _newContextRoot('/pkg1');
Map<PluginInfo, Future<Response>> responses = manager.broadcastRequest(
new CompletionGetSuggestionsParams('/pkg1/lib/pkg1.dart', 100),
contextRoot: contextRoot);
@@ -498,7 +502,7 @@
}
void test_pluginsForContextRoot_none() {
- ContextRoot contextRoot = new ContextRoot('/pkg1', []);
+ ContextRoot contextRoot = _newContextRoot('/pkg1');
expect(manager.pluginsForContextRoot(contextRoot), isEmpty);
}
diff --git a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
index 8c372a6..0951011 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_watcher_test.dart
@@ -50,7 +50,8 @@
newFile(
'/pkg2/${PluginLocator.toolsFolderName}/${PluginLocator.defaultPluginFolderName}/bin/plugin.dart');
- ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
+ ContextRoot contextRoot =
+ new ContextRoot(resourceProvider.pathContext, pkg1Path, []);
TestDriver driver = new TestDriver(resourceProvider, contextRoot);
driver.analysisOptions.enabledPluginNames = ['pkg2'];
watcher.addedDriver(driver, contextRoot);
@@ -79,7 +80,8 @@
String pkg1Path = newFolder('/pkg1').path;
newFile('/pkg1/lib/test1.dart');
- ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
+ ContextRoot contextRoot =
+ new ContextRoot(resourceProvider.pathContext, pkg1Path, []);
TestDriver driver = new TestDriver(resourceProvider, contextRoot);
driver.analysisOptions.enabledPluginNames = ['pkg3'];
watcher.addedDriver(driver, contextRoot);
@@ -100,7 +102,8 @@
test_removedDriver() {
String pkg1Path = newFolder('/pkg1').path;
- ContextRoot contextRoot = new ContextRoot(pkg1Path, []);
+ ContextRoot contextRoot =
+ new ContextRoot(resourceProvider.pathContext, pkg1Path, []);
TestDriver driver = new TestDriver(resourceProvider, contextRoot);
watcher.addedDriver(driver, contextRoot);
watcher.removedDriver(driver);
diff --git a/pkg/analyzer/lib/src/context/context_root.dart b/pkg/analyzer/lib/src/context/context_root.dart
index a728860..1c32428 100644
--- a/pkg/analyzer/lib/src/context/context_root.dart
+++ b/pkg/analyzer/lib/src/context/context_root.dart
@@ -12,6 +12,11 @@
*/
class ContextRoot {
/**
+ * The path context to use when manipulating paths.
+ */
+ final path.Context pathContext;
+
+ /**
* The absolute path of the root directory containing the files to be
* analyzed.
*/
@@ -33,7 +38,7 @@
/**
* Initialize a newly created context root.
*/
- ContextRoot(this.root, this.exclude);
+ ContextRoot(this.pathContext, this.root, this.exclude);
@override
int get hashCode {
@@ -59,11 +64,11 @@
* directories.
*/
bool containsFile(String filePath) {
- if (!path.isWithin(root, filePath)) {
+ if (!pathContext.isWithin(root, filePath)) {
return false;
}
for (String excluded in exclude) {
- if (filePath == excluded || path.isWithin(excluded, filePath)) {
+ if (filePath == excluded || pathContext.isWithin(excluded, filePath)) {
return false;
}
}
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
index 628d28c..2d54d53 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -80,7 +80,9 @@
builder.performanceLog = performanceLog;
old.ContextRoot oldContextRoot = new old.ContextRoot(
- contextRoot.root.path, contextRoot.excludedPaths.toList());
+ resourceProvider.pathContext,
+ contextRoot.root.path,
+ contextRoot.excludedPaths.toList());
AnalysisDriver driver = builder.buildDriver(oldContextRoot);
DriverBasedAnalysisContext context =
new DriverBasedAnalysisContext(resourceProvider, contextRoot, driver);
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index e53835f..5d290be 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -100,8 +100,10 @@
builder.performanceLog = performanceLog;
List<AnalysisContext> contextList = <AnalysisContext>[];
for (ContextRoot root in roots) {
- old.ContextRoot contextRoot =
- new old.ContextRoot(root.root.path, root.excludedPaths.toList());
+ old.ContextRoot contextRoot = new old.ContextRoot(
+ resourceProvider.pathContext,
+ root.root.path,
+ root.excludedPaths.toList());
AnalysisDriver driver = builder.buildDriver(contextRoot);
DriverBasedAnalysisContext context =
new DriverBasedAnalysisContext(resourceProvider, root, driver);
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index bf98050..0d4084c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -95,7 +95,7 @@
/**
* The version of data format, should be incremented on every format change.
*/
- static const int DATA_VERSION = 58;
+ static const int DATA_VERSION = 59;
/**
* The number of exception contexts allowed to write. Once this field is
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 052b7ba..a706a0d 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1979,7 +1979,7 @@
push(prefix);
} else if (prefix is SimpleIdentifier) {
// TODO(paulberry): resolve [identifier]. Note that BodyBuilder handles
- // this situation using SendAccessor.
+ // this situation using SendAccessGenerator.
push(ast.prefixedIdentifier(prefix, period, identifier));
} else {
// TODO(paulberry): implement.
diff --git a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
index 52839a7..1f3035f 100644
--- a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
@@ -6,8 +6,6 @@
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/src/dart/ast/ast_factory.dart';
import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
-import 'package:front_end/src/fasta/kernel/body_builder.dart'
- show Identifier, Operator;
import 'package:front_end/src/fasta/kernel/forest.dart';
import 'package:kernel/ast.dart' as kernel;
@@ -60,9 +58,31 @@
Expression asExpression(Expression expression, type, Token location) =>
astFactory.asExpression(expression, location, type);
+ @override
Expression asLiteralString(Expression value) => value;
@override
+ ConstructorInitializer assertInitializer(
+ Token assertKeyword,
+ Token leftParenthesis,
+ Expression condition,
+ Token comma,
+ Expression message) =>
+ astFactory.assertInitializer(assertKeyword, leftParenthesis, condition,
+ comma, message, leftParenthesis.endGroup);
+
+ @override
+ Statement assertStatement(
+ Token assertKeyword,
+ Token leftParenthesis,
+ Expression condition,
+ Token comma,
+ Expression message,
+ Token semicolon) =>
+ astFactory.assertStatement(assertKeyword, leftParenthesis, condition,
+ comma, message, leftParenthesis.endGroup, semicolon);
+
+ @override
Expression awaitExpression(Expression operand, Token awaitKeyword) =>
astFactory.awaitExpression(awaitKeyword, operand);
@@ -71,6 +91,12 @@
astFactory.block(openBrace, statements, closeBrace);
@override
+ Statement breakStatement(
+ Token breakKeyword, Identifier label, Token semicolon) =>
+ astFactory.breakStatement(
+ breakKeyword, astFactory.simpleIdentifier(label.token), semicolon);
+
+ @override
kernel.Arguments castArguments(_Arguments arguments) {
// TODO(brianwilkerson) Implement this or remove it from the API.
throw new UnimplementedError();
@@ -89,6 +115,12 @@
condition, question, thenExpression, colon, elseExpression);
@override
+ Statement continueStatement(
+ Token continueKeyword, Identifier label, Token semicolon) =>
+ astFactory.continueStatement(
+ continueKeyword, astFactory.simpleIdentifier(label.token), semicolon);
+
+ @override
Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
ParenthesizedExpression condition, Token semicolon) =>
astFactory.doStatement(
@@ -104,6 +136,7 @@
Statement emptyStatement(Token semicolon) =>
astFactory.emptyStatement(semicolon);
+ @override
Statement expressionStatement(Expression expression, Token semicolon) =>
astFactory.expressionStatement(expression, semicolon);
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index a7b6f00..2d36b5a 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -1158,7 +1158,9 @@
@override
void handleImportPrefix(Token deferredKeyword, Token asKeyword) {
- expectIn('Import');
+ // This event normally happens within "Import",
+ // but happens within "CompilationUnit" during recovery.
+ expectInOneOf(const ['Import', 'CompilationUnit']);
listener.handleImportPrefix(deferredKeyword, asKeyword);
}
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
index 425b0a0..1ec29cc 100644
--- a/pkg/analyzer/test/generated/parser_forest_test.dart
+++ b/pkg/analyzer/test/generated/parser_forest_test.dart
@@ -3181,6 +3181,8 @@
@failingTest
void test_parsePrimaryExpression_const() {
super.test_parsePrimaryExpression_const();
+ fail(
+ 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
}
@failingTest
@@ -4017,6 +4019,11 @@
}
@failingTest
+ void test_combinator_badIdentifier() {
+ super.test_combinator_badIdentifier();
+ }
+
+ @failingTest
void test_combinator_missingIdentifier() {
super.test_combinator_missingIdentifier();
}
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 611ee186..56f90ba 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -10787,6 +10787,25 @@
: [ParserErrorCode.EXPECTED_TOKEN]);
}
+ void test_combinator_badIdentifier() {
+ createParser('import "/testB.dart" show @');
+ parser.parseCompilationUnit2();
+ listener.assertErrors(usingFastaParser
+ ? [
+ expectedError(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
+ expectedError(ParserErrorCode.EXPECTED_TOKEN, 27, 0),
+ expectedError(
+ ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE, 27, 0),
+ expectedError(ParserErrorCode.EXPECTED_TOKEN, 27, 0)
+ ]
+ : [
+ expectedError(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
+ expectedError(ParserErrorCode.EXPECTED_TOKEN, 26, 1),
+ expectedError(ParserErrorCode.MISSING_IDENTIFIER, 26, 1),
+ expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 27, 1)
+ ]);
+ }
+
void test_combinator_missingIdentifier() {
createParser('import "/testB.dart" show ;');
parser.parseCompilationUnit2();
@@ -13558,15 +13577,6 @@
expect(arguments, hasLength(1));
}
- void test_parseArgumentList_typeArguments_prefixed() {
- createParser('(a<b,p.c>(d))');
- ArgumentList argumentList = parser.parseArgumentList();
- expectNotNullIfNoErrors(argumentList);
- assertNoErrors();
- NodeList<Expression> arguments = argumentList.arguments;
- expect(arguments, hasLength(1));
- }
-
void test_parseArgumentList_typeArguments_none() {
createParser('(a<b,p.q.c>(d))');
ArgumentList argumentList = parser.parseArgumentList();
@@ -13576,6 +13586,15 @@
expect(arguments, hasLength(2));
}
+ void test_parseArgumentList_typeArguments_prefixed() {
+ createParser('(a<b,p.c>(d))');
+ ArgumentList argumentList = parser.parseArgumentList();
+ expectNotNullIfNoErrors(argumentList);
+ assertNoErrors();
+ NodeList<Expression> arguments = argumentList.arguments;
+ expect(arguments, hasLength(1));
+ }
+
void test_parseCombinators_h() {
createParser('hide a');
List<Combinator> combinators = parser.parseCombinators();
@@ -14716,7 +14735,10 @@
}
void test_parseBreakStatement_label() {
- var statement = parseStatement('break foo;') as BreakStatement;
+ LabeledStatement labeledStatement =
+ parseStatement('foo: while (true) { break foo; }');
+ WhileStatement whileStatement = labeledStatement.statement;
+ BreakStatement statement = (whileStatement.body as Block).statements[0];
assertNoErrors();
expect(statement.breakKeyword, isNotNull);
expect(statement.label, isNotNull);
@@ -14724,24 +14746,30 @@
}
void test_parseBreakStatement_noLabel() {
- var statement = parseStatement('break;') as BreakStatement;
- assertErrorsWithCodes([ParserErrorCode.BREAK_OUTSIDE_OF_LOOP]);
+ WhileStatement whileStatement = parseStatement('while (true) { break; }');
+ BreakStatement statement = (whileStatement.body as Block).statements[0];
+ assertNoErrors();
expect(statement.breakKeyword, isNotNull);
expect(statement.label, isNull);
expect(statement.semicolon, isNotNull);
}
void test_parseContinueStatement_label() {
- var statement = parseStatement('continue foo;') as ContinueStatement;
- assertErrorsWithCodes([ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+ LabeledStatement labeledStatement =
+ parseStatement('foo: while (true) { continue foo; }');
+ WhileStatement whileStatement = labeledStatement.statement;
+ ContinueStatement statement = (whileStatement.body as Block).statements[0];
+ assertNoErrors();
expect(statement.continueKeyword, isNotNull);
expect(statement.label, isNotNull);
expect(statement.semicolon, isNotNull);
}
void test_parseContinueStatement_noLabel() {
- var statement = parseStatement('continue;') as ContinueStatement;
- assertErrorsWithCodes([ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP]);
+ WhileStatement whileStatement =
+ parseStatement('while (true) { continue; }');
+ ContinueStatement statement = (whileStatement.body as Block).statements[0];
+ assertNoErrors();
expect(statement.continueKeyword, isNotNull);
expect(statement.label, isNull);
expect(statement.semicolon, isNotNull);
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 17789d4368..dc970a1 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -891,7 +891,7 @@
- empty_constructor_bodies
''');
- ContextRoot root = new ContextRoot(path, []);
+ ContextRoot root = new ContextRoot(pathContext, path, []);
builder.getAnalysisOptions(path, contextRoot: root);
expect(root.optionsFilePath, equals(filePath));
}
diff --git a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
index ab21c64..99320a1 100644
--- a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
+++ b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
@@ -21,8 +21,7 @@
import 'package:front_end/src/fasta/constant_context.dart';
import 'package:front_end/src/fasta/dill/dill_target.dart';
import "package:front_end/src/fasta/fasta_codes.dart";
-import 'package:front_end/src/fasta/kernel/body_builder.dart' hide Identifier;
-import 'package:front_end/src/fasta/kernel/forest.dart';
+import 'package:front_end/src/fasta/kernel/forest.dart' hide Identifier;
import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
import "package:front_end/src/fasta/kernel/kernel_target.dart";
import 'package:front_end/src/fasta/modifier.dart' as Modifier;
@@ -514,7 +513,7 @@
false /* strong mode */,
));
- BodyBuilder builder = new AstBodyBuilder(
+ AstBodyBuilder builder = new AstBodyBuilder(
library,
procedureBuilder,
library.scope,
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
index 1b2fdee..06105e3 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/annotation_test.dart
@@ -12,47 +12,116 @@
class AnnotationTest extends PartialCodeTest {
buildAll() {
- List<TestDescriptor> descriptors = <TestDescriptor>[
- new TestDescriptor(
- 'ampersand',
- '@',
- [ParserErrorCode.MISSING_IDENTIFIER],
- '@_s_',
- allFailing: true,
- ),
- new TestDescriptor(
- 'leftParen',
- '@a(',
- [ParserErrorCode.EXPECTED_TOKEN],
- '@a()',
- allFailing: true,
- ),
- ];
buildTests(
'annotation_topLevel',
- expectErrors(descriptors, [ParserErrorCode.EXPECTED_EXECUTABLE]),
+ [
+ new TestDescriptor(
+ 'ampersand',
+ '@',
+ [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.EXPECTED_EXECUTABLE
+ ],
+ '@_s_',
+ expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_EXECUTABLE]),
+ new TestDescriptor(
+ 'leftParen',
+ '@a(',
+ [
+ ScannerErrorCode.EXPECTED_TOKEN,
+ ParserErrorCode.EXPECTED_EXECUTABLE
+ ],
+ '@a()',
+ expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_EXECUTABLE]),
+ ],
[],
);
buildTests(
'annotation_topLevel',
- descriptors,
+ [
+ new TestDescriptor(
+ 'ampersand', '@', [ParserErrorCode.MISSING_IDENTIFIER], '@_s_',
+ failing: ['typedef', 'functionNonVoid', 'getter', 'setter']),
+ new TestDescriptor(
+ 'leftParen', '@a(', [ScannerErrorCode.EXPECTED_TOKEN], '@a()',
+ allFailing: true),
+ ],
PartialCodeTest.declarationSuffixes,
includeEof: false,
);
+
buildTests(
'annotation_classMember',
- descriptors,
- PartialCodeTest.classMemberSuffixes,
+ [
+ new TestDescriptor(
+ 'ampersand',
+ '@',
+ [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.EXPECTED_CLASS_MEMBER
+ ],
+ '@_s_',
+ expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_CLASS_MEMBER]),
+ new TestDescriptor(
+ 'leftParen',
+ '@a(',
+ [
+ ScannerErrorCode.EXPECTED_TOKEN,
+ ParserErrorCode.EXPECTED_CLASS_MEMBER
+ ],
+ '@a()',
+ expectedErrorsInValidCode: [ParserErrorCode.EXPECTED_CLASS_MEMBER]),
+ ],
+ [],
head: 'class C { ',
tail: ' }',
);
buildTests(
+ 'annotation_classMember',
+ [
+ new TestDescriptor(
+ 'ampersand', '@', [ParserErrorCode.MISSING_IDENTIFIER], '@_s_',
+ failing: ['methodNonVoid', 'getter', 'setter']),
+ new TestDescriptor(
+ 'leftParen', '@a(', [ScannerErrorCode.EXPECTED_TOKEN], '@a()',
+ allFailing: true),
+ ],
+ PartialCodeTest.classMemberSuffixes,
+ includeEof: false,
+ head: 'class C { ',
+ tail: ' }',
+ );
+
+ buildTests(
'annotation_local',
- expectErrors(descriptors, [
- ParserErrorCode.EXPECTED_TOKEN,
- ParserErrorCode.EXPECTED_TYPE_NAME,
- ParserErrorCode.MISSING_IDENTIFIER,
- ]),
+ [
+ new TestDescriptor(
+ 'ampersand',
+ '@',
+ [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.EXPECTED_TOKEN,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ],
+ '@_s_',
+ expectedErrorsInValidCode: [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.EXPECTED_TOKEN
+ ]),
+ new TestDescriptor(
+ 'leftParen',
+ '@a(',
+ [
+ ScannerErrorCode.EXPECTED_TOKEN,
+ ParserErrorCode.EXPECTED_TOKEN,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ],
+ '@a()',
+ expectedErrorsInValidCode: [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.EXPECTED_TOKEN
+ ]),
+ ],
[],
head: 'f() { ',
tail: ' }',
@@ -60,24 +129,71 @@
// TODO(brianwilkerson) Many of the combinations produced by the following
// produce "valid" code that is not valid. Even when we recover the
// annotation, the following statement is not allowed to have an annotation.
+ const localAllowed = const [
+ 'localVariable',
+ 'localFunctionNonVoid',
+ 'localFunctionVoid'
+ ];
+ List<TestSuffix> localAnnotationAllowedSuffixes = PartialCodeTest
+ .statementSuffixes
+ .where((t) => localAllowed.contains(t.name))
+ .toList();
+ List<TestSuffix> localAnnotationNotAllowedSuffixes = PartialCodeTest
+ .statementSuffixes
+ .where((t) => !localAllowed.contains(t.name))
+ .toList();
+
buildTests(
'annotation_local',
- descriptors,
- PartialCodeTest.statementSuffixes,
- head: 'f() { ',
+ [
+ new TestDescriptor(
+ 'ampersand', '@', [ParserErrorCode.MISSING_IDENTIFIER], '@_s_',
+ failing: ['localFunctionNonVoid']),
+ new TestDescriptor(
+ 'leftParen', '@a(', [ParserErrorCode.MISSING_IDENTIFIER], '@a()',
+ allFailing: true),
+ ],
+ localAnnotationAllowedSuffixes,
includeEof: false,
+ head: 'f() { ',
+ tail: ' }',
+ );
+ buildTests(
+ 'annotation_local',
+ [
+ new TestDescriptor(
+ 'ampersand',
+ '@',
+ [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.EXPECTED_TOKEN,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ],
+ '@_s_',
+ expectedErrorsInValidCode: [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.EXPECTED_TOKEN
+ ],
+ failing: ['labeled']),
+ new TestDescriptor(
+ 'leftParen',
+ '@a(',
+ [
+ ScannerErrorCode.EXPECTED_TOKEN,
+ ParserErrorCode.EXPECTED_TOKEN,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ],
+ '@a()',
+ expectedErrorsInValidCode: [
+ ParserErrorCode.MISSING_IDENTIFIER,
+ ParserErrorCode.EXPECTED_TOKEN
+ ],
+ allFailing: true),
+ ],
+ localAnnotationNotAllowedSuffixes,
+ includeEof: false,
+ head: 'f() { ',
tail: ' }',
);
}
-
- /**
- * Return a list of descriptors just like the given [descriptors] except that
- * they have the given list of [errors] as the errors that are expected to be
- * in the valid code.
- */
- List<TestDescriptor> expectErrors(
- List<TestDescriptor> descriptors, List<ParserErrorCode> errors) =>
- descriptors
- .map((descriptor) => descriptor.withExpectedErrorsInValidCode(errors))
- .toList();
}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
index 7c73192..fda0f64 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/export_directive_test.dart
@@ -12,20 +12,6 @@
class ExportDirectivesTest extends PartialCodeTest {
buildAll() {
- List<String> allExceptEof = <String>[
- 'import',
- 'export',
- 'part',
- 'class',
- 'typedef',
- 'functionVoid',
- 'functionNonVoid',
- 'var',
- 'const',
- 'final',
- 'getter',
- 'setter'
- ];
buildTests(
'export_directive',
[
@@ -51,7 +37,7 @@
ParserErrorCode.EXPECTED_TOKEN
],
"export 'a.dart' hide _s_;",
- failing: allExceptEof),
+ failing: ['functionNonVoid', 'getter']),
new TestDescriptor('hideName', "export 'a.dart' hide A",
[ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' hide A;"),
new TestDescriptor(
@@ -62,7 +48,7 @@
ParserErrorCode.EXPECTED_TOKEN
],
"export 'a.dart' hide A, _s_;",
- failing: allExceptEof),
+ failing: ['functionNonVoid', 'getter']),
new TestDescriptor('hideCommaName', "export 'a.dart' hide A, B",
[ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' hide A, B;"),
new TestDescriptor(
@@ -73,7 +59,7 @@
ParserErrorCode.EXPECTED_TOKEN
],
"export 'a.dart' hide A show _s_;",
- failing: allExceptEof),
+ failing: ['functionNonVoid', 'getter']),
new TestDescriptor(
'show',
"export 'a.dart' show",
@@ -82,7 +68,7 @@
ParserErrorCode.EXPECTED_TOKEN
],
"export 'a.dart' show _s_;",
- failing: allExceptEof),
+ failing: ['functionNonVoid', 'getter']),
new TestDescriptor('showName', "export 'a.dart' show A",
[ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' show A;"),
new TestDescriptor(
@@ -93,7 +79,7 @@
ParserErrorCode.EXPECTED_TOKEN
],
"export 'a.dart' show A, _s_;",
- failing: allExceptEof),
+ failing: ['functionNonVoid', 'getter']),
new TestDescriptor('showCommaName', "export 'a.dart' show A, B",
[ParserErrorCode.EXPECTED_TOKEN], "export 'a.dart' show A, B;"),
new TestDescriptor(
@@ -104,7 +90,7 @@
ParserErrorCode.EXPECTED_TOKEN
],
"export 'a.dart' show A hide _s_;",
- failing: allExceptEof),
+ failing: ['functionNonVoid', 'getter']),
],
PartialCodeTest.prePartSuffixes);
}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
index dd46a45..4c1c8e1 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/import_directive_test.dart
@@ -85,6 +85,15 @@
],
"import 'a.dart' as _s_;",
failing: ['functionNonVoid', 'getter']),
+ new TestDescriptor(
+ 'show',
+ "import 'a.dart' show",
+ [
+ ParserErrorCode.EXPECTED_TOKEN,
+ ParserErrorCode.MISSING_IDENTIFIER
+ ],
+ "import 'a.dart' show _s_;",
+ failing: ['functionNonVoid', 'getter']),
],
PartialCodeTest.prePartSuffixes);
}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
index 7432c7f..24b5890 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/part_of_directive_test.dart
@@ -12,17 +12,18 @@
class PartOfDirectivesTest extends PartialCodeTest {
buildAll() {
- List<String> allExceptEof = <String>[
- 'class',
+ List<String> identifiers = const [
'typedef',
- 'functionVoid',
'functionNonVoid',
- 'var',
- 'const',
- 'final',
'getter',
'setter'
];
+ List<TestSuffix> identifierSuffixes = PartialCodeTest.declarationSuffixes
+ .where((t) => identifiers.contains(t.name))
+ .toList();
+ List<TestSuffix> nonIdentifierSuffixes = PartialCodeTest.declarationSuffixes
+ .where((t) => !identifiers.contains(t.name))
+ .toList();
buildTests(
'part_of_directive',
[
@@ -30,11 +31,31 @@
'keyword',
'part of',
[
- ParserErrorCode.MISSING_NAME_IN_PART_OF_DIRECTIVE,
+ ParserErrorCode.EXPECTED_STRING_LITERAL,
+ ParserErrorCode.EXPECTED_TOKEN
+ ],
+ 'part of "";',
+ failing: []),
+ ],
+ nonIdentifierSuffixes);
+ buildTests(
+ 'part_of_directive',
+ [
+ new TestDescriptor(
+ 'keyword',
+ 'part of',
+ [
+ ParserErrorCode.MISSING_IDENTIFIER,
ParserErrorCode.EXPECTED_TOKEN
],
'part of _s_;',
- allFailing: true),
+ failing: ['functionNonVoid', 'getter']),
+ ],
+ identifierSuffixes,
+ includeEof: false);
+ buildTests(
+ 'part_of_directive',
+ [
new TestDescriptor('name', 'part of lib',
[ParserErrorCode.EXPECTED_TOKEN], 'library lib;',
allFailing: true),
@@ -46,7 +67,7 @@
ParserErrorCode.EXPECTED_TOKEN
],
'part of lib._s_;',
- failing: allExceptEof),
+ failing: ['functionNonVoid', 'getter']),
new TestDescriptor('nameDotName', 'part of lib.a',
[ParserErrorCode.EXPECTED_TOKEN], 'part of lib.a;'),
new TestDescriptor('emptyUri', "part of ''",
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
index faaddf6..533c856 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/partial_code_support.dart
@@ -260,17 +260,6 @@
*/
TestDescriptor(this.name, this.invalid, this.errorCodes, this.valid,
{this.allFailing: false, this.failing, this.expectedErrorsInValidCode});
-
- /**
- * Return a new description that is exactly like this descriptor except with
- * the given [expectedErrorsInValidCode].
- */
- TestDescriptor withExpectedErrorsInValidCode(
- List<ErrorCode> expectedErrorsInValidCode) =>
- new TestDescriptor(name, invalid, errorCodes, valid,
- allFailing: allFailing,
- failing: failing,
- expectedErrorsInValidCode: expectedErrorsInValidCode);
}
/**
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
index af85dc1..d9da37e 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/try_statement_test.dart
@@ -43,7 +43,12 @@
ParserErrorCode.EXPECTED_TOKEN
],
"try {} on _s_ {}",
- failing: allExceptEof),
+ failing: [
+ 'block',
+ 'labeled',
+ 'localFunctionNonVoid',
+ 'localFunctionVoid'
+ ]),
new TestDescriptor('on_identifier', 'try {} on A',
[ParserErrorCode.EXPECTED_TOKEN], "try {} on A {}",
failing: ['block']),
diff --git a/pkg/build_integration/README.md b/pkg/build_integration/README.md
new file mode 100644
index 0000000..2b97b10
--- /dev/null
+++ b/pkg/build_integration/README.md
@@ -0,0 +1,4 @@
+## Package build\_integration
+
+This package contains libraries for integrating Dart tools with build systems
+like bazel and build\_runner.
diff --git a/pkg/front_end/lib/src/multi_root_file_system.dart b/pkg/build_integration/lib/file_system/multi_root.dart
similarity index 95%
rename from pkg/front_end/lib/src/multi_root_file_system.dart
rename to pkg/build_integration/lib/file_system/multi_root.dart
index a30e75f..1163d39 100644
--- a/pkg/front_end/lib/src/multi_root_file_system.dart
+++ b/pkg/build_integration/lib/file_system/multi_root.dart
@@ -2,9 +2,6 @@
// 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.
-/// A file system that implements [CopilerOptions.multiRoots].
-library front_end.src.multi_roots_file_system;
-
import 'dart:async';
import 'package:front_end/src/api_prototype/file_system.dart';
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
new file mode 100644
index 0000000..cb58f97
--- /dev/null
+++ b/pkg/build_integration/pubspec.yaml
@@ -0,0 +1,9 @@
+name: build_integration
+version: 0.0.1
+author: Dart Team <misc@dartlang.org>
+description: >
+ Libraries for integrating Dart tools with build systems like bazel
+ and build_runner.
+homepage: https://github.com/dart-lang/sdk/tree/master/pkg/build_integration
+dependencies:
+ front_end: ^0.1.0
diff --git a/pkg/front_end/test/src/multi_root_file_system_test.dart b/pkg/build_integration/test/file_system/multi_root_test.dart
similarity index 97%
rename from pkg/front_end/test/src/multi_root_file_system_test.dart
rename to pkg/build_integration/test/file_system/multi_root_test.dart
index 9a29993..e86fc3f 100644
--- a/pkg/front_end/test/src/multi_root_file_system_test.dart
+++ b/pkg/build_integration/test/file_system/multi_root_test.dart
@@ -6,8 +6,8 @@
import 'dart:async';
+import 'package:build_integration/file_system/multi_root.dart';
import 'package:front_end/src/api_prototype/memory_file_system.dart';
-import 'package:front_end/src/multi_root_file_system.dart';
import 'package:test/test.dart';
diff --git a/pkg/compiler/lib/src/constant_system_dart.dart b/pkg/compiler/lib/src/constant_system_dart.dart
index b7201df..4179a3b 100644
--- a/pkg/compiler/lib/src/constant_system_dart.dart
+++ b/pkg/compiler/lib/src/constant_system_dart.dart
@@ -60,45 +60,45 @@
if (left.isInt && right.isInt) {
IntConstantValue leftInt = left;
IntConstantValue rightInt = right;
- int resultValue = foldInts(leftInt.intValue, rightInt.intValue);
+ BigInt resultValue = foldInts(leftInt.intValue, rightInt.intValue);
if (resultValue == null) return null;
return DART_CONSTANT_SYSTEM.createInt(resultValue);
}
return null;
}
- int foldInts(int left, int right);
+ BigInt foldInts(BigInt left, BigInt right);
}
class BitOrOperation extends BinaryBitOperation {
final String name = '|';
const BitOrOperation();
- int foldInts(int left, int right) => left | right;
+ BigInt foldInts(BigInt left, BigInt right) => left | right;
apply(left, right) => left | right;
}
class BitAndOperation extends BinaryBitOperation {
final String name = '&';
const BitAndOperation();
- int foldInts(int left, int right) => left & right;
+ BigInt foldInts(BigInt left, BigInt right) => left & right;
apply(left, right) => left & right;
}
class BitXorOperation extends BinaryBitOperation {
final String name = '^';
const BitXorOperation();
- int foldInts(int left, int right) => left ^ right;
+ BigInt foldInts(BigInt left, BigInt right) => left ^ right;
apply(left, right) => left ^ right;
}
class ShiftLeftOperation extends BinaryBitOperation {
final String name = '<<';
const ShiftLeftOperation();
- int foldInts(int left, int right) {
+ BigInt foldInts(BigInt left, BigInt right) {
// TODO(floitsch): find a better way to guard against excessive shifts to
// the left.
- if (right > 100 || right < 0) return null;
- return left << right;
+ if (right > new BigInt.from(100) || right < BigInt.zero) return null;
+ return left << right.toInt();
}
apply(left, right) => left << right;
@@ -107,9 +107,9 @@
class ShiftRightOperation extends BinaryBitOperation {
final String name = '>>';
const ShiftRightOperation();
- int foldInts(int left, int right) {
- if (right < 0) return null;
- return left >> right;
+ BigInt foldInts(BigInt left, BigInt right) {
+ if (right < BigInt.zero) return null;
+ return left >> right.toInt();
}
apply(left, right) => left >> right;
@@ -150,7 +150,7 @@
if (left.isNum && right.isNum) {
NumConstantValue leftNum = left;
NumConstantValue rightNum = right;
- num foldedValue;
+ var foldedValue;
if (left.isInt && right.isInt) {
IntConstantValue leftInt = leftNum;
IntConstantValue rightInt = rightNum;
@@ -161,7 +161,7 @@
// A division by 0 means that we might not have a folded value.
if (foldedValue == null) return null;
if (left.isInt && right.isInt && !isDivide() || isTruncatingDivide()) {
- assert(foldedValue is int);
+ assert(foldedValue is BigInt);
return DART_CONSTANT_SYSTEM.createInt(foldedValue);
} else {
return DART_CONSTANT_SYSTEM.createDouble(foldedValue);
@@ -172,13 +172,14 @@
bool isDivide() => false;
bool isTruncatingDivide() => false;
- num foldInts(int left, int right) => foldNums(left, right);
- num foldNums(num left, num right);
+ foldInts(BigInt left, BigInt right);
+ foldNums(num left, num right);
}
class SubtractOperation extends ArithmeticNumOperation {
final String name = '-';
const SubtractOperation();
+ BigInt foldInts(BigInt left, BigInt right) => left - right;
num foldNums(num left, num right) => left - right;
apply(left, right) => left - right;
}
@@ -186,6 +187,7 @@
class MultiplyOperation extends ArithmeticNumOperation {
final String name = '*';
const MultiplyOperation();
+ BigInt foldInts(BigInt left, BigInt right) => left * right;
num foldNums(num left, num right) => left * right;
apply(left, right) => left * right;
}
@@ -193,8 +195,8 @@
class ModuloOperation extends ArithmeticNumOperation {
final String name = '%';
const ModuloOperation();
- int foldInts(int left, int right) {
- if (right == 0) return null;
+ BigInt foldInts(BigInt left, BigInt right) {
+ if (right == BigInt.zero) return null;
return left % right;
}
@@ -205,6 +207,7 @@
class RemainderOperation extends ArithmeticNumOperation {
final String name = 'remainder';
const RemainderOperation();
+ BigInt foldInts(BigInt left, BigInt right) => null;
// Not a defined constant operation.
num foldNums(num left, num right) => null;
apply(left, right) => left.remainder(right);
@@ -213,15 +216,15 @@
class TruncatingDivideOperation extends ArithmeticNumOperation {
final String name = '~/';
const TruncatingDivideOperation();
- int foldInts(int left, int right) {
- if (right == 0) return null;
+ BigInt foldInts(BigInt left, BigInt right) {
+ if (right == BigInt.zero) return null;
return left ~/ right;
}
- num foldNums(num left, num right) {
+ BigInt foldNums(num left, num right) {
num ratio = left / right;
if (ratio.isNaN || ratio.isInfinite) return null;
- return ratio.truncate().toInt();
+ return new BigInt.from(ratio.truncate().toInt());
}
apply(left, right) => left ~/ right;
@@ -231,6 +234,7 @@
class DivideOperation extends ArithmeticNumOperation {
final String name = '/';
const DivideOperation();
+ double foldInts(BigInt left, BigInt right) => left / right;
num foldNums(num left, num right) => left / right;
bool isDivide() => true;
apply(left, right) => left / right;
@@ -243,7 +247,7 @@
if (left.isInt && right.isInt) {
IntConstantValue leftInt = left;
IntConstantValue rightInt = right;
- int result = leftInt.intValue + rightInt.intValue;
+ BigInt result = leftInt.intValue + rightInt.intValue;
return DART_CONSTANT_SYSTEM.createInt(result);
} else if (left.isNum && right.isNum) {
NumConstantValue leftNum = left;
@@ -281,14 +285,14 @@
return DART_CONSTANT_SYSTEM.createBool(foldedValue);
}
- bool foldInts(int left, int right);
+ bool foldInts(BigInt left, BigInt right);
bool foldNums(num left, num right);
}
class LessOperation extends RelationalNumOperation {
final String name = '<';
const LessOperation();
- bool foldInts(int left, int right) => left < right;
+ bool foldInts(BigInt left, BigInt right) => left < right;
bool foldNums(num left, num right) => left < right;
apply(left, right) => left < right;
}
@@ -296,7 +300,7 @@
class LessEqualOperation extends RelationalNumOperation {
final String name = '<=';
const LessEqualOperation();
- bool foldInts(int left, int right) => left <= right;
+ bool foldInts(BigInt left, BigInt right) => left <= right;
bool foldNums(num left, num right) => left <= right;
apply(left, right) => left <= right;
}
@@ -304,7 +308,7 @@
class GreaterOperation extends RelationalNumOperation {
final String name = '>';
const GreaterOperation();
- bool foldInts(int left, int right) => left > right;
+ bool foldInts(BigInt left, BigInt right) => left > right;
bool foldNums(num left, num right) => left > right;
apply(left, right) => left > right;
}
@@ -312,7 +316,7 @@
class GreaterEqualOperation extends RelationalNumOperation {
final String name = '>=';
const GreaterEqualOperation();
- bool foldInts(int left, int right) => left >= right;
+ bool foldInts(BigInt left, BigInt right) => left >= right;
bool foldNums(num left, num right) => left >= right;
apply(left, right) => left >= right;
}
@@ -387,10 +391,10 @@
StringConstantValue stringConstant = left;
IntConstantValue indexConstant = right;
String string = stringConstant.stringValue;
- int index = indexConstant.intValue;
+ int index = indexConstant.intValue.toInt();
if (index < 0 || index >= string.length) return null;
int value = string.codeUnitAt(index);
- return DART_CONSTANT_SYSTEM.createInt(value);
+ return DART_CONSTANT_SYSTEM.createIntFromInt(value);
}
return null;
}
@@ -442,7 +446,7 @@
const DartConstantSystem();
@override
- IntConstantValue createInt(int i) => new IntConstantValue(i);
+ IntConstantValue createInt(BigInt i) => new IntConstantValue(i);
@override
DoubleConstantValue createDouble(double d) => new DoubleConstantValue(d);
diff --git a/pkg/compiler/lib/src/constants/constant_system.dart b/pkg/compiler/lib/src/constants/constant_system.dart
index 2a3d5ee..c543720 100644
--- a/pkg/compiler/lib/src/constants/constant_system.dart
+++ b/pkg/compiler/lib/src/constants/constant_system.dart
@@ -59,7 +59,8 @@
const ConstantSystem();
- ConstantValue createInt(int i);
+ ConstantValue createInt(BigInt i);
+ ConstantValue createIntFromInt(int i) => createInt(new BigInt.from(i));
ConstantValue createDouble(double d);
ConstantValue createString(String string);
ConstantValue createBool(bool value);
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index b590b23..7916753 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -235,7 +235,7 @@
/// Integer literal constant.
class IntConstantExpression extends ConstantExpression {
- final int intValue;
+ final BigInt intValue;
IntConstantExpression(this.intValue);
@@ -1533,7 +1533,8 @@
return new NonConstantValue();
} else {
StringConstantValue stringValue = value;
- return constantSystem.createInt(stringValue.stringValue.length);
+ return constantSystem
+ .createInt(new BigInt.from(stringValue.stringValue.length));
}
}
@@ -1907,9 +1908,9 @@
StringConstantValue nameStringConstantValue = nameConstantValue;
String text =
environment.readFromEnvironment(nameStringConstantValue.stringValue);
- int value;
+ BigInt value;
if (text != null) {
- value = int.parse(text, onError: (_) => null);
+ value = BigInt.tryParse(text);
}
if (value == null) {
return defaultConstantValue;
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index abf5d5a..48f4397 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -205,55 +205,38 @@
}
class IntConstantValue extends NumConstantValue {
- final int intValue;
+ final BigInt intValue;
+
+ // Caching IntConstantValues representing -2 through 10 so that we don't have
+ // to create new ones every time those values are used.
+ static Map<BigInt, IntConstantValue> _cachedValues = {};
+
double get doubleValue => intValue.toDouble();
- factory IntConstantValue(int value) {
- switch (value) {
- case 0:
- return const IntConstantValue._internal(0);
- case 1:
- return const IntConstantValue._internal(1);
- case 2:
- return const IntConstantValue._internal(2);
- case 3:
- return const IntConstantValue._internal(3);
- case 4:
- return const IntConstantValue._internal(4);
- case 5:
- return const IntConstantValue._internal(5);
- case 6:
- return const IntConstantValue._internal(6);
- case 7:
- return const IntConstantValue._internal(7);
- case 8:
- return const IntConstantValue._internal(8);
- case 9:
- return const IntConstantValue._internal(9);
- case 10:
- return const IntConstantValue._internal(10);
- case -1:
- return const IntConstantValue._internal(-1);
- case -2:
- return const IntConstantValue._internal(-2);
- default:
- return new IntConstantValue._internal(value);
+ factory IntConstantValue(BigInt value) {
+ var existing = _cachedValues[value];
+ if (existing != null) return existing;
+ var intConstantVal = new IntConstantValue._internal(value);
+ var intValue = value.toInt();
+ if (intValue <= -2 && intValue >= 10) {
+ _cachedValues[value] = intConstantVal;
}
+ return intConstantVal;
}
const IntConstantValue._internal(this.intValue);
bool get isInt => true;
- bool isUInt31() => intValue >= 0 && intValue < (1 << 31);
+ bool isUInt31() => intValue.toUnsigned(31) == intValue;
- bool isUInt32() => intValue >= 0 && intValue < (1 << 32);
+ bool isUInt32() => intValue.toUnsigned(32) == intValue;
- bool isPositive() => intValue >= 0;
+ bool isPositive() => intValue >= BigInt.zero;
- bool get isZero => intValue == 0;
+ bool get isZero => intValue == BigInt.zero;
- bool get isOne => intValue == 1;
+ bool get isOne => intValue == BigInt.one;
DartType getType(CommonElements types) => types.intType;
@@ -264,7 +247,7 @@
return intValue == otherInt.intValue;
}
- int get hashCode => intValue & Hashing.SMI_MASK;
+ int get hashCode => intValue.hashCode & Hashing.SMI_MASK;
accept(ConstantValueVisitor visitor, arg) => visitor.visitInt(this, arg);
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 2998bbf..c995cfb 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -615,8 +615,8 @@
ConstantSystem constantSystem = _closedWorld.constantSystem;
// The JavaScript backend may turn this literal into a double at
// runtime.
- return _types.getConcreteTypeFor(
- computeTypeMask(_closedWorld, constantSystem.createInt(node.value)));
+ return _types.getConcreteTypeFor(computeTypeMask(
+ _closedWorld, constantSystem.createIntFromInt(node.value)));
}
@override
@@ -1012,7 +1012,7 @@
ConstantValue value = _elementMap.getFieldConstantValue(member);
if (value != null && value.isInt) {
IntConstantValue intValue = value;
- return intValue.intValue;
+ return intValue.intValue.toInt();
}
}
}
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 7188cf6..f1c234f 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -964,6 +964,7 @@
CodegenRegistry registry,
FunctionEntity element,
jsAst.Expression code,
+ DartType asyncTypeParameter,
SourceInformation bodySourceInformation,
SourceInformation exitSourceInformation) {
if (element.asyncMarker == AsyncMarker.SYNC) return code;
@@ -974,8 +975,8 @@
switch (element.asyncMarker) {
case AsyncMarker.ASYNC:
- rewriter = _makeAsyncRewriter(
- commonElements, elementEnvironment, registry, element, code, name);
+ rewriter = _makeAsyncRewriter(commonElements, elementEnvironment,
+ registry, element, code, asyncTypeParameter, name);
break;
case AsyncMarker.SYNC_STAR:
rewriter = new SyncStarRewriter(reporter, element,
@@ -983,8 +984,7 @@
emitter.staticFunctionAccess(commonElements.endOfIteration),
iterableFactory: emitter
.staticFunctionAccess(commonElements.syncStarIterableFactory),
- iterableFactoryTypeArguments:
- _fetchItemType(element, elementEnvironment),
+ iterableFactoryTypeArguments: _fetchItemType(asyncTypeParameter),
yieldStarExpression:
emitter.staticFunctionAccess(commonElements.yieldStar),
uncaughtErrorExpression: emitter
@@ -1006,8 +1006,7 @@
wrapBody: emitter.staticFunctionAccess(commonElements.wrapBody),
newController: emitter.staticFunctionAccess(
commonElements.asyncStarStreamControllerFactory),
- newControllerTypeArguments:
- _fetchItemType(element, elementEnvironment),
+ newControllerTypeArguments: _fetchItemType(asyncTypeParameter),
safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
yieldExpression:
emitter.staticFunctionAccess(commonElements.yieldSingle),
@@ -1024,22 +1023,15 @@
return rewriter.rewrite(code, bodySourceInformation, exitSourceInformation);
}
- /// Returns an optional expression that evaluates the type argument to the
- /// Future/Stream/Iterable.
- /// Returns an empty list if the type is not needed.
- /// Returns `null` if the type expression is determined by
- /// the outside context and should be added as a function parameter.
- List<jsAst.Expression> _fetchItemType(
- FunctionEntity element, ElementEnvironment elementEnvironment) {
- //DartType type =
- // elementEnvironment.getFunctionAsyncOrSyncStarElementType(element);
-
- //if (!type.containsFreeTypeVariables) {
- // var ast = rtiEncoder.getTypeRepresentation(emitter.emitter, type, null);
- // return <jsAst.Expression>[ast];
- //}
-
- return null;
+ /// Returns an optional expression that evaluates [type]. Returns `null` if
+ /// the type expression is determined by the outside context and should be
+ /// added as a function parameter to the rewritten code.
+ // TODO(sra): We could also return an empty list if the generator takes no
+ // type (e.g. due to rtiNeed optimization).
+ List<jsAst.Expression> _fetchItemType(DartType type) {
+ if (type == null) return null;
+ var ast = rtiEncoder.getTypeRepresentation(emitter.emitter, type, null);
+ return <jsAst.Expression>[ast];
}
AsyncRewriter _makeAsyncRewriter(
@@ -1048,6 +1040,7 @@
CodegenRegistry registry,
FunctionEntity element,
jsAst.Expression code,
+ DartType elementType,
jsAst.Name name) {
bool startAsyncSynchronously = compiler.options.startAsyncSynchronously;
@@ -1058,8 +1051,7 @@
? commonElements.asyncAwaitCompleterFactory
: commonElements.syncCompleterFactory;
- List<jsAst.Expression> itemTypeExpression =
- _fetchItemType(element, elementEnvironment);
+ List<jsAst.Expression> itemTypeExpression = _fetchItemType(elementType);
var rewriter = new AsyncRewriter(reporter, element,
asyncStart: emitter.staticFunctionAccess(startFunction),
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index c5915dc..7069820 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -120,7 +120,7 @@
@override
jsAst.Expression visitInt(IntConstantValue constant, [_]) {
- int value = constant.intValue;
+ BigInt value = constant.intValue;
// Since we are in JavaScript we can shorten long integers to their shorter
// exponential representation, for example: "1e4" is shorter than "10000".
//
@@ -131,9 +131,9 @@
String representation = value.toString();
String alternative = null;
int cutoff = _options.enableMinification ? 10000 : 1e10.toInt();
- if (value.abs() >= cutoff) {
- alternative =
- _shortenExponentialRepresentation(value.toStringAsExponential());
+ if (value.abs() >= new BigInt.from(cutoff)) {
+ alternative = _shortenExponentialRepresentation(
+ value.toDouble().toStringAsExponential());
}
if (alternative != null && alternative.length < representation.length) {
representation = alternative;
diff --git a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
index 26f845e..d454cf3 100644
--- a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
@@ -43,7 +43,7 @@
JavaScriptConstantCompiler();
- ConstantSystem get constantSystem => JAVA_SCRIPT_CONSTANT_SYSTEM;
+ ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
@override
void registerLazyStatic(FieldEntity element) {
diff --git a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
index a2bd855..cb869ee 100644
--- a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
@@ -11,18 +11,18 @@
import '../elements/types.dart';
import '../elements/entities.dart';
-const JAVA_SCRIPT_CONSTANT_SYSTEM = const JavaScriptConstantSystem();
-
class JavaScriptBitNotOperation extends BitNotOperation {
const JavaScriptBitNotOperation();
ConstantValue fold(ConstantValue constant) {
- if (JAVA_SCRIPT_CONSTANT_SYSTEM.isInt(constant)) {
+ if (JavaScriptConstantSystem.only.isInt(constant)) {
// In JavaScript we don't check for -0 and treat it as if it was zero.
- if (constant.isMinusZero) constant = DART_CONSTANT_SYSTEM.createInt(0);
+ if (constant.isMinusZero) {
+ constant = DART_CONSTANT_SYSTEM.createInt(BigInt.zero);
+ }
IntConstantValue intConstant = constant;
// We convert the result of bit-operations to 32 bit unsigned integers.
- return JAVA_SCRIPT_CONSTANT_SYSTEM.createInt32(~intConstant.intValue);
+ return JavaScriptConstantSystem.only.createInt32(~intConstant.intValue);
}
return null;
}
@@ -41,12 +41,16 @@
ConstantValue fold(ConstantValue left, ConstantValue right) {
// In JavaScript we don't check for -0 and treat it as if it was zero.
- if (left.isMinusZero) left = DART_CONSTANT_SYSTEM.createInt(0);
- if (right.isMinusZero) right = DART_CONSTANT_SYSTEM.createInt(0);
+ if (left.isMinusZero) {
+ left = DART_CONSTANT_SYSTEM.createInt(BigInt.zero);
+ }
+ if (right.isMinusZero) {
+ right = DART_CONSTANT_SYSTEM.createInt(BigInt.zero);
+ }
IntConstantValue result = dartBitOperation.fold(left, right);
if (result != null) {
// We convert the result of bit-operations to 32 bit unsigned integers.
- return JAVA_SCRIPT_CONSTANT_SYSTEM.createInt32(result.intValue);
+ return JavaScriptConstantSystem.only.createInt32(result.intValue);
}
return result;
}
@@ -61,9 +65,9 @@
// Truncate the input value to 32 bits if necessary.
if (left.isInt) {
IntConstantValue intConstant = left;
- int value = intConstant.intValue;
- int truncatedValue = value & JAVA_SCRIPT_CONSTANT_SYSTEM.BITS32;
- if (value < 0) {
+ BigInt value = intConstant.intValue;
+ BigInt truncatedValue = value & JavaScriptConstantSystem.only.BITS32;
+ if (value < BigInt.zero) {
// Sign-extend if the input was negative. The current semantics don't
// make much sense, since we only look at bit 31.
// TODO(floitsch): we should treat the input to right shifts as
@@ -74,8 +78,8 @@
// Example: 0xFFFFFFFF - 0x100000000 => -1.
// We simply and with the sign-bit and multiply by two. If the sign-bit
// was set, then the result is 0. Otherwise it will become 2^32.
- final int SIGN_BIT = 0x80000000;
- truncatedValue -= 2 * (truncatedValue & SIGN_BIT);
+ final BigInt SIGN_BIT = new BigInt.from(0x80000000);
+ truncatedValue -= BigInt.two * (truncatedValue & SIGN_BIT);
}
if (value != truncatedValue) {
left = DART_CONSTANT_SYSTEM.createInt(truncatedValue);
@@ -95,8 +99,8 @@
ConstantValue fold(ConstantValue constant) {
if (constant.isInt) {
IntConstantValue intConstant = constant;
- if (intConstant.intValue == 0) {
- return JAVA_SCRIPT_CONSTANT_SYSTEM.createDouble(-0.0);
+ if (intConstant.intValue == BigInt.zero) {
+ return JavaScriptConstantSystem.only.createDouble(-0.0);
}
}
return dartNegateOperation.fold(constant);
@@ -112,7 +116,7 @@
ConstantValue fold(ConstantValue left, ConstantValue right) {
ConstantValue result = _addOperation.fold(left, right);
if (result != null && result.isNum) {
- return JAVA_SCRIPT_CONSTANT_SYSTEM.convertToJavaScriptConstant(result);
+ return JavaScriptConstantSystem.only.convertToJavaScriptConstant(result);
}
return result;
}
@@ -125,8 +129,8 @@
const JavaScriptRemainderOperation();
- int foldInts(int left, int right) {
- if (right == 0) return null;
+ BigInt foldInts(BigInt left, BigInt right) {
+ if (right == BigInt.zero) return null;
return left.remainder(right);
}
@@ -144,7 +148,7 @@
ConstantValue fold(ConstantValue left, ConstantValue right) {
ConstantValue result = dartArithmeticOperation.fold(left, right);
if (result == null) return result;
- return JAVA_SCRIPT_CONSTANT_SYSTEM.convertToJavaScriptConstant(result);
+ return JavaScriptConstantSystem.only.convertToJavaScriptConstant(result);
}
apply(left, right) => dartArithmeticOperation.apply(left, right);
@@ -186,7 +190,7 @@
ConstantValue fold(ConstantValue constant) {
// Be careful to round() only values that do not throw on either the host or
// target platform.
- ConstantValue tryToRound(num value) {
+ ConstantValue tryToRound(double value) {
// Due to differences between browsers, only 'round' easy cases. Avoid
// cases where nudging the value up or down changes the answer.
// 13 digits is safely within the ~15 digit precision of doubles.
@@ -196,13 +200,13 @@
double rounded1 = (value * (1.0 + severalULP)).roundToDouble();
double rounded2 = (value * (1.0 - severalULP)).roundToDouble();
if (rounded != rounded1 || rounded != rounded2) return null;
- return JAVA_SCRIPT_CONSTANT_SYSTEM
- .convertToJavaScriptConstant(new IntConstantValue(value.round()));
+ return JavaScriptConstantSystem.only.convertToJavaScriptConstant(
+ new IntConstantValue(new BigInt.from(value.round())));
}
if (constant.isInt) {
IntConstantValue intConstant = constant;
- int value = intConstant.intValue;
+ double value = intConstant.intValue.toDouble();
if (value >= -double.maxFinite && value <= double.maxFinite) {
return tryToRound(value);
}
@@ -224,7 +228,7 @@
* compiled to JavaScript.
*/
class JavaScriptConstantSystem extends ConstantSystem {
- final int BITS32 = 0xFFFFFFFF;
+ final BITS32 = new BigInt.from(0xFFFFFFFF);
final add = const JavaScriptAddOperation();
final bitAnd = const JavaScriptBinaryBitOperation(const BitAndOperation());
@@ -260,13 +264,16 @@
final round = const JavaScriptRoundOperation();
final abs = const UnfoldedUnaryOperation('abs');
- const JavaScriptConstantSystem();
+ static final JavaScriptConstantSystem only =
+ new JavaScriptConstantSystem._internal();
+
+ JavaScriptConstantSystem._internal();
/**
* Returns true if [value] will turn into NaN or infinity
* at runtime.
*/
- bool integerBecomesNanOrInfinity(int value) {
+ bool integerBecomesNanOrInfinity(BigInt value) {
double doubleValue = value.toDouble();
return doubleValue.isNaN || doubleValue.isInfinite;
}
@@ -274,13 +281,13 @@
NumConstantValue convertToJavaScriptConstant(NumConstantValue constant) {
if (constant.isInt) {
IntConstantValue intConstant = constant;
- int intValue = intConstant.intValue;
+ BigInt intValue = intConstant.intValue;
if (integerBecomesNanOrInfinity(intValue)) {
return new DoubleConstantValue(intValue.toDouble());
}
// If the integer loses precision with JavaScript numbers, use
// the floored version JavaScript will use.
- int floorValue = intValue.toDouble().floor().toInt();
+ BigInt floorValue = new BigInt.from(intValue.toDouble());
if (floorValue != intValue) {
return new IntConstantValue(floorValue);
}
@@ -290,9 +297,9 @@
if (!doubleValue.isInfinite &&
!doubleValue.isNaN &&
!constant.isMinusZero) {
- int intValue = doubleValue.truncate();
- if (intValue == doubleValue) {
- return new IntConstantValue(intValue);
+ double truncated = doubleValue.truncateToDouble();
+ if (truncated == doubleValue) {
+ return new IntConstantValue(new BigInt.from(truncated));
}
}
}
@@ -300,11 +307,11 @@
}
@override
- NumConstantValue createInt(int i) {
+ NumConstantValue createInt(BigInt i) {
return convertToJavaScriptConstant(new IntConstantValue(i));
}
- NumConstantValue createInt32(int i) => new IntConstantValue(i & BITS32);
+ NumConstantValue createInt32(BigInt i) => new IntConstantValue(i & BITS32);
NumConstantValue createDouble(double d) =>
convertToJavaScriptConstant(new DoubleConstantValue(d));
StringConstantValue createString(String string) {
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index b732c81..4ce047a 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -1893,7 +1893,7 @@
@override
void visitInt(IntConstantValue constant, [_]) {
// No `addRoot` since IntConstants are always inlined.
- if (constant.intValue < 0) {
+ if (constant.intValue < BigInt.zero) {
add('m${-constant.intValue}');
} else {
add('${constant.intValue}');
@@ -2088,7 +2088,11 @@
@override
int visitInt(IntConstantValue constant, [_]) {
- return _hashInt(constant.intValue);
+ BigInt value = constant.intValue;
+ if (value.toSigned(32) == value) {
+ return value.toUnsigned(32).toInt() & _MASK;
+ }
+ return _hashDouble(value.toDouble());
}
@override
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart
index 43e81b6..c86157d 100644
--- a/pkg/compiler/lib/src/js_model/elements.dart
+++ b/pkg/compiler/lib/src/js_model/elements.dart
@@ -143,8 +143,9 @@
return new JConstructorBody(constructor);
}
- JGeneratorBody createGeneratorBody(FunctionEntity function) {
- return new JGeneratorBody(function);
+ JGeneratorBody createGeneratorBody(
+ FunctionEntity function, DartType elementType) {
+ return new JGeneratorBody(function, elementType);
}
IndexedFunction createGetter(LibraryEntity library,
@@ -504,9 +505,10 @@
class JGeneratorBody extends JFunction {
final FunctionEntity function;
+ final DartType elementType;
final int hashCode;
- JGeneratorBody(this.function)
+ JGeneratorBody(this.function, this.elementType)
: hashCode = function.hashCode + 1, // Hack stabilize sort order.
super(function.library, function.enclosingClass, function.memberName,
function.parameterStructure, function.asyncMarker,
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index c4c47a1..28e67b6 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -346,7 +346,7 @@
elementEnvironment: _elementEnvironment,
dartTypes: _elementMap.types,
commonElements: _commonElements,
- constantSystem: const JavaScriptConstantSystem(),
+ constantSystem: JavaScriptConstantSystem.only,
backendUsage: backendUsage,
noSuchMethodData: noSuchMethodData,
nativeData: nativeData,
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index a6e104d..fe02b86 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -1881,7 +1881,7 @@
KernelConstantEnvironment(this._elementMap, this._environment);
@override
- ConstantSystem get constantSystem => const JavaScriptConstantSystem();
+ ConstantSystem get constantSystem => JavaScriptConstantSystem.only;
ConstantValue _getConstantValue(
Spannable spannable, ConstantExpression expression,
@@ -2920,12 +2920,13 @@
}
JGeneratorBody getGeneratorBody(covariant IndexedFunction function) {
- FunctionData functionData = _members.getData(function);
- ir.TreeNode node = functionData.definition.node;
- // TODO(sra): Maybe store this in the FunctionData.
JGeneratorBody generatorBody = _generatorBodies[function];
if (generatorBody == null) {
- generatorBody = createGeneratorBody(function);
+ FunctionData functionData = _members.getData(function);
+ ir.TreeNode node = functionData.definition.node;
+ DartType elementType =
+ _elementEnvironment.getFunctionAsyncOrSyncStarElementType(function);
+ generatorBody = createGeneratorBody(function, elementType);
_members.register<IndexedFunction, FunctionData>(
generatorBody,
new GeneratorBodyFunctionData(
@@ -2942,7 +2943,8 @@
return generatorBody;
}
- JGeneratorBody createGeneratorBody(FunctionEntity function);
+ JGeneratorBody createGeneratorBody(
+ FunctionEntity function, DartType elementType);
}
class KernelClassQueries extends ClassQueries {
diff --git a/pkg/compiler/lib/src/kernel/element_map_mixins.dart b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
index a7f7901..c661c48 100644
--- a/pkg/compiler/lib/src/kernel/element_map_mixins.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_mixins.dart
@@ -295,7 +295,7 @@
assert(constant.fields.length == 1 || constant.fields.length == 2);
ConstantValue indexConstant = constant.fields.values.first;
if (indexConstant is IntConstantValue) {
- return indexConstant.intValue;
+ return indexConstant.intValue.toInt();
}
}
}
@@ -604,7 +604,7 @@
@override
ConstantExpression visitIntLiteral(ir.IntLiteral node) {
- return new IntConstantExpression(node.value);
+ return new IntConstantExpression(new BigInt.from(node.value));
}
@override
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 26834cf..c8a203c 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -1013,37 +1013,19 @@
isStatement: true));
}
- /// Builds a SSA graph for a sync*/async/async* generator.
+ /// Builds a SSA graph for a sync*/async/async* generator. We generate a
+ /// entry function which tail-calls a body function. The entry contains
+ /// per-invocation checks and the body, which is later transformed, contains
+ /// the re-entrant 'state machine' code.
void buildGenerator(FunctionEntity function, ir.FunctionNode functionNode) {
- // TODO(sra): Optimize by generating a merged entry + body when (1) there
- // are no checks in the entry and (2) the element type is simple.
- if (true == true) {
- buildGeneratorEntry(function, functionNode);
- } else {
- openFunction(function, functionNode);
- functionNode.body.accept(this);
- closeFunction();
- }
- }
-
- /// Builds a SSA graph for a sync*/async/async* generator body.
- void buildGeneratorEntry(
- FunctionEntity function, ir.FunctionNode functionNode) {
- graph.isGeneratorEntry = true;
-
- // TODO(sra): Omit entry checks.
openFunction(function, functionNode);
- // Generate type argument for generator class.
-
- // Tail-call body.
- JGeneratorBody body = _elementMap.getGeneratorBody(function);
- backend.outputUnitData.registerColocatedMembers(function, body);
+ // Prepare to tail-call the body.
// Is 'buildAsyncBody' the best location for the entry?
var sourceInformation = _sourceInformationBuilder.buildAsyncBody();
- // Forward all the parameters.
+ // Forward all the parameters to the body.
List<HInstruction> inputs = <HInstruction>[];
if (graph.thisInstruction != null) {
inputs.add(graph.thisInstruction);
@@ -1061,8 +1043,29 @@
// Add the type parameter for the generator's element type.
DartType elementType = _elementMap.elementEnvironment
.getAsyncOrSyncStarElementType(function.asyncMarker, _returnType);
- inputs.add(typeBuilder.analyzeTypeArgument(elementType, function));
+ if (elementType.containsFreeTypeVariables) {
+ // Type must be computed in the entry function, where the type variables
+ // are in scope, and passed to the body function.
+ inputs.add(typeBuilder.analyzeTypeArgument(elementType, function));
+ } else {
+ // Types with no type variables can be emitted as part of the generator,
+ // avoiding an extra argument.
+ if (_generatedEntryIsEmpty()) {
+ // If the entry function is empty (e.g. no argument checks) and the type
+ // can be generated in body, 'inline' the body by generating it in
+ // place. This works because the subsequent transformation of the code
+ // is 'correct' for the empty entry function code.
+ graph.needsAsyncRewrite = true;
+ graph.asyncElementType = elementType;
+ functionNode.body.accept(this);
+ closeFunction();
+ return;
+ }
+ }
+
+ JGeneratorBody body = _elementMap.getGeneratorBody(function);
+ backend.outputUnitData.registerColocatedMembers(function, body);
push(new HInvokeGeneratorBody(
body,
inputs,
@@ -1078,13 +1081,28 @@
/// Builds a SSA graph for a sync*/async/async* generator body.
void buildGeneratorBody(
JGeneratorBody function, ir.FunctionNode functionNode) {
- // TODO(sra): Omit entry checks.
FunctionEntity entry = function.function;
openFunction(entry, functionNode);
+ graph.needsAsyncRewrite = true;
+ if (!function.elementType.containsFreeTypeVariables) {
+ // We can generate the element type in place
+ graph.asyncElementType = function.elementType;
+ }
functionNode.body.accept(this);
closeFunction();
}
+ bool _generatedEntryIsEmpty() {
+ HBasicBlock block = current;
+ // If `block.id` is not 1 then we generated some control flow.
+ if (block.id != 1) return false;
+ for (HInstruction node = block.first; node != null; node = node.next) {
+ if (node is HGoto) continue;
+ return false;
+ }
+ return true;
+ }
+
void _potentiallyAddFunctionParameterTypeChecks(ir.FunctionNode function) {
// Put the type checks in the first successor of the entry,
// because that is where the type guards will also be inserted.
@@ -1107,6 +1125,7 @@
return;
}
HInstruction newParameter = localsHandler.directLocals[local];
+
newParameter = typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
newParameter, _getDartTypeIfValid(variable.type));
localsHandler.directLocals[local] = newParameter;
@@ -1225,20 +1244,20 @@
}
}
- void openFunction(MemberEntity member, [ir.FunctionNode function]) {
+ void openFunction(MemberEntity member, [ir.FunctionNode functionNode]) {
Map<Local, TypeMask> parameterMap = <Local, TypeMask>{};
- if (function != null) {
+ if (functionNode != null) {
void handleParameter(ir.VariableDeclaration node) {
Local local = localsMap.getLocalVariable(node);
parameterMap[local] =
_typeInferenceMap.getInferredTypeOfParameter(local);
}
- function.positionalParameters.forEach(handleParameter);
- function.namedParameters.toList()
+ functionNode.positionalParameters.forEach(handleParameter);
+ functionNode.namedParameters.toList()
..sort(namedOrdering)
..forEach(handleParameter);
- _returnType = _elementMap.getDartType(function.returnType);
+ _returnType = _elementMap.getDartType(functionNode.returnType);
}
HBasicBlock block = graph.addNewBlock();
@@ -1258,8 +1277,8 @@
_addClassTypeVariablesIfNeeded(member);
_addFunctionTypeVariablesIfNeeded(member);
- if (function != null) {
- _potentiallyAddFunctionParameterTypeChecks(function);
+ if (functionNode != null) {
+ _potentiallyAddFunctionParameterTypeChecks(functionNode);
}
_insertTraceCall(member);
_insertCoverageCall(member);
@@ -2361,7 +2380,9 @@
List<ConstantValue> getConstants(
ir.SwitchStatement parentSwitch, ir.SwitchCase switchCase) {
- return <ConstantValue>[constantSystem.createInt(caseIndex[switchCase])];
+ return <ConstantValue>[
+ constantSystem.createIntFromInt(caseIndex[switchCase])
+ ];
}
void buildSwitchCase(ir.SwitchCase switchCase) {
@@ -4278,7 +4299,7 @@
add(argumentNamesInstruction);
ConstantValue kindConstant =
- constantSystem.createInt(selector.invocationMirrorKind);
+ constantSystem.createIntFromInt(selector.invocationMirrorKind);
_pushStaticInvocation(
_commonElements.createInvocationMirror,
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 5d70634..1e94b01 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -47,7 +47,7 @@
String get name => 'SSA code generator';
- js.Fun buildJavaScriptFunction(bool isGeneratorEntry, FunctionEntity element,
+ js.Fun buildJavaScriptFunction(bool needsAsyncRewrite, FunctionEntity element,
List<js.Parameter> parameters, js.Block body) {
js.Fun finish(js.AsyncModifier asyncModifier) {
return new js.Fun(parameters, body, asyncModifier: asyncModifier)
@@ -56,15 +56,17 @@
.buildDeclaration(element));
}
- if (isGeneratorEntry) return finish(const js.AsyncModifier.sync());
-
- return finish(element.asyncMarker.isAsync
- ? (element.asyncMarker.isYielding
- ? const js.AsyncModifier.asyncStar()
- : const js.AsyncModifier.async())
- : (element.asyncMarker.isYielding
- ? const js.AsyncModifier.syncStar()
- : const js.AsyncModifier.sync()));
+ if (needsAsyncRewrite) {
+ return finish(element.asyncMarker.isAsync
+ ? (element.asyncMarker.isYielding
+ ? const js.AsyncModifier.asyncStar()
+ : const js.AsyncModifier.async())
+ : (element.asyncMarker.isYielding
+ ? const js.AsyncModifier.syncStar()
+ : const js.AsyncModifier.sync()));
+ } else {
+ return finish(const js.AsyncModifier.sync());
+ }
}
js.Expression generateCode(
@@ -122,7 +124,7 @@
work);
codegen.visitGraph(graph);
backend.tracer.traceGraph("codegen", graph);
- return buildJavaScriptFunction(graph.isGeneratorEntry, work.element,
+ return buildJavaScriptFunction(graph.needsAsyncRewrite, work.element,
codegen.parameters, codegen.body);
});
}
@@ -271,7 +273,7 @@
int constant(HInstruction instruction) {
if (instruction is HConstant && instruction.isConstantInteger()) {
IntConstantValue constant = instruction.constant;
- return constant.intValue;
+ return constant.intValue.toInt();
}
return null;
}
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index ac8576f..e5b0003 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -660,16 +660,16 @@
if (!instruction.isConstantInteger()) return false;
HConstant rightConstant = instruction;
IntConstantValue intConstant = rightConstant.constant;
- int count = intConstant.intValue;
- return count != 0;
+ BigInt count = intConstant.intValue;
+ return count != BigInt.zero;
}
bool isTwoOrGreater(HInstruction instruction) {
if (!instruction.isConstantInteger()) return false;
HConstant rightConstant = instruction;
IntConstantValue intConstant = rightConstant.constant;
- int count = intConstant.intValue;
- return count >= 2;
+ BigInt count = intConstant.intValue;
+ return count >= BigInt.two;
}
bool hasUint31Result(HInstruction instruction, ClosedWorld closedWorld) {
@@ -750,7 +750,9 @@
if (instruction.isConstantInteger()) {
HConstant rightConstant = instruction;
IntConstantValue intConstant = rightConstant.constant;
- int value = intConstant.intValue;
+ int value = intConstant.intValue.toInt();
+ assert(intConstant.intValue ==
+ new BigInt.from(intConstant.intValue.toInt()));
return value >= low && value <= high;
}
// TODO(sra): Integrate with the bit-width analysis in codegen.dart.
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index 28185e0..8e731b7 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -235,8 +235,8 @@
@override
void visitIntLiteral(ir.IntLiteral literal) {
- impactBuilder
- .registerConstantLiteral(new IntConstantExpression(literal.value));
+ impactBuilder.registerConstantLiteral(
+ new IntConstantExpression(new BigInt.from(literal.value)));
}
@override
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 7d6720a..04c906f 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -16,6 +16,7 @@
import '../js_backend/js_backend.dart';
import '../native/native.dart' as native;
import '../types/abstract_value_domain.dart';
+import '../types/masks.dart' show TypeMask;
import '../universe/selector.dart' show Selector;
import '../universe/side_effects.dart' show SideEffects;
import '../util/util.dart';
@@ -207,9 +208,13 @@
HBasicBlock exit;
HThis thisInstruction;
- /// `true` if a sync*/async/async* method is split into an entry and a body
- /// and this graph is for the entry, which should not be rewritten.
- bool isGeneratorEntry = false;
+ /// `true` if this graph should be transformed by a sync*/async/async*
+ /// rewrite.
+ bool needsAsyncRewrite = false;
+
+ /// If this function requires an async rewrite, this is the element type of
+ /// the generator.
+ DartType asyncElementType;
/// Receiver parameter, set for methods using interceptor calling convention.
HParameterValue explicitReceiverParameter;
@@ -291,7 +296,8 @@
}
HConstant addConstantInt(int i, ClosedWorld closedWorld) {
- return addConstant(closedWorld.constantSystem.createInt(i), closedWorld);
+ return addConstant(
+ closedWorld.constantSystem.createIntFromInt(i), closedWorld);
}
HConstant addConstantDouble(double d, ClosedWorld closedWorld) {
@@ -3164,6 +3170,42 @@
receiverTypeCheckSelector == other.receiverTypeCheckSelector;
}
+ bool isRedundant(ClosedWorld closedWorld) {
+ AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
+ DartType type = typeExpression;
+ if (type != null) {
+ if (type.isMalformed) {
+ // Malformed types are treated as dynamic statically, but should
+ // throw a type error at runtime.
+ return false;
+ }
+ if (type.isTypeVariable) {
+ return false;
+ }
+ if (type.isFutureOr) {
+ // `null` always passes type conversion.
+ if (checkedInput.isNull(abstractValueDomain)) return true;
+ // TODO(johnniwinther): Optimize FutureOr type conversions.
+ return false;
+ }
+ if (!type.treatAsRaw) {
+ // `null` always passes type conversion.
+ if (checkedInput.isNull(abstractValueDomain)) return true;
+ return false;
+ }
+ if (type.isFunctionType) {
+ // `null` always passes type conversion.
+ if (checkedInput.isNull(abstractValueDomain)) return true;
+ // TODO(johnniwinther): Optimize function type conversions.
+ return false;
+ }
+ }
+ // Type is refined from `dynamic`, so it might become non-redundant.
+ if (abstractValueDomain.containsAll(checkedType)) return false;
+ TypeMask inputType = checkedInput.instructionType;
+ return inputType.isInMask(checkedType, closedWorld);
+ }
+
String toString() => 'HTypeConversion(type=$typeExpression, kind=$kind, '
'${hasTypeRepresentation ? 'representation=$typeRepresentation, ' : ''}'
'checkedInput=$checkedInput)';
@@ -3205,6 +3247,13 @@
return knownType == other.knownType &&
instructionType == other.instructionType;
}
+
+ bool isRedundant(ClosedWorld closedWorld) {
+ AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
+ if (abstractValueDomain.containsAll(knownType)) return false;
+ TypeMask inputType = checkedInput.instructionType;
+ return inputType.isInMask(knownType, closedWorld);
+ }
}
class HRangeConversion extends HCheck {
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index f521421..0b25f85 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -925,54 +925,11 @@
}
HInstruction visitTypeConversion(HTypeConversion node) {
- DartType type = node.typeExpression;
- if (type != null) {
- if (type.isMalformed) {
- // Malformed types are treated as dynamic statically, but should
- // throw a type error at runtime.
- return node;
- }
- if (type.isTypeVariable) {
- return node;
- }
- if (type.isFutureOr) {
- HInstruction input = node.checkedInput;
- // `null` always passes type conversion.
- if (input.isNull(_abstractValueDomain)) return input;
- // TODO(johnniwinther): Optimize FutureOr type conversions.
- return node;
- }
- if (!type.treatAsRaw) {
- HInstruction input = node.checkedInput;
- // `null` always passes type conversion.
- if (input.isNull(_abstractValueDomain)) return input;
- // TODO(sra): We can statically check [input] if it is a constructor.
- // TODO(sra): We can statically check [input] if it is load from a field
- // of the same ground type, or load from a field of a parameterized type
- // with the same receiver.
- return node;
- }
- if (type.isFunctionType) {
- HInstruction input = node.checkedInput;
- // `null` always passes type conversion.
- if (input.isNull(_abstractValueDomain)) return input;
- // TODO(johnniwinther): Optimize function type conversions.
- // TODO(sra): We can statically check [input] if it is a closure getter.
- return node;
- }
- }
- return removeIfCheckAlwaysSucceeds(node, node.checkedType);
+ return node.isRedundant(_closedWorld) ? node.checkedInput : node;
}
HInstruction visitTypeKnown(HTypeKnown node) {
- return removeIfCheckAlwaysSucceeds(node, node.knownType);
- }
-
- HInstruction removeIfCheckAlwaysSucceeds(HCheck node, TypeMask checkedType) {
- if (checkedType.containsAll(_closedWorld)) return node;
- HInstruction input = node.checkedInput;
- TypeMask inputType = input.instructionType;
- return inputType.isInMask(checkedType, _closedWorld) ? input : node;
+ return node.isRedundant(_closedWorld) ? node.checkedInput : node;
}
FieldEntity findConcreteFieldForDynamicAccess(
@@ -1048,7 +1005,7 @@
List<ConstantValue> entries = list.entries;
HConstant indexInstruction = node.index;
IntConstantValue indexConstant = indexInstruction.constant;
- int index = indexConstant.intValue;
+ int index = indexConstant.intValue.toInt();
if (index >= 0 && index < entries.length) {
return _graph.addConstant(entries[index], _closedWorld);
}
@@ -2029,20 +1986,20 @@
switchRange.upper is IntValue) {
IntValue lowerValue = switchRange.lower;
IntValue upperValue = switchRange.upper;
- int lower = lowerValue.value;
- int upper = upperValue.value;
- Set<int> liveLabels = new Set<int>();
+ BigInt lower = lowerValue.value;
+ BigInt upper = upperValue.value;
+ Set<BigInt> liveLabels = new Set<BigInt>();
for (int pos = 1; pos < node.inputs.length; pos++) {
HConstant input = node.inputs[pos];
if (!input.isConstantInteger()) continue;
IntConstantValue constant = input.constant;
- int label = constant.intValue;
+ BigInt label = constant.intValue;
if (!liveLabels.contains(label) && label <= upper && label >= lower) {
markBlockLive(node.block.successors[pos - 1]);
liveLabels.add(label);
}
}
- if (liveLabels.length != upper - lower + 1) {
+ if (new BigInt.from(liveLabels.length) != upper - lower + BigInt.one) {
markBlockLive(node.defaultTarget);
}
return;
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index def9ec7..f757a85 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -7,8 +7,7 @@
import '../common/codegen.dart' show CodegenWorkItem, CodegenRegistry;
import '../common/tasks.dart' show CompilerTask, Measurer;
import '../constants/values.dart';
-import '../elements/entities.dart'
- show FieldEntity, FunctionEntity, MemberEntity;
+import '../elements/entities.dart' show FieldEntity, MemberEntity;
import '../io/source_information.dart';
import '../js/js.dart' as js;
import '../js_backend/backend.dart' show JavaScriptBackend, FunctionCompiler;
@@ -45,7 +44,7 @@
optimizer.optimize(work, graph, closedWorld);
MemberEntity element = work.element;
js.Expression result = generator.generateCode(work, graph, closedWorld);
- if (element is FunctionEntity && !graph.isGeneratorEntry) {
+ if (graph.needsAsyncRewrite) {
SourceInformationBuilder sourceInformationBuilder =
backend.sourceInformationStrategy.createBuilderForContext(element);
result = backend.rewriteAsync(
@@ -54,6 +53,7 @@
work.registry,
element,
result,
+ graph.asyncElementType,
sourceInformationBuilder.buildAsyncBody(),
sourceInformationBuilder.buildAsyncExit());
}
diff --git a/pkg/compiler/lib/src/ssa/type_builder.dart b/pkg/compiler/lib/src/ssa/type_builder.dart
index 81268b8..6e4c5bb 100644
--- a/pkg/compiler/lib/src/ssa/type_builder.dart
+++ b/pkg/compiler/lib/src/ssa/type_builder.dart
@@ -72,6 +72,9 @@
// a similar operation on `registry`; otherwise, this one might not be
// needed.
builder.registry?.registerTypeUse(new TypeUse.isCheck(type));
+ if (other is HTypeConversion && other.isRedundant(builder.closedWorld)) {
+ return original;
+ }
return other;
}
@@ -79,6 +82,9 @@
if (type == null) return original;
HInstruction trusted = _trustType(original, type);
if (trusted == original) return original;
+ if (trusted is HTypeKnown && trusted.isRedundant(builder.closedWorld)) {
+ return original;
+ }
builder.add(trusted);
return trusted;
}
diff --git a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
index 97b75ff..71f4e24 100644
--- a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
+++ b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
@@ -16,11 +16,11 @@
IntValue intOne;
ValueRangeInfo(this.constantSystem) {
- intZero = newIntValue(0);
- intOne = newIntValue(1);
+ intZero = newIntValue(BigInt.zero);
+ intOne = newIntValue(BigInt.one);
}
- Value newIntValue(int value) {
+ Value newIntValue(BigInt value) {
return new IntValue(value, this);
}
@@ -128,7 +128,7 @@
* An [IntValue] contains a constant integer value.
*/
class IntValue extends Value {
- final int value;
+ final BigInt value;
const IntValue(this.value, info) : super(info);
@@ -187,9 +187,9 @@
int get hashCode => throw new UnsupportedError('IntValue.hashCode');
String toString() => 'IntValue $value';
- bool get isNegative => value < 0;
- bool get isPositive => value >= 0;
- bool get isZero => value == 0;
+ bool get isNegative => value < BigInt.zero;
+ bool get isPositive => value >= BigInt.zero;
+ bool get isZero => value == BigInt.zero;
}
/**
@@ -694,11 +694,13 @@
if (constantNum.isPositiveInfinity || constantNum.isNegativeInfinity) {
return info.newUnboundRange();
}
- if (constantNum.isMinusZero) constantNum = new IntConstantValue(0);
+ if (constantNum.isMinusZero) {
+ constantNum = new IntConstantValue(BigInt.zero);
+ }
- int intValue = constantNum is IntConstantValue
+ BigInt intValue = constantNum is IntConstantValue
? constantNum.intValue
- : constantNum.doubleValue.toInt();
+ : new BigInt.from(constantNum.doubleValue.toInt());
Value value = info.newIntValue(intValue);
return info.newNormalizedRange(value, value);
}
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index b2b01e9..f8a4624 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -7,9 +7,9 @@
import 'dart:io';
import 'package:args/args.dart';
+import 'package:build_integration/file_system/multi_root.dart';
import 'package:front_end/src/api_prototype/standard_file_system.dart';
import 'package:front_end/src/api_unstable/ddc.dart' as fe;
-import 'package:front_end/src/multi_root_file_system.dart';
import 'package:kernel/kernel.dart';
import 'package:path/path.dart' as path;
import 'package:source_maps/source_maps.dart';
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index 493b103..a9faea8 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -18,6 +18,10 @@
import 'package:args/args.dart' show ArgParser;
import 'package:path/path.dart' as path;
+// TODO(vsm): Remove this once we stop ignoring. It's off here, but
+// configurable for manual testing.
+const ignoreWhitelistedErrors = false;
+
void main(List<String> args) {
// Parse flags.
var parser = new ArgParser()
@@ -139,7 +143,7 @@
function(sdk, app) {
'use strict';
sdk._debugger.registerDevtoolsFormatter();
- sdk.dart.ignoreWhitelistedErrors(false);
+ sdk.dart.ignoreWhitelistedErrors($ignoreWhitelistedErrors);
sdk._isolate_helper.startRootIsolate(() => {}, []);
app.$basename.main();
});
@@ -162,7 +166,7 @@
}
let sdk = require(\"dart_sdk\");
let main = require(\"./$basename\").$basename.main;
- sdk.dart.ignoreWhitelistedErrors(false);
+ sdk.dart.ignoreWhitelistedErrors($ignoreWhitelistedErrors);
try {
sdk._isolate_helper.startRootIsolate(main, []);
} catch(e) {
@@ -186,7 +190,7 @@
import { dart, _isolate_helper } from '$sdkJsPath/dart_sdk.js';
import { $basename } from '$basename.js';
let main = $basename.main;
- dart.ignoreWhitelistedErrors(false);
+ dart.ignoreWhitelistedErrors($ignoreWhitelistedErrors);
try {
_isolate_helper.startRootIsolate(() => {}, []);
main();
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
index a6b3b01..b0b39e3 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/errors.dart
@@ -51,7 +51,7 @@
null, new Symbol('<Unexpected Null Value>'), null, null, null);
}
-castError(obj, expectedType, [bool typeError = undefined]) {
+castError(obj, expectedType, [@js_helper.notNull bool isImplicit = false]) {
var actualType = getReifiedType(obj);
var message = _castErrorMessage(actualType, expectedType);
if (JS('!', 'dart.__ignoreAllErrors')) {
@@ -59,9 +59,8 @@
return obj;
}
if (JS('!', 'dart.__trapRuntimeErrors')) JS('', 'debugger');
- var error = JS<bool>('!', '#', typeError)
- ? new TypeErrorImpl(message)
- : new CastErrorImpl(message);
+ var error =
+ isImplicit ? new TypeErrorImpl(message) : new CastErrorImpl(message);
throw error;
}
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
index b8b88e2..0723a7b 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
@@ -425,8 +425,7 @@
if (!!$isSubtype(type, $Iterable) && !!$isSubtype(actual, $Iterable) ||
!!$isSubtype(type, $Future) && !!$isSubtype(actual, $Future) ||
- !!$isSubtype(type, $Map) && !!$isSubtype(actual, $Map) ||
- !!$isSubtype(type, $Stream) && !!$isSubtype(actual, $Stream)) {
+ !!$isSubtype(type, $Map) && !!$isSubtype(actual, $Map)) {
console.warn('Ignoring cast fail from ' + $typeName(actual) +
' to ' + $typeName(type));
return true;
@@ -444,7 +443,7 @@
}
@JSExportName('as')
-cast(obj, type, bool isExplicit) {
+cast(obj, type, @js_helper.notNull bool isImplicit) {
if (obj == null) return obj;
var actual = getReifiedType(obj);
var result = isSubtype(actual, type);
@@ -454,13 +453,13 @@
'dart.__ignoreWhitelistedErrors && #(#, #)',
result,
result,
- isExplicit,
+ isImplicit,
_ignoreTypeFailure,
actual,
type)) {
return obj;
}
- return castError(obj, type, isExplicit);
+ return castError(obj, type, isImplicit);
}
bool test(bool obj) {
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
index fd62cd8..15b4326 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
@@ -23,6 +23,7 @@
PrivateSymbol,
ReifyFunctionTypes,
NoReifyGeneric;
+import 'dart:_js_helper' as js_helper show notNull;
import 'dart:_debugger' show trackCall;
export 'dart:_debugger'
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
index c7a40c5..2d0df1b 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
@@ -427,7 +427,7 @@
}))()''');
@JSExportName('as')
- as_T(obj, [bool typeError]) {
+ as_T(obj, [@js_helper.notNull bool isImplicit = false]) {
if (obj == null) return obj;
if (JS('bool', 'typeof # == "function"', obj)) {
var actual = JS('', '#[#]', obj, _runtimeType);
@@ -436,12 +436,14 @@
if (actual == null) return obj;
var result = isSubtype(actual, this);
if (result == true) return obj;
- if (result == null && JS('bool', 'dart.__ignoreWhitelistedErrors')) {
+ if (result == null &&
+ isImplicit &&
+ JS<bool>('!', 'dart.__ignoreWhitelistedErrors')) {
_logIgnoredCast(actual, this);
return obj;
}
}
- return castError(obj, this, typeError);
+ return castError(obj, this, isImplicit);
}
@JSExportName('_check')
diff --git a/pkg/front_end/lib/src/byte_store/crc32.dart b/pkg/front_end/lib/src/byte_store/crc32.dart
new file mode 100644
index 0000000..457712e
--- /dev/null
+++ b/pkg/front_end/lib/src/byte_store/crc32.dart
@@ -0,0 +1,288 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+const List<int> _CRC32_TABLE = const [
+ 0x00000000,
+ 0x77073096,
+ 0xEE0E612C,
+ 0x990951BA,
+ 0x076DC419,
+ 0x706AF48F,
+ 0xE963A535,
+ 0x9E6495A3,
+ 0x0EDB8832,
+ 0x79DCB8A4,
+ 0xE0D5E91E,
+ 0x97D2D988,
+ 0x09B64C2B,
+ 0x7EB17CBD,
+ 0xE7B82D07,
+ 0x90BF1D91,
+ 0x1DB71064,
+ 0x6AB020F2,
+ 0xF3B97148,
+ 0x84BE41DE,
+ 0x1ADAD47D,
+ 0x6DDDE4EB,
+ 0xF4D4B551,
+ 0x83D385C7,
+ 0x136C9856,
+ 0x646BA8C0,
+ 0xFD62F97A,
+ 0x8A65C9EC,
+ 0x14015C4F,
+ 0x63066CD9,
+ 0xFA0F3D63,
+ 0x8D080DF5,
+ 0x3B6E20C8,
+ 0x4C69105E,
+ 0xD56041E4,
+ 0xA2677172,
+ 0x3C03E4D1,
+ 0x4B04D447,
+ 0xD20D85FD,
+ 0xA50AB56B,
+ 0x35B5A8FA,
+ 0x42B2986C,
+ 0xDBBBC9D6,
+ 0xACBCF940,
+ 0x32D86CE3,
+ 0x45DF5C75,
+ 0xDCD60DCF,
+ 0xABD13D59,
+ 0x26D930AC,
+ 0x51DE003A,
+ 0xC8D75180,
+ 0xBFD06116,
+ 0x21B4F4B5,
+ 0x56B3C423,
+ 0xCFBA9599,
+ 0xB8BDA50F,
+ 0x2802B89E,
+ 0x5F058808,
+ 0xC60CD9B2,
+ 0xB10BE924,
+ 0x2F6F7C87,
+ 0x58684C11,
+ 0xC1611DAB,
+ 0xB6662D3D,
+ 0x76DC4190,
+ 0x01DB7106,
+ 0x98D220BC,
+ 0xEFD5102A,
+ 0x71B18589,
+ 0x06B6B51F,
+ 0x9FBFE4A5,
+ 0xE8B8D433,
+ 0x7807C9A2,
+ 0x0F00F934,
+ 0x9609A88E,
+ 0xE10E9818,
+ 0x7F6A0DBB,
+ 0x086D3D2D,
+ 0x91646C97,
+ 0xE6635C01,
+ 0x6B6B51F4,
+ 0x1C6C6162,
+ 0x856530D8,
+ 0xF262004E,
+ 0x6C0695ED,
+ 0x1B01A57B,
+ 0x8208F4C1,
+ 0xF50FC457,
+ 0x65B0D9C6,
+ 0x12B7E950,
+ 0x8BBEB8EA,
+ 0xFCB9887C,
+ 0x62DD1DDF,
+ 0x15DA2D49,
+ 0x8CD37CF3,
+ 0xFBD44C65,
+ 0x4DB26158,
+ 0x3AB551CE,
+ 0xA3BC0074,
+ 0xD4BB30E2,
+ 0x4ADFA541,
+ 0x3DD895D7,
+ 0xA4D1C46D,
+ 0xD3D6F4FB,
+ 0x4369E96A,
+ 0x346ED9FC,
+ 0xAD678846,
+ 0xDA60B8D0,
+ 0x44042D73,
+ 0x33031DE5,
+ 0xAA0A4C5F,
+ 0xDD0D7CC9,
+ 0x5005713C,
+ 0x270241AA,
+ 0xBE0B1010,
+ 0xC90C2086,
+ 0x5768B525,
+ 0x206F85B3,
+ 0xB966D409,
+ 0xCE61E49F,
+ 0x5EDEF90E,
+ 0x29D9C998,
+ 0xB0D09822,
+ 0xC7D7A8B4,
+ 0x59B33D17,
+ 0x2EB40D81,
+ 0xB7BD5C3B,
+ 0xC0BA6CAD,
+ 0xEDB88320,
+ 0x9ABFB3B6,
+ 0x03B6E20C,
+ 0x74B1D29A,
+ 0xEAD54739,
+ 0x9DD277AF,
+ 0x04DB2615,
+ 0x73DC1683,
+ 0xE3630B12,
+ 0x94643B84,
+ 0x0D6D6A3E,
+ 0x7A6A5AA8,
+ 0xE40ECF0B,
+ 0x9309FF9D,
+ 0x0A00AE27,
+ 0x7D079EB1,
+ 0xF00F9344,
+ 0x8708A3D2,
+ 0x1E01F268,
+ 0x6906C2FE,
+ 0xF762575D,
+ 0x806567CB,
+ 0x196C3671,
+ 0x6E6B06E7,
+ 0xFED41B76,
+ 0x89D32BE0,
+ 0x10DA7A5A,
+ 0x67DD4ACC,
+ 0xF9B9DF6F,
+ 0x8EBEEFF9,
+ 0x17B7BE43,
+ 0x60B08ED5,
+ 0xD6D6A3E8,
+ 0xA1D1937E,
+ 0x38D8C2C4,
+ 0x4FDFF252,
+ 0xD1BB67F1,
+ 0xA6BC5767,
+ 0x3FB506DD,
+ 0x48B2364B,
+ 0xD80D2BDA,
+ 0xAF0A1B4C,
+ 0x36034AF6,
+ 0x41047A60,
+ 0xDF60EFC3,
+ 0xA867DF55,
+ 0x316E8EEF,
+ 0x4669BE79,
+ 0xCB61B38C,
+ 0xBC66831A,
+ 0x256FD2A0,
+ 0x5268E236,
+ 0xCC0C7795,
+ 0xBB0B4703,
+ 0x220216B9,
+ 0x5505262F,
+ 0xC5BA3BBE,
+ 0xB2BD0B28,
+ 0x2BB45A92,
+ 0x5CB36A04,
+ 0xC2D7FFA7,
+ 0xB5D0CF31,
+ 0x2CD99E8B,
+ 0x5BDEAE1D,
+ 0x9B64C2B0,
+ 0xEC63F226,
+ 0x756AA39C,
+ 0x026D930A,
+ 0x9C0906A9,
+ 0xEB0E363F,
+ 0x72076785,
+ 0x05005713,
+ 0x95BF4A82,
+ 0xE2B87A14,
+ 0x7BB12BAE,
+ 0x0CB61B38,
+ 0x92D28E9B,
+ 0xE5D5BE0D,
+ 0x7CDCEFB7,
+ 0x0BDBDF21,
+ 0x86D3D2D4,
+ 0xF1D4E242,
+ 0x68DDB3F8,
+ 0x1FDA836E,
+ 0x81BE16CD,
+ 0xF6B9265B,
+ 0x6FB077E1,
+ 0x18B74777,
+ 0x88085AE6,
+ 0xFF0F6A70,
+ 0x66063BCA,
+ 0x11010B5C,
+ 0x8F659EFF,
+ 0xF862AE69,
+ 0x616BFFD3,
+ 0x166CCF45,
+ 0xA00AE278,
+ 0xD70DD2EE,
+ 0x4E048354,
+ 0x3903B3C2,
+ 0xA7672661,
+ 0xD06016F7,
+ 0x4969474D,
+ 0x3E6E77DB,
+ 0xAED16A4A,
+ 0xD9D65ADC,
+ 0x40DF0B66,
+ 0x37D83BF0,
+ 0xA9BCAE53,
+ 0xDEBB9EC5,
+ 0x47B2CF7F,
+ 0x30B5FFE9,
+ 0xBDBDF21C,
+ 0xCABAC28A,
+ 0x53B39330,
+ 0x24B4A3A6,
+ 0xBAD03605,
+ 0xCDD70693,
+ 0x54DE5729,
+ 0x23D967BF,
+ 0xB3667A2E,
+ 0xC4614AB8,
+ 0x5D681B02,
+ 0x2A6F2B94,
+ 0xB40BBE37,
+ 0xC30C8EA1,
+ 0x5A05DF1B,
+ 0x2D02EF8D
+];
+
+/**
+ * Get the CRC-32 checksum of the given array. You can append bytes to an
+ * already computed crc by specifying the previous [crc] value.
+ */
+int getCrc32(List<int> array, [int crc = 0]) {
+ int len = array.length;
+ crc = crc ^ 0xffffffff;
+ int ip = 0;
+ while (len >= 8) {
+ crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+ crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+ crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+ crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+ crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+ crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+ crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+ crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+ len -= 8;
+ }
+ if (len > 0)
+ do {
+ crc = _CRC32_TABLE[(crc ^ array[ip++]) & 0xff] ^ (crc >> 8);
+ } while (--len > 0);
+ return crc ^ 0xffffffff;
+}
diff --git a/pkg/front_end/lib/src/byte_store/file_byte_store.dart b/pkg/front_end/lib/src/byte_store/file_byte_store.dart
index 8ce63de..9a9bc29 100644
--- a/pkg/front_end/lib/src/byte_store/file_byte_store.dart
+++ b/pkg/front_end/lib/src/byte_store/file_byte_store.dart
@@ -5,8 +5,10 @@
import 'dart:async';
import 'dart:io';
import 'dart:isolate';
+import 'dart:typed_data';
import 'package:front_end/src/byte_store/byte_store.dart';
+import 'package:front_end/src/byte_store/crc32.dart';
import 'package:path/path.dart';
/**
@@ -144,6 +146,7 @@
class FileByteStore implements ByteStore {
final String _cachePath;
final String _tempName;
+ final FileByteStoreValidator _validator = new FileByteStoreValidator();
/**
* If the same cache path is used from more than one isolate of the same
@@ -155,7 +158,9 @@
@override
List<int> get(String key) {
try {
- return _getFileForKey(key).readAsBytesSync();
+ File file = _getFileForKey(key);
+ List<int> rawBytes = file.readAsBytesSync();
+ return _validator.getData(rawBytes);
} catch (_) {
return null;
}
@@ -164,6 +169,7 @@
@override
void put(String key, List<int> bytes) {
try {
+ bytes = _validator.wrapData(bytes);
File tempFile = _getFileForKey(_tempName);
tempFile.writeAsBytesSync(bytes);
File file = _getFileForKey(key);
@@ -175,3 +181,75 @@
return new File(join(_cachePath, key));
}
}
+
+/**
+ * Generally speaking, we cannot guarantee that any data written into a
+ * file will stay the same - there is always a chance of a hardware problem,
+ * file system problem, truncated data, etc.
+ *
+ * So, we need to embed some validation into data itself.
+ * This class append the version and the checksum to data.
+ */
+class FileByteStoreValidator {
+ static const List<int> _VERSION = const [0x01, 0x00, 0x00, 0x00];
+
+ /**
+ * If the [rawBytes] have the valid version and checksum, extract and
+ * return the data from it. Otherwise return `null`.
+ */
+ List<int> getData(List<int> rawBytes) {
+ // There must be at least the version and the checksum in the raw bytes.
+ if (rawBytes.length < 8) {
+ return null;
+ }
+ int len = rawBytes.length - 8;
+
+ // Check the version.
+ if (rawBytes[len + 0] != _VERSION[0] ||
+ rawBytes[len + 1] != _VERSION[1] ||
+ rawBytes[len + 2] != _VERSION[2] ||
+ rawBytes[len + 3] != _VERSION[3]) {
+ return null;
+ }
+
+ // Check the CRC32 of the data.
+ List<int> data = rawBytes.sublist(0, len);
+ int crc = getCrc32(data);
+ if (rawBytes[len + 4] != crc & 0xFF ||
+ rawBytes[len + 5] != (crc >> 8) & 0xFF ||
+ rawBytes[len + 6] != (crc >> 16) & 0xFF ||
+ rawBytes[len + 7] != (crc >> 24) & 0xFF) {
+ return null;
+ }
+
+ // OK, the data is probably valid.
+ return data;
+ }
+
+ /**
+ * Return bytes that include the given [data] plus the current version and
+ * the checksum of the [data].
+ */
+ List<int> wrapData(List<int> data) {
+ int len = data.length;
+ var bytes = new Uint8List(len + 8);
+
+ // Put the data.
+ bytes.setRange(0, len, data);
+
+ // Put the version.
+ bytes[len + 0] = _VERSION[0];
+ bytes[len + 1] = _VERSION[1];
+ bytes[len + 2] = _VERSION[2];
+ bytes[len + 3] = _VERSION[3];
+
+ // Put the CRC32 of the data.
+ int crc = getCrc32(data);
+ bytes[len + 4] = crc & 0xFF;
+ bytes[len + 5] = (crc >> 8) & 0xFF;
+ bytes[len + 6] = (crc >> 16) & 0xFF;
+ bytes[len + 7] = (crc >> 24) & 0xFF;
+
+ return bytes;
+ }
+}
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index e65d55b..e1d7ba7 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -1026,30 +1026,6 @@
tip: r"""Try removing the 'const' keyword.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(String name)>
- templateConstructorHasNoSuchNamedParameter =
- const Template<Message Function(String name)>(
- messageTemplate:
- r"""Constructor has no named parameter with the name '#name'.""",
- withArguments: _withArgumentsConstructorHasNoSuchNamedParameter);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)>
- codeConstructorHasNoSuchNamedParameter =
- const Code<Message Function(String name)>(
- "ConstructorHasNoSuchNamedParameter",
- templateConstructorHasNoSuchNamedParameter,
- severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsConstructorHasNoSuchNamedParameter(String name) {
- return new Message(codeConstructorHasNoSuchNamedParameter,
- message: """Constructor has no named parameter with the name '$name'.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String name)> templateConstructorNotFound =
const Template<Message Function(String name)>(
messageTemplate: r"""Couldn't find constructor '#name'.""",
@@ -2559,27 +2535,6 @@
r"""Can't assign to this, so it can't be used in a for-in loop.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(String name)> templateFunctionHasNoSuchNamedParameter =
- const Template<Message Function(String name)>(
- messageTemplate:
- r"""Function has no named parameter with the name '#name'.""",
- withArguments: _withArgumentsFunctionHasNoSuchNamedParameter);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeFunctionHasNoSuchNamedParameter =
- const Code<Message Function(String name)>("FunctionHasNoSuchNamedParameter",
- templateFunctionHasNoSuchNamedParameter,
- severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsFunctionHasNoSuchNamedParameter(String name) {
- return new Message(codeFunctionHasNoSuchNamedParameter,
- message: """Function has no named parameter with the name '$name'.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeFunctionTypeDefaultValue = messageFunctionTypeDefaultValue;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3874,27 +3829,6 @@
message: r"""An annotation (metadata) can't use type arguments.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(String name)> templateMethodHasNoSuchNamedParameter =
- const Template<Message Function(String name)>(
- messageTemplate:
- r"""Method has no named parameter with the name '#name'.""",
- withArguments: _withArgumentsMethodHasNoSuchNamedParameter);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(String name)> codeMethodHasNoSuchNamedParameter =
- const Code<Message Function(String name)>(
- "MethodHasNoSuchNamedParameter", templateMethodHasNoSuchNamedParameter,
- severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsMethodHasNoSuchNamedParameter(String name) {
- return new Message(codeMethodHasNoSuchNamedParameter,
- message: """Method has no named parameter with the name '$name'.""",
- arguments: {'name': name});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String name)> templateMethodNotFound =
const Template<Message Function(String name)>(
messageTemplate: r"""Method not found: '#name'.""",
@@ -4265,6 +4199,25 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)> templateNoSuchNamedParameter =
+ const Template<Message Function(String name)>(
+ messageTemplate: r"""No named parameter with the name '#name'.""",
+ withArguments: _withArgumentsNoSuchNamedParameter);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeNoSuchNamedParameter =
+ const Code<Message Function(String name)>(
+ "NoSuchNamedParameter", templateNoSuchNamedParameter,
+ severity: Severity.errorLegacyWarning);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNoSuchNamedParameter(String name) {
+ return new Message(codeNoSuchNamedParameter,
+ message: """No named parameter with the name '$name'.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeNoUnnamedConstructorInObject =
messageNoUnnamedConstructorInObject;
@@ -5626,24 +5579,23 @@
Message Function(
int count,
int
- count2)> templateTooFewArgumentsToConstructor = const Template<
+ count2)> templateTooFewArguments = const Template<
Message Function(int count, int count2)>(
messageTemplate:
- r"""Too few positional arguments to constructor: #count required, #count2 given.""",
- withArguments: _withArgumentsTooFewArgumentsToConstructor);
+ r"""Too few positional arguments: #count required, #count2 given.""",
+ withArguments: _withArgumentsTooFewArguments);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
- codeTooFewArgumentsToConstructor =
+const Code<Message Function(int count, int count2)> codeTooFewArguments =
const Code<Message Function(int count, int count2)>(
- "TooFewArgumentsToConstructor", templateTooFewArgumentsToConstructor,
+ "TooFewArguments", templateTooFewArguments,
severity: Severity.errorLegacyWarning);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooFewArgumentsToConstructor(int count, int count2) {
- return new Message(codeTooFewArgumentsToConstructor,
+Message _withArgumentsTooFewArguments(int count, int count2) {
+ return new Message(codeTooFewArguments,
message:
- """Too few positional arguments to constructor: $count required, $count2 given.""",
+ """Too few positional arguments: $count required, $count2 given.""",
arguments: {'count': count, 'count2': count2});
}
@@ -5652,128 +5604,23 @@
Message Function(
int count,
int
- count2)> templateTooFewArgumentsToFunction = const Template<
+ count2)> templateTooManyArguments = const Template<
Message Function(int count, int count2)>(
messageTemplate:
- r"""Too few positional arguments to function: #count required, #count2 given.""",
- withArguments: _withArgumentsTooFewArgumentsToFunction);
+ r"""Too many positional arguments: #count allowed, #count2 given.""",
+ withArguments: _withArgumentsTooManyArguments);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
- codeTooFewArgumentsToFunction =
+const Code<Message Function(int count, int count2)> codeTooManyArguments =
const Code<Message Function(int count, int count2)>(
- "TooFewArgumentsToFunction", templateTooFewArgumentsToFunction,
+ "TooManyArguments", templateTooManyArguments,
severity: Severity.errorLegacyWarning);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooFewArgumentsToFunction(int count, int count2) {
- return new Message(codeTooFewArgumentsToFunction,
+Message _withArgumentsTooManyArguments(int count, int count2) {
+ return new Message(codeTooManyArguments,
message:
- """Too few positional arguments to function: $count required, $count2 given.""",
- arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(
- int count,
- int
- count2)> templateTooFewArgumentsToMethod = const Template<
- Message Function(int count, int count2)>(
- messageTemplate:
- r"""Too few positional arguments to method: #count required, #count2 given.""",
- withArguments: _withArgumentsTooFewArgumentsToMethod);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
- codeTooFewArgumentsToMethod =
- const Code<Message Function(int count, int count2)>(
- "TooFewArgumentsToMethod", templateTooFewArgumentsToMethod,
- severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooFewArgumentsToMethod(int count, int count2) {
- return new Message(codeTooFewArgumentsToMethod,
- message:
- """Too few positional arguments to method: $count required, $count2 given.""",
- arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(
- int count,
- int
- count2)> templateTooManyArgumentsToConstructor = const Template<
- Message Function(int count, int count2)>(
- messageTemplate:
- r"""Too many positional arguments to constructor: #count allowed, #count2 given.""",
- withArguments: _withArgumentsTooManyArgumentsToConstructor);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
- codeTooManyArgumentsToConstructor =
- const Code<Message Function(int count, int count2)>(
- "TooManyArgumentsToConstructor", templateTooManyArgumentsToConstructor,
- severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooManyArgumentsToConstructor(int count, int count2) {
- return new Message(codeTooManyArgumentsToConstructor,
- message:
- """Too many positional arguments to constructor: $count allowed, $count2 given.""",
- arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(
- int count,
- int
- count2)> templateTooManyArgumentsToFunction = const Template<
- Message Function(int count, int count2)>(
- messageTemplate:
- r"""Too many positional arguments to function: #count allowed, #count2 given.""",
- withArguments: _withArgumentsTooManyArgumentsToFunction);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
- codeTooManyArgumentsToFunction =
- const Code<Message Function(int count, int count2)>(
- "TooManyArgumentsToFunction", templateTooManyArgumentsToFunction,
- severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooManyArgumentsToFunction(int count, int count2) {
- return new Message(codeTooManyArgumentsToFunction,
- message:
- """Too many positional arguments to function: $count allowed, $count2 given.""",
- arguments: {'count': count, 'count2': count2});
-}
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Template<
- Message Function(
- int count,
- int
- count2)> templateTooManyArgumentsToMethod = const Template<
- Message Function(int count, int count2)>(
- messageTemplate:
- r"""Too many positional arguments to method: #count allowed, #count2 given.""",
- withArguments: _withArgumentsTooManyArgumentsToMethod);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Message Function(int count, int count2)>
- codeTooManyArgumentsToMethod =
- const Code<Message Function(int count, int count2)>(
- "TooManyArgumentsToMethod", templateTooManyArgumentsToMethod,
- severity: Severity.errorLegacyWarning);
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-Message _withArgumentsTooManyArgumentsToMethod(int count, int count2) {
- return new Message(codeTooManyArgumentsToMethod,
- message:
- """Too many positional arguments to method: $count allowed, $count2 given.""",
+ """Too many positional arguments: $count allowed, $count2 given.""",
arguments: {'count': count, 'count2': count2});
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 66003ca..abcc818 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -84,31 +84,29 @@
import 'expression_generator.dart'
show
- BuilderHelper,
- CalleeDesignation,
DeferredAccessGenerator,
ErroneousExpressionGenerator,
- FastaAccessor,
- FunctionTypeAccessor,
- GeneratorImpl,
- IncompleteError,
- IncompletePropertyAccessor,
- IncompleteSend,
+ Generator,
+ IncompleteErrorGenerator,
+ IncompletePropertyAccessGenerator,
+ IncompleteSendGenerator,
IndexedAccessGenerator,
LargeIntAccessGenerator,
LoadLibraryGenerator,
- ParenthesizedExpression,
+ ParenthesizedExpressionGenerator,
ReadOnlyAccessGenerator,
- SendAccessor,
+ SendAccessGenerator,
StaticAccessGenerator,
SuperIndexedAccessGenerator,
ThisAccessGenerator,
ThisPropertyAccessGenerator,
- TypeDeclarationAccessor,
- UnresolvedAccessor,
+ TypeDeclarationAccessGenerator,
+ UnresolvedNameGenerator,
VariableUseGenerator,
buildIsNull;
+import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
+
import 'redirecting_factory_body.dart'
show
RedirectingFactoryBody,
@@ -131,7 +129,7 @@
abstract class BodyBuilder<Expression, Statement, Arguments>
extends ScopeListener<JumpTarget>
- implements BuilderHelper<Expression, Statement, Arguments> {
+ implements ExpressionGeneratorHelper<Expression, Statement, Arguments> {
@override
final KernelLibraryBuilder library;
@@ -274,7 +272,7 @@
@override
Expression toValue(Object node) {
- if (node is FastaAccessor) {
+ if (node is Generator) {
return toExpression(node.buildSimpleRead());
} else if (node is Expression) {
return node;
@@ -292,7 +290,7 @@
}
Expression toEffect(Object node) {
- if (node is FastaAccessor) return toExpression(node.buildForEffect());
+ if (node is Generator) return toExpression(node.buildForEffect());
return toValue(node);
}
@@ -437,14 +435,14 @@
var expression = pop();
if (expression is Identifier) {
Identifier identifier = expression;
- expression = new UnresolvedAccessor(
+ expression = new UnresolvedNameGenerator(
this, identifier.token, new Name(identifier.name, library.library));
}
if (name?.isNotEmpty ?? false) {
Token period = periodBeforeName ?? beginToken.next;
- FastaAccessor accessor = expression;
- expression = accessor.buildPropertyAccess(
- new IncompletePropertyAccessor(
+ Generator generator = expression;
+ expression = generator.buildPropertyAccess(
+ new IncompletePropertyAccessGenerator(
this, period.next, new Name(name, library.library)),
period.next.offset,
false);
@@ -620,7 +618,7 @@
Initializer initializer;
if (node is Initializer) {
initializer = node;
- } else if (node is FastaAccessor) {
+ } else if (node is Generator) {
initializer = node.buildFieldInitializer(initializedFields);
} else if (node is ConstructorInvocation) {
initializer = buildSuperInitializer(
@@ -803,10 +801,7 @@
Initializer initializer;
Arguments arguments = forest.argumentsEmpty(noLocation);
if (superTarget == null ||
- checkArguments(
- new FunctionTypeAccessor.fromNode(superTarget.function),
- arguments,
- CalleeDesignation.Constructor,
+ checkArgumentsForFunction(superTarget.function, arguments,
builder.charOffset, const <TypeParameter>[]) !=
null) {
String superclass = classBuilder.supertype.fullNameForErrors;
@@ -909,7 +904,7 @@
@override
void handleParenthesizedExpression(Token token) {
debugEvent("ParenthesizedExpression");
- push(new ParenthesizedExpression(
+ push(new ParenthesizedExpressionGenerator(
this, token.endGroup, toKernelExpression(popForValue())));
}
@@ -928,9 +923,9 @@
if (receiver is Identifier) {
Name name = new Name(receiver.name, library.library);
if (arguments == null) {
- push(new IncompletePropertyAccessor(this, beginToken, name));
+ push(new IncompletePropertyAccessGenerator(this, beginToken, name));
} else {
- push(new SendAccessor(this, beginToken, name, arguments));
+ push(new SendAccessGenerator(this, beginToken, name, arguments));
}
} else if (arguments == null) {
push(receiver);
@@ -941,7 +936,7 @@
@override
finishSend(Object receiver, Arguments arguments, int charOffset) {
- if (receiver is FastaAccessor) {
+ if (receiver is Generator) {
return receiver.doInvocation(charOffset, arguments);
} else {
return buildMethodInvocation(
@@ -1078,7 +1073,7 @@
/// Handle `a?.b(...)`.
void doIfNotNull(Token token) {
var send = pop();
- if (send is IncompleteSend) {
+ if (send is IncompleteSendGenerator) {
push(send.withReceiver(pop(), token.charOffset, isNullAware: true));
} else {
pop();
@@ -1091,7 +1086,7 @@
void doDotOrCascadeExpression(Token token) {
var send = pop();
- if (send is IncompleteSend) {
+ if (send is IncompleteSendGenerator) {
Object receiver = optional(".", token) ? pop() : popForValue();
push(send.withReceiver(receiver, token.charOffset));
} else {
@@ -1370,7 +1365,7 @@
classBuilder.origin.findStaticBuilder(name, charOffset, uri, library);
}
if (builder != null && member.isField && builder.isInstanceMember) {
- return new IncompleteError(this, token,
+ return new IncompleteErrorGenerator(this, token,
fasta.templateThisAccessInFieldInitializer.withArguments(name));
}
if (builder == null || (!isInstanceContext && builder.isInstanceMember)) {
@@ -1378,7 +1373,7 @@
if (!isQualified && isInstanceContext) {
assert(builder == null);
if (constantContext != ConstantContext.none || member.isField) {
- return new UnresolvedAccessor(this, token, n);
+ return new UnresolvedNameGenerator(this, token, n);
}
return new ThisPropertyAccessGenerator(this, token, n,
lookupInstanceMember(n), lookupInstanceMember(n, isSetter: true));
@@ -1387,7 +1382,7 @@
member?.name == "_getMainClosure") {
return storeOffset(forest.literalNull(null), charOffset);
} else {
- return new UnresolvedAccessor(this, token, n);
+ return new UnresolvedNameGenerator(this, token, n);
}
} else if (builder.isTypeDeclaration) {
if (constantContext != ConstantContext.none &&
@@ -1396,11 +1391,12 @@
deprecated_addCompileTimeError(
charOffset, "Not a constant expression.");
}
- TypeDeclarationAccessor accessor = new TypeDeclarationAccessor(
- this, token, prefix, charOffset, builder, name);
+ TypeDeclarationAccessGenerator generator =
+ new TypeDeclarationAccessGenerator(
+ this, token, prefix, charOffset, builder, name);
return (prefix?.deferred == true)
- ? new DeferredAccessGenerator(this, token, prefix, accessor)
- : accessor;
+ ? new DeferredAccessGenerator(this, token, prefix, generator)
+ : generator;
} else if (builder.isLocal) {
if (constantContext != ConstantContext.none &&
!builder.isConst &&
@@ -1449,11 +1445,11 @@
return new ThisPropertyAccessGenerator(this, token, n, getter, setter);
} else if (builder.isRegularMethod) {
assert(builder.isStatic || builder.isTopLevel);
- StaticAccessGenerator accessor =
+ StaticAccessGenerator generator =
new StaticAccessGenerator(this, token, builder.target, null);
return (prefix?.deferred == true)
- ? new DeferredAccessGenerator(this, token, prefix, accessor)
- : accessor;
+ ? new DeferredAccessGenerator(this, token, prefix, generator)
+ : generator;
} else if (builder is PrefixBuilder) {
if (constantContext != ConstantContext.none && builder.deferred) {
deprecated_addCompileTimeError(
@@ -1477,10 +1473,10 @@
} else if (builder.isField && !builder.isFinal) {
setter = builder;
}
- StaticAccessGenerator accessor =
+ StaticAccessGenerator generator =
new StaticAccessGenerator.fromBuilder(this, builder, token, setter);
if (constantContext != ConstantContext.none) {
- Member readTarget = accessor.readTarget;
+ Member readTarget = generator.readTarget;
if (!(readTarget is Field && readTarget.isConst ||
// Static tear-offs are also compile time constants.
readTarget is Procedure)) {
@@ -1489,8 +1485,8 @@
}
}
return (prefix?.deferred == true)
- ? new DeferredAccessGenerator(this, token, prefix, accessor)
- : accessor;
+ ? new DeferredAccessGenerator(this, token, prefix, generator)
+ : generator;
}
}
@@ -1789,13 +1785,13 @@
void handleAssignmentExpression(Token token) {
debugEvent("AssignmentExpression");
Expression value = popForValue();
- var accessor = pop();
- if (accessor is! FastaAccessor) {
+ var generator = pop();
+ if (generator is! Generator) {
push(buildCompileTimeError(fasta.messageNotAnLvalue,
offsetForToken(token), lengthForToken(token)));
} else {
- push(new DelayedAssignment(
- this, token, accessor, toKernelExpression(value), token.stringValue));
+ push(new DelayedAssignment(this, token, generator,
+ toKernelExpression(value), token.stringValue));
}
}
@@ -1821,7 +1817,7 @@
}
List<VariableDeclaration> buildVariableDeclarations(variableOrExpression) {
- if (variableOrExpression is FastaAccessor) {
+ if (variableOrExpression is Generator) {
variableOrExpression = variableOrExpression.buildForEffect();
}
if (variableOrExpression is VariableDeclaration) {
@@ -2054,7 +2050,7 @@
return;
}
}
- if (name is FastaAccessor) {
+ if (name is Generator) {
push(name.buildTypeWithBuiltArguments(arguments));
} else if (name is TypeBuilder) {
push(name.build(library));
@@ -2324,14 +2320,11 @@
optional = pop();
count--;
}
- FormalParameters<Arguments> formals = new FormalParameters(
- popList(
- count,
- new List<VariableDeclaration>.filled(count, null,
- growable: true)) ??
- <VariableDeclaration>[],
- optional,
- beginToken.charOffset);
+ List<VariableDeclaration> variables =
+ new List<VariableDeclaration>.filled(count, null, growable: true);
+ popList(count, variables);
+ FormalParameters<Arguments> formals =
+ new FormalParameters(variables, optional, beginToken.charOffset);
constantContext = pop();
push(formals);
if ((inCatchClause || functionNestingLevel != 0) &&
@@ -2484,24 +2477,26 @@
@override
void handleUnaryPrefixAssignmentExpression(Token token) {
debugEvent("UnaryPrefixAssignmentExpression");
- var accessor = pop();
- if (accessor is FastaAccessor) {
- push(accessor.buildPrefixIncrement(incrementOperator(token),
+ var generator = pop();
+ if (generator is Generator) {
+ push(generator.buildPrefixIncrement(incrementOperator(token),
offset: token.charOffset));
} else {
- push(wrapInCompileTimeError(toValue(accessor), fasta.messageNotAnLvalue));
+ push(
+ wrapInCompileTimeError(toValue(generator), fasta.messageNotAnLvalue));
}
}
@override
void handleUnaryPostfixAssignmentExpression(Token token) {
debugEvent("UnaryPostfixAssignmentExpression");
- var accessor = pop();
- if (accessor is FastaAccessor) {
+ var generator = pop();
+ if (generator is Generator) {
push(new DelayedPostfixIncrement<Arguments>(
- this, token, accessor, incrementOperator(token), null));
+ this, token, generator, incrementOperator(token), null));
} else {
- push(wrapInCompileTimeError(toValue(accessor), fasta.messageNotAnLvalue));
+ push(
+ wrapInCompileTimeError(toValue(generator), fasta.messageNotAnLvalue));
}
}
@@ -2542,7 +2537,7 @@
/// But the parser can't tell this from type c) above.
///
/// This method pops 2 (or 3 if `periodBeforeName != null`) values from the
- /// stack and pushes 3 values: an accessor (the type in a constructor
+ /// stack and pushes 3 values: a generator (the type in a constructor
/// reference, or an expression in metadata), a list of type arguments, and a
/// name.
void pushQualifiedReference(Token start, Token periodBeforeName) {
@@ -2558,13 +2553,13 @@
prefix.exportScope, identifier.name, identifier.token,
isQualified: true, prefix: prefix);
identifier = null;
- } else if (prefix is TypeDeclarationAccessor) {
+ } else if (prefix is TypeDeclarationAccessGenerator) {
type = prefix;
- } else if (prefix is FastaAccessor) {
+ } else if (prefix is Generator) {
String name = suffix == null
? "${prefix.plainNameForRead}.${identifier.name}"
: "${prefix.plainNameForRead}.${identifier.name}.$suffix";
- type = new UnresolvedAccessor(
+ type = new UnresolvedNameGenerator(
this, prefix.token, new Name(name, library.library));
} else {
unhandled("${prefix.runtimeType}", "pushQualifiedReference",
@@ -2599,15 +2594,8 @@
assert(!target.enclosingClass.isAbstract);
typeParameters = target.enclosingClass.typeParameters;
}
- CalleeDesignation calleeKind = target is Constructor
- ? CalleeDesignation.Constructor
- : CalleeDesignation.Method;
- LocatedMessage argMessage = checkArguments(
- new FunctionTypeAccessor.fromNode(target.function),
- arguments,
- calleeKind,
- charOffset,
- typeParameters);
+ LocatedMessage argMessage = checkArgumentsForFunction(
+ target.function, arguments, charOffset, typeParameters);
if (argMessage != null) {
return throwNoSuchMethodError(
storeOffset(forest.literalNull(null), charOffset),
@@ -2653,65 +2641,29 @@
}
@override
- LocatedMessage checkArguments(FunctionTypeAccessor function,
- Arguments arguments, CalleeDesignation calleeKind, int offset,
- [List<TypeParameter> typeParameters]) {
+ LocatedMessage checkArgumentsForFunction(FunctionNode function,
+ Arguments arguments, int offset, List<TypeParameter> typeParameters) {
if (forest.argumentsPositional(arguments).length <
function.requiredParameterCount) {
- Template<Message Function(int count, int count2)> template;
- switch (calleeKind) {
- case CalleeDesignation.Function:
- template = fasta.templateTooFewArgumentsToFunction;
- break;
- case CalleeDesignation.Method:
- template = fasta.templateTooFewArgumentsToMethod;
- break;
- case CalleeDesignation.Constructor:
- template = fasta.templateTooFewArgumentsToConstructor;
- break;
- }
- return template
+ return fasta.templateTooFewArguments
.withArguments(function.requiredParameterCount,
forest.argumentsPositional(arguments).length)
.withLocation(uri, offset, noLength);
}
if (forest.argumentsPositional(arguments).length >
- function.positionalParameterCount) {
- Template<Message Function(int count, int count2)> template;
- switch (calleeKind) {
- case CalleeDesignation.Function:
- template = fasta.templateTooManyArgumentsToFunction;
- break;
- case CalleeDesignation.Method:
- template = fasta.templateTooManyArgumentsToMethod;
- break;
- case CalleeDesignation.Constructor:
- template = fasta.templateTooManyArgumentsToConstructor;
- break;
- }
- return template
- .withArguments(function.positionalParameterCount,
+ function.positionalParameters.length) {
+ return fasta.templateTooManyArguments
+ .withArguments(function.positionalParameters.length,
forest.argumentsPositional(arguments).length)
.withLocation(uri, offset, noLength);
}
List named = forest.argumentsNamed(arguments);
if (named.isNotEmpty) {
- Set<String> names = function.namedParameterNames;
+ Set<String> names =
+ new Set.from(function.namedParameters.map((a) => a.name));
for (NamedExpression argument in named) {
if (!names.remove(argument.name)) {
- Template<Message Function(String name)> template;
- switch (calleeKind) {
- case CalleeDesignation.Function:
- template = fasta.templateFunctionHasNoSuchNamedParameter;
- break;
- case CalleeDesignation.Method:
- template = fasta.templateMethodHasNoSuchNamedParameter;
- break;
- case CalleeDesignation.Constructor:
- template = fasta.templateConstructorHasNoSuchNamedParameter;
- break;
- }
- return template
+ return fasta.templateNoSuchNamedParameter
.withArguments(argument.name)
.withLocation(uri, argument.fileOffset, argument.name.length);
}
@@ -2719,7 +2671,7 @@
}
List types = forest.argumentsTypeArguments(arguments);
- if (typeParameters != null && typeParameters.length != types.length) {
+ if (typeParameters.length != types.length) {
// TODO(paulberry): Report error in this case as well,
// after https://github.com/dart-lang/sdk/issues/32130 is fixed.
types.clear();
@@ -2732,6 +2684,39 @@
}
@override
+ LocatedMessage checkArgumentsForType(
+ FunctionType function, Arguments arguments, int offset) {
+ if (forest.argumentsPositional(arguments).length <
+ function.requiredParameterCount) {
+ return fasta.templateTooFewArguments
+ .withArguments(function.requiredParameterCount,
+ forest.argumentsPositional(arguments).length)
+ .withLocation(uri, offset, noLength);
+ }
+ if (forest.argumentsPositional(arguments).length >
+ function.positionalParameters.length) {
+ return fasta.templateTooManyArguments
+ .withArguments(function.positionalParameters.length,
+ forest.argumentsPositional(arguments).length)
+ .withLocation(uri, offset, noLength);
+ }
+ List named = forest.argumentsNamed(arguments);
+ if (named.isNotEmpty) {
+ Set<String> names =
+ new Set.from(function.namedParameters.map((a) => a.name));
+ for (NamedExpression argument in named) {
+ if (!names.remove(argument.name)) {
+ return fasta.templateNoSuchNamedParameter
+ .withArguments(argument.name)
+ .withLocation(uri, argument.fileOffset, argument.name.length);
+ }
+ }
+ }
+
+ return null;
+ }
+
+ @override
void beginNewExpression(Token token) {
debugEvent("beginNewExpression");
super.push(constantContext);
@@ -2787,18 +2772,18 @@
PrefixBuilder deferredPrefix;
int checkOffset;
if (type is DeferredAccessGenerator) {
- DeferredAccessGenerator accessor = type;
- type = accessor.accessor;
- deferredPrefix = accessor.builder;
- checkOffset = accessor.token.charOffset;
+ DeferredAccessGenerator generator = type;
+ type = generator.generator;
+ deferredPrefix = generator.builder;
+ checkOffset = generator.token.charOffset;
}
- if (type is TypeDeclarationAccessor) {
- TypeDeclarationAccessor accessor = type;
- if (accessor.prefix != null) {
+ if (type is TypeDeclarationAccessGenerator) {
+ TypeDeclarationAccessGenerator generator = type;
+ if (generator.prefix != null) {
nameToken = nameToken.next.next;
}
- type = accessor.declaration;
+ type = generator.declaration;
}
ConstantContext savedConstantContext = pop();
@@ -2940,7 +2925,8 @@
if (context.isScopeReference && isInstanceContext) {
push(new ThisAccessGenerator(this, token, inInitializer));
} else {
- push(new IncompleteError(this, token, fasta.messageThisAsIdentifier));
+ push(new IncompleteErrorGenerator(
+ this, token, fasta.messageThisAsIdentifier));
}
}
@@ -2952,7 +2938,8 @@
member.transformerFlags |= TransformerFlag.superCalls;
push(new ThisAccessGenerator(this, token, inInitializer, isSuper: true));
} else {
- push(new IncompleteError(this, token, fasta.messageSuperAsIdentifier));
+ push(new IncompleteErrorGenerator(
+ this, token, fasta.messageSuperAsIdentifier));
}
}
@@ -3205,7 +3192,7 @@
deprecated_addCompileTimeError(
variable.fileOffset, "A for-in loop-variable can't be 'const'.");
}
- } else if (lvalue is FastaAccessor) {
+ } else if (lvalue is Generator) {
/// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
///
/// for (lvalue in expression) body
@@ -3261,7 +3248,8 @@
@override
void beginLabeledStatement(Token token, int labelCount) {
debugEvent("beginLabeledStatement");
- List<Label> labels = popList(labelCount);
+ List<Label> labels = popList(
+ labelCount, new List<Label>.filled(labelCount, null, growable: true));
enterLocalScope(null, scope.createNestedLabelScope());
LabelTarget target = new LabelTarget<Statement>(
member, functionNestingLevel, token.charOffset);
@@ -3277,20 +3265,22 @@
Statement statement = popStatement();
LabelTarget target = pop();
exitLocalScope();
- kernel.Statement kernelStatement = toKernelStatement(statement);
if (target.breakTarget.hasUsers) {
- if (kernelStatement is! LabeledStatement) {
- kernelStatement = new ShadowLabeledStatement(kernelStatement);
+ if (statement is! LabeledStatement) {
+ statement = forest.syntheticLabeledStatement(statement);
}
- target.breakTarget.resolveBreaks(forest, kernelStatement);
+ target.breakTarget.resolveBreaks(forest, statement);
}
+ // TODO(brianwilkerson): Figure out how to get the labels that are part of
+ // the statement.
+// statement = forest.labeledStatement(labels, statement);
if (target.continueTarget.hasUsers) {
- if (kernelStatement is! LabeledStatement) {
- kernelStatement = new ShadowLabeledStatement(kernelStatement);
+ if (statement is! LabeledStatement) {
+ statement = forest.syntheticLabeledStatement(statement);
}
- target.continueTarget.resolveContinues(forest, kernelStatement);
+ target.continueTarget.resolveContinues(forest, statement);
}
- push(kernelStatement);
+ push(statement);
}
@override
@@ -3352,48 +3342,10 @@
Expression message = popForValueIfNotNull(commaToken);
Expression condition = popForValue();
- // Compute start and end offsets for the condition expression.
- // This code is a temporary workaround because expressions don't carry
- // their start and end offsets currently.
- //
- // The token that follows leftParenthesis is considered to be the
- // first token of the condition.
- // TODO(ahe): this really should be condition.fileOffset.
- int startOffset = leftParenthesis.next.offset;
- int endOffset;
- {
- // Search forward from leftParenthesis to find the last token of
- // the condition - which is a token immediately followed by a commaToken,
- // right parenthesis or a trailing comma.
- Token conditionBoundary = commaToken ?? leftParenthesis.endGroup;
- Token conditionLastToken = leftParenthesis;
- while (!conditionLastToken.isEof) {
- Token nextToken = conditionLastToken.next;
- if (nextToken == conditionBoundary) {
- break;
- } else if (optional(',', nextToken) &&
- nextToken.next == conditionBoundary) {
- // The next token is trailing comma, which means current token is
- // the last token of the condition.
- break;
- }
- conditionLastToken = nextToken;
- }
- if (conditionLastToken.isEof) {
- endOffset = startOffset = -1;
- } else {
- endOffset = conditionLastToken.offset + conditionLastToken.length;
- }
- }
-
- AssertStatement statement = new ShadowAssertStatement(
- toKernelExpression(condition),
- conditionStartOffset: startOffset,
- conditionEndOffset: endOffset,
- message: toKernelExpression(message));
switch (kind) {
case Assert.Statement:
- push(statement);
+ push(forest.assertStatement(assertKeyword, leftParenthesis, condition,
+ commaToken, message, semicolonToken));
break;
case Assert.Expression:
@@ -3404,7 +3356,8 @@
break;
case Assert.Initializer:
- push(new ShadowAssertInitializer(statement));
+ push(forest.assertInitializer(
+ assertKeyword, leftParenthesis, condition, commaToken, message));
break;
}
}
@@ -3560,11 +3513,12 @@
bool hasTarget, Token breakKeyword, Token endToken) {
debugEvent("BreakStatement");
var target = breakTarget;
+ Identifier identifier;
String name;
if (hasTarget) {
- Identifier identifier = pop();
+ identifier = pop();
name = identifier.name;
- target = scope.lookupLabel(identifier.name);
+ target = scope.lookupLabel(name);
}
if (target == null && name == null) {
push(compileTimeErrorInLoopOrSwitch =
@@ -3582,8 +3536,8 @@
"Can't break to '$name' in a different function.",
breakKeyword.next.charOffset));
} else {
- BreakStatement statement = new ShadowBreakStatement(null)
- ..fileOffset = breakKeyword.charOffset;
+ Statement statement =
+ forest.breakStatement(breakKeyword, identifier, endToken);
target.addBreak(statement);
push(statement);
}
@@ -3594,9 +3548,10 @@
bool hasTarget, Token continueKeyword, Token endToken) {
debugEvent("ContinueStatement");
var target = continueTarget;
+ Identifier identifier;
String name;
if (hasTarget) {
- Identifier identifier = pop();
+ identifier = pop();
name = identifier.name;
target = scope.lookupLabel(identifier.name);
if (target != null && target is! JumpTarget) {
@@ -3639,8 +3594,8 @@
"Can't continue at '$name' in a different function.",
continueKeyword.next.charOffset));
} else {
- BreakStatement statement = new ShadowBreakStatement(null)
- ..fileOffset = continueKeyword.charOffset;
+ Statement statement =
+ forest.continueStatement(continueKeyword, identifier, endToken);
target.addContinue(statement);
push(statement);
}
@@ -3686,7 +3641,7 @@
List<Expression> annotations = pop();
KernelTypeVariableBuilder variable;
Object inScope = scopeLookup(scope, name.name, token);
- if (inScope is TypeDeclarationAccessor) {
+ if (inScope is TypeDeclarationAccessGenerator) {
variable = inScope.declaration;
} else {
// Something went wrong when pre-parsing the type variables.
@@ -4254,15 +4209,14 @@
String toString() => "label($name)";
}
-abstract class ContextAccessor<Arguments> extends FastaAccessor<Arguments>
- with GeneratorImpl {
- final BuilderHelper<dynamic, dynamic, Arguments> helper;
+abstract class ContextAwareGenerator<Arguments> extends Generator<Arguments> {
+ final Generator generator;
- final FastaAccessor accessor;
-
- final Token token;
-
- ContextAccessor(this.helper, this.token, this.accessor);
+ ContextAwareGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.generator)
+ : super(helper, token);
String get plainNameForRead {
return unsupported("plainNameForRead", token.charOffset, helper.uri);
@@ -4321,14 +4275,18 @@
}
}
-class DelayedAssignment<Arguments> extends ContextAccessor<Arguments> {
+class DelayedAssignment<Arguments> extends ContextAwareGenerator<Arguments> {
final kernel.Expression value;
final String assignmentOperator;
- DelayedAssignment(BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token, FastaAccessor accessor, this.value, this.assignmentOperator)
- : super(helper, token, accessor);
+ DelayedAssignment(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ Generator generator,
+ this.value,
+ this.assignmentOperator)
+ : super(helper, token, generator);
String get debugName => "DelayedAssignment";
@@ -4346,43 +4304,43 @@
"Not a constant expression.", offsetForToken(token));
}
if (identical("=", assignmentOperator)) {
- return accessor.buildAssignment(value, voidContext: voidContext);
+ return generator.buildAssignment(value, voidContext: voidContext);
} else if (identical("+=", assignmentOperator)) {
- return accessor.buildCompoundAssignment(plusName, value,
+ return generator.buildCompoundAssignment(plusName, value,
offset: offsetForToken(token), voidContext: voidContext);
} else if (identical("-=", assignmentOperator)) {
- return accessor.buildCompoundAssignment(minusName, value,
+ return generator.buildCompoundAssignment(minusName, value,
offset: offsetForToken(token), voidContext: voidContext);
} else if (identical("*=", assignmentOperator)) {
- return accessor.buildCompoundAssignment(multiplyName, value,
+ return generator.buildCompoundAssignment(multiplyName, value,
offset: offsetForToken(token), voidContext: voidContext);
} else if (identical("%=", assignmentOperator)) {
- return accessor.buildCompoundAssignment(percentName, value,
+ return generator.buildCompoundAssignment(percentName, value,
offset: offsetForToken(token), voidContext: voidContext);
} else if (identical("&=", assignmentOperator)) {
- return accessor.buildCompoundAssignment(ampersandName, value,
+ return generator.buildCompoundAssignment(ampersandName, value,
offset: offsetForToken(token), voidContext: voidContext);
} else if (identical("/=", assignmentOperator)) {
- return accessor.buildCompoundAssignment(divisionName, value,
+ return generator.buildCompoundAssignment(divisionName, value,
offset: offsetForToken(token), voidContext: voidContext);
} else if (identical("<<=", assignmentOperator)) {
- return accessor.buildCompoundAssignment(leftShiftName, value,
+ return generator.buildCompoundAssignment(leftShiftName, value,
offset: offsetForToken(token), voidContext: voidContext);
} else if (identical(">>=", assignmentOperator)) {
- return accessor.buildCompoundAssignment(rightShiftName, value,
+ return generator.buildCompoundAssignment(rightShiftName, value,
offset: offsetForToken(token), voidContext: voidContext);
} else if (identical("??=", assignmentOperator)) {
- return accessor.buildNullAwareAssignment(
+ return generator.buildNullAwareAssignment(
value, const DynamicType(), offsetForToken(token),
voidContext: voidContext);
} else if (identical("^=", assignmentOperator)) {
- return accessor.buildCompoundAssignment(caretName, value,
+ return generator.buildCompoundAssignment(caretName, value,
offset: offsetForToken(token), voidContext: voidContext);
} else if (identical("|=", assignmentOperator)) {
- return accessor.buildCompoundAssignment(barName, value,
+ return generator.buildCompoundAssignment(barName, value,
offset: offsetForToken(token), voidContext: voidContext);
} else if (identical("~/=", assignmentOperator)) {
- return accessor.buildCompoundAssignment(mustacheName, value,
+ return generator.buildCompoundAssignment(mustacheName, value,
offset: offsetForToken(token), voidContext: voidContext);
} else {
return unhandled(
@@ -4392,11 +4350,12 @@
@override
Initializer buildFieldInitializer(Map<String, int> initializedFields) {
- if (!identical("=", assignmentOperator) || !accessor.isThisPropertyAccess) {
- return accessor.buildFieldInitializer(initializedFields);
+ if (!identical("=", assignmentOperator) ||
+ !generator.isThisPropertyAccess) {
+ return generator.buildFieldInitializer(initializedFields);
}
return helper.buildFieldInitializer(
- false, accessor.plainNameForRead, offsetForToken(token), value);
+ false, generator.plainNameForRead, offsetForToken(token), value);
}
@override
@@ -4408,30 +4367,31 @@
}
}
-class DelayedPostfixIncrement<Arguments> extends ContextAccessor<Arguments> {
+class DelayedPostfixIncrement<Arguments>
+ extends ContextAwareGenerator<Arguments> {
final Name binaryOperator;
final Procedure interfaceTarget;
DelayedPostfixIncrement(
- BuilderHelper<dynamic, dynamic, Arguments> helper,
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
Token token,
- FastaAccessor accessor,
+ Generator generator,
this.binaryOperator,
this.interfaceTarget)
- : super(helper, token, accessor);
+ : super(helper, token, generator);
String get debugName => "DelayedPostfixIncrement";
kernel.Expression buildSimpleRead() {
- return accessor.buildPostfixIncrement(binaryOperator,
+ return generator.buildPostfixIncrement(binaryOperator,
offset: offsetForToken(token),
voidContext: false,
interfaceTarget: interfaceTarget);
}
kernel.Expression buildForEffect() {
- return accessor.buildPostfixIncrement(binaryOperator,
+ return generator.buildPostfixIncrement(binaryOperator,
offset: offsetForToken(token),
voidContext: true,
interfaceTarget: interfaceTarget);
@@ -4628,7 +4588,7 @@
}
Scope computeFormalParameterScope(Scope parent, Builder builder,
- BuilderHelper<dynamic, dynamic, Arguments> helper) {
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper) {
if (required.length == 0 && optional == null) return parent;
Map<String, Builder> local = <String, Builder>{};
@@ -4684,7 +4644,7 @@
return node.fullNameForErrors;
} else if (node is ThisAccessGenerator) {
return node.isSuper ? "super" : "this";
- } else if (node is FastaAccessor) {
+ } else if (node is Generator) {
return node.plainNameForRead;
} else {
return unhandled("${node.runtimeType}", "getNodeName", -1, null);
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 291cf8a..b644d94 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -2,8 +2,7 @@
// 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.
-/// A library to help transform compounds and null-aware accessors into
-/// let expressions.
+/// A library to help generate expression.
library fasta.expression_generator;
import '../../scanner/token.dart' show Token;
@@ -29,16 +28,16 @@
import '../parser.dart' show lengthForToken, lengthOfSpan, offsetForToken;
-import '../problems.dart' show unhandled, unimplemented, unsupported;
+import '../problems.dart' show unhandled, unsupported;
-import '../scope.dart' show AccessErrorBuilder, ProblemBuilder, Scope;
-
-import '../type_inference/type_promotion.dart' show TypePromoter;
+import '../scope.dart' show AccessErrorBuilder;
import 'body_builder.dart' show Identifier, noLocation;
import 'constness.dart' show Constness;
+import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
+
import 'forest.dart' show Forest;
import 'kernel_builder.dart' show LoadLibraryBuilder, PrefixBuilder;
@@ -50,8 +49,6 @@
Constructor,
DartType,
Field,
- FunctionNode,
- FunctionType,
Initializer,
InvalidType,
Let,
@@ -72,7 +69,6 @@
ShadowVariableAssignment,
ShadowVariableDeclaration,
ShadowVariableGet,
- StaticGet,
StaticSet,
SuperMethodInvocation,
SuperPropertySet,
@@ -94,44 +90,49 @@
KernelClassBuilder,
KernelFunctionTypeAliasBuilder,
KernelInvalidTypeBuilder,
- KernelPrefixBuilder,
KernelTypeVariableBuilder,
- LibraryBuilder,
LoadLibraryBuilder,
PrefixBuilder,
TypeDeclarationBuilder;
-part 'expression_generator_impl.dart';
-
-/// An [Accessor] represents a subexpression for which we can't yet build a
-/// kernel [kernel.Expression] because we don't yet know the context in which
-/// it is used.
+/// A generator represents a subexpression for which we can't yet build an
+/// expression because we don't yet know the context in which it's used.
///
-/// Once the context is known, an [Accessor] can be converted into an
-/// [kernel.Expression] by calling a "build" method.
+/// Once the context is known, a generator can be converted into an expression
+/// by calling a `build` method.
///
/// For example, when building a kernel representation for `a[x] = b`, after
/// parsing `a[x]` but before parsing `= b`, we don't yet know whether to
-/// generate an invocation of `operator[]` or `operator[]=`, so we generate an
-/// [Accessor] object. Later, after `= b` is parsed, [buildAssignment] will be
-/// called.
-// TODO(ahe): Move this into [Generator] when all uses have been updated.
-abstract class Accessor<Arguments> {
- final BuilderHelper<dynamic, dynamic, Arguments> helper;
+/// generate an invocation of `operator[]` or `operator[]=`, so we create a
+/// [Generator] object. Later, after `= b` is parsed, [buildAssignment] will
+/// be called.
+abstract class Generator<Arguments> {
+ final ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper;
final Token token;
- Accessor(this.helper, this.token);
+ Generator(this.helper, this.token);
+ // TODO(ahe): Change type arguments.
Forest<kernel.Expression, kernel.Statement, Token, Arguments> get forest =>
helper.forest;
- /// Builds an [kernel.Expression] representing a read from the accessor.
+ String get plainNameForRead;
+
+ String get debugName;
+
+ Uri get uri => helper.uri;
+
+ String get plainNameForWrite => plainNameForRead;
+
+ bool get isInitializer => false;
+
+ /// Builds a [kernel.Expression] representing a read from the generator.
kernel.Expression buildSimpleRead() {
return _finish(_makeSimpleRead(), null);
}
- /// Builds an [kernel.Expression] representing an assignment with the
- /// accessor on the LHS and [value] on the RHS.
+ /// Builds a [kernel.Expression] representing an assignment with the
+ /// generator on the LHS and [value] on the RHS.
///
/// The returned expression evaluates to the assigned value, unless
/// [voidContext] is true, in which case it may evaluate to anything.
@@ -142,8 +143,8 @@
complexAssignment);
}
- /// Returns an [kernel.Expression] representing a null-aware assignment
- /// (`??=`) with the accessor on the LHS and [value] on the RHS.
+ /// Returns a [kernel.Expression] representing a null-aware assignment
+ /// (`??=`) with the generator on the LHS and [value] on the RHS.
///
/// The returned expression evaluates to the assigned value, unless
/// [voidContext] is true, in which case it may evaluate to anything.
@@ -178,8 +179,8 @@
return _finish(makeLet(tmp, nullAwareCombiner), complexAssignment);
}
- /// Returns an [kernel.Expression] representing a compound assignment
- /// (e.g. `+=`) with the accessor on the LHS and [value] on the RHS.
+ /// Returns a [kernel.Expression] representing a compound assignment
+ /// (e.g. `+=`) with the generator on the LHS and [value] on the RHS.
kernel.Expression buildCompoundAssignment(
Name binaryOperator, kernel.Expression value,
{int offset: TreeNode.noOffset,
@@ -196,8 +197,8 @@
complexAssignment);
}
- /// Returns an [kernel.Expression] representing a pre-increment or
- /// pre-decrement of the accessor.
+ /// Returns a [kernel.Expression] representing a pre-increment or
+ /// pre-decrement of the generator.
kernel.Expression buildPrefixIncrement(Name binaryOperator,
{int offset: TreeNode.noOffset,
bool voidContext: false,
@@ -210,8 +211,8 @@
isPreIncDec: true);
}
- /// Returns an [kernel.Expression] representing a post-increment or
- /// post-decrement of the accessor.
+ /// Returns a [kernel.Expression] representing a post-increment or
+ /// post-decrement of the generator.
kernel.Expression buildPostfixIncrement(Name binaryOperator,
{int offset: TreeNode.noOffset,
bool voidContext: false,
@@ -258,40 +259,113 @@
}
}
- /// Returns an [kernel.Expression] representing a compile-time error.
+ /// Returns a [kernel.Expression] representing a compile-time error.
///
/// At runtime, an exception will be thrown.
- makeInvalidRead() {
- return unhandled("compile-time error", "$runtimeType",
- offsetForToken(token), helper.uri);
+ kernel.Expression makeInvalidRead() {
+ return buildThrowNoSuchMethodError(
+ forest.literalNull(token), forest.argumentsEmpty(noLocation),
+ isGetter: true);
}
- /// Returns an [kernel.Expression] representing a compile-time error wrapping
+ /// Returns a [kernel.Expression] representing a compile-time error wrapping
/// [value].
///
/// At runtime, [value] will be evaluated before throwing an exception.
- makeInvalidWrite(kernel.Expression value) {
- return unhandled("compile-time error", "$runtimeType",
- offsetForToken(token), helper.uri);
+ kernel.Expression makeInvalidWrite(kernel.Expression value) {
+ return buildThrowNoSuchMethodError(forest.literalNull(token),
+ forest.arguments(<kernel.Expression>[value], noLocation),
+ isSetter: true);
}
/// Creates a data structure for tracking the desugaring of a complex
/// assignment expression whose right hand side is [rhs].
ShadowComplexAssignment startComplexAssignment(kernel.Expression rhs) =>
new ShadowIllegalAssignment(rhs);
-}
-// TODO(ahe): Merge classes [Accessor] and [FastaAccessor] into this.
-abstract class Generator<Arguments> = Accessor<Arguments>
- with FastaAccessor<Arguments>;
+ T storeOffset<T>(T node, int offset) {
+ return helper.storeOffset(node, offset);
+ }
+
+ kernel.Expression buildForEffect() => buildSimpleRead();
+
+ Initializer buildFieldInitializer(Map<String, int> initializedFields) {
+ int offset = offsetForToken(token);
+ return helper.buildInvalidInitializer(
+ helper.buildCompileTimeError(
+ messageInvalidInitializer, offset, lengthForToken(token)),
+ offset);
+ }
+
+ /* kernel.Expression | Generator | Initializer */ doInvocation(
+ int offset, Arguments arguments);
+
+ /* kernel.Expression | Generator */ buildPropertyAccess(
+ IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
+ if (send is SendAccessGenerator) {
+ return helper.buildMethodInvocation(buildSimpleRead(), send.name,
+ send.arguments, offsetForToken(send.token),
+ isNullAware: isNullAware);
+ } else {
+ if (helper.constantContext != ConstantContext.none &&
+ send.name != lengthName) {
+ helper.deprecated_addCompileTimeError(
+ offsetForToken(token), "Not a constant expression.");
+ }
+ return PropertyAccessGenerator.make(helper, send.token, buildSimpleRead(),
+ send.name, null, null, isNullAware);
+ }
+ }
+
+ DartType buildTypeWithBuiltArguments(List<DartType> arguments,
+ {bool nonInstanceAccessIsError: false}) {
+ helper.addProblem(templateNotAType.withArguments(token.lexeme),
+ offsetForToken(token), lengthForToken(token));
+ return const InvalidType();
+ }
+
+ /* kernel.Expression | Generator */ buildThrowNoSuchMethodError(
+ kernel.Expression receiver, Arguments arguments,
+ {bool isSuper: false,
+ bool isGetter: false,
+ bool isSetter: false,
+ bool isStatic: false,
+ String name,
+ int offset,
+ LocatedMessage argMessage}) {
+ return helper.throwNoSuchMethodError(receiver, name ?? plainNameForWrite,
+ arguments, offset ?? offsetForToken(this.token),
+ isGetter: isGetter,
+ isSetter: isSetter,
+ isSuper: isSuper,
+ isStatic: isStatic,
+ argMessage: argMessage);
+ }
+
+ bool get isThisPropertyAccess => false;
+
+ void printOn(StringSink sink);
+
+ String toString() {
+ StringBuffer buffer = new StringBuffer();
+ buffer.write(debugName);
+ buffer.write("(offset: ");
+ buffer.write("${offsetForToken(token)}");
+ printOn(buffer);
+ buffer.write(")");
+ return "$buffer";
+ }
+}
class VariableUseGenerator<Arguments> extends Generator<Arguments> {
final VariableDeclaration variable;
final DartType promotedType;
- VariableUseGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token, this.variable,
+ VariableUseGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.variable,
[this.promotedType])
: super(helper, token);
@@ -353,7 +427,7 @@
VariableDeclaration _receiverVariable;
PropertyAccessGenerator.internal(
- BuilderHelper<dynamic, dynamic, Arguments> helper,
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
Token token,
this.receiver,
this.name,
@@ -361,8 +435,8 @@
this.setter)
: super(helper, token);
- static FastaAccessor<Arguments> make<Arguments>(
- BuilderHelper<dynamic, dynamic, Arguments> helper,
+ static Generator<Arguments> make<Arguments>(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
Token token,
kernel.Expression receiver,
Name name,
@@ -457,8 +531,12 @@
final Member setter;
- ThisPropertyAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token, this.name, this.getter, this.setter)
+ ThisPropertyAccessGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.name,
+ this.getter,
+ this.setter)
: super(helper, token);
String get plainNameForRead => name.name;
@@ -534,7 +612,7 @@
final DartType type;
NullAwarePropertyAccessGenerator(
- BuilderHelper<dynamic, dynamic, Arguments> helper,
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
Token token,
this.receiverExpression,
this.name,
@@ -589,7 +667,7 @@
}
kernel.Expression doInvocation(int offset, Arguments arguments) {
- return unimplemented("doInvocation", offset, uri);
+ return unsupported("doInvocation", offset, uri);
}
@override
@@ -622,7 +700,7 @@
final Member setter;
SuperPropertyAccessGenerator(
- BuilderHelper<dynamic, dynamic, Arguments> helper,
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
Token token,
this.name,
this.getter,
@@ -705,7 +783,7 @@
VariableDeclaration indexVariable;
IndexedAccessGenerator.internal(
- BuilderHelper<dynamic, dynamic, Arguments> helper,
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
Token token,
this.receiver,
this.index,
@@ -713,8 +791,8 @@
this.setter)
: super(helper, token);
- static FastaAccessor<Arguments> make<Arguments>(
- BuilderHelper<dynamic, dynamic, Arguments> helper,
+ static Generator<Arguments> make<Arguments>(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
Token token,
kernel.Expression receiver,
kernel.Expression index,
@@ -867,8 +945,12 @@
VariableDeclaration indexVariable;
- ThisIndexedAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token, this.index, this.getter, this.setter)
+ ThisIndexedAccessGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.index,
+ this.getter,
+ this.setter)
: super(helper, token);
String get plainNameForRead => "[]";
@@ -987,8 +1069,12 @@
VariableDeclaration indexVariable;
- SuperIndexedAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token, this.index, this.getter, this.setter)
+ SuperIndexedAccessGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.index,
+ this.getter,
+ this.setter)
: super(helper, token);
String get plainNameForRead => "[]";
@@ -1119,13 +1205,16 @@
final Member writeTarget;
- StaticAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token, this.readTarget, this.writeTarget)
+ StaticAccessGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.readTarget,
+ this.writeTarget)
: assert(readTarget != null || writeTarget != null),
super(helper, token);
factory StaticAccessGenerator.fromBuilder(
- BuilderHelper<dynamic, dynamic, Arguments> helper,
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
Builder builder,
Token token,
Builder builderSetter) {
@@ -1215,8 +1304,10 @@
class LoadLibraryGenerator<Arguments> extends Generator<Arguments> {
final LoadLibraryBuilder builder;
- LoadLibraryGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token, this.builder)
+ LoadLibraryGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.builder)
: super(helper, token);
String get plainNameForRead => 'loadLibrary';
@@ -1256,10 +1347,13 @@
class DeferredAccessGenerator<Arguments> extends Generator<Arguments> {
final PrefixBuilder builder;
- final FastaAccessor accessor;
+ final Generator generator;
- DeferredAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token, this.builder, this.accessor)
+ DeferredAccessGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.builder,
+ this.generator)
: super(helper, token);
String get plainNameForRead {
@@ -1271,27 +1365,27 @@
kernel.Expression _makeSimpleRead() {
return helper.wrapInDeferredCheck(
- accessor._makeSimpleRead(), builder, token.charOffset);
+ generator._makeSimpleRead(), builder, token.charOffset);
}
kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
return helper.wrapInDeferredCheck(
- accessor._makeRead(complexAssignment), builder, token.charOffset);
+ generator._makeRead(complexAssignment), builder, token.charOffset);
}
kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
ShadowComplexAssignment complexAssignment) {
return helper.wrapInDeferredCheck(
- accessor._makeWrite(value, voidContext, complexAssignment),
+ generator._makeWrite(value, voidContext, complexAssignment),
builder,
token.charOffset);
}
buildPropertyAccess(
- IncompleteSend send, int operatorOffset, bool isNullAware) {
+ IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
var propertyAccess =
- accessor.buildPropertyAccess(send, operatorOffset, isNullAware);
- if (propertyAccess is FastaAccessor) {
+ generator.buildPropertyAccess(send, operatorOffset, isNullAware);
+ if (propertyAccess is Generator) {
return new DeferredAccessGenerator(
helper, token, builder, propertyAccess);
} else {
@@ -1305,7 +1399,7 @@
{bool nonInstanceAccessIsError: false}) {
helper.addProblem(
templateDeferredTypeAnnotation.withArguments(
- accessor.buildTypeWithBuiltArguments(arguments,
+ generator.buildTypeWithBuiltArguments(arguments,
nonInstanceAccessIsError: nonInstanceAccessIsError),
builder.name),
offsetForToken(token),
@@ -1315,15 +1409,15 @@
kernel.Expression doInvocation(int offset, Arguments arguments) {
return helper.wrapInDeferredCheck(
- accessor.doInvocation(offset, arguments), builder, token.charOffset);
+ generator.doInvocation(offset, arguments), builder, token.charOffset);
}
@override
void printOn(StringSink sink) {
sink.write(", builder: ");
sink.write(builder);
- sink.write(", accessor: ");
- sink.write(accessor);
+ sink.write(", generator: ");
+ sink.write(generator);
}
}
@@ -1334,8 +1428,11 @@
VariableDeclaration value;
- ReadOnlyAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token, this.expression, this.plainNameForRead)
+ ReadOnlyAccessGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.expression,
+ this.plainNameForRead)
: super(helper, token);
String get debugName => "ReadOnlyAccessGenerator";
@@ -1378,7 +1475,8 @@
class LargeIntAccessGenerator<Arguments> extends Generator<Arguments> {
LargeIntAccessGenerator(
- BuilderHelper<dynamic, dynamic, Arguments> helper, Token token)
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token)
: super(helper, token);
// TODO(ahe): This should probably be calling unhandled.
@@ -1429,7 +1527,7 @@
implements Generator<Arguments> {
/// Pass [arguments] that must be evaluated before throwing an error. At
/// most one of [isGetter] and [isSetter] should be true and they're passed
- /// to [BuilderHelper.buildThrowNoSuchMethodError] if it is used.
+ /// to [ExpressionGeneratorHelper.buildThrowNoSuchMethodError] if it is used.
kernel.Expression buildError(Arguments arguments,
{bool isGetter: false, bool isSetter: false, int offset});
@@ -1455,7 +1553,7 @@
@override
buildPropertyAccess(
- IncompleteSend send, int operatorOffset, bool isNullAware) {
+ IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
return this;
}
@@ -1545,8 +1643,10 @@
final bool isSuper;
- ThisAccessGenerator(BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token, this.isInitializer,
+ ThisAccessGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.isInitializer,
{this.isSuper: false})
: super(helper, token);
@@ -1577,11 +1677,11 @@
}
buildPropertyAccess(
- IncompleteSend send, int operatorOffset, bool isNullAware) {
+ IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
Name name = send.name;
Arguments arguments = send.arguments;
int offset = offsetForToken(send.token);
- if (isInitializer && send is SendAccessor) {
+ if (isInitializer && send is SendAccessGenerator) {
if (isNullAware) {
helper.deprecated_addCompileTimeError(
operatorOffset, "Expected '.'\nTry removing '?'.");
@@ -1589,7 +1689,7 @@
return buildConstructorInitializer(offset, name, arguments);
}
Member getter = helper.lookupInstanceMember(name, isSuper: isSuper);
- if (send is SendAccessor) {
+ if (send is SendAccessGenerator) {
// Notice that 'this' or 'super' can't be null. So we can ignore the
// value of [isNullAware].
if (getter == null) {
@@ -1630,11 +1730,8 @@
Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper);
LocatedMessage argMessage;
if (constructor != null) {
- argMessage = helper.checkArguments(
- new FunctionTypeAccessor.fromNode(constructor.function),
- arguments,
- CalleeDesignation.Constructor,
- offset, <TypeParameter>[]);
+ argMessage = helper.checkArgumentsForFunction(
+ constructor.function, arguments, offset, <TypeParameter>[]);
}
if (constructor == null || argMessage != null) {
return helper.buildInvalidInitializer(
@@ -1696,13 +1793,13 @@
@override
kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
- return unimplemented("_makeRead", offsetForToken(token), uri);
+ return unsupported("_makeRead", offsetForToken(token), uri);
}
@override
kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
ShadowComplexAssignment complexAssignment) {
- return unimplemented("_makeWrite", offsetForToken(token), uri);
+ return unsupported("_makeWrite", offsetForToken(token), uri);
}
@override
@@ -1714,6 +1811,478 @@
}
}
+abstract class IncompleteSendGenerator<Arguments> extends Generator<Arguments> {
+ final Name name;
+
+ IncompleteSendGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.name)
+ : super(helper, token);
+
+ withReceiver(Object receiver, int operatorOffset, {bool isNullAware});
+
+ Arguments get arguments => null;
+
+ @override
+ kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ return unsupported("_makeRead", offsetForToken(token), uri);
+ }
+
+ @override
+ kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
+ ShadowComplexAssignment complexAssignment) {
+ return unsupported("_makeWrite", offsetForToken(token), uri);
+ }
+
+ @override
+ void printOn(StringSink sink) {
+ sink.write(", name: ");
+ sink.write(name.name);
+ }
+}
+
+class UnresolvedNameGenerator<Arguments> extends Generator<Arguments>
+ with ErroneousExpressionGenerator<Arguments> {
+ @override
+ final Name name;
+
+ UnresolvedNameGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.name)
+ : super(helper, token);
+
+ String get debugName => "UnresolvedNameGenerator";
+
+ kernel.Expression doInvocation(int charOffset, Arguments arguments) {
+ return buildError(arguments, offset: charOffset);
+ }
+
+ @override
+ DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
+ helper.addProblem(
+ templateUnresolvedPrefixInTypeAnnotation.withArguments(
+ name.name, suffix.name),
+ offsetForToken(token),
+ lengthOfSpan(token, suffix.token));
+ return const InvalidType();
+ }
+
+ @override
+ kernel.Expression buildError(Arguments arguments,
+ {bool isGetter: false, bool isSetter: false, int offset}) {
+ offset ??= offsetForToken(this.token);
+ return helper.throwNoSuchMethodError(
+ storeOffset(forest.literalNull(null), offset),
+ plainNameForRead,
+ arguments,
+ offset,
+ isGetter: isGetter,
+ isSetter: isSetter);
+ }
+
+ @override
+ kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ return unsupported("_makeRead", offsetForToken(token), uri);
+ }
+
+ @override
+ kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
+ ShadowComplexAssignment complexAssignment) {
+ return unsupported("_makeWrite", offsetForToken(token), uri);
+ }
+
+ @override
+ void printOn(StringSink sink) {
+ sink.write(", name: ");
+ sink.write(name.name);
+ }
+}
+
+class IncompleteErrorGenerator<Arguments>
+ extends IncompleteSendGenerator<Arguments>
+ with ErroneousExpressionGenerator<Arguments> {
+ final Message message;
+
+ IncompleteErrorGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.message)
+ : super(helper, token, null);
+
+ String get debugName => "IncompleteErrorGenerator";
+
+ @override
+ kernel.Expression buildError(Arguments arguments,
+ {bool isGetter: false, bool isSetter: false, int offset}) {
+ int length = noLength;
+ if (offset == null) {
+ offset = offsetForToken(token);
+ length = lengthForToken(token);
+ }
+ return helper.buildCompileTimeError(message, offset, length);
+ }
+
+ @override
+ DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
+ helper.addProblem(
+ templateNotAPrefixInTypeAnnotation.withArguments(
+ token.lexeme, suffix.name),
+ offsetForToken(token),
+ lengthOfSpan(token, suffix.token));
+ return const InvalidType();
+ }
+
+ @override
+ doInvocation(int offset, Arguments arguments) => this;
+
+ @override
+ void printOn(StringSink sink) {
+ sink.write(", message: ");
+ sink.write(message.code.name);
+ }
+}
+
+class SendAccessGenerator<Arguments>
+ extends IncompleteSendGenerator<Arguments> {
+ @override
+ final Arguments arguments;
+
+ SendAccessGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ Name name,
+ this.arguments)
+ : super(helper, token, name) {
+ assert(arguments != null);
+ }
+
+ String get plainNameForRead => name.name;
+
+ String get debugName => "SendAccessGenerator";
+
+ kernel.Expression buildSimpleRead() {
+ return unsupported("buildSimpleRead", offsetForToken(token), uri);
+ }
+
+ kernel.Expression buildAssignment(kernel.Expression value,
+ {bool voidContext: false}) {
+ return unsupported("buildAssignment", offsetForToken(token), uri);
+ }
+
+ withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
+ if (receiver is Generator) {
+ return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
+ }
+ if (receiver is PrefixBuilder) {
+ PrefixBuilder prefix = receiver;
+ if (isNullAware) {
+ helper.deprecated_addCompileTimeError(
+ offsetForToken(token),
+ "Library prefix '${prefix.name}' can't be used with null-aware "
+ "operator.\nTry removing '?'.");
+ }
+ receiver = helper.scopeLookup(prefix.exportScope, name.name, token,
+ isQualified: true, prefix: prefix);
+ return helper.finishSend(receiver, arguments, offsetForToken(token));
+ }
+ return helper.buildMethodInvocation(
+ helper.toValue(receiver), name, arguments, offsetForToken(token),
+ isNullAware: isNullAware);
+ }
+
+ kernel.Expression buildNullAwareAssignment(
+ kernel.Expression value, DartType type, int offset,
+ {bool voidContext: false}) {
+ return unsupported("buildNullAwareAssignment", offset, uri);
+ }
+
+ kernel.Expression buildCompoundAssignment(
+ Name binaryOperator, kernel.Expression value,
+ {int offset,
+ bool voidContext: false,
+ Procedure interfaceTarget,
+ bool isPreIncDec: false}) {
+ return unsupported(
+ "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
+ }
+
+ kernel.Expression buildPrefixIncrement(Name binaryOperator,
+ {int offset, bool voidContext: false, Procedure interfaceTarget}) {
+ return unsupported(
+ "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
+ }
+
+ kernel.Expression buildPostfixIncrement(Name binaryOperator,
+ {int offset, bool voidContext: false, Procedure interfaceTarget}) {
+ return unsupported(
+ "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
+ }
+
+ kernel.Expression doInvocation(int offset, Arguments arguments) {
+ return unsupported("doInvocation", offset, uri);
+ }
+
+ @override
+ void printOn(StringSink sink) {
+ super.printOn(sink);
+ sink.write(", arguments: ");
+ var node = arguments;
+ if (node is kernel.Node) {
+ printNodeOn(node, sink);
+ } else {
+ sink.write(node);
+ }
+ }
+}
+
+class IncompletePropertyAccessGenerator<Arguments>
+ extends IncompleteSendGenerator<Arguments> {
+ IncompletePropertyAccessGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ Name name)
+ : super(helper, token, name);
+
+ String get plainNameForRead => name.name;
+
+ String get debugName => "IncompletePropertyAccessGenerator";
+
+ kernel.Expression buildSimpleRead() {
+ return unsupported("buildSimpleRead", offsetForToken(token), uri);
+ }
+
+ kernel.Expression buildAssignment(kernel.Expression value,
+ {bool voidContext: false}) {
+ return unsupported("buildAssignment", offsetForToken(token), uri);
+ }
+
+ withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
+ if (receiver is Generator) {
+ return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
+ }
+ if (receiver is PrefixBuilder) {
+ PrefixBuilder prefix = receiver;
+ if (isNullAware) {
+ helper.deprecated_addCompileTimeError(
+ offsetForToken(token),
+ "Library prefix '${prefix.name}' can't be used with null-aware "
+ "operator.\nTry removing '?'.");
+ }
+ return helper.scopeLookup(prefix.exportScope, name.name, token,
+ isQualified: true, prefix: prefix);
+ }
+
+ return PropertyAccessGenerator.make(
+ helper, token, helper.toValue(receiver), name, null, null, isNullAware);
+ }
+
+ kernel.Expression buildNullAwareAssignment(
+ kernel.Expression value, DartType type, int offset,
+ {bool voidContext: false}) {
+ return unsupported("buildNullAwareAssignment", offset, uri);
+ }
+
+ kernel.Expression buildCompoundAssignment(
+ Name binaryOperator, kernel.Expression value,
+ {int offset,
+ bool voidContext: false,
+ Procedure interfaceTarget,
+ bool isPreIncDec: false}) {
+ return unsupported(
+ "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
+ }
+
+ kernel.Expression buildPrefixIncrement(Name binaryOperator,
+ {int offset, bool voidContext: false, Procedure interfaceTarget}) {
+ return unsupported(
+ "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
+ }
+
+ kernel.Expression buildPostfixIncrement(Name binaryOperator,
+ {int offset, bool voidContext: false, Procedure interfaceTarget}) {
+ return unsupported(
+ "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
+ }
+
+ kernel.Expression doInvocation(int offset, Arguments arguments) {
+ return unsupported("doInvocation", offset, uri);
+ }
+}
+
+class ParenthesizedExpressionGenerator<Arguments>
+ extends ReadOnlyAccessGenerator<Arguments> {
+ ParenthesizedExpressionGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ kernel.Expression expression)
+ : super(helper, token, expression, null);
+
+ String get debugName => "ParenthesizedExpressionGenerator";
+
+ kernel.Expression makeInvalidWrite(kernel.Expression value) {
+ return helper.deprecated_buildCompileTimeError(
+ "Can't assign to a parenthesized expression.", offsetForToken(token));
+ }
+}
+
+class TypeDeclarationAccessGenerator<Arguments>
+ extends ReadOnlyAccessGenerator<Arguments> {
+ /// The import prefix preceding the [declaration] reference, or `null` if
+ /// the reference is not prefixed.
+ final PrefixBuilder prefix;
+
+ /// The offset at which the [declaration] is referenced by this generator,
+ /// or `-1` if the reference is implicit.
+ final int declarationReferenceOffset;
+
+ final TypeDeclarationBuilder declaration;
+
+ TypeDeclarationAccessGenerator(
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
+ Token token,
+ this.prefix,
+ this.declarationReferenceOffset,
+ this.declaration,
+ String plainNameForRead)
+ : super(helper, token, null, plainNameForRead);
+
+ String get debugName => "TypeDeclarationAccessGenerator";
+
+ kernel.Expression get expression {
+ if (super.expression == null) {
+ int offset = offsetForToken(token);
+ if (declaration is KernelInvalidTypeBuilder) {
+ KernelInvalidTypeBuilder declaration = this.declaration;
+ helper.addProblemErrorIfConst(
+ declaration.message.messageObject, offset, token.length);
+ super.expression =
+ new Throw(forest.literalString(declaration.message.message, token))
+ ..fileOffset = offset;
+ } else {
+ super.expression = forest.literalType(
+ buildTypeWithBuiltArguments(null, nonInstanceAccessIsError: true),
+ token);
+ }
+ }
+ return super.expression;
+ }
+
+ kernel.Expression makeInvalidWrite(kernel.Expression value) {
+ return buildThrowNoSuchMethodError(
+ forest.literalNull(token),
+ storeOffset(forest.arguments(<kernel.Expression>[value], null),
+ value.fileOffset),
+ isSetter: true);
+ }
+
+ @override
+ buildPropertyAccess(
+ IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
+ // `SomeType?.toString` is the same as `SomeType.toString`, not
+ // `(SomeType).toString`.
+ isNullAware = false;
+
+ Name name = send.name;
+ Arguments arguments = send.arguments;
+
+ if (declaration is KernelClassBuilder) {
+ KernelClassBuilder declaration = this.declaration;
+ Builder builder = declaration.findStaticBuilder(
+ name.name, offsetForToken(token), uri, helper.library);
+
+ Generator generator;
+ if (builder == null) {
+ // If we find a setter, [builder] is an [AccessErrorBuilder], not null.
+ if (send is IncompletePropertyAccessGenerator) {
+ generator = new UnresolvedNameGenerator(helper, send.token, name);
+ } else {
+ return helper.buildConstructorInvocation(declaration, send.token,
+ arguments, name.name, null, token.charOffset, Constness.implicit);
+ }
+ } else {
+ Builder setter;
+ if (builder.isSetter) {
+ setter = builder;
+ } else if (builder.isGetter) {
+ setter = declaration.findStaticBuilder(
+ name.name, offsetForToken(token), uri, helper.library,
+ isSetter: true);
+ } else if (builder.isField && !builder.isFinal) {
+ setter = builder;
+ }
+ generator = new StaticAccessGenerator.fromBuilder(
+ helper, builder, send.token, setter);
+ }
+
+ return arguments == null
+ ? generator
+ : generator.doInvocation(offsetForToken(send.token), arguments);
+ } else {
+ return super.buildPropertyAccess(send, operatorOffset, isNullAware);
+ }
+ }
+
+ @override
+ DartType buildTypeWithBuiltArguments(List<DartType> arguments,
+ {bool nonInstanceAccessIsError: false}) {
+ if (arguments != null) {
+ int expected = 0;
+ if (declaration is KernelClassBuilder) {
+ expected = declaration.target.typeParameters.length;
+ } else if (declaration is FunctionTypeAliasBuilder) {
+ expected = declaration.target.typeParameters.length;
+ } else if (declaration is KernelTypeVariableBuilder) {
+ // Type arguments on a type variable - error reported elsewhere.
+ } else if (declaration is BuiltinTypeBuilder) {
+ // Type arguments on a built-in type, for example, dynamic or void.
+ expected = 0;
+ } else {
+ return unhandled(
+ "${declaration.runtimeType}",
+ "TypeDeclarationAccessGenerator.buildType",
+ offsetForToken(token),
+ helper.uri);
+ }
+ if (arguments.length != expected) {
+ helper.warnTypeArgumentsMismatch(
+ declaration.name, expected, offsetForToken(token));
+ // We ignore the provided arguments, which will in turn return the
+ // raw type below.
+ // TODO(sigmund): change to use an InvalidType and include the raw type
+ // as a recovery node once the IR can represent it (Issue #29840).
+ arguments = null;
+ }
+ }
+
+ DartType type;
+ if (arguments == null) {
+ TypeDeclarationBuilder typeDeclaration = declaration;
+ if (typeDeclaration is KernelClassBuilder) {
+ type = typeDeclaration.buildType(helper.library, null);
+ } else if (typeDeclaration is KernelFunctionTypeAliasBuilder) {
+ type = typeDeclaration.buildType(helper.library, null);
+ }
+ }
+ if (type == null) {
+ type =
+ declaration.buildTypesWithBuiltArguments(helper.library, arguments);
+ }
+ if (type is TypeParameterType) {
+ return helper.validatedTypeVariableUse(
+ type, offsetForToken(token), nonInstanceAccessIsError);
+ }
+ return type;
+ }
+
+ @override
+ kernel.Expression doInvocation(int offset, Arguments arguments) {
+ return helper.buildConstructorInvocation(declaration, token, arguments, "",
+ null, token.charOffset, Constness.implicit);
+ }
+}
+
kernel.Expression makeLet(
VariableDeclaration variable, kernel.Expression body) {
if (variable == null) return body;
@@ -1725,7 +2294,7 @@
Name operator,
Procedure interfaceTarget,
kernel.Expression right,
- BuilderHelper<dynamic, dynamic, Arguments> helper,
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper,
{int offset: TreeNode.noOffset}) {
return new ShadowMethodInvocation(
left,
@@ -1739,7 +2308,7 @@
}
kernel.Expression buildIsNull<Arguments>(kernel.Expression value, int offset,
- BuilderHelper<dynamic, dynamic, Arguments> helper) {
+ ExpressionGeneratorHelper<dynamic, dynamic, Arguments> helper) {
return makeBinary(value, equalsName, null,
helper.storeOffset(helper.forest.literalNull(null), offset), helper,
offset: offset);
@@ -1750,3 +2319,13 @@
// or is fresh (hence needs a let binding).
return new VariableDeclaration.forValue(value);
}
+
+int adjustForImplicitCall(String name, int offset) {
+ // Normally the offset is at the start of the token, but in this case,
+ // because we insert a '.call', we want it at the end instead.
+ return offset + (name?.length ?? 0);
+}
+
+bool isFieldOrGetter(Member member) {
+ return member is Field || (member is Procedure && member.isGetter);
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
new file mode 100644
index 0000000..5af746c
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2018, 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 fasta.expression_generator_helper;
+
+import '../../scanner/token.dart' show Token;
+
+import '../constant_context.dart' show ConstantContext;
+
+import '../fasta_codes.dart' show LocatedMessage;
+
+import '../messages.dart' show Message;
+
+import '../scope.dart' show ProblemBuilder, Scope;
+
+import '../type_inference/type_promotion.dart' show TypePromoter;
+
+import 'constness.dart' show Constness;
+
+import 'forest.dart' show Forest;
+
+import 'kernel_builder.dart' show PrefixBuilder;
+
+import 'kernel_ast_api.dart'
+ show
+ Constructor,
+ DartType,
+ FunctionNode,
+ FunctionType,
+ Initializer,
+ Member,
+ Name,
+ Procedure,
+ StaticGet,
+ TypeParameter,
+ TypeParameterType;
+
+import 'kernel_builder.dart'
+ show
+ KernelPrefixBuilder,
+ LibraryBuilder,
+ PrefixBuilder,
+ TypeDeclarationBuilder;
+
+abstract class ExpressionGeneratorHelper<Expression, Statement, Arguments> {
+ LibraryBuilder get library;
+
+ Uri get uri;
+
+ TypePromoter get typePromoter;
+
+ int get functionNestingLevel;
+
+ ConstantContext get constantContext;
+
+ Forest<Expression, Statement, Token, Arguments> get forest;
+
+ Constructor lookupConstructor(Name name, {bool isSuper});
+
+ Expression toValue(node);
+
+ Member lookupInstanceMember(Name name, {bool isSetter, bool isSuper});
+
+ scopeLookup(Scope scope, String name, Token token,
+ {bool isQualified: false, PrefixBuilder prefix});
+
+ finishSend(Object receiver, Arguments arguments, int offset);
+
+ Expression buildCompileTimeError(Message message, int charOffset, int length,
+ {List<LocatedMessage> context});
+
+ Expression wrapInCompileTimeError(Expression expression, Message message);
+
+ Expression deprecated_buildCompileTimeError(String error, [int offset]);
+
+ Initializer buildInvalidInitializer(Expression expression, [int offset]);
+
+ Initializer buildFieldInitializer(
+ bool isSynthetic, String name, int offset, Expression expression);
+
+ Initializer buildSuperInitializer(
+ bool isSynthetic, Constructor constructor, Arguments arguments,
+ [int offset]);
+
+ Initializer buildRedirectingInitializer(
+ Constructor constructor, Arguments arguments,
+ [int charOffset = -1]);
+
+ Expression buildStaticInvocation(Procedure target, Arguments arguments,
+ {Constness constness, int charOffset, Member initialTarget});
+
+ Expression buildProblemExpression(
+ ProblemBuilder builder, int offset, int length);
+
+ Expression throwNoSuchMethodError(
+ Expression receiver, String name, Arguments arguments, int offset,
+ {Member candidate,
+ bool isSuper,
+ bool isGetter,
+ bool isSetter,
+ bool isStatic,
+ LocatedMessage argMessage});
+
+ LocatedMessage checkArgumentsForFunction(FunctionNode function,
+ Arguments arguments, int offset, List<TypeParameter> typeParameters);
+
+ LocatedMessage checkArgumentsForType(
+ FunctionType function, Arguments arguments, int offset);
+
+ StaticGet makeStaticGet(Member readTarget, Token token);
+
+ Expression wrapInDeferredCheck(
+ Expression expression, KernelPrefixBuilder prefix, int charOffset);
+
+ dynamic deprecated_addCompileTimeError(int charOffset, String message);
+
+ bool isIdentical(Member member);
+
+ Expression buildMethodInvocation(
+ Expression receiver, Name name, Arguments arguments, int offset,
+ {bool isConstantExpression,
+ bool isNullAware,
+ bool isImplicitCall,
+ bool isSuper,
+ Member interfaceTarget});
+
+ Expression buildConstructorInvocation(
+ TypeDeclarationBuilder type,
+ Token nameToken,
+ Arguments arguments,
+ String name,
+ List<DartType> typeArguments,
+ int charOffset,
+ Constness constness);
+
+ DartType validatedTypeVariableUse(
+ TypeParameterType type, int offset, bool nonInstanceAccessIsError);
+
+ void addProblem(Message message, int charOffset, int length);
+
+ void addProblemErrorIfConst(Message message, int charOffset, int length);
+
+ Message warnUnresolvedGet(Name name, int charOffset, {bool isSuper});
+
+ Message warnUnresolvedSet(Name name, int charOffset, {bool isSuper});
+
+ Message warnUnresolvedMethod(Name name, int charOffset, {bool isSuper});
+
+ void warnTypeArgumentsMismatch(String name, int expected, int charOffset);
+
+ T storeOffset<T>(T node, int offset);
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart
deleted file mode 100644
index 603841f..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_impl.dart
+++ /dev/null
@@ -1,730 +0,0 @@
-// Copyright (c) 2016, 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.
-
-part of 'expression_generator.dart';
-
-abstract class BuilderHelper<Expression, Statement, Arguments> {
- LibraryBuilder get library;
-
- Uri get uri;
-
- TypePromoter get typePromoter;
-
- int get functionNestingLevel;
-
- ConstantContext get constantContext;
-
- Forest<Expression, Statement, Token, Arguments> get forest;
-
- Constructor lookupConstructor(Name name, {bool isSuper});
-
- Expression toValue(node);
-
- Member lookupInstanceMember(Name name, {bool isSetter, bool isSuper});
-
- scopeLookup(Scope scope, String name, Token token,
- {bool isQualified: false, PrefixBuilder prefix});
-
- finishSend(Object receiver, Arguments arguments, int offset);
-
- Expression buildCompileTimeError(Message message, int charOffset, int length,
- {List<LocatedMessage> context});
-
- Expression wrapInCompileTimeError(Expression expression, Message message);
-
- Expression deprecated_buildCompileTimeError(String error, [int offset]);
-
- Initializer buildInvalidInitializer(Expression expression, [int offset]);
-
- Initializer buildFieldInitializer(
- bool isSynthetic, String name, int offset, Expression expression);
-
- Initializer buildSuperInitializer(
- bool isSynthetic, Constructor constructor, Arguments arguments,
- [int offset]);
-
- Initializer buildRedirectingInitializer(
- Constructor constructor, Arguments arguments,
- [int charOffset = -1]);
-
- Expression buildStaticInvocation(Procedure target, Arguments arguments,
- {Constness constness, int charOffset, Member initialTarget});
-
- Expression buildProblemExpression(
- ProblemBuilder builder, int offset, int length);
-
- Expression throwNoSuchMethodError(
- Expression receiver, String name, Arguments arguments, int offset,
- {Member candidate,
- bool isSuper,
- bool isGetter,
- bool isSetter,
- bool isStatic,
- LocatedMessage argMessage});
-
- LocatedMessage checkArguments(FunctionTypeAccessor function,
- Arguments arguments, CalleeDesignation calleeKind, int offset,
- [List<TypeParameter> typeParameters]);
-
- StaticGet makeStaticGet(Member readTarget, Token token);
-
- Expression wrapInDeferredCheck(
- Expression expression, KernelPrefixBuilder prefix, int charOffset);
-
- dynamic deprecated_addCompileTimeError(int charOffset, String message);
-
- bool isIdentical(Member member);
-
- Expression buildMethodInvocation(
- Expression receiver, Name name, Arguments arguments, int offset,
- {bool isConstantExpression,
- bool isNullAware,
- bool isImplicitCall,
- bool isSuper,
- Member interfaceTarget});
-
- Expression buildConstructorInvocation(
- TypeDeclarationBuilder type,
- Token nameToken,
- Arguments arguments,
- String name,
- List<DartType> typeArguments,
- int charOffset,
- Constness constness);
-
- DartType validatedTypeVariableUse(
- TypeParameterType type, int offset, bool nonInstanceAccessIsError);
-
- void addProblem(Message message, int charOffset, int length);
-
- void addProblemErrorIfConst(Message message, int charOffset, int length);
-
- Message warnUnresolvedGet(Name name, int charOffset, {bool isSuper});
-
- Message warnUnresolvedSet(Name name, int charOffset, {bool isSuper});
-
- Message warnUnresolvedMethod(Name name, int charOffset, {bool isSuper});
-
- void warnTypeArgumentsMismatch(String name, int expected, int charOffset);
-
- T storeOffset<T>(T node, int offset);
-}
-
-// The name used to refer to a call target kind
-enum CalleeDesignation { Function, Method, Constructor }
-
-// Abstraction over FunctionNode and FunctionType to access the
-// number and names of parameters.
-class FunctionTypeAccessor {
- int requiredParameterCount;
- int positionalParameterCount;
-
- List _namedParameters;
-
- Set<String> get namedParameterNames {
- return new Set.from(_namedParameters.map((a) => a.name));
- }
-
- factory FunctionTypeAccessor.fromNode(FunctionNode node) {
- return new FunctionTypeAccessor._(node.requiredParameterCount,
- node.positionalParameters.length, node.namedParameters);
- }
-
- factory FunctionTypeAccessor.fromType(FunctionType type) {
- return new FunctionTypeAccessor._(type.requiredParameterCount,
- type.positionalParameters.length, type.namedParameters);
- }
-
- FunctionTypeAccessor._(this.requiredParameterCount,
- this.positionalParameterCount, this._namedParameters);
-}
-
-// TODO(ahe): Merge this into [Generator] when all uses have been updated.
-abstract class FastaAccessor<Arguments> implements Accessor<Arguments> {
- BuilderHelper<dynamic, dynamic, Arguments> get helper;
-
- // TODO(ahe): Change type arguments.
- Forest<kernel.Expression, kernel.Statement, Token, Arguments> get forest =>
- helper.forest;
-
- String get plainNameForRead;
-
- String get debugName;
-
- Uri get uri => helper.uri;
-
- String get plainNameForWrite => plainNameForRead;
-
- bool get isInitializer => false;
-
- T storeOffset<T>(T node, int offset) {
- return helper.storeOffset(node, offset);
- }
-
- kernel.Expression buildForEffect() => buildSimpleRead();
-
- Initializer buildFieldInitializer(Map<String, int> initializedFields) {
- int offset = offsetForToken(token);
- return helper.buildInvalidInitializer(
- helper.buildCompileTimeError(
- messageInvalidInitializer, offset, lengthForToken(token)),
- offset);
- }
-
- kernel.Expression makeInvalidRead() {
- return buildThrowNoSuchMethodError(
- forest.literalNull(token), forest.argumentsEmpty(noLocation),
- isGetter: true);
- }
-
- kernel.Expression makeInvalidWrite(kernel.Expression value) {
- return buildThrowNoSuchMethodError(forest.literalNull(token),
- forest.arguments(<kernel.Expression>[value], noLocation),
- isSetter: true);
- }
-
- /* kernel.Expression | FastaAccessor | Initializer */ doInvocation(
- int offset, Arguments arguments);
-
- /* kernel.Expression | FastaAccessor */ buildPropertyAccess(
- IncompleteSend send, int operatorOffset, bool isNullAware) {
- if (send is SendAccessor) {
- return helper.buildMethodInvocation(buildSimpleRead(), send.name,
- send.arguments, offsetForToken(send.token),
- isNullAware: isNullAware);
- } else {
- if (helper.constantContext != ConstantContext.none &&
- send.name != lengthName) {
- helper.deprecated_addCompileTimeError(
- offsetForToken(token), "Not a constant expression.");
- }
- return PropertyAccessGenerator.make(helper, send.token, buildSimpleRead(),
- send.name, null, null, isNullAware);
- }
- }
-
- DartType buildTypeWithBuiltArguments(List<DartType> arguments,
- {bool nonInstanceAccessIsError: false}) {
- helper.addProblem(templateNotAType.withArguments(token.lexeme),
- offsetForToken(token), lengthForToken(token));
- return const InvalidType();
- }
-
- /* kernel.Expression | FastaAccessor */ buildThrowNoSuchMethodError(
- kernel.Expression receiver, Arguments arguments,
- {bool isSuper: false,
- bool isGetter: false,
- bool isSetter: false,
- bool isStatic: false,
- String name,
- int offset,
- LocatedMessage argMessage}) {
- return helper.throwNoSuchMethodError(receiver, name ?? plainNameForWrite,
- arguments, offset ?? offsetForToken(this.token),
- isGetter: isGetter,
- isSetter: isSetter,
- isSuper: isSuper,
- isStatic: isStatic,
- argMessage: argMessage);
- }
-
- bool get isThisPropertyAccess => false;
-
- @override
- ShadowComplexAssignment startComplexAssignment(kernel.Expression rhs) =>
- new ShadowIllegalAssignment(rhs);
-
- void printOn(StringSink sink);
-
- String toString() {
- StringBuffer buffer = new StringBuffer();
- buffer.write(debugName);
- buffer.write("(offset: ");
- buffer.write("${offsetForToken(token)}");
- printOn(buffer);
- buffer.write(")");
- return "$buffer";
- }
-}
-
-abstract class GeneratorImpl {
- Token get token;
-
- Uri get uri;
-
- kernel.Expression _finish(
- kernel.Expression body, ShadowComplexAssignment complexAssignment) {
- return unimplemented("_finish", offsetForToken(token), uri);
- }
-
- kernel.Expression _makeSimpleRead() {
- return unimplemented("_makeSimpleRead", offsetForToken(token), uri);
- }
-
- kernel.Expression _makeSimpleWrite(kernel.Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
- return unimplemented("_makeSimpleWrite", offsetForToken(token), uri);
- }
-
- kernel.Expression _makeRead(ShadowComplexAssignment complexAssignment) {
- return unimplemented("_makeRead", offsetForToken(token), uri);
- }
-
- kernel.Expression _makeWrite(kernel.Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
- return unimplemented("_makeWrite", offsetForToken(token), uri);
- }
-}
-
-abstract class IncompleteSend<Arguments> extends FastaAccessor<Arguments>
- with GeneratorImpl {
- final BuilderHelper<dynamic, dynamic, Arguments> helper;
-
- @override
- final Token token;
-
- final Name name;
-
- IncompleteSend(this.helper, this.token, this.name);
-
- withReceiver(Object receiver, int operatorOffset, {bool isNullAware});
-
- Arguments get arguments => null;
-
- @override
- void printOn(StringSink sink) {
- sink.write(", name: ");
- sink.write(name.name);
- }
-}
-
-class IncompleteError<Arguments> extends IncompleteSend<Arguments>
- with ErroneousExpressionGenerator<Arguments> {
- final Message message;
-
- IncompleteError(BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token, this.message)
- : super(helper, token, null);
-
- String get debugName => "IncompleteError";
-
- @override
- kernel.Expression buildError(Arguments arguments,
- {bool isGetter: false, bool isSetter: false, int offset}) {
- int length = noLength;
- if (offset == null) {
- offset = offsetForToken(token);
- length = lengthForToken(token);
- }
- return helper.buildCompileTimeError(message, offset, length);
- }
-
- @override
- DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
- helper.addProblem(
- templateNotAPrefixInTypeAnnotation.withArguments(
- token.lexeme, suffix.name),
- offsetForToken(token),
- lengthOfSpan(token, suffix.token));
- return const InvalidType();
- }
-
- @override
- doInvocation(int offset, Arguments arguments) => this;
-
- @override
- void printOn(StringSink sink) {
- sink.write(", message: ");
- sink.write(message.code.name);
- }
-}
-
-class SendAccessor<Arguments> extends IncompleteSend<Arguments> {
- @override
- final Arguments arguments;
-
- SendAccessor(BuilderHelper<dynamic, dynamic, Arguments> helper, Token token,
- Name name, this.arguments)
- : super(helper, token, name) {
- assert(arguments != null);
- }
-
- String get plainNameForRead => name.name;
-
- String get debugName => "SendAccessor";
-
- kernel.Expression buildSimpleRead() {
- return unsupported("buildSimpleRead", offsetForToken(token), uri);
- }
-
- kernel.Expression buildAssignment(kernel.Expression value,
- {bool voidContext: false}) {
- return unsupported("buildAssignment", offsetForToken(token), uri);
- }
-
- withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
- if (receiver is FastaAccessor) {
- return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
- }
- if (receiver is PrefixBuilder) {
- PrefixBuilder prefix = receiver;
- if (isNullAware) {
- helper.deprecated_addCompileTimeError(
- offsetForToken(token),
- "Library prefix '${prefix.name}' can't be used with null-aware "
- "operator.\nTry removing '?'.");
- }
- receiver = helper.scopeLookup(prefix.exportScope, name.name, token,
- isQualified: true, prefix: prefix);
- return helper.finishSend(receiver, arguments, offsetForToken(token));
- }
- return helper.buildMethodInvocation(
- helper.toValue(receiver), name, arguments, offsetForToken(token),
- isNullAware: isNullAware);
- }
-
- kernel.Expression buildNullAwareAssignment(
- kernel.Expression value, DartType type, int offset,
- {bool voidContext: false}) {
- return unsupported("buildNullAwareAssignment", offset, uri);
- }
-
- kernel.Expression buildCompoundAssignment(
- Name binaryOperator, kernel.Expression value,
- {int offset,
- bool voidContext: false,
- Procedure interfaceTarget,
- bool isPreIncDec: false}) {
- return unsupported(
- "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
- }
-
- kernel.Expression buildPrefixIncrement(Name binaryOperator,
- {int offset, bool voidContext: false, Procedure interfaceTarget}) {
- return unsupported(
- "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
- }
-
- kernel.Expression buildPostfixIncrement(Name binaryOperator,
- {int offset, bool voidContext: false, Procedure interfaceTarget}) {
- return unsupported(
- "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
- }
-
- kernel.Expression doInvocation(int offset, Arguments arguments) {
- return unsupported("doInvocation", offset, uri);
- }
-
- @override
- void printOn(StringSink sink) {
- super.printOn(sink);
- sink.write(", arguments: ");
- var node = arguments;
- if (node is kernel.Node) {
- printNodeOn(node, sink);
- } else {
- sink.write(node);
- }
- }
-}
-
-class IncompletePropertyAccessor<Arguments> extends IncompleteSend<Arguments> {
- IncompletePropertyAccessor(
- BuilderHelper<dynamic, dynamic, Arguments> helper, Token token, Name name)
- : super(helper, token, name);
-
- String get plainNameForRead => name.name;
-
- String get debugName => "IncompletePropertyAccessor";
-
- kernel.Expression buildSimpleRead() {
- return unsupported("buildSimpleRead", offsetForToken(token), uri);
- }
-
- kernel.Expression buildAssignment(kernel.Expression value,
- {bool voidContext: false}) {
- return unsupported("buildAssignment", offsetForToken(token), uri);
- }
-
- withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
- if (receiver is FastaAccessor) {
- return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
- }
- if (receiver is PrefixBuilder) {
- PrefixBuilder prefix = receiver;
- if (isNullAware) {
- helper.deprecated_addCompileTimeError(
- offsetForToken(token),
- "Library prefix '${prefix.name}' can't be used with null-aware "
- "operator.\nTry removing '?'.");
- }
- return helper.scopeLookup(prefix.exportScope, name.name, token,
- isQualified: true, prefix: prefix);
- }
-
- return PropertyAccessGenerator.make(
- helper, token, helper.toValue(receiver), name, null, null, isNullAware);
- }
-
- kernel.Expression buildNullAwareAssignment(
- kernel.Expression value, DartType type, int offset,
- {bool voidContext: false}) {
- return unsupported("buildNullAwareAssignment", offset, uri);
- }
-
- kernel.Expression buildCompoundAssignment(
- Name binaryOperator, kernel.Expression value,
- {int offset,
- bool voidContext: false,
- Procedure interfaceTarget,
- bool isPreIncDec: false}) {
- return unsupported(
- "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
- }
-
- kernel.Expression buildPrefixIncrement(Name binaryOperator,
- {int offset, bool voidContext: false, Procedure interfaceTarget}) {
- return unsupported(
- "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
- }
-
- kernel.Expression buildPostfixIncrement(Name binaryOperator,
- {int offset, bool voidContext: false, Procedure interfaceTarget}) {
- return unsupported(
- "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
- }
-
- kernel.Expression doInvocation(int offset, Arguments arguments) {
- return unsupported("doInvocation", offset, uri);
- }
-}
-
-int adjustForImplicitCall(String name, int offset) {
- // Normally the offset is at the start of the token, but in this case,
- // because we insert a '.call', we want it at the end instead.
- return offset + (name?.length ?? 0);
-}
-
-class ParenthesizedExpression<Arguments>
- extends ReadOnlyAccessGenerator<Arguments> {
- ParenthesizedExpression(BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token, kernel.Expression expression)
- : super(helper, token, expression, null);
-
- String get debugName => "ParenthesizedExpression";
-
- kernel.Expression makeInvalidWrite(kernel.Expression value) {
- return helper.deprecated_buildCompileTimeError(
- "Can't assign to a parenthesized expression.", offsetForToken(token));
- }
-}
-
-class TypeDeclarationAccessor<Arguments>
- extends ReadOnlyAccessGenerator<Arguments> {
- /// The import prefix preceding the [declaration] reference, or `null` if
- /// the reference is not prefixed.
- final PrefixBuilder prefix;
-
- /// The offset at which the [declaration] is referenced by this accessor,
- /// or `-1` if the reference is implicit.
- final int declarationReferenceOffset;
-
- final TypeDeclarationBuilder declaration;
-
- TypeDeclarationAccessor(
- BuilderHelper<dynamic, dynamic, Arguments> helper,
- Token token,
- this.prefix,
- this.declarationReferenceOffset,
- this.declaration,
- String plainNameForRead)
- : super(helper, token, null, plainNameForRead);
-
- String get debugName => "TypeDeclarationAccessor";
-
- kernel.Expression get expression {
- if (super.expression == null) {
- int offset = offsetForToken(token);
- if (declaration is KernelInvalidTypeBuilder) {
- KernelInvalidTypeBuilder declaration = this.declaration;
- helper.addProblemErrorIfConst(
- declaration.message.messageObject, offset, token.length);
- super.expression =
- new Throw(forest.literalString(declaration.message.message, token))
- ..fileOffset = offset;
- } else {
- super.expression = forest.literalType(
- buildTypeWithBuiltArguments(null, nonInstanceAccessIsError: true),
- token);
- }
- }
- return super.expression;
- }
-
- kernel.Expression makeInvalidWrite(kernel.Expression value) {
- return buildThrowNoSuchMethodError(
- forest.literalNull(token),
- storeOffset(forest.arguments(<kernel.Expression>[value], null),
- value.fileOffset),
- isSetter: true);
- }
-
- @override
- buildPropertyAccess(
- IncompleteSend send, int operatorOffset, bool isNullAware) {
- // `SomeType?.toString` is the same as `SomeType.toString`, not
- // `(SomeType).toString`.
- isNullAware = false;
-
- Name name = send.name;
- Arguments arguments = send.arguments;
-
- if (declaration is KernelClassBuilder) {
- KernelClassBuilder declaration = this.declaration;
- Builder builder = declaration.findStaticBuilder(
- name.name, offsetForToken(token), uri, helper.library);
-
- FastaAccessor accessor;
- if (builder == null) {
- // If we find a setter, [builder] is an [AccessErrorBuilder], not null.
- if (send is IncompletePropertyAccessor) {
- accessor = new UnresolvedAccessor(helper, send.token, name);
- } else {
- return helper.buildConstructorInvocation(declaration, send.token,
- arguments, name.name, null, token.charOffset, Constness.implicit);
- }
- } else {
- Builder setter;
- if (builder.isSetter) {
- setter = builder;
- } else if (builder.isGetter) {
- setter = declaration.findStaticBuilder(
- name.name, offsetForToken(token), uri, helper.library,
- isSetter: true);
- } else if (builder.isField && !builder.isFinal) {
- setter = builder;
- }
- accessor = new StaticAccessGenerator.fromBuilder(
- helper, builder, send.token, setter);
- }
-
- return arguments == null
- ? accessor
- : accessor.doInvocation(offsetForToken(send.token), arguments);
- } else {
- return super.buildPropertyAccess(send, operatorOffset, isNullAware);
- }
- }
-
- @override
- DartType buildTypeWithBuiltArguments(List<DartType> arguments,
- {bool nonInstanceAccessIsError: false}) {
- if (arguments != null) {
- int expected = 0;
- if (declaration is KernelClassBuilder) {
- expected = declaration.target.typeParameters.length;
- } else if (declaration is FunctionTypeAliasBuilder) {
- expected = declaration.target.typeParameters.length;
- } else if (declaration is KernelTypeVariableBuilder) {
- // Type arguments on a type variable - error reported elsewhere.
- } else if (declaration is BuiltinTypeBuilder) {
- // Type arguments on a built-in type, for example, dynamic or void.
- expected = 0;
- } else {
- return unhandled(
- "${declaration.runtimeType}",
- "TypeDeclarationAccessor.buildType",
- offsetForToken(token),
- helper.uri);
- }
- if (arguments.length != expected) {
- helper.warnTypeArgumentsMismatch(
- declaration.name, expected, offsetForToken(token));
- // We ignore the provided arguments, which will in turn return the
- // raw type below.
- // TODO(sigmund): change to use an InvalidType and include the raw type
- // as a recovery node once the IR can represent it (Issue #29840).
- arguments = null;
- }
- }
-
- DartType type;
- if (arguments == null) {
- TypeDeclarationBuilder typeDeclaration = declaration;
- if (typeDeclaration is KernelClassBuilder) {
- type = typeDeclaration.buildType(helper.library, null);
- } else if (typeDeclaration is KernelFunctionTypeAliasBuilder) {
- type = typeDeclaration.buildType(helper.library, null);
- }
- }
- if (type == null) {
- type =
- declaration.buildTypesWithBuiltArguments(helper.library, arguments);
- }
- if (type is TypeParameterType) {
- return helper.validatedTypeVariableUse(
- type, offsetForToken(token), nonInstanceAccessIsError);
- }
- return type;
- }
-
- @override
- kernel.Expression doInvocation(int offset, Arguments arguments) {
- return helper.buildConstructorInvocation(declaration, token, arguments, "",
- null, token.charOffset, Constness.implicit);
- }
-}
-
-class UnresolvedAccessor<Arguments> extends FastaAccessor<Arguments>
- with GeneratorImpl, ErroneousExpressionGenerator<Arguments> {
- @override
- final Token token;
-
- @override
- final BuilderHelper<dynamic, dynamic, Arguments> helper;
-
- @override
- final Name name;
-
- UnresolvedAccessor(this.helper, this.token, this.name);
-
- String get debugName => "UnresolvedAccessor";
-
- kernel.Expression doInvocation(int charOffset, Arguments arguments) {
- return buildError(arguments, offset: charOffset);
- }
-
- @override
- DartType buildErroneousTypeNotAPrefix(Identifier suffix) {
- helper.addProblem(
- templateUnresolvedPrefixInTypeAnnotation.withArguments(
- name.name, suffix.name),
- offsetForToken(token),
- lengthOfSpan(token, suffix.token));
- return const InvalidType();
- }
-
- @override
- kernel.Expression buildError(Arguments arguments,
- {bool isGetter: false, bool isSetter: false, int offset}) {
- offset ??= offsetForToken(this.token);
- return helper.throwNoSuchMethodError(
- storeOffset(forest.literalNull(null), offset),
- plainNameForRead,
- arguments,
- offset,
- isGetter: isGetter,
- isSetter: isSetter);
- }
-
- @override
- void printOn(StringSink sink) {
- sink.write(", name: ");
- sink.write(name.name);
- }
-}
-
-bool isFieldOrGetter(Member member) {
- return member is Field || (member is Procedure && member.isGetter);
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 8f539a0..49330c6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -9,6 +9,7 @@
import 'package:kernel/ast.dart'
show
Arguments,
+ AssertInitializer,
BreakStatement,
Block,
Catch,
@@ -30,7 +31,7 @@
VariableDeclaration,
setParents;
-import '../parser.dart' show offsetForToken;
+import '../parser.dart' show offsetForToken, optional;
import '../problems.dart' show unsupported;
@@ -40,9 +41,12 @@
show
ShadowArguments,
ShadowAsExpression,
+ ShadowAssertInitializer,
+ ShadowAssertStatement,
ShadowAwaitExpression,
ShadowBlock,
ShadowBoolLiteral,
+ ShadowBreakStatement,
ShadowCheckLibraryIsLoaded,
ShadowConditionalExpression,
ShadowDoStatement,
@@ -222,6 +226,59 @@
}
@override
+ AssertInitializer assertInitializer(
+ Token assertKeyword,
+ Token leftParenthesis,
+ Expression condition,
+ Token comma,
+ Expression message) {
+ return new ShadowAssertInitializer(assertStatement(
+ assertKeyword, leftParenthesis, condition, comma, message, null));
+ }
+
+ @override
+ Statement assertStatement(Token assertKeyword, Token leftParenthesis,
+ Expression condition, Token comma, Expression message, Token semicolon) {
+ // Compute start and end offsets for the condition expression.
+ // This code is a temporary workaround because expressions don't carry
+ // their start and end offsets currently.
+ //
+ // The token that follows leftParenthesis is considered to be the
+ // first token of the condition.
+ // TODO(ahe): this really should be condition.fileOffset.
+ int startOffset = leftParenthesis.next.offset;
+ int endOffset;
+ {
+ // Search forward from leftParenthesis to find the last token of
+ // the condition - which is a token immediately followed by a commaToken,
+ // right parenthesis or a trailing comma.
+ Token conditionBoundary = comma ?? leftParenthesis.endGroup;
+ Token conditionLastToken = leftParenthesis;
+ while (!conditionLastToken.isEof) {
+ Token nextToken = conditionLastToken.next;
+ if (nextToken == conditionBoundary) {
+ break;
+ } else if (optional(',', nextToken) &&
+ nextToken.next == conditionBoundary) {
+ // The next token is trailing comma, which means current token is
+ // the last token of the condition.
+ break;
+ }
+ conditionLastToken = nextToken;
+ }
+ if (conditionLastToken.isEof) {
+ endOffset = startOffset = -1;
+ } else {
+ endOffset = conditionLastToken.offset + conditionLastToken.length;
+ }
+ }
+ return new ShadowAssertStatement(condition,
+ conditionStartOffset: startOffset,
+ conditionEndOffset: endOffset,
+ message: message);
+ }
+
+ @override
Expression awaitExpression(Expression operand, Token token) {
return new ShadowAwaitExpression(operand)
..fileOffset = offsetForToken(token);
@@ -245,6 +302,11 @@
}
@override
+ Statement breakStatement(Token breakKeyword, Object label, Token semicolon) {
+ return new ShadowBreakStatement(null)..fileOffset = breakKeyword.charOffset;
+ }
+
+ @override
Expression conditionalExpression(Expression condition, Token question,
Expression thenExpression, Token colon, Expression elseExpression) {
return new ShadowConditionalExpression(
@@ -253,6 +315,13 @@
}
@override
+ Statement continueStatement(
+ Token continueKeyword, Object label, Token semicolon) {
+ return new ShadowBreakStatement(null)
+ ..fileOffset = continueKeyword.charOffset;
+ }
+
+ @override
Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
Expression condition, Token semicolon) {
return new ShadowDoStatement(body, condition)
@@ -291,7 +360,7 @@
}
@override
- Object parenthesizedCondition(
+ Expression parenthesizedCondition(
Token leftParenthesis, Expression expression, Token rightParenthesis) {
return expression;
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 99375a3..f7a8b61 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -9,6 +9,8 @@
import 'body_builder.dart' show Identifier;
+export 'body_builder.dart' show Identifier, Operator;
+
/// A tree factory.
///
/// For now, the [Location] is always a token.
@@ -133,6 +135,20 @@
Expression asExpression(
Expression expression, covariant type, Location location);
+ /// Return a representation of an assert that appears in a constructor's
+ /// initializer list.
+ Object assertInitializer(Location assertKeyword, Location leftParenthesis,
+ Expression condition, Location comma, Expression message);
+
+ /// Return a representation of an assert that appears as a statement.
+ Statement assertStatement(
+ Location assertKeyword,
+ Location leftParenthesis,
+ Expression condition,
+ Location comma,
+ Expression message,
+ Location semicolon);
+
Expression awaitExpression(Expression operand, Location location);
/// Return a representation of a block of [statements] enclosed between the
@@ -140,6 +156,10 @@
Statement block(
Location openBrace, List<Statement> statements, Location closeBrace);
+ /// Return a representation of a break statement.
+ Statement breakStatement(
+ Location breakKeyword, Identifier label, Location semicolon);
+
/// Return a representation of a conditional expression. The [condition] is
/// the expression preceding the question mark. The [question] is the `?`. The
/// [thenExpression] is the expression following the question mark. The
@@ -148,6 +168,10 @@
Expression conditionalExpression(Expression condition, Location question,
Expression thenExpression, Location colon, Expression elseExpression);
+ /// Return a representation of a continue statement.
+ Statement continueStatement(
+ Location continueKeyword, Identifier label, Location semicolon);
+
/// Return a representation of a do statement.
Statement doStatement(
Location doKeyword,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index fac004f..59c4740 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -67,7 +67,9 @@
import 'body_builder.dart' show combineStatements;
-import 'expression_generator.dart' show BuilderHelper, makeLet;
+import 'expression_generator.dart' show makeLet;
+
+import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
/// Indicates whether type inference involving conditional expressions should
/// always use least upper bound.
@@ -2080,8 +2082,8 @@
// with another, and we can only replace a node if it has a parent pointer.
assert(expression.parent != null);
- // For full (non-top level) inference, we need access to the BuilderHelper
- // so that we can perform error recovery.
+ // For full (non-top level) inference, we need access to the
+ // ExpressionGeneratorHelper so that we can perform error recovery.
assert(isTopLevel || helper != null);
// When doing top level inference, we skip subexpressions whose type isn't
@@ -2112,7 +2114,8 @@
}
@override
- void inferInitializer(BuilderHelper helper, Initializer initializer) {
+ void inferInitializer(
+ ExpressionGeneratorHelper helper, Initializer initializer) {
assert(initializer is ShadowInitializer);
this.helper = helper;
// Use polymorphic dispatch on [KernelInitializer] to perform whatever
@@ -2127,8 +2130,8 @@
@override
void inferStatement(Statement statement) {
- // For full (non-top level) inference, we need access to the BuilderHelper
- // so that we can perform error recovery.
+ // For full (non-top level) inference, we need access to the
+ // ExpressionGeneratorHelper so that we can perform error recovery.
if (!isTopLevel) assert(helper != null);
if (statement is ShadowStatement) {
diff --git a/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart b/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
index fb9401b..27e7370 100644
--- a/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
@@ -6,7 +6,7 @@
import '../../scanner/token.dart' show Token;
-import 'assert.dart' show Assert;
+import 'error_delegation_listener.dart' show ErrorDelegationListener;
import 'listener.dart' show Listener;
@@ -15,6 +15,8 @@
/// Parser similar to [TopLevelParser] but also parses class members (excluding
/// their bodies).
class ClassMemberParser extends Parser {
+ Parser skipParser;
+
ClassMemberParser(Listener listener) : super(listener);
@override
@@ -27,13 +29,17 @@
return token.next;
}
- @override
- Token parseAssert(Token token, Assert kind) {
- if (kind == Assert.Statement) {
- return super.parseAssert(token, kind);
- } else {
- return skipExpression(token);
- }
+ Token skipExpression(Token token) {
+ // TODO(askesc): We listen to errors occurring during expression parsing,
+ // since the parser may rewrite the token stream such that the error is
+ // not triggered during the second parse.
+ // When the parser supports not doing token stream rewriting, use that
+ // feature together with a no-op listener instead.
+ skipParser ??= new Parser(new ErrorDelegationListener(listener));
+ skipParser.mayParseFunctionExpressions = mayParseFunctionExpressions;
+ skipParser.asyncState = asyncState;
+ skipParser.loopState = loopState;
+ return skipParser.parseExpression(token);
}
// This method is overridden for two reasons:
diff --git a/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.dart b/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.dart
new file mode 100644
index 0000000..99a7671
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/parser/error_delegation_listener.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2018, 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 '../../scanner/token.dart' show Token;
+
+import '../fasta_codes.dart' show Message;
+
+import 'listener.dart' show Listener;
+
+/// A listener which forwards error reports to another listener but ignores
+/// all other events.
+class ErrorDelegationListener extends Listener {
+ Listener delegate;
+
+ ErrorDelegationListener(this.delegate);
+
+ Token handleUnrecoverableError(Token token, Message message) {
+ return delegate.handleUnrecoverableError(token, message);
+ }
+
+ void handleRecoverableError(
+ Message message, Token startToken, Token endToken) {
+ return delegate.handleRecoverableError(message, startToken, endToken);
+ }
+}
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
index 962bded..a4075e1 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
@@ -35,23 +35,21 @@
/// Identifier is one of the shown/hidden names in an import/export
/// combinator.
- static const combinator = const IdentifierContext('combinator');
+ static const combinator = const CombinatorIdentifierContext();
/// Identifier is the start of a name in an annotation that precedes a
/// declaration (i.e. it appears directly after an `@`).
- static const metadataReference =
- const IdentifierContext('metadataReference', isScopeReference: true);
+ static const metadataReference = const MetadataReferenceIdentifierContext();
/// Identifier is part of a name in an annotation that precedes a declaration,
/// but it's not the first identifier in the name.
static const metadataContinuation =
- const IdentifierContext('metadataContinuation', isContinuation: true);
+ const MetadataReferenceIdentifierContext.continuation();
/// Identifier is part of a name in an annotation that precedes a declaration,
/// but it appears after type parameters (e.g. `foo` in `@X<Y>.foo()`).
- static const metadataContinuationAfterTypeArguments = const IdentifierContext(
- 'metadataContinuationAfterTypeArguments',
- isContinuation: true);
+ static const metadataContinuationAfterTypeArguments =
+ const MetadataReferenceIdentifierContext.continuationAfterTypeArguments();
/// Identifier is the name being declared by a typedef declaration.
static const typedefDeclaration = const TypedefDeclarationIdentifierContext();
@@ -77,15 +75,12 @@
/// Identifier is the start of a library name referenced by a `part of`
/// directive (e.g. `foo` in the directive `part of foo;`).
- static const partName =
- const IdentifierContext('partName', inLibraryOrPartOfDeclaration: true);
+ static const partName = const LibraryIdentifierContext.partName();
/// Identifier is part of a library name referenced by a `part of` directive,
/// but it's not the first identifier in the name.
- static const partNameContinuation = const IdentifierContext(
- 'partNameContinuation',
- inLibraryOrPartOfDeclaration: true,
- isContinuation: true);
+ static const partNameContinuation =
+ const LibraryIdentifierContext.partNameContinuation();
/// Identifier is the type name being declared by an enum declaration.
static const enumDeclaration = const EnumDeclarationIdentifierContext();
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
index a5d808f..2beb97c 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
@@ -52,6 +52,44 @@
}
}
+/// See [IdentifierContext.combinator].
+class CombinatorIdentifierContext extends IdentifierContext {
+ const CombinatorIdentifierContext() : super('combinator');
+
+ @override
+ Token ensureIdentifier(Token token, Parser parser) {
+ Token identifier = token.next;
+ assert(identifier.kind != IDENTIFIER_TOKEN);
+ const followingValues = const [';', ',', 'if', 'as', 'show', 'hide'];
+
+ if (identifier.isIdentifier) {
+ if (!looksLikeStartOfNextTopLevelDeclaration(identifier) ||
+ isOneOfOrEof(identifier.next, followingValues)) {
+ return identifier;
+ }
+ // Although this is a valid identifier name, the import declaration
+ // is invalid and this looks like the start of the next declaration.
+ // In this situation, fall through to insert a synthetic identifier.
+ }
+
+ // Recovery
+ if (isOneOfOrEof(identifier, followingValues) ||
+ looksLikeStartOfNextTopLevelDeclaration(identifier)) {
+ identifier = parser.insertSyntheticIdentifier(token, this,
+ message: fasta.templateExpectedIdentifier.withArguments(identifier));
+ } else {
+ parser.reportRecoverableErrorWithToken(
+ identifier, fasta.templateExpectedIdentifier);
+ if (!identifier.isKeywordOrIdentifier) {
+ // When in doubt, consume the token to ensure we make progress
+ // but insert a synthetic identifier to satisfy listeners.
+ identifier = parser.rewriter.insertSyntheticIdentifier(identifier);
+ }
+ }
+ return identifier;
+ }
+}
+
/// See [IdentifierContext.dottedName].
class DottedNameIdentifierContext extends IdentifierContext {
const DottedNameIdentifierContext() : super('dottedName');
@@ -334,7 +372,10 @@
}
}
-/// See [IdentifierContext.libraryName].
+/// See [IdentifierContext.libraryName],
+/// and [IdentifierContext.libraryNameContinuation]
+/// and [IdentifierContext.partName],
+/// and [IdentifierContext.partNameContinuation].
class LibraryIdentifierContext extends IdentifierContext {
const LibraryIdentifierContext()
: super('libraryName', inLibraryOrPartOfDeclaration: true);
@@ -343,6 +384,13 @@
: super('libraryNameContinuation',
inLibraryOrPartOfDeclaration: true, isContinuation: true);
+ const LibraryIdentifierContext.partName()
+ : super('partName', inLibraryOrPartOfDeclaration: true);
+
+ const LibraryIdentifierContext.partNameContinuation()
+ : super('partNameContinuation',
+ inLibraryOrPartOfDeclaration: true, isContinuation: true);
+
@override
Token ensureIdentifier(Token token, Parser parser) {
Token identifier = token.next;
@@ -410,6 +458,47 @@
}
}
+/// See [IdentifierContext.metadataReference]
+/// and [IdentifierContext.metadataContinuation]
+/// and [IdentifierContext.metadataContinuationAfterTypeArguments].
+class MetadataReferenceIdentifierContext extends IdentifierContext {
+ const MetadataReferenceIdentifierContext()
+ : super('metadataReference', isScopeReference: true);
+
+ const MetadataReferenceIdentifierContext.continuation()
+ : super('metadataContinuation', isContinuation: true);
+
+ const MetadataReferenceIdentifierContext.continuationAfterTypeArguments()
+ : super('metadataContinuationAfterTypeArguments', isContinuation: true);
+
+ @override
+ Token ensureIdentifier(Token token, Parser parser) {
+ Token identifier = token.next;
+ assert(identifier.kind != IDENTIFIER_TOKEN);
+ if (identifier.isIdentifier) {
+ return identifier;
+ }
+
+ // Recovery
+ if (isOneOfOrEof(identifier, const ['{', '}', '(', ')', ']']) ||
+ looksLikeStartOfNextTopLevelDeclaration(identifier) ||
+ looksLikeStartOfNextClassMember(identifier) ||
+ looksLikeStartOfNextStatement(identifier)) {
+ identifier = parser.insertSyntheticIdentifier(token, this,
+ message: fasta.templateExpectedIdentifier.withArguments(identifier));
+ } else {
+ parser.reportRecoverableErrorWithToken(
+ identifier, fasta.templateExpectedIdentifier);
+ if (!identifier.isKeywordOrIdentifier) {
+ // When in doubt, consume the token to ensure we make progress
+ // but insert a synthetic identifier to satisfy listeners.
+ identifier = parser.rewriter.insertSyntheticIdentifier(identifier);
+ }
+ }
+ return identifier;
+ }
+}
+
/// See [IdentifierContext.methodDeclaration],
/// and [IdentifierContext.methodDeclarationContinuation],
/// and [IdentifierContext.operatorName].
@@ -655,5 +744,4 @@
bool looksLikeStartOfNextTopLevelDeclaration(Token token) =>
token.isTopLevelKeyword ||
- isOneOfOrEof(
- token, const ['class', 'const', 'get', 'final', 'set', 'var', 'void']);
+ isOneOfOrEof(token, const ['const', 'get', 'final', 'set', 'var', 'void']);
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index d0777a2..fc82a91 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -3990,71 +3990,6 @@
return token;
}
- Token skipExpression(Token token) {
- while (true) {
- Token next = token.next;
- final kind = next.kind;
- final value = next.stringValue;
- if ((identical(kind, EOF_TOKEN)) ||
- (identical(value, ';')) ||
- (identical(value, ',')) ||
- (identical(value, '}')) ||
- (identical(value, ')')) ||
- (identical(value, ']'))) {
- break;
- }
- if (identical(value, '=') ||
- identical(value, '?') ||
- identical(value, ':') ||
- identical(value, '??')) {
- var nextValue = next.next.stringValue;
- if (identical(nextValue, 'const')) {
- token = next;
- next = token.next;
- nextValue = next.next.stringValue;
- }
- if (identical(nextValue, '{')) {
- // Handle cases like this:
- // class Foo {
- // var map;
- // Foo() : map = {};
- // Foo.x() : map = true ? {} : {};
- // }
- token = next.next.endGroup ?? next;
- next = token.next;
- continue;
- }
- if (identical(nextValue, '<')) {
- // Handle cases like this:
- // class Foo {
- // var map;
- // Foo() : map = <String, Foo>{};
- // Foo.x() : map = true ? <String, Foo>{} : <String, Foo>{};
- // }
- token = next.next.endGroup ?? next;
- next = token.next;
- if (identical(next.stringValue, '{')) {
- token = next.endGroup ?? next;
- next = token.next;
- }
- continue;
- }
- }
- if (!mayParseFunctionExpressions && identical(value, '{')) {
- break;
- }
- if (next is BeginToken) {
- token = next.endGroup ?? next;
- } else {
- if (next is ErrorToken) {
- reportErrorToken(next, false);
- }
- token = next;
- }
- }
- return token;
- }
-
int expressionDepth = 0;
Token parseExpression(Token token) {
if (expressionDepth++ > 500) {
@@ -5674,7 +5609,7 @@
if (identical(value, 'on')) {
// 'on' type catchPart?
onKeyword = token;
- lastConsumed = parseType(token);
+ lastConsumed = computeType(token, true).ensureTypeNotVoid(token, this);
token = lastConsumed.next;
value = token.stringValue;
}
@@ -6135,8 +6070,10 @@
// TODO(danrubel): Provide a more specific error message for extra ';'.
reportRecoverableErrorWithToken(next, fasta.templateExpectedClassMember);
listener.handleInvalidMember(next);
- // Ensure we make progress.
- token = next;
+ if (!identical(value, '}')) {
+ // Ensure we make progress.
+ token = next;
+ }
} else {
token = parseFields(beforeStart, externalToken, staticToken,
covariantToken, varFinalOrConst, beforeType, typeInfo, token, false);
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index 5cf8451..71ae91c 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -26,7 +26,8 @@
import '../kernel/kernel_body_builder.dart' show KernelBodyBuilder;
-import '../parser.dart' show IdentifierContext, MemberKind, Parser, optional;
+import '../parser.dart'
+ show Assert, IdentifierContext, MemberKind, Parser, optional;
import '../problems.dart' show internalProblem, unexpected;
@@ -588,6 +589,13 @@
}
@override
+ void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
+ Token commaToken, Token semicolonToken) {
+ debugEvent("Assert");
+ // Do nothing
+ }
+
+ @override
void beginClassBody(Token token) {
debugEvent("beginClassBody");
String name = pop();
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 195f710..1a2fa07 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -54,7 +54,7 @@
operatorRequiredArgumentCount;
import '../parser.dart'
- show FormalParameterKind, IdentifierContext, MemberKind, optional;
+ show Assert, FormalParameterKind, IdentifierContext, MemberKind, optional;
import '../problems.dart' show unhandled;
@@ -902,6 +902,13 @@
}
@override
+ void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
+ Token commaToken, Token semicolonToken) {
+ debugEvent("Assert");
+ // Do nothing
+ }
+
+ @override
void endEnum(Token enumKeyword, Token leftBrace, int count) {
String documentationComment = getDocumentationComment(enumKeyword);
List constantNamesAndOffsets = popList(count * 3);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index eaa54e0..9237dcd 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -62,8 +62,10 @@
import '../fasta_codes.dart';
-import '../kernel/expression_generator.dart'
- show BuilderHelper, CalleeDesignation, FunctionTypeAccessor, buildIsNull;
+import '../kernel/expression_generator.dart' show buildIsNull;
+
+import '../kernel/expression_generator_helper.dart'
+ show ExpressionGeneratorHelper;
import '../kernel/kernel_shadow_ast.dart'
show
@@ -322,18 +324,20 @@
Uri get uri;
/// Performs full type inference on the given field initializer.
- void inferFieldInitializer(
- BuilderHelper helper, DartType declaredType, Expression initializer);
+ void inferFieldInitializer(ExpressionGeneratorHelper helper,
+ DartType declaredType, Expression initializer);
/// Performs type inference on the given function body.
- void inferFunctionBody(BuilderHelper helper, DartType returnType,
+ void inferFunctionBody(ExpressionGeneratorHelper helper, DartType returnType,
AsyncMarker asyncMarker, Statement body);
/// Performs type inference on the given constructor initializer.
- void inferInitializer(BuilderHelper helper, Initializer initializer);
+ void inferInitializer(
+ ExpressionGeneratorHelper helper, Initializer initializer);
/// Performs type inference on the given metadata annotations.
- void inferMetadata(BuilderHelper helper, List<Expression> annotations);
+ void inferMetadata(
+ ExpressionGeneratorHelper helper, List<Expression> annotations);
/// Performs type inference on the given metadata annotations keeping the
/// existing helper if possible.
@@ -341,8 +345,8 @@
/// Performs type inference on the given function parameter initializer
/// expression.
- void inferParameterInitializer(
- BuilderHelper helper, Expression initializer, DartType declaredType);
+ void inferParameterInitializer(ExpressionGeneratorHelper helper,
+ Expression initializer, DartType declaredType);
}
/// Implementation of [TypeInferrer] which doesn't do any type inference.
@@ -362,25 +366,27 @@
Uri get uri => null;
@override
- void inferFieldInitializer(
- BuilderHelper helper, DartType declaredType, Expression initializer) {}
+ void inferFieldInitializer(ExpressionGeneratorHelper helper,
+ DartType declaredType, Expression initializer) {}
@override
- void inferFunctionBody(BuilderHelper helper, DartType returnType,
+ void inferFunctionBody(ExpressionGeneratorHelper helper, DartType returnType,
AsyncMarker asyncMarker, Statement body) {}
@override
- void inferInitializer(BuilderHelper helper, Initializer initializer) {}
+ void inferInitializer(
+ ExpressionGeneratorHelper helper, Initializer initializer) {}
@override
- void inferMetadata(BuilderHelper helper, List<Expression> annotations) {}
+ void inferMetadata(
+ ExpressionGeneratorHelper helper, List<Expression> annotations) {}
@override
void inferMetadataKeepingHelper(List<Expression> annotations) {}
@override
- void inferParameterInitializer(
- BuilderHelper helper, Expression initializer, DartType declaredType) {}
+ void inferParameterInitializer(ExpressionGeneratorHelper helper,
+ Expression initializer, DartType declaredType) {}
}
/// Derived class containing generic implementations of [TypeInferrer].
@@ -418,7 +424,7 @@
final SourceLibraryBuilder library;
- BuilderHelper helper;
+ ExpressionGeneratorHelper helper;
/// Context information for the current closure, or `null` if we are not
/// inside a closure.
@@ -924,8 +930,8 @@
Expression expression, DartType typeContext, bool typeNeeded);
@override
- void inferFieldInitializer(
- BuilderHelper helper, DartType declaredType, Expression initializer) {
+ void inferFieldInitializer(ExpressionGeneratorHelper helper,
+ DartType declaredType, Expression initializer) {
assert(closureContext == null);
this.helper = helper;
var actualType = inferExpression(
@@ -944,7 +950,7 @@
DartType inferFieldTopLevel(ShadowField field, bool typeNeeded);
@override
- void inferFunctionBody(BuilderHelper helper, DartType returnType,
+ void inferFunctionBody(ExpressionGeneratorHelper helper, DartType returnType,
AsyncMarker asyncMarker, Statement body) {
assert(closureContext == null);
this.helper = helper;
@@ -1057,14 +1063,8 @@
arguments.types.addAll(inferredTypes);
}
if (typeChecksNeeded && !identical(calleeType, unknownFunction)) {
- CalleeDesignation calleeKind = receiverType is FunctionType
- ? CalleeDesignation.Function
- : CalleeDesignation.Method;
- LocatedMessage argMessage = helper.checkArguments(
- new FunctionTypeAccessor.fromType(calleeType),
- arguments,
- calleeKind,
- offset);
+ LocatedMessage argMessage =
+ helper.checkArgumentsForType(calleeType, arguments, offset);
if (argMessage != null) {
helper.addProblem(
argMessage.messageObject, argMessage.charOffset, argMessage.length);
@@ -1243,7 +1243,8 @@
}
@override
- void inferMetadata(BuilderHelper helper, List<Expression> annotations) {
+ void inferMetadata(
+ ExpressionGeneratorHelper helper, List<Expression> annotations) {
if (annotations != null) {
this.helper = helper;
inferMetadataKeepingHelper(annotations);
@@ -1325,8 +1326,8 @@
}
@override
- void inferParameterInitializer(
- BuilderHelper helper, Expression initializer, DartType declaredType) {
+ void inferParameterInitializer(ExpressionGeneratorHelper helper,
+ Expression initializer, DartType declaredType) {
assert(closureContext == null);
this.helper = helper;
assert(declaredType != null);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index 6554d8e..0297c47 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -267,7 +267,22 @@
downwardsInferPhase: formalTypes == null);
}
- /// Use the given [constraints] to substitute for type variables..
+ bool hasOmittedBound(TypeParameter parameter) {
+ // If the bound was omitted by the programmer, the Kernel representation for
+ // the parameter will look similar to the following:
+ //
+ // T extends Object = dynamic
+ //
+ // Note that it's not possible to receive [Object] as [TypeParameter.bound]
+ // and `dynamic` as [TypeParameter.defaultType] from the front end in any
+ // other way.
+ DartType bound = parameter.bound;
+ return bound is InterfaceType &&
+ identical(bound.classNode, coreTypes.objectClass) &&
+ parameter.defaultType is DynamicType;
+ }
+
+ /// Use the given [constraints] to substitute for type variables.
///
/// [typeParametersToInfer] is the set of type parameters that should be
/// substituted for. [inferredTypes] should be a list of the same length.
@@ -293,7 +308,7 @@
var typeParamBound = typeParam.bound;
DartType extendsConstraint;
- if (!_isObjectOrDynamic(typeParamBound)) {
+ if (!hasOmittedBound(typeParam)) {
extendsConstraint = Substitution
.fromPairs(typeParametersToInfer, inferredTypes)
.substituteType(typeParamBound);
@@ -326,7 +341,7 @@
var inferred = inferredTypes[i];
bool success = typeSatisfiesConstraint(inferred, constraint);
- if (success && !_isObjectOrDynamic(typeParamBound)) {
+ if (success && !hasOmittedBound(typeParam)) {
// If everything else succeeded, check the `extends` constraint.
var extendsConstraint = typeParamBound;
success = isSubtypeOf(inferred, extendsConstraint);
@@ -666,11 +681,6 @@
return hierarchy.getClassicLeastUpperBound(type1, type2);
}
- bool _isObjectOrDynamic(DartType type) =>
- type is DynamicType ||
- (type is InterfaceType &&
- identical(type.classNode, coreTypes.objectClass));
-
DartType _typeParameterLeastUpperBound(DartType type1, DartType type2) {
// This currently just implements a simple least upper bound to
// handle some common cases. It also avoids some termination issues
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index d6a7570..02eedd8 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -83,8 +83,6 @@
ConstEvalNonConstantLiteral/dart2jsCode: Fail
ConstEvalNonConstantLiteral/example: Fail
ConstFieldWithoutInitializer/example: Fail
-ConstructorHasNoSuchNamedParameter/analyzerCode: Fail
-ConstructorHasNoSuchNamedParameter/example: Fail
ConstructorNotFound/analyzerCode: Fail
ConstructorNotFound/example: Fail
ContinueOutsideOfLoop/script1: Fail
@@ -195,8 +193,6 @@
ForInLoopExactlyOneVariable/statement: Fail # Fasta reports too many errors.
ForInLoopNotAssignable/analyzerCode: Fail # The analyzer reports a different error.
ForInLoopNotAssignable/statement: Fail
-FunctionHasNoSuchNamedParameter/analyzerCode: Fail
-FunctionHasNoSuchNamedParameter/example: Fail
FunctionTypeDefaultValue/example: Fail
FunctionTypedParameterVar/script1: Fail
GeneratorReturnsValue/example: Fail
@@ -258,8 +254,6 @@
MemberWithSameNameAsClass/example: Fail
MetadataTypeArguments/analyzerCode: Fail
MetadataTypeArguments/example: Fail
-MethodHasNoSuchNamedParameter/analyzerCode: Fail
-MethodHasNoSuchNamedParameter/example: Fail
MethodNotFound/analyzerCode: Fail
MethodNotFound/example: Fail
MissingAssignableSelector/script1: Fail
@@ -280,6 +274,8 @@
NamedFunctionExpression/example: Fail
NativeClauseShouldBeAnnotation/example: Fail
NoFormals/example: Fail
+NoSuchNamedParameter/analyzerCode: Fail
+NoSuchNamedParameter/example: Fail
NoUnnamedConstructorInObject/analyzerCode: Fail
NoUnnamedConstructorInObject/example: Fail
NonAsciiIdentifier/expression: Fail
@@ -388,18 +384,10 @@
ThisAccessInFieldInitializer/example: Fail
ThisAsIdentifier/analyzerCode: Fail
ThisAsIdentifier/example: Fail
-TooFewArgumentsToConstructor/analyzerCode: Fail
-TooFewArgumentsToConstructor/example: Fail
-TooFewArgumentsToFunction/analyzerCode: Fail
-TooFewArgumentsToFunction/example: Fail
-TooFewArgumentsToMethod/analyzerCode: Fail
-TooFewArgumentsToMethod/example: Fail
-TooManyArgumentsToConstructor/analyzerCode: Fail
-TooManyArgumentsToConstructor/example: Fail
-TooManyArgumentsToFunction/analyzerCode: Fail
-TooManyArgumentsToFunction/example: Fail
-TooManyArgumentsToMethod/analyzerCode: Fail
-TooManyArgumentsToMethod/example: Fail
+TooFewArguments/analyzerCode: Fail
+TooFewArguments/example: Fail
+TooManyArguments/analyzerCode: Fail
+TooManyArguments/example: Fail
TopLevelOperator/script1: Fail
TopLevelOperator/script2: Fail
TopLevelOperator/script3: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index acbe910..1e8e061 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1065,40 +1065,16 @@
template: "The class '#name' has a constructor that takes no arguments."
severity: CONTEXT
-TooFewArgumentsToFunction:
- template: "Too few positional arguments to function: #count required, #count2 given."
+TooFewArguments:
+ template: "Too few positional arguments: #count required, #count2 given."
severity: ERROR_LEGACY_WARNING
-TooFewArgumentsToMethod:
- template: "Too few positional arguments to method: #count required, #count2 given."
+TooManyArguments:
+ template: "Too many positional arguments: #count allowed, #count2 given."
severity: ERROR_LEGACY_WARNING
-TooFewArgumentsToConstructor:
- template: "Too few positional arguments to constructor: #count required, #count2 given."
- severity: ERROR_LEGACY_WARNING
-
-TooManyArgumentsToFunction:
- template: "Too many positional arguments to function: #count allowed, #count2 given."
- severity: ERROR_LEGACY_WARNING
-
-TooManyArgumentsToMethod:
- template: "Too many positional arguments to method: #count allowed, #count2 given."
- severity: ERROR_LEGACY_WARNING
-
-TooManyArgumentsToConstructor:
- template: "Too many positional arguments to constructor: #count allowed, #count2 given."
- severity: ERROR_LEGACY_WARNING
-
-FunctionHasNoSuchNamedParameter:
- template: "Function has no named parameter with the name '#name'."
- severity: ERROR_LEGACY_WARNING
-
-MethodHasNoSuchNamedParameter:
- template: "Method has no named parameter with the name '#name'."
- severity: ERROR_LEGACY_WARNING
-
-ConstructorHasNoSuchNamedParameter:
- template: "Constructor has no named parameter with the name '#name'."
+NoSuchNamedParameter:
+ template: "No named parameter with the name '#name'."
severity: ERROR_LEGACY_WARNING
AbstractClassInstantiation:
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index de65fd9..e228c60 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -47,25 +47,25 @@
import 'package:front_end/src/fasta/kernel/expression_generator.dart'
show
DeferredAccessGenerator,
- FastaAccessor,
- IncompleteError,
- IncompletePropertyAccessor,
+ Generator,
+ IncompleteErrorGenerator,
+ IncompletePropertyAccessGenerator,
IndexedAccessGenerator,
LargeIntAccessGenerator,
LoadLibraryGenerator,
NullAwarePropertyAccessGenerator,
- ParenthesizedExpression,
+ ParenthesizedExpressionGenerator,
PropertyAccessGenerator,
ReadOnlyAccessGenerator,
- SendAccessor,
+ SendAccessGenerator,
StaticAccessGenerator,
SuperIndexedAccessGenerator,
SuperPropertyAccessGenerator,
ThisAccessGenerator,
ThisIndexedAccessGenerator,
ThisPropertyAccessGenerator,
- TypeDeclarationAccessor,
- UnresolvedAccessor,
+ TypeDeclarationAccessGenerator,
+ UnresolvedNameGenerator,
VariableUseGenerator;
import 'package:front_end/src/fasta/kernel/body_builder.dart'
@@ -76,7 +76,7 @@
import 'package:front_end/src/fasta/scanner.dart' show Token, scanString;
-void check(String expected, FastaAccessor<Arguments> generator) {
+void check(String expected, Generator<Arguments> generator) {
Expect.stringEquals(expected, "$generator");
}
@@ -123,7 +123,7 @@
KernelBodyBuilder helper = new KernelBodyBuilder(
libraryBuilder, null, null, null, null, null, null, false, uri, null);
- FastaAccessor accessor =
+ Generator generator =
new ThisAccessGenerator<Arguments>(helper, token, false);
Library library = new Library(uri);
@@ -137,12 +137,12 @@
"DelayedAssignment(offset: 4, value: expression,"
" assignmentOperator: +=)",
new DelayedAssignment<Arguments>(
- helper, token, accessor, expression, assignmentOperator));
+ helper, token, generator, expression, assignmentOperator));
check(
"DelayedPostfixIncrement(offset: 4, binaryOperator: +,"
" interfaceTarget: $uri::#class1::myInterfaceTarget)",
new DelayedPostfixIncrement<Arguments>(
- helper, token, accessor, binaryOperator, interfaceTarget));
+ helper, token, generator, binaryOperator, interfaceTarget));
check(
"VariableUseGenerator(offset: 4, variable: dynamic #t1;\n,"
" promotedType: void)",
@@ -197,19 +197,19 @@
check(
"ThisAccessGenerator(offset: 4, isInitializer: false, isSuper: false)",
new ThisAccessGenerator<Arguments>(helper, token, false));
- check("IncompleteError(offset: 4, message: Unspecified)",
- new IncompleteError<Arguments>(helper, token, message));
- check("SendAccessor(offset: 4, name: bar, arguments: (\"arg\"))",
- new SendAccessor<Arguments>(helper, token, name, arguments));
- check("IncompletePropertyAccessor(offset: 4, name: bar)",
- new IncompletePropertyAccessor<Arguments>(helper, token, name));
+ check("IncompleteErrorGenerator(offset: 4, message: Unspecified)",
+ new IncompleteErrorGenerator<Arguments>(helper, token, message));
+ check("SendAccessGenerator(offset: 4, name: bar, arguments: (\"arg\"))",
+ new SendAccessGenerator<Arguments>(helper, token, name, arguments));
+ check("IncompletePropertyAccessGenerator(offset: 4, name: bar)",
+ new IncompletePropertyAccessGenerator<Arguments>(helper, token, name));
check(
"DeferredAccessGenerator(offset: 4, "
"builder: Instance of 'PrefixBuilder',"
- " accessor: ThisAccessGenerator(offset: 4, isInitializer: false,"
+ " generator: ThisAccessGenerator(offset: 4, isInitializer: false,"
" isSuper: false))",
new DeferredAccessGenerator<Arguments>(
- helper, token, prefixBuilder, accessor));
+ helper, token, prefixBuilder, generator));
check(
"ReadOnlyAccessGenerator(offset: 4, expression: expression,"
" plainNameForRead: foo, value: null)",
@@ -218,15 +218,16 @@
check("LargeIntAccessGenerator(offset: 4, lexeme: myToken)",
new LargeIntAccessGenerator<Arguments>(helper, token));
check(
- "ParenthesizedExpression(offset: 4, expression: expression,"
+ "ParenthesizedExpressionGenerator(offset: 4, expression: expression,"
" plainNameForRead: null, value: null)",
- new ParenthesizedExpression<Arguments>(helper, token, expression));
+ new ParenthesizedExpressionGenerator<Arguments>(
+ helper, token, expression));
check(
- "TypeDeclarationAccessor(offset: 4, expression: T,"
+ "TypeDeclarationAccessGenerator(offset: 4, expression: T,"
" plainNameForRead: foo, value: null)",
- new TypeDeclarationAccessor<Arguments>(
+ new TypeDeclarationAccessGenerator<Arguments>(
helper, token, prefixBuilder, -1, declaration, "foo"));
- check("UnresolvedAccessor(offset: 4, name: bar)",
- new UnresolvedAccessor<Arguments>(helper, token, name));
+ check("UnresolvedNameGenerator(offset: 4, name: bar)",
+ new UnresolvedNameGenerator<Arguments>(helper, token, name));
});
}
diff --git a/pkg/front_end/test/src/byte_store/crc32_test.dart b/pkg/front_end/test/src/byte_store/crc32_test.dart
new file mode 100644
index 0000000..0119bb8
--- /dev/null
+++ b/pkg/front_end/test/src/byte_store/crc32_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:front_end/src/byte_store/crc32.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(Crc32Test);
+ });
+}
+
+@reflectiveTest
+class Crc32Test {
+ test_bytes_0() {
+ expect(getCrc32([]), 0x00000000);
+ }
+
+ test_bytes_1() {
+ expect(getCrc32([0x00]), 0xD202EF8D);
+ }
+
+ test_bytes_2() {
+ expect(getCrc32([0x01]), 0xA505DF1B);
+ }
+
+ test_bytes_3() {
+ expect(getCrc32([0x01, 0x02]), 0xB6CC4292);
+ }
+
+ test_string() {
+ expect(getCrc32(UTF8.encode('My very long test string.')), 0x88B8252E);
+ }
+}
diff --git a/pkg/front_end/test/src/byte_store/file_byte_store_test.dart b/pkg/front_end/test/src/byte_store/file_byte_store_test.dart
new file mode 100644
index 0000000..a2aa7ed
--- /dev/null
+++ b/pkg/front_end/test/src/byte_store/file_byte_store_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:front_end/src/byte_store/file_byte_store.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(FileByteStoreValidatorTest);
+ });
+}
+
+@reflectiveTest
+class FileByteStoreValidatorTest {
+ final validator = new FileByteStoreValidator();
+
+ test_get_bad_notEnoughBytes() {
+ List<int> bytes = <int>[1, 2, 3];
+ List<int> data = validator.getData(bytes);
+ expect(data, isNull);
+ }
+
+ test_get_bad_notEnoughBytes_zero() {
+ List<int> bytes = <int>[];
+ List<int> data = validator.getData(bytes);
+ expect(data, isNull);
+ }
+
+ test_get_bad_wrongChecksum() {
+ List<int> data = <int>[1, 2, 3];
+ List<int> bytes = validator.wrapData(data);
+
+ // Damage the checksum.
+ expect(bytes[bytes.length - 1], isNot(42));
+ bytes[bytes.length - 1] = 42;
+
+ List<int> data2 = validator.getData(bytes);
+ expect(data2, isNull);
+ }
+
+ test_get_bad_wrongVersion() {
+ List<int> bytes = <int>[0xBA, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];
+ List<int> data = validator.getData(bytes);
+ expect(data, isNull);
+ }
+
+ test_get_good() {
+ List<int> data = <int>[1, 2, 3];
+ List<int> bytes = validator.wrapData(data);
+ List<int> data2 = validator.getData(bytes);
+ expect(data2, hasLength(3));
+ expect(data2, data);
+ }
+
+ test_get_good_zeroBytesData() {
+ List<int> data = <int>[];
+ List<int> bytes = validator.wrapData(data);
+ List<int> data2 = validator.getData(bytes);
+ expect(data2, hasLength(0));
+ expect(data2, data);
+ }
+}
diff --git a/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart b/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
index 6bb60d3..d117bf4 100644
--- a/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
+++ b/pkg/front_end/test/src/byte_store/protected_file_byte_store_test.dart
@@ -22,6 +22,8 @@
@reflectiveTest
class ProtectedFileByteStoreTest {
+ static const PADDING = 8;
+
io.Directory cacheDirectory;
String cachePath;
ProtectedFileByteStore store;
@@ -167,7 +169,7 @@
}
includes.forEach((expectedKey, expectedLength) {
expect(keyToLength, contains(expectedKey));
- expect(keyToLength, containsPair(expectedKey, expectedLength));
+ expect(keyToLength, containsPair(expectedKey, expectedLength + PADDING));
});
for (var excludedKey in excludes) {
expect(keyToLength.keys, isNot(contains(excludedKey)));
diff --git a/pkg/front_end/test/src/byte_store/test_all.dart b/pkg/front_end/test/src/byte_store/test_all.dart
index f702dcb..49fb3b4 100644
--- a/pkg/front_end/test/src/byte_store/test_all.dart
+++ b/pkg/front_end/test/src/byte_store/test_all.dart
@@ -6,6 +6,8 @@
import 'byte_store_test.dart' as byte_store_test;
import 'cache_test.dart' as cache_test;
+import 'crc32_test.dart' as crc32_test;
+import 'file_byte_store_test.dart' as file_byte_store_test;
import 'protected_file_byte_store_test.dart' as protected_file_byte_store_test;
/// Utility for manually running all tests.
@@ -13,6 +15,8 @@
defineReflectiveSuite(() {
byte_store_test.main();
cache_test.main();
+ crc32_test.main();
+ file_byte_store_test.main();
protected_file_byte_store_test.main();
}, name: 'byte_store');
}
diff --git a/pkg/front_end/testcases/ast_builder.status b/pkg/front_end/testcases/ast_builder.status
index cbb6e2d..1301285 100644
--- a/pkg/front_end/testcases/ast_builder.status
+++ b/pkg/front_end/testcases/ast_builder.status
@@ -46,7 +46,6 @@
regress/issue_29941: Crash
regress/issue_29943: Crash
regress/issue_29983: Crash # 'package:analyzer/src/fasta/ast_builder.dart': Failed assertion: line 478 pos 12: 'star == null': is not true.
-regress/issue_31155: Crash # Issue 31155.
regress/issue_31157: Crash
regress/issue_31180: Crash
regress/issue_31186: Crash
diff --git a/pkg/front_end/testcases/async_function.dart.direct.transformed.expect b/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
index 6d5759c..86b5197 100644
--- a/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/async_function.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
static field core::List<core::String> stringList = <dynamic>["bar"];
static method asyncString() → asy::Future<core::String> /* originally async */ {
- final asy::Completer<core::String> :completer = asy::Completer::sync<core::String>();
+ final asy::Completer<core::String> :async_completer = asy::Completer::sync<core::String>();
asy::FutureOr<core::String> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -19,20 +19,20 @@
:return_value = "foo";
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method asyncString2() → asy::Future<core::String> /* originally async */ {
- final asy::Completer<core::String> :completer = asy::Completer::sync<core::String>();
+ final asy::Completer<core::String> :async_completer = asy::Completer::sync<core::String>();
asy::FutureOr<core::String> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -46,17 +46,17 @@
:return_value = self::asyncString();
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method syncStarString() → core::Iterable<core::String> /* originally sync* */ {
dynamic :await_jump_var = 0;
@@ -170,7 +170,7 @@
return :controller.{asy::_AsyncStarStreamController::stream};
}
static method main() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -185,15 +185,15 @@
[yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
core::String str = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/await.dart.direct.transformed.expect b/pkg/front_end/testcases/await.dart.direct.transformed.expect
index 7a12084..c0f0f71 100644
--- a/pkg/front_end/testcases/await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/await.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
static method main() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -19,15 +19,15 @@
[yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
core::print(:result);
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect
index 8716818..b8cd3f73 100644
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args2.dart.direct.transformed.expect
@@ -5,7 +5,7 @@
static method main() → dynamic {}
static method test() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -21,15 +21,15 @@
[yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
def::m(:result);
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
index 342fff7..57fd263 100644
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
static method main() → dynamic {}
static method test() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -22,15 +22,15 @@
[yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
def::m(:result);
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/compile.status b/pkg/front_end/testcases/compile.status
index 31b8193..1623e1d 100644
--- a/pkg/front_end/testcases/compile.status
+++ b/pkg/front_end/testcases/compile.status
@@ -102,7 +102,6 @@
regress/issue_29976: RuntimeError # Issue 29976.
regress/issue_29982: Fail # Issue 29982.
regress/issue_30836: RuntimeError # Issue 30836.
-regress/issue_31155: Crash # Issue 31155.
runtime_checks/implicit_downcast_constructor_initializer: RuntimeError # Test exercises strong mode semantics
runtime_checks/implicit_downcast_do: RuntimeError # Test exercises strong mode semantics
diff --git a/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect b/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
index dbae521..359d991 100644
--- a/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/future_or_test.dart.direct.transformed.expect
@@ -16,7 +16,7 @@
: super core::Object::•()
;
method bar() → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -30,17 +30,17 @@
:return_value = this.{self::B::a}.foo();
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
}
class C extends core::Object {
@@ -49,7 +49,7 @@
: super core::Object::•()
;
method baz() → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -63,17 +63,17 @@
:return_value = this.{self::C::b}.bar();
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect b/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
index b18f9fb..fa7b7ac 100644
--- a/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
: super core::Object::•()
;
method bar() → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -30,17 +30,17 @@
:return_value = this.{self::B::a}.{self::A::foo}();
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
}
class C extends core::Object {
@@ -49,7 +49,7 @@
: super core::Object::•()
;
method baz() → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -63,17 +63,17 @@
:return_value = this.{self::C::b}.{self::B::bar}() as{TypeError} asy::FutureOr<core::int>;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
index 40299a9..839f1dd 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
;
}
static method test() → void /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -32,7 +32,7 @@
asy::FutureOr<self::MyFuture> x8;
self::MyFuture x9;
function test0() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -46,20 +46,20 @@
:return_value = x0;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test1() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -73,20 +73,20 @@
:return_value = x1;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test2() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -100,20 +100,20 @@
:return_value = x2;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test3() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -127,20 +127,20 @@
:return_value = x3;
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test4() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = x4;
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test5() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,20 +181,20 @@
:return_value = x5;
break #L7;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test6() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -208,20 +208,20 @@
:return_value = x6;
break #L8;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test7() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -235,20 +235,20 @@
:return_value = x7;
break #L9;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test8() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -262,20 +262,20 @@
:return_value = x8;
break #L10;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test9() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -289,17 +289,17 @@
:return_value = x9;
break #L11;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
[yield] let dynamic #t1 = asy::_awaitHelper(x0, :async_op_then, :async_op_error, :async_op) in null;
dynamic y0 = :result;
@@ -322,16 +322,16 @@
[yield] let dynamic #t10 = asy::_awaitHelper(x9, :async_op_then, :async_op_error, :async_op) in null;
dynamic y9 = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
index 2e07d8f..d0c0e68 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
;
}
static method test() → void /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -32,7 +32,7 @@
asy::FutureOr<self::MyFuture> x8;
self::MyFuture x9;
function test0() → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -46,20 +46,20 @@
:return_value = x0;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test1() → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -73,20 +73,20 @@
:return_value = x1;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test2() → asy::Future<asy::Future<core::int>> /* originally async */ {
- final asy::Completer<asy::Future<core::int>> :completer = asy::Completer::sync<asy::Future<core::int>>();
+ final asy::Completer<asy::Future<core::int>> :async_completer = asy::Completer::sync<asy::Future<core::int>>();
asy::FutureOr<asy::Future<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -100,20 +100,20 @@
:return_value = x2;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test3() → asy::Future<asy::FutureOr<core::int>> /* originally async */ {
- final asy::Completer<asy::FutureOr<core::int>> :completer = asy::Completer::sync<asy::FutureOr<core::int>>();
+ final asy::Completer<asy::FutureOr<core::int>> :async_completer = asy::Completer::sync<asy::FutureOr<core::int>>();
asy::FutureOr<asy::FutureOr<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -127,20 +127,20 @@
:return_value = x3;
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test4() → asy::Future<self::MyFuture> /* originally async */ {
- final asy::Completer<self::MyFuture> :completer = asy::Completer::sync<self::MyFuture>();
+ final asy::Completer<self::MyFuture> :async_completer = asy::Completer::sync<self::MyFuture>();
asy::FutureOr<self::MyFuture> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = x4;
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test5() → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,20 +181,20 @@
:return_value = x5;
break #L7;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test6() → asy::Future<asy::Future<core::int>> /* originally async */ {
- final asy::Completer<asy::Future<core::int>> :completer = asy::Completer::sync<asy::Future<core::int>>();
+ final asy::Completer<asy::Future<core::int>> :async_completer = asy::Completer::sync<asy::Future<core::int>>();
asy::FutureOr<asy::Future<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -208,20 +208,20 @@
:return_value = x6;
break #L8;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test7() → asy::Future<asy::FutureOr<core::int>> /* originally async */ {
- final asy::Completer<asy::FutureOr<core::int>> :completer = asy::Completer::sync<asy::FutureOr<core::int>>();
+ final asy::Completer<asy::FutureOr<core::int>> :async_completer = asy::Completer::sync<asy::FutureOr<core::int>>();
asy::FutureOr<asy::FutureOr<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -235,20 +235,20 @@
:return_value = x7;
break #L9;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test8() → asy::Future<self::MyFuture> /* originally async */ {
- final asy::Completer<self::MyFuture> :completer = asy::Completer::sync<self::MyFuture>();
+ final asy::Completer<self::MyFuture> :async_completer = asy::Completer::sync<self::MyFuture>();
asy::FutureOr<self::MyFuture> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -262,20 +262,20 @@
:return_value = x8;
break #L10;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function test9() → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -289,17 +289,17 @@
:return_value = x9;
break #L11;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
[yield] let dynamic #t1 = asy::_awaitHelper(x0, :async_op_then, :async_op_error, :async_op) in null;
core::int y0 = :result;
@@ -322,16 +322,16 @@
[yield] let dynamic #t10 = asy::_awaitHelper(x9, :async_op_then, :async_op_error, :async_op) in null;
core::int y9 = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect
index a111519..cdfa0e5 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
static field asy::Future<core::int> futureInt = null;
static field dynamic f = () → dynamic => self::futureInt;
static field dynamic g = () → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -20,17 +20,17 @@
:return_value = self::futureInt;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
static method main() → dynamic {
self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
index a6aca80..e35517f 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
static field asy::Future<core::int> futureInt = null;
static field () → asy::Future<core::int> f = () → asy::Future<core::int> => self::futureInt;
static field () → asy::Future<core::int> g = () → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -20,17 +20,17 @@
:return_value = self::futureInt;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
static method main() → dynamic {
self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect
index 4bf2eb0..92ac896 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.direct.transformed.expect
@@ -3,7 +3,7 @@
import "dart:async" as asy;
static field dynamic f = () → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -17,17 +17,17 @@
:return_value = 0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
static method main() → dynamic {
self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
index 5af9546..d7fa5b6 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
static field () → asy::Future<core::int> f = () → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -18,17 +18,17 @@
:return_value = 0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
static method main() → dynamic {
self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect
index 7702de6..0483a9f 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
static field asy::FutureOr<core::int> futureOrInt = null;
static field dynamic f = () → dynamic => self::futureOrInt;
static field dynamic g = () → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -20,17 +20,17 @@
:return_value = self::futureOrInt;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
static method main() → dynamic {
self::f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
index f49a5d2..5910611 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
static field asy::FutureOr<core::int> futureOrInt = null;
static field () → asy::FutureOr<core::int> f = () → asy::FutureOr<core::int> => self::futureOrInt;
static field () → asy::Future<core::int> g = () → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -20,17 +20,17 @@
:return_value = self::futureOrInt;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
static method main() → dynamic {
self::f;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect
index ae1ed7a..cc66edb 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
static method test() → dynamic {
dynamic f = () → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -26,17 +26,17 @@
break #L1;
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
asy::Future<core::num> g = f.call();
asy::Future<core::int> h = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
index 649f426..af00522 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
static method test() → dynamic {
() → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
- final asy::Completer<core::num> :completer = asy::Completer::sync<core::num>();
+ final asy::Completer<core::num> :async_completer = asy::Completer::sync<core::num>();
asy::FutureOr<core::num> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -26,17 +26,17 @@
break #L1;
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
asy::Future<core::num> g = f.call();
asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect
index 93b15b0..b16d670 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
static method test() → dynamic {
dynamic f = () → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -26,17 +26,17 @@
break #L1;
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
asy::Future<core::num> g = f.call();
asy::Future<core::int> h = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
index 97e2f95..2087333 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
static method test() → dynamic {
() → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
- final asy::Completer<core::num> :completer = asy::Completer::sync<core::num>();
+ final asy::Completer<core::num> :async_completer = asy::Completer::sync<core::num>();
asy::FutureOr<core::num> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -26,17 +26,17 @@
break #L1;
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
asy::Future<core::num> g = f.call();
asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect
index 8c968ee..7c5e12b 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
static method test() → dynamic {
dynamic f = () → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -26,17 +26,17 @@
break #L1;
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
asy::Future<core::num> g = f.call();
asy::Future<core::int> h = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
index 45d5637..08a88b2 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
static method test() → dynamic {
() → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
- final asy::Completer<core::num> :completer = asy::Completer::sync<core::num>();
+ final asy::Completer<core::num> :async_completer = asy::Completer::sync<core::num>();
asy::FutureOr<core::num> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -26,17 +26,17 @@
break #L1;
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
asy::Future<core::num> g = f.call();
asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect
index 04b9dad..642c44a 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
static method main() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -17,7 +17,7 @@
#L1:
{
dynamic f = () → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -31,32 +31,32 @@
:return_value = null;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
asy::Future<dynamic> y = f.call();
asy::Future<core::String> z = f.call();
[yield] let dynamic #t1 = asy::_awaitHelper(f.call(), :async_op_then, :async_op_error, :async_op) in null;
core::String s = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
index 1afc8d9..da3ad50 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
static method main() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -17,7 +17,7 @@
#L1:
{
() → asy::Future<core::Null> f = () → asy::Future<core::Null> /* originally async */ {
- final asy::Completer<core::Null> :completer = asy::Completer::sync<core::Null>();
+ final asy::Completer<core::Null> :async_completer = asy::Completer::sync<core::Null>();
asy::FutureOr<core::Null> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -31,32 +31,32 @@
:return_value = null;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
};
asy::Future<dynamic> y = f.call();
asy::Future<core::String> z = f.call();
[yield] let dynamic #t1 = asy::_awaitHelper(f.call(), :async_op_then, :async_op_error, :async_op) in null;
core::String s = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect
index e58820a..3254b80 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
static method main() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -54,15 +54,15 @@
[yield] let dynamic #t1 = asy::_awaitHelper(f.call().first, :async_op_then, :async_op_error, :async_op) in null;
core::String s = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
index 1d67b45..20fe1a2 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
static method main() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -54,15 +54,15 @@
[yield] let dynamic #t1 = asy::_awaitHelper(f.call().{asy::Stream::first}, :async_op_then, :async_op_error, :async_op) in null;
core::String s = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
index 126c90b..48cd5f2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
static method main() → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -22,15 +22,15 @@
[yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<dynamic>(<dynamic>[d]), :async_op_then, :async_op_error, :async_op) in null;
core::List<core::int> l1 = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
index c7716b6..498dfc2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
static method main() → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -22,15 +22,15 @@
[yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::List<core::int>>(<core::int>[d as{TypeError} core::int]), :async_op_then, :async_op_error, :async_op) in null;
core::List<core::int> l1 = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
index 3ef1a43..8a0ba8a 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.direct.transformed.expect
@@ -10,7 +10,7 @@
static method F<T extends core::Object = dynamic>() → self::F::T
return null;
static method f() → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -139,20 +139,20 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -212,15 +212,15 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
index 7dee1bb..49348b8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
static method F<T extends core::Object = dynamic>() → self::F::T
return null;
static method f() → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -139,20 +139,20 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -212,15 +212,15 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
index 67e28bf..c86a42f 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
static method test() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -67,16 +67,16 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
index 3b987da..ab6f7a7 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
static method test() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -67,16 +67,16 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
index 440a04c..39bf766 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<dynamic> f;
asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -40,20 +40,20 @@
:return_value = :result;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,20 +69,20 @@
:return_value = :result;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -96,20 +96,20 @@
:return_value = 3;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -123,24 +123,24 @@
:return_value = 3;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
return asy::Future::value<core::int>(3);
});
asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = asy::Future::value<core::int>(3);
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,17 +181,17 @@
:return_value = asy::Future::value<core::int>(3);
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
index ab76573..7eaed28 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<dynamic> f;
asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -40,20 +40,20 @@
:return_value = :result;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,20 +69,20 @@
:return_value = :result;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -96,20 +96,20 @@
:return_value = 3;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -123,24 +123,24 @@
:return_value = 3;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> {
return asy::Future::value<core::int>(3);
});
asy::Future<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = asy::Future::value<core::int>(3);
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,17 +181,17 @@
:return_value = asy::Future::value<core::int>(3);
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
index 8dd522c..4b7549d 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<dynamic> f;
asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -40,20 +40,20 @@
:return_value = :result;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,20 +69,20 @@
:return_value = :result;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -96,20 +96,20 @@
:return_value = 3;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -123,24 +123,24 @@
:return_value = 3;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
return new self::MyFuture::value<core::int>(3);
});
asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = new self::MyFuture::value<core::int>(3);
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,17 +181,17 @@
:return_value = new self::MyFuture::value<core::int>(3);
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
index a5f1b36..90bcbbb 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<dynamic> f;
asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -40,20 +40,20 @@
:return_value = :result;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,20 +69,20 @@
:return_value = :result;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -96,20 +96,20 @@
:return_value = 3;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -123,24 +123,24 @@
:return_value = 3;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
return new self::MyFuture::value<core::int>(3);
});
asy::Future<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = new self::MyFuture::value<core::int>(3);
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,17 +181,17 @@
:return_value = new self::MyFuture::value<core::int>(3);
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
index 11ee82f..7c89606 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<dynamic> f;
self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -40,20 +40,20 @@
:return_value = :result;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,20 +69,20 @@
:return_value = :result;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -96,20 +96,20 @@
:return_value = 3;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -123,24 +123,24 @@
:return_value = 3;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
return asy::Future::value<core::int>(3);
});
self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = asy::Future::value<core::int>(3);
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,17 +181,17 @@
:return_value = asy::Future::value<core::int>(3);
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
index 79dea19..ca483a5 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<dynamic> f;
self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -40,20 +40,20 @@
:return_value = :result;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,20 +69,20 @@
:return_value = :result;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -96,20 +96,20 @@
:return_value = 3;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -123,24 +123,24 @@
:return_value = 3;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> {
return asy::Future::value<core::int>(3);
});
self::MyFuture<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = asy::Future::value<core::int>(3);
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,17 +181,17 @@
:return_value = asy::Future::value<core::int>(3);
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
index 2c1403c..746d72c 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<dynamic> f;
self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -40,20 +40,20 @@
:return_value = :result;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,20 +69,20 @@
:return_value = :result;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -96,20 +96,20 @@
:return_value = 3;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -123,24 +123,24 @@
:return_value = 3;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
return new self::MyFuture::value<core::int>(3);
});
self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = new self::MyFuture::value<core::int>(3);
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,17 +181,17 @@
:return_value = new self::MyFuture::value<core::int>(3);
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
index d0224a3..21ecf5e 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<dynamic> f;
self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -40,20 +40,20 @@
:return_value = :result;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,20 +69,20 @@
:return_value = :result;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -96,20 +96,20 @@
:return_value = 3;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -123,24 +123,24 @@
:return_value = 3;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
return new self::MyFuture::value<core::int>(3);
});
self::MyFuture<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = new self::MyFuture::value<core::int>(3);
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,17 +181,17 @@
:return_value = new self::MyFuture::value<core::int>(3);
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
index c373616..f996ff9 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
asy::Future<dynamic> f;
asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -40,20 +40,20 @@
:return_value = :result;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,20 +69,20 @@
:return_value = :result;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -96,20 +96,20 @@
:return_value = 3;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -123,24 +123,24 @@
:return_value = 3;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
return new self::MyFuture::value<core::int>(3);
});
asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = new self::MyFuture::value<core::int>(3);
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,17 +181,17 @@
:return_value = new self::MyFuture::value<core::int>(3);
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
index 4181e8a..b19d080 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
asy::Future<dynamic> f;
asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -40,20 +40,20 @@
:return_value = :result;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,20 +69,20 @@
:return_value = :result;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t3 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -96,20 +96,20 @@
:return_value = 3;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t4 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -123,24 +123,24 @@
:return_value = 3;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
return new self::MyFuture::value<core::int>(3);
});
asy::Future<core::int> t7 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = new self::MyFuture::value<core::int>(3);
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t8 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,17 +181,17 @@
:return_value = new self::MyFuture::value<core::int>(3);
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
index 7ea34b6..dda0a4f 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
asy::Future<dynamic> f;
asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -40,20 +40,20 @@
:return_value = :result;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,20 +69,20 @@
:return_value = :result;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -96,20 +96,20 @@
:return_value = 3;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -123,24 +123,24 @@
:return_value = 3;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
return asy::Future::value<core::int>(3);
});
asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = asy::Future::value<core::int>(3);
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,17 +181,17 @@
:return_value = asy::Future::value<core::int>(3);
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
index 5013ebe..8214748 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
asy::Future<dynamic> f;
asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -40,20 +40,20 @@
:return_value = :result;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,20 +69,20 @@
:return_value = :result;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t3 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -96,20 +96,20 @@
:return_value = 3;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t4 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -123,24 +123,24 @@
:return_value = 3;
break #L4;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> {
return asy::Future::value<core::int>(3);
});
asy::Future<core::int> t7 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -154,20 +154,20 @@
:return_value = asy::Future::value<core::int>(3);
break #L5;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t8 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -181,17 +181,17 @@
:return_value = asy::Future::value<core::int>(3);
break #L6;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
index ef09e80..ee8635c 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<core::bool> f;
asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -47,20 +47,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -76,17 +76,17 @@
:return_value = :result ? 2 : asy::Future::value<core::int>(3);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
index d37757e..4edac72 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<core::bool> f;
asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -47,20 +47,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -76,17 +76,17 @@
:return_value = (:result ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
index 633179c..0d47534 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<core::bool> f;
asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -47,20 +47,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -76,17 +76,17 @@
:return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
index ce0b933..f44cce1 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<core::bool> f;
asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -47,20 +47,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -76,17 +76,17 @@
:return_value = (:result ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
index ef96253..1373697 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<core::bool> f;
self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -47,20 +47,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -76,17 +76,17 @@
:return_value = :result ? 2 : asy::Future::value<core::int>(3);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
index cf77812..15d1ad2 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<core::bool> f;
self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -47,20 +47,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -76,17 +76,17 @@
:return_value = (:result ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
index 8299fbb..f91e051 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<core::bool> f;
self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -47,20 +47,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -76,17 +76,17 @@
:return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
index e57873c..ea24809 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<core::bool> f;
self::MyFuture<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -47,20 +47,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -76,17 +76,17 @@
:return_value = (:result ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
index 4d49b6e..21cf312 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
asy::Future<core::bool> f;
asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -47,20 +47,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -76,17 +76,17 @@
:return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
index 468ec31..e258784 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
asy::Future<core::bool> f;
asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -47,20 +47,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -76,17 +76,17 @@
:return_value = (:result ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
index ba9e600..1a49a72 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
asy::Future<core::bool> f;
asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -47,20 +47,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -76,17 +76,17 @@
:return_value = :result ? 2 : asy::Future::value<core::int>(3);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
index 792ef91..a172c81 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
asy::Future<core::bool> f;
asy::Future<core::int> t1 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -47,20 +47,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -76,17 +76,17 @@
:return_value = (:result ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
index e57d937..e67586a 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.direct.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<core::int> f;
asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -48,20 +48,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -77,17 +77,17 @@
:return_value = let final dynamic #t4 = :result in #t4.==(null) ? asy::Future::value<core::int>(3) : #t4;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => let final dynamic #t5 = x in #t5.==(null) ? asy::Future::value<core::int>(3) : #t5);
asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
index 311f23d..871bcf6 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
static method test() → void {
self::MyFuture<core::int> f;
asy::Future<core::int> t1 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -48,20 +48,20 @@
:return_value = :async_temporary_0;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -77,17 +77,17 @@
:return_value = (let final core::int #t4 = :result in #t4.==(null) ?{core::Object} asy::Future::value<core::int>(3) : #t4) as{TypeError} asy::FutureOr<core::int>;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
});
asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::FutureOr<core::int> => (let final core::int #t5 = x in #t5.==(null) ?{core::Object} asy::Future::value<core::int>(3) : #t5) as{TypeError} asy::FutureOr<core::int>);
asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::FutureOr<core::int> {
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
index 9397ba5..41c4879 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.direct.transformed.expect
@@ -22,7 +22,7 @@
return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
}
static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -36,20 +36,20 @@
:return_value = x ? 42 : asy::Future::value<dynamic>(42);
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -63,20 +63,20 @@
:return_value = x ? 42 : asy::Future::value<dynamic>(42);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -91,16 +91,16 @@
:return_value = y;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
index 61d62cb..c5b890a 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
}
static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -36,20 +36,20 @@
:return_value = (x ?{core::Object} 42 : asy::Future::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -63,20 +63,20 @@
:return_value = (x ?{core::Object} 42 : asy::Future::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -91,16 +91,16 @@
:return_value = y as{TypeError} asy::FutureOr<core::int>;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
index f31e5ca..4d30bd8 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.direct.transformed.expect
@@ -22,7 +22,7 @@
return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
}
static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -36,20 +36,20 @@
:return_value = x ? 42 : new self::MyFuture::value<dynamic>(42);
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -63,20 +63,20 @@
:return_value = x ? 42 : new self::MyFuture::value<dynamic>(42);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -91,16 +91,16 @@
:return_value = y;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
index ab69947..3e881c5 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withoutType("asStream", const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}), false)) as{TypeError} asy::Stream<self::MyFuture::T>;
}
static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -36,20 +36,20 @@
:return_value = (x ?{core::Object} 42 : new self::MyFuture::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -63,20 +63,20 @@
:return_value = (x ?{core::Object} 42 : new self::MyFuture::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -91,16 +91,16 @@
:return_value = y as{TypeError} asy::FutureOr<core::int>;
break #L3;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
index fab89fe..9c55b25 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -39,20 +39,20 @@
:return_value = <dynamic>[3];
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -66,16 +66,16 @@
:return_value = asy::Future::value<dynamic>(<dynamic>[3]);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
index c8a55a9..372634f 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
@@ -28,7 +28,7 @@
^" in let final core::String #t2 = "hi" in null));
static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -42,20 +42,20 @@
:return_value = <core::int>[3];
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,16 +69,16 @@
:return_value = asy::Future::value<core::List<core::int>>(<core::int>[3]);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
index b669441..8311768 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -39,20 +39,20 @@
:return_value = <dynamic>[3];
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -66,16 +66,16 @@
:return_value = new self::MyFuture::value<dynamic>(<dynamic>[3]);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
index 9dfa187..c6eedda 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
@@ -25,7 +25,7 @@
static field asy::Future<core::int> t1 = self::f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>("hi"));
static field asy::Future<core::List<core::int>> t2 = self::f.{self::MyFuture::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -39,20 +39,20 @@
:return_value = <core::int>[3];
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -66,16 +66,16 @@
:return_value = new self::MyFuture::value<core::List<core::int>>(<core::int>[3]);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
index 7e22485..d310fa8 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -39,20 +39,20 @@
:return_value = <dynamic>[3];
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -66,16 +66,16 @@
:return_value = asy::Future::value<dynamic>(<dynamic>[3]);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
index 55eb919..85c2fcd 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
@@ -28,7 +28,7 @@
^" in let final core::String #t2 = "hi" in null));
static field asy::Future<core::List<core::int>> t2 = self::f.{asy::Future::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -42,20 +42,20 @@
:return_value = <core::int>[3];
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -69,16 +69,16 @@
:return_value = asy::Future::value<core::List<core::int>>(<core::int>[3]);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
index 7d02922..5b25967 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.direct.transformed.expect
@@ -25,7 +25,7 @@
static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -39,20 +39,20 @@
:return_value = <dynamic>[3];
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -66,16 +66,16 @@
:return_value = new self::MyFuture::value<dynamic>(<dynamic>[3]);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
index f9e32bb..39403ea 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
@@ -25,7 +25,7 @@
static field asy::Future<core::int> t1 = self::f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>("hi"));
static field asy::Future<core::List<core::int>> t2 = self::f.{asy::Future::then}<core::List<core::int>>((dynamic _) → core::List<core::int> => <core::int>[3]);
static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -39,20 +39,20 @@
:return_value = <core::int>[3];
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
- final asy::Completer<core::List<core::int>> :completer = asy::Completer::sync<core::List<core::int>>();
+ final asy::Completer<core::List<core::int>> :async_completer = asy::Completer::sync<core::List<core::int>>();
asy::FutureOr<core::List<core::int>> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -66,16 +66,16 @@
:return_value = new self::MyFuture::value<core::List<core::int>>(<core::int>[3]);
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
index 4851f62..a702c69 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
;
}
static method foo() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -26,16 +26,16 @@
[yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<dynamic>(<dynamic>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
core::List<core::List<self::A>> merged = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
index 17ee2b4..5491836 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
;
}
static method foo() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -26,16 +26,16 @@
[yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<core::List<self::A>>(<asy::Future<core::List<self::A>>>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
core::List<core::List<self::A>> merged = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
index 91cb8b0..767567e 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.direct.transformed.expect
@@ -6,7 +6,7 @@
static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
return x;
static method test() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -22,16 +22,16 @@
[yield] let dynamic #t1 = asy::_awaitHelper(self::id<dynamic>(f), :async_op_then, :async_op_error, :async_op) in null;
core::String s = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
index 92c8c6b..96f60cf 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
return x;
static method test() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -22,16 +22,16 @@
[yield] let dynamic #t1 = asy::_awaitHelper(self::id<asy::FutureOr<core::String>>(f), :async_op_then, :async_op_error, :async_op) in null;
core::String s = :result;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
index 0747a44..9be5e89 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.direct.transformed.expect
@@ -19,7 +19,7 @@
;
}
static method main() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -41,15 +41,15 @@
core::List<self::A> list = result;
list = result2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
index 6fc7a69..bb72272 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
;
}
static method main() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -41,15 +41,15 @@
core::List<self::A> list = result;
list = result2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect
index 95cdc12..7a13cb2 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.direct.transformed.expect
@@ -7,7 +7,7 @@
function f0() → dynamic
return 42;
function f1() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -21,23 +21,23 @@
:return_value = 42;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function f2() → dynamic {
return 42;
}
function f3() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -51,17 +51,17 @@
:return_value = 42;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function f4() → dynamic /* originally sync* */ {
dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
index 5e738e7..a090131 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
function f0() → core::int
return 42;
function f1() → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -21,23 +21,23 @@
:return_value = 42;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function f2() → core::int {
return 42;
}
function f3() → asy::Future<core::int> /* originally async */ {
- final asy::Completer<core::int> :completer = asy::Completer::sync<core::int>();
+ final asy::Completer<core::int> :async_completer = asy::Completer::sync<core::int>();
asy::FutureOr<core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -51,17 +51,17 @@
:return_value = 42;
break #L2;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function f4() → core::Iterable<core::int> /* originally sync* */ {
dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
index f8f99d3..9b911b8 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.direct.transformed.expect
@@ -14,7 +14,7 @@
: super core::Object::•()
;
method foo(self::Bar::T t) → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -51,17 +51,17 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
}
class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
@@ -69,7 +69,7 @@
: super core::Object::•()
;
method foo(self::Baz::S t) → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -107,17 +107,17 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
}
abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
@@ -125,7 +125,7 @@
return null;
}
static method test() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -294,16 +294,16 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
index 9b52d11..e515591 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
: super core::Object::•()
;
method foo(generic-covariant-impl self::Bar::T t) → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -54,17 +54,17 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
}
class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = asy::Stream<dynamic>, S extends self::Baz::E = asy::Stream<dynamic>> extends core::Object {
@@ -72,7 +72,7 @@
: super core::Object::•()
;
method foo(generic-covariant-impl self::Baz::S t) → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -113,17 +113,17 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
}
abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
@@ -131,7 +131,7 @@
return null;
}
static method test() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -312,16 +312,16 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect
index 3af0dce..f151285 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.direct.transformed.expect
@@ -9,7 +9,7 @@
return (dynamic x) → dynamic => x;
}
function b() → asy::Future<(core::int) → core::int> /* originally async */ {
- final asy::Completer<(core::int) → core::int> :completer = asy::Completer::sync<(core::int) → core::int>();
+ final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
asy::FutureOr<(core::int) → core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -23,17 +23,17 @@
:return_value = (dynamic x) → dynamic => x;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
index 3710faf..2a29a2c 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
return (core::int x) → core::int => x;
}
function b() → asy::Future<(core::int) → core::int> /* originally async */ {
- final asy::Completer<(core::int) → core::int> :completer = asy::Completer::sync<(core::int) → core::int>();
+ final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
asy::FutureOr<(core::int) → core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -26,17 +26,17 @@
^" in let final (dynamic) → dynamic #t2 = (dynamic x) → dynamic => x in null;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
function c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect
index 5ffcce0..129d552 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.direct.transformed.expect
@@ -8,7 +8,7 @@
return (dynamic x) → dynamic => x;
}
static method b() → asy::Future<(core::int) → core::int> /* originally async */ {
- final asy::Completer<(core::int) → core::int> :completer = asy::Completer::sync<(core::int) → core::int>();
+ final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
asy::FutureOr<(core::int) → core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -22,17 +22,17 @@
:return_value = (dynamic x) → dynamic => x;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
index 02edb72..cb53a52 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
return (core::int x) → core::int => x;
}
static method b() → asy::Future<(core::int) → core::int> /* originally async */ {
- final asy::Completer<(core::int) → core::int> :completer = asy::Completer::sync<(core::int) → core::int>();
+ final asy::Completer<(core::int) → core::int> :async_completer = asy::Completer::sync<(core::int) → core::int>();
asy::FutureOr<(core::int) → core::int> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -25,17 +25,17 @@
^" in let final (dynamic) → dynamic #t2 = (dynamic x) → dynamic => x in null;
break #L1;
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
dynamic :await_jump_var = 0;
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
index 4381b61..2b3bdf6 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.direct.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
static method test() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -67,16 +67,16 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
index a61a3ed..bb9b75a 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
import "dart:core" as core;
static method test() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -82,16 +82,16 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
index c6044b0..b82a06f 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.direct.transformed.expect
@@ -16,7 +16,7 @@
static method f<T extends core::Object = dynamic>() → self::f::T
return null;
static method test() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -133,16 +133,16 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
index e8c97af..c633524 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
static method f<T extends core::Object = dynamic>() → self::f::T
return null;
static method test() → dynamic /* originally async */ {
- final asy::Completer<dynamic> :completer = asy::Completer::sync<dynamic>();
+ final asy::Completer<dynamic> :async_completer = asy::Completer::sync<dynamic>();
asy::FutureOr<dynamic> :return_value;
dynamic :async_stack_trace;
dynamic :async_op_then;
@@ -139,16 +139,16 @@
}
}
}
- :completer.{asy::Completer::complete}(:return_value);
+ :async_completer.{asy::Completer::complete}(:return_value);
return;
}
on dynamic catch(dynamic :exception, dynamic :stack_trace) {
- :completer.{asy::Completer::completeError}(:exception, :stack_trace);
+ :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);
asy::Future::microtask<dynamic>(:async_op);
- return :completer.{asy::Completer::future};
+ return :async_completer.{asy::Completer::future};
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
index 8c7b02d..8c3bb35 100644
--- a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
@@ -3,7 +3,8 @@
import "dart:core" as core;
class A extends core::Object {
- const constructor •() → void
+ field dynamic x;
+ constructor •() → void
;
}
static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index 5462697..a3c04bd 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -423,13 +423,13 @@
super.m -= 42;
^", "pkg/front_end/testcases/rasta/super.dart:248:15: Error: Superclass has no setter named 'm'.
use(super.m -= 42);
- ^", "pkg/front_end/testcases/rasta/super.dart:147:11: Error: Too many positional arguments to method: 0 allowed, 1 given.
+ ^", "pkg/front_end/testcases/rasta/super.dart:147:11: Error: Too many positional arguments: 0 allowed, 1 given.
super.m(87);
- ^", "pkg/front_end/testcases/rasta/super.dart:148:15: Error: Too many positional arguments to method: 0 allowed, 1 given.
+ ^", "pkg/front_end/testcases/rasta/super.dart:148:15: Error: Too many positional arguments: 0 allowed, 1 given.
use(super.m(87));
- ^", "pkg/front_end/testcases/rasta/super.dart:149:11: Error: Too many positional arguments to method: 0 allowed, 1 given.
+ ^", "pkg/front_end/testcases/rasta/super.dart:149:11: Error: Too many positional arguments: 0 allowed, 1 given.
super.n(87);
- ^", "pkg/front_end/testcases/rasta/super.dart:150:15: Error: Too many positional arguments to method: 0 allowed, 1 given.
+ ^", "pkg/front_end/testcases/rasta/super.dart:150:15: Error: Too many positional arguments: 0 allowed, 1 given.
use(super.n(87));
^"]/* from null */;
static method use(dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
new file mode 100644
index 0000000..4776f6a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.direct.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ field dynamic f = core::Map<dynamic, dynamic>.<(self::A);
+ field dynamic B = null;
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+ operator >() → dynamic {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+Try adding the keyword 'operator'.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+Try adding a parameter list to the method declaration.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+ var f = Map<A, B> {};
+ ^"]/* from null */;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
new file mode 100644
index 0000000..4776f6a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.direct.transformed.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ field dynamic f = core::Map<dynamic, dynamic>.<(self::A);
+ field dynamic B = null;
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+ operator >() → dynamic {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+Try adding the keyword 'operator'.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+Try adding a parameter list to the method declaration.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+ var f = Map<A, B> {};
+ ^"]/* from null */;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
index f0ee655..5b7edf4 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
@@ -12,8 +12,11 @@
}
class C extends core::Object {
field dynamic f;
+ field dynamic B;
synthetic constructor •() → void
;
+ operator >() → dynamic
+ ;
}
static method main() → void
;
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
new file mode 100644
index 0000000..e088ade
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ field dynamic f = let final dynamic #t1 = core::Map<dynamic, dynamic> in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+ var f = Map<A, B> {};
+ ^";
+ field dynamic B = null;
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+ operator >() → dynamic {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+Try adding the keyword 'operator'.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+Try adding a parameter list to the method declaration.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+ var f = Map<A, B> {};
+ ^"]/* from null */;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
new file mode 100644
index 0000000..3e6b682
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class B extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class C extends core::Object {
+ field dynamic f = let final core::Type #t1 = core::Map<dynamic, dynamic> in let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_31155.dart:11:14: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+ var f = Map<A, B> {};
+ ^";
+ field dynamic B = null;
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+ operator >() → dynamic {}
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Expected ';' before this.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator declarations must be preceeded by the keyword 'operator'.
+Try adding the keyword 'operator'.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: A method declaration needs an explicit list of parameters.
+Try adding a parameter list to the method declaration.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:19: Error: Operator '>' should have exactly one parameter.
+ var f = Map<A, B> {};
+ ^", "pkg/front_end/testcases/regress/issue_31155.dart:11:23: Error: Expected a class member, but got ';'.
+ var f = Map<A, B> {};
+ ^"]/* from null */;
+static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart b/pkg/front_end/testcases/regress/issue_31171.dart
new file mode 100644
index 0000000..c7ffc48
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2018, 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.
+
+main() {}
+
+typedef T =
+typedef F = Map<String, dynamic> Function();
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
new file mode 100644
index 0000000..fa8d68a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.direct.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+typedef T =
+ ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
new file mode 100644
index 0000000..fa8d68a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.direct.transformed.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+typedef T =
+ ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
new file mode 100644
index 0000000..b3a684f
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
new file mode 100644
index 0000000..fa8d68a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+typedef T =
+ ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
new file mode 100644
index 0000000..fa8d68a
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef T = dynamic;
+typedef F = () → core::Map<core::String, dynamic>;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected a type, but got 'typedef'.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:8:1: Error: Expected ';' before this.
+typedef F = Map<String, dynamic> Function();
+^^^^^^^", "pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+typedef T =
+ ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart b/pkg/front_end/testcases/regress/issue_31188.dart
new file mode 100644
index 0000000..197dfae
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2018, 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.
+
+main() {}
+
+type T = Map<A, B>
+
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect b/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
new file mode 100644
index 0000000..c7b38c9
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.direct.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = core::Map<dynamic, dynamic>.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field invalid-type B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+type T = Map<A, B>
+ ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+type T = Map<A, B>
+ ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
new file mode 100644
index 0000000..c7b38c9
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.direct.transformed.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = core::Map<dynamic, dynamic>.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field invalid-type B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+type T = Map<A, B>
+ ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+type T = Map<A, B>
+ ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect
new file mode 100644
index 0000000..c8bd468
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.outline.expect
@@ -0,0 +1,7 @@
+library;
+import self as self;
+
+static field invalid-type T;
+static field invalid-type B;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
new file mode 100644
index 0000000..86d47c4
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = let final dynamic #t1 = core::Map<dynamic, dynamic> in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+type T = Map<A, B>
+ ^";
+static field invalid-type B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+type T = Map<A, B>
+ ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+type T = Map<A, B>
+ ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
+type T = Map<A, B>
+^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
+type T = Map<A, B>
+^^^^", "pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
+type T = Map<A, B>
+ ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
new file mode 100644
index 0000000..10e28a1
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.strong.transformed.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field invalid-type T = let final core::Type #t1 = core::Map<dynamic, dynamic> in let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/regress/issue_31188.dart:7:13: Error: The method '<' isn't defined for the class 'dart.core::Type'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+type T = Map<A, B>
+ ^";
+static field invalid-type B;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected ';' before this.
+type T = Map<A, B>
+ ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:18: Error: Expected a declaration, but got '>'.
+type T = Map<A, B>
+ ^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: Type 'type' not found.
+type T = Map<A, B>
+^", "pkg/front_end/testcases/regress/issue_31188.dart:7:1: Error: 'type' isn't a type.
+type T = Map<A, B>
+^^^^", "pkg/front_end/testcases/regress/issue_31188.dart:7:14: Error: Getter not found: 'A'.
+type T = Map<A, B>
+ ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
index be7bde0..1c01a1f 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
@@ -17,9 +17,9 @@
A.foo() : m = 2;
^", "pkg/front_end/testcases/regress/issue_31299.dart:11:7: Error: Conflicts with constructor 'A.foo'.
int foo(int a, int b) => a + b * m;
- ^", "pkg/front_end/testcases/regress/issue_31299.dart:18:7: Error: Too many positional arguments to constructor: 0 allowed, 2 given.
+ ^", "pkg/front_end/testcases/regress/issue_31299.dart:18:7: Error: Too many positional arguments: 0 allowed, 2 given.
new A.foo(1, 2);
- ^", "pkg/front_end/testcases/regress/issue_31299.dart:15:11: Error: Too few positional arguments to method: 2 required, 0 given.
+ ^", "pkg/front_end/testcases/regress/issue_31299.dart:15:11: Error: Too few positional arguments: 2 required, 0 given.
new A().foo();
^"]/* from null */;
static method test() → dynamic {
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index 3ee0f85..b0858b9 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -198,7 +198,6 @@
regress/issue_29976: RuntimeError # Issue 29976.
regress/issue_29982: Fail # Issue 29982.
regress/issue_30836: RuntimeError # Issue 30836.
-regress/issue_31155: Crash # Issue 31155.
regress/issue_31184: TypeCheckError
regress/issue_31299: TypeCheckError
diff --git a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
index 1f6b644..f5230259 100644
--- a/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
+++ b/pkg/front_end/testcases/super_rasta_copy.dart.strong.expect
@@ -357,9 +357,9 @@
super.m -= 42;
^", "pkg/front_end/testcases/super_rasta_copy.dart:232:15: Error: Superclass has no setter named 'm'.
use(super.m -= 42);
- ^", "pkg/front_end/testcases/super_rasta_copy.dart:139:11: Error: Too many positional arguments to method: 0 allowed, 1 given.
+ ^", "pkg/front_end/testcases/super_rasta_copy.dart:139:11: Error: Too many positional arguments: 0 allowed, 1 given.
super.m(87);
- ^", "pkg/front_end/testcases/super_rasta_copy.dart:140:15: Error: Too many positional arguments to method: 0 allowed, 1 given.
+ ^", "pkg/front_end/testcases/super_rasta_copy.dart:140:15: Error: Too many positional arguments: 0 allowed, 1 given.
use(super.m(87));
^"]/* from null */;
static method use(dynamic x) → dynamic {
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 7ff892f..afe96c6 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -5011,7 +5011,7 @@
/// argument of a dynamic invocation of a generic function.
DartType defaultType;
- TypeParameter([this.name, this.bound]);
+ TypeParameter([this.name, this.bound, this.defaultType]);
// Must match serialized bit positions.
static const int FlagGenericCovariantImpl = 1 << 0;
@@ -5041,10 +5041,14 @@
visitChildren(Visitor v) {
bound.accept(v);
+ defaultType?.accept(v);
}
transformChildren(Transformer v) {
bound = v.visitDartType(bound);
+ if (defaultType != null) {
+ defaultType = v.visitDartType(defaultType);
+ }
}
/// Returns a possibly synthesized name for this type parameter, consistent
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 0b8053d..b75a3a3 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -48,7 +48,7 @@
int _byteOffset = 0;
final List<String> _stringTable = <String>[];
final List<Uri> _sourceUriTable = <Uri>[];
- List<Constant> _constantTable;
+ Map<int, Constant> _constantTable = <int, Constant>{};
List<CanonicalName> _linkTable;
int _transformerFlags = 0;
Library _currentLibrary;
@@ -175,9 +175,9 @@
void readConstantTable() {
final int length = readUInt();
- _constantTable = new List<Constant>(length);
+ final int startOffset = byteOffset;
for (int i = 0; i < length; i++) {
- _constantTable[i] = readConstantTableEntry();
+ _constantTable[byteOffset - startOffset] = readConstantTableEntry();
}
}
@@ -252,8 +252,8 @@
}
Constant readConstantReference() {
- final int index = readUInt();
- Constant constant = _constantTable[index];
+ final int offset = readUInt();
+ Constant constant = _constantTable[offset];
assert(constant != null);
return constant;
}
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 0329a1f..156d80b 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -31,6 +31,8 @@
final BufferedSink _mainSink;
final BufferedSink _metadataSink;
+ final BytesSink _constantsBytesSink;
+ BufferedSink _constantsSink;
BufferedSink _sink;
List<int> libraryOffsets;
@@ -54,8 +56,10 @@
BinaryPrinter(Sink<List<int>> sink, {StringIndexer stringIndexer})
: _mainSink = new BufferedSink(sink),
_metadataSink = new BufferedSink(new BytesSink()),
+ _constantsBytesSink = new BytesSink(),
stringIndexer = stringIndexer ?? new StringIndexer() {
- _constantIndexer = new ConstantIndexer(this.stringIndexer);
+ _constantsSink = new BufferedSink(_constantsBytesSink);
+ _constantIndexer = new ConstantIndexer(this.stringIndexer, this);
_sink = _mainSink;
}
@@ -94,7 +98,7 @@
}
int getBufferOffset() {
- return _sink.flushedLength + _sink.length;
+ return _sink.offset;
}
void writeStringTable(StringIndexer indexer) {
@@ -137,12 +141,15 @@
_binaryOffsetForConstantTable = getBufferOffset();
writeUInt30(indexer.entries.length);
- for (final entry in indexer.entries) {
- writeConstantTableEntry(entry);
- }
+ assert(identical(_sink, _mainSink));
+ _constantsSink.flushAndDestroy();
+ writeBytes(_constantsBytesSink.builder.takeBytes());
}
- void writeConstantTableEntry(Constant constant) {
+ int writeConstantTableEntry(Constant constant) {
+ BufferedSink oldSink = _sink;
+ _sink = _constantsSink;
+ int initialOffset = _sink.offset;
if (constant is NullConstant) {
writeByte(ConstantTag.NullConstant);
} else if (constant is BoolConstant) {
@@ -198,6 +205,8 @@
} else {
throw 'Unsupported constant $constant';
}
+ _sink = oldSink;
+ return _constantsSink.offset - initialOffset;
}
void writeDartType(DartType type) {
@@ -2011,15 +2020,18 @@
final StringIndexer stringIndexer;
final List<Constant> entries = <Constant>[];
- final Map<Constant, int> index = <Constant, int>{};
+ final Map<Constant, int> offsets = <Constant, int>{};
+ int nextOffset = 0;
- ConstantIndexer(this.stringIndexer);
+ final BinaryPrinter _printer;
+
+ ConstantIndexer(this.stringIndexer, this._printer);
int put(Constant constant) {
- final int oldIndex = index[constant];
- if (oldIndex != null) return oldIndex;
+ final int oldOffset = offsets[constant];
+ if (oldOffset != null) return oldOffset;
- // Traverse DAG in post-order to ensure children have their id's assigned
+ // Traverse DAG in post-order to ensure children have their offsets assigned
// before the parent.
constant.visitChildren(this);
@@ -2034,16 +2046,17 @@
}
}
- final int newIndex = entries.length;
+ final int newOffset = nextOffset;
entries.add(constant);
- return index[constant] = newIndex;
+ nextOffset += _printer.writeConstantTableEntry(constant);
+ return offsets[constant] = newOffset;
}
defaultConstantReference(Constant node) {
put(node);
}
- int operator [](Constant node) => index[node];
+ int operator [](Constant node) => offsets[node];
}
class TypeParameterIndexer {
@@ -2117,6 +2130,8 @@
Float64List _doubleBuffer = new Float64List(1);
Uint8List _doubleBufferUint8;
+ int get offset => length + flushedLength;
+
BufferedSink(this._sink);
void addDouble(double d) {
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index 7cfea5e..d31f70a 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -969,8 +969,8 @@
if (syncAsync) {
final completerType = new InterfaceType(
helper.asyncAwaitCompleterClass, completerTypeArguments);
- // final Completer<T> :completer = new _AsyncAwaitCompleter<T>();
- completerVariable = new VariableDeclaration(":completer",
+ // final Completer<T> :async_completer = new _AsyncAwaitCompleter<T>();
+ completerVariable = new VariableDeclaration(":async_completer",
initializer: new ConstructorInvocation(
helper.asyncAwaitCompleterConstructor,
new Arguments([], types: completerTypeArguments))
@@ -980,8 +980,8 @@
} else {
final completerType =
new InterfaceType(helper.completerClass, completerTypeArguments);
- // final Completer<T> :completer = new Completer<T>.sync();
- completerVariable = new VariableDeclaration(":completer",
+ // final Completer<T> :async_completer = new Completer<T>.sync();
+ completerVariable = new VariableDeclaration(":async_completer",
initializer: new StaticInvocation(helper.completerConstructor,
new Arguments([], types: completerTypeArguments))
..fileOffset = enclosingFunction.body?.fileOffset ?? -1,
@@ -996,7 +996,7 @@
setupAsyncContinuations(statements);
if (syncAsync) {
- // :completer.start(:async_op);
+ // :async_completer.start(:async_op);
var startStatement = new ExpressionStatement(new MethodInvocation(
new VariableGet(completerVariable),
new Name('start'),
@@ -1012,7 +1012,7 @@
..fileOffset = enclosingFunction.fileOffset);
statements.add(newMicrotaskStatement);
}
- // return :completer.future;
+ // return :async_completer.future;
var completerGet = new VariableGet(completerVariable);
var returnStatement = new ReturnStatement(new PropertyGet(completerGet,
new Name('future', helper.asyncLibrary), helper.completerFuture));
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index ad6017b..821f9d5 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -229,6 +229,12 @@
}
for (int i = 0; i < typeParameters.length; ++i) {
freshParameters[i].bound = substitute(typeParameters[i].bound, map);
+
+ // [defaultType] is populated using instantiate-to-bound algorithm, so it
+ // shouldn't refer to type parameters from the same declaration. However,
+ // if a transformation changes [defaultType], it may get such references,
+ // and the line below should invoke [substitute], like for [bound] above.
+ freshParameters[i].defaultType = typeParameters[i].defaultType;
}
return new FreshTypeParameters(freshParameters, Substitution.fromMap(map));
}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index a6d778d..70fb077 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -63,6 +63,7 @@
analyzer_cli/test/*: SkipByDesign # Only meant to run on vm
analyzer_plugin/test/*: SkipByDesign # Only meant to run on vm
analyzer_plugin/tool/*: SkipByDesign # Only meant to run on vm
+build_integration/test/*: SkipByDesign # Only meant to run on vm, most use dart:mirrors and dart:io
collection/test/equality_test/01: Fail # Issue 1533
collection/test/equality_test/02: Fail # Issue 1533
collection/test/equality_test/03: Fail # Issue 1533
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 0590e39..ba848ff 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -262,7 +262,8 @@
if (compiler == null) {
port.send(new CompilationResult.errors(
- ["No incremental compiler available for this isolate."]).toResponse());
+ ["No incremental compiler available for this isolate."], null)
+ .toResponse());
return;
}
@@ -274,14 +275,15 @@
expression, definitions, typeDefinitions, libraryUri, klass, isStatic);
if (procedure == null) {
- port.send(new CompilationResult.errors(["Invalid scope."]).toResponse());
+ port.send(
+ new CompilationResult.errors(["Invalid scope."], null).toResponse());
return;
}
if (compiler.errors.isNotEmpty) {
// TODO(sigmund): the compiler prints errors to the console, so we
// shouldn't print those messages again here.
- result = new CompilationResult.errors(compiler.errors);
+ result = new CompilationResult.errors(compiler.errors, null);
} else {
result = new CompilationResult.ok(serializeProcedure(procedure));
}
@@ -387,7 +389,8 @@
Component component = await compiler.compile(script);
if (compiler.errors.isNotEmpty) {
- result = new CompilationResult.errors(compiler.errors);
+ result = new CompilationResult.errors(compiler.errors,
+ serializeComponent(component, filter: (lib) => !lib.isExternal));
} else {
// We serialize the component excluding vm_platform.dill because the VM has
// these sources built-in. Everything loaded as a summary in
@@ -415,7 +418,7 @@
inputFileUri,
inputFileUri,
null,
- new CompilationResult.errors(<String>["unknown tag"]).payload
+ new CompilationResult.errors(<String>["unknown tag"], null).payload
]);
}
}
@@ -509,7 +512,8 @@
factory CompilationResult.ok(Uint8List bytes) = _CompilationOk;
- factory CompilationResult.errors(List<String> errors) = _CompilationError;
+ factory CompilationResult.errors(List<String> errors, Uint8List bytes) =
+ _CompilationError;
factory CompilationResult.crash(Object exception, StackTrace stack) =
_CompilationCrash;
@@ -545,9 +549,10 @@
}
class _CompilationError extends _CompilationFail {
+ final Uint8List bytes;
final List<String> errors;
- _CompilationError(this.errors);
+ _CompilationError(this.errors, this.bytes);
@override
Status get status => Status.error;
@@ -556,6 +561,8 @@
String get errorString => errors.take(10).join('\n');
String toString() => "_CompilationError(${errorString})";
+
+ List toResponse() => [status.index, payload, bytes];
}
class _CompilationCrash extends _CompilationFail {
diff --git a/pkg/vm/lib/bytecode/constant_pool.dart b/pkg/vm/lib/bytecode/constant_pool.dart
index 0b3cb58..287ed0a 100644
--- a/pkg/vm/lib/bytecode/constant_pool.dart
+++ b/pkg/vm/lib/bytecode/constant_pool.dart
@@ -63,8 +63,15 @@
ConstantIndex argDesc;
}
+enum InvocationKind {
+ method, // x.foo(...) or foo(...)
+ getter, // x.foo
+ setter // x.foo = ...
+}
+
type ConstantStaticICData extends ConstantPoolEntry {
Byte tag = 8;
+ Byte invocationKind; // Index in InvocationKind enum.
CanonicalNameReference target;
ConstantIndex argDesc;
}
@@ -468,13 +475,20 @@
bool operator ==(other) => identical(this, other);
}
+enum InvocationKind { method, getter, setter }
+
class ConstantStaticICData extends ConstantPoolEntry {
+ final InvocationKind invocationKind;
final Reference _reference;
final int argDescConstantIndex;
- ConstantStaticICData(Member member, int argDescConstantIndex)
- : this.byReference(member.reference, argDescConstantIndex);
- ConstantStaticICData.byReference(this._reference, this.argDescConstantIndex);
+ ConstantStaticICData(
+ InvocationKind invocationKind, Member member, int argDescConstantIndex)
+ : this.byReference(
+ invocationKind, member.reference, argDescConstantIndex);
+
+ ConstantStaticICData.byReference(
+ this.invocationKind, this._reference, this.argDescConstantIndex);
Member get target => _reference.asMember;
@@ -483,17 +497,23 @@
@override
void writeValueToBinary(BinarySink sink) {
+ sink.writeByte(invocationKind.index);
sink.writeCanonicalNameReference(getCanonicalNameOfMember(target));
sink.writeUInt30(argDescConstantIndex);
}
ConstantStaticICData.readFromBinary(BinarySource source)
- : _reference = source.readCanonicalNameReference().getReference(),
+ : invocationKind = InvocationKind.values[source.readByte()],
+ _reference = source.readCanonicalNameReference().getReference(),
argDescConstantIndex = source.readUInt();
@override
String toString() =>
- 'StaticICData target \'$target\', arg-desc CP#$argDescConstantIndex';
+ 'StaticICData ' +
+ (invocationKind == InvocationKind.getter
+ ? 'get '
+ : (invocationKind == InvocationKind.setter ? 'set ' : '')) +
+ 'target \'$target\', arg-desc CP#$argDescConstantIndex';
// ConstantStaticICData entries are created per call site and should not be
// merged, so ConstantStaticICData class uses identity [hashCode] and
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 8d189b7..0bfd866 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -235,10 +235,15 @@
asm.emitReturnTOS();
}
- void _genStaticCall(
- Member target, ConstantArgDesc argDesc, int totalArgCount) {
+ void _genStaticCall(Member target, ConstantArgDesc argDesc, int totalArgCount,
+ {bool isGet: false, bool isSet: false}) {
+ assert(!isGet || !isSet);
final argDescIndex = cp.add(argDesc);
- final icdataIndex = cp.add(new ConstantStaticICData(target, argDescIndex));
+ final kind = isGet
+ ? InvocationKind.getter
+ : (isSet ? InvocationKind.setter : InvocationKind.method);
+ final icdataIndex =
+ cp.add(new ConstantStaticICData(kind, target, argDescIndex));
asm.emitPushConstant(icdataIndex);
asm.emitIndirectStaticCall(totalArgCount, argDescIndex);
@@ -470,7 +475,7 @@
void end(Member node) {
metadata.mapping[node] =
- new BytecodeMetadata(asm.bytecode, asm.exceptionsTable, cp, closures);
+ new BytecodeMetadata(cp, asm.bytecode, asm.exceptionsTable, closures);
if (isTraceEnabled) {
print('Generated bytecode for $node');
@@ -848,7 +853,7 @@
node.receiver.accept(this);
final target = node.target;
if (target is Field || (target is Procedure && target.isGetter)) {
- _genStaticCall(target, new ConstantArgDesc(1), 1);
+ _genStaticCall(target, new ConstantArgDesc(1), 1, isGet: true);
} else {
throw new UnsupportedOperationError(
'Unsupported DirectPropertyGet with ${target.runtimeType} $target');
@@ -1053,7 +1058,7 @@
'Unsupported SuperPropertyGet without target');
}
if (target is Field || (target is Procedure && target.isGetter)) {
- _genStaticCall(target, new ConstantArgDesc(1), 1);
+ _genStaticCall(target, new ConstantArgDesc(1), 1, isGet: true);
} else {
throw new UnsupportedOperationError(
'Unsupported SuperPropertyGet with target ${target.runtimeType} $target');
@@ -1113,11 +1118,11 @@
fieldIndex); // TODO(alexmarkov): do we really need this?
asm.emitPushStatic(fieldIndex);
} else {
- _genStaticCall(target, new ConstantArgDesc(0), 0);
+ _genStaticCall(target, new ConstantArgDesc(0), 0, isGet: true);
}
} else if (target is Procedure) {
if (target.isGetter) {
- _genStaticCall(target, new ConstantArgDesc(0), 0);
+ _genStaticCall(target, new ConstantArgDesc(0), 0, isGet: true);
} else {
final tearOffIndex = cp.add(new ConstantTearOff(target));
asm.emitPushConstant(tearOffIndex);
@@ -1152,7 +1157,7 @@
int cpIndex = cp.add(new ConstantField(target));
asm.emitStoreStaticTOS(cpIndex);
} else {
- _genStaticCall(target, new ConstantArgDesc(1), 1);
+ _genStaticCall(target, new ConstantArgDesc(1), 1, isSet: true);
asm.emitDrop1();
}
}
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index c38213d..1c7c2f8 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -9,6 +9,7 @@
import 'dart:io' hide FileSystemEntity;
import 'package:args/args.dart';
+import 'package:build_integration/file_system/multi_root.dart';
// front_end/src imports below that require lint `ignore_for_file`
// are a temporary state of things until frontend team builds better api
// that would replace api used below. This api was made private in
@@ -18,10 +19,7 @@
import 'package:front_end/src/api_prototype/file_system.dart'
show FileSystemEntity;
import 'package:front_end/src/api_prototype/front_end.dart';
-// Use of multi_root_file_system.dart directly from front_end package is a
-// temporarily solution while we are looking for better home for that
-// functionality.
-import 'package:front_end/src/multi_root_file_system.dart';
+import 'package:front_end/src/fasta/kernel/utils.dart';
import 'package:kernel/ast.dart';
import 'package:kernel/binary/ast_to_binary.dart';
import 'package:kernel/binary/limited_ast_to_binary.dart';
@@ -123,7 +121,16 @@
${argParser.usage}
''';
-enum _State { READY_FOR_INSTRUCTION, RECOMPILE_LIST }
+enum _State {
+ READY_FOR_INSTRUCTION,
+ RECOMPILE_LIST,
+ COMPILE_EXPRESSION_EXPRESSION,
+ COMPILE_EXPRESSION_DEFS,
+ COMPILE_EXPRESSION_TYPEDEFS,
+ COMPILE_EXPRESSION_LIBRARY_URI,
+ COMPILE_EXPRESSION_KLASS,
+ COMPILE_EXPRESSION_IS_STATIC
+}
/// Actions that every compiler should implement.
abstract class CompilerInterface {
@@ -152,6 +159,26 @@
/// Resets incremental compiler accept/reject status so that next time
/// recompile is requested, complete kernel file is produced.
void resetIncrementalCompiler();
+
+ /// Compiles [expression] with free variables listed in [definitions],
+ /// free type variables listed in [typedDefinitions]. "Free" means their
+ /// values are through evaluation API call, rather than coming from running
+ /// application.
+ /// If [klass] is not [null], expression is compiled in context of [klass]
+ /// class.
+ /// If [klass] is [null],expression is compiled at top-level of
+ /// [libraryUrl] library. If [klass] is not [null], [isStatic] determines
+ /// whether expression can refer to [this] or not.
+ Future<Null> compileExpression(
+ String expression,
+ List<String> definitions,
+ List<String> typeDefinitions,
+ String libraryUri,
+ String klass,
+ bool isStatic);
+
+ /// Communicates an error [msg] to the client.
+ void reportError(String msg);
}
abstract class ProgramTransformer {
@@ -207,7 +234,7 @@
_kernelBinaryFilenameFull = _options['output-dill'] ?? '$filename.dill';
_kernelBinaryFilenameIncremental = _options['output-incremental-dill'] ??
(_options['output-dill'] != null
- ? '${_options["output-dill"]}.incremental.dill'
+ ? '${_options['output-dill']}.incremental.dill'
: '$filename.incremental.dill');
_kernelBinaryFilename = _kernelBinaryFilenameFull;
_initializeFromDill =
@@ -240,7 +267,7 @@
break;
case Severity.errorLegacyWarning:
case Severity.context:
- throw "Unexpected severity: $severity";
+ throw 'Unexpected severity: $severity';
}
if (printMessage) {
_outputStream.writeln(message.formatted);
@@ -258,9 +285,9 @@
options['filesystem-scheme'], rootUris, compilerOptions.fileSystem);
if (_options['output-dill'] == null) {
- print("When --filesystem-root is specified it is required to specify"
- " --output-dill option that points to physical file system location"
- " of a target dill file.");
+ print('When --filesystem-root is specified it is required to specify'
+ ' --output-dill option that points to physical file system location'
+ ' of a target dill file.');
return false;
}
}
@@ -396,7 +423,37 @@
_outputStream
.writeln('$boundaryKey $_kernelBinaryFilename ${errors.length}');
_kernelBinaryFilename = _kernelBinaryFilenameIncremental;
- return null;
+ }
+
+ @override
+ Future<Null> compileExpression(
+ String expression,
+ List<String> definitions,
+ List<String> typeDefinitions,
+ String libraryUri,
+ String klass,
+ bool isStatic) async {
+ final String boundaryKey = new Uuid().generateV4();
+ _outputStream.writeln('result $boundaryKey');
+ Procedure procedure = await _generator.compileExpression(
+ expression, definitions, typeDefinitions, libraryUri, klass, isStatic);
+ if (procedure != null) {
+ final IOSink sink = new File(_kernelBinaryFilename).openWrite();
+ sink.add(serializeProcedure(procedure));
+ await sink.close();
+ _outputStream.writeln('$boundaryKey $_kernelBinaryFilename');
+ _kernelBinaryFilename = _kernelBinaryFilenameIncremental;
+ } else {
+ _outputStream.writeln(boundaryKey);
+ }
+ }
+
+ @override
+ void reportError(String msg) {
+ final String boundaryKey = new Uuid().generateV4();
+ _outputStream.writeln('result $boundaryKey');
+ _outputStream.writeln(msg);
+ _outputStream.writeln(boundaryKey);
}
@override
@@ -472,12 +529,24 @@
await file.close();
}
+class _CompileExpressionRequest {
+ String expression;
+ // Note that FE will reject a compileExpression command by returning a null
+ // procedure when defs or typeDefs include an illegal identifier.
+ List<String> defs = <String>[];
+ List<String> typeDefs = <String>[];
+ String library;
+ String klass;
+ bool isStatic;
+}
+
/// Listens for the compilation commands on [input] stream.
/// This supports "interactive" recompilation mode of execution.
void listenAndCompile(CompilerInterface compiler, Stream<List<int>> input,
ArgResults options, void quit(),
{IncrementalCompiler generator}) {
_State state = _State.READY_FOR_INSTRUCTION;
+ _CompileExpressionRequest compileExpressionRequest;
String boundaryKey;
String recompileFilename;
input
@@ -488,6 +557,8 @@
case _State.READY_FOR_INSTRUCTION:
const String COMPILE_INSTRUCTION_SPACE = 'compile ';
const String RECOMPILE_INSTRUCTION_SPACE = 'recompile ';
+ const String COMPILE_EXPRESSION_INSTRUCTION_SPACE =
+ 'compile-expression ';
if (string.startsWith(COMPILE_INSTRUCTION_SPACE)) {
final String filename =
string.substring(COMPILE_INSTRUCTION_SPACE.length);
@@ -505,6 +576,22 @@
boundaryKey = remainder;
}
state = _State.RECOMPILE_LIST;
+ } else if (string.startsWith(COMPILE_EXPRESSION_INSTRUCTION_SPACE)) {
+ // 'compile-expression <boundarykey>
+ // expression
+ // definitions (one per line)
+ // ...
+ // <boundarykey>
+ // type-defintions (one per line)
+ // ...
+ // <boundarykey>
+ // <libraryUri: String>
+ // <klass: String>
+ // <isStatic: true|false>
+ compileExpressionRequest = new _CompileExpressionRequest();
+ boundaryKey =
+ string.substring(COMPILE_EXPRESSION_INSTRUCTION_SPACE.length);
+ state = _State.COMPILE_EXPRESSION_EXPRESSION;
} else if (string == 'accept') {
compiler.acceptLastDelta();
} else if (string == 'reset') {
@@ -520,6 +607,48 @@
} else
compiler.invalidate(Uri.base.resolve(string));
break;
+ case _State.COMPILE_EXPRESSION_EXPRESSION:
+ compileExpressionRequest.expression = string;
+ state = _State.COMPILE_EXPRESSION_DEFS;
+ break;
+ case _State.COMPILE_EXPRESSION_DEFS:
+ if (string == boundaryKey) {
+ state = _State.COMPILE_EXPRESSION_TYPEDEFS;
+ } else {
+ compileExpressionRequest.defs.add(string);
+ }
+ break;
+ case _State.COMPILE_EXPRESSION_TYPEDEFS:
+ if (string == boundaryKey) {
+ state = _State.COMPILE_EXPRESSION_LIBRARY_URI;
+ } else {
+ compileExpressionRequest.typeDefs.add(string);
+ }
+ break;
+ case _State.COMPILE_EXPRESSION_LIBRARY_URI:
+ compileExpressionRequest.library = string;
+ state = _State.COMPILE_EXPRESSION_KLASS;
+ break;
+ case _State.COMPILE_EXPRESSION_KLASS:
+ compileExpressionRequest.klass = string.isEmpty ? null : string;
+ state = _State.COMPILE_EXPRESSION_IS_STATIC;
+ break;
+ case _State.COMPILE_EXPRESSION_IS_STATIC:
+ if (string == 'true' || string == 'false') {
+ compileExpressionRequest.isStatic = string == 'true';
+ compiler.compileExpression(
+ compileExpressionRequest.expression,
+ compileExpressionRequest.defs,
+ compileExpressionRequest.typeDefs,
+ compileExpressionRequest.library,
+ compileExpressionRequest.klass,
+ compileExpressionRequest.isStatic);
+ } else {
+ compiler
+ .reportError('Got $string. Expected either "true" or "false"');
+ }
+ state = _State.READY_FOR_INSTRUCTION;
+ break;
}
});
}
diff --git a/pkg/vm/lib/metadata/bytecode.dart b/pkg/vm/lib/metadata/bytecode.dart
index 3d5261f..0ba6b84 100644
--- a/pkg/vm/lib/metadata/bytecode.dart
+++ b/pkg/vm/lib/metadata/bytecode.dart
@@ -14,9 +14,9 @@
/// In kernel binary, bytecode metadata is encoded as following:
///
/// type BytecodeMetadata {
+/// ConstantPool constantPool
/// List<Byte> bytecodes
/// ExceptionsTable exceptionsTable
-/// ConstantPool constantPool
/// List<ClosureBytecode> closures
/// }
///
@@ -33,14 +33,15 @@
/// pkg/vm/lib/bytecode/constant_pool.dart.
///
class BytecodeMetadata {
+ final ConstantPool constantPool;
final List<int> bytecodes;
final ExceptionsTable exceptionsTable;
- final ConstantPool constantPool;
final List<ClosureBytecode> closures;
BytecodeMetadata(
- this.bytecodes, this.exceptionsTable, this.constantPool, this.closures);
+ this.constantPool, this.bytecodes, this.exceptionsTable, this.closures);
+ // TODO(alexmarkov): Consider printing constant pool before bytecode.
@override
String toString() => "\n"
"Bytecode {\n"
@@ -96,22 +97,22 @@
@override
void writeToBinary(BytecodeMetadata metadata, Node node, BinarySink sink) {
+ metadata.constantPool.writeToBinary(node, sink);
sink.writeByteList(metadata.bytecodes);
metadata.exceptionsTable.writeToBinary(sink);
- metadata.constantPool.writeToBinary(node, sink);
sink.writeUInt30(metadata.closures.length);
metadata.closures.forEach((c) => c.writeToBinary(sink));
}
@override
BytecodeMetadata readFromBinary(Node node, BinarySource source) {
- final List<int> bytecodes = source.readByteList();
- final exceptionsTable = new ExceptionsTable.readFromBinary(source);
final ConstantPool constantPool =
new ConstantPool.readFromBinary(node, source);
+ final List<int> bytecodes = source.readByteList();
+ final exceptionsTable = new ExceptionsTable.readFromBinary(source);
final List<ClosureBytecode> closures = new List<ClosureBytecode>.generate(
source.readUInt(), (_) => new ClosureBytecode.readFromBinary(source));
return new BytecodeMetadata(
- bytecodes, exceptionsTable, constantPool, closures);
+ constantPool, bytecodes, exceptionsTable, closures);
}
}
diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml
index 66ed423..c6632f8 100644
--- a/pkg/vm/pubspec.yaml
+++ b/pkg/vm/pubspec.yaml
@@ -6,6 +6,7 @@
environment:
sdk: ">=1.8.0 <2.0.0"
dependencies:
+ build_integration: 0.0.1
front_end: 0.1.0-alpha.6
kernel: 0.3.0-alpha.3
dev_dependencies:
diff --git a/pkg/vm/test/frontend_server_test.dart b/pkg/vm/test/frontend_server_test.dart
index 7ea07d4..ba2cf03 100644
--- a/pkg/vm/test/frontend_server_test.dart
+++ b/pkg/vm/test/frontend_server_test.dart
@@ -470,6 +470,115 @@
tempDir.delete(recursive: true);
});
+ test('compile expression', () async {
+ var file = new File('${tempDir.path}/foo.dart')..createSync();
+ file.writeAsStringSync("main() {}\n");
+ var dillFile = new File('${tempDir.path}/app.dill');
+ expect(dillFile.existsSync(), equals(false));
+ final List<String> args = <String>[
+ '--sdk-root=${sdkRoot.toFilePath()}',
+ '--strong',
+ '--incremental',
+ '--platform=${platformKernel.path}',
+ '--output-dill=${dillFile.path}'
+ ];
+
+ final StreamController<List<int>> streamController =
+ new StreamController<List<int>>();
+ final StreamController<List<int>> stdoutStreamController =
+ new StreamController<List<int>>();
+ final IOSink ioSink = new IOSink(stdoutStreamController.sink);
+ StreamController<String> receivedResults = new StreamController<String>();
+
+ String boundaryKey;
+ stdoutStreamController.stream
+ .transform(utf8.decoder)
+ .transform(const LineSplitter())
+ .listen((String s) {
+ const String RESULT_OUTPUT_SPACE = 'result ';
+ if (boundaryKey == null) {
+ if (s.startsWith(RESULT_OUTPUT_SPACE)) {
+ boundaryKey = s.substring(RESULT_OUTPUT_SPACE.length);
+ }
+ } else {
+ if (s.startsWith(boundaryKey)) {
+ receivedResults.add(s.length > boundaryKey.length
+ ? s.substring(boundaryKey.length + 1)
+ : null);
+ boundaryKey = null;
+ }
+ }
+ });
+
+ int exitcode =
+ await starter(args, input: streamController.stream, output: ioSink);
+ expect(exitcode, equals(0));
+ streamController.add('compile ${file.path}\n'.codeUnits);
+ int count = 0;
+ Completer<bool> allDone = new Completer<bool>();
+ receivedResults.stream.listen((String outputFilenameAndErrorCount) {
+ if (count == 0) {
+ // First request is to 'compile', which results in full kernel file.
+ int delim = outputFilenameAndErrorCount.lastIndexOf(' ');
+ expect(delim > 0, equals(true));
+ String outputFilename =
+ outputFilenameAndErrorCount.substring(0, delim);
+ int errorsCount = int
+ .parse(outputFilenameAndErrorCount.substring(delim + 1).trim());
+
+ expect(dillFile.existsSync(), equals(true));
+ expect(outputFilename, dillFile.path);
+ expect(errorsCount, equals(0));
+ streamController.add('accept\n'.codeUnits);
+
+ // 'compile-expression <boundarykey>
+ // expression
+ // definitions (one per line)
+ // ...
+ // <boundarykey>
+ // type-defintions (one per line)
+ // ...
+ // <boundarykey>
+ // <libraryUri: String>
+ // <klass: String>
+ // <isStatic: true|false>
+ streamController.add(
+ 'compile-expression abc\n2+2\nabc\nabc\n${file.uri}\n\n\n'
+ .codeUnits);
+ count += 1;
+ } else if (count == 1) {
+ // Previous request should have failed because isStatic was blank
+ expect(outputFilenameAndErrorCount, isNull);
+
+ streamController.add(
+ 'compile-expression abc\n2+2\nabc\nabc\n${file.uri}\n\nfalse\n'
+ .codeUnits);
+ count += 1;
+ } else if (count == 2) {
+ // Second request is to 'compile-expression', which results in
+ // kernel file with a function that wraps compiled expression.
+ expect(outputFilenameAndErrorCount, isNotNull);
+ File outputFile = new File(outputFilenameAndErrorCount);
+ expect(outputFile.existsSync(), equals(true));
+ expect(outputFile.lengthSync(), isPositive);
+
+ streamController.add('compile foo.bar\n'.codeUnits);
+ count += 1;
+ } else {
+ expect(count, 3);
+ // Third request is to 'compile' non-existent file, that should fail.
+ int delim = outputFilenameAndErrorCount.lastIndexOf(' ');
+ expect(delim > 0, equals(true));
+ int errorsCount = int
+ .parse(outputFilenameAndErrorCount.substring(delim + 1).trim());
+ expect(errorsCount, greaterThan(0));
+ allDone.complete(true);
+ }
+ });
+
+ expect(await allDone.future, true);
+ });
+
test('recompile request keeps incremental output dill filename', () async {
var file = new File('${tempDir.path}/foo.dart')..createSync();
file.writeAsStringSync("main() {}\n");
diff --git a/pkg/vm/testcases/bytecode/boostrapping.dart.expect b/pkg/vm/testcases/bytecode/boostrapping.dart.expect
index ba4d29e..f84988b 100644
--- a/pkg/vm/testcases/bytecode/boostrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/boostrapping.dart.expect
@@ -200,7 +200,7 @@
}
ConstantPool {
[0] = ArgDesc num-args 0, num-type-args 0, names []
- [1] = StaticICData target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
+ [1] = StaticICData get target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
[2] = ArgDesc num-args 1, num-type-args 0, names []
[3] = StaticICData target '#lib::_NamespaceImpl::_getPointer', arg-desc CP#2
[4] = Null
@@ -259,7 +259,7 @@
}
ConstantPool {
[0] = ArgDesc num-args 0, num-type-args 0, names []
- [1] = StaticICData target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
+ [1] = StaticICData get target '#lib::_NamespaceImpl::_namespace', arg-desc CP#0
[2] = Null
}
] static get _namespace() → self::_Namespace
@@ -276,7 +276,7 @@
}
ConstantPool {
[0] = ArgDesc num-args 0, num-type-args 0, names []
- [1] = StaticICData target '#lib::_NamespaceImpl::_namespacePointer', arg-desc CP#0
+ [1] = StaticICData get target '#lib::_NamespaceImpl::_namespacePointer', arg-desc CP#0
[2] = Null
}
] static get _namespacePointer() → core::int
@@ -714,7 +714,7 @@
[9] = ArgDesc num-args 1, num-type-args 0, names []
[10] = StaticICData target 'dart.core::Uri::parse', arg-desc CP#9
[11] = ArgDesc num-args 0, num-type-args 0, names []
- [12] = StaticICData target 'dart.core::Uri::base', arg-desc CP#11
+ [12] = StaticICData get target 'dart.core::Uri::base', arg-desc CP#11
[13] = Null
[14] = StaticICData target 'dart.core::_Uri::file', arg-desc CP#9
[15] = ICData target-name 'resolveUri', arg-desc CP#2
@@ -744,7 +744,7 @@
ConstantPool {
[0] = TearOff #lib::_scriptUri
[1] = ArgDesc num-args 1, num-type-args 0, names []
- [2] = StaticICData target '#lib::VMLibraryHooks::platformScript', arg-desc CP#1
+ [2] = StaticICData set target '#lib::VMLibraryHooks::platformScript', arg-desc CP#1
[3] = Null
}
]static method _setupHooks() → dynamic {
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index 07727bf..1d49cf2 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -125,7 +125,7 @@
}
ConstantPool {
[0] = ArgDesc num-args 1, num-type-args 0, names []
- [1] = StaticICData target '#lib::A::_name', arg-desc CP#0
+ [1] = StaticICData get target '#lib::A::_name', arg-desc CP#0
[2] = Null
}
] method toString() → core::String
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 76e73d7..dd01633 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -187,7 +187,7 @@
}
static bool SnapshotKindAllowedFromKernel() {
- return IsSnapshottingForPrecompilation() || (snapshot_kind == kCore);
+ return snapshot_kind != kScript;
}
// clang-format off
@@ -1454,30 +1454,43 @@
Dart_Handle result = Dart_SetEnvironmentCallback(EnvironmentCallback);
CHECK_RESULT(result);
- if (IsSnapshottingForPrecompilation()) {
- // The root library has to be set to generate AOT snapshots.
- // If the input dill file has a root library, then Dart_LoadScript will
- // ignore this dummy uri and set the root library to the one reported in
- // the dill file. Since dill files are not dart script files,
- // trying to resolve the root library URI based on the dill file name
- // would not help.
- //
- // If the input dill file does not have a root library, then
- // Dart_LoadScript will error.
- Dart_Handle library =
- Dart_LoadScriptFromKernel(kernel_buffer, kernel_buffer_size);
- if (Dart_IsError(library)) {
- Log::PrintErr("Unable to load root library from the input dill file.\n");
- return kErrorExitCode;
+ switch (snapshot_kind) {
+ case kAppAOTBlobs:
+ case kAppAOTAssembly: {
+ // The root library has to be set to generate AOT snapshots.
+ // If the input dill file has a root library, then Dart_LoadScript will
+ // ignore this dummy uri and set the root library to the one reported in
+ // the dill file. Since dill files are not dart script files,
+ // trying to resolve the root library URI based on the dill file name
+ // would not help.
+ //
+ // If the input dill file does not have a root library, then
+ // Dart_LoadScript will error.
+ Dart_Handle library =
+ Dart_LoadScriptFromKernel(kernel_buffer, kernel_buffer_size);
+ if (Dart_IsError(library)) {
+ Log::PrintErr(
+ "Unable to load root library from the input dill file.\n");
+ return kErrorExitCode;
+ }
+
+ CreateAndWritePrecompiledSnapshot(entry_points);
+
+ CreateAndWriteDependenciesFile();
+
+ CleanupEntryPointsCollection(entry_points);
+
+ break;
}
-
- CreateAndWritePrecompiledSnapshot(entry_points);
-
- CreateAndWriteDependenciesFile();
-
- CleanupEntryPointsCollection(entry_points);
- } else {
- CreateAndWriteCoreSnapshot();
+ case kCore:
+ CreateAndWriteCoreSnapshot();
+ break;
+ case kCoreJIT:
+ LoadCompilationTrace();
+ CreateAndWriteCoreJITSnapshot();
+ break;
+ default:
+ UNREACHABLE();
}
Dart_ExitScope();
diff --git a/runtime/observatory/lib/src/elements/allocation_profile.dart b/runtime/observatory/lib/src/elements/allocation_profile.dart
index c7bdf82..5fb89b4 100644
--- a/runtime/observatory/lib/src/elements/allocation_profile.dart
+++ b/runtime/observatory/lib/src/elements/allocation_profile.dart
@@ -315,7 +315,7 @@
}
}
- static Element _createCollectionLine() => new DivElement()
+ static HtmlElement _createCollectionLine() => new DivElement()
..classes = ['collection-item']
..children = [
new SpanElement()
diff --git a/runtime/observatory/lib/src/elements/class_tree.dart b/runtime/observatory/lib/src/elements/class_tree.dart
index a187f24..2a74a06 100644
--- a/runtime/observatory/lib/src/elements/class_tree.dart
+++ b/runtime/observatory/lib/src/elements/class_tree.dart
@@ -143,7 +143,7 @@
});
}
- static Element _create(toggle) {
+ static HtmlElement _create(toggle) {
return new DivElement()
..classes = ['class-tree-item']
..children = [
diff --git a/runtime/observatory/lib/src/elements/heap_snapshot.dart b/runtime/observatory/lib/src/elements/heap_snapshot.dart
index bedcfdb..59296ec 100644
--- a/runtime/observatory/lib/src/elements/heap_snapshot.dart
+++ b/runtime/observatory/lib/src/elements/heap_snapshot.dart
@@ -326,7 +326,7 @@
return report;
}
- static Element _createDominator(toggle) {
+ static HtmlElement _createDominator(toggle) {
return new DivElement()
..classes = ['tree-item']
..children = [
@@ -344,7 +344,7 @@
];
}
- static Element _createMergedDominator(toggle) {
+ static HtmlElement _createMergedDominator(toggle) {
return new DivElement()
..classes = ['tree-item']
..children = [
@@ -362,7 +362,7 @@
];
}
- static Element _createGroup(toggle) {
+ static HtmlElement _createGroup(toggle) {
return new DivElement()
..classes = ['tree-item']
..children = [
@@ -380,7 +380,7 @@
];
}
- static Element _createOwnershipClass(toggle) {
+ static HtmlElement _createOwnershipClass(toggle) {
return new DivElement()
..classes = ['tree-item']
..children = [
@@ -397,7 +397,7 @@
static const int kMaxChildren = 100;
static const int kMinRetainedSize = 4096;
- static _getChildrenDominator(M.HeapSnapshotDominatorNode node) {
+ static Iterable _getChildrenDominator(M.HeapSnapshotDominatorNode node) {
final list = node.children.toList();
list.sort((a, b) => b.retainedSize - a.retainedSize);
return list
@@ -405,7 +405,8 @@
.take(kMaxChildren);
}
- static _getChildrenMergedDominator(M.HeapSnapshotMergedDominatorNode node) {
+ static Iterable _getChildrenMergedDominator(
+ M.HeapSnapshotMergedDominatorNode node) {
final list = node.children.toList();
list.sort((a, b) => b.retainedSize - a.retainedSize);
return list
@@ -413,7 +414,7 @@
.take(kMaxChildren);
}
- static _getChildrenGroup(item) {
+ static Iterable _getChildrenGroup(item) {
if (item is M.HeapSnapshotClassReferences) {
if (item.inbounds.isNotEmpty || item.outbounds.isNotEmpty) {
return [item.inbounds, item.outbounds];
@@ -424,7 +425,7 @@
return const [];
}
- static _getChildrenOwnershipClass(item) {
+ static Iterable _getChildrenOwnershipClass(item) {
return const [];
}
diff --git a/runtime/observatory/lib/src/elements/instance_ref.dart b/runtime/observatory/lib/src/elements/instance_ref.dart
index 45737fa..748acbe 100644
--- a/runtime/observatory/lib/src/elements/instance_ref.dart
+++ b/runtime/observatory/lib/src/elements/instance_ref.dart
@@ -272,7 +272,7 @@
case M.InstanceKind.list:
var index = 0;
return _loadedInstance.elements
- .map((element) => new DivElement()
+ .map<Element>((element) => new DivElement()
..children = [
new SpanElement()..text = '[ ${index++} ] : ',
anyRef(_isolate, element, _objects, queue: _r.queue)
@@ -281,7 +281,7 @@
..addAll(_createShowMoreButton());
case M.InstanceKind.map:
return _loadedInstance.associations
- .map((association) => new DivElement()
+ .map<Element>((association) => new DivElement()
..children = [
new SpanElement()..text = '[ ',
anyRef(_isolate, association.key, _objects, queue: _r.queue),
@@ -306,7 +306,7 @@
case M.InstanceKind.float64x2List:
var index = 0;
return _loadedInstance.typedElements
- .map((e) => new DivElement()..text = '[ ${index++} ] : $e')
+ .map<Element>((e) => new DivElement()..text = '[ ${index++} ] : $e')
.toList()
..addAll(_createShowMoreButton());
case M.InstanceKind.mirrorReference:
diff --git a/runtime/observatory/lib/src/elements/memory/snapshot.dart b/runtime/observatory/lib/src/elements/memory/snapshot.dart
index 67be83a..fd91ebc 100644
--- a/runtime/observatory/lib/src/elements/memory/snapshot.dart
+++ b/runtime/observatory/lib/src/elements/memory/snapshot.dart
@@ -165,7 +165,7 @@
];
}
- static Element _createDominator(toggle) {
+ static HtmlElement _createDominator(toggle) {
return new DivElement()
..classes = ['tree-item']
..children = [
@@ -186,7 +186,7 @@
static const int kMaxChildren = 100;
static const int kMinRetainedSize = 4096;
- static _getChildrenDominator(M.HeapSnapshotDominatorNode node) {
+ static Iterable _getChildrenDominator(M.HeapSnapshotDominatorNode node) {
final list = node.children.toList();
list.sort((a, b) => b.retainedSize - a.retainedSize);
return list
diff --git a/runtime/observatory/lib/src/models/repositories/notification.dart b/runtime/observatory/lib/src/models/repositories/notification.dart
index 816bf04..c9c7824 100644
--- a/runtime/observatory/lib/src/models/repositories/notification.dart
+++ b/runtime/observatory/lib/src/models/repositories/notification.dart
@@ -11,6 +11,6 @@
abstract class NotificationRepository {
Stream<NotificationChangeEvent> get onChange;
Iterable<Notification> list();
- void delete(Notification);
+ void delete(Notification notification);
void deleteAll();
}
diff --git a/runtime/observatory/lib/src/models/repositories/target.dart b/runtime/observatory/lib/src/models/repositories/target.dart
index eb364e9..2c2db92 100644
--- a/runtime/observatory/lib/src/models/repositories/target.dart
+++ b/runtime/observatory/lib/src/models/repositories/target.dart
@@ -13,9 +13,9 @@
Target get current;
Iterable<Target> list();
- void add(String);
- void setCurrent(Target);
- void delete(Target);
+ void add(String address);
+ void setCurrent(Target t);
+ void delete(Target o);
Target find(String networkAddress);
bool isConnectedVMTarget(Target target);
}
diff --git a/runtime/observatory/lib/src/repositories/flag.dart b/runtime/observatory/lib/src/repositories/flag.dart
index b1b5349..0a080d2 100644
--- a/runtime/observatory/lib/src/repositories/flag.dart
+++ b/runtime/observatory/lib/src/repositories/flag.dart
@@ -26,7 +26,7 @@
return flags.map(_toFlag);
}
- static _toFlag(Map map) {
+ static Flag _toFlag(Map map) {
return new Flag(
map['name'], map['comment'], map['modified'], map['valueAsString']);
}
diff --git a/runtime/observatory/lib/src/repositories/target.dart b/runtime/observatory/lib/src/repositories/target.dart
index 0b5dc15..35d0dde 100644
--- a/runtime/observatory/lib/src/repositories/target.dart
+++ b/runtime/observatory/lib/src/repositories/target.dart
@@ -4,7 +4,7 @@
part of repositories;
-typedef bool IsConnectedVMTargetDelegate(Target);
+typedef bool IsConnectedVMTargetDelegate(M.Target target);
class TargetChangeEvent implements M.TargetChangeEvent {
final TargetRepository repository;
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 1fa79a6..26ff6ab 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -460,6 +460,7 @@
int get tokenPos;
Future<int> getLine();
Future<int> getColumn();
+ Future<String> toUserString();
}
/// A [SourceLocation] represents a location or range in the source code.
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 59485c1..3fb4084 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -13,7 +13,7 @@
var result = await vm.invokeRpcNoUpgrade('getVersion', {});
expect(result['type'], equals('Version'));
expect(result['major'], equals(3));
- expect(result['minor'], equals(7));
+ expect(result['minor'], equals(8));
expect(result['_privateMajor'], equals(0));
expect(result['_privateMinor'], equals(0));
},
diff --git a/runtime/observatory/tests/service/kill_paused_test.dart b/runtime/observatory/tests/service/kill_paused_test.dart
new file mode 100644
index 0000000..c0f5c91
--- /dev/null
+++ b/runtime/observatory/tests/service/kill_paused_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2015, 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.
+// VMOptions=--error_on_bad_type --error_on_bad_override
+
+import 'package:observatory/service_common.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_helper.dart';
+import 'dart:developer';
+import 'service_test_common.dart';
+
+testMain() async {
+ debugger(); // Stop here.
+ print('1');
+ while (true) {}
+}
+
+var tests = <IsolateTest>[
+ // Stopped at 'debugger' statement.
+ hasStoppedAtBreakpoint,
+ // Kill the app
+ (Isolate isolate) async {
+ Map<String, dynamic> params = <String, dynamic>{};
+ ServiceObject result = await isolate.invokeRpc('kill', params);
+ expect(result.type, equals('Success'));
+ }
+];
+
+main(args) async => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/kill_running_test.dart b/runtime/observatory/tests/service/kill_running_test.dart
new file mode 100644
index 0000000..15e8b9c
--- /dev/null
+++ b/runtime/observatory/tests/service/kill_running_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2015, 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.
+// VMOptions=--error_on_bad_type --error_on_bad_override
+
+import 'package:observatory/service_common.dart';
+import 'package:unittest/unittest.dart';
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+testMain() async {
+ print('1');
+ while (true) {}
+}
+
+var tests = <IsolateTest>[
+ // Stopped at 'debugger' statement.
+ isolateIsRunning,
+ // Kill the app
+ (Isolate isolate) async {
+ Map<String, dynamic> params = <String, dynamic>{};
+ ServiceObject result = await isolate.invokeRpc('kill', params);
+ expect(result.type, equals('Success'));
+ }
+];
+
+main(args) async => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 8003fb4..d93a63c 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -15,7 +15,6 @@
evaluate_activation_test/instance: RuntimeError
evaluate_activation_test/scope: RuntimeError
evaluate_in_sync_star_activation_test: RuntimeError
-pause_on_unhandled_async_exceptions_test: RuntimeError # --pause-isolates-on-unhandled-exceptions doesn't currently work. Issue #29056
step_through_arithmetic_test: RuntimeError # probably constant evaluator pre-evaluating e.g. 1+2
unused_changes_in_last_reload_test: RuntimeError
@@ -31,7 +30,6 @@
[ $arch == simdbc64 && $compiler == dartk ]
get_cpu_profile_timeline_rpc_test: Pass, RuntimeError # http://dartbug.com/31794
-pause_on_unhandled_async_exceptions_test: RuntimeError, Timeout # Issue 31765
[ $arch == simdbc64 && $compiler == dartk && $mode == debug ]
eval_test: Pass, Slow
@@ -108,7 +106,7 @@
[ $compiler == dartk && ($arch == simarm || $arch == simarm64 || $arch == simdbc64) ]
add_breakpoint_rpc_kernel_test: RuntimeError # Issue #33087
-async_generator_breakpoint_test: Pass, RuntimeError
+async_generator_breakpoint_test: Pass, RuntimeError, Crash # dartbug.com/33175 for the crash
bad_reload_test: Skip # Times out on sim architectures, also RuntimeError.
break_on_activation_test: RuntimeError # Issue #33087
complex_reload_test: Skip # Times out on sim architectures, also RuntimeError.
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index d07500e..2cf1c6e 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -185,10 +185,6 @@
[ $compiler == dartk && $runtime == vm && $system == macos ]
cc/IsolateReload_LibraryLookup: Fail, Crash
-[ $compiler == dartk && $runtime == vm && $strong ]
-cc/IsolateReload_LibraryHide: Crash
-cc/IsolateReload_LibraryShow: Crash
-
[ $compiler == dartk && $system == linux ]
cc/IsolateReload_LibraryLookup: Fail, Crash
@@ -204,8 +200,6 @@
[ $compiler == dartk && $strong ]
cc/DartGeneratedArrayLiteralMessages: Crash # Issue 32190
cc/FullSnapshot1: Crash # Issue 32190
-cc/IsolateReload_LibraryImportAdded: Crash # Issue 32190
-cc/IsolateReload_LibraryImportRemoved: Fail # Issue 32190
cc/IsolateReload_LibraryLookup: Fail, Crash # Issue 32190
cc/MismatchedSnapshotKinds: Fail, Crash, OK # Script snapshots not supported in Dart 2
cc/ScriptSnapshot1: Fail, Crash, OK # Script snapshots not supported in Dart 2
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 66f0543..39858e9 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -386,6 +386,11 @@
UNREACHABLE();
}
+void ConstantPropagator::VisitMakeTemp(MakeTempInstr* instr) {
+ // Instruction is eliminated when translating to SSA.
+ UNREACHABLE();
+}
+
void ConstantPropagator::VisitStoreLocal(StoreLocalInstr* instr) {
// Instruction is eliminated when translating to SSA.
UNREACHABLE();
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index 4aedb3c..c4740e2 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -1167,8 +1167,8 @@
// 2a. Handle uses:
// Update the expression stack renaming environment for each use by
// removing the renamed value.
- // For each use of a LoadLocal, StoreLocal, DropTemps or Constant: Replace
- // it with the renamed value.
+ // For each use of a LoadLocal, StoreLocal, MakeTemp, DropTemps or Constant:
+ // replace it with the renamed value.
for (intptr_t i = current->InputCount() - 1; i >= 0; --i) {
Value* v = current->InputAt(i);
// Update expression stack.
@@ -1177,8 +1177,10 @@
Definition* reaching_defn = env->RemoveLast();
Definition* input_defn = v->definition();
if (input_defn != reaching_defn) {
+ // Note: constants can only be replaced with other constants.
ASSERT(input_defn->IsLoadLocal() || input_defn->IsStoreLocal() ||
- input_defn->IsDropTemps() || input_defn->IsConstant());
+ input_defn->IsDropTemps() || input_defn->IsMakeTemp() ||
+ (input_defn->IsConstant() && reaching_defn->IsConstant()));
// Assert we are not referencing nulls in the initial environment.
ASSERT(reaching_defn->ssa_temp_index() != -1);
v->set_definition(reaching_defn);
@@ -1192,103 +1194,120 @@
env->RemoveLast();
}
- // 2b. Handle LoadLocal, StoreLocal, DropTemps and Constant.
- Definition* definition = current->AsDefinition();
- if (definition != NULL) {
- LoadLocalInstr* load = definition->AsLoadLocal();
- StoreLocalInstr* store = definition->AsStoreLocal();
- DropTempsInstr* drop = definition->AsDropTemps();
- ConstantInstr* constant = definition->AsConstant();
- if ((load != NULL) || (store != NULL) || (drop != NULL) ||
- (constant != NULL)) {
- Definition* result = NULL;
- if (store != NULL) {
- // Update renaming environment.
- intptr_t index = store->local().BitIndexIn(num_direct_parameters_);
- result = store->value()->definition();
+ // 2b. Handle LoadLocal/StoreLocal/MakeTemp/DropTemps/Constant and
+ // PushArgument specially. Other definitions are just pushed
+ // to the environment directly.
+ Definition* result = NULL;
+ switch (current->tag()) {
+ case Instruction::kLoadLocal: {
+ LoadLocalInstr* load = current->Cast<LoadLocalInstr>();
+ // The graph construction ensures we do not have an unused LoadLocal
+ // computation.
+ ASSERT(load->HasTemp());
+ const intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
+ result = (*env)[index];
- if (!FLAG_prune_dead_locals ||
- variable_liveness->IsStoreAlive(block_entry, store)) {
- (*env)[index] = result;
- } else {
- (*env)[index] = constant_dead();
- }
- } else if (load != NULL) {
- // The graph construction ensures we do not have an unused LoadLocal
- // computation.
- ASSERT(definition->HasTemp());
- intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
- result = (*env)[index];
+ PhiInstr* phi = result->AsPhi();
+ if ((phi != NULL) && !phi->is_alive()) {
+ phi->mark_alive();
+ live_phis->Add(phi);
+ }
- PhiInstr* phi = result->AsPhi();
- if ((phi != NULL) && !phi->is_alive()) {
- phi->mark_alive();
- live_phis->Add(phi);
- }
+ if (FLAG_prune_dead_locals &&
+ variable_liveness->IsLastLoad(block_entry, load)) {
+ (*env)[index] = constant_dead();
+ }
- if (FLAG_prune_dead_locals &&
- variable_liveness->IsLastLoad(block_entry, load)) {
- (*env)[index] = constant_dead();
- }
+ // Record captured parameters so that they can be skipped when
+ // emitting sync code inside optimized try-blocks.
+ if (load->local().is_captured_parameter()) {
+ captured_parameters_->Add(index);
+ }
- // Record captured parameters so that they can be skipped when
- // emitting sync code inside optimized try-blocks.
- if (load->local().is_captured_parameter()) {
- intptr_t index = load->local().BitIndexIn(num_direct_parameters_);
- captured_parameters_->Add(index);
- }
-
- if ((phi != NULL) && isolate()->strong() &&
- FLAG_use_strong_mode_types) {
- // Assign type to Phi if it doesn't have a type yet.
- // For a Phi to appear in the local variable it either was placed
- // there as incoming value by renaming or it was stored there by
- // StoreLocal which took this Phi from another local via LoadLocal,
- // to which this reasoning applies recursively.
- // This means that we are guaranteed to process LoadLocal for a
- // matching variable first.
- if (!phi->HasType()) {
- ASSERT((index < phi->block()->phis()->length()) &&
- ((*phi->block()->phis())[index] == phi));
- phi->UpdateType(
- CompileType::FromAbstractType(load->local().type()));
- }
- }
- } else if (drop != NULL) {
- // Drop temps from the environment.
- for (intptr_t j = 0; j < drop->num_temps(); j++) {
- env->RemoveLast();
- }
- if (drop->value() != NULL) {
- result = drop->value()->definition();
- }
- ASSERT((drop->value() != NULL) || !drop->HasTemp());
- } else {
- if (definition->HasTemp()) {
- result = GetConstant(constant->value());
+ if ((phi != NULL) && isolate()->strong() &&
+ FLAG_use_strong_mode_types) {
+ // Assign type to Phi if it doesn't have a type yet.
+ // For a Phi to appear in the local variable it either was placed
+ // there as incoming value by renaming or it was stored there by
+ // StoreLocal which took this Phi from another local via LoadLocal,
+ // to which this reasoning applies recursively.
+ // This means that we are guaranteed to process LoadLocal for a
+ // matching variable first.
+ if (!phi->HasType()) {
+ ASSERT((index < phi->block()->phis()->length()) &&
+ ((*phi->block()->phis())[index] == phi));
+ phi->UpdateType(
+ CompileType::FromAbstractType(load->local().type()));
}
}
- // Update expression stack or remove from graph.
- if (definition->HasTemp()) {
- ASSERT(result != NULL);
- env->Add(result);
- }
- it.RemoveCurrentFromGraph();
- } else {
- // Not a load, store, drop or constant.
- if (definition->HasTemp()) {
- // Assign fresh SSA temporary and update expression stack.
- AllocateSSAIndexes(definition);
- env->Add(definition);
- }
+ break;
}
+
+ case Instruction::kStoreLocal: {
+ StoreLocalInstr* store = current->Cast<StoreLocalInstr>();
+ const intptr_t index =
+ store->local().BitIndexIn(num_direct_parameters_);
+ result = store->value()->definition();
+
+ if (!FLAG_prune_dead_locals ||
+ variable_liveness->IsStoreAlive(block_entry, store)) {
+ (*env)[index] = result;
+ } else {
+ (*env)[index] = constant_dead();
+ }
+ break;
+ }
+
+ case Instruction::kDropTemps: {
+ // Drop temps from the environment.
+ DropTempsInstr* drop = current->Cast<DropTempsInstr>();
+ for (intptr_t j = 0; j < drop->num_temps(); j++) {
+ env->RemoveLast();
+ }
+ if (drop->value() != NULL) {
+ result = drop->value()->definition();
+ }
+ ASSERT((drop->value() != NULL) || !drop->HasTemp());
+ break;
+ }
+
+ case Instruction::kConstant: {
+ ConstantInstr* constant = current->Cast<ConstantInstr>();
+ if (constant->HasTemp()) {
+ result = GetConstant(constant->value());
+ }
+ break;
+ }
+
+ case Instruction::kMakeTemp: {
+ // Simply push a #null value to the expression stack.
+ result = constant_null_;
+ break;
+ }
+
+ case Instruction::kPushArgument:
+ env->Add(current->Cast<PushArgumentInstr>());
+ continue;
+
+ default:
+ // Other definitions directly go into the environment.
+ if (Definition* definition = current->AsDefinition()) {
+ if (definition->HasTemp()) {
+ // Assign fresh SSA temporary and update expression stack.
+ AllocateSSAIndexes(definition);
+ env->Add(definition);
+ }
+ }
+ continue;
}
- // 2c. Handle pushed argument.
- PushArgumentInstr* push = current->AsPushArgument();
- if (push != NULL) {
- env->Add(push);
+ // Update expression stack and remove current instruction from the graph.
+ Definition* definition = current->Cast<Definition>();
+ if (definition->HasTemp()) {
+ ASSERT(result != NULL);
+ env->Add(result);
}
+ it.RemoveCurrentFromGraph();
}
// 3. Process dominated blocks.
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 247a75b..ce25835a 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -3377,8 +3377,21 @@
UNREACHABLE();
}
+LocationSummary* MakeTempInstr::MakeLocationSummary(Zone* zone,
+ bool optimizing) const {
+ ASSERT(!optimizing);
+ null_->InitializeLocationSummary(zone, optimizing);
+ return null_->locs();
+}
+
+void MakeTempInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ ASSERT(!compiler->is_optimizing());
+ null_->EmitNativeCode(compiler);
+}
+
LocationSummary* DropTempsInstr::MakeLocationSummary(Zone* zone,
bool optimizing) const {
+ ASSERT(!optimizing);
return (InputCount() == 1)
? LocationSummary::Make(zone, 1, Location::SameAsFirstInput(),
LocationSummary::kNoCall)
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 875f806..4806355 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -488,6 +488,7 @@
M(StaticCall) \
M(LoadLocal) \
M(DropTemps) \
+ M(MakeTemp) \
M(StoreLocal) \
M(StrictCompare) \
M(EqualityCompare) \
@@ -873,6 +874,11 @@
#undef INSTRUCTION_TYPE_CHECK
#undef DECLARE_INSTRUCTION_TYPE_CHECK
+ template <typename T>
+ T* Cast() {
+ return static_cast<T*>(this);
+ }
+
// Returns structure describing location constraints required
// to emit native code for this instruction.
LocationSummary* locs() {
@@ -3898,6 +3904,51 @@
DISALLOW_COPY_AND_ASSIGN(DropTempsInstr);
};
+// This instruction is used to reserve a space on the expression stack
+// that later would be filled with StoreLocal. Reserved space would be
+// filled with a null value initially.
+//
+// Note: One must not use Constant(#null) to reserve expression stack space
+// because it would lead to an incorrectly compiled unoptimized code. Graph
+// builder would set Constant(#null) as an input definition to the instruction
+// that consumes this value from the expression stack - not knowing that
+// this value represents a placeholder - which might lead issues if instruction
+// has specialization for constant inputs (see https://dartbug.com/33195).
+class MakeTempInstr : public TemplateDefinition<0, NoThrow, Pure> {
+ public:
+ explicit MakeTempInstr(Zone* zone)
+ : null_(new (zone) ConstantInstr(Object::ZoneHandle())) {
+ // Note: We put ConstantInstr inside MakeTemp to simplify code generation:
+ // having ConstantInstr allows us to use Location::Contant(null_) as an
+ // output location for this instruction.
+ }
+
+ DECLARE_INSTRUCTION(MakeTemp)
+
+ virtual CompileType ComputeType() const { return CompileType::Dynamic(); }
+
+ virtual bool ComputeCanDeoptimize() const { return false; }
+
+ virtual bool HasUnknownSideEffects() const {
+ UNREACHABLE(); // Eliminated by SSA construction.
+ return false;
+ }
+
+ virtual bool MayThrow() const {
+ UNREACHABLE();
+ return false;
+ }
+
+ virtual TokenPosition token_pos() const { return TokenPosition::kTempMove; }
+
+ PRINT_OPERANDS_TO_SUPPORT
+
+ private:
+ ConstantInstr* null_;
+
+ DISALLOW_COPY_AND_ASSIGN(MakeTempInstr);
+};
+
class StoreLocalInstr : public TemplateDefinition<1, NoThrow> {
public:
StoreLocalInstr(const LocalVariable& local,
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index e9815df..c77e7d6 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -447,6 +447,8 @@
return Thread::Current()->zone()->MakeCopyOfString(buffer);
}
+void MakeTempInstr::PrintOperandsTo(BufferFormatter* f) const {}
+
void DropTempsInstr::PrintOperandsTo(BufferFormatter* f) const {
f->Print("%" Pd "", num_temps());
if (value() != NULL) {
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index b943afa..58bc7fa 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -914,8 +914,7 @@
}
#if defined(DART_USE_INTERPRETER)
-void BytecodeMetadataHelper::CopyBytecode(const Function& function) {
- // TODO(regis): Avoid copying bytecode from mapped kernel binary.
+void BytecodeMetadataHelper::ReadMetadata(const Function& function) {
const intptr_t node_offset = function.kernel_offset();
const intptr_t md_offset = GetNextMetadataPayloadOffset(node_offset);
if (md_offset < 0) {
@@ -925,14 +924,51 @@
AlternativeReadingScope alt(&builder_->reader_, &H.metadata_payloads(),
md_offset);
- // Read bytecode.
- intptr_t bytecode_size = builder_->reader_.ReadUInt();
- intptr_t bytecode_offset = builder_->reader_.offset();
- uint8_t* bytecode_data = builder_->reader_.CopyDataIntoZone(
- builder_->zone_, bytecode_offset, bytecode_size);
+ // Create object pool and read pool entries.
+ const intptr_t obj_count = builder_->reader_.ReadListLength();
+ const ObjectPool& pool =
+ ObjectPool::Handle(builder_->zone_, ObjectPool::New(obj_count));
+ ReadPoolEntries(function, function, pool, 0);
- // This enum and the code below reading the constant pool from kernel must be
- // kept in sync with pkg/vm/lib/bytecode/constant_pool.dart.
+ // Read bytecode and attach to function.
+ const Code& bytecode = Code::Handle(builder_->zone_, ReadBytecode(pool));
+ function.AttachBytecode(bytecode);
+
+ // Read exceptions table.
+ ReadExceptionsTable(bytecode);
+
+ if (FLAG_dump_kernel_bytecode) {
+ KernelBytecodeDisassembler::Disassemble(function);
+ }
+
+ // Read closures.
+ Function& closure = Function::Handle(builder_->zone_);
+ Code& closure_bytecode = Code::Handle(builder_->zone_);
+ intptr_t num_closures = builder_->ReadListLength();
+ for (intptr_t i = 0; i < num_closures; i++) {
+ intptr_t closure_index = builder_->ReadUInt();
+ ASSERT(closure_index < obj_count);
+ closure ^= pool.ObjectAt(closure_index);
+
+ // Read closure bytecode and attach to closure function.
+ closure_bytecode = ReadBytecode(pool);
+ closure.AttachBytecode(closure_bytecode);
+
+ // Read closure exceptions table.
+ ReadExceptionsTable(closure_bytecode);
+
+ if (FLAG_dump_kernel_bytecode) {
+ KernelBytecodeDisassembler::Disassemble(closure);
+ }
+ }
+}
+
+intptr_t BytecodeMetadataHelper::ReadPoolEntries(const Function& function,
+ const Function& inner_function,
+ const ObjectPool& pool,
+ intptr_t from_index) {
+ // These enums and the code below reading the constant pool from kernel must
+ // be kept in sync with pkg/vm/lib/bytecode/constant_pool.dart.
enum ConstantPoolTag {
kInvalid,
kNull,
@@ -954,19 +990,25 @@
kInstance,
kSymbol,
kTypeArgumentsForInstanceAllocation,
+ kContextOffset,
+ kClosureFunction,
+ kEndClosureFunctionScope,
};
- // Read object pool.
- builder_->reader_.set_offset(bytecode_offset + bytecode_size);
- intptr_t obj_count = builder_->reader_.ReadListLength();
- const ObjectPool& obj_pool =
- ObjectPool::Handle(builder_->zone_, ObjectPool::New(obj_count));
+ enum InvocationKind {
+ method, // x.foo(...) or foo(...)
+ getter, // x.foo
+ setter // x.foo = ...
+ };
+
Object& obj = Object::Handle(builder_->zone_);
Object& elem = Object::Handle(builder_->zone_);
Array& array = Array::Handle(builder_->zone_);
Field& field = Field::Handle(builder_->zone_);
+ Class& cls = Class::Handle(builder_->zone_);
String& name = String::Handle(builder_->zone_);
- for (intptr_t i = 0; i < obj_count; ++i) {
+ const intptr_t obj_count = pool.Length();
+ for (intptr_t i = from_index; i < obj_count; ++i) {
const intptr_t tag = builder_->ReadTag();
switch (tag) {
case ConstantPoolTag::kInvalid:
@@ -1018,7 +1060,7 @@
name = H.DartSymbolPlain(target).raw();
intptr_t arg_desc_index = builder_->ReadUInt();
ASSERT(arg_desc_index < i);
- array ^= obj_pool.ObjectAt(arg_desc_index);
+ array ^= pool.ObjectAt(arg_desc_index);
// TODO(regis): Should num_args_tested be explicitly provided?
obj = ICData::New(function, name,
array, // Arguments descriptor.
@@ -1029,18 +1071,34 @@
#endif
} break;
case ConstantPoolTag::kStaticICData: {
+ InvocationKind kind = static_cast<InvocationKind>(builder_->ReadByte());
NameIndex target = builder_->ReadCanonicalNameReference();
if (H.IsConstructor(target)) {
name = H.DartConstructorName(target).raw();
elem = H.LookupConstructorByKernelConstructor(target);
+ } else if (H.IsField(target)) {
+ if (kind == InvocationKind::getter) {
+ name = H.DartGetterName(target).raw();
+ } else if (kind == InvocationKind::setter) {
+ name = H.DartSetterName(target).raw();
+ } else {
+ ASSERT(kind == InvocationKind::method);
+ UNIMPLEMENTED(); // TODO(regis): Revisit.
+ }
+ field = H.LookupFieldByKernelField(target);
+ cls = field.Owner();
+ elem = cls.LookupStaticFunction(name);
} else {
+ if ((kind == InvocationKind::method) && H.IsGetter(target)) {
+ UNIMPLEMENTED(); // TODO(regis): Revisit.
+ }
name = H.DartProcedureName(target).raw();
elem = H.LookupStaticMethodByKernelProcedure(target);
}
ASSERT(elem.IsFunction());
intptr_t arg_desc_index = builder_->ReadUInt();
ASSERT(arg_desc_index < i);
- array ^= obj_pool.ObjectAt(arg_desc_index);
+ array ^= pool.ObjectAt(arg_desc_index);
obj = ICData::New(function, name,
array, // Arguments descriptor.
Thread::kNoDeoptId, 0 /* num_args_tested */,
@@ -1067,11 +1125,9 @@
ASSERT(obj.IsClass());
break;
case ConstantPoolTag::kTypeArgumentsFieldOffset:
- obj =
+ cls =
H.LookupClassByKernelClass(builder_->ReadCanonicalNameReference());
- ASSERT(obj.IsClass());
- obj = Smi::New(Class::Cast(obj).type_arguments_field_offset() /
- kWordSize);
+ obj = Smi::New(cls.type_arguments_field_offset() / kWordSize);
break;
case ConstantPoolTag::kTearOff:
obj = H.LookupStaticMethodByKernelProcedure(
@@ -1101,20 +1157,19 @@
for (intptr_t j = 0; j < length; j++) {
intptr_t elem_index = builder_->ReadUInt();
ASSERT(elem_index < i);
- elem = obj_pool.ObjectAt(elem_index);
+ elem = pool.ObjectAt(elem_index);
array.SetAt(j, elem);
}
obj = H.Canonicalize(Array::Cast(obj));
ASSERT(!obj.IsNull());
} break;
case ConstantPoolTag::kInstance: {
- obj =
+ cls =
H.LookupClassByKernelClass(builder_->ReadCanonicalNameReference());
- ASSERT(obj.IsClass());
- obj = Instance::New(Class::Cast(obj), Heap::kOld);
+ obj = Instance::New(cls, Heap::kOld);
intptr_t elem_index = builder_->ReadUInt();
ASSERT(elem_index < i);
- elem = obj_pool.ObjectAt(elem_index);
+ elem = pool.ObjectAt(elem_index);
if (!elem.IsNull()) {
ASSERT(elem.IsTypeArguments());
Instance::Cast(obj).SetTypeArguments(TypeArguments::Cast(elem));
@@ -1126,7 +1181,7 @@
field = H.LookupFieldByKernelField(field_name);
intptr_t elem_index = builder_->ReadUInt();
ASSERT(elem_index < i);
- elem = obj_pool.ObjectAt(elem_index);
+ elem = pool.ObjectAt(elem_index);
Instance::Cast(obj).SetField(field, elem);
}
obj = H.Canonicalize(Instance::Cast(obj));
@@ -1136,34 +1191,193 @@
ASSERT(String::Cast(obj).IsSymbol());
break;
case kTypeArgumentsForInstanceAllocation: {
- obj =
+ cls =
H.LookupClassByKernelClass(builder_->ReadCanonicalNameReference());
- ASSERT(obj.IsClass());
intptr_t elem_index = builder_->ReadUInt();
ASSERT(elem_index < i);
- elem = obj_pool.ObjectAt(elem_index);
+ elem = pool.ObjectAt(elem_index);
ASSERT(elem.IsNull() || elem.IsTypeArguments());
- elem = Type::New(Class::Cast(obj), TypeArguments::Cast(elem),
- TokenPosition::kNoSource);
- elem = ClassFinalizer::FinalizeType(Class::Cast(obj), Type::Cast(elem));
+ elem =
+ Type::New(cls, TypeArguments::Cast(elem), TokenPosition::kNoSource);
+ elem = ClassFinalizer::FinalizeType(cls, Type::Cast(elem));
obj = Type::Cast(elem).arguments();
} break;
+ case ConstantPoolTag::kContextOffset: {
+ intptr_t index = builder_->ReadUInt();
+ if (i == 0) {
+ obj = Smi::New(Context::parent_offset() / kWordSize);
+ } else {
+ obj = Smi::New(Context::variable_offset(index - 1) / kWordSize);
+ }
+ } break;
+ case ConstantPoolTag::kClosureFunction: {
+ name = H.DartSymbolPlain(builder_->ReadStringReference()).raw();
+ const Function& closure = Function::Handle(
+ builder_->zone_,
+ Function::NewClosureFunction(name, inner_function,
+ TokenPosition::kNoSource));
+
+ FunctionNodeHelper function_node_helper(builder_);
+ function_node_helper.ReadUntilExcluding(
+ FunctionNodeHelper::kTypeParameters);
+ builder_->LoadAndSetupTypeParameters(builder_->active_class(), closure,
+ builder_->ReadListLength(),
+ closure);
+ function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+
+ // Scope remains opened until ConstantPoolTag::kEndClosureFunctionScope.
+ ActiveTypeParametersScope scope(
+ builder_->active_class(), &closure,
+ TypeArguments::Handle(builder_->zone_, closure.type_parameters()),
+ builder_->zone_);
+
+ function_node_helper.ReadUntilExcluding(
+ FunctionNodeHelper::kPositionalParameters);
+
+ intptr_t required_parameter_count =
+ function_node_helper.required_parameter_count_;
+ intptr_t total_parameter_count =
+ function_node_helper.total_parameter_count_;
+
+ intptr_t positional_parameter_count = builder_->ReadListLength();
+
+ intptr_t named_parameter_count =
+ total_parameter_count - positional_parameter_count;
+
+ const intptr_t extra_parameters = 1;
+ closure.set_num_fixed_parameters(extra_parameters +
+ required_parameter_count);
+ if (named_parameter_count > 0) {
+ closure.SetNumOptionalParameters(named_parameter_count, false);
+ } else {
+ closure.SetNumOptionalParameters(
+ positional_parameter_count - required_parameter_count, true);
+ }
+ intptr_t parameter_count = extra_parameters + total_parameter_count;
+ closure.set_parameter_types(Array::Handle(
+ builder_->zone_, Array::New(parameter_count, Heap::kOld)));
+ closure.set_parameter_names(Array::Handle(
+ builder_->zone_, Array::New(parameter_count, Heap::kOld)));
+
+ intptr_t pos = 0;
+ closure.SetParameterTypeAt(pos, AbstractType::dynamic_type());
+ closure.SetParameterNameAt(pos, Symbols::ClosureParameter());
+ pos++;
+
+ for (intptr_t j = 0; j < positional_parameter_count; ++j, ++pos) {
+ VariableDeclarationHelper helper(builder_);
+ helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+ const AbstractType& type =
+ builder_->type_translator_.BuildVariableType();
+ Tag tag = builder_->ReadTag(); // read (first part of) initializer.
+ if (tag == kSomething) {
+ builder_->SkipExpression(); // read (actual) initializer.
+ }
+
+ closure.SetParameterTypeAt(pos, type);
+ closure.SetParameterNameAt(pos,
+ H.DartSymbolObfuscate(helper.name_index_));
+ }
+
+ intptr_t named_parameter_count_check = builder_->ReadListLength();
+ ASSERT(named_parameter_count_check == named_parameter_count);
+ for (intptr_t j = 0; j < named_parameter_count; ++j, ++pos) {
+ VariableDeclarationHelper helper(builder_);
+ helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+ const AbstractType& type =
+ builder_->type_translator_.BuildVariableType();
+ Tag tag = builder_->ReadTag(); // read (first part of) initializer.
+ if (tag == kSomething) {
+ builder_->SkipExpression(); // read (actual) initializer.
+ }
+
+ closure.SetParameterTypeAt(pos, type);
+ closure.SetParameterNameAt(pos,
+ H.DartSymbolObfuscate(helper.name_index_));
+ }
+
+ function_node_helper.SetJustRead(FunctionNodeHelper::kNamedParameters);
+
+ const AbstractType& return_type =
+ builder_->type_translator_.BuildVariableType();
+ closure.set_result_type(return_type);
+ function_node_helper.SetJustRead(FunctionNodeHelper::kReturnType);
+ // The closure has no body.
+ function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
+
+ pool.SetTypeAt(i, ObjectPool::kTaggedObject);
+ pool.SetObjectAt(i, closure);
+
+ // Continue reading the constant pool entries inside the opened
+ // ActiveTypeParametersScope until the scope gets closed by a
+ // kEndClosureFunctionScope tag, in which case control returns here.
+ i = ReadPoolEntries(function, closure, pool, i + 1);
+ // Pool entry at index i has been set to null, because it was a
+ // kEndClosureFunctionScope.
+ ASSERT(pool.ObjectAt(i) == Object::null());
+ continue;
+ }
+ case ConstantPoolTag::kEndClosureFunctionScope: {
+ // Entry is not used and set to null.
+ obj = Object::null();
+ pool.SetTypeAt(i, ObjectPool::kTaggedObject);
+ pool.SetObjectAt(i, obj);
+ return i; // The caller will close the scope.
+ } break;
default:
UNREACHABLE();
}
- obj_pool.SetTypeAt(i, ObjectPool::kTaggedObject);
- obj_pool.SetObjectAt(i, obj);
+ pool.SetTypeAt(i, ObjectPool::kTaggedObject);
+ pool.SetObjectAt(i, obj);
}
+ // Return the index of the last read pool entry.
+ return obj_count - 1;
+}
- const Code& bytecode = Code::Handle(
- builder_->zone_,
- Code::FinalizeBytecode(reinterpret_cast<void*>(bytecode_data),
- bytecode_size, obj_pool));
- function.AttachBytecode(bytecode);
+RawCode* BytecodeMetadataHelper::ReadBytecode(const ObjectPool& pool) {
+ // TODO(regis): Avoid copying bytecode from mapped kernel binary.
+ intptr_t size = builder_->reader_.ReadUInt();
+ intptr_t offset = builder_->reader_.offset();
+ uint8_t* data =
+ builder_->reader_.CopyDataIntoZone(builder_->zone_, offset, size);
+ builder_->reader_.set_offset(offset + size);
- if (FLAG_dump_kernel_bytecode) {
- KernelBytecodeDisassembler::Disassemble(function);
+ // Create and return code object.
+ return Code::FinalizeBytecode(reinterpret_cast<void*>(data), size, pool);
+}
+
+void BytecodeMetadataHelper::ReadExceptionsTable(const Code& bytecode) {
+ const ObjectPool& pool =
+ ObjectPool::Handle(builder_->zone_, bytecode.object_pool());
+ AbstractType& handled_type = AbstractType::Handle(builder_->zone_);
+
+ // Encoding of ExceptionsTable is described in
+ // pkg/vm/lib/bytecode/exceptions.dart.
+ intptr_t try_block_count = builder_->reader_.ReadListLength();
+ for (intptr_t i = 0; i < try_block_count; i++) {
+ intptr_t outer_try_index_plus1 = builder_->reader_.ReadUInt();
+ intptr_t outer_try_index = outer_try_index_plus1 - 1;
+ USE(outer_try_index);
+ intptr_t start_pc = builder_->reader_.ReadUInt();
+ USE(start_pc);
+ intptr_t end_pc = builder_->reader_.ReadUInt();
+ USE(end_pc);
+ intptr_t handler_pc = builder_->reader_.ReadUInt();
+ USE(handler_pc);
+ uint8_t flags = builder_->reader_.ReadByte();
+ // flagNeedsStackTrace = 1 << 0;
+ // flagIsSynthetic = 1 << 1;
+ USE(flags);
+
+ intptr_t type_count = builder_->reader_.ReadListLength();
+ for (intptr_t j = 0; j < type_count; j++) {
+ intptr_t type_index = builder_->reader_.ReadUInt();
+ ASSERT(type_index < pool.Length());
+ handled_type ^= pool.ObjectAt(type_index);
+ }
}
+ // TODO(regis): Generate exception handlers (as well as pc descriptors)
+ // and store in bytecode: bytecode.set_exception_handlers(exception_handlers);
}
#endif // defined(DART_USE_INTERPRETER)
@@ -1598,8 +1812,8 @@
first_body_token_position_ = builder_->reader_.min_position();
}
- // Ensure that :await_jump_var, :await_ctx_var, :async_op and
- // :async_stack_trace are captured.
+ // Ensure that :await_jump_var, :await_ctx_var, :async_op,
+ // :async_completer and :async_stack_trace are captured.
if (function_node_helper.async_marker_ == FunctionNodeHelper::kSyncYielding) {
{
LocalVariable* temp = NULL;
@@ -1620,6 +1834,13 @@
scope_->CaptureVariable(temp);
}
}
+ {
+ LocalVariable* temp =
+ scope_->LookupVariable(Symbols::AsyncCompleter(), true);
+ if (temp != NULL) {
+ scope_->CaptureVariable(temp);
+ }
+ }
if (FLAG_causal_async_stacks) {
LocalVariable* temp =
scope_->LookupVariable(Symbols::AsyncStackTraceVar(), true);
@@ -3914,7 +4135,9 @@
}
void StreamingConstantEvaluator::EvaluateConstantExpression() {
- result_ ^= H.constants().At(builder_->ReadUInt());
+ KernelConstantsMap constant_map(H.constants().raw());
+ result_ ^= constant_map.GetOrDie(builder_->ReadUInt());
+ ASSERT(constant_map.Release().raw() == H.constants().raw());
}
// This depends on being about to read the list of positionals on arguments.
@@ -5446,7 +5669,7 @@
function_node_helper.ReadUntilExcluding(
FunctionNodeHelper::kPositionalParameters);
- body += NullConstant();
+ body += MakeTemp();
LocalVariable* result = MakeTemporary();
// Do "++argument_count" if any type arguments were passed.
@@ -5978,7 +6201,7 @@
dispatch += Drop();
}
if (i == (yield_continuations().length() - 1)) {
- // We reached the last possility, no need to build more ifs.
+ // We reached the last possibility, no need to build more ifs.
// Continue to the last continuation.
// Note: continuations start with nop DropTemps instruction
// which acts like an anchor, so we need to skip it.
@@ -6162,7 +6385,7 @@
// TODO(regis): Clean up this logic of when to compile.
// If the bytecode was previously loaded, we really want to compile.
if (!function.HasBytecode()) {
- bytecode_metadata_helper_.CopyBytecode(function);
+ bytecode_metadata_helper_.ReadMetadata(function);
if (function.HasBytecode()) {
return NULL;
}
@@ -7573,6 +7796,10 @@
return flow_graph_builder_->DropTempsPreserveTop(num_temps_to_drop);
}
+Fragment StreamingFlowGraphBuilder::MakeTemp() {
+ return flow_graph_builder_->MakeTemp();
+}
+
Fragment StreamingFlowGraphBuilder::NullConstant() {
return flow_graph_builder_->NullConstant();
}
@@ -7844,7 +8071,7 @@
const DirectCallMetadata direct_call =
direct_call_metadata_helper_.GetDirectTargetForPropertySet(offset);
- Fragment instructions(NullConstant());
+ Fragment instructions(MakeTemp());
LocalVariable* variable = MakeTemporary();
const TokenPosition position = ReadPosition(); // read position.
@@ -8062,7 +8289,7 @@
Function& function = FindMatchingFunctionAnyArgs(klass, setter_name);
- Fragment instructions(NullConstant());
+ Fragment instructions(MakeTemp());
LocalVariable* value = MakeTemporary(); // this holds RHS value
if (function.IsNull()) {
@@ -8172,7 +8399,7 @@
const TokenPosition position = ReadPosition(); // read position.
if (p != NULL) *p = position;
- Fragment instructions(NullConstant());
+ Fragment instructions(MakeTemp());
LocalVariable* value = MakeTemporary();
instructions += BuildExpression(); // read receiver.
@@ -9411,8 +9638,12 @@
Fragment StreamingFlowGraphBuilder::BuildConstantExpression(
TokenPosition* position) {
if (position != NULL) *position = TokenPosition::kNoSource;
- const intptr_t constant_index = ReadUInt();
- return Constant(Object::ZoneHandle(Z, H.constants().At(constant_index)));
+ const intptr_t constant_offset = ReadUInt();
+ KernelConstantsMap constant_map(H.constants().raw());
+ Fragment result =
+ Constant(Object::ZoneHandle(Z, constant_map.GetOrDie(constant_offset)));
+ ASSERT(constant_map.Release().raw() == H.constants().raw());
+ return result;
}
Fragment StreamingFlowGraphBuilder::BuildPartialTearoffInstantiation(
@@ -11076,9 +11307,13 @@
temp_object_ = temp_class_.EnsureIsFinalized(H.thread());
ASSERT(temp_object_.IsNull());
- const Array& constants =
- Array::Handle(Z, Array::New(number_of_constants, Heap::kOld));
+ KernelConstantsMap constants(
+ HashTables::New<KernelConstantsMap>(number_of_constants, Heap::kOld));
+
+ const intptr_t start_offset = builder_.ReaderOffset();
+
for (intptr_t i = 0; i < number_of_constants; ++i) {
+ const intptr_t offset = builder_.ReaderOffset();
const intptr_t constant_tag = builder_.ReadByte();
switch (constant_tag) {
case kNullConstant:
@@ -11115,9 +11350,9 @@
temp_array_ = ImmutableArray::New(length, Heap::kOld);
temp_array_.SetTypeArguments(temp_type_arguments_);
for (intptr_t j = 0; j < length; ++j) {
- const intptr_t entry_index = builder_.ReadUInt();
- ASSERT(entry_index < i); // We have a DAG!
- temp_object_ = constants.At(entry_index);
+ const intptr_t entry_offset = builder_.ReadUInt();
+ ASSERT(entry_offset < offset); // We have a DAG!
+ temp_object_ = constants.GetOrDie(entry_offset);
temp_array_.SetAt(j, temp_object_);
}
@@ -11154,9 +11389,9 @@
for (intptr_t j = 0; j < number_of_fields; ++j) {
temp_field_ =
H.LookupFieldByKernelField(builder_.ReadCanonicalNameReference());
- const intptr_t entry_index = builder_.ReadUInt();
- ASSERT(entry_index < i); // We have a DAG!
- temp_object_ = constants.At(entry_index);
+ const intptr_t entry_offset = builder_.ReadUInt();
+ ASSERT(entry_offset < offset); // We have a DAG!
+ temp_object_ = constants.GetOrDie(entry_offset);
temp_instance_.SetField(temp_field_, temp_object_);
}
@@ -11164,8 +11399,8 @@
break;
}
case kPartialInstantiationConstant: {
- const intptr_t entry_index = builder_.ReadUInt();
- temp_object_ = constants.At(entry_index);
+ const intptr_t entry_offset = builder_.ReadUInt();
+ temp_object_ = constants.GetOrDie(entry_offset);
// Happens if the tearoff was in the vmservice library and we have
// [skip_vm_service_library] enabled.
@@ -11219,9 +11454,9 @@
default:
UNREACHABLE();
}
- constants.SetAt(i, temp_instance_);
+ constants.InsertNewOrGetValue(offset - start_offset, temp_instance_);
}
- return constants;
+ return Array::Handle(Z, constants.Release().raw());
}
void ConstantHelper::InstantiateTypeArguments(const Class& receiver_class,
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index a8b39a4..169f403 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -670,7 +670,16 @@
: MetadataHelper(builder) {}
#if defined(DART_USE_INTERPRETER)
- void CopyBytecode(const Function& function);
+ void ReadMetadata(const Function& function);
+
+ private:
+ // Returns the index of the last read pool entry.
+ intptr_t ReadPoolEntries(const Function& function,
+ const Function& inner_function,
+ const ObjectPool& pool,
+ intptr_t from_index);
+ RawCode* ReadBytecode(const ObjectPool& pool);
+ void ReadExceptionsTable(const Code& bytecode);
#endif
};
@@ -1446,6 +1455,7 @@
// Drop given number of temps from the stack but preserve top of the stack.
Fragment DropTempsPreserveTop(intptr_t num_temps_to_drop);
+ Fragment MakeTemp();
Fragment NullConstant();
JoinEntryInstr* BuildJoinEntry();
JoinEntryInstr* BuildJoinEntry(intptr_t try_index);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 6b5a9af..c8a1f61 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -2040,6 +2040,12 @@
return Fragment(drop_temps);
}
+Fragment BaseFlowGraphBuilder::MakeTemp() {
+ MakeTempInstr* make_temp = new (Z) MakeTempInstr(Z);
+ Push(make_temp);
+ return Fragment(make_temp);
+}
+
void FlowGraphBuilder::InlineBailout(const char* reason) {
bool is_inlining = exit_collector_ != NULL;
if (is_inlining) {
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index a22d222..97e4aaa 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -580,6 +580,7 @@
Fragment Drop();
// Drop given number of temps from the stack but preserve top of the stack.
Fragment DropTempsPreserveTop(intptr_t num_temps_to_drop);
+ Fragment MakeTemp();
// Create a pseudo-local variable for a location on the expression stack.
// Note: SSA construction currently does not support inserting Phi functions
diff --git a/runtime/vm/compiler_stats.h b/runtime/vm/compiler_stats.h
index 4a7d49f..1649f3a 100644
--- a/runtime/vm/compiler_stats.h
+++ b/runtime/vm/compiler_stats.h
@@ -78,7 +78,7 @@
Timer graphcompiler_timer; // Included in codegen_timer.
Timer codefinalizer_timer; // Included in codegen_timer.
- ALIGN8 int64_t num_tokens_total; // Isolate + VM isolate
+ ALIGN8 int64_t num_tokens_total; // Isolate + VM isolate.
ALIGN8 int64_t num_tokens_scanned;
ALIGN8 int64_t num_tokens_consumed;
ALIGN8 int64_t num_cached_consts;
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 2541e0a..375fc6d 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -52,7 +52,7 @@
#define CHECK_API_SCOPE(thread) \
do { \
Thread* tmpT = (thread); \
- Isolate* tmpI = tmpT->isolate(); \
+ Isolate* tmpI = tmpT == NULL ? NULL : tmpT->isolate(); \
CHECK_ISOLATE(tmpI); \
if (tmpT->api_top_scope() == NULL) { \
FATAL1( \
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 559b954..00cc771 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -752,15 +752,26 @@
}
RawObject* ActivationFrame::GetAsyncCompleterAwaiter(const Object& completer) {
- const Class& sync_completer_cls = Class::Handle(completer.clazz());
- ASSERT(!sync_completer_cls.IsNull());
- const Class& completer_cls = Class::Handle(sync_completer_cls.SuperClass());
- const Field& future_field =
- Field::Handle(completer_cls.LookupInstanceFieldAllowPrivate(
- Symbols::CompleterFuture()));
- ASSERT(!future_field.IsNull());
Instance& future = Instance::Handle();
- future ^= Instance::Cast(completer).GetField(future_field);
+ if (FLAG_sync_async) {
+ const Class& completer_cls = Class::Handle(completer.clazz());
+ ASSERT(!completer_cls.IsNull());
+ const Function& future_getter = Function::Handle(
+ completer_cls.LookupGetterFunction(Symbols::CompleterFuture()));
+ ASSERT(!future_getter.IsNull());
+ const Array& args = Array::Handle(Array::New(1));
+ args.SetAt(0, Instance::Cast(completer));
+ future ^= DartEntry::InvokeFunction(future_getter, args);
+ } else {
+ const Class& sync_completer_cls = Class::Handle(completer.clazz());
+ ASSERT(!sync_completer_cls.IsNull());
+ const Class& completer_cls = Class::Handle(sync_completer_cls.SuperClass());
+ const Field& future_field =
+ Field::Handle(completer_cls.LookupInstanceFieldAllowPrivate(
+ Symbols::CompleterFuture()));
+ ASSERT(!future_field.IsNull());
+ future ^= Instance::Cast(completer).GetField(future_field);
+ }
if (future.IsNull()) {
// The completer object may not be fully initialized yet.
return Object::null();
@@ -855,11 +866,18 @@
void ActivationFrame::ExtractTokenPositionFromAsyncClosure() {
// Attempt to determine the token position from the async closure.
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ const Script& script = Script::Handle(zone, function().script());
+
ASSERT(function_.IsAsyncGenClosure() || function_.IsAsyncClosure());
// This should only be called on frames that aren't active on the stack.
ASSERT(fp() == 0);
+
const Array& await_to_token_map =
- Array::Handle(code_.await_token_positions());
+ Array::Handle(zone, script.kind() == RawScript::kKernelTag
+ ? script.yield_positions()
+ : code_.await_token_positions());
if (await_to_token_map.IsNull()) {
// No mapping.
return;
@@ -883,9 +901,15 @@
if (await_jump_var < 0) {
return;
}
- ASSERT(await_jump_var < await_to_token_map.Length());
+ intptr_t await_to_token_map_index =
+ script.kind() == RawScript::kKernelTag
+ ? await_jump_var - 1
+ :
+ // source script tokens array has first element duplicated
+ await_jump_var;
+ ASSERT(await_to_token_map_index < await_to_token_map.Length());
const Object& token_pos =
- Object::Handle(await_to_token_map.At(await_jump_var));
+ Object::Handle(await_to_token_map.At(await_to_token_map_index));
if (token_pos.IsNull()) {
return;
}
@@ -2017,13 +2041,37 @@
Array& deopt_frame = Array::Handle(zone);
class StackTrace& async_stack_trace = StackTrace::Handle(zone);
bool stack_has_async_function = false;
+
+ // Number of frames we are trying to skip that form "sync async" entry.
+ int skipSyncAsyncFramesCount = -1;
+ String& function_name = String::Handle(zone);
for (StackFrame* frame = iterator.NextFrame(); frame != NULL;
frame = iterator.NextFrame()) {
ASSERT(frame->IsValid());
if (FLAG_trace_debugger_stacktrace) {
- OS::PrintErr("CollectStackTrace: visiting frame:\n\t%s\n",
+ OS::PrintErr("CollectAwaiterReturnStackTrace: visiting frame:\n\t%s\n",
frame->ToCString());
}
+ if (skipSyncAsyncFramesCount >= 0) {
+ if (!frame->IsDartFrame()) {
+ break;
+ }
+ // Assume that the code we are looking for is not inlined.
+ code = frame->LookupDartCode();
+ function = code.function();
+ function_name ^= function.QualifiedScrubbedName();
+ if (skipSyncAsyncFramesCount == 2) {
+ if (!function_name.Equals(Symbols::_ClosureCall())) {
+ break;
+ }
+ } else if (skipSyncAsyncFramesCount == 1) {
+ if (!function_name.Equals(Symbols::_AsyncAwaitCompleterStart())) {
+ break;
+ }
+ }
+
+ skipSyncAsyncFramesCount--;
+ }
if (frame->IsDartFrame()) {
code = frame->LookupDartCode();
if (code.is_optimized()) {
@@ -2035,8 +2083,10 @@
function = it.function();
if (FLAG_trace_debugger_stacktrace) {
ASSERT(!function.IsNull());
- OS::PrintErr("CollectStackTrace: visiting inlined function: %s\n",
- function.ToFullyQualifiedCString());
+ OS::PrintErr(
+ "CollectAwaiterReturnStackTrace: visiting inlined function: "
+ "%s\n",
+ function.ToFullyQualifiedCString());
}
intptr_t deopt_frame_offset = it.GetDeoptFpOffset();
if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
@@ -2072,7 +2122,16 @@
// Grab the awaiter.
async_activation ^= activation->GetAsyncAwaiter();
async_stack_trace ^= activation->GetCausalStack();
- break;
+ if (FLAG_sync_async) {
+ // async function might have been called synchronously, in which
+ // case we need to keep going down the stack.
+ // To determine how we are called we peek few more frames further
+ // expecting to see Closure_call followed by
+ // AsyncAwaitCompleter_start.
+ skipSyncAsyncFramesCount = 2;
+ } else {
+ break;
+ }
} else {
stack_trace->AddActivation(CollectDartFrame(
isolate, frame->pc(), frame, code, Object::null_array(), 0));
diff --git a/runtime/vm/hash_table.h b/runtime/vm/hash_table.h
index 7045230..24ae04c 100644
--- a/runtime/vm/hash_table.h
+++ b/runtime/vm/hash_table.h
@@ -544,6 +544,12 @@
}
return (entry == -1) ? Object::null() : BaseIterTable::GetPayload(entry, 0);
}
+ template <typename Key>
+ RawObject* GetOrDie(const Key& key) const {
+ intptr_t entry = BaseIterTable::FindKey(key);
+ if (entry == -1) UNREACHABLE();
+ return BaseIterTable::GetPayload(entry, 0);
+ }
bool UpdateOrInsert(const Object& key, const Object& value) const {
EnsureCapacity();
intptr_t entry = -1;
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index 48f8763..71fbf0e 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -519,16 +519,16 @@
" return max(3, 4);\n"
"}\n";
- Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
- EXPECT_VALID(lib);
- EXPECT_ERROR(SimpleInvokeError(lib, "main"), "max");
-
const char* kReloadScript =
"import 'dart:math';\n"
"main() {\n"
" return max(3, 4);\n"
"}\n";
+ Dart_Handle lib = TestCase::LoadTestScriptWithErrors(kScript);
+ EXPECT_VALID(lib);
+ EXPECT_ERROR(SimpleInvokeError(lib, "main"), "max");
+
lib = TestCase::ReloadTestScript(kReloadScript);
EXPECT_VALID(lib);
EXPECT_EQ(4, SimpleInvoke(lib, "main"));
@@ -551,8 +551,6 @@
"}\n";
lib = TestCase::ReloadTestScript(kReloadScript);
- EXPECT_VALID(lib);
-
EXPECT_ERROR(SimpleInvokeError(lib, "main"), "max");
}
@@ -1036,7 +1034,7 @@
// Dart_Handle result;
- Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+ Dart_Handle lib = TestCase::LoadTestScriptWithErrors(kScript);
EXPECT_VALID(lib);
EXPECT_ERROR(SimpleInvokeError(lib, "main"), "importedFunc");
@@ -1069,7 +1067,7 @@
" return importedIntFunc();\n"
"}\n";
- Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+ Dart_Handle lib = TestCase::LoadTestScriptWithErrors(kScript);
EXPECT_VALID(lib);
// Works.
@@ -1089,12 +1087,15 @@
"}\n";
lib = TestCase::ReloadTestScript(kReloadScript);
- EXPECT_VALID(lib);
-
- // Works.
- EXPECT_STREQ("a", SimpleInvokeStr(lib, "main"));
- // Results in an error.
- EXPECT_ERROR(SimpleInvokeError(lib, "mainInt"), "importedIntFunc");
+ if (TestCase::UsingDartFrontend() && TestCase::UsingStrongMode()) {
+ EXPECT_ERROR(lib, "importedIntFunc");
+ } else {
+ EXPECT_VALID(lib);
+ // Works.
+ EXPECT_STREQ("a", SimpleInvokeStr(lib, "main"));
+ // Results in an error.
+ EXPECT_ERROR(SimpleInvokeError(lib, "mainInt"), "importedIntFunc");
+ }
}
// Verifies that we clear the ICs for the functions live on the stack in a way
@@ -1622,7 +1623,7 @@
if (TestCase::UsingStrongMode()) {
error =
"file:///test-lib:8:12: Error: Too few positional"
- " arguments to function: 1 required, 0 given.\n"
+ " arguments: 1 required, 0 given.\n"
" return f1();";
} else if (TestCase::UsingDartFrontend()) {
error =
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index c22b3f5..cc0b1e6c 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -583,10 +583,25 @@
}
private:
+ void LoadKernelFromResponse(Dart_CObject* response) {
+ ASSERT((response->type == Dart_CObject_kTypedData) ||
+ (response->type == Dart_CObject_kNull));
+
+ if (response->type == Dart_CObject_kNull) {
+ return;
+ }
+
+ ASSERT(response->value.as_typed_data.type == Dart_TypedData_kUint8);
+ result_.kernel_size = response->value.as_typed_data.length;
+ result_.kernel = static_cast<uint8_t*>(malloc(result_.kernel_size));
+ memmove(result_.kernel, response->value.as_typed_data.values,
+ result_.kernel_size);
+ }
+
// Possible responses from the Kernel isolate:
//
// [Ok, Uint8List KernelBinary]
- // [Error, String error]
+ // [Error, String error, Uint8List KernelBinary]
// [Crash, String error]
//
void HandleResponseImpl(Dart_CObject* message) {
@@ -602,22 +617,11 @@
message->value.as_array.values[0]->value.as_int32);
if (result_.status == Dart_KernelCompilationStatus_Ok) {
- ASSERT((response[1]->type == Dart_CObject_kTypedData) ||
- (response[1]->type == Dart_CObject_kNull));
-
- if (response[1]->type == Dart_CObject_kNull) {
- ml.Notify();
- return;
- }
-
- ASSERT(response[1]->value.as_typed_data.type == Dart_TypedData_kUint8);
- result_.kernel_size = response[1]->value.as_typed_data.length;
- result_.kernel = static_cast<uint8_t*>(malloc(result_.kernel_size));
- memmove(result_.kernel, response[1]->value.as_typed_data.values,
- result_.kernel_size);
+ LoadKernelFromResponse(response[1]);
} else {
- ASSERT(result_.status == Dart_KernelCompilationStatus_Crash ||
- result_.status == Dart_KernelCompilationStatus_Error);
+ if (result_.status == Dart_KernelCompilationStatus_Error) {
+ LoadKernelFromResponse(response[2]);
+ }
// This is an error.
ASSERT(response[1]->type == Dart_CObject_kString);
result_.error = strdup(response[1]->value.as_string);
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index abbc676..607c1e9 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -376,7 +376,8 @@
return helper.ReadConstantTable();
}
-void KernelLoader::AnnotateNativeProcedures(const Array& constant_table) {
+void KernelLoader::AnnotateNativeProcedures(const Array& constant_table_array) {
+ KernelConstantsMap constant_table(constant_table_array.raw());
potential_natives_ = kernel_program_info_.potential_natives();
const intptr_t length =
!potential_natives_.IsNull() ? potential_natives_.Length() : 0;
@@ -407,8 +408,8 @@
// We have a candiate. Let's look if it's an instance of the
// ExternalName class.
- const intptr_t constant_table_index = builder_.ReadUInt();
- constant ^= constant_table.At(constant_table_index);
+ const intptr_t constant_table_offset = builder_.ReadUInt();
+ constant ^= constant_table.GetOrDie(constant_table_offset);
if (constant.clazz() == external_name_class_.raw()) {
// We found the annotation, let's flag the function as native and
// set the native name!
@@ -428,6 +429,7 @@
potential_natives_ = GrowableObjectArray::null();
kernel_program_info_.set_potential_natives(potential_natives_);
}
+ ASSERT(constant_table.Release().raw() == constant_table_array.raw());
}
RawString* KernelLoader::DetectExternalName() {
@@ -469,12 +471,15 @@
return result.raw();
}
-void KernelLoader::LoadNativeExtensionLibraries(const Array& constant_table) {
+void KernelLoader::LoadNativeExtensionLibraries(
+ const Array& constant_table_array) {
const intptr_t length = !potential_extension_libraries_.IsNull()
? potential_extension_libraries_.Length()
: 0;
if (length == 0) return;
+ KernelConstantsMap constant_table(constant_table_array.raw());
+
// Obtain `dart:_internal::ExternalName.name`.
EnsureExternalClassIsLookedUp();
@@ -499,7 +504,7 @@
builder_.ReadByte(); // Skip the tag.
const intptr_t constant_table_index = builder_.ReadUInt();
- constant ^= constant_table.At(constant_table_index);
+ constant ^= constant_table.GetOrDie(constant_table_index);
if (constant.clazz() == external_name_class_.raw()) {
uri_path ^= constant.GetField(external_name_field_);
}
@@ -534,6 +539,7 @@
}
}
potential_extension_libraries_ = GrowableObjectArray::null();
+ ASSERT(constant_table.Release().raw() == constant_table_array.raw());
}
RawObject* KernelLoader::LoadProgram(bool process_pending_classes) {
@@ -1334,14 +1340,16 @@
// Obtain `dart:_internal::ExternalName.name`.
EnsureExternalClassIsLookedUp();
- const Array& constant_table =
+ const Array& constant_table_array =
Array::Handle(kernel_program_info_.constants());
+ KernelConstantsMap constant_table(constant_table_array.raw());
// We have a candiate. Let's look if it's an instance of the
// ExternalName class.
const intptr_t constant_table_index = builder_.ReadUInt();
const Object& constant =
- Object::Handle(constant_table.At(constant_table_index));
+ Object::Handle(constant_table.GetOrDie(constant_table_index));
+ ASSERT(constant_table.Release().raw() == constant_table_array.raw());
if (constant.clazz() == external_name_class_.raw()) {
const Instance& instance =
Instance::Handle(Instance::RawCast(constant.raw()));
@@ -1390,8 +1398,16 @@
ASSERT(function_node_tag == kSomething);
FunctionNodeHelper function_node_helper(&builder_);
function_node_helper.ReadUntilIncluding(FunctionNodeHelper::kDartAsyncMarker);
+ // _AsyncAwaitCompleter.future should be made non-debuggable, otherwise
+ // stepping out of async methods will keep hitting breakpoint resulting in
+ // infinite loop.
+ bool isAsyncAwaitCompleterFuture =
+ Symbols::_AsyncAwaitCompleter().Equals(
+ String::Handle(owner.ScrubbedName())) &&
+ Symbols::CompleterGetFuture().Equals(String::Handle(function.name()));
function.set_is_debuggable(function_node_helper.dart_async_marker_ ==
- FunctionNodeHelper::kSync);
+ FunctionNodeHelper::kSync &&
+ !isAsyncAwaitCompleterFuture);
switch (function_node_helper.dart_async_marker_) {
case FunctionNodeHelper::kSyncStar:
function.set_modifier(RawFunction::kSyncGen);
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 5056ab6..cf08ad6 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -3220,6 +3220,21 @@
return true;
}
+static const MethodParameter* kill_params[] = {
+ RUNNABLE_ISOLATE_PARAMETER,
+ NULL,
+};
+
+static bool Kill(Thread* thread, JSONStream* js) {
+ const String& msg =
+ String::Handle(String::New("isolate terminated by Kill service request"));
+ const UnwindError& error = UnwindError::Handle(UnwindError::New(msg));
+ error.set_is_user_initiated(true);
+ Thread::Current()->set_sticky_error(error);
+ PrintSuccess(js);
+ return true;
+}
+
static const MethodParameter* pause_params[] = {
RUNNABLE_ISOLATE_PARAMETER, NULL,
};
@@ -4347,6 +4362,7 @@
get_vm_timeline_params },
{ "_getVMTimelineFlags", GetVMTimelineFlags,
get_vm_timeline_flags_params },
+ { "kill", Kill, kill_params },
{ "pause", Pause,
pause_params },
{ "removeBreakpoint", RemoveBreakpoint,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index cb81061..e084402 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
namespace dart {
#define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 7
+#define SERVICE_PROTOCOL_MINOR_VERSION 8
class Array;
class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index bfbbe3f..cf548a5 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.7
+# Dart VM Service Protocol 3.8
> Please post feedback to the [observatory-discuss group][discuss-list]
-This document describes of _version 3.7_ of the Dart VM Service Protocol. This
+This document describes of _version 3.8_ of the Dart VM Service Protocol. This
protocol is used to communicate with a running Dart Virtual Machine.
To use the Service Protocol, start the VM with the *--observe* flag.
@@ -24,74 +24,75 @@
- [Versioning](#versioning)
- [Private RPCs, Types, and Properties](#private-rpcs-types-and-properties)
- [Public RPCs](#public-rpcs)
- - [addBreakpoint](#addbreakpoint)
- - [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
- - [addBreakpointAtEntry](#addbreakpointatentry)
- - [evaluate](#evaluate)
- - [evaluateInFrame](#evaluateinframe)
- - [getFlagList](#getflaglist)
- - [getIsolate](#getisolate)
- - [getObject](#getobject)
- - [getSourceReport](#getsourcereport)
- - [getStack](#getstack)
- - [getVersion](#getversion)
- - [getVM](#getvm)
- - [pause](#pause)
- - [reloadSources](#reloadsources)
- - [removeBreakpoint](#removebreakpoint)
- - [resume](#resume)
- - [setExceptionPauseMode](#setexceptionpausemode)
- - [setFlag](#setflag)
- - [setLibraryDebuggable](#setlibrarydebuggable)
- - [setName](#setname)
- - [setVMName](#setvmname)
- - [streamCancel](#streamcancel)
- - [streamListen](#streamlisten)
+ - [addBreakpoint](#addbreakpoint)
+ - [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
+ - [addBreakpointAtEntry](#addbreakpointatentry)
+ - [evaluate](#evaluate)
+ - [evaluateInFrame](#evaluateinframe)
+ - [getFlagList](#getflaglist)
+ - [getIsolate](#getisolate)
+ - [getObject](#getobject)
+ - [getSourceReport](#getsourcereport)
+ - [getStack](#getstack)
+ - [getVersion](#getversion)
+ - [getVM](#getvm)
+ - [pause](#pause)
+ - [kill](#kill)
+ - [reloadSources](#reloadsources)
+ - [removeBreakpoint](#removebreakpoint)
+ - [resume](#resume)
+ - [setExceptionPauseMode](#setexceptionpausemode)
+ - [setFlag](#setflag)
+ - [setLibraryDebuggable](#setlibrarydebuggable)
+ - [setName](#setname)
+ - [setVMName](#setvmname)
+ - [streamCancel](#streamcancel)
+ - [streamListen](#streamlisten)
- [Public Types](#public-types)
- - [BoundField](#boundfield)
- - [BoundVariable](#boundvariable)
- - [Breakpoint](#breakpoint)
- - [Class](#class)
- - [ClassList](#classlist)
- - [Code](#code)
- - [CodeKind](#codekind)
- - [Context](#context)
- - [ContextElement](#contextelement)
- - [Error](#error)
- - [ErrorKind](#errorkind)
- - [Event](#event)
- - [EventKind](#eventkind)
- - [ExtensionData](#extensiondata)
- - [Field](#field)
- - [Flag](#flag)
- - [FlagList](#flaglist)
- - [Frame](#frame)
- - [Function](#function)
- - [Instance](#instance)
- - [Isolate](#isolate)
- - [Library](#library)
- - [LibraryDependency](#librarydependency)
- - [MapAssociation](#mapassociation)
- - [Message](#message)
- - [Null](#null)
- - [Object](#object)
- - [ReloadReport](#reloadreport)
- - [Response](#response)
- - [Sentinel](#sentinel)
- - [SentinelKind](#sentinelkind)
- - [Script](#script)
- - [SourceLocation](#sourcelocation)
- - [SourceReport](#sourcereport)
- - [SourceReportCoverage](#sourcereportcoverage)
- - [SourceReportKind](#sourcereportkind)
- - [SourceReportRange](#sourcereportrange)
- - [Stack](#stack)
- - [StepOption](#stepoption)
- - [Success](#success)
- - [TypeArguments](#typearguments)
- - [UresolvedSourceLocation](#unresolvedsourcelocation)
- - [Version](#version)
- - [VM](#vm)
+ - [BoundField](#boundfield)
+ - [BoundVariable](#boundvariable)
+ - [Breakpoint](#breakpoint)
+ - [Class](#class)
+ - [ClassList](#classlist)
+ - [Code](#code)
+ - [CodeKind](#codekind)
+ - [Context](#context)
+ - [ContextElement](#contextelement)
+ - [Error](#error)
+ - [ErrorKind](#errorkind)
+ - [Event](#event)
+ - [EventKind](#eventkind)
+ - [ExtensionData](#extensiondata)
+ - [Field](#field)
+ - [Flag](#flag)
+ - [FlagList](#flaglist)
+ - [Frame](#frame)
+ - [Function](#function)
+ - [Instance](#instance)
+ - [Isolate](#isolate)
+ - [Library](#library)
+ - [LibraryDependency](#librarydependency)
+ - [MapAssociation](#mapassociation)
+ - [Message](#message)
+ - [Null](#null)
+ - [Object](#object)
+ - [ReloadReport](#reloadreport)
+ - [Response](#response)
+ - [Sentinel](#sentinel)
+ - [SentinelKind](#sentinelkind)
+ - [Script](#script)
+ - [SourceLocation](#sourcelocation)
+ - [SourceReport](#sourcereport)
+ - [SourceReportCoverage](#sourcereportcoverage)
+ - [SourceReportKind](#sourcereportkind)
+ - [SourceReportRange](#sourcereportrange)
+ - [Stack](#stack)
+ - [StepOption](#stepoption)
+ - [Success](#success)
+ - [TypeArguments](#typearguments)
+ - [UresolvedSourceLocation](#unresolvedsourcelocation)
+ - [Version](#version)
+ - [VM](#vm)
- [Revision History](#revision-history)
## RPCs, Requests, and Responses
@@ -670,6 +671,18 @@
See [Success](#success).
+### kill
+
+```
+Success kill(string isolateId)
+```
+
+The _kill_ RPC is used to kill an isolate as if by dart:isolate's `Isolate.kill(IMMEDIATE)`.
+
+The isolate is killed regardless of whether it is paused or running.
+
+See [Success](#success).
+
### reloadSources
diff --git a/runtime/vm/service/service_dev.md b/runtime/vm/service/service_dev.md
index a15efee..9426433 100644
--- a/runtime/vm/service/service_dev.md
+++ b/runtime/vm/service/service_dev.md
@@ -1,11 +1,8 @@
-Note: this dev version of the protocol contains not yet released functionality,
-and is subject to change.
-
-# Dart VM Service Protocol 3.8-dev
+# Dart VM Service Protocol 3.9-dev
> Please post feedback to the [observatory-discuss group][discuss-list]
-This document describes of _version 3.8-dev_ of the Dart VM Service Protocol. This
+This document describes of _version 3.9-dev_ of the Dart VM Service Protocol. This
protocol is used to communicate with a running Dart Virtual Machine.
To use the Service Protocol, start the VM with the *--observe* flag.
@@ -27,74 +24,75 @@
- [Versioning](#versioning)
- [Private RPCs, Types, and Properties](#private-rpcs-types-and-properties)
- [Public RPCs](#public-rpcs)
- - [addBreakpoint](#addbreakpoint)
- - [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
- - [addBreakpointAtEntry](#addbreakpointatentry)
- - [evaluate](#evaluate)
- - [evaluateInFrame](#evaluateinframe)
- - [getFlagList](#getflaglist)
- - [getIsolate](#getisolate)
- - [getObject](#getobject)
- - [getSourceReport](#getsourcereport)
- - [getStack](#getstack)
- - [getVersion](#getversion)
- - [getVM](#getvm)
- - [pause](#pause)
- - [reloadSources](#reloadsources)
- - [removeBreakpoint](#removebreakpoint)
- - [resume](#resume)
- - [setExceptionPauseMode](#setexceptionpausemode)
- - [setFlag](#setflag)
- - [setLibraryDebuggable](#setlibrarydebuggable)
- - [setName](#setname)
- - [setVMName](#setvmname)
- - [streamCancel](#streamcancel)
- - [streamListen](#streamlisten)
+ - [addBreakpoint](#addbreakpoint)
+ - [addBreakpointWithScriptUri](#addbreakpointwithscripturi)
+ - [addBreakpointAtEntry](#addbreakpointatentry)
+ - [evaluate](#evaluate)
+ - [evaluateInFrame](#evaluateinframe)
+ - [getFlagList](#getflaglist)
+ - [getIsolate](#getisolate)
+ - [getObject](#getobject)
+ - [getSourceReport](#getsourcereport)
+ - [getStack](#getstack)
+ - [getVersion](#getversion)
+ - [getVM](#getvm)
+ - [pause](#pause)
+ - [kill](#kill)
+ - [reloadSources](#reloadsources)
+ - [removeBreakpoint](#removebreakpoint)
+ - [resume](#resume)
+ - [setExceptionPauseMode](#setexceptionpausemode)
+ - [setFlag](#setflag)
+ - [setLibraryDebuggable](#setlibrarydebuggable)
+ - [setName](#setname)
+ - [setVMName](#setvmname)
+ - [streamCancel](#streamcancel)
+ - [streamListen](#streamlisten)
- [Public Types](#public-types)
- - [BoundField](#boundfield)
- - [BoundVariable](#boundvariable)
- - [Breakpoint](#breakpoint)
- - [Class](#class)
- - [ClassList](#classlist)
- - [Code](#code)
- - [CodeKind](#codekind)
- - [Context](#context)
- - [ContextElement](#contextelement)
- - [Error](#error)
- - [ErrorKind](#errorkind)
- - [Event](#event)
- - [EventKind](#eventkind)
- - [ExtensionData](#extensiondata)
- - [Field](#field)
- - [Flag](#flag)
- - [FlagList](#flaglist)
- - [Frame](#frame)
- - [Function](#function)
- - [Instance](#instance)
- - [Isolate](#isolate)
- - [Library](#library)
- - [LibraryDependency](#librarydependency)
- - [MapAssociation](#mapassociation)
- - [Message](#message)
- - [Null](#null)
- - [Object](#object)
- - [ReloadReport](#reloadreport)
- - [Response](#response)
- - [Sentinel](#sentinel)
- - [SentinelKind](#sentinelkind)
- - [Script](#script)
- - [SourceLocation](#sourcelocation)
- - [SourceReport](#sourcereport)
- - [SourceReportCoverage](#sourcereportcoverage)
- - [SourceReportKind](#sourcereportkind)
- - [SourceReportRange](#sourcereportrange)
- - [Stack](#stack)
- - [StepOption](#stepoption)
- - [Success](#success)
- - [TypeArguments](#typearguments)
- - [UresolvedSourceLocation](#unresolvedsourcelocation)
- - [Version](#version)
- - [VM](#vm)
+ - [BoundField](#boundfield)
+ - [BoundVariable](#boundvariable)
+ - [Breakpoint](#breakpoint)
+ - [Class](#class)
+ - [ClassList](#classlist)
+ - [Code](#code)
+ - [CodeKind](#codekind)
+ - [Context](#context)
+ - [ContextElement](#contextelement)
+ - [Error](#error)
+ - [ErrorKind](#errorkind)
+ - [Event](#event)
+ - [EventKind](#eventkind)
+ - [ExtensionData](#extensiondata)
+ - [Field](#field)
+ - [Flag](#flag)
+ - [FlagList](#flaglist)
+ - [Frame](#frame)
+ - [Function](#function)
+ - [Instance](#instance)
+ - [Isolate](#isolate)
+ - [Library](#library)
+ - [LibraryDependency](#librarydependency)
+ - [MapAssociation](#mapassociation)
+ - [Message](#message)
+ - [Null](#null)
+ - [Object](#object)
+ - [ReloadReport](#reloadreport)
+ - [Response](#response)
+ - [Sentinel](#sentinel)
+ - [SentinelKind](#sentinelkind)
+ - [Script](#script)
+ - [SourceLocation](#sourcelocation)
+ - [SourceReport](#sourcereport)
+ - [SourceReportCoverage](#sourcereportcoverage)
+ - [SourceReportKind](#sourcereportkind)
+ - [SourceReportRange](#sourcereportrange)
+ - [Stack](#stack)
+ - [StepOption](#stepoption)
+ - [Success](#success)
+ - [TypeArguments](#typearguments)
+ - [UresolvedSourceLocation](#unresolvedsourcelocation)
+ - [Version](#version)
+ - [VM](#vm)
- [Revision History](#revision-history)
## RPCs, Requests, and Responses
@@ -673,6 +671,18 @@
See [Success](#success).
+### kill
+
+```
+Success kill(string isolateId)
+```
+
+The _kill_ RPC is used to kill an isolate as if by dart:isolate's `Isolate.kill(IMMEDIATE)`.
+
+The isolate is killed regardless of whether it is paused or running.
+
+See [Success](#success).
+
### reloadSources
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 576e903..fdd9ee4 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -150,8 +150,10 @@
V(CompleterSyncConstructor, "Completer.sync") \
V(_AsyncAwaitCompleter, "_AsyncAwaitCompleter") \
V(_AsyncAwaitCompleterConstructor, "_AsyncAwaitCompleter.") \
+ V(_AsyncAwaitCompleterStart, "_AsyncAwaitCompleter.start") \
V(_AsyncAwaitStart, "start") \
V(CompleterFuture, "future") \
+ V(CompleterGetFuture, "get:future") \
V(StreamIterator, "StreamIterator") \
V(StreamIteratorConstructor, "StreamIterator.") \
V(Native, "native") \
@@ -171,6 +173,7 @@
V(PatchClass, "PatchClass") \
V(Function, "Function") \
V(_Closure, "_Closure") \
+ V(_ClosureCall, "_Closure.call") \
V(FunctionResult, "function result") \
V(FactoryResult, "factory result") \
V(ClosureData, "ClosureData") \
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 08becf9..bbf3561 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -232,7 +232,8 @@
const char* source,
const uint8_t** kernel_buffer,
intptr_t* kernel_buffer_size,
- bool incrementally) {
+ bool incrementally,
+ bool allow_compile_errors) {
// clang-format off
Dart_SourceFile sourcefiles[] = {
{
@@ -244,7 +245,7 @@
// clang-format on
return CompileTestScriptWithDFE(
url, sizeof(sourcefiles) / sizeof(Dart_SourceFile), sourcefiles,
- kernel_buffer, kernel_buffer_size, incrementally);
+ kernel_buffer, kernel_buffer_size, incrementally, allow_compile_errors);
}
#if 0
@@ -253,7 +254,8 @@
int sourcefiles_count,
Dart_SourceFile sourcefiles[],
void** kernel_pgm,
- bool incrementally) {
+ bool incrementally,
+ bool allow_compile_errors) {
Zone* zone = Thread::Current()->zone();
Dart_KernelCompilationResult compilation_result = Dart_CompileSourcesToKernel(
url, FLAG_strong ? platform_strong_dill : platform_dill,
@@ -265,13 +267,16 @@
char* TestCase::ValidateCompilationResult(
Zone* zone,
Dart_KernelCompilationResult compilation_result,
- void** kernel_pgm) {
- if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+ void** kernel_pgm,
+ bool allow_compile_errors) {
+ if (!allow_compile_errors &&
+ (compilation_result.status != Dart_KernelCompilationStatus_Ok)) {
char* result =
OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
free(compilation_result.error);
return result;
}
+
const uint8_t* kernel_file = compilation_result.kernel;
intptr_t kernel_length = compilation_result.kernel_size;
if (kernel_file == NULL) {
@@ -282,6 +287,12 @@
if (*kernel_pgm == NULL) {
return OS::SCreate(zone, "Failed to read generated kernel binary");
}
+ if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+ char* result =
+ OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
+ free(compilation_result.error);
+ return result;
+ }
return NULL;
}
#endif
@@ -291,22 +302,25 @@
Dart_SourceFile sourcefiles[],
const uint8_t** kernel_buffer,
intptr_t* kernel_buffer_size,
- bool incrementally) {
+ bool incrementally,
+ bool allow_compile_errors) {
Zone* zone = Thread::Current()->zone();
Dart_KernelCompilationResult compilation_result = Dart_CompileSourcesToKernel(
url, FLAG_strong ? platform_strong_dill : platform_dill,
FLAG_strong ? platform_strong_dill_size : platform_dill_size,
sourcefiles_count, sourcefiles, incrementally, NULL);
return ValidateCompilationResult(zone, compilation_result, kernel_buffer,
- kernel_buffer_size);
+ kernel_buffer_size, allow_compile_errors);
}
char* TestCase::ValidateCompilationResult(
Zone* zone,
Dart_KernelCompilationResult compilation_result,
const uint8_t** kernel_buffer,
- intptr_t* kernel_buffer_size) {
- if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
+ intptr_t* kernel_buffer_size,
+ bool allow_compile_errors) {
+ if (!allow_compile_errors &&
+ (compilation_result.status != Dart_KernelCompilationStatus_Ok)) {
char* result =
OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
free(compilation_result.error);
@@ -459,10 +473,19 @@
return num_test_libs + 1;
}
+Dart_Handle TestCase::LoadTestScriptWithErrors(
+ const char* script,
+ Dart_NativeEntryResolver resolver,
+ const char* lib_url,
+ bool finalize_classes) {
+ return LoadTestScript(script, resolver, lib_url, finalize_classes, true);
+}
+
Dart_Handle TestCase::LoadTestScript(const char* script,
Dart_NativeEntryResolver resolver,
const char* lib_url,
- bool finalize_classes) {
+ bool finalize_classes,
+ bool allow_compile_errors) {
if (FLAG_use_dart_frontend) {
#ifndef PRODUCT
if (strstr(script, IsolateReloadTestLibUri()) != NULL) {
@@ -472,8 +495,9 @@
#endif // ifndef PRODUCT
Dart_SourceFile* sourcefiles = NULL;
intptr_t num_sources = BuildSourceFilesArray(&sourcefiles, script);
- Dart_Handle result = LoadTestScriptWithDFE(num_sources, sourcefiles,
- resolver, finalize_classes);
+ Dart_Handle result =
+ LoadTestScriptWithDFE(num_sources, sourcefiles, resolver,
+ finalize_classes, true, allow_compile_errors);
delete[] sourcefiles;
return result;
} else {
@@ -495,7 +519,7 @@
char* error = TestCase::CompileTestScriptWithDFE(
sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_buffer,
&kernel_buffer_size, true);
- if (error != NULL) {
+ if ((kernel_buffer == NULL) && (error != NULL)) {
return Dart_NewApiError(error);
}
Dart_Handle lib =
@@ -521,7 +545,8 @@
Dart_SourceFile sourcefiles[],
Dart_NativeEntryResolver resolver,
bool finalize,
- bool incrementally) {
+ bool incrementally,
+ bool allow_compile_errors) {
// First script is the main script.
Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler);
EXPECT_VALID(result);
@@ -529,8 +554,8 @@
intptr_t kernel_buffer_size = 0;
char* error = TestCase::CompileTestScriptWithDFE(
sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_buffer,
- &kernel_buffer_size, incrementally);
- if (error != NULL) {
+ &kernel_buffer_size, incrementally, allow_compile_errors);
+ if ((kernel_buffer == NULL) && error != NULL) {
return Dart_NewApiError(error);
}
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index edb8b8e..d3f2870 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -318,17 +318,25 @@
const char* source,
const uint8_t** kernel_buffer,
intptr_t* kernel_buffer_size,
- bool incrementally = true);
+ bool incrementally = true,
+ bool allow_compile_errors = false);
static char* CompileTestScriptWithDFE(const char* url,
int sourcefiles_count,
Dart_SourceFile sourcefiles[],
const uint8_t** kernel_buffer,
intptr_t* kernel_buffer_size,
- bool incrementally = true);
+ bool incrementally = true,
+ bool allow_compile_errors = false);
static Dart_Handle LoadTestScript(const char* script,
Dart_NativeEntryResolver resolver,
const char* lib_uri = USER_TEST_URI,
- bool finalize = true);
+ bool finalize = true,
+ bool allow_compile_errors = false);
+ static Dart_Handle LoadTestScriptWithErrors(
+ const char* script,
+ Dart_NativeEntryResolver resolver = NULL,
+ const char* lib_uri = USER_TEST_URI,
+ bool finalize = true);
static Dart_Handle LoadTestLibrary(const char* lib_uri,
const char* script,
Dart_NativeEntryResolver resolver = NULL);
@@ -337,7 +345,8 @@
Dart_SourceFile sourcefiles[],
Dart_NativeEntryResolver resolver = NULL,
bool finalize = true,
- bool incrementally = true);
+ bool incrementally = true,
+ bool allow_compile_errors = false);
static Dart_Handle LoadCoreTestScript(const char* script,
Dart_NativeEntryResolver resolver);
@@ -385,7 +394,8 @@
static char* ValidateCompilationResult(Zone* zone,
Dart_KernelCompilationResult result,
const uint8_t** kernel_buffer,
- intptr_t* kernel_buffer_size);
+ intptr_t* kernel_buffer_size,
+ bool allow_compile_errors);
RunEntry* const run_;
};
diff --git a/sdk/bin/dartanalyzer b/sdk/bin/dartanalyzer
index bad9306..49f4bcc 100755
--- a/sdk/bin/dartanalyzer
+++ b/sdk/bin/dartanalyzer
@@ -31,7 +31,7 @@
case $0 in
*_developer)
- EXTRA_VM_OPTIONS+=('--checked')
+ EXTRA_VM_OPTIONS+=('--enable-asserts')
;;
esac
@@ -47,4 +47,4 @@
DEV_OPTIONS="--use-analysis-driver-memory-byte-store"
-exec "$DART" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$ANALYZER" "$DEV_OPTIONS" "$SDK_ARG" "$@"
+exec "$DART" "--preview-dart-2" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$ANALYZER" "$DEV_OPTIONS" "$SDK_ARG" "$@"
diff --git a/sdk/bin/dartanalyzer.bat b/sdk/bin/dartanalyzer.bat
index 464aaee..b4a1de2 100644
--- a/sdk/bin/dartanalyzer.bat
+++ b/sdk/bin/dartanalyzer.bat
@@ -24,7 +24,7 @@
set EXTRA_VM_OPTIONS=
if _%DARTANALYZER_DEVELOPER_MODE%_ == _1_ (
- set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% --checked
+ set EXTRA_VM_OPTIONS=%EXTRA_VM_OPTIONS% --enable_asserts
)
rem We allow extra vm options to be passed in through an environment variable.
@@ -40,7 +40,7 @@
set ANALYZER=%DART_ROOT%\pkg\analyzer_cli\bin\analyzer.dart
-"%DART%" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%ANALYZER%" "%SDK_ARG%" %*
+"%DART%" "--preview-dart-2" "--packages=%DART_ROOT%\.packages" %EXTRA_VM_OPTIONS% "%ANALYZER%" "%SDK_ARG%" %*
endlocal
diff --git a/sdk/bin/dartanalyzer_sdk b/sdk/bin/dartanalyzer_sdk
index 28f37ab..90d09de 100755
--- a/sdk/bin/dartanalyzer_sdk
+++ b/sdk/bin/dartanalyzer_sdk
@@ -28,4 +28,4 @@
# We are running the snapshot in the built SDK.
DART="$BIN_DIR/dart"
-exec "$DART" "$SNAPSHOT" "$SDK_ARG" "$@"
+exec "$DART" "--preview-dart-2" "$SNAPSHOT" "$SDK_ARG" "$@"
diff --git a/sdk/bin/dartanalyzer_sdk.bat b/sdk/bin/dartanalyzer_sdk.bat
index ab66885..82125f0 100644
--- a/sdk/bin/dartanalyzer_sdk.bat
+++ b/sdk/bin/dartanalyzer_sdk.bat
@@ -22,7 +22,7 @@
set SDK_ARG=--dart-sdk=%SDK_DIR%
-"%DART%" "%SNAPSHOT%" "%SDK_ARG%" %*
+"%DART%" "--preview-dart-2" "%SNAPSHOT%" "%SDK_ARG%" %*
endlocal
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 44df4af..d6be639 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -829,6 +829,20 @@
bool checkSubtypeOfRuntimeType(o, t) {
if (o == null) return isSupertypeOfNull(t);
if (isTopType(t)) return true;
+ if (JS_GET_FLAG('STRONG_MODE') &&
+ JS('bool', 'typeof # == "object"', t) &&
+ isDartFutureOrType(t)) {
+ // `o is FutureOr<T>` is equivalent to
+ //
+ // o is T || o is Future<T>
+ //
+ // T might be a function type, requiring extracting the closure's signature,
+ // so do the `o is T` check here and let the `Future` interface type test
+ // fall through to the `isSubtype` check at the end of this function.
+ var tTypeArgument = getFutureOrArgument(t);
+ if (checkSubtypeOfRuntimeType(o, tTypeArgument)) return true;
+ }
+
// Get the runtime type information from the object here, because we may
// overwrite o with the interceptor below.
var rti = getRuntimeTypeInfo(o);
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 1f622c4..c440394 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -101,6 +101,46 @@
HtmlDocument get document =>
JS('returns:HtmlDocument;depends:none;effects:none;gvn:true', 'document');
+// Supoort to convert JS Promise to a Dart Future.
+Future<T> promiseToFuture<T>(thePromise) {
+ var completer = new Completer<T>();
+
+ var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
+ var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+ JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+ convertDartClosureToJS(thenErrorCode, 1));
+
+ return completer.future;
+}
+
+// Supoort to convert JS Promise to a Dart Future that returns a MapLike (Class with Map mixin).
+Future promiseToFutureMap(thePromise) {
+ var completer = new Completer();
+
+ var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
+ var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+ JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+ convertDartClosureToJS(thenErrorCode, 1));
+
+ return completer.future;
+}
+
+// Supoort to convert JS Promise to a Dart Future that returns a Dictionary as a Dart Map.
+Future<Map> promiseToFutureDictionary(thePromise) {
+ var completer = new Completer<Map>();
+
+ var thenSuccessCode = (promiseValue) =>
+ completer.complete(convertNativeToDart_Dictionary(promiseValue));
+ var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+ JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+ convertDartClosureToJS(thenErrorCode, 1));
+
+ return completer.future;
+}
+
// Workaround for tags like <cite> that lack their own Element subclass --
// Dart issue 1990.
@Native("HTMLElement")
@@ -129,7 +169,6 @@
@Experimental() // untriaged
typedef void FontFaceSetForEachCallback(
FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
-
// Copyright (c) 2012, 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.
@@ -1810,12 +1849,15 @@
@DomName('BackgroundFetchManager.get')
@DocsEditable()
@Experimental() // untriaged
- Future get(String id) native;
+ Future<BackgroundFetchRegistration> get(String id) =>
+ promiseToFuture<BackgroundFetchRegistration>(
+ JS("", "#.get(#)", this, id));
@DomName('BackgroundFetchManager.getIds')
@DocsEditable()
@Experimental() // untriaged
- Future getIds() native;
+ Future<List<String>> getIds() =>
+ promiseToFuture<List<String>>(JS("", "#.getIds()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -1869,7 +1911,7 @@
@DomName('BackgroundFetchRegistration.abort')
@DocsEditable()
@Experimental() // untriaged
- Future abort() native;
+ Future<bool> abort() => promiseToFuture<bool>(JS("", "#.abort()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -1932,7 +1974,8 @@
@DomName('BackgroundFetchedEvent.updateUI')
@DocsEditable()
@Experimental() // untriaged
- Future updateUI(String title) native;
+ Future updateUI(String title) =>
+ promiseToFuture(JS("", "#.updateUI(#)", this, title));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -1978,7 +2021,9 @@
@DomName('BarcodeDetector.detect')
@DocsEditable()
@Experimental() // untriaged
- Future detect(/*ImageBitmapSource*/ image) native;
+ Future<List<DetectedBarcode>> detect(/*ImageBitmapSource*/ image) =>
+ promiseToFuture<List<DetectedBarcode>>(
+ JS("", "#.detect(#)", this, image));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -2090,7 +2135,7 @@
@DomName('BeforeInstallPromptEvent.prompt')
@DocsEditable()
@Experimental() // untriaged
- Future prompt() native;
+ Future prompt() => promiseToFuture(JS("", "#.prompt()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -2231,12 +2276,13 @@
@DomName('BluetoothRemoteGATTDescriptor.readValue')
@DocsEditable()
@Experimental() // untriaged
- Future readValue() native;
+ Future readValue() => promiseToFuture(JS("", "#.readValue()", this));
@DomName('BluetoothRemoteGATTDescriptor.writeValue')
@DocsEditable()
@Experimental() // untriaged
- Future writeValue(/*BufferSource*/ value) native;
+ Future writeValue(/*BufferSource*/ value) =>
+ promiseToFuture(JS("", "#.writeValue(#)", this, value));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -2260,27 +2306,28 @@
@DomName('Body.arrayBuffer')
@DocsEditable()
@Experimental() // untriaged
- Future arrayBuffer() native;
+ Future arrayBuffer() => promiseToFuture(JS("", "#.arrayBuffer()", this));
@DomName('Body.blob')
@DocsEditable()
@Experimental() // untriaged
- Future blob() native;
+ Future<Blob> blob() => promiseToFuture<Blob>(JS("", "#.blob()", this));
@DomName('Body.formData')
@DocsEditable()
@Experimental() // untriaged
- Future formData() native;
+ Future<FormData> formData() =>
+ promiseToFuture<FormData>(JS("", "#.formData()", this));
@DomName('Body.json')
@DocsEditable()
@Experimental() // untriaged
- Future json() native;
+ Future json() => promiseToFuture(JS("", "#.json()", this));
@DomName('Body.text')
@DocsEditable()
@Experimental() // untriaged
- Future text() native;
+ Future<String> text() => promiseToFuture<String>(JS("", "#.text()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -2719,17 +2766,19 @@
@DomName('CacheStorage.delete')
@DocsEditable()
@Experimental() // untriaged
- Future delete(String cacheName) native;
+ Future delete(String cacheName) =>
+ promiseToFuture(JS("", "#.delete(#)", this, cacheName));
@DomName('CacheStorage.has')
@DocsEditable()
@Experimental() // untriaged
- Future has(String cacheName) native;
+ Future has(String cacheName) =>
+ promiseToFuture(JS("", "#.has(#)", this, cacheName));
@DomName('CacheStorage.keys')
@DocsEditable()
@Experimental() // untriaged
- Future keys() native;
+ Future keys() => promiseToFuture(JS("", "#.keys()", this));
@DomName('CacheStorage.match')
@DocsEditable()
@@ -2756,7 +2805,8 @@
@DomName('CacheStorage.open')
@DocsEditable()
@Experimental() // untriaged
- Future open(String cacheName) native;
+ Future open(String cacheName) =>
+ promiseToFuture(JS("", "#.open(#)", this, cacheName));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -4031,12 +4081,12 @@
@DomName('Clients.claim')
@DocsEditable()
@Experimental() // untriaged
- Future claim() native;
+ Future claim() => promiseToFuture(JS("", "#.claim()", this));
@DomName('Clients.get')
@DocsEditable()
@Experimental() // untriaged
- Future get(String id) native;
+ Future get(String id) => promiseToFuture(JS("", "#.get(#)", this, id));
@DomName('Clients.matchAll')
@DocsEditable()
@@ -4063,7 +4113,8 @@
@DomName('Clients.openWindow')
@DocsEditable()
@Experimental() // untriaged
- Future openWindow(String url) native;
+ Future<WindowClient> openWindow(String url) =>
+ promiseToFuture<WindowClient>(JS("", "#.openWindow(#)", this, url));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -4457,17 +4508,20 @@
@DomName('CredentialsContainer.preventSilentAccess')
@DocsEditable()
@Experimental() // untriaged
- Future preventSilentAccess() native;
+ Future preventSilentAccess() =>
+ promiseToFuture(JS("", "#.preventSilentAccess()", this));
@DomName('CredentialsContainer.requireUserMediation')
@DocsEditable()
@Experimental() // untriaged
- Future requireUserMediation() native;
+ Future requireUserMediation() =>
+ promiseToFuture(JS("", "#.requireUserMediation()", this));
@DomName('CredentialsContainer.store')
@DocsEditable()
@Experimental() // untriaged
- Future store(Credential credential) native;
+ Future store(Credential credential) =>
+ promiseToFuture(JS("", "#.store(#)", this, credential));
}
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -10270,7 +10324,8 @@
@DomName('CustomElementRegistry.whenDefined')
@DocsEditable()
@Experimental() // untriaged
- Future whenDefined(String name) native;
+ Future whenDefined(String name) =>
+ promiseToFuture(JS("", "#.whenDefined(#)", this, name));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -19259,7 +19314,8 @@
@DomName('FaceDetector.detect')
@DocsEditable()
@Experimental() // untriaged
- Future detect(/*ImageBitmapSource*/ image) native;
+ Future<List<DetectedFace>> detect(/*ImageBitmapSource*/ image) =>
+ promiseToFuture<List<DetectedFace>>(JS("", "#.detect(#)", this, image));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -20099,7 +20155,8 @@
@DomName('FontFace.load')
@DocsEditable()
@Experimental() // untriaged
- Future load() native;
+ Future<FontFace> load() =>
+ promiseToFuture<FontFace>(JS("", "#.load()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -23312,17 +23369,21 @@
@DomName('ImageCapture.getPhotoCapabilities')
@DocsEditable()
@Experimental() // untriaged
- Future getPhotoCapabilities() native;
+ Future<PhotoCapabilities> getPhotoCapabilities() =>
+ promiseToFuture<PhotoCapabilities>(
+ JS("", "#.getPhotoCapabilities()", this));
@DomName('ImageCapture.getPhotoSettings')
@DocsEditable()
@Experimental() // untriaged
- Future getPhotoSettings() native;
+ Future<Map> getPhotoSettings() =>
+ promiseToFutureDictionary(JS("", "#.getPhotoSettings()", this));
@DomName('ImageCapture.grabFrame')
@DocsEditable()
@Experimental() // untriaged
- Future grabFrame() native;
+ Future<ImageBitmap> grabFrame() =>
+ promiseToFuture<ImageBitmap>(JS("", "#.grabFrame()", this));
@DomName('ImageCapture.setOptions')
@DocsEditable()
@@ -23504,7 +23565,7 @@
@DomName('HTMLImageElement.decode')
@DocsEditable()
@Experimental() // untriaged
- Future decode() native;
+ Future decode() => promiseToFuture(JS("", "#.decode()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -25360,7 +25421,9 @@
@DomName('MediaDevices.enumerateDevices')
@DocsEditable()
@Experimental() // untriaged
- Future enumerateDevices() native;
+ Future<List<MediaDeviceInfo>> enumerateDevices() =>
+ promiseToFuture<List<MediaDeviceInfo>>(
+ JS("", "#.enumerateDevices()", this));
@DomName('MediaDevices.getSupportedConstraints')
@DocsEditable()
@@ -25615,17 +25678,19 @@
@DomName('HTMLMediaElement.play')
@DocsEditable()
- Future play() native;
+ Future play() => promiseToFuture(JS("", "#.play()", this));
@DomName('HTMLMediaElement.setMediaKeys')
@DocsEditable()
@Experimental() // untriaged
- Future setMediaKeys(MediaKeys mediaKeys) native;
+ Future setMediaKeys(MediaKeys mediaKeys) =>
+ promiseToFuture(JS("", "#.setMediaKeys(#)", this, mediaKeys));
@DomName('HTMLMediaElement.setSinkId')
@DocsEditable()
@Experimental() // untriaged
- Future setSinkId(String sinkId) native;
+ Future setSinkId(String sinkId) =>
+ promiseToFuture(JS("", "#.setSinkId(#)", this, sinkId));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -25785,22 +25850,25 @@
@DomName('MediaKeySession.close')
@DocsEditable()
- Future close() native;
+ Future close() => promiseToFuture(JS("", "#.close()", this));
@DomName('MediaKeySession.generateRequest')
@DocsEditable()
@Experimental() // untriaged
- Future generateRequest(String initDataType, /*BufferSource*/ initData) native;
+ Future generateRequest(String initDataType, /*BufferSource*/ initData) =>
+ promiseToFuture(
+ JS("", "#.generateRequest(#, #)", this, initDataType, initData));
@DomName('MediaKeySession.load')
@DocsEditable()
@Experimental() // untriaged
- Future load(String sessionId) native;
+ Future load(String sessionId) =>
+ promiseToFuture(JS("", "#.load(#)", this, sessionId));
@DomName('MediaKeySession.remove')
@DocsEditable()
@Experimental() // untriaged
- Future remove() native;
+ Future remove() => promiseToFuture(JS("", "#.remove()", this));
@JSName('update')
@DomName('MediaKeySession.update')
@@ -25863,7 +25931,8 @@
@DomName('MediaKeySystemAccess.createMediaKeys')
@DocsEditable()
@Experimental() // untriaged
- Future createMediaKeys() native;
+ Future createMediaKeys() =>
+ promiseToFuture(JS("", "#.createMediaKeys()", this));
@DomName('MediaKeySystemAccess.getConfiguration')
@DocsEditable()
@@ -25901,12 +25970,15 @@
@DomName('MediaKeys.getStatusForPolicy')
@DocsEditable()
@Experimental() // untriaged
- Future getStatusForPolicy(MediaKeysPolicy policy) native;
+ Future getStatusForPolicy(MediaKeysPolicy policy) =>
+ promiseToFuture(JS("", "#.getStatusForPolicy(#)", this, policy));
@DomName('MediaKeys.setServerCertificate')
@DocsEditable()
@Experimental() // untriaged
- Future setServerCertificate(/*BufferSource*/ serverCertificate) native;
+ Future setServerCertificate(/*BufferSource*/ serverCertificate) =>
+ promiseToFuture(
+ JS("", "#.setServerCertificate(#)", this, serverCertificate));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -27241,11 +27313,68 @@
@DomName('MIDIInputMap')
@Experimental() // untriaged
@Native("MIDIInputMap")
-class MidiInputMap extends Interceptor {
+class MidiInputMap extends Interceptor with MapMixin<String, dynamic> {
// To suppress missing implicit constructor warnings.
factory MidiInputMap._() {
throw new UnsupportedError("Not supported");
}
+
+ Map _getItem(String key) =>
+ convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+ void addAll(Map<String, dynamic> other) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ bool containsValue(dynamic value) => values.any((e) => e == value);
+
+ bool containsKey(dynamic key) => _getItem(key) != null;
+
+ Map operator [](dynamic key) => _getItem(key);
+
+ void forEach(void f(String key, dynamic value)) {
+ var entries = JS('', '#.entries()', this);
+ while (true) {
+ var entry = JS('', '#.next()', entries);
+ if (JS('bool', '#.done', entry)) return;
+ f(JS('String', '#.value[0]', entry),
+ convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+ }
+ }
+
+ Iterable<String> get keys {
+ final keys = <String>[];
+ forEach((k, v) => keys.add(k));
+ return keys;
+ }
+
+ Iterable<Map> get values {
+ final values = <Map>[];
+ forEach((k, v) => values.add(v));
+ return values;
+ }
+
+ int get length => JS('int', '#.size', this);
+
+ bool get isEmpty => length == 0;
+
+ bool get isNotEmpty => !isEmpty;
+
+ void operator []=(String key, dynamic value) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ dynamic putIfAbsent(String key, dynamic ifAbsent()) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ String remove(dynamic key) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ void clear() {
+ throw new UnsupportedError("Not supported");
+ }
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -27307,11 +27436,68 @@
@DomName('MIDIOutputMap')
@Experimental() // untriaged
@Native("MIDIOutputMap")
-class MidiOutputMap extends Interceptor {
+class MidiOutputMap extends Interceptor with MapMixin<String, dynamic> {
// To suppress missing implicit constructor warnings.
factory MidiOutputMap._() {
throw new UnsupportedError("Not supported");
}
+
+ Map _getItem(String key) =>
+ convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+ void addAll(Map<String, dynamic> other) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ bool containsValue(dynamic value) => values.any((e) => e == value);
+
+ bool containsKey(dynamic key) => _getItem(key) != null;
+
+ Map operator [](dynamic key) => _getItem(key);
+
+ void forEach(void f(String key, dynamic value)) {
+ var entries = JS('', '#.entries()', this);
+ while (true) {
+ var entry = JS('', '#.next()', entries);
+ if (JS('bool', '#.done', entry)) return;
+ f(JS('String', '#.value[0]', entry),
+ convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+ }
+ }
+
+ Iterable<String> get keys {
+ final keys = <String>[];
+ forEach((k, v) => keys.add(k));
+ return keys;
+ }
+
+ Iterable<Map> get values {
+ final values = <Map>[];
+ forEach((k, v) => values.add(v));
+ return values;
+ }
+
+ int get length => JS('int', '#.size', this);
+
+ bool get isEmpty => length == 0;
+
+ bool get isNotEmpty => !isEmpty;
+
+ void operator []=(String key, dynamic value) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ dynamic putIfAbsent(String key, dynamic ifAbsent()) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ String remove(dynamic key) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ void clear() {
+ throw new UnsupportedError("Not supported");
+ }
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -27361,12 +27547,12 @@
@DomName('MIDIPort.close')
@DocsEditable()
@Experimental() // untriaged
- Future close() native;
+ Future close() => promiseToFuture(JS("", "#.close()", this));
@DomName('MIDIPort.open')
@DocsEditable()
@Experimental() // untriaged
- Future open() native;
+ Future open() => promiseToFuture(JS("", "#.open()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -28057,17 +28243,18 @@
@DomName('NavigationPreloadManager.disable')
@DocsEditable()
@Experimental() // untriaged
- Future disable() native;
+ Future disable() => promiseToFuture(JS("", "#.disable()", this));
@DomName('NavigationPreloadManager.enable')
@DocsEditable()
@Experimental() // untriaged
- Future enable() native;
+ Future enable() => promiseToFuture(JS("", "#.enable()", this));
@DomName('NavigationPreloadManager.getState')
@DocsEditable()
@Experimental() // untriaged
- Future getState() native;
+ Future<Map> getState() =>
+ promiseToFutureDictionary(JS("", "#.getState()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -28307,7 +28494,7 @@
@DomName('Navigator.getBattery')
@DocsEditable()
@Experimental() // untriaged
- Future getBattery() native;
+ Future getBattery() => promiseToFuture(JS("", "#.getBattery()", this));
@JSName('getGamepads')
@DomName('Navigator.getGamepads')
@@ -28320,12 +28507,14 @@
@DomName('Navigator.getInstalledRelatedApps')
@DocsEditable()
@Experimental() // untriaged
- Future getInstalledRelatedApps() native;
+ Future<RelatedApplication> getInstalledRelatedApps() =>
+ promiseToFuture<RelatedApplication>(
+ JS("", "#.getInstalledRelatedApps()", this));
@DomName('Navigator.getVRDisplays')
@DocsEditable()
@Experimental() // untriaged
- Future getVRDisplays() native;
+ Future getVRDisplays() => promiseToFuture(JS("", "#.getVRDisplays()", this));
@DomName('Navigator.registerProtocolHandler')
@DocsEditable()
@@ -28380,7 +28569,9 @@
@DocsEditable()
@Experimental() // untriaged
Future requestMediaKeySystemAccess(
- String keySystem, List<Map> supportedConfigurations) native;
+ String keySystem, List<Map> supportedConfigurations) =>
+ promiseToFuture(JS("", "#.requestMediaKeySystemAccess(#, #)", this,
+ keySystem, supportedConfigurations));
@DomName('Navigator.sendBeacon')
@DocsEditable()
@@ -30139,7 +30330,7 @@
@DomName('OffscreenCanvasRenderingContext2D.commit')
@DocsEditable()
@Experimental() // untriaged
- Future commit() native;
+ Future commit() => promiseToFuture(JS("", "#.commit()", this));
@DomName('OffscreenCanvasRenderingContext2D.createImageData')
@DocsEditable()
@@ -31380,27 +31571,31 @@
@DomName('PaymentInstruments.clear')
@DocsEditable()
@Experimental() // untriaged
- Future clear() native;
+ Future clear() => promiseToFuture(JS("", "#.clear()", this));
@DomName('PaymentInstruments.delete')
@DocsEditable()
@Experimental() // untriaged
- Future delete(String instrumentKey) native;
+ Future<bool> delete(String instrumentKey) =>
+ promiseToFuture<bool>(JS("", "#.delete(#)", this, instrumentKey));
@DomName('PaymentInstruments.get')
@DocsEditable()
@Experimental() // untriaged
- Future get(String instrumentKey) native;
+ Future<Map> get(String instrumentKey) =>
+ promiseToFutureDictionary(JS("", "#.get(#)", this, instrumentKey));
@DomName('PaymentInstruments.has')
@DocsEditable()
@Experimental() // untriaged
- Future has(String instrumentKey) native;
+ Future has(String instrumentKey) =>
+ promiseToFuture(JS("", "#.has(#)", this, instrumentKey));
@DomName('PaymentInstruments.keys')
@DocsEditable()
@Experimental() // untriaged
- Future keys() native;
+ Future<List<String>> keys() =>
+ promiseToFuture<List<String>>(JS("", "#.keys()", this));
@DomName('PaymentInstruments.set')
@DocsEditable()
@@ -31500,17 +31695,19 @@
@DomName('PaymentRequest.abort')
@DocsEditable()
@Experimental() // untriaged
- Future abort() native;
+ Future abort() => promiseToFuture(JS("", "#.abort()", this));
@DomName('PaymentRequest.canMakePayment')
@DocsEditable()
@Experimental() // untriaged
- Future canMakePayment() native;
+ Future<bool> canMakePayment() =>
+ promiseToFuture<bool>(JS("", "#.canMakePayment()", this));
@DomName('PaymentRequest.show')
@DocsEditable()
@Experimental() // untriaged
- Future show() native;
+ Future<PaymentResponse> show() =>
+ promiseToFuture<PaymentResponse>(JS("", "#.show()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -31577,7 +31774,8 @@
@DomName('PaymentRequestEvent.openWindow')
@DocsEditable()
@Experimental() // untriaged
- Future openWindow(String url) native;
+ Future<WindowClient> openWindow(String url) =>
+ promiseToFuture<WindowClient>(JS("", "#.openWindow(#)", this, url));
@DomName('PaymentRequestEvent.respondWith')
@DocsEditable()
@@ -31677,7 +31875,8 @@
@DomName('PaymentResponse.complete')
@DocsEditable()
@Experimental() // untriaged
- Future complete([String paymentResult]) native;
+ Future complete([String paymentResult]) =>
+ promiseToFuture(JS("", "#.complete(#)", this, paymentResult));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -32347,7 +32546,9 @@
@DomName('Permissions.requestAll')
@DocsEditable()
@Experimental() // untriaged
- Future requestAll(List<Map> permissions) native;
+ Future<PermissionStatus> requestAll(List<Map> permissions) =>
+ promiseToFuture<PermissionStatus>(
+ JS("", "#.requestAll(#)", this, permissions));
@DomName('Permissions.revoke')
@DocsEditable()
@@ -32984,17 +33185,22 @@
@DomName('PresentationRequest.getAvailability')
@DocsEditable()
@Experimental() // untriaged
- Future getAvailability() native;
+ Future<PresentationAvailability> getAvailability() =>
+ promiseToFuture<PresentationAvailability>(
+ JS("", "#.getAvailability()", this));
@DomName('PresentationRequest.reconnect')
@DocsEditable()
@Experimental() // untriaged
- Future reconnect(String id) native;
+ Future<PresentationConnection> reconnect(String id) =>
+ promiseToFuture<PresentationConnection>(
+ JS("", "#.reconnect(#)", this, id));
@DomName('PresentationRequest.start')
@DocsEditable()
@Experimental() // untriaged
- Future start() native;
+ Future<PresentationConnection> start() =>
+ promiseToFuture<PresentationConnection>(JS("", "#.start()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -33221,7 +33427,8 @@
@DomName('PushManager.getSubscription')
@DocsEditable()
@Experimental() // untriaged
- Future getSubscription() native;
+ Future<PushSubscription> getSubscription() =>
+ promiseToFuture<PushSubscription>(JS("", "#.getSubscription()", this));
@DomName('PushManager.permissionState')
@DocsEditable()
@@ -33338,7 +33545,8 @@
@DomName('PushSubscription.unsubscribe')
@DocsEditable()
@Experimental() // untriaged
- Future unsubscribe() native;
+ Future<bool> unsubscribe() =>
+ promiseToFuture<bool>(JS("", "#.unsubscribe()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -33687,17 +33895,19 @@
@DomName('RemotePlayback.cancelWatchAvailability')
@DocsEditable()
@Experimental() // untriaged
- Future cancelWatchAvailability([int id]) native;
+ Future cancelWatchAvailability([int id]) =>
+ promiseToFuture(JS("", "#.cancelWatchAvailability(#)", this, id));
@DomName('RemotePlayback.prompt')
@DocsEditable()
@Experimental() // untriaged
- Future prompt() native;
+ Future prompt() => promiseToFuture(JS("", "#.prompt()", this));
@DomName('RemotePlayback.watchAvailability')
@DocsEditable()
@Experimental() // untriaged
- Future watchAvailability(RemotePlaybackAvailabilityCallback callback) native;
+ Future<int> watchAvailability(RemotePlaybackAvailabilityCallback callback) =>
+ promiseToFuture<int>(JS("", "#.watchAvailability(#)", this, callback));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -34301,15 +34511,6 @@
return completer.future;
}
- @DomName('RTCPeerConnection.getStats')
- Future<RtcStatsResponse> getStats(MediaStreamTrack selector) {
- var completer = new Completer<RtcStatsResponse>();
- _getStats((value) {
- completer.complete(value);
- }, selector);
- return completer.future;
- }
-
@DomName('RTCPeerConnection.generateCertificate')
@DocsEditable()
@Experimental() // untriaged
@@ -34422,8 +34623,10 @@
@DomName('RTCPeerConnection.addIceCandidate')
@DocsEditable()
Future addIceCandidate(Object candidate,
- [VoidCallback successCallback,
- RtcPeerConnectionErrorCallback failureCallback]) native;
+ [VoidCallback successCallback,
+ RtcPeerConnectionErrorCallback failureCallback]) =>
+ promiseToFuture(JS("", "#.addIceCandidate(#, #, #)", this, candidate,
+ successCallback, failureCallback));
@DomName('RTCPeerConnection.addStream')
@DocsEditable()
@@ -34601,11 +34804,9 @@
@Experimental() // untriaged
List<RtcRtpSender> getSenders() native;
- @JSName('getStats')
@DomName('RTCPeerConnection.getStats')
@DocsEditable()
- Future _getStats(
- [RtcStatsCallback successCallback, MediaStreamTrack selector]) native;
+ Future getStats() => promiseToFutureMap(JS("", "#.getStats()", this));
@DomName('RTCPeerConnection.removeStream')
@DocsEditable()
@@ -34876,11 +35077,68 @@
// http://dev.w3.org/2011/webrtc/editor/webrtc.html#idl-def-RTCStatsReport
@Experimental()
@Native("RTCStatsReport")
-class RtcStatsReport extends Interceptor {
+class RtcStatsReport extends Interceptor with MapMixin<String, dynamic> {
// To suppress missing implicit constructor warnings.
factory RtcStatsReport._() {
throw new UnsupportedError("Not supported");
}
+
+ Map _getItem(String key) =>
+ convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+ void addAll(Map<String, dynamic> other) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ bool containsValue(dynamic value) => values.any((e) => e == value);
+
+ bool containsKey(dynamic key) => _getItem(key) != null;
+
+ Map operator [](dynamic key) => _getItem(key);
+
+ void forEach(void f(String key, dynamic value)) {
+ var entries = JS('', '#.entries()', this);
+ while (true) {
+ var entry = JS('', '#.next()', entries);
+ if (JS('bool', '#.done', entry)) return;
+ f(JS('String', '#.value[0]', entry),
+ convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+ }
+ }
+
+ Iterable<String> get keys {
+ final keys = <String>[];
+ forEach((k, v) => keys.add(k));
+ return keys;
+ }
+
+ Iterable<Map> get values {
+ final values = <Map>[];
+ forEach((k, v) => values.add(v));
+ return values;
+ }
+
+ int get length => JS('int', '#.size', this);
+
+ bool get isEmpty => length == 0;
+
+ bool get isNotEmpty => !isEmpty;
+
+ void operator []=(String key, dynamic value) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ dynamic putIfAbsent(String key, dynamic ifAbsent()) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ String remove(dynamic key) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ void clear() {
+ throw new UnsupportedError("Not supported");
+ }
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -35043,7 +35301,8 @@
@DomName('ScreenOrientation.lock')
@DocsEditable()
@Experimental() // untriaged
- Future lock(String orientation) native;
+ Future lock(String orientation) =>
+ promiseToFuture(JS("", "#.lock(#)", this, orientation));
@DomName('ScreenOrientation.unlock')
@DocsEditable()
@@ -35771,12 +36030,16 @@
@DomName('ServiceWorkerContainer.getRegistration')
@DocsEditable()
@Experimental() // untriaged
- Future getRegistration([String documentURL]) native;
+ Future<ServiceWorkerRegistration> getRegistration([String documentURL]) =>
+ promiseToFuture<ServiceWorkerRegistration>(
+ JS("", "#.getRegistration(#)", this, documentURL));
@DomName('ServiceWorkerContainer.getRegistrations')
@DocsEditable()
@Experimental() // untriaged
- Future getRegistrations() native;
+ Future<List<ServiceWorkerRegistration>> getRegistrations() =>
+ promiseToFuture<List<ServiceWorkerRegistration>>(
+ JS("", "#.getRegistrations()", this));
@DomName('ServiceWorkerContainer.register')
@DocsEditable()
@@ -35862,7 +36125,7 @@
@DomName('ServiceWorkerGlobalScope.skipWaiting')
@DocsEditable()
@Experimental() // untriaged
- Future skipWaiting() native;
+ Future skipWaiting() => promiseToFuture(JS("", "#.skipWaiting()", this));
@DomName('ServiceWorkerGlobalScope.onactivate')
@DocsEditable()
@@ -35996,12 +36259,13 @@
@DomName('ServiceWorkerRegistration.unregister')
@DocsEditable()
@Experimental() // untriaged
- Future unregister() native;
+ Future<bool> unregister() =>
+ promiseToFuture<bool>(JS("", "#.unregister()", this));
@DomName('ServiceWorkerRegistration.update')
@DocsEditable()
@Experimental() // untriaged
- Future update() native;
+ Future update() => promiseToFuture(JS("", "#.update()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -37639,17 +37903,19 @@
@DomName('StorageManager.estimate')
@DocsEditable()
@Experimental() // untriaged
- Future estimate() native;
+ Future<Map> estimate() =>
+ promiseToFutureDictionary(JS("", "#.estimate()", this));
@DomName('StorageManager.persist')
@DocsEditable()
@Experimental() // untriaged
- Future persist() native;
+ Future<bool> persist() => promiseToFuture<bool>(JS("", "#.persist()", this));
@DomName('StorageManager.persisted')
@DocsEditable()
@Experimental() // untriaged
- Future persisted() native;
+ Future<bool> persisted() =>
+ promiseToFuture<bool>(JS("", "#.persisted()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -37892,12 +38158,14 @@
@DomName('SyncManager.getTags')
@DocsEditable()
@Experimental() // untriaged
- Future getTags() native;
+ Future<List<String>> getTags() =>
+ promiseToFuture<List<String>>(JS("", "#.getTags()", this));
@DomName('SyncManager.register')
@DocsEditable()
@Experimental() // untriaged
- Future register(String tag) native;
+ Future register(String tag) =>
+ promiseToFuture(JS("", "#.register(#)", this, tag));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -38591,7 +38859,8 @@
@DomName('TextDetector.detect')
@DocsEditable()
@Experimental() // untriaged
- Future detect(/*ImageBitmapSource*/ image) native;
+ Future<List<DetectedText>> detect(/*ImageBitmapSource*/ image) =>
+ promiseToFuture<List<DetectedText>>(JS("", "#.detect(#)", this, image));
}
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -39863,7 +40132,8 @@
@DomName('UnderlyingSourceBase.cancel')
@DocsEditable()
@Experimental() // untriaged
- Future cancel(Object reason) native;
+ Future cancel(Object reason) =>
+ promiseToFuture(JS("", "#.cancel(#)", this, reason));
@DomName('UnderlyingSourceBase.notifyLockAcquired')
@DocsEditable()
@@ -39878,12 +40148,13 @@
@DomName('UnderlyingSourceBase.pull')
@DocsEditable()
@Experimental() // untriaged
- Future pull() native;
+ Future pull() => promiseToFuture(JS("", "#.pull()", this));
@DomName('UnderlyingSourceBase.start')
@DocsEditable()
@Experimental() // untriaged
- Future start(Object stream) native;
+ Future start(Object stream) =>
+ promiseToFuture(JS("", "#.start(#)", this, stream));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -40107,7 +40378,7 @@
@DomName('VR.getDevices')
@DocsEditable()
@Experimental() // untriaged
- Future getDevices() native;
+ Future getDevices() => promiseToFuture(JS("", "#.getDevices()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -40281,7 +40552,7 @@
@DomName('VRDisplay.exitPresent')
@DocsEditable()
@Experimental() // untriaged
- Future exitPresent() native;
+ Future exitPresent() => promiseToFuture(JS("", "#.exitPresent()", this));
@DomName('VRDisplay.getEyeParameters')
@DocsEditable()
@@ -40306,7 +40577,8 @@
@DomName('VRDisplay.requestPresent')
@DocsEditable()
@Experimental() // untriaged
- Future requestPresent(List<Map> layers) native;
+ Future requestPresent(List<Map> layers) =>
+ promiseToFuture(JS("", "#.requestPresent(#)", this, layers));
@DomName('VRDisplay.submitFrame')
@DocsEditable()
@@ -40577,7 +40849,7 @@
@DomName('VRSession.end')
@DocsEditable()
@Experimental() // untriaged
- Future end() native;
+ Future end() => promiseToFuture(JS("", "#.end()", this));
@DomName('VRSession.requestFrameOfReference')
@DocsEditable()
@@ -43905,12 +44177,14 @@
@DomName('WindowClient.focus')
@DocsEditable()
@Experimental() // untriaged
- Future focus() native;
+ Future<WindowClient> focus() =>
+ promiseToFuture<WindowClient>(JS("", "#.focus()", this));
@DomName('WindowClient.navigate')
@DocsEditable()
@Experimental() // untriaged
- Future navigate(String url) native;
+ Future<WindowClient> navigate(String url) =>
+ promiseToFuture<WindowClient>(JS("", "#.navigate(#)", this, url));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -44787,17 +45061,20 @@
@DomName('BudgetService.getBudget')
@DocsEditable()
@Experimental() // untriaged
- Future getBudget() native;
+ Future<BudgetState> getBudget() =>
+ promiseToFuture<BudgetState>(JS("", "#.getBudget()", this));
@DomName('BudgetService.getCost')
@DocsEditable()
@Experimental() // untriaged
- Future getCost(String operation) native;
+ Future<double> getCost(String operation) =>
+ promiseToFuture<double>(JS("", "#.getCost(#)", this, operation));
@DomName('BudgetService.reserve')
@DocsEditable()
@Experimental() // untriaged
- Future reserve(String operation) native;
+ Future<bool> reserve(String operation) =>
+ promiseToFuture<bool>(JS("", "#.reserve(#)", this, operation));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -44842,22 +45119,26 @@
@DomName('Clipboard.read')
@DocsEditable()
@Experimental() // untriaged
- Future read() native;
+ Future<DataTransfer> read() =>
+ promiseToFuture<DataTransfer>(JS("", "#.read()", this));
@DomName('Clipboard.readText')
@DocsEditable()
@Experimental() // untriaged
- Future readText() native;
+ Future<String> readText() =>
+ promiseToFuture<String>(JS("", "#.readText()", this));
@DomName('Clipboard.write')
@DocsEditable()
@Experimental() // untriaged
- Future write(DataTransfer data) native;
+ Future write(DataTransfer data) =>
+ promiseToFuture(JS("", "#.write(#)", this, data));
@DomName('Clipboard.writeText')
@DocsEditable()
@Experimental() // untriaged
- Future writeText(String data) native;
+ Future writeText(String data) =>
+ promiseToFuture(JS("", "#.writeText(#)", this, data));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
diff --git a/sdk/lib/internal/async_cast.dart b/sdk/lib/internal/async_cast.dart
index eb59a7d..eee09b9 100644
--- a/sdk/lib/internal/async_cast.dart
+++ b/sdk/lib/internal/async_cast.dart
@@ -32,7 +32,8 @@
Future cancel() => _source.cancel();
void onData(void handleData(T data)) {
- _source.onData((S data) => handleData(data as T));
+ _source
+ .onData(handleData == null ? null : (S data) => handleData(data as T));
}
void onError(Function handleError) {
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index 16ba803..23c0a70 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -2683,7 +2683,7 @@
@DomName('SVGImageElement.decode')
@DocsEditable()
@Experimental() // untriaged
- Future decode() native;
+ Future decode() => promiseToFuture(JS("", "#.decode()", this));
// From SVGURIReference
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index c927559..c12fe76 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -240,7 +240,7 @@
@DomName('AudioContext.close')
@DocsEditable()
@Experimental() // untriaged
- Future close() native;
+ Future close() => promiseToFuture(JS("", "#.close()", this));
@DomName('AudioContext.getOutputTimestamp')
@DocsEditable()
@@ -258,7 +258,7 @@
@DomName('AudioContext.suspend')
@DocsEditable()
@Experimental() // untriaged
- Future suspend() native;
+ Future suspend() => promiseToFuture(JS("", "#.suspend()", this));
factory AudioContext() => JS('AudioContext',
'new (window.AudioContext || window.webkitAudioContext)()');
@@ -534,11 +534,68 @@
@DomName('AudioParamMap')
@Experimental() // untriaged
@Native("AudioParamMap")
-class AudioParamMap extends Interceptor {
+class AudioParamMap extends Interceptor with MapMixin<String, dynamic> {
// To suppress missing implicit constructor warnings.
factory AudioParamMap._() {
throw new UnsupportedError("Not supported");
}
+
+ Map _getItem(String key) =>
+ convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+ void addAll(Map<String, dynamic> other) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ bool containsValue(dynamic value) => values.any((e) => e == value);
+
+ bool containsKey(dynamic key) => _getItem(key) != null;
+
+ Map operator [](dynamic key) => _getItem(key);
+
+ void forEach(void f(String key, dynamic value)) {
+ var entries = JS('', '#.entries()', this);
+ while (true) {
+ var entry = JS('', '#.next()', entries);
+ if (JS('bool', '#.done', entry)) return;
+ f(JS('String', '#.value[0]', entry),
+ convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+ }
+ }
+
+ Iterable<String> get keys {
+ final keys = <String>[];
+ forEach((k, v) => keys.add(k));
+ return keys;
+ }
+
+ Iterable<Map> get values {
+ final values = <Map>[];
+ forEach((k, v) => values.add(v));
+ return values;
+ }
+
+ int get length => JS('int', '#.size', this);
+
+ bool get isEmpty => length == 0;
+
+ bool get isNotEmpty => !isEmpty;
+
+ void operator []=(String key, dynamic value) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ dynamic putIfAbsent(String key, dynamic ifAbsent()) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ String remove(dynamic key) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ void clear() {
+ throw new UnsupportedError("Not supported");
+ }
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -955,14 +1012,16 @@
@DomName('BaseAudioContext.decodeAudioData')
@DocsEditable()
@Experimental() // untriaged
- Future decodeAudioData(ByteBuffer audioData,
- [DecodeSuccessCallback successCallback,
- DecodeErrorCallback errorCallback]) native;
+ Future<AudioBuffer> decodeAudioData(ByteBuffer audioData,
+ [DecodeSuccessCallback successCallback,
+ DecodeErrorCallback errorCallback]) =>
+ promiseToFuture<AudioBuffer>(JS("", "#.decodeAudioData(#, #, #)", this,
+ audioData, successCallback, errorCallback));
@DomName('BaseAudioContext.resume')
@DocsEditable()
@Experimental() // untriaged
- Future resume() native;
+ Future resume() => promiseToFuture(JS("", "#.resume()", this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -1481,13 +1540,15 @@
@DomName('OfflineAudioContext.startRendering')
@DocsEditable()
@Experimental() // untriaged
- Future startRendering() native;
+ Future<AudioBuffer> startRendering() =>
+ promiseToFuture<AudioBuffer>(JS("", "#.startRendering()", this));
@JSName('suspend')
@DomName('OfflineAudioContext.suspend')
@DocsEditable()
@Experimental() // untriaged
- Future suspendFor(num suspendTime) native;
+ Future suspendFor(num suspendTime) =>
+ promiseToFuture(JS("", "#.suspendFor(#)", this, suspendTime));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 657d0a8..b3d8ba3 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -1387,7 +1387,9 @@
@DocsEditable()
@Experimental() // untriaged
Future getBufferSubDataAsync(int target, int srcByteOffset, TypedData dstData,
- [int dstOffset, int length]) native;
+ [int dstOffset, int length]) =>
+ promiseToFuture(JS("", "#.getBufferSubDataAsync(#, #, #, #, #)", this,
+ target, srcByteOffset, dstData, dstOffset, length));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
@@ -2895,7 +2897,7 @@
@DomName('WebGLRenderingContext.commit')
@DocsEditable()
@Experimental() // untriaged
- Future commit() native;
+ Future commit() => promiseToFuture(JS("", "#.commit()", this));
@DomName('WebGLRenderingContext.compileShader')
@DocsEditable()
@@ -6709,7 +6711,7 @@
@DomName('WebGL2RenderingContext.commit')
@DocsEditable()
@Experimental() // untriaged
- Future commit() native;
+ Future commit() => promiseToFuture(JS("", "#.commit()", this));
@DomName('WebGL2RenderingContext.compileShader')
@DocsEditable()
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index d758bc1..5efb0e9 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -160,6 +160,10 @@
LibTest/core/List/sort_A01_t06: Slow, Pass # Slow tests that needs extra time to finish.
LibTest/core/double/INFINITY_A01_t04: RuntimeError # Expected to fail because double.INFINITY is int.
LibTest/core/double/NEGATIVE_INFINITY_A01_t04: RuntimeError # Expected to fail because double.NEGATIVE_INFINITY is int.
+LibTest/core/double/operator_addition_A01_t06: RuntimeError # Large integer literal. Not valid dart 2.
+LibTest/core/double/operator_addition_A01_t08: Crash # Large integer literal. Not valid dart 2.
+LibTest/core/double/operator_subtraction_A01_t06: RuntimeError # Large integer literal. Not valid dart 2.
+LibTest/core/double/operator_subtraction_A01_t09: Crash # Large integer literal. Not valid dart 2.
LibTest/core/int/hashCode_A01_t01: RuntimeError, OK # co19 issue 308
LibTest/core/int/isEven_A01_t01: RuntimeError, OK # co19 issue 277
LibTest/core/int/isOdd_A01_t01: RuntimeError, OK # co19 issue 277
@@ -170,8 +174,13 @@
LibTest/core/int/operator_OR_A01_t01: RuntimeError, OK # Requires bigints.
LibTest/core/int/operator_XOR_A01_t01: RuntimeError, OK # Requires bigints.
LibTest/core/int/operator_addition_A01_t01: RuntimeError, OK # co19 issue 200
+LibTest/core/int/operator_division_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
+LibTest/core/int/operator_multiplication_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
LibTest/core/int/operator_remainder_A01_t01: RuntimeError, OK # Requires bigints.
+LibTest/core/int/operator_remainder_A01_t02: RuntimeError, OK # Requires bigints.
LibTest/core/int/operator_right_shift_A01_t01: RuntimeError, OK # Expects negative result from bit-operation.
+LibTest/core/int/operator_subtraction_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
+LibTest/core/int/operator_truncating_division_A01_t01: RuntimeError # Large integer literal. Not valid dart 2.
LibTest/core/int/toDouble_A01_t01: RuntimeError, OK # co19 issue 200
LibTest/html/Element/addEventListener_A01_t04: Skip # https://github.com/dart-lang/sdk/issues/28873
LibTest/html/Element/queryAll_A01_t01: RuntimeError # See issue 143
@@ -7076,6 +7085,7 @@
Language/Classes/Constructors/Generative_Constructors/execution_t06: Crash
Language/Classes/Constructors/Generative_Constructors/execution_t07: Crash
Language/Classes/Constructors/Generative_Constructors/execution_t12: Crash
+Language/Classes/Constructors/Generative_Constructors/initializers_t12: Crash # Issue 33157
Language/Classes/Constructors/Generative_Constructors/redirection_t03: Crash
Language/Classes/Constructors/Generative_Constructors/redirection_t07: Crash
Language/Classes/Constructors/Generative_Constructors/redirection_t08: Crash
diff --git a/tests/compiler/dart2js/codegen/number_output_test.dart b/tests/compiler/dart2js/codegen/number_output_test.dart
index a51bd7c..8bfe28e 100644
--- a/tests/compiler/dart2js/codegen/number_output_test.dart
+++ b/tests/compiler/dart2js/codegen/number_output_test.dart
@@ -2,7 +2,6 @@
// 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.
-// VMOptions= --no_limit_ints_to_64_bits
import 'dart:async';
import 'package:expect/expect.dart';
import 'package:compiler/compiler_new.dart';
@@ -14,7 +13,8 @@
'main.dart': '''
main() {
print(12300000);
- print(1234567890123456789012345);
+ // TODO(efortuna): Uncomment below when issue 33160 is fixed.
+ // print(0xffffffff00000000);
print(double.maxFinite);
print(-22230000);
}'''
@@ -44,7 +44,9 @@
Expect.isTrue(jsOutput.contains('12300000'));
Expect.isTrue(jsOutput.contains('-22230000'));
}
- Expect.isTrue(jsOutput.contains('12345678901234568e8'));
+ // TODO(efortuna): Uncomment when issue 33160 is fixed.
+ //Expect.isTrue(jsOutput.contains('18446744069414584e3'));
+ //Expect.isFalse(jsOutput.contains('-4294967296'));
Expect.isTrue(jsOutput.contains('17976931348623157e292'));
Expect.isFalse(jsOutput.contains('1234567890123456789012345'));
// The decimal expansion of double.maxFinite has 308 digits. We only check
diff --git a/tests/compiler/dart2js/codegen/value_range2_test.dart b/tests/compiler/dart2js/codegen/value_range2_test.dart
index be9df0f..774fd9a 100644
--- a/tests/compiler/dart2js/codegen/value_range2_test.dart
+++ b/tests/compiler/dart2js/codegen/value_range2_test.dart
@@ -8,7 +8,7 @@
import "package:compiler/src/types/abstract_value_domain.dart";
import "package:compiler/src/js_backend/constant_system_javascript.dart";
-ValueRangeInfo info = new ValueRangeInfo(const JavaScriptConstantSystem());
+ValueRangeInfo info = new ValueRangeInfo(JavaScriptConstantSystem.only);
class AbstractValueDomainMock implements AbstractValueDomain {
const AbstractValueDomainMock();
@@ -27,7 +27,7 @@
Range createSingleRange(Value value) => info.newNormalizedRange(value, value);
Range createSingleIntRange(int value) {
- return createSingleRange(info.newIntValue(value));
+ return createSingleRange(info.newIntValue(new BigInt.from(value)));
}
Range createSingleInstructionRange() => createSingleRange(instructionValue);
@@ -35,16 +35,18 @@
Range createSingleLengthRange() => createSingleRange(lengthValue);
Range createIntRange(int lower, int upper) {
- return info.newNormalizedRange(
- info.newIntValue(lower), info.newIntValue(upper));
+ return info.newNormalizedRange(info.newIntValue(new BigInt.from(lower)),
+ info.newIntValue(new BigInt.from(upper)));
}
Range createLengthRange(int lower) {
- return info.newNormalizedRange(info.newIntValue(lower), lengthValue);
+ return info.newNormalizedRange(
+ info.newIntValue(new BigInt.from(lower)), lengthValue);
}
Range createInstructionRange(int lower) {
- return info.newNormalizedRange(info.newIntValue(lower), instructionValue);
+ return info.newNormalizedRange(
+ info.newIntValue(new BigInt.from(lower)), instructionValue);
}
Range instruction = createSingleInstructionRange();
@@ -60,8 +62,8 @@
Range _0_instruction = createInstructionRange(0);
checkAndRange(Range one, Range two, lower, upper) {
- if (lower is num) lower = info.newIntValue(lower);
- if (upper is num) upper = info.newIntValue(upper);
+ if (lower is num) lower = info.newIntValue(new BigInt.from(lower));
+ if (upper is num) upper = info.newIntValue(new BigInt.from(upper));
Range range = info.newNormalizedRange(lower, upper);
Expect.equals(range, one & two);
}
@@ -89,12 +91,12 @@
if (lower == null) {
lower = buildBound(one.lower, two.upper);
} else if (lower is num) {
- lower = info.newIntValue(lower);
+ lower = info.newIntValue(new BigInt.from(lower));
}
if (upper == null) {
upper = buildBound(one.upper, two.lower);
} else if (upper is num) {
- upper = info.newIntValue(upper);
+ upper = info.newIntValue(new BigInt.from(upper));
}
Expect.equals(info.newNormalizedRange(lower, upper), one - two);
@@ -106,14 +108,14 @@
} else {
Value low, up;
if (arg1 is num) {
- low = info.newIntValue(arg1);
+ low = info.newIntValue(new BigInt.from(arg1));
} else if (arg1 == null) {
low = info.newNegateValue(range.upper);
} else {
low = arg1;
}
if (arg2 is num) {
- up = info.newIntValue(arg2);
+ up = info.newIntValue(new BigInt.from(arg2));
} else if (arg2 == null) {
up = info.newNegateValue(range.lower);
} else {
diff --git a/tests/compiler/dart2js/model/constant_value_test.dart b/tests/compiler/dart2js/model/constant_value_test.dart
index 5d0aa37..05d5194 100644
--- a/tests/compiler/dart2js/model/constant_value_test.dart
+++ b/tests/compiler/dart2js/model/constant_value_test.dart
@@ -29,12 +29,12 @@
FieldEntity field1 = env.elementEnvironment.lookupClassMember(C, 'field1');
FieldEntity field2 = env.elementEnvironment.lookupClassMember(C, 'field2');
ConstructedConstantValue value1 = new ConstructedConstantValue(C_raw, {
- field1: new IntConstantValue(0),
- field2: new IntConstantValue(1),
+ field1: new IntConstantValue(BigInt.zero),
+ field2: new IntConstantValue(BigInt.one),
});
ConstantValue value2 = new ConstructedConstantValue(C_raw, {
- field2: new IntConstantValue(1),
- field1: new IntConstantValue(0),
+ field2: new IntConstantValue(BigInt.one),
+ field1: new IntConstantValue(BigInt.zero),
});
Expect.equals(value1.hashCode, value2.hashCode, "Hashcode mismatch.");
Expect.equals(value1, value2, "Value mismatch.");
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
index 0ca8e55..13e5ecd 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_async.dart
@@ -10,6 +10,6 @@
}
@NoInline()
-test() async /*2:test*/ /*kernel.3:test*/ {
+test() async /*2:test*/ {
/*4:test*/ throw '>ExceptionMarker<';
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
index cf570ba..49c7a18 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_awaited_async.dart
@@ -10,12 +10,12 @@
}
@NoInline()
-test1() async /*3:test1*/ /*kernel.4:test1*/ {
+test1() async /*3:test1*/ {
// This call is on the stack when the error is thrown.
await /*5:test1*/ test2();
}
@NoInline()
-test2() async /*7:test2*/ /*kernel.8:test2*/ {
+test2() async /*7:test2*/ {
/*9:test2*/ throw '>ExceptionMarker<';
}
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
index a12eaa6..5889055 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_constructor_from_async.dart
@@ -12,7 +12,7 @@
// TODO(johnniwinther): Investigate why kernel doesn't point to the body
// start brace.
// ignore: UNUSED_LOCAL_VARIABLE
- var /*2:test*/ /*3:test*/ c = new /*4:test*/ Class();
+ var /*2:test*/ c = new /*4:test*/ Class();
}
class Class {
diff --git a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
index eb5d5f0..7ea1cf9 100644
--- a/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
+++ b/tests/compiler/dart2js/sourcemaps/stacktrace/sync_throw_in_top_level_method_from_async.dart
@@ -9,7 +9,7 @@
}
@NoInline()
-test1() async /*2:test1*/ /*kernel.3:test1*/ {
+test1() async /*2:test1*/ {
/*9:test1*/ test2();
}
diff --git a/tests/compiler/dart2js_extra/21579_test.dart b/tests/compiler/dart2js_extra/21579_test.dart
index 94197cd..a7b3079 100644
--- a/tests/compiler/dart2js_extra/21579_test.dart
+++ b/tests/compiler/dart2js_extra/21579_test.dart
@@ -12,7 +12,7 @@
main() {
var a = new List.generate(100, (i) => i);
- a.sort((a, b) => 1000000000000000000000 * a.compareTo(b));
+ a.sort((a, b) => 10000000000000 * a.compareTo(b));
Expect.equals(0, a.first);
Expect.equals(99, a.last);
}
diff --git a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart b/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
index 094cd95..1a09423 100644
--- a/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
+++ b/tests/compiler/dart2js_extra/constant_javascript_semantics_test.dart
@@ -6,8 +6,8 @@
// Make sure we use JavaScript semantics when compiling compile-time constants.
-const x = 12345678901234567891;
-const y = 12345678901234567890;
+const x = 1234567890123456789;
+const y = 1234567890123456788;
const z = x - y;
const a = 1.0;
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 443fca5..e327d40 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -151,16 +151,27 @@
big_integer_parsed_mul_div_vm_test: RuntimeError
bit_twiddling_bigint_test: RuntimeError
compare_to2_test: RuntimeError
+double_ceil_test: RuntimeError # Large integer literal. Not representable in JS.
+double_floor_test: RuntimeError # Large integer literal. Not representable in JS.
double_parse_test/01: RuntimeError
+double_round_test: RuntimeError # Large integer literal. Not representable in JS.
+double_truncate_test: RuntimeError # Large integer literal. Not representable in JS.
hash_set_test/01: RuntimeError
+int_ceil_to_double_test: RuntimeError # Large integer literal. Not representable in JS.
+int_floor_to_double_test: RuntimeError # Large integer literal. Not representable in JS.
+int_from_environment_test: RuntimeError # Large integer literal. Not representable in JS.
int_modulo_arith_test/bignum: RuntimeError
int_modulo_arith_test/modPow: RuntimeError
int_parse_radix_test/01: RuntimeError
int_parse_radix_test/02: RuntimeError
+int_round_to_double_test: RuntimeError # Large integer literal. Not representable in JS.
+int_truncate_to_double_test: RuntimeError # Large integer literal. Not representable in JS.
integer_to_radix_string_test: RuntimeError
integer_to_string_test/01: RuntimeError
iterable_return_type_test/02: RuntimeError
nan_infinity_test/01: RuntimeError
+num_parse_test/01: RuntimeError # Large integer literal. Not representable in JS.
+num_parse_test/none: RuntimeError # Large integer literal. Not representable in JS.
regress_r21715_test: RuntimeError
string_base_vm_test: RuntimeError
symbol_reserved_word_test/03: RuntimeError
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index 6aac957..740c6c6 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -127,6 +127,7 @@
int_parse_radix_bad_handler_test: Pass
[ $compiler == dart2analyzer && !$strong ]
+regress_33166_test: StaticWarning # Not a Dart 1 test
symbol_reserved_word_test/05: MissingCompileTimeError # Issue 30245
[ $compiler != dart2analyzer && $compiler != dart2js && $compiler != dartdevc && $compiler != dartdevk ]
diff --git a/tests/corelib_2/regress_33166_test.dart b/tests/corelib_2/regress_33166_test.dart
new file mode 100644
index 0000000..03f0faf
--- /dev/null
+++ b/tests/corelib_2/regress_33166_test.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, 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 'dart:async';
+import "package:expect/expect.dart";
+
+// Regression test for https://github.com/dart-lang/sdk/issues/33166
+void main() async {
+ var stream = new Stream.fromIterable([1, 2, 3]);
+ Expect.equals(await stream.cast<int>().drain().then((_) => 'Done'), 'Done');
+}
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index b9f01fd..e634a35 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -33,6 +33,7 @@
override_field_test/02: Pass, Slow # TODO(kasperl): Please triage.
[ $compiler == dart2js && $runtime == d8 && $fasta ]
+int_round_to_double_test: RuntimeError # Large integer literal. Not valid in dart2.
regress_23408_test: RuntimeError
[ $compiler == dart2js && $runtime != drt ]
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 4579ab6..953e7a2 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -540,12 +540,7 @@
async_await_test/03: RuntimeError
async_await_test/none: RuntimeError
async_star_cancel_while_paused_test: RuntimeError
-async_star_test/01: RuntimeError
async_star_test/02: RuntimeError
-async_star_test/03: RuntimeError
-async_star_test/04: RuntimeError
-async_star_test/05: RuntimeError
-async_star_test/none: RuntimeError
bad_override_test/03: MissingCompileTimeError
bit_operations_test: RuntimeError
branch_canonicalization_test: RuntimeError
@@ -904,12 +899,7 @@
async_return_types_test/nestedFuture: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
async_return_types_test/wrongReturnType: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
async_star_cancel_while_paused_test: Crash # 'file:*/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart': Failed assertion: line 208 pos 18: '!(_useKernel && _strongMode && !_disableRtiOptimization) ||
-async_star_test/01: RuntimeError
async_star_test/02: RuntimeError
-async_star_test/03: RuntimeError
-async_star_test/04: RuntimeError
-async_star_test/05: RuntimeError
-async_star_test/none: RuntimeError
await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
bad_override_test/01: MissingCompileTimeError
bad_override_test/02: MissingCompileTimeError
@@ -1451,12 +1441,7 @@
async_return_types_test/nestedFuture: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
async_return_types_test/wrongReturnType: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
async_star_cancel_while_paused_test: Crash # Interpolated value #1 is not an Expression or List of Expressions: [VariableUse(f), Instance of 'LiteralNull', null]
-async_star_test/01: RuntimeError
async_star_test/02: RuntimeError
-async_star_test/03: RuntimeError
-async_star_test/04: RuntimeError
-async_star_test/05: RuntimeError
-async_star_test/none: RuntimeError
await_not_started_immediately_test: Crash # Assertion failure: Runtime type information not available for type_variable_local(bindCallback.R) in (local(_RootZone.bindCallback#)) for j:closure_call(_RootZone_bindCallback_closure.call).
bad_override_test/01: MissingCompileTimeError
bad_override_test/02: MissingCompileTimeError
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 90f3795..a376ae2 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -19,6 +19,7 @@
async/schedule_microtask6_test: RuntimeError # global error handling is not supported. Issue 5958
convert/base64_test/01: Fail, OK # Uses bit-wise operations to detect invalid values. Some large invalid values accepted by dart2js.
convert/chunked_conversion_utf88_test: Slow, Pass
+convert/utf82_test: RuntimeError # Large integer literal. Not valid in dart2.
convert/utf85_test: Slow, Pass
developer/timeline_test: Skip # Not supported
math/double_pow_test: RuntimeError
@@ -112,7 +113,7 @@
mirrors/typevariable_mirror_metadata_test: RuntimeError # Issue 10905
mirrors/variable_is_const_test/none: RuntimeError # Issue 14671
profiler/metrics_num_test: Skip # Because of a int / double type test.
-typed_data/int32x4_bigint_test: RuntimeError # Issue 1533
+typed_data/int32x4_bigint_test: Pass
typed_data/int64_list_load_store_test: RuntimeError # Issue 10275
typed_data/typed_data_hierarchy_int64_test: RuntimeError # Issue 10275
diff --git a/tests/lib_2/html/interactive_media_test.dart b/tests/lib_2/html/interactive_media_test.dart
index 1ad71c0..25d43d4 100644
--- a/tests/lib_2/html/interactive_media_test.dart
+++ b/tests/lib_2/html/interactive_media_test.dart
@@ -6,14 +6,31 @@
import 'dart:async';
import 'dart:html';
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_individual_config.dart';
-import 'utils.dart';
-main() {
- useHtmlIndividualConfiguration();
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:async_helper/async_helper.dart';
+
+// NOTE: To test enable chrome://flags/#enable-experimental-web-platform-features
+
+main() async {
+ useHtmlConfiguration();
if (MediaStream.supported) {
+ test('getUserMedia audio', () async {
+ var mediaStream = await window.navigator.getUserMedia(audio: true);
+ expect(mediaStream, isNotNull);
+ expect(mediaStream is MediaStream, true);
+ var devices = window.navigator.mediaDevices;
+ var enumDevices = await devices.enumerateDevices();
+ expect(enumDevices.length > 1, true);
+ for (var device in enumDevices) {
+ var goodDevLabel = device.label.endsWith('Built-in Output') ||
+ device.label.endsWith('Built-in Microphone');
+ expect(goodDevLabel, true);
+ }
+ });
+
test('getUserMedia', () {
return window.navigator.getUserMedia(video: true).then((stream) {
expect(stream, isNotNull);
diff --git a/tests/lib_2/html/storage_promise_test.dart b/tests/lib_2/html/storage_promise_test.dart
new file mode 100644
index 0000000..b1e1b13
--- /dev/null
+++ b/tests/lib_2/html/storage_promise_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2013, 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 interactive_test;
+
+import 'dart:async';
+import 'dart:html';
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:async_helper/async_helper.dart';
+
+main() async {
+ useHtmlConfiguration();
+
+ bool thenEstimateBefore, thenEstimateAfter, thenEstimateDone = false;
+ Map thenEstimate;
+ test('Basic Promise Test', () async {
+ try {
+ thenEstimateBefore = true;
+ window.navigator.storage.estimate().then((value) {
+ thenEstimate = value;
+ thenEstimateDone = true;
+ });
+ thenEstimateAfter = true;
+ } catch (msg) {
+ fail("StorageManger failed: $msg");
+ }
+
+ Map estimate = await window.navigator.storage.estimate();
+
+ expect(thenEstimate['usage'] >= 0, true);
+ expect(thenEstimate['quota'] > 1, true);
+ expect(thenEstimate['usage'], estimate['usage']);
+ expect(thenEstimate['quota'], estimate['quota']);
+
+ expect(thenEstimateBefore, true);
+ expect(thenEstimateAfter, true);
+ expect(thenEstimateDone, true);
+ });
+}
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index 570bc93..35184e0 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -144,6 +144,9 @@
mirrors/redirecting_factory_different_type_test/none: RuntimeError
mirrors/reflected_type_generics_test/02: Fail, OK # Type check for a bounded type argument.
+[ $compiler == none && !$fasta ]
+mirrors/abstract_class_test: RuntimeError
+
[ $runtime == chrome && $system == linux ]
mirrors/native_class_test: Pass, Slow
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index 9177102..e49ac50 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -293,6 +293,7 @@
html/shadow_dom_test: RuntimeError
html/shadowroot_test: RuntimeError
html/speechrecognition_test: RuntimeError
+html/storage_promise_test: RuntimeError
html/storage_test: RuntimeError
html/streams_test: RuntimeError
html/svg_test: RuntimeError
@@ -341,7 +342,6 @@
html/fontface_loaded_test: RuntimeError
html/html_mock_test: RuntimeError # Issue 31038
html/input_element_attributes_test: RuntimeError
-html/interactive_media_test: RuntimeError
html/js_dart_functions_test: RuntimeError # does not implement Dart 2 implicit `.call` tearoff
html/js_extend_class_test: RuntimeError
@@ -462,6 +462,7 @@
html/file_sample_test: Skip # FileSystem not supported on Safari.
html/fileapi_supported_throws_test: Skip # FileSystem not supported on Safari
html/js_mock_test: RuntimeError # Issue 32286
+html/storage_promise_test: RuntimeError # Not supported on Safari
html/xhr_test: RuntimeError
[ $compiler == dart2js && $system == linux ]
@@ -789,6 +790,9 @@
convert/streamed_conversion_json_utf8_encode_test: SkipSlow # Times out. Issue 22050
convert/streamed_conversion_utf8_decode_test: SkipSlow # Times out. Issue 22050
+[ $compiler == dart2js && ($runtime != chrome || $system != macos) ]
+html/interactive_media_test: RuntimeError # # See NOTE in test on how to run.
+
[ $compiler == dart2js && ($runtime == ff || $runtime == safari || $ie) ]
html/custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Polyfill does not support
html/custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index c9e3342..e2910bb 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -26,7 +26,7 @@
[ $system == linux && ($compiler == dartdevc || $compiler == dartdevk) ]
html/interactive_geolocation_test: Skip # Requires allowing geo location.
-html/interactive_media_test: RuntimeError
+html/interactive_media_test: RuntimeError # # See NOTE in test on how to run.
[ $system == macos && ($compiler == dartdevc || $compiler == dartdevk) ]
html/client_rect_test: Pass, RuntimeError # Issue 31019
@@ -85,7 +85,7 @@
html/element_classes_svg_test: RuntimeError # Issue 29922
html/element_classes_test: RuntimeError # Issue 29922
html/fontface_loaded_test: RuntimeError
-html/interactive_media_test: Skip # requests interactive permissions (camera, geolocation)
+html/interactive_media_test: RuntimeError # See NOTE in test on how to run and interactive permissions (camera, geolocation)
html/isolates_test: RuntimeError # Issue 29922
html/js_typed_interop_default_arg_test/default_value: MissingCompileTimeError # Issue 29922
html/js_typed_interop_side_cast_exp_test/01: RuntimeError # Requires --experimental-trust-js-interop-type-annotations flag.
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 65dbd6b..f015610 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -90,7 +90,6 @@
isolate/spawn_function_custom_class_test: Pass, Crash, Timeout # Crashes with --no-enable-malloc-hooks vm option
isolate/spawn_uri_nested_vm_test: Pass, Timeout
isolate/static_function_test: Skip # Times out. Issue 31855. CompileTimeError. Issue 31402
-mirrors/abstract_class_test: RuntimeError
mirrors/apply3_test: RuntimeError
mirrors/class_declarations_test/01: RuntimeError # Issue 31402 (Invocation arguments)
mirrors/class_declarations_test/none: RuntimeError # Issue 31402 (Invocation arguments)
diff --git a/tests/lib_2/mirrors/abstract_class_test.dart b/tests/lib_2/mirrors/abstract_class_test.dart
index b7dbaf0..8cd4fae 100644
--- a/tests/lib_2/mirrors/abstract_class_test.dart
+++ b/tests/lib_2/mirrors/abstract_class_test.dart
@@ -107,28 +107,28 @@
// Mixin is abstract.
Expect.isFalse(reflectClass(SubMA).isAbstract);
Expect.isTrue(reflectClass(SubMA).superclass.isAbstract);
- Expect.isFalse(reflectClass(SubMA).superclass.superclass.isAbstract);
+ Expect.isTrue(reflectClass(SubMA).superclass.superclass.isAbstract);
Expect.isTrue(reflectClass(MA).isAbstract);
- Expect.isFalse(reflectClass(MA).superclass.isAbstract);
+ Expect.isTrue(reflectClass(MA).superclass.isAbstract);
// Mixin is concrete.
Expect.isFalse(reflectClass(SubMA2).isAbstract);
Expect.isTrue(reflectClass(SubMA2).superclass.isAbstract);
- Expect.isFalse(reflectClass(SubMA2).superclass.superclass.isAbstract);
+ Expect.isTrue(reflectClass(SubMA2).superclass.superclass.isAbstract);
Expect.isTrue(reflectClass(MA2).isAbstract);
- Expect.isFalse(reflectClass(MA2).superclass.isAbstract);
+ Expect.isTrue(reflectClass(MA2).superclass.isAbstract);
}
// Application is concrete.
{
// Mixin is abstract.
Expect.isFalse(reflectClass(ConcreteMA).isAbstract);
- Expect.isFalse(reflectClass(ConcreteMA).superclass.isAbstract);
+ Expect.isTrue(reflectClass(ConcreteMA).superclass.isAbstract);
Expect.isFalse(reflectClass(ConcreteMA).superclass.superclass.isAbstract);
// Mixin is concrete.
Expect.isFalse(reflectClass(ConcreteMA2).isAbstract);
- Expect.isFalse(reflectClass(ConcreteMA2).superclass.isAbstract);
+ Expect.isTrue(reflectClass(ConcreteMA2).superclass.isAbstract);
Expect.isFalse(reflectClass(ConcreteMA2).superclass.superclass.isAbstract);
}
}
diff --git a/tools/VERSION b/tools/VERSION
index b7ef033..717dac6 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 0
PATCH 0
-PRERELEASE 56
+PRERELEASE 57
PRERELEASE_PATCH 0
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 8695c4c..0f5f4a7 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -1,4 +1,7 @@
{
+ "global": {
+ "chrome": "65"
+ },
"filesets": {
"analyzer": [
"out/ReleaseX64/",
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 92995fc..cf6254c 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -14628,6 +14628,9 @@
"support_level": "untriaged"
},
"getStats": {},
+ "getStats2": {
+ "support_level": "untriaged"
+ },
"getStreamById": {},
"iceConnectionState": {},
"iceGatheringState": {},
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index 6773b11..a713b78 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -133,6 +133,9 @@
[DartSupplemental]
interface RTCPeerConnection {
[DartSuppress, RaisesException] void addIceCandidate(RTCIceCandidate candidate);
+ [DartSuppress] Promise<void> getStats(RTCStatsCallback successCallback, optional MediaStreamTrack? selector);
+ [DartSuppress] Promise<void> setLocalDescription(RTCSessionDescriptionInit description);
+ [DartSuppress] Promise<void> setRemoteDescription(RTCSessionDescriptionInit description);
};
// See implementation in tools/dom/templates for canvas and offscreenCanvas.
@@ -565,12 +568,6 @@
[DartName=inch] readonly attribute double? in;
};
-[DartSupplemental]
-interface RTCPeerConnection {
- [DartSuppress] Promise<void> setLocalDescription(RTCSessionDescriptionInit description);
- [DartSuppress] Promise<void> setRemoteDescription(RTCSessionDescriptionInit description);
-};
-
[DartSuppress]
interface DragEvent {};
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index cde90fb..d0cb493 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -187,7 +187,7 @@
html_interface_renames[interface] = '_' + interface
convert_to_future_members = monitored.Set(
- 'htmlrenamer.converted_to_future_members', [
+ 'htmlrenamer.converted_to_future_members', [
'DataTransferItem.getAsString',
'DirectoryEntry.getDirectory',
'DirectoryEntry.getFile',
@@ -425,7 +425,6 @@
'Range.getClientRects',
'RTCPeerConnection.createAnswer',
'RTCPeerConnection.createOffer',
- 'RTCPeerConnection.getStats',
'Screen.availHeight',
'Screen.availLeft',
'Screen.availTop',
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py
index a9b7fd7..b2e06d2 100644
--- a/tools/dom/scripts/idlnode.py
+++ b/tools/dom/scripts/idlnode.py
@@ -854,6 +854,13 @@
if not (self._find_first(ast, 'Partial') is None):
self.is_supplemental = True
self.ext_attrs['DartSupplemental'] = None
+ self.isMaplike = False
+ self.isMaplike_ro = False
+ self.maplike_key_value = [None, None]
+ if ast is not None and ast.maplike is not None:
+ self.isMaplike = True
+ self.isMaplike_ro = ast.maplike.is_read_only
+ self.maplike_key_value = [IDLType(ast.maplike.key_type), IDLType(ast.maplike.value_type)]
self.operations = self._convert_all(ast, 'Operation',
lambda ast: IDLOperation(ast, self.doc_js_name))
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index e100908..036b320 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -666,6 +666,14 @@
self._interface.id == 'CSSStyleDeclaration')):
base_class = 'DartHtmlDomObject'
+ maplikeKeyType = ''
+ maplikeValueType = ''
+ if self._interface.isMaplike:
+ maplikeKeyType = self._type_registry.\
+ _TypeInfo(self._interface.maplike_key_value[0].id).dart_type()
+ maplikeValueType = 'dynamic'
+ mixins_str = " with MapMixin<%s, %s>" % (maplikeKeyType, maplikeValueType)
+
implementation_members_emitter = implementation_emitter.Emit(
self._backend.ImplementationTemplate(),
LIBRARYNAME='dart.dom.%s' % self._library_name,
@@ -676,7 +684,9 @@
IMPLEMENTS=implements_str,
MIXINS=mixins_str,
DOMNAME=self._interface.doc_js_name,
- NATIVESPEC=native_spec)
+ NATIVESPEC=native_spec,
+ KEYTYPE=maplikeKeyType,
+ VALUETYPE=maplikeValueType)
stream_getter_signatures_emitter = None
element_stream_getters_emitter = None
if type(implementation_members_emitter) == tuple:
@@ -753,6 +763,102 @@
# ------------------------------------------------------------------------------
+''' TODO(terry): Current idl_parser (Chrome) doesn't keep the Promise type e.g.,
+ Promise<T> in the AST so there is no way to pull this out. Need
+ to investigate getting the Chrome folks to fix. However, they
+ don't use this in the C++ code generation and don't have a need
+ for this feature. For now I have a table that maps to the
+ parameterized Promise type.
+'''
+promise_attributes = monitored.Dict('systemhtml.promise_attr_type', {
+ "Animation.finished": {"type": "Animation"},
+ "Animation.ready": {"type": "Animation"},
+ "FontFace.loaded": {"type": "FontFace"},
+ "FontFaceSet.ready": {"type": "FontFaceSet"},
+ "PresentationReceiver.connectionList": {"type": "PresentationConnectionList"},
+ "ServiceWorkerContainer.ready": {"type": "ServiceWorkerRegistration"},
+})
+
+promise_operations = monitored.Dict('systemhtml.promise_oper_type', {
+ "Clipboard.read": { "type": "DataTransfer" },
+ "Clipboard.readText": { "type": "String" },
+ "FontFace.load": { "type": "FontFace"},
+ "FontFaceSet.load": { "type": "List<FontFace>" },
+ "OffscreenCanvas.load": { "type": "Blob" },
+ "BackgroundFetchManager.fetch": { "type": "BackgroundFetchRegistration" },
+ "BackgroundFetchManager.get": { "type": "BackgroundFetchRegistration" },
+ "BackgroundFetchManager.getIds": { "type": "List<String>" },
+ "BackgroundFetchRegistration.abort": { "type": "bool" },
+ "SyncManager.getTags": { "type": "List<String>" },
+ "BudgetService.getCost": { "type": "double" },
+ "BudgetService.getBudget": { "type": "BudgetState" },
+ "BudgetService.reserve": { "type": "bool" },
+ "Body.blob": { "type": "Blob" },
+ "Body.formData": { "type": "FormData" },
+ "Body.text": { "type": "String" },
+ "ImageCapture.getPhotoCapabilities": { "type": "PhotoCapabilities" },
+ "ImageCapture.getPhotoSettings": { "type": "dictionary" },
+ "ImageCapture.takePhoto": { "type": "Blob" },
+ "ImageCapture.grabFrame": { "type": "ImageBitmap" },
+ "Navigator.getInstalledRelatedApps": { "type": "RelatedApplication" },
+ "MediaCapabilities.decodingInfo": { "type": "MediaCapabilitiesInfo" },
+ "MediaCapabilities.encodingInfo": { "type": "MediaCapabilitiesInfo" },
+ "MediaDevices.enumerateDevices": { "type": "List<MediaDeviceInfo>" },
+ "MediaDevices.getUserMedia": { "type": "MediaStream" },
+ "MediaStreamTrack.applyConstraints": { "type": "MediaTrackConstraints" },
+ "ServiceWorkerRegistration.getNotifications": { "type": "List<Notification>" },
+ "PaymentInstruments.delete": { "type": "bool" },
+ "PaymentInstruments.get": { "type": "dictionary" },
+ "PaymentInstruments.keys": { "type": "List<String>" },
+ "PaymentInstrumentshas.": { "type": "bool" },
+ "PaymentRequest.show": { "type": "PaymentResponse" },
+ "PaymentRequest.canMakePayment": { "type": "bool" },
+ "PaymentRequestEvent.openWindow": { "type": "WindowClient" },
+ "RTCPeerConnection.createOffer": { "type": "RtcSessionDescription" },
+ "RTCPeerConnection.createAnswer": { "type": "RtcSessionDescription" },
+ "RTCPeerConnection.getStats": { "type": "dictionary", "maplike": "RTCStatsReport"},
+ "RTCPeerConnection.generateCertificate": { "type": "RtcCertificate" },
+ "Permissions.query": { "type": "PermissionStatus" },
+ "Permissions.request": { "type": "PermissionStatus" },
+ "Permissions.revoke": { "type": "PermissionStatus" },
+ "Permissions.requestAll": { "type": "PermissionStatus" },
+ "PresentationRequest.start": { "type": "PresentationConnection" },
+ "PresentationRequest.reconnect": { "type": "PresentationConnection" },
+ "PresentationRequest.getAvailability": { "type": "PresentationAvailability" },
+ "PushManager.subscribe": { "type": "PushSubscription" },
+ "PushManager.getSubscription": { "type": "PushSubscription" },
+ "PushSubscription.unsubscribe": { "type": "bool" },
+ "StorageManager.persisted": { "type": "bool" },
+ "StorageManager.persist": { "type": "bool" },
+ "StorageManager.estimate": { "type": "dictionary" },
+ "RemotePlayback.watchAvailability": { "type": "int" },
+ "Clients.matchAll": { "type": "List<Client>" },
+ "Clients.openWindow": { "type": "WindowClient" },
+ "NavigationPreloadManager.getState": { "type": "dictionary" },
+ "ServiceWorkerContainer.register": { "type": "ServiceWorkerRegistration" },
+ "ServiceWorkerContainer.getRegistration": { "type": "ServiceWorkerRegistration" },
+ "ServiceWorkerContainer.getRegistrations": { "type": "List<ServiceWorkerRegistration>" },
+ "ServiceWorkerGlobalScope.fetch": { "type": "Response" },
+ "ServiceWorkerRegistration.unregister": { "type": "bool" },
+ "WindowClient.focus": { "type": "WindowClient" },
+ "WindowClient.navigate": { "type": "WindowClient" },
+ "BarcodeDetector.detect": { "type": "List<DetectedBarcode>" },
+ "FaceDetector.detect": { "type": "List<DetectedFace>" },
+ "TextDetector.detect": { "type": "List<DetectedText>" },
+ "BaseAudioContext.decodeAudioData": { "type": "AudioBuffer" },
+ "OfflineAudioContext.startRendering": { "type": "AudioBuffer" },
+})
+
+def _GetPromiseOperationType(interface_operation):
+ if interface_operation in promise_operations:
+ return promise_operations[interface_operation]
+ return None
+
+def _GetPromiseAttributeType(interface_operation):
+ if interface_operation in promise_attributes:
+ return promise_attributes[interface_operation]
+ return None
+
class Dart2JSBackend(HtmlDartGenerator):
"""Generates a dart2js class for the dart:html library from a DOM IDL
interface.
@@ -792,8 +898,14 @@
def ImplementationTemplate(self):
template_file = ('impl_%s.darttemplate' %
self._interface.doc_js_name)
- return (self._template_loader.TryLoad(template_file) or
- self._template_loader.Load('dart2js_impl.darttemplate'))
+ template_file_content = self._template_loader.TryLoad(template_file)
+ if not(template_file_content):
+ if self._interface.isMaplike and self._interface.isMaplike_ro:
+ # TODO(terry): There are no mutable maplikes yet.
+ template_file_content = self._template_loader.Load('dart2js_maplike_impl.darttemplate')
+ else:
+ template_file_content = self._template_loader.Load('dart2js_impl.darttemplate')
+ return template_file_content
def StartInterface(self, members_emitter):
self._members_emitter = members_emitter
@@ -1150,13 +1262,61 @@
resultType = 'Function'
return resultType
+ def _zeroArgs(self, argsNames):
+ return 'JS("", "#.$NAME()", this)'
+
+ def _manyArgs(self, numberArgs, argsNames):
+ argsPound = "#" if numberArgs == 1 else ("#, " * numberArgs)[:-2]
+ return ' JS("", "#.$NAME(%s)", this, %s)' % (argsPound, argsNames)
+
+ def _promiseToFutureCode(self, argsNames):
+ numberArgs = argsNames.count(',') + 1
+ jsCall = self._zeroArgs(argsNames) if len(argsNames) == 0 else \
+ self._manyArgs(numberArgs, argsNames)
+
+ futureTemplate = [
+ '\n'
+ ' $RENAME$METADATA$MODIFIERS $TYPE $NAME($PARAMS) => $PROMISE_CALL(',
+ jsCall,
+ ');\n'
+ ]
+ return "".join(futureTemplate)
def _AddDirectNativeOperation(self, info, html_name):
force_optional = True if html_name.startswith('_') else False
-
resultType = self._computeResultType(info.type_name)
- self._members_emitter.Emit(
+ if info.type_name == 'Promise' and not(force_optional):
+ lookupOp = "%s.%s" % (self._interface.id, html_name)
+ promiseFound = _GetPromiseOperationType(lookupOp)
+ promiseType = 'Future'
+ promiseCall = 'promiseToFuture'
+ if promiseFound is not(None):
+ if 'maplike' in promiseFound:
+ promiseCall = 'promiseToFutureMap'
+ promiseType = 'Future'
+ elif promiseFound['type'] == 'dictionary':
+ # It's a dictionary so return as a Map.
+ promiseCall = 'promiseToFutureDictionary'
+ promiseType = 'Future<Map>'
+ else:
+ paramType = promiseFound['type']
+ promiseCall = 'promiseToFuture<%s>' % paramType
+ promiseType = 'Future<%s>' % paramType
+
+ argsNames = info.ParametersAsArgumentList()
+ codeTemplate = self._promiseToFutureCode(argsNames)
+ self._members_emitter.Emit(codeTemplate,
+ RENAME=self._RenamingAnnotation(info.declared_name, html_name),
+ METADATA=self._Metadata(info.type_name, info.declared_name,
+ self.SecureOutputType(info.type_name)),
+ MODIFIERS='static ' if info.IsStatic() else '',
+ TYPE=promiseType,
+ PROMISE_CALL=promiseCall,
+ NAME=html_name,
+ PARAMS=info.ParametersAsDeclaration(self._NarrowInputType, force_optional))
+ else:
+ self._members_emitter.Emit(
'\n'
' $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n',
RENAME=self._RenamingAnnotation(info.declared_name, html_name),
diff --git a/tools/dom/templates/dart2js_maplike_impl.darttemplate b/tools/dom/templates/dart2js_maplike_impl.darttemplate
new file mode 100644
index 0000000..c2f8f91
--- /dev/null
+++ b/tools/dom/templates/dart2js_maplike_impl.darttemplate
@@ -0,0 +1,67 @@
+// Copyright (c) 2012, 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.
+
+part of $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS$IMPLEMENTS {
+$!MEMBERS
+
+ Map _getItem($KEYTYPE key) =>
+ convertNativeToDart_Dictionary(JS('', '#.get(#)', this, key));
+
+ void addAll(Map<$KEYTYPE, $VALUETYPE> other) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ bool containsValue($VALUETYPE value) => values.any((e) => e == value);
+
+ bool containsKey($VALUETYPE key) => _getItem(key) != null;
+
+ Map operator []($VALUETYPE key) => _getItem(key);
+
+ void forEach(void f($KEYTYPE key, $VALUETYPE value)) {
+ var entries = JS('', '#.entries()', this);
+ while (true) {
+ var entry = JS('', '#.next()', entries);
+ if (JS('bool', '#.done', entry)) return;
+ f(JS('$KEYTYPE', '#.value[0]', entry),
+ convertNativeToDart_Dictionary(JS('', '#.value[1]', entry)));
+ }
+ }
+
+ Iterable<$KEYTYPE> get keys {
+ final keys = <$KEYTYPE>[];
+ forEach((k, v) => keys.add(k));
+ return keys;
+ }
+
+ Iterable<Map> get values {
+ final values = <Map>[];
+ forEach((k, v) => values.add(v));
+ return values;
+ }
+
+ int get length => JS('int', '#.size', this);
+
+ bool get isEmpty => length == 0;
+
+ bool get isNotEmpty => !isEmpty;
+
+ void operator []=($KEYTYPE key, $VALUETYPE value) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ dynamic putIfAbsent($KEYTYPE key, $VALUETYPE ifAbsent()) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ $KEYTYPE remove($VALUETYPE key) {
+ throw new UnsupportedError("Not supported");
+ }
+
+ void clear() {
+ throw new UnsupportedError("Not supported");
+ }
+}
diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index 2baac67..2f5c1e9 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -121,6 +121,45 @@
HtmlDocument get document =>
JS('returns:HtmlDocument;depends:none;effects:none;gvn:true', 'document');
+// Supoort to convert JS Promise to a Dart Future.
+Future<T> promiseToFuture<T>(thePromise) {
+ var completer = new Completer<T>();
+
+ var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
+ var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+ JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1), convertDartClosureToJS(thenErrorCode, 1));
+
+ return completer.future;
+}
+
+// Supoort to convert JS Promise to a Dart Future that returns a MapLike (Class with Map mixin).
+Future promiseToFutureMap(thePromise) {
+ var completer = new Completer();
+
+ var thenSuccessCode = (promiseValue) => completer.complete(promiseValue);
+ var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+ JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+ convertDartClosureToJS(thenErrorCode, 1));
+
+ return completer.future;
+}
+
+// Supoort to convert JS Promise to a Dart Future that returns a Dictionary as a Dart Map.
+Future<Map> promiseToFutureDictionary(thePromise) {
+ var completer = new Completer<Map>();
+
+ var thenSuccessCode = (promiseValue) =>
+ completer.complete(convertNativeToDart_Dictionary(promiseValue));
+ var thenErrorCode = (promiseError) => completer.completeError(promiseError);
+
+ JS("", "#.then(#, #)", thePromise, convertDartClosureToJS(thenSuccessCode, 1),
+ convertDartClosureToJS(thenErrorCode, 1));
+
+ return completer.future;
+}
+
// Workaround for tags like <cite> that lack their own Element subclass --
// Dart issue 1990.
@Native("HTMLElement")
@@ -147,4 +186,3 @@
@Experimental() // untriaged
typedef void FontFaceSetForEachCallback(
FontFace fontFace, FontFace fontFaceAgain, FontFaceSet set);
-
diff --git a/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate b/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate
index ae468155..c1ed25a 100644
--- a/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate
+++ b/tools/dom/templates/html/impl/impl_RTCPeerConnection.darttemplate
@@ -50,13 +50,6 @@
return completer.future;
}
- @DomName('RTCPeerConnection.getStats')
- Future<RtcStatsResponse> getStats(MediaStreamTrack selector) {
- var completer = new Completer<RtcStatsResponse>();
- _getStats((value) { completer.complete(value); }, selector);
- return completer.future;
- }
-
@DomName('RTCPeerConnection.generateCertificate')
@DocsEditable()
@Experimental() // untriaged
diff --git a/tools/testing/dart/pubspec.yaml b/tools/testing/dart/pubspec.yaml
index 0bcb25f..4ddbba8 100644
--- a/tools/testing/dart/pubspec.yaml
+++ b/tools/testing/dart/pubspec.yaml
@@ -4,3 +4,4 @@
# This file is only here that so certain Dart editors recognize this is a Dart
# project.
+name: testing_tools
diff --git a/utils/application_snapshot.gni b/utils/application_snapshot.gni
index 096b944..3630bee 100644
--- a/utils/application_snapshot.gni
+++ b/utils/application_snapshot.gni
@@ -15,6 +15,37 @@
}
}
+# Creates an app-jit snapshot for a Dart program based on a training run.
+#
+# Parameters:
+# main_dart (required):
+# The entrypoint to the Dart application.
+#
+# training_args (required):
+# Arguments to pass to the Dart application for the training run.
+#
+# dart_version (optional):
+# Must be 1 or 2. Defaults to 1.
+#
+# vm_args (optional):
+# Additional arguments to the Dart VM. Do not put --preview-dart-2 here.
+# Instead set dart_version = 2.
+#
+# name (optional):
+# The name of the snapshot if different from the target name. The output
+# will be in $root_gen_dir/$name.dart.snapshot.
+#
+# extra_deps (optional):
+# Any additional build dependencies.
+#
+# extra_inputs (optional):
+# Any extra build inputs.
+#
+# dot_packages (optional):
+# The .packages file for the app. Defaults to the $_dart_root/.packages.
+#
+# output (optional):
+# Overrides the full output path.
template("application_snapshot") {
assert(defined(invoker.main_dart), "Must specify 'main_dart'")
assert(defined(invoker.training_args), "Must specify 'training_args'")
@@ -45,8 +76,25 @@
if (defined(invoker.output)) {
output = invoker.output
}
+ dart_version = 1
+ if (defined(invoker.dart_version)) {
+ dart_version = invoker.dart_version
+ }
+ assert(dart_version == 1 || dart_version == 2,
+ "For $target_name, dart_version must be 1 or 2")
dart_action(target_name) {
deps = extra_deps
+
+ if (dart_version == 2) {
+ # HACK: When creating app-jit snapshots for Dart 2 apps, the standalone
+ # Dart VM binary requires the app-jit snapshot for the kernel service to
+ # be adjacent to it. This deps ensures that it is there, but a different
+ # approach will be needed when the kernel service itself switches to
+ # Dart 2 to avoid creating a circular dependence.
+ deps += [ "$_dart_root/utils/kernel-service:copy_kernel_service_snapshot"]
+ snapshot_vm_args += [ "--preview-dart-2" ]
+ }
+
depfile = "$output.d"
script = main_dart
diff --git a/utils/bazel/kernel_summary_worker.dart b/utils/bazel/kernel_summary_worker.dart
index c572e88..2b1246b 100644
--- a/utils/bazel/kernel_summary_worker.dart
+++ b/utils/bazel/kernel_summary_worker.dart
@@ -14,8 +14,8 @@
import 'package:args/args.dart';
import 'package:bazel_worker/bazel_worker.dart';
+import 'package:build_integration/file_system/multi_root.dart';
import 'package:front_end/src/api_unstable/summary_worker.dart' as fe;
-import 'package:front_end/src/multi_root_file_system.dart';
import 'package:kernel/ast.dart' show Component, Library;
import 'package:kernel/target/targets.dart';
diff --git a/utils/dartanalyzer/BUILD.gn b/utils/dartanalyzer/BUILD.gn
index e41c7f6..ff06c7b 100644
--- a/utils/dartanalyzer/BUILD.gn
+++ b/utils/dartanalyzer/BUILD.gn
@@ -21,6 +21,7 @@
"list lines")
application_snapshot("generate_dartanalyzer_snapshot") {
+ dart_version = 2
main_dart = "../../pkg/analyzer_cli/bin/analyzer.dart"
training_args = [
"--dart-sdk=" + rebase_path("../../sdk"),
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 0c5c4e2..6165c85 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -11,9 +11,7 @@
sdk_dill = "$target_gen_dir/kernel/ddc_sdk.dill"
application_snapshot("dartdevc") {
- vm_args = [
- "--preview-dart-2",
- ]
+ dart_version = 2
main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart"
diff --git a/utils/pub/BUILD.gn b/utils/pub/BUILD.gn
index f34a69a..0adf27a 100644
--- a/utils/pub/BUILD.gn
+++ b/utils/pub/BUILD.gn
@@ -10,9 +10,7 @@
}
application_snapshot("pub2") {
+ dart_version = 2
main_dart = "../../third_party/pkg/pub/bin/pub.dart"
training_args = [ "--help" ]
- vm_args = [
- "--preview-dart-2",
- ]
}