Version 2.6.0-dev.5.0
Merge commit '5c106e3098bb64139e6c91cd5a57b82bbe662111' into dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ec7b523..81f49ec 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -31,16 +31,20 @@
#### Linter
-The Linter was updated to `0.1.98`, which includes:
+The Linter was updated to `0.1.99`, which includes:
-* fixed null raw expression accesses in `use_to_and_as_if_applicable`
-* internal migration to using analyzer `InheritanceManager3`
-* internal migration away from using analyzer `resolutionMap`
-* various fixes and improvements to anticipate support for extension-methods
-* new lint: `camel_case_extensions`
-* rule template generation improvements
-* new lint: `avoid_equals_and_hash_code_on_mutable_classes`
-* extended `avoid_slow_async_io` to flag async `Directory` methods
+* fixed unsafe casts in `overridden_fields`
+* (internal) migration to the mock SDK in `package:analyzer` for testing
+* fixed empty argument list access in `use_full_hex_values_for_flutter_color_fix`
+* new lint: `prefer_relative_imports`
+* improved messages for `await_only_futures`
+
+## 2.5.1 - 2019-09-27
+
+This is a patch release that prevents type inference failures in the analyzer
+(Issue [38365][]).
+
+[38365]: https://github.com/dart-lang/sdk/issues/38365
## 2.5.0 - 2019-09-10
diff --git a/DEPS b/DEPS
index 60b6900..3090e38 100644
--- a/DEPS
+++ b/DEPS
@@ -99,7 +99,7 @@
"intl_tag": "0.15.7",
"jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
"json_rpc_2_tag": "2.0.9",
- "linter_tag": "0.1.98",
+ "linter_tag": "0.1.99",
"logging_tag": "0.11.3+2",
"markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
"markdown_tag": "2.1.1",
@@ -136,7 +136,7 @@
"test_descriptor_tag": "1.1.1",
"test_process_tag": "1.0.3",
"term_glyph_tag": "1.0.1",
- "test_reflective_loader_tag": "0.1.8",
+ "test_reflective_loader_tag": "0.1.9",
"test_tag": "test-v1.6.4",
"tflite_native_rev": "06e533a9747306d1114c53427cc67eda080f51f9",
"typed_data_tag": "1.1.6",
@@ -174,7 +174,7 @@
Var("dart_root") + "/tools/sdks": {
"packages": [{
"package": "dart/dart-sdk/${{platform}}",
- "version": "version:2.6.0-dev.3.0",
+ "version": "version:2.6.0-dev.4.0",
}],
"dep_type": "cipd",
},
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index abfe139..b7a443f 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -216,18 +216,25 @@
return []
local_root = input_api.change.RepositoryRoot()
- layering_check = imp.load_source(
- 'layering_check',
- os.path.join(local_root, 'runtime', 'tools', 'layering_check.py'))
- errors = layering_check.DoCheck(local_root)
+ compiler_layering_check = imp.load_source(
+ 'compiler_layering_check',
+ os.path.join(local_root, 'runtime', 'tools',
+ 'compiler_layering_check.py'))
+ errors = compiler_layering_check.DoCheck(local_root)
+ embedder_layering_check = imp.load_source(
+ 'embedder_layering_check',
+ os.path.join(local_root, 'runtime', 'tools',
+ 'embedder_layering_check.py'))
+ errors += embedder_layering_check.DoCheck(local_root)
if errors:
return [
output_api.PresubmitError(
'Layering check violation for C++ sources.',
long_text='\n'.join(errors))
]
- else:
- return []
+
+ return []
+
def _CheckClangTidy(input_api, output_api):
"""Run clang-tidy on VM changes."""
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index 109e3fc..e5254c7 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -130,6 +130,10 @@
# Compile for Thread Sanitizer to find threading bugs.
is_tsan = false
+
+ # Whether to use the NNBD fork of the SDK core libraries.
+ # TODO(rnystrom): Remove this when the fork has been merged back in.
+ use_nnbd = false
}
# =============================================================================
diff --git a/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart b/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
index ef4751b..0b33895 100644
--- a/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
@@ -6,12 +6,13 @@
import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
import 'package:analysis_server/src/edit/fix/dartfix_registrar.dart';
import 'package:analysis_server/src/edit/fix/fix_code_task.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/highlight_css.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/highlight_js.dart';
import 'package:analysis_server/src/edit/nnbd_migration/info_builder.dart';
import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_listener.dart';
import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_renderer.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/highlight_js.dart';
-import 'package:analysis_server/src/edit/nnbd_migration/highlight_css.dart';
import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/file_system/file_system.dart';
@@ -216,30 +217,46 @@
/// Generate output into the given [folder].
void _generateOutput(OverlayResourceProvider provider, Folder folder) async {
- List<LibraryInfo> libraryInfos =
- await InfoBuilder(instrumentationListener.data, listener)
- .explainMigration();
+ // Remove any previously generated output.
+ folder.getChildren().forEach((resource) => resource.delete());
+ // Gather the data needed in order to produce the output.
+ InfoBuilder infoBuilder =
+ InfoBuilder(instrumentationListener.data, listener);
+ List<UnitInfo> unitInfos = await infoBuilder.explainMigration();
var pathContext = provider.pathContext;
MigrationInfo migrationInfo =
- MigrationInfo(libraryInfos, pathContext, includedRoot);
- for (LibraryInfo info in libraryInfos) {
- assert(info.units.isNotEmpty);
- String libraryPath =
- pathContext.setExtension(info.units.first.path, '.html');
- String relativePath =
- pathContext.relative(libraryPath, from: includedRoot);
- List<String> directories =
- pathContext.split(pathContext.dirname(relativePath));
- for (int i = 0; i < directories.length; i++) {
- String directory = pathContext.joinAll(directories.sublist(0, i + 1));
- folder.getChildAssumingFolder(directory).create();
- }
- File output =
- provider.getFile(pathContext.join(folder.path, relativePath));
- String rendered = InstrumentationRenderer(info, migrationInfo).render();
+ MigrationInfo(unitInfos, pathContext, includedRoot);
+ PathMapper pathMapper = PathMapper(provider, folder.path, includedRoot);
+
+ /// Produce output for the compilation unit represented by the [unitInfo].
+ void render(UnitInfo unitInfo) {
+ File output = provider.getFile(pathMapper.map(unitInfo.path));
+ output.parent.create();
+ String rendered =
+ InstrumentationRenderer(unitInfo, migrationInfo, pathMapper).render();
output.writeAsStringSync(rendered);
}
- // Generate resource files:
+
+ // Generate the files in the package being migrated.
+ for (UnitInfo unitInfo in unitInfos) {
+ render(unitInfo);
+ }
+ // Generate other dart files.
+ for (UnitInfo unitInfo in infoBuilder.unitMap.values) {
+ if (!unitInfos.contains(unitInfo)) {
+ if (unitInfo.content == null) {
+ try {
+ unitInfo.content =
+ provider.getFile(unitInfo.path).readAsStringSync();
+ } catch (_) {
+ // If we can't read the content of the file, then skip it.
+ continue;
+ }
+ }
+ render(unitInfo);
+ }
+ }
+ // Generate resource files.
File highlightJsOutput =
provider.getFile(pathContext.join(folder.path, 'highlight.pack.js'));
highlightJsOutput.writeAsStringSync(decodeHighlightJs());
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
index 694a210..950e06f 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/info_builder.dart
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_information.dart';
import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
@@ -10,9 +11,12 @@
import 'package:analyzer/dart/analysis/results.dart';
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/generated/source.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart'
show Location, SourceEdit, SourceFileEdit;
+import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol;
+import 'package:analyzer_plugin/src/utilities/navigation/navigation.dart';
import 'package:nnbd_migration/instrumentation.dart';
import 'package:nnbd_migration/nnbd_migration.dart';
@@ -48,20 +52,60 @@
/// Return the migration information for all of the libraries that were
/// migrated.
- Future<List<LibraryInfo>> explainMigration() async {
- Map<Source, SourceInformation> sourceInfo = info.sourceInformation;
- List<LibraryInfo> libraries = [];
- for (Source source in sourceInfo.keys) {
+ Future<List<UnitInfo>> explainMigration() async {
+ Map<Source, SourceInformation> sourceInfoMap = info.sourceInformation;
+ List<UnitInfo> units = [];
+ for (Source source in sourceInfoMap.keys) {
String filePath = source.fullName;
AnalysisSession session =
server.getAnalysisDriver(filePath).currentSession;
if (!session.getFile(filePath).isPart) {
- ParsedLibraryResult result = await session.getParsedLibrary(filePath);
- libraries
- .add(_explainLibrary(result, info, sourceInfo[source], listener));
+ ResolvedLibraryResult result =
+ await session.getResolvedLibrary(filePath);
+ SourceInformation sourceInfo = sourceInfoMap[source];
+ for (ResolvedUnitResult unitResult in result.units) {
+ SourceFileEdit edit =
+ listener.sourceChange.getFileEdit(unitResult.path);
+ units.add(_explainUnit(sourceInfo, unitResult, edit));
+ }
}
}
- return libraries;
+ return units;
+ }
+
+ /// Return details for a fix built from the given [edge], or `null` if the
+ /// edge does not have an origin.
+ String _buildDescriptionForDestination(AstNode node) {
+ // Other found types:
+ // - ConstructorDeclaration
+ if (node.parent is FormalParameterList) {
+ return "A nullable value can't be passed as an argument";
+ } else {
+ return "A nullable value can't be used here";
+ }
+ }
+
+ /// Return details for a fix built from the given [edge], or `null` if the
+ /// edge does not have an origin.
+ String _buildDescriptionForOrigin(AstNode node) {
+ String /*!*/ description;
+ if (node.parent is ArgumentList) {
+ if (node is NullLiteral) {
+ description = "An explicit 'null' is passed as an argument";
+ } else {
+ description = "A nullable value is explicitly passed as an argument";
+ }
+ } else {
+ if (node is NullLiteral) {
+ description = "An explicit 'null' is assigned";
+ } else {
+ description = "A nullable value is assigned";
+ }
+ }
+ if (_inTestCode(node)) {
+ description += " in test code";
+ }
+ return description;
}
/// Compute the details for the fix with the given [fixInfo].
@@ -70,28 +114,26 @@
for (FixReasonInfo reason in fixInfo.reasons) {
if (reason is NullabilityNodeInfo) {
for (EdgeInfo edge in reason.upstreamEdges) {
- EdgeOriginInfo origin = info.edgeOrigin[edge];
- if (origin != null) {
- AstNode node = origin.node;
- if (node.parent is ArgumentList) {
- if (node is NullLiteral) {
- details.add(RegionDetail(
- 'null is explicitly passed as an argument.',
- _targetFor(origin)));
- } else {
- details.add(RegionDetail(
- 'A nullable value is explicitly passed as an argument.',
- _targetFor(origin)));
- }
- } else {
- details.add(RegionDetail(
- 'A nullable value is assigned.', _targetFor(origin)));
+ if (edge.isTriggered) {
+ EdgeOriginInfo origin = info.edgeOrigin[edge];
+ if (origin != null) {
+ // TODO(brianwilkerson) If the origin is an InheritanceOrigin then
+ // the node is the method declaration in the subclass and we want
+ // to link to the corresponding parameter in the declaration in
+ // the superclass.
+ details.add(RegionDetail(_buildDescriptionForOrigin(origin.node),
+ _targetForNode(origin.source.fullName, origin.node)));
}
}
}
} else if (reason is EdgeInfo) {
- // TODO(brianwilkerson) Implement this after finding an example whose
- // reason is an edge.
+ NullabilityNodeInfo destination = reason.destinationNode;
+ var nodeInfo = info.nodeInfoFor(destination);
+ if (nodeInfo != null) {
+ details.add(RegionDetail(
+ _buildDescriptionForDestination(nodeInfo.astNode),
+ _targetForNode(nodeInfo.filePath, nodeInfo.astNode)));
+ }
} else {
throw UnimplementedError(
'Unexpected class of reason: ${reason.runtimeType}');
@@ -100,24 +142,41 @@
return details;
}
- /// Return the migration information for the given library.
- LibraryInfo _explainLibrary(
- ParsedLibraryResult result,
- InstrumentationInformation info,
- SourceInformation sourceInfo,
- DartFixListener listener) {
- List<UnitInfo> units = [];
- for (ParsedUnitResult unit in result.units) {
- SourceFileEdit edit = listener.sourceChange.getFileEdit(unit.path);
- units.add(_explainUnit(sourceInfo, unit, edit));
- }
- return LibraryInfo(units);
+ /// Return the navigation sources for the unit associated with the [result].
+ List<NavigationSource> _computeNavigationSources(ResolvedUnitResult result) {
+ NavigationCollectorImpl collector = new NavigationCollectorImpl();
+ computeDartNavigation(
+ result.session.resourceProvider, collector, result.unit, null, null);
+ collector.createRegions();
+ List<String> files = collector.files;
+ List<protocol.NavigationRegion> regions = collector.regions;
+ List<protocol.NavigationTarget> rawTargets = collector.targets;
+ List<NavigationTarget> convertedTargets =
+ List<NavigationTarget>(rawTargets.length);
+ return regions.map((region) {
+ List<int> targets = region.targets;
+ if (targets.isEmpty) {
+ throw StateError('Targets is empty');
+ }
+ NavigationTarget target = convertedTargets[targets[0]];
+ if (target == null) {
+ protocol.NavigationTarget rawTarget = rawTargets[targets[0]];
+ target = _targetFor(
+ files[rawTarget.fileIndex], rawTarget.offset, rawTarget.length);
+ convertedTargets[targets[0]] = target;
+ }
+ return NavigationSource(region.offset, region.length, target);
+ }).toList();
}
- /// Return the migration information for the given unit.
- UnitInfo _explainUnit(SourceInformation sourceInfo, ParsedUnitResult result,
+ /// Return the migration information for the unit associated with the
+ /// [result].
+ UnitInfo _explainUnit(SourceInformation sourceInfo, ResolvedUnitResult result,
SourceFileEdit fileEdit) {
UnitInfo unitInfo = _unitForPath(result.path);
+ if (unitInfo.sources == null) {
+ unitInfo.sources = _computeNavigationSources(result);
+ }
String content = result.content;
// [fileEdit] is null when a file has no edits.
if (fileEdit != null) {
@@ -166,17 +225,35 @@
return null;
}
- /// Return the navigation target corresponding to the given [origin].
- NavigationTarget _targetFor(EdgeOriginInfo origin) {
- AstNode node = origin.node;
- String filePath = origin.source.fullName;
+ /// Return `true` if the given [node] is from a compilation unit within the
+ /// 'test' directory of the package.
+ bool _inTestCode(AstNode node) {
+ // TODO(brianwilkerson) Generalize this.
+ CompilationUnit unit = node.thisOrAncestorOfType<CompilationUnit>();
+ CompilationUnitElement unitElement = unit?.declaredElement;
+ if (unitElement == null) {
+ return false;
+ }
+ String filePath = unitElement.source.fullName;
+ var resourceProvider = unitElement.session.resourceProvider;
+ return resourceProvider.pathContext.split(filePath).contains('test');
+ }
+
+ /// Return the navigation target in the file with the given [filePath] at the
+ /// given [offset] ans with the given [length].
+ NavigationTarget _targetFor(String filePath, int offset, int length) {
UnitInfo unitInfo = _unitForPath(filePath);
- NavigationTarget target =
- NavigationTarget(filePath, node.offset, node.length);
+ NavigationTarget target = NavigationTarget(filePath, offset, length);
unitInfo.targets.add(target);
return target;
}
+ /// Return the navigation target corresponding to the given [node] in the file
+ /// with the given [filePath].
+ NavigationTarget _targetForNode(String filePath, AstNode node) {
+ return _targetFor(filePath, node.offset, node.length);
+ }
+
/// Return the unit info for the file at the given [path].
UnitInfo _unitForPath(String path) {
return unitMap.putIfAbsent(path, () => UnitInfo(path));
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_information.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_information.dart
index 1e60891..e1b1938 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_information.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_information.dart
@@ -34,6 +34,55 @@
/// Initialize a newly created holder of instrumentation information.
InstrumentationInformation();
+
+ /// Return information about the given [node].
+ NodeInformation nodeInfoFor(NullabilityNodeInfo node) {
+ for (MapEntry<Source, SourceInformation> sourceEntry
+ in sourceInformation.entries) {
+ SourceInformation sourceInfo = sourceEntry.value;
+ for (MapEntry<AstNode, DecoratedTypeInfo> entry
+ in sourceInfo.implicitReturnType.entries) {
+ if (entry.value.node == node) {
+ return NodeInformation(
+ sourceEntry.key.fullName, entry.key, entry.value);
+ }
+ }
+ for (MapEntry<AstNode, DecoratedTypeInfo> entry
+ in sourceInfo.implicitType.entries) {
+ if (entry.value.node == node) {
+ return NodeInformation(
+ sourceEntry.key.fullName, entry.key, entry.value);
+ }
+ }
+ for (MapEntry<AstNode, List<DecoratedTypeInfo>> entry
+ in sourceInfo.implicitTypeArguments.entries) {
+ for (var type in entry.value) {
+ if (type.node == node) {
+ return NodeInformation(sourceEntry.key.fullName, entry.key, type);
+ }
+ }
+ }
+ }
+ // The loop below doesn't help because we still don't have access to an AST
+ // node.
+// for (MapEntry<Element, DecoratedTypeInfo> entry in externalDecoratedType.entries) {
+// if (entry.value.node == node) {
+// return NodeInformation(null, null, entry.value);
+// }
+// }
+ return null;
+ }
+}
+
+/// The instrumentation information about a [NullabilityNodeInfo].
+class NodeInformation {
+ final String filePath;
+
+ final AstNode astNode;
+
+ final DecoratedTypeInfo decoratedType;
+
+ NodeInformation(this.filePath, this.astNode, this.decoratedType);
}
/// The instrumentation information gathered from the migration engine that is
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart
index 6735746..7e3812a 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/instrumentation_renderer.dart
@@ -1,137 +1,45 @@
+// Copyright (c) 2019, 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:analysis_server/src/edit/nnbd_migration/migration_info.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/offset_mapper.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
import 'package:meta/meta.dart';
import 'package:mustache/mustache.dart' as mustache;
import 'package:path/path.dart' as path;
-/// Instrumentation display output for a library that was migrated to use
-/// non-nullable types.
-class InstrumentationRenderer {
- /// Display information for a library.
- final LibraryInfo libraryInfo;
-
- /// Information for a whole migration, so that libraries can reference each
- /// other.
- final MigrationInfo migrationInfo;
-
- /// Creates an output object for the given library info.
- InstrumentationRenderer(this.libraryInfo, this.migrationInfo);
-
- /// Builds an HTML view of the instrumentation information in [libraryInfo].
- String render() {
- int previousIndex = 0;
- Map<String, dynamic> mustacheContext = {
- 'units': <Map<String, dynamic>>[],
- 'links': migrationInfo.libraryLinks(libraryInfo),
- 'highlightJsPath': migrationInfo.highlightJsPath(libraryInfo),
- 'highlightStylePath': migrationInfo.highlightStylePath(libraryInfo),
- };
- for (var compilationUnit in libraryInfo.units) {
- // List of Mustache context for both unmodified and modified regions:
- //
- // * 'modified': Whether this region represents modified source, or
- // unmodified.
- // * 'content': The textual content of this region.
- // * 'explanation': The textual explanation of why the content in this
- // region was modified. It will appear in a "tooltip" on hover.
- // TODO(srawlins): Support some sort of HTML explanation, with
- // hyperlinks to anchors in other source code.
- List<Map> regions = [];
- for (var region in compilationUnit.regions) {
- if (region.offset > previousIndex) {
- // Display a region of unmodified content.
- regions.add({
- 'modified': false,
- 'content':
- compilationUnit.content.substring(previousIndex, region.offset)
- });
- previousIndex = region.offset + region.length;
- }
- regions.add({
- 'modified': true,
- 'content': compilationUnit.content
- .substring(region.offset, region.offset + region.length),
- 'explanation': region.explanation,
- });
- }
- if (previousIndex < compilationUnit.content.length) {
- // Last region of unmodified content.
- regions.add({
- 'modified': false,
- 'content': compilationUnit.content.substring(previousIndex)
- });
- }
- mustacheContext['units']
- .add({'path': compilationUnit.path, 'regions': regions});
- }
- return _template.renderString(mustacheContext);
- }
-}
-
-/// A class storing rendering information for an entire migration report.
-///
-/// This generally provides one [InstrumentationRenderer] (for one library)
-/// with information about the rest of the libraries represented in the
-/// instrumentation output.
-class MigrationInfo {
- /// The information about the libraries that are are migrated.
- final List<LibraryInfo> libraries;
-
- /// The resource provider's path context.
- final path.Context pathContext;
-
- /// The filesystem root used to create relative paths for each unit.
- final String includedRoot;
-
- MigrationInfo(this.libraries, this.pathContext, this.includedRoot);
-
- /// Generate mustache context for library links, for navigation in the
- /// instrumentation document for [thisLibrary].
- List<Map<String, Object>> libraryLinks(LibraryInfo thisLibrary) {
- return [
- for (var library in libraries)
- {
- 'name': _computeName(library),
- 'isLink': library != thisLibrary,
- if (library != thisLibrary)
- 'href': _pathTo(library, source: thisLibrary)
- }
- ];
- }
-
- /// Return the path to [library] from [includedRoot], to be used as a display
- /// name for a library.
- String _computeName(LibraryInfo library) =>
- pathContext.relative(library.units.first.path, from: includedRoot);
-
- /// The path to [target], relative to [from].
- String _pathTo(LibraryInfo target, {@required LibraryInfo source}) {
- assert(target.units.isNotEmpty);
- assert(source.units.isNotEmpty);
- String targetPath =
- pathContext.setExtension(target.units.first.path, '.html');
- String sourceDir = pathContext.dirname(source.units.first.path);
- return pathContext.relative(targetPath, from: sourceDir);
- }
-
- /// The path to the highlight.js script, relative to [libraryInfo].
- String highlightJsPath(LibraryInfo libraryInfo) =>
- pathContext.relative(pathContext.join(includedRoot, 'highlight.pack.js'),
- from: pathContext.dirname(libraryInfo.units.first.path));
-
- /// The path to the highlight.js stylesheet, relative to [libraryInfo].
- String highlightStylePath(LibraryInfo libraryInfo) =>
- pathContext.relative(pathContext.join(includedRoot, 'androidstudio.css'),
- from: pathContext.dirname(libraryInfo.units.first.path));
-}
-
/// A mustache template for one library's instrumentation output.
mustache.Template _template = mustache.Template(r'''
<html>
<head>
<title>Non-nullable fix instrumentation report</title>
- <script src="{{ highlightJsPath }}"></script>
+<!-- <script src="{{ highlightJsPath }}"></script>-->
+ <script>
+ function highlightTarget() {
+ var url = document.URL;
+ var index = url.lastIndexOf("#");
+ if (index >= 0) {
+ var name = url.substring(index + 1);
+ var anchor = document.getElementById(name);
+ if (anchor != null) {
+ anchor.className = "target";
+ }
+ }
+ }
+ </script>
<link rel="stylesheet" href="{{ highlightStylePath }}">
<style>
+a:link {
+ color: #000000;
+ text-decoration-line: none;
+}
+
+a:visited {
+ color: #000000;
+ text-decoration-line: none;
+}
+
body {
font-family: sans-serif;
padding: 1em;
@@ -142,6 +50,12 @@
font-weight: bold;
}
+.code {
+ position: absolute;
+ left: 0.5em;
+ top: 0.5em;
+}
+
.content {
font-family: monospace;
position: relative;
@@ -181,16 +95,22 @@
top: 100%;
visibility: hidden;
white-space: normal;
- width: 200px;
+ width: 400px;
z-index: 1;
}
.region:hover .tooltip {
visibility: visible;
}
+
+.target {
+ background-color: #FFFFFF;
+ position: relative;
+ visibility: visible;
+}
</style>
</head>
- <body>
+ <body onload="highlightTarget()">
<h1>Non-nullable fix instrumentation report</h1>
<p><em>Well-written introduction to this report.</em></p>
<div class="navigation">
@@ -203,20 +123,30 @@
{{# units }}'''
'<h2>{{{ path }}}</h2>'
'<div class="content">'
- '<div class="highlighting">'
- '{{! These regions are written out, unmodified, as they need to be found }}'
- '{{! in one simple text string for highlight.js to hightlight them. }}'
- '{{# regions }}'
- '{{ content }}'
- '{{/ regions }}'
+// '<div class="highlighting">'
+// '{{! These regions are written out, unmodified, as they need to be found }}'
+// '{{! in one simple text string for highlight.js to hightlight them. }}'
+// '{{# regions }}'
+// '{{ content }}'
+// '{{/ regions }}'
+// '</div>'
+ '<div class ="code">'
+ '{{! Write the file content, modified to include navigation information, }}'
+ '{{! both anchors and links. }}'
+ '{{{ navContent }}}'
'</div>'
'<div class="regions">'
- '{{! The regions are then printed again, overlaying the first copy of the }}'
- '{{! content, to provide tooltips for modified regions. }}'
+ '{{! The regions are then written again, overlaying the first two copies }}'
+ '{{! of the content, to provide tooltips for modified regions. }}'
'{{# regions }}'
'{{^ modified }}{{ content }}{{/ modified }}'
'{{# modified }}<span class="region">{{ content }}'
- '<span class="tooltip">{{explanation}}</span></span>{{/ modified }}'
+ '<span class="tooltip">{{ explanation }}<ul>'
+ '{{# details }}'
+ '<li>'
+ '<a href="{{ target }}">{{ description }}</a>'
+ '</li>'
+ '{{/ details }}</ul></span></span>{{/ modified }}'
'{{/ regions }}'
'</div></div>'
r'''
@@ -230,3 +160,217 @@
</script>
</body>
</html>''');
+
+/// Instrumentation display output for a library that was migrated to use
+/// non-nullable types.
+class InstrumentationRenderer {
+ /// Display information for a compilation unit.
+ final UnitInfo unitInfo;
+
+ /// Information for a whole migration, so that libraries can reference each
+ /// other.
+ final MigrationInfo migrationInfo;
+
+ /// An object used to map the file paths of analyzed files to the file paths
+ /// of the HTML files used to view the content of those files.
+ final PathMapper pathMapper;
+
+ /// Creates an output object for the given library info.
+ InstrumentationRenderer(this.unitInfo, this.migrationInfo, this.pathMapper);
+
+ /// Builds an HTML view of the instrumentation information in [unitInfo].
+ String render() {
+ Map<String, dynamic> mustacheContext = {
+ 'units': <Map<String, dynamic>>[],
+ 'links': migrationInfo.unitLinks(unitInfo),
+ 'highlightJsPath': migrationInfo.highlightJsPath(unitInfo),
+ 'highlightStylePath': migrationInfo.highlightStylePath(unitInfo),
+ 'navContent': _computeNavigationContent(unitInfo),
+ };
+ mustacheContext['units'].add({
+ 'path': unitInfo.path,
+ 'regions': _computeRegions(unitInfo),
+ });
+ return _template.renderString(mustacheContext);
+ }
+
+ /// Return the content of the file with navigation links and anchors added.
+ String _computeNavigationContent(UnitInfo unitInfo) {
+ String content = unitInfo.content;
+ OffsetMapper mapper = unitInfo.offsetMapper;
+ List<NavigationRegion> regions = []
+ ..addAll(unitInfo.sources ?? <NavigationSource>[])
+ ..addAll(unitInfo.targets);
+ regions.sort((first, second) {
+ int offsetComparison = first.offset.compareTo(second.offset);
+ if (offsetComparison == 0) {
+ return first is NavigationSource ? -1 : 1;
+ }
+ return offsetComparison;
+ });
+
+ StringBuffer navContent = StringBuffer();
+ int previousOffset = 0;
+ for (int i = 0; i < regions.length; i++) {
+ NavigationRegion region = regions[i];
+ int offset = mapper.map(region.offset);
+ int length = region.length;
+ if (offset > previousOffset) {
+ // Write a non-target region.
+ navContent.write(content.substring(previousOffset, offset));
+ if (region is NavigationSource) {
+ if (i + 1 < regions.length &&
+ regions[i + 1].offset == region.offset) {
+ NavigationTarget target = region.target;
+ if (target == regions[i + 1]) {
+ // Add a target region. We skip the source because it links to
+ // itself, which is pointless.
+ navContent.write('<a id="o${region.offset}">');
+ navContent.write(content.substring(offset, offset + length));
+ navContent.write('</a>');
+ } else {
+ // Add a source and target region.
+ // TODO(brianwilkerson) Map the target's file path to the path of
+ // the corresponding html file. I'd like to do this by adding a
+ // `FilePathMapper` object so that it can't become inconsistent
+ // with the code used to decide where to write the html.
+ String htmlPath = pathMapper.map(target.filePath);
+ navContent.write('<a id="o${region.offset}" ');
+ navContent.write('href="$htmlPath#o${target.offset}">');
+ navContent.write(content.substring(offset, offset + length));
+ navContent.write('</a>');
+ }
+ i++;
+ } else {
+ // Add a source region.
+ NavigationTarget target = region.target;
+ String htmlPath = pathMapper.map(target.filePath);
+ navContent.write('<a href="$htmlPath#o${target.offset}">');
+ navContent.write(content.substring(offset, offset + length));
+ navContent.write('</a>');
+ }
+ } else {
+ // Add a target region.
+ navContent.write('<a id="o${region.offset}">');
+ navContent.write(content.substring(offset, offset + length));
+ navContent.write('</a>');
+ }
+ previousOffset = offset + length;
+ }
+ }
+ if (previousOffset < content.length) {
+ // Last non-target region.
+ navContent.write(content.substring(previousOffset));
+ }
+ return navContent.toString();
+ }
+
+ /// Return a list of Mustache context, based on the [unitInfo] for both
+ /// unmodified and modified regions:
+ ///
+ /// * 'modified': Whether this region represents modified source, or
+ /// unmodified.
+ /// * 'content': The textual content of this region.
+ /// * 'explanation': The Mustache context for the tooltip explaining why the
+ /// content in this region was modified.
+ List<Map> _computeRegions(UnitInfo unitInfo) {
+ String content = unitInfo.content;
+ List<Map> regions = [];
+ int previousOffset = 0;
+ for (var region in unitInfo.regions) {
+ int offset = region.offset;
+ int length = region.length;
+ if (offset > previousOffset) {
+ // Display a region of unmodified content.
+ regions.add({
+ 'modified': false,
+ 'content': content.substring(previousOffset, offset),
+ });
+ previousOffset = offset + length;
+ }
+ List<Map> details = [];
+ for (var detail in region.details) {
+ details.add({
+ 'description': detail.description,
+ 'target': _uriForTarget(detail.target),
+ });
+ }
+ regions.add({
+ 'modified': true,
+ 'content': content.substring(offset, offset + length),
+ 'explanation': region.explanation,
+ 'details': details,
+ });
+ }
+ if (previousOffset < content.length) {
+ // Last region of unmodified content.
+ regions.add({
+ 'modified': false,
+ 'content': content.substring(previousOffset),
+ });
+ }
+ return regions;
+ }
+
+ /// Return the URL that will navigate to the given [target].
+ String _uriForTarget(NavigationTarget target) {
+ path.Context pathContext = migrationInfo.pathContext;
+ String targetPath = pathContext.setExtension(target.filePath, '.html');
+ String sourceDir = pathContext.dirname(unitInfo.path);
+ String relativePath = pathContext.relative(targetPath, from: sourceDir);
+ return '$relativePath#o${target.offset.toString()}';
+ }
+}
+
+/// A class storing rendering information for an entire migration report.
+///
+/// This generally provides one [InstrumentationRenderer] (for one library)
+/// with information about the rest of the libraries represented in the
+/// instrumentation output.
+class MigrationInfo {
+ /// The information about the compilation units that are are migrated.
+ final List<UnitInfo> units;
+
+ /// The resource provider's path context.
+ final path.Context pathContext;
+
+ /// The filesystem root used to create relative paths for each unit.
+ final String includedRoot;
+
+ MigrationInfo(this.units, this.pathContext, this.includedRoot);
+
+ /// The path to the highlight.js script, relative to [unitInfo].
+ String highlightJsPath(UnitInfo unitInfo) =>
+ pathContext.relative(pathContext.join(includedRoot, 'highlight.pack.js'),
+ from: pathContext.dirname(unitInfo.path));
+
+ /// The path to the highlight.js stylesheet, relative to [unitInfo].
+ String highlightStylePath(UnitInfo unitInfo) =>
+ pathContext.relative(pathContext.join(includedRoot, 'androidstudio.css'),
+ from: pathContext.dirname(unitInfo.path));
+
+ /// Generate mustache context for unit links, for navigation in the
+ /// instrumentation document for [thisUnit].
+ List<Map<String, Object>> unitLinks(UnitInfo thisUnit) {
+ return [
+ for (var unit in units)
+ {
+ 'name': _computeName(unit),
+ 'isLink': unit != thisUnit,
+ if (unit != thisUnit) 'href': _pathTo(target: unit, source: thisUnit)
+ }
+ ];
+ }
+
+ /// Return the path to [unit] from [includedRoot], to be used as a display
+ /// name for a library.
+ String _computeName(UnitInfo unit) =>
+ pathContext.relative(unit.path, from: includedRoot);
+
+ /// The path to [target], relative to [from].
+ String _pathTo({@required UnitInfo target, @required UnitInfo source}) {
+ String targetPath = pathContext.setExtension(target.path, '.html');
+ String sourceDir = pathContext.dirname(source.path);
+ return pathContext.relative(targetPath, from: sourceDir);
+ }
+}
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
index 7a66011..57f6002 100644
--- a/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/migration_info.dart
@@ -15,19 +15,35 @@
LibraryInfo(this.units);
}
+/// A location from or to which a user might want to navigate.
+abstract class NavigationRegion {
+ /// The offset of the region.
+ final int offset;
+
+ /// The length of the region.
+ final int length;
+
+ /// Initialize a newly created link.
+ NavigationRegion(this.offset, this.length);
+}
+
+/// A location from which a user might want to navigate.
+class NavigationSource extends NavigationRegion {
+ /// The target to which the user should be navigated.
+ final NavigationTarget target;
+
+ /// Initialize a newly created link.
+ NavigationSource(int offset, int length, this.target) : super(offset, length);
+}
+
/// A location to which a user might want to navigate.
-class NavigationTarget {
+class NavigationTarget extends NavigationRegion {
/// The file containing the anchor.
final String filePath;
- /// The offset of the anchor.
- final int offset;
-
- /// The length of the anchor.
- final int length;
-
/// Initialize a newly created anchor.
- NavigationTarget(this.filePath, this.offset, this.length);
+ NavigationTarget(this.filePath, int offset, int length)
+ : super(offset, length);
@override
int get hashCode => JenkinsSmiHash.hash3(filePath.hashCode, offset, length);
@@ -85,6 +101,10 @@
/// them. The offsets in these regions are offsets into the post-edit content.
final List<RegionInfo> regions = [];
+ /// The navigation sources that are located in this file. The offsets in these
+ /// sources are offsets into the pre-edit content.
+ List<NavigationSource> sources;
+
/// The navigation targets that are located in this file. The offsets in these
/// targets are offsets into the pre-edit content.
final Set<NavigationTarget> targets = {};
diff --git a/pkg/analysis_server/lib/src/edit/nnbd_migration/path_mapper.dart b/pkg/analysis_server/lib/src/edit/nnbd_migration/path_mapper.dart
new file mode 100644
index 0000000..f6939c0
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/nnbd_migration/path_mapper.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2019, 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:analyzer/file_system/file_system.dart';
+import 'package:path/path.dart' as path;
+
+/// An object that can map the file paths of analyzed files to the file paths of
+/// the HTML files used to view the content of those files.
+class PathMapper {
+ /// The resource provider used to map paths.
+ ResourceProvider provider;
+
+ /// The absolute path of the folder that should contain all of the generated
+ /// HTML files.
+ final String outputFolder;
+
+ /// The root of the package containing the files being migrated.
+ final String packageRoot;
+
+ /// A table mapping the file paths of analyzed files to the file paths of the
+ /// HTML files used to view the content of those files.
+ final Map<String, String> pathMap = {};
+
+ /// The index to be used when creating the next synthetic file name.
+ int nextIndex = 1;
+
+ /// Initialize a newly created path mapper.
+ PathMapper(this.provider, this.outputFolder, this.packageRoot);
+
+ /// Return the path of the HTML file used to view the content of the analyzed
+ /// file with the given [path].
+ String map(String path) {
+ return pathMap.putIfAbsent(path, () => _computePathFor(path));
+ }
+
+ /// Return the path of the HTML file corresponding to the Dart file with the
+ /// given [path].
+ String _computePathFor(String filePath) {
+ path.Context context = provider.pathContext;
+ if (context.isWithin(packageRoot, filePath)) {
+ String packageParent = context.dirname(packageRoot);
+ String relative = context.relative(filePath, from: packageParent);
+ return context.join(
+ outputFolder, context.setExtension(relative, '.html'));
+ }
+ // TODO(brianwilkerson) Find a better mapping algorithm, that would produce
+ // a more readable URI. For example, have other packages and the sdk be
+ // parallel to the directory containing the files for the library being
+ // migrated.
+ return context.join(outputFolder, 'f${nextIndex++}.html');
+ }
+}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
index 3b1d28a..995aa40 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_initialize.dart
@@ -58,6 +58,10 @@
final renameOptionsSupport =
params.capabilities.textDocument?.rename?.prepareSupport ?? false;
+ final dynamicTextSyncRegistration = params
+ .capabilities.textDocument?.synchronization?.dynamicRegistration ??
+ false;
+
// When adding new capabilities to the server that may apply to specific file
// types, it's important to update
// [IntializedMessageHandler._performDynamicRegistration()] to notify
@@ -66,8 +70,13 @@
// requests where we have only partial support for some types).
server.capabilities = new ServerCapabilities(
Either2<TextDocumentSyncOptions, num>.t1(new TextDocumentSyncOptions(
- true,
- TextDocumentSyncKind.Incremental,
+ // The open/close and sync kind flags are registered dynamically if the
+ // client supports them, so these static registrations are based on whether
+ // the client supports dynamic registration.
+ dynamicTextSyncRegistration ? false : true,
+ dynamicTextSyncRegistration
+ ? TextDocumentSyncKind.None
+ : TextDocumentSyncKind.Incremental,
false,
false,
null,
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index 6c51810..efbaa0c 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -134,9 +134,7 @@
static const FLUTTER_MOVE_UP =
const AssistKind('dart.assist.flutter.move.up', 30, "Move widget up");
static const FLUTTER_REMOVE_WIDGET = const AssistKind(
- 'dart.assist.flutter.removeWidget',
- 30,
- "Replace widget with its children");
+ 'dart.assist.flutter.removeWidget', 30, "Remove this widget");
static const FLUTTER_SWAP_WITH_CHILD = const AssistKind(
'dart.assist.flutter.swap.withChild', 30, "Swap with child");
static const FLUTTER_SWAP_WITH_PARENT = const AssistKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/base_processor.dart b/pkg/analysis_server/lib/src/services/correction/base_processor.dart
index 32e627e..3c3870b 100644
--- a/pkg/analysis_server/lib/src/services/correction/base_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/base_processor.dart
@@ -65,6 +65,109 @@
(session.analysisContext.analysisOptions as AnalysisOptionsImpl)
.experimentStatus;
+ Future<ChangeBuilder> createBuilder_addDiagnosticPropertyReference() async {
+ final node = this.node;
+ if (node is! SimpleIdentifier) {
+ _coverageMarker();
+ return null;
+ }
+ SimpleIdentifier name = node;
+ final parent = node.parent;
+
+ DartType type;
+
+ // Getter.
+ if (parent is MethodDeclaration) {
+ MethodDeclaration methodDeclaration = parent;
+ var element = methodDeclaration.declaredElement;
+ if (element is PropertyAccessorElement) {
+ PropertyAccessorElement propertyAccessor = element;
+ type = propertyAccessor.returnType;
+ }
+ // Field.
+ } else if (parent is VariableDeclaration) {
+ VariableDeclaration variableDeclaration = parent;
+ final element = variableDeclaration.declaredElement;
+ if (element is FieldElement) {
+ FieldElement fieldElement = element;
+ type = fieldElement.type;
+ }
+ }
+
+ if (type == null) {
+ return null;
+ }
+
+ var constructorInvocation;
+ if (type.isDartCoreBool) {
+ constructorInvocation = 'DiagnosticsProperty<bool>';
+ } else if (type.isDartCoreInt) {
+ constructorInvocation = 'IntProperty';
+ } else if (type.isDartCoreDouble) {
+ constructorInvocation = 'DoubleProperty';
+ } else if (type.isDartCoreString) {
+ constructorInvocation = 'StringProperty';
+ } else if (isEnum(type)) {
+ constructorInvocation = 'EnumProperty';
+ }
+
+ // todo (pq): migrate type string generation to within change and use DartEditBuilder.writeType
+
+ if (constructorInvocation == null) {
+ return null;
+ }
+
+ ClassDeclaration classDeclaration =
+ parent.thisOrAncestorOfType<ClassDeclaration>();
+ final debugFillProperties =
+ classDeclaration.getMethod('debugFillProperties');
+ if (debugFillProperties != null) {
+ final body = debugFillProperties.body;
+ if (body is BlockFunctionBody) {
+ BlockFunctionBody functionBody = body;
+
+ var offset;
+ var prefix;
+ if (functionBody.block.statements.isEmpty) {
+ offset = functionBody.block.leftBracket.offset;
+ prefix = utils.getLinePrefix(offset) + utils.getIndent(1);
+ } else {
+ offset = functionBody.block.statements.last.endToken.offset;
+ prefix = utils.getLinePrefix(offset);
+ }
+
+ var parameters = debugFillProperties.parameters.parameters;
+ var propertiesBuilderName;
+ for (var parameter in parameters) {
+ if (parameter is SimpleFormalParameter) {
+ final type = parameter.type;
+ if (type is TypeName) {
+ if (type.name.name == 'DiagnosticPropertiesBuilder') {
+ propertiesBuilderName = parameter.identifier.name;
+ break;
+ }
+ }
+ }
+ }
+ if (propertiesBuilderName == null) {
+ return null;
+ }
+
+ final changeBuilder = _newDartChangeBuilder();
+ await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+ builder.addInsertion(utils.getLineNext(offset),
+ (DartEditBuilder builder) {
+ builder.write(
+ "$prefix$propertiesBuilderName.add($constructorInvocation('${name.name}', ${name.name}));$eol");
+ });
+ });
+ return changeBuilder;
+ }
+ }
+
+ return null;
+ }
+
Future<ChangeBuilder>
createBuilder_addTypeAnnotation_DeclaredIdentifier() async {
DeclaredIdentifier declaredIdentifier =
@@ -860,46 +963,6 @@
return changeBuilder;
}
- Future<ChangeBuilder> createBuilder_sortChildPropertyLast() async {
- NamedExpression childProp = flutter.findNamedExpression(node, 'child');
- if (childProp == null) {
- childProp = flutter.findNamedExpression(node, 'children');
- }
- if (childProp == null) {
- return null;
- }
-
- var parent = childProp.parent?.parent;
- if (parent is! InstanceCreationExpression ||
- !flutter.isWidgetCreation(parent)) {
- return null;
- }
-
- InstanceCreationExpression creationExpression = parent;
- var args = creationExpression.argumentList;
-
- var last = args.arguments.last;
- if (last == childProp) {
- // Already sorted.
- return null;
- }
-
- var changeBuilder = _newDartChangeBuilder();
- await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
- var start = childProp.beginToken.previous.end;
- var end = childProp.endToken.next.end;
- var childRange = range.startOffsetEndOffset(start, end);
-
- var childText = utils.getRangeText(childRange);
- builder.addSimpleReplacement(childRange, '');
- builder.addSimpleInsertion(last.end + 1, childText);
-
- changeBuilder.setSelection(new Position(file, last.end + 1));
- });
-
- return changeBuilder;
- }
-
/// todo (pq): unify with similar behavior in fix.
Future<ChangeBuilder> createBuilder_removeTypeAnnotation() async {
VariableDeclarationList declarationList =
@@ -945,6 +1008,46 @@
return changeBuilder;
}
+ Future<ChangeBuilder> createBuilder_sortChildPropertyLast() async {
+ NamedExpression childProp = flutter.findNamedExpression(node, 'child');
+ if (childProp == null) {
+ childProp = flutter.findNamedExpression(node, 'children');
+ }
+ if (childProp == null) {
+ return null;
+ }
+
+ var parent = childProp.parent?.parent;
+ if (parent is! InstanceCreationExpression ||
+ !flutter.isWidgetCreation(parent)) {
+ return null;
+ }
+
+ InstanceCreationExpression creationExpression = parent;
+ var args = creationExpression.argumentList;
+
+ var last = args.arguments.last;
+ if (last == childProp) {
+ // Already sorted.
+ return null;
+ }
+
+ var changeBuilder = _newDartChangeBuilder();
+ await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+ var start = childProp.beginToken.previous.end;
+ var end = childProp.endToken.next.end;
+ var childRange = range.startOffsetEndOffset(start, end);
+
+ var childText = utils.getRangeText(childRange);
+ builder.addSimpleReplacement(childRange, '');
+ builder.addSimpleInsertion(last.end + 1, childText);
+
+ changeBuilder.setSelection(new Position(file, last.end + 1));
+ });
+
+ return changeBuilder;
+ }
+
@protected
Future<ChangeBuilder> createBuilder_useCurlyBraces() async {
Future<ChangeBuilder> doStatement(DoStatement node) async {
@@ -1105,6 +1208,11 @@
return null;
}
+ bool isEnum(DartType type) {
+ final element = type.element;
+ return element is ClassElement && element.isEnum;
+ }
+
@protected
bool setupCompute() {
final locator = NodeLocator(selectionOffset, selectionEnd);
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index b2bc9a3..6a005f2 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -142,6 +142,10 @@
const FixKind('ADD_CONST', 50, "Add 'const' modifier");
static const ADD_CURLY_BRACES =
const FixKind('ADD_CURLY_BRACES', 50, "Add curly braces");
+ static const ADD_DIAGNOSTIC_PROPERTY_REFERENCE = const FixKind(
+ 'ADD_DIAGNOSTIC_PROPERTY_REFERENCE',
+ 50,
+ "Add a debug reference to this property");
static const ADD_FIELD_FORMAL_PARAMETERS = const FixKind(
'ADD_FIELD_FORMAL_PARAMETERS', 70, "Add final field formal parameters");
static const ADD_MISSING_ENUM_CASE_CLAUSES = const FixKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index 7dff396..801408f 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -628,6 +628,9 @@
if (name == LintNames.curly_braces_in_flow_control_structures) {
await _addFix_addCurlyBraces();
}
+ if (name == LintNames.diagnostic_describe_all_properties) {
+ await _addFix_addDiagnosticPropertyReference();
+ }
if (name == LintNames.empty_catches) {
await _addFix_removeEmptyCatch();
}
@@ -781,6 +784,12 @@
_addFixFromBuilder(changeBuilder, DartFixKind.ADD_CURLY_BRACES);
}
+ Future<void> _addFix_addDiagnosticPropertyReference() async {
+ final changeBuilder = await createBuilder_addDiagnosticPropertyReference();
+ _addFixFromBuilder(
+ changeBuilder, DartFixKind.ADD_DIAGNOSTIC_PROPERTY_REFERENCE);
+ }
+
Future<void> _addFix_addExplicitCast() async {
if (coveredNode is! Expression) {
return;
@@ -3525,6 +3534,47 @@
}
}
+ Future<void> _addFix_removeUnusedElement() async {
+ final sourceRanges = <SourceRange>[];
+ final referencedNode = node.parent;
+ if (referencedNode is ClassDeclaration ||
+ referencedNode is EnumDeclaration ||
+ referencedNode is FunctionDeclaration ||
+ referencedNode is FunctionTypeAlias ||
+ referencedNode is MethodDeclaration ||
+ referencedNode is VariableDeclaration) {
+ final element = referencedNode is Declaration
+ ? referencedNode.declaredElement
+ : (referencedNode as NamedCompilationUnitMember).declaredElement;
+ final references = _findAllReferences(unit, element);
+ // todo (pq): consider filtering for references that are limited to within the class.
+ if (references.length == 1) {
+ var sourceRange;
+ if (referencedNode is VariableDeclaration) {
+ VariableDeclarationList parent = referencedNode.parent;
+ if (parent.variables.length == 1) {
+ sourceRange = utils.getLinesRange(range.node(parent.parent));
+ } else {
+ sourceRange = range.nodeInList(parent.variables, node);
+ }
+ } else {
+ sourceRange = utils.getLinesRange(range.node(referencedNode));
+ }
+ sourceRanges.add(sourceRange);
+ }
+ }
+
+ if (sourceRanges.isNotEmpty) {
+ final changeBuilder = _newDartChangeBuilder();
+ await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
+ for (var sourceRange in sourceRanges) {
+ builder.addDeletion(sourceRange);
+ }
+ });
+ _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNUSED_ELEMENT);
+ }
+ }
+
Future<void> _addFix_removeUnusedField() async {
final declaration = node.parent;
if (declaration is! VariableDeclaration) {
@@ -3588,47 +3638,6 @@
_addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNUSED_FIELD);
}
- Future<void> _addFix_removeUnusedElement() async {
- final sourceRanges = <SourceRange>[];
- final referencedNode = node.parent;
- if (referencedNode is ClassDeclaration ||
- referencedNode is EnumDeclaration ||
- referencedNode is FunctionDeclaration ||
- referencedNode is FunctionTypeAlias ||
- referencedNode is MethodDeclaration ||
- referencedNode is VariableDeclaration) {
- final element = referencedNode is Declaration
- ? referencedNode.declaredElement
- : (referencedNode as NamedCompilationUnitMember).declaredElement;
- final references = _findAllReferences(unit, element);
- // todo (pq): consider filtering for references that are limited to within the class.
- if (references.length == 1) {
- var sourceRange;
- if (referencedNode is VariableDeclaration) {
- VariableDeclarationList parent = referencedNode.parent;
- if (parent.variables.length == 1) {
- sourceRange = utils.getLinesRange(range.node(parent.parent));
- } else {
- sourceRange = range.nodeInList(parent.variables, node);
- }
- } else {
- sourceRange = utils.getLinesRange(range.node(referencedNode));
- }
- sourceRanges.add(sourceRange);
- }
- }
-
- if (sourceRanges.isNotEmpty) {
- final changeBuilder = _newDartChangeBuilder();
- await changeBuilder.addFileEdit(file, (DartFileEditBuilder builder) {
- for (var sourceRange in sourceRanges) {
- builder.addDeletion(sourceRange);
- }
- });
- _addFixFromBuilder(changeBuilder, DartFixKind.REMOVE_UNUSED_ELEMENT);
- }
- }
-
Future<void> _addFix_removeUnusedImport() async {
// prepare ImportDirective
ImportDirective importDirective =
diff --git a/pkg/analysis_server/lib/src/services/linter/lint_names.dart b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
index b3ee6f1..fbd3a46 100644
--- a/pkg/analysis_server/lib/src/services/linter/lint_names.dart
+++ b/pkg/analysis_server/lib/src/services/linter/lint_names.dart
@@ -20,6 +20,8 @@
static const String await_only_futures = 'await_only_futures';
static const String curly_braces_in_flow_control_structures =
'curly_braces_in_flow_control_structures';
+ static const String diagnostic_describe_all_properties =
+ 'diagnostic_describe_all_properties';
static const String empty_catches = 'empty_catches';
static const String empty_constructor_bodies = 'empty_constructor_bodies';
static const String empty_statements = 'empty_statements';
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index 3feab8b..ba6c8a3 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -381,7 +381,7 @@
for (var invocation in collector.invocations) {
List<Expression> arguments = invocation.argumentList.arguments;
builder.addReplacement(range.node(invocation), (builder) {
- builder.write('new $name(');
+ builder.write('$name(');
// Insert field references (as named arguments).
// Ensure that invocation arguments are named.
@@ -545,7 +545,7 @@
/// Write instantiation of the new widget class.
void _writeWidgetInstantiation(DartEditBuilder builder) {
- builder.write('new $name(');
+ builder.write('$name(');
for (var parameter in _parameters) {
if (parameter != _parameters.first) {
diff --git a/pkg/analysis_server/test/edit/nnbd_migration/instrumentation_output_test.dart b/pkg/analysis_server/test/edit/nnbd_migration/instrumentation_output_test.dart
index 7865f34..7056d15 100644
--- a/pkg/analysis_server/test/edit/nnbd_migration/instrumentation_output_test.dart
+++ b/pkg/analysis_server/test/edit/nnbd_migration/instrumentation_output_test.dart
@@ -4,6 +4,7 @@
import 'package:analysis_server/src/edit/nnbd_migration/instrumentation_renderer.dart';
import 'package:analysis_server/src/edit/nnbd_migration/migration_info.dart';
+import 'package:analysis_server/src/edit/nnbd_migration/path_mapper.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -21,61 +22,73 @@
/// library.
// TODO(srawlins): Add tests for navigation links, which use multiple
// libraries.
- String renderLibrary(LibraryInfo libraryInfo) {
- MigrationInfo migrationInfo =
- MigrationInfo([libraryInfo], resourceProvider.pathContext, '/project');
- return InstrumentationRenderer(libraryInfo, migrationInfo).render();
+ List<String> renderLibrary(LibraryInfo libraryInfo) {
+ String packageRoot = resourceProvider.convertPath('/package');
+ String outputDir = resourceProvider.convertPath('/output');
+ MigrationInfo migrationInfo = MigrationInfo(
+ libraryInfo.units, resourceProvider.pathContext, packageRoot);
+ List<String> contents = [];
+ for (UnitInfo unitInfo in libraryInfo.units) {
+ contents.add(InstrumentationRenderer(unitInfo, migrationInfo,
+ PathMapper(resourceProvider, outputDir, packageRoot))
+ .render());
+ }
+ return contents;
}
test_outputContainsEachPath() async {
LibraryInfo info = LibraryInfo([
- unit('/lib/a.dart', 'int? a = null;',
+ unit('/package/lib/a.dart', 'int? a = null;',
regions: [RegionInfo(3, 1, 'null was assigned', [])]),
- unit('/lib/part1.dart', 'int? b = null;',
+ unit('/package/lib/part1.dart', 'int? b = null;',
regions: [RegionInfo(3, 1, 'null was assigned', [])]),
- unit('/lib/part2.dart', 'int? c = null;',
+ unit('/package/lib/part2.dart', 'int? c = null;',
regions: [RegionInfo(3, 1, 'null was assigned', [])]),
]);
- String output = renderLibrary(info);
- expect(output, contains('<h2>/lib/a.dart</h2>'));
- expect(output, contains('<h2>/lib/part1.dart</h2>'));
- expect(output, contains('<h2>/lib/part2.dart</h2>'));
+ List<String> contents = renderLibrary(info);
+ expect(contents[0], contains(resourceProvider.convertPath('lib/a.dart')));
+ expect(
+ contents[1], contains(resourceProvider.convertPath('lib/part1.dart')));
+ expect(
+ contents[2], contains(resourceProvider.convertPath('lib/part2.dart')));
}
test_outputContainsEscapedHtml() async {
LibraryInfo info = LibraryInfo([
- unit('/lib/a.dart', 'List<String>? a = null;',
+ unit('/package/lib/a.dart', 'List<String>? a = null;',
regions: [RegionInfo(12, 1, 'null was assigned', [])]),
]);
- String output = renderLibrary(info);
+ String output = renderLibrary(info)[0];
expect(
output,
contains('List<String><span class="region">?'
- '<span class="tooltip">null was assigned</span></span> a = null;'));
+ '<span class="tooltip">null was assigned<ul></ul></span></span> '
+ 'a = null;'));
}
test_outputContainsEscapedHtml_ampersand() async {
LibraryInfo info = LibraryInfo([
- unit('/lib/a.dart', 'bool a = true && false;', regions: []),
+ unit('/package/lib/a.dart', 'bool a = true && false;', regions: []),
]);
- String output = renderLibrary(info);
+ String output = renderLibrary(info)[0];
expect(output, contains('bool a = true && false;'));
}
test_outputContainsModifiedAndUnmodifiedRegions() async {
LibraryInfo info = LibraryInfo([
- unit('/lib/a.dart', 'int? a = null;',
+ unit('/package/lib/a.dart', 'int? a = null;',
regions: [RegionInfo(3, 1, 'null was assigned', [])]),
]);
- String output = renderLibrary(info);
+ String output = renderLibrary(info)[0];
expect(
output,
contains('int<span class="region">?'
- '<span class="tooltip">null was assigned</span></span> a = null;'));
+ '<span class="tooltip">null was assigned<ul></ul></span></span> '
+ 'a = null;'));
}
UnitInfo unit(String path, String content, {List<RegionInfo> regions}) {
- return UnitInfo(path)
+ return UnitInfo(resourceProvider.convertPath(path))
..content = content
..regions.addAll(regions);
}
diff --git a/pkg/analysis_server/test/integration/lsp_server/diagnostic_test.dart b/pkg/analysis_server/test/integration/lsp_server/diagnostic_test.dart
index 40e2ff6..799c69e 100644
--- a/pkg/analysis_server/test/integration/lsp_server/diagnostic_test.dart
+++ b/pkg/analysis_server/test/integration/lsp_server/diagnostic_test.dart
@@ -15,6 +15,9 @@
@reflectiveTest
class DiagnosticTest extends AbstractLspAnalysisServerIntegrationTest {
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_initialAnalysis() async {
newFile(mainFilePath, content: 'String a = 1;');
@@ -30,6 +33,9 @@
expect(diagnostic.range.end.character, equals(12));
}
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_lints() async {
newFile(mainFilePath, content: '''main() async => await 1;''');
newFile(analysisOptionsPath, content: '''
diff --git a/pkg/analysis_server/test/integration/lsp_server/initialization_test.dart b/pkg/analysis_server/test/integration/lsp_server/initialization_test.dart
index 8d364dc..91f75bc 100644
--- a/pkg/analysis_server/test/integration/lsp_server/initialization_test.dart
+++ b/pkg/analysis_server/test/integration/lsp_server/initialization_test.dart
@@ -17,6 +17,9 @@
@reflectiveTest
class InitializationTest extends AbstractLspAnalysisServerIntegrationTest {
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_initialize_invalidParams() async {
final params = {'processId': 'invalid'};
final request = new RequestMessage(
diff --git a/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart b/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
index e1eeec2..23317b4 100644
--- a/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
@@ -144,11 +144,24 @@
String dartBinary = Platform.executable;
- // TODO(dantup): The other servers integration tests can run with a snapshot
- // which is much faster - we may wish to investigate doing the same here.
- final rootDir =
- findRoot(Platform.script.toFilePath(windows: Platform.isWindows));
- final serverPath = normalize(join(rootDir, 'bin', 'server.dart'));
+ final bool useSnapshot = true;
+ String serverPath;
+
+ if (useSnapshot) {
+ // Look for snapshots/analysis_server.dart.snapshot.
+ serverPath = normalize(join(dirname(Platform.resolvedExecutable),
+ 'snapshots', 'analysis_server.dart.snapshot'));
+
+ if (!FileSystemEntity.isFileSync(serverPath)) {
+ // Look for dart-sdk/bin/snapshots/analysis_server.dart.snapshot.
+ serverPath = normalize(join(dirname(Platform.resolvedExecutable),
+ 'dart-sdk', 'bin', 'snapshots', 'analysis_server.dart.snapshot'));
+ }
+ } else {
+ final rootDir =
+ findRoot(Platform.script.toFilePath(windows: Platform.isWindows));
+ serverPath = normalize(join(rootDir, 'bin', 'server.dart'));
+ }
final arguments = [serverPath, '--lsp', '--suppress-analytics'];
_process = await Process.start(dartBinary, arguments);
diff --git a/pkg/analysis_server/test/integration/lsp_server/server_test.dart b/pkg/analysis_server/test/integration/lsp_server/server_test.dart
index 0b73ad4..fd7e279 100644
--- a/pkg/analysis_server/test/integration/lsp_server/server_test.dart
+++ b/pkg/analysis_server/test/integration/lsp_server/server_test.dart
@@ -18,6 +18,9 @@
@reflectiveTest
class ServerTest extends AbstractLspAnalysisServerIntegrationTest {
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_diagnosticServer() async {
await initialize();
@@ -38,6 +41,9 @@
expect(responseBody, contains('<title>Analysis Server</title>'));
}
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_exit_inintializedWithShutdown() async {
await initialize();
await sendShutdown();
@@ -53,6 +59,9 @@
expect(exitCode, equals(0));
}
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_exit_initializedWithoutShutdown() async {
// Send a request that we can wait for, to ensure the server is fully ready
// before we send exit. Otherwise the exit notification won't be handled for
@@ -70,6 +79,9 @@
expect(exitCode, equals(1));
}
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_exit_uninintializedWithShutdown() async {
await sendShutdown();
sendExit();
@@ -84,6 +96,9 @@
expect(exitCode, equals(0));
}
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_exit_uninitializedWithoutShutdown() async {
// This tests the same as test_exit_withoutShutdown but without sending
// initialize. It can't be as strict with the timeout as the server may take
diff --git a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
index 55d5140..6a1cd63 100644
--- a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
@@ -112,7 +112,7 @@
Widget build(BuildContext context) {
return new Row(
children: <Widget>[
- new NewWidget(),
+ NewWidget(),
new Text('CCC'),
new Text('DDD'),
],
diff --git a/pkg/analysis_server/test/lsp/initialization_test.dart b/pkg/analysis_server/test/lsp/initialization_test.dart
index 648b7ed..7de98f7 100644
--- a/pkg/analysis_server/test/lsp/initialization_test.dart
+++ b/pkg/analysis_server/test/lsp/initialization_test.dart
@@ -208,9 +208,23 @@
});
// Initialize with no dynamic registrations advertised.
- await initialize();
+ final initResponse = await initialize();
await pumpEventQueue();
+ // When dynamic registration is not supported, we will always statically
+ // request text document open/close and incremental updates.
+ InitializeResult initResult = initResponse.result;
+ expect(initResult.capabilities, isNotNull);
+ expect(initResult.capabilities.textDocumentSync, isNotNull);
+ initResult.capabilities.textDocumentSync.map(
+ (options) {
+ expect(options.openClose, isTrue);
+ expect(options.change, equals(TextDocumentSyncKind.Incremental));
+ },
+ (_) =>
+ throw 'Expected textDocumentSync capabilities to be a $TextDocumentSyncOptions',
+ );
+
expect(didGetRegisterCapabilityRequest, isFalse);
}
@@ -237,7 +251,8 @@
// for ex including analysis_options.yaml in text synchronization but not
// for hovers.
List<Registration> registrations;
- await handleExpectedRequest<void, RegistrationParams, void>(
+ final initResponse =
+ await handleExpectedRequest<ResponseMessage, RegistrationParams, void>(
Method.client_registerCapability,
() => initialize(
// Support dynamic registration for both text sync + hovers.
@@ -248,6 +263,21 @@
registrations = registrationParams.registrations,
);
+ // Because we support dynamic registration for synchronisation, we won't send
+ // static registrations for them.
+ // https://github.com/dart-lang/sdk/issues/38490
+ InitializeResult initResult = initResponse.result;
+ expect(initResult.capabilities, isNotNull);
+ expect(initResult.capabilities.textDocumentSync, isNotNull);
+ initResult.capabilities.textDocumentSync.map(
+ (options) {
+ expect(options.openClose, isFalse);
+ expect(options.change, equals(TextDocumentSyncKind.None));
+ },
+ (_) =>
+ throw 'Expected textDocumentSync capabilities to be a $TextDocumentSyncOptions',
+ );
+
// Should container Hover, DidOpen, DidClose, DidChange.
expect(registrations, hasLength(4));
final hover =
diff --git a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
index 580a076..1ed98d3 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_widget_test.dart
@@ -121,7 +121,7 @@
Widget build(BuildContext context) {
return new Row(
children: <Widget>[
- new Test(),
+ Test(),
new Text('CCC'),
new Text('DDD'),
],
@@ -173,7 +173,7 @@
Widget foo() {
return new Row(
children: <Widget>[
- new Test(),
+ Test(),
new Text('BBB'),
],
);
@@ -214,7 +214,7 @@
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
- return new Test();
+ return Test();
}
}
@@ -249,7 +249,7 @@
import 'package:flutter/material.dart';
Widget main() {
- return new Test();
+ return Test();
}
class Test extends StatelessWidget {
@@ -301,7 +301,7 @@
Widget main() {
return new Row(
children: <Widget>[
- new Test(),
+ Test(),
new Text('BBB'),
],
);
@@ -409,7 +409,7 @@
@override
Widget build(BuildContext context) {
- return new Test(c: c);
+ return Test(c: c);
}
}
@@ -462,7 +462,7 @@
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
- return new Test();
+ return Test();
}
}
@@ -524,8 +524,8 @@
int bar = 1;
return new Row(
children: <Widget>[
- new Test(foo: foo, p1: 'aaa', p2: bar),
- new Test(foo: foo, p1: 'bbb', p2: 2),
+ Test(foo: foo, p1: 'aaa', p2: bar),
+ Test(foo: foo, p1: 'bbb', p2: 2),
],
);
}
@@ -596,8 +596,8 @@
int bar = 1;
return new Row(
children: <Widget>[
- new Test(foo: foo, p1: 'aaa', p2: bar),
- new Test(foo: foo, p1: 'bbb', p2: 2),
+ Test(foo: foo, p1: 'aaa', p2: bar),
+ Test(foo: foo, p1: 'bbb', p2: 2),
],
);
}
@@ -651,7 +651,7 @@
@override
Widget build(BuildContext context) {
- return new Test(field: field);
+ return Test(field: field);
}
}
@@ -703,7 +703,7 @@
@override
Widget build(BuildContext context) {
- return new Test(c: c);
+ return Test(c: c);
}
}
@@ -747,7 +747,7 @@
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
- return new Test();
+ return Test();
}
}
@@ -853,7 +853,7 @@
@override
Widget build(BuildContext context) {
- return new Test(c: c);
+ return Test(c: c);
}
}
@@ -919,7 +919,7 @@
@override
Widget build(BuildContext context) {
String local;
- return new Test(local: local);
+ return Test(local: local);
}
}
@@ -987,7 +987,7 @@
@override
Widget build(BuildContext context) {
- return new Test(field: _field);
+ return Test(field: _field);
}
}
@@ -1033,7 +1033,7 @@
@override
Widget build(BuildContext context) {
- return new Test(field: field, field2: _field);
+ return Test(field: field, field2: _field);
}
}
@@ -1086,7 +1086,7 @@
@override
Widget build(BuildContext context) {
String local;
- return new Test(field: field, local: local);
+ return Test(field: field, local: local);
}
}
@@ -1157,7 +1157,7 @@
var index = 0;
var a = 'a $index';
// start
- return new Test(index: index, a: a);
+ return Test(index: index, a: a);
// end
}
diff --git a/pkg/analysis_server/test/src/edit/fix/non_nullable_fix_test.dart b/pkg/analysis_server/test/src/edit/fix/non_nullable_fix_test.dart
index 408a7a7..a2b0dcc 100644
--- a/pkg/analysis_server/test/src/edit/fix/non_nullable_fix_test.dart
+++ b/pkg/analysis_server/test/src/edit/fix/non_nullable_fix_test.dart
@@ -136,11 +136,11 @@
Folder outputDir = getFolder('/outputDir');
await performFix(included: [projectPath], outputDir: outputDir.path);
expect(outputDir.exists, true);
- expect(getFile('/outputDir/bin/bin.html').exists, isTrue);
- expect(getFile('/outputDir/lib/lib1.html').exists, isTrue);
- expect(getFile('/outputDir/lib/lib2.html').exists, isTrue);
- expect(getFile('/outputDir/lib/src/lib3.html').exists, isTrue);
- expect(getFile('/outputDir/test/test.html').exists, isTrue);
+ expect(getFile('/outputDir/project/bin/bin.html').exists, isTrue);
+ expect(getFile('/outputDir/project/lib/lib1.html').exists, isTrue);
+ expect(getFile('/outputDir/project/lib/lib2.html').exists, isTrue);
+ expect(getFile('/outputDir/project/lib/src/lib3.html').exists, isTrue);
+ expect(getFile('/outputDir/project/test/test.html').exists, isTrue);
}
test_outputDirContainsFilesRootedInASubdirectory() async {
@@ -150,9 +150,9 @@
included: [context.join(projectPath, 'lib')],
outputDir: outputDir.path);
expect(outputDir.exists, true);
- expect(getFile('/outputDir/lib1.html').exists, isTrue);
- expect(getFile('/outputDir/lib2.html').exists, isTrue);
- expect(getFile('/outputDir/src/lib3.html').exists, isTrue);
+ expect(getFile('/outputDir/lib/lib1.html').exists, isTrue);
+ expect(getFile('/outputDir/lib/lib2.html').exists, isTrue);
+ expect(getFile('/outputDir/lib/src/lib3.html').exists, isTrue);
}
test_outputDirContainsFilesRootedInParentOfSingleFile() async {
@@ -162,6 +162,11 @@
included: [context.join(projectPath, 'lib', 'lib2.dart')],
outputDir: outputDir.path);
expect(outputDir.exists, true);
- expect(outputDir.getChildAssumingFile('lib2.html').exists, isTrue);
+ expect(
+ outputDir
+ .getChildAssumingFolder('lib')
+ .getChildAssumingFile('lib2.html')
+ .exists,
+ isTrue);
}
}
diff --git a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart b/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
index ca0162f..d349e0d 100644
--- a/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
+++ b/pkg/analysis_server/test/src/edit/nnbd_migration/info_builder_test.dart
@@ -25,7 +25,7 @@
class InfoBuilderTest extends AbstractAnalysisTest {
/// The information produced by the InfoBuilder, or `null` if [buildInfo] has
/// not yet completed.
- List<LibraryInfo> infos;
+ List<UnitInfo> infos;
/// Use the InfoBuilder to build information. The information will be stored
/// in [infos].
@@ -53,7 +53,7 @@
infos = await builder.explainMigration();
}
- test_parameter_nullableFromInvocation() async {
+ test_parameter_nullable_fromInvocation() async {
addTestFile('''
void f(String s) {}
void g() {
@@ -62,9 +62,7 @@
''');
await buildInfo();
expect(infos, hasLength(1));
- List<UnitInfo> units = infos[0].units;
- expect(units, hasLength(1));
- UnitInfo unit = units[0];
+ UnitInfo unit = infos[0];
expect(unit.path, testFile);
expect(unit.content, '''
void f(String? s) {}
@@ -77,5 +75,37 @@
RegionInfo region = regions[0];
expect(region.offset, 13);
expect(region.length, 1);
+ List<RegionDetail> details = region.details;
+ expect(details, hasLength(1));
+ }
+
+ test_parameter_nullable_fromOverriden() async {
+ addTestFile('''
+class A {
+ void m(p) {}
+}
+class B extends A {
+ void m(Object p) {}
+}
+''');
+ await buildInfo();
+ expect(infos, hasLength(1));
+ UnitInfo unit = infos[0];
+ expect(unit.path, testFile);
+ expect(unit.content, '''
+class A {
+ void m(p) {}
+}
+class B extends A {
+ void m(Object? p) {}
+}
+''');
+ List<RegionInfo> regions = unit.regions;
+ expect(regions, hasLength(1));
+ RegionInfo region = regions[0];
+ expect(region.offset, 62);
+ expect(region.length, 1);
+ List<RegionDetail> details = region.details;
+ expect(details, hasLength(1));
}
}
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 df7d05f..384cafc 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
@@ -202,6 +202,9 @@
notificationManager, InstrumentationService.NULL_SERVICE);
}
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_addPluginToContextRoot() async {
io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
@@ -233,6 +236,9 @@
// pkg1Dir.deleteSync(recursive: true);
}
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_broadcastRequest_many() async {
io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
@@ -259,6 +265,9 @@
pkg1Dir.deleteSync(recursive: true);
}
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_broadcastRequest_many_noContextRoot() async {
io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
@@ -283,6 +292,9 @@
pkg1Dir.deleteSync(recursive: true);
}
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_broadcastWatchEvent() async {
io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
@@ -306,6 +318,9 @@
pkg1Dir.deleteSync(recursive: true);
}
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_pluginsForContextRoot_multiple() async {
io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
@@ -333,6 +348,9 @@
pkg1Dir.deleteSync(recursive: true);
}
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_pluginsForContextRoot_one() async {
io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
@@ -349,6 +367,9 @@
pkg1Dir.deleteSync(recursive: true);
}
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_removedContextRoot() async {
io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
String pkgPath = pkg1Dir.resolveSymbolicLinksSync();
@@ -364,6 +385,9 @@
}
@TestTimeout(const Timeout.factor(4))
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_restartPlugins() async {
io.Directory pkg1Dir = io.Directory.systemTemp.createTempSync('pkg1');
String pkg1Path = pkg1Dir.resolveSymbolicLinksSync();
@@ -514,6 +538,9 @@
@reflectiveTest
class PluginSessionFromDiskTest extends PluginTestSupport {
+ @SkippedTest(
+ reason: 'flaky timeouts',
+ issue: 'https://github.com/dart-lang/sdk/issues/38629')
test_start_notRunning() async {
await withPlugin(test: (String pluginPath) async {
String packagesPath = path.join(pluginPath, '.packages');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/add_diagnostic_property_reference_test.dart b/pkg/analysis_server/test/src/services/correction/fix/add_diagnostic_property_reference_test.dart
new file mode 100644
index 0000000..13f5ab3
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/add_diagnostic_property_reference_test.dart
@@ -0,0 +1,214 @@
+// Copyright (c) 2019, 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:analysis_server/src/services/correction/fix.dart';
+import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'fix_processor.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(AddDiagnosticPropertyReferenceTest);
+ });
+}
+
+@reflectiveTest
+class AddDiagnosticPropertyReferenceTest extends FixProcessorLintTest {
+ @override
+ FixKind get kind => DartFixKind.ADD_DIAGNOSTIC_PROPERTY_REFERENCE;
+
+ @override
+ String get lintCode => LintNames.diagnostic_describe_all_properties;
+
+ test_boolField_debugFillProperties() async {
+ await resolveTestUnit('''
+class Absorber extends Widget {
+ bool get absorbing => _absorbing;
+ bool _absorbing;
+ bool /*LINT*/ignoringSemantics;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ properties.add(DiagnosticsProperty<bool>('absorbing', absorbing));
+ }
+}
+''');
+ await assertHasFix('''
+class Absorber extends Widget {
+ bool get absorbing => _absorbing;
+ bool _absorbing;
+ bool /*LINT*/ignoringSemantics;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ properties.add(DiagnosticsProperty<bool>('absorbing', absorbing));
+ properties.add(DiagnosticsProperty<bool>('ignoringSemantics', ignoringSemantics));
+ }
+}
+''');
+ }
+
+ test_boolField_debugFillProperties_empty() async {
+ await resolveTestUnit('''
+class Absorber extends Widget {
+ bool /*LINT*/ignoringSemantics;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ }
+}
+''');
+ await assertHasFix('''
+class Absorber extends Widget {
+ bool /*LINT*/ignoringSemantics;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ properties.add(DiagnosticsProperty<bool>('ignoringSemantics', ignoringSemantics));
+ }
+}
+''');
+ }
+
+ test_boolField_debugFillProperties_empty_customParamName() async {
+ await resolveTestUnit('''
+class Absorber extends Widget {
+ bool /*LINT*/ignoringSemantics;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder props) {
+ }
+}
+''');
+ await assertHasFix('''
+class Absorber extends Widget {
+ bool /*LINT*/ignoringSemantics;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder props) {
+ props.add(DiagnosticsProperty<bool>('ignoringSemantics', ignoringSemantics));
+ }
+}
+''');
+ }
+
+ test_boolGetter_debugFillProperties() async {
+ await resolveTestUnit('''
+class Absorber extends Widget {
+ bool get /*LINT*/absorbing => _absorbing;
+ bool _absorbing;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ }
+}
+''');
+ await assertHasFix('''
+class Absorber extends Widget {
+ bool get /*LINT*/absorbing => _absorbing;
+ bool _absorbing;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ properties.add(DiagnosticsProperty<bool>('absorbing', absorbing));
+ }
+}
+''');
+ }
+
+ test_doubleField_debugFillProperties() async {
+ await resolveTestUnit('''
+class A extends Widget {
+ double /*LINT*/field;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ }
+}
+''');
+ await assertHasFix('''
+class A extends Widget {
+ double /*LINT*/field;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ properties.add(DoubleProperty('field', field));
+ }
+}
+''');
+ }
+
+ test_enumField_debugFillProperties() async {
+ await resolveTestUnit('''
+enum foo {bar}
+class A extends Widget {
+ foo /*LINT*/field;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ }
+}
+''');
+ await assertHasFix('''
+enum foo {bar}
+class A extends Widget {
+ foo /*LINT*/field;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ properties.add(EnumProperty('field', field));
+ }
+}
+''');
+ }
+
+ test_intField_debugFillProperties() async {
+ await resolveTestUnit('''
+class A extends Widget {
+ int /*LINT*/field;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ }
+}
+''');
+ await assertHasFix('''
+class A extends Widget {
+ int /*LINT*/field;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ properties.add(IntProperty('field', field));
+ }
+}
+''');
+ }
+
+ test_stringField_debugFillProperties() async {
+ await resolveTestUnit('''
+class A extends Widget {
+ String /*LINT*/field;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ }
+}
+''');
+ await assertHasFix('''
+class A extends Widget {
+ String /*LINT*/field;
+ @override
+ void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+ super.debugFillProperties(properties);
+ properties.add(StringProperty('field', field));
+ }
+}
+''');
+ }
+
+ // todo (pq): tests for no debugFillProperties method
+ // todo (pq): consider a test for a body w/ no CR
+ // todo (pq): support for ColorProperty -- for Color
+ // todo (pq): support for IterableProperty -- any iterable
+ // todo (pq): support for TransformProperty -- Matrix4
+ // todo (pq): support for DiagnosticsProperty for any T that doesn't match one of the other cases
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
index 3509418..3c6ba74 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/test_all.dart
@@ -8,6 +8,8 @@
import 'add_await_test.dart' as add_await;
import 'add_const_test.dart' as add_const;
import 'add_curly_braces_test.dart' as add_curly_braces;
+import 'add_diagnostic_property_reference_test.dart'
+ as add_diagnostic_property_reference;
import 'add_explicit_cast_test.dart' as add_explicit_cast;
import 'add_field_formal_parameters_test.dart' as add_field_formal_parameters;
import 'add_missing_enum_case_clauses_test.dart'
@@ -140,6 +142,7 @@
add_await.main();
add_const.main();
add_curly_braces.main();
+ add_diagnostic_property_reference.main();
add_explicit_cast.main();
add_field_formal_parameters.main();
add_missing_enum_case_clauses.main();
diff --git a/pkg/analyzer/analysis_options.yaml b/pkg/analyzer/analysis_options.yaml
index 3fa0592..59199b3 100644
--- a/pkg/analyzer/analysis_options.yaml
+++ b/pkg/analyzer/analysis_options.yaml
@@ -10,14 +10,10 @@
# Ignoring "style" lint rules from pedantic for now. There are pre-existing
# violations that need to be cleaned up. Each one can be cleaned up and
# enabled according to the value provided.
- avoid_init_to_null: ignore
avoid_return_types_on_setters: ignore
curly_braces_in_flow_control_structures: ignore
empty_catches: ignore
prefer_iterable_wheretype: ignore
- prefer_contains: ignore
- # TODO(srawlins): Fix existing violations!
- no_duplicate_case_values: ignore
# TODO(srawlins): At the time of writing, 230 violations in lib/. The fix
# is mechanical, via `dartfmt --fix-named-default-separator`.
prefer_equal_for_default_values: ignore
diff --git a/pkg/analyzer/lib/dart/analysis/context_locator.dart b/pkg/analyzer/lib/dart/analysis/context_locator.dart
index d2c4cd3..2211439 100644
--- a/pkg/analyzer/lib/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/dart/analysis/context_locator.dart
@@ -39,9 +39,9 @@
List<AnalysisContext> locateContexts(
{@required List<String> includedPaths,
List<String> excludedPaths: const <String>[],
- String optionsFile: null,
- String packagesFile: null,
- String sdkPath: null});
+ String optionsFile,
+ String packagesFile,
+ String sdkPath});
/// Return a list of the context roots that should be used to analyze the
/// files that are included by the list of [includedPaths] and not excluded by
@@ -57,7 +57,7 @@
/// found by looking in the directories containing the context roots.
List<ContextRoot> locateRoots(
{@required List<String> includedPaths,
- List<String> excludedPaths: null,
- String optionsFile: null,
- String packagesFile: null});
+ List<String> excludedPaths,
+ String optionsFile,
+ String packagesFile});
}
diff --git a/pkg/analyzer/lib/exception/exception.dart b/pkg/analyzer/lib/exception/exception.dart
index e475c04..73b1a5d 100644
--- a/pkg/analyzer/lib/exception/exception.dart
+++ b/pkg/analyzer/lib/exception/exception.dart
@@ -21,7 +21,7 @@
* Initialize a newly created exception to have the given [message] and
* [cause].
*/
- AnalysisException([this.message = 'Exception', this.cause = null]);
+ AnalysisException([this.message = 'Exception', this.cause]);
String toString() {
StringBuffer buffer = new StringBuffer();
diff --git a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
index 5d3e616..2566e22 100644
--- a/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
+++ b/pkg/analyzer/lib/src/analysis_options/analysis_options_provider.dart
@@ -41,7 +41,7 @@
/// The given [root] directory will be searched first. If no file is found and
/// if [crawlUp] is `true`, then enclosing directories will be searched.
File getOptionsFile(Folder root, {bool crawlUp: false}) {
- Resource resource = null;
+ Resource resource;
for (Folder folder = root; folder != null; folder = folder.parent) {
resource = folder.getChild(AnalysisEngine.ANALYSIS_OPTIONS_FILE);
if (resource.exists) {
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index 4a58ff8..a1840b0 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -78,7 +78,7 @@
* create their own drivers with the same tools, in theory. Here as a stopgap
* until the official plugin API is complete
*/
- static Function onCreateAnalysisDriver = null;
+ static Function onCreateAnalysisDriver;
/**
* The [ResourceProvider] by which paths are converted into [Resource]s.
diff --git a/pkg/analyzer/lib/src/context/source.dart b/pkg/analyzer/lib/src/context/source.dart
index 71abce1..07a26ee 100644
--- a/pkg/analyzer/lib/src/context/source.dart
+++ b/pkg/analyzer/lib/src/context/source.dart
@@ -251,7 +251,7 @@
// Check .packages and update target and actual URIs as appropriate.
if (_packages != null && containedUri.scheme == 'package') {
- Uri packageUri = null;
+ Uri packageUri;
try {
packageUri =
_packages.resolve(containedUri, notFound: (Uri packageUri) => null);
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index 52a6a24..1f6826a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -76,9 +76,9 @@
List<AnalysisContext> locateContexts(
{@required List<String> includedPaths,
List<String> excludedPaths: const <String>[],
- String optionsFile: null,
- String packagesFile: null,
- String sdkPath: null}) {
+ String optionsFile,
+ String packagesFile,
+ String sdkPath}) {
List<ContextRoot> roots = locateRoots(
includedPaths: includedPaths,
excludedPaths: excludedPaths,
@@ -120,9 +120,9 @@
@override
List<ContextRoot> locateRoots(
{@required List<String> includedPaths,
- List<String> excludedPaths: null,
- String optionsFile: null,
- String packagesFile: null}) {
+ List<String> excludedPaths,
+ String optionsFile,
+ String packagesFile}) {
//
// Compute the list of folders and files that are to be included.
//
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index c71d4d3..f28a361 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -95,6 +95,11 @@
/// zero, we stop writing any new exception contexts in this process.
static int allowedNumberOfContextsToWrite = 10;
+ /// Whether summary2 should be used to resynthesize elements.
+ @Deprecated('Clients should assume summary2 is used. '
+ 'Summary1 support has been removed.')
+ static bool get useSummary2 => true;
+
/// The scheduler that schedules analysis work in this, and possibly other
/// analysis drivers.
final AnalysisDriverScheduler _scheduler;
@@ -1592,7 +1597,7 @@
}
void _reportException(String path, exception, StackTrace stackTrace) {
- String contextKey = null;
+ String contextKey;
if (exception is _ExceptionState) {
var state = exception as _ExceptionState;
exception = state.exception;
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index 06b9e65..d4c2171 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -27,7 +27,7 @@
List<bool> _buildExperimentalFlagsArray() => <bool>[
true, // constant-update-2018
true, // control-flow-collections
- IsEnabledByDefault.extension_methods,
+ true, // extension-methods
IsEnabledByDefault.non_nullable,
true, // set-literals
true, // spread-collections
@@ -95,7 +95,8 @@
EnableString.extension_methods,
IsEnabledByDefault.extension_methods,
IsExpired.extension_methods,
- 'Extension Methods');
+ 'Extension Methods',
+ firstSupportedVersion: '2.6.0');
static const non_nullable = const ExperimentalFeature(
3,
@@ -160,7 +161,7 @@
static const bool control_flow_collections = true;
/// Default state of the experiment "extension-methods"
- static const bool extension_methods = false;
+ static const bool extension_methods = true;
/// Default state of the experiment "non-nullable"
static const bool non_nullable = false;
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 80d34b3..cfb2a93 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -507,7 +507,7 @@
ErrorReporter libraryErrorReporter = _getErrorReporter(_library);
- LibraryIdentifier libraryNameNode = null;
+ LibraryIdentifier libraryNameNode;
var seenPartSources = new Set<Source>();
var directivesToResolve = <Directive>[];
int partIndex = 0;
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index d38a651..dc4cc41 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -876,7 +876,7 @@
}
// Create locations for every usage of the element.
List<SearchResult> results = <SearchResult>[];
- CompilationUnitElement enclosingUnitElement = null;
+ CompilationUnitElement enclosingUnitElement;
for (;
i < index.usedElements.length && index.usedElements[i] == elementId;
i++) {
@@ -956,7 +956,7 @@
// Create results for every usage of the name.
List<SearchResult> results = <SearchResult>[];
- CompilationUnitElement enclosingUnitElement = null;
+ CompilationUnitElement enclosingUnitElement;
for (; i < index.usedNames.length && index.usedNames[i] == nameId; i++) {
IndexRelationKind relationKind = index.usedNameKinds[i];
SearchResultKind resultKind = relationToResultKind[relationKind];
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 9dd4e72..4e5e5ac 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -716,7 +716,7 @@
/// representing the parameter to which the value of the right operand will be
/// bound. Otherwise, return `null`.
ParameterElement get _staticParameterElementForRightHandSide {
- ExecutableElement executableElement = null;
+ ExecutableElement executableElement;
if (staticElement != null) {
executableElement = staticElement;
} else {
@@ -5938,7 +5938,7 @@
/// If this expression is both in a getter and setter context, the
/// [AuxiliaryElements] will be set to hold onto the static element from the
/// getter context.
- AuxiliaryElements auxiliaryElements = null;
+ AuxiliaryElements auxiliaryElements;
/// Initialize a newly created index expression.
IndexExpressionImpl.forCascade(
@@ -8921,7 +8921,7 @@
/// If this expression is both in a getter and setter context, the
/// [AuxiliaryElements] will be set to hold onto the static element from the
/// getter context.
- AuxiliaryElements auxiliaryElements = null;
+ AuxiliaryElements auxiliaryElements;
@override
List<DartType> tearOffTypeArgumentTypes;
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 6efad5a..67c908d 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -6189,7 +6189,7 @@
@override
void visitFormalParameterList(FormalParameterList node) {
- String groupEnd = null;
+ String groupEnd;
_writer.print('(');
NodeList<FormalParameter> parameters = node.parameters;
int size = parameters.length;
@@ -7496,7 +7496,7 @@
@override
void visitFormalParameterList(FormalParameterList node) {
- String groupEnd = null;
+ String groupEnd;
sink.write('(');
NodeList<FormalParameter> parameters = node.parameters;
int size = parameters.length;
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index 9f37e6b..0d81332 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -231,7 +231,7 @@
// type.
NodeList<SwitchMember> switchMembers = node.members;
bool foundError = false;
- DartType firstType = null;
+ DartType firstType;
for (SwitchMember switchMember in switchMembers) {
if (switchMember is SwitchCase) {
Expression expression = switchMember.expression;
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 0f2f144..42f7ab6 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -585,8 +585,8 @@
while (baseParameter is ParameterMember) {
baseParameter = (baseParameter as ParameterMember).baseElement;
}
- DartObjectImpl argumentValue = null;
- AstNode errorTarget = null;
+ DartObjectImpl argumentValue;
+ AstNode errorTarget;
if (baseParameter.isNamed) {
argumentValue = namedValues[baseParameter.name];
errorTarget = namedNodes[baseParameter.name];
@@ -652,8 +652,8 @@
ConstantVisitor initializerVisitor = new ConstantVisitor(
this, externalErrorReporter,
lexicalEnvironment: parameterMap);
- String superName = null;
- NodeList<Expression> superArguments = null;
+ String superName;
+ NodeList<Expression> superArguments;
for (var i = 0; i < initializers.length; i++) {
var initializer = initializers[i];
if (initializer is ConstructorFieldInitializer) {
@@ -875,11 +875,7 @@
// fixed.
return true;
}
- // TODO(scheglov ) Switch to using this, but not now, dartbug.com/33441
- if (typeSystem.isSubtypeOf(objType, type)) {
- return true;
- }
- return objType.isSubtypeOf(type);
+ return typeSystem.isSubtypeOf(objType, type);
}
/// Determine whether the given string is a valid name for a public symbol
@@ -1018,7 +1014,7 @@
@override
DartObjectImpl visitAdjacentStrings(AdjacentStrings node) {
- DartObjectImpl result = null;
+ DartObjectImpl result;
for (StringLiteral string in node.strings) {
if (result == null) {
result = string.accept(this);
@@ -1432,7 +1428,7 @@
@override
DartObjectImpl visitStringInterpolation(StringInterpolation node) {
- DartObjectImpl result = null;
+ DartObjectImpl result;
bool first = true;
for (InterpolationElement element in node.elements) {
if (first) {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 98921f2..c87f158 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1272,7 +1272,7 @@
/// application classes which have been visited on the way to reaching this
/// one (this is used to detect circularities).
List<ConstructorElement> _computeMixinAppConstructors(
- [List<ClassElementImpl> visitedClasses = null]) {
+ [List<ClassElementImpl> visitedClasses]) {
// First get the list of constructors of the superclass which need to be
// forwarded to this class.
Iterable<ConstructorElement> constructorsToForward;
@@ -1654,7 +1654,7 @@
/// A table mapping the offset of a directive to the annotations associated
/// with that directive, or `null` if none of the annotations in the
/// compilation unit have annotations.
- Map<int, List<ElementAnnotation>> annotationMap = null;
+ Map<int, List<ElementAnnotation>> annotationMap;
/// A list containing all of the top-level accessors (getters and setters)
/// contained in this compilation unit.
@@ -4766,7 +4766,7 @@
buffer.write('>');
}
buffer.write('(');
- String closing = null;
+ String closing;
ParameterKind kind = ParameterKind.REQUIRED;
int parameterCount = parameters.length;
for (int i = 0; i < parameterCount; i++) {
@@ -6965,7 +6965,7 @@
/// if not present. If _libraryCycle is set, then the _libraryCycle field
/// for all libraries reachable from this library in the import/export graph
/// is also set.
- List<LibraryElement> _libraryCycle = null;
+ List<LibraryElement> _libraryCycle;
/// A list containing all of the compilation units that are included in this
/// library using a `part` directive.
@@ -7434,7 +7434,7 @@
// Pop the elements, and share the component across all
// of the elements.
List<LibraryElement> component = <LibraryElement>[];
- LibraryElementImpl cur = null;
+ LibraryElementImpl cur;
do {
cur = stack.removeLast();
active.remove(cur);
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
index b27a187..63238fc 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
@@ -344,7 +344,7 @@
List<Conflict> _findMostSpecificFromNamedCandidates(
Map<Name, FunctionType> map,
Map<Name, List<FunctionType>> namedCandidates) {
- List<Conflict> conflicts = null;
+ List<Conflict> conflicts;
for (var name in namedCandidates.keys) {
if (map.containsKey(name)) {
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index 1c9a60d..f457b8a 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -340,7 +340,7 @@
List<Conflict> _findMostSpecificFromNamedCandidates(
Map<Name, ExecutableElement> map,
Map<Name, List<ExecutableElement>> namedCandidates) {
- List<Conflict> conflicts = null;
+ List<Conflict> conflicts;
for (var name in namedCandidates.keys) {
if (map.containsKey(name)) {
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 6d27b90..737047d 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -608,7 +608,7 @@
buffer.write('>');
}
buffer.write('(');
- String closing = null;
+ String closing;
ParameterKind kind = ParameterKind.REQUIRED;
int parameterCount = parameters.length;
for (int i = 0; i < parameterCount; i++) {
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 68a0c7c..c1339c9 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -1259,7 +1259,7 @@
/**
* The version of [element] for which members are cached.
*/
- int _versionOfCachedMembers = null;
+ int _versionOfCachedMembers;
/**
* Cached [ConstructorElement]s - members or raw elements.
@@ -2847,8 +2847,6 @@
* A concrete implementation of a [TypeParameterType].
*/
class TypeParameterTypeImpl extends TypeImpl implements TypeParameterType {
- static bool _comparingBounds = false;
-
@override
final NullabilitySuffix nullabilitySuffix;
@@ -2874,20 +2872,10 @@
@override
bool operator ==(Object other) {
- if (other is TypeParameterTypeImpl && element == other.element) {
- if (_comparingBounds) {
- // If we're comparing bounds already, then we only need type variable
- // equality.
- return true;
- }
- _comparingBounds = true;
- try {
- return bound == other.bound;
- } finally {
- _comparingBounds = false;
- }
+ if (identical(other, this)) {
+ return true;
}
- return false;
+ return other is TypeParameterTypeImpl && other.element == element;
}
@override
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index cf5639a..756feb8 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -4,13 +4,9 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/standard_ast_factory.dart';
-import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/src/dart/ast/token.dart';
import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/dart/resolver/scope.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/resolver.dart';
@@ -20,7 +16,6 @@
/// A visitor that will re-write an AST to support the optional `new` and
/// `const` feature.
class AstRewriteVisitor extends ScopedVisitor {
- final bool addConstKeyword;
final TypeSystem typeSystem;
/// Initialize a newly created visitor.
@@ -30,8 +25,7 @@
Source source,
TypeProvider typeProvider,
AnalysisErrorListener errorListener,
- {Scope nameScope,
- this.addConstKeyword: false})
+ {Scope nameScope})
: super(definingLibrary, source, typeProvider, errorListener,
nameScope: nameScope);
@@ -60,7 +54,7 @@
astFactory.constructorName(typeName, null, null);
InstanceCreationExpression instanceCreationExpression =
astFactory.instanceCreationExpression(
- _getKeyword(node), constructorName, node.argumentList);
+ null, constructorName, node.argumentList);
NodeReplacer.replace(node, instanceCreationExpression);
} else if (element is ExtensionElement) {
ExtensionOverride extensionOverride = astFactory.extensionOverride(
@@ -94,7 +88,7 @@
// TODO(scheglov) I think we should drop "typeArguments" below.
InstanceCreationExpression instanceCreationExpression =
astFactory.instanceCreationExpression(
- _getKeyword(node), constructorName, node.argumentList,
+ null, constructorName, node.argumentList,
typeArguments: typeArguments);
NodeReplacer.replace(node, instanceCreationExpression);
}
@@ -113,7 +107,7 @@
astFactory.constructorName(typeName, null, null);
InstanceCreationExpression instanceCreationExpression =
astFactory.instanceCreationExpression(
- _getKeyword(node), constructorName, node.argumentList);
+ null, constructorName, node.argumentList);
NodeReplacer.replace(node, instanceCreationExpression);
} else if (prefixedElement is ExtensionElement) {
PrefixedIdentifier extensionName =
@@ -147,49 +141,11 @@
astFactory.constructorName(typeName, node.operator, methodName);
InstanceCreationExpression instanceCreationExpression =
astFactory.instanceCreationExpression(
- _getKeyword(node), constructorName, node.argumentList);
+ null, constructorName, node.argumentList);
NodeReplacer.replace(node, instanceCreationExpression);
}
}
}
}
}
-
- /// Return the token that should be used in the [InstanceCreationExpression]
- /// that corresponds to the given invocation [node].
- Token _getKeyword(MethodInvocation node) {
- return addConstKeyword
- ? new KeywordToken(Keyword.CONST, node.offset)
- : null;
- }
-
- /// Return the type of the given class [element] after substituting any type
- /// arguments from the list of [typeArguments] for the class' type parameters.
- static InterfaceType getType(TypeSystem typeSystem, ClassElement element,
- TypeArgumentList typeArguments) {
- DartType type = element.type;
-
- List<TypeParameterElement> typeParameters = element.typeParameters;
- if (typeParameters.isEmpty) {
- return type;
- }
-
- if (typeArguments == null) {
- return typeSystem.instantiateToBounds(type);
- }
-
- List<DartType> argumentTypes;
- if (typeArguments.arguments.length == typeParameters.length) {
- argumentTypes = typeArguments.arguments
- .map((TypeAnnotation argument) => argument.type)
- .toList();
- } else {
- argumentTypes = List<DartType>.filled(
- typeParameters.length, DynamicTypeImpl.instance);
- }
- List<DartType> parameterTypes = typeParameters
- .map((TypeParameterElement parameter) => parameter.type)
- .toList();
- return type.substitute2(argumentTypes, parameterTypes);
- }
}
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 4ac8a57..56e6382 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -311,7 +311,7 @@
ClassElement classElement, SimpleIdentifier propertyName) {
// TODO(scheglov) Replace with class hierarchy.
String name = propertyName.name;
- Element element = null;
+ Element element;
if (propertyName.inSetterContext()) {
element = classElement.getSetter(name);
}
diff --git a/pkg/analyzer/lib/src/dart/resolver/scope.dart b/pkg/analyzer/lib/src/dart/resolver/scope.dart
index ef8de3a..9304c38 100644
--- a/pkg/analyzer/lib/src/dart/resolver/scope.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/scope.dart
@@ -1035,7 +1035,7 @@
* A table mapping names that are defined in this scope to the element
* representing the thing declared with that name.
*/
- Map<String, Element> _definedNames = null;
+ Map<String, Element> _definedNames;
/**
* Return the scope in which this scope is lexically enclosed.
diff --git a/pkg/analyzer/lib/src/dart/sdk/sdk.dart b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
index 6bf0d08..b3432d7 100644
--- a/pkg/analyzer/lib/src/dart/sdk/sdk.dart
+++ b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
@@ -616,8 +616,8 @@
*/
LibraryMap initialLibraryMap(bool useDart2jsPaths) {
List<String> searchedPaths = <String>[];
- var lastStackTrace = null;
- var lastException = null;
+ StackTrace lastStackTrace;
+ Object lastException;
for (File librariesFile in _libraryMapLocations) {
try {
String contents = librariesFile.readAsStringSync();
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 8ece3f2..ac9b421 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -189,7 +189,7 @@
_checkForMismatchedAccessorTypes(interface);
if (!classElement.isAbstract) {
- List<ExecutableElement> inheritedAbstract = null;
+ List<ExecutableElement> inheritedAbstract;
for (var name in interface.map.keys) {
if (!name.isAccessibleFor(libraryUri)) {
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index df889e0..5b76714 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -1747,6 +1747,15 @@
// extensions. They are invalid and the parser has already reported an
// error at this point. In the future, we should include them in order
// to get navigation, search, etc.
+ pop(); // body
+ pop(); // initializers
+ pop(); // separator
+ pop(); // parameters
+ pop(); // typeParameters
+ pop(); // name
+ pop(); // returnType
+ pop(); // modifiers
+ pop(); // metadata
}
@override
@@ -3593,7 +3602,7 @@
/// Return the token that is lexically first.
Token get beginToken {
- Token firstToken = null;
+ Token firstToken;
for (Token token in [
abstractKeyword,
externalKeyword,
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index a8dfa2e..2813216 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -774,6 +774,6 @@
/// and [cause].
_ElementMismatchException(
CompilationUnitElement compilationUnit, Element element,
- [CaughtException cause = null])
+ [CaughtException cause])
: super('Element mismatch in $compilationUnit at $element', cause);
}
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index fd7e626..17b73d5 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -19,9 +19,7 @@
import 'package:analyzer/src/dart/ast/token.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
-import 'package:analyzer/src/dart/element/member.dart';
import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/type_algebra.dart';
import 'package:analyzer/src/dart/resolver/extension_member_resolver.dart';
import 'package:analyzer/src/dart/resolver/method_invocation_resolver.dart';
import 'package:analyzer/src/dart/resolver/resolution_result.dart';
@@ -711,7 +709,7 @@
[memberName, element.name]);
}
if (propertyName.inGetterContext()) {
- PropertyAccessorElement getter = result.getter;
+ ExecutableElement getter = result.getter;
if (getter == null) {
_resolver.errorReporter.reportErrorForNode(
CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER,
@@ -1101,6 +1099,16 @@
return _resolveTypeParameter(type);
}
+ InterfaceType _instantiateAnnotationClass(ClassElement element) {
+ return element.instantiate(
+ typeArguments: List.filled(
+ element.typeParameters.length,
+ _dynamicType,
+ ),
+ nullabilitySuffix: _resolver.noneOrStarSuffix,
+ );
+ }
+
/**
* Check for a generic method & apply type arguments if any were passed.
*/
@@ -1254,44 +1262,6 @@
_resolver.errorReporter.reportErrorForToken(errorCode, token, arguments);
}
- /// Resolve the [constructorName] to the constructor in the class [element].
- /// Perform inference using [argumentList].
- ConstructorElement _resolveAnnotationConstructor(
- ClassElement element,
- String constructorName,
- ArgumentList argumentList,
- ) {
- var constructor = constructorName != null
- ? element.getNamedConstructor(constructorName)
- : element.unnamedConstructor;
- if (constructor == null) {
- return null;
- }
- if (!constructor.isAccessibleIn(_definingLibrary)) {
- return null;
- }
-
- var typeParameters = element.typeParameters;
- if (typeParameters.isEmpty) {
- return constructor;
- }
-
- var typeArgs = _resolver.typeSystem.inferGenericFunctionOrType(
- typeParameters: typeParameters,
- parameters: constructor.parameters,
- declaredReturnType: null,
- argumentTypes: argumentList.arguments.map((a) => a.staticType).toList(),
- contextReturnType: null,
- isConst: true,
- errorReporter: _resolver.errorReporter,
- errorNode: argumentList,
- );
- return ExecutableMember.from2(
- constructor,
- Substitution.fromPairs(typeParameters, typeArgs),
- );
- }
-
void _resolveAnnotationConstructorInvocationArguments(
Annotation annotation, ConstructorElement constructor) {
ArgumentList argumentList = annotation.arguments;
@@ -1338,11 +1308,8 @@
}
// Class(args)
if (element1 is ClassElement) {
- constructor = _resolveAnnotationConstructor(
- element1,
- null,
- annotation.arguments,
- );
+ constructor = _instantiateAnnotationClass(element1)
+ .lookUpConstructor(null, _definingLibrary);
} else if (element1 == null) {
undefined = true;
}
@@ -1370,11 +1337,8 @@
}
// Class.constructor(args)
if (element1 is ClassElement) {
- constructor = _resolveAnnotationConstructor(
- element1,
- nameNode2.name,
- annotation.arguments,
- );
+ constructor = _instantiateAnnotationClass(element1)
+ .lookUpConstructor(nameNode2.name, _definingLibrary);
nameNode2.staticElement = constructor;
}
if (element1 == null && element2 == null) {
@@ -1399,11 +1363,8 @@
return;
}
// prefix.Class.constructor(args)
- constructor = _resolveAnnotationConstructor(
- element2,
- name3,
- annotation.arguments,
- );
+ constructor = _instantiateAnnotationClass(element2)
+ .lookUpConstructor(name3, _definingLibrary);
nameNode3.staticElement = constructor;
} else if (element2 == null) {
undefined = true;
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 53038fc..b28a0af 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -279,7 +279,7 @@
* The elements that will be defined later in the current scope, but right
* now are not declared.
*/
- HiddenElements _hiddenElements = null;
+ HiddenElements _hiddenElements;
/**
* A list of types used by the [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS]
@@ -2058,7 +2058,7 @@
*/
void _checkForAssignmentToFinal(Expression expression) {
// prepare element
- Element element = null;
+ Element element;
AstNode highlightedNode = expression;
if (expression is Identifier) {
element = expression.staticElement;
@@ -3650,7 +3650,7 @@
ExecutableElement accessorElement =
accessorDeclaration.declaredElement as ExecutableElement;
if (accessorElement is PropertyAccessorElement) {
- PropertyAccessorElement counterpartAccessor = null;
+ PropertyAccessorElement counterpartAccessor;
if (accessorElement.isGetter) {
counterpartAccessor = accessorElement.correspondingSetter;
} else {
@@ -3667,8 +3667,8 @@
return;
}
// Default of null == no accessor or no type (dynamic)
- DartType getterType = null;
- DartType setterType = null;
+ DartType getterType;
+ DartType setterType;
// Get an existing counterpart accessor if any.
if (accessorElement.isGetter) {
getterType = _getGetterType(accessorElement);
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 8e6d623..58b6393 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -560,13 +560,13 @@
Annotation parseAnnotation() {
Token atSign = getAndAdvance();
Identifier name = parsePrefixedIdentifier();
- Token period = null;
- SimpleIdentifier constructorName = null;
+ Token period;
+ SimpleIdentifier constructorName;
if (_matches(TokenType.PERIOD)) {
period = getAndAdvance();
constructorName = parseSimpleIdentifier();
}
- ArgumentList arguments = null;
+ ArgumentList arguments;
if (_matches(TokenType.OPEN_PAREN)) {
arguments = parseArgumentList();
}
@@ -690,7 +690,7 @@
if (_matches(TokenType.COMMA)) {
comma = getAndAdvance();
if (_matches(TokenType.CLOSE_PAREN)) {
- comma = null;
+ comma;
} else {
message = parseExpression2();
if (_matches(TokenType.COMMA)) {
@@ -939,7 +939,7 @@
/// 'break' identifier? ';'
Statement parseBreakStatement() {
Token breakKeyword = getAndAdvance();
- SimpleIdentifier label = null;
+ SimpleIdentifier label;
if (_matchesIdentifier()) {
label = _parseSimpleIdentifierUnchecked();
}
@@ -968,8 +968,8 @@
/// assignmentOperator expressionWithoutCascade
Expression parseCascadeSection() {
Token period = getAndAdvance();
- Expression expression = null;
- SimpleIdentifier functionName = null;
+ Expression expression;
+ SimpleIdentifier functionName;
if (_matchesIdentifier()) {
functionName = _parseSimpleIdentifierUnchecked();
} else if (_currentToken.type == TokenType.OPEN_SQUARE_BRACKET) {
@@ -981,7 +981,7 @@
Token rightBracket = _expect(TokenType.CLOSE_SQUARE_BRACKET);
expression = astFactory.indexExpressionForCascade(
period, leftBracket, index, rightBracket);
- period = null;
+ period;
} finally {
_inInitializer = wasInInitializer;
}
@@ -998,8 +998,8 @@
if (functionName != null) {
expression = astFactory.methodInvocation(expression, period,
functionName, typeArguments, parseArgumentList());
- period = null;
- functionName = null;
+ period;
+ functionName;
} else if (expression == null) {
// It should not be possible to get here.
expression = astFactory.methodInvocation(expression, period,
@@ -1011,7 +1011,7 @@
} while (_isLikelyArgumentList());
} else if (functionName != null) {
expression = astFactory.propertyAccess(expression, period, functionName);
- period = null;
+ period;
}
assert(expression != null);
bool progress = true;
@@ -1065,7 +1065,7 @@
Token keyword = getAndAdvance();
SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
String className = name.name;
- TypeParameterList typeParameters = null;
+ TypeParameterList typeParameters;
TokenType type = _currentToken.type;
if (type == TokenType.LT) {
typeParameters = parseTypeParameterList();
@@ -1084,9 +1084,9 @@
// generate errors if they are not in the order required by the
// specification.
//
- ExtendsClause extendsClause = null;
- WithClause withClause = null;
- ImplementsClause implementsClause = null;
+ ExtendsClause extendsClause;
+ WithClause withClause;
+ ImplementsClause implementsClause;
bool foundClause = true;
while (foundClause) {
Keyword keyword = _currentToken.keyword;
@@ -1136,7 +1136,7 @@
//
// Look for and skip over the extra-lingual 'native' specification.
//
- NativeClause nativeClause = null;
+ NativeClause nativeClause;
if (_matchesKeyword(Keyword.NATIVE) &&
_tokenMatches(_peek(), TokenType.STRING)) {
nativeClause = _parseNativeClause();
@@ -1144,9 +1144,9 @@
//
// Parse the body of the class.
//
- Token leftBracket = null;
- List<ClassMember> members = null;
- Token rightBracket = null;
+ Token leftBracket;
+ List<ClassMember> members;
+ Token rightBracket;
if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
leftBracket = getAndAdvance();
members = _parseClassMembers(className, _getEndToken(leftBracket));
@@ -1367,9 +1367,9 @@
parseSimpleIdentifier(allowKeyword: true, isDeclaration: true),
parseFormalParameterList());
} else if (_tokenMatches(next, TokenType.OPEN_PAREN)) {
- TypeName returnType = null;
+ TypeName returnType;
SimpleIdentifier methodName = parseSimpleIdentifier(isDeclaration: true);
- TypeParameterList typeParameters = null;
+ TypeParameterList typeParameters;
FormalParameterList parameters = parseFormalParameterList();
if (_matches(TokenType.COLON) ||
modifiers.factoryKeyword != null ||
@@ -1484,7 +1484,7 @@
} else if (_tokenMatches(next, TokenType.OPEN_PAREN)) {
SimpleIdentifier methodName =
_parseSimpleIdentifierUnchecked(isDeclaration: true);
- TypeParameterList typeParameters = null;
+ TypeParameterList typeParameters;
FormalParameterList parameters = parseFormalParameterList();
if (methodName.name == className) {
_reportErrorForNode(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type);
@@ -1551,7 +1551,7 @@
/// 'show' identifier (',' identifier)*
/// | 'hide' identifier (',' identifier)*
List<Combinator> parseCombinators() {
- List<Combinator> combinators = null;
+ List<Combinator> combinators;
while (true) {
Combinator combinator = parseCombinator();
if (combinator == null) {
@@ -1575,7 +1575,7 @@
// TODO(brianwilkerson) Consider making the creation of documentation
// comments be lazy.
List<DocumentationCommentToken> tokens = parseDocumentationCommentTokens();
- List<Annotation> metadata = null;
+ List<Annotation> metadata;
while (_matches(TokenType.AT)) {
metadata ??= <Annotation>[];
metadata.add(parseAnnotation());
@@ -1617,7 +1617,7 @@
return astFactory.commentReference(
null, astFactory.simpleIdentifier(syntheticToken));
}
- Token newKeyword = null;
+ Token newKeyword;
if (_tokenMatchesKeyword(firstToken, Keyword.NEW)) {
newKeyword = firstToken;
firstToken = firstToken.next;
@@ -1715,7 +1715,7 @@
// Skip GitHub code blocks.
// https://help.github.com/articles/creating-and-highlighting-code-blocks/
if (tokens.length != 1) {
- if (comment.indexOf('```') != -1) {
+ if (comment.contains('```')) {
isInGitHubCodeBlock = !isInGitHubCodeBlock;
}
if (isInGitHubCodeBlock) {
@@ -1800,7 +1800,7 @@
/// | topLevelDeclaration
CompilationUnit parseCompilationUnit2() {
Token firstToken = _currentToken;
- ScriptTag scriptTag = null;
+ ScriptTag scriptTag;
if (_matches(TokenType.SCRIPT_TAG)) {
scriptTag = astFactory.scriptTag(getAndAdvance());
}
@@ -2081,7 +2081,7 @@
return parseFunctionDeclaration(
commentAndMetadata, modifiers.externalKeyword, null);
} else if (_tokenMatches(next, TokenType.OPEN_PAREN)) {
- TypeName returnType = null;
+ TypeName returnType;
_validateModifiersForTopLevelFunction(modifiers);
return parseFunctionDeclaration(
commentAndMetadata, modifiers.externalKeyword, returnType);
@@ -2196,8 +2196,8 @@
Token ifKeyword = getAndAdvance();
Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
DottedName name = parseDottedName();
- Token equalToken = null;
- StringLiteral value = null;
+ Token equalToken;
+ StringLiteral value;
if (_matches(TokenType.EQ_EQ)) {
equalToken = getAndAdvance();
value = parseStringLiteral();
@@ -2241,14 +2241,14 @@
/// fieldInitializer:
/// ('this' '.')? identifier '=' conditionalExpression cascadeSection*
ConstructorFieldInitializer parseConstructorFieldInitializer(bool hasThis) {
- Token keywordToken = null;
- Token period = null;
+ Token keywordToken;
+ Token period;
if (hasThis) {
keywordToken = getAndAdvance();
period = _expect(TokenType.PERIOD);
}
SimpleIdentifier fieldName = parseSimpleIdentifier();
- Token equals = null;
+ Token equals;
TokenType type = _currentToken.type;
if (type == TokenType.EQ) {
equals = getAndAdvance();
@@ -2298,8 +2298,8 @@
/// type ('.' identifier)?
ConstructorName parseConstructorName() {
TypeName type = parseTypeName(false);
- Token period = null;
- SimpleIdentifier name = null;
+ Token period;
+ SimpleIdentifier name;
if (_matches(TokenType.PERIOD)) {
period = getAndAdvance();
name = parseSimpleIdentifier();
@@ -2319,7 +2319,7 @@
_reportErrorForToken(
ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKeyword);
}
- SimpleIdentifier label = null;
+ SimpleIdentifier label;
if (_matchesIdentifier()) {
label = _parseSimpleIdentifierUnchecked();
}
@@ -2373,7 +2373,7 @@
/// scriptTag? directive*
CompilationUnit parseDirectives2() {
Token firstToken = _currentToken;
- ScriptTag scriptTag = null;
+ ScriptTag scriptTag;
if (_matches(TokenType.SCRIPT_TAG)) {
scriptTag = astFactory.scriptTag(getAndAdvance());
}
@@ -2510,9 +2510,9 @@
EnumDeclaration parseEnumDeclaration(CommentAndMetadata commentAndMetadata) {
Token keyword = getAndAdvance();
SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
- Token leftBracket = null;
+ Token leftBracket;
List<EnumConstantDeclaration> constants = <EnumConstantDeclaration>[];
- Token rightBracket = null;
+ Token rightBracket;
if (_matches(TokenType.OPEN_CURLY_BRACKET)) {
leftBracket = getAndAdvance();
if (_matchesIdentifier() || _matches(TokenType.AT)) {
@@ -2720,8 +2720,8 @@
/// | type
FinalConstVarOrType parseFinalConstVarOrType(bool optional,
{bool inFunctionType: false}) {
- Token keywordToken = null;
- TypeAnnotation type = null;
+ Token keywordToken;
+ TypeAnnotation type;
Keyword keyword = _currentToken.keyword;
if (keyword == Keyword.FINAL || keyword == Keyword.CONST) {
keywordToken = getAndAdvance();
@@ -2755,7 +2755,7 @@
} else {
// Support parameters such as `(/*=K*/ key, /*=V*/ value)`
// This is not supported if the type is required.
- type = null;
+ type;
}
return new FinalConstVarOrType(keywordToken, type);
}
@@ -2883,14 +2883,14 @@
bool wasInLoop = _inLoop;
_inLoop = true;
try {
- Token awaitKeyword = null;
+ Token awaitKeyword;
if (_matchesKeyword(Keyword.AWAIT)) {
awaitKeyword = getAndAdvance();
}
Token forKeyword = _expectKeyword(Keyword.FOR);
Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
- VariableDeclarationList variableList = null;
- Expression initialization = null;
+ VariableDeclarationList variableList;
+ Expression initialization;
if (!_matches(TokenType.SEMICOLON)) {
CommentAndMetadata commentAndMetadata = parseCommentAndMetadata();
if (_matchesIdentifier() &&
@@ -2915,8 +2915,8 @@
if (type == TokenType.COLON) {
_reportErrorForCurrentToken(ParserErrorCode.COLON_IN_PLACE_OF_IN);
}
- DeclaredIdentifier loopVariable = null;
- SimpleIdentifier identifier = null;
+ DeclaredIdentifier loopVariable;
+ SimpleIdentifier identifier;
if (variableList == null) {
// We found: <expression> 'in'
_reportErrorForCurrentToken(
@@ -2981,12 +2981,12 @@
ParserErrorCode.INVALID_AWAIT_IN_FOR, awaitKeyword);
}
Token leftSeparator = _expect(TokenType.SEMICOLON);
- Expression condition = null;
+ Expression condition;
if (!_matches(TokenType.SEMICOLON)) {
condition = parseExpression2();
}
Token rightSeparator = _expect(TokenType.SEMICOLON);
- List<Expression> updaters = null;
+ List<Expression> updaters;
if (!_matches(TokenType.CLOSE_PAREN)) {
updaters = parseExpressionList();
}
@@ -3051,8 +3051,8 @@
}
return astFactory.emptyFunctionBody(getAndAdvance());
}
- Token keyword = null;
- Token star = null;
+ Token keyword;
+ Token star;
bool foundAsync = false;
bool foundSync = false;
if (type.isKeyword) {
@@ -3080,7 +3080,7 @@
if (keyword != null) {
if (!foundAsync) {
_reportErrorForToken(ParserErrorCode.INVALID_SYNC, keyword);
- keyword = null;
+ keyword;
} else if (star != null) {
_reportErrorForToken(
ParserErrorCode.INVALID_STAR_AFTER_ASYNC, star);
@@ -3093,7 +3093,7 @@
_advance();
}
Expression expression = parseExpression2();
- Token semicolon = null;
+ Token semicolon;
if (!inExpression) {
semicolon = _expect(TokenType.SEMICOLON);
}
@@ -3118,7 +3118,7 @@
return astFactory.blockFunctionBody(keyword, star, parseBlock());
} else if (_matchesKeyword(Keyword.NATIVE)) {
Token nativeToken = getAndAdvance();
- StringLiteral stringLiteral = null;
+ StringLiteral stringLiteral;
if (_matches(TokenType.STRING)) {
stringLiteral = _parseStringLiteralUnchecked();
}
@@ -3153,10 +3153,10 @@
CommentAndMetadata commentAndMetadata,
Token externalKeyword,
TypeAnnotation returnType) {
- Token keywordToken = null;
+ Token keywordToken;
bool isGetter = false;
Keyword keyword = _currentToken.keyword;
- SimpleIdentifier name = null;
+ SimpleIdentifier name;
if (keyword == Keyword.GET) {
keywordToken = getAndAdvance();
isGetter = true;
@@ -3165,13 +3165,13 @@
}
if (keywordToken != null && _matches(TokenType.OPEN_PAREN)) {
name = astFactory.simpleIdentifier(keywordToken, isDeclaration: true);
- keywordToken = null;
+ keywordToken;
isGetter = false;
} else {
name = parseSimpleIdentifier(isDeclaration: true);
}
TypeParameterList typeParameters = _parseGenericMethodTypeParameters();
- FormalParameterList parameters = null;
+ FormalParameterList parameters;
if (!isGetter) {
if (_matches(TokenType.OPEN_PAREN)) {
parameters = _parseFormalParameterListUnchecked();
@@ -3261,7 +3261,7 @@
/// type identifier
GenericFunctionType parseGenericFunctionTypeAfterReturnType(
TypeAnnotation returnType) {
- Token functionKeyword = null;
+ Token functionKeyword;
if (_matchesKeyword(Keyword.FUNCTION)) {
functionKeyword = getAndAdvance();
} else if (_matchesIdentifier()) {
@@ -3269,7 +3269,7 @@
} else {
_reportErrorForCurrentToken(ParserErrorCode.MISSING_FUNCTION_KEYWORD);
}
- TypeParameterList typeParameters = null;
+ TypeParameterList typeParameters;
if (_matches(TokenType.LT)) {
typeParameters = parseTypeParameterList();
}
@@ -3288,7 +3288,7 @@
GenericTypeAlias parseGenericTypeAlias(
CommentAndMetadata commentAndMetadata, Token keyword) {
Identifier name = _parseSimpleIdentifierUnchecked(isDeclaration: true);
- TypeParameterList typeParameters = null;
+ TypeParameterList typeParameters;
if (_matches(TokenType.LT)) {
typeParameters = parseTypeParameterList();
}
@@ -3406,8 +3406,8 @@
Expression condition = parseExpression2();
Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
Statement thenStatement = parseStatement2();
- Token elseKeyword = null;
- Statement elseStatement = null;
+ Token elseKeyword;
+ Statement elseStatement;
if (_matchesKeyword(Keyword.ELSE)) {
elseKeyword = getAndAdvance();
elseStatement = parseStatement2();
@@ -3444,9 +3444,9 @@
Token importKeyword = getAndAdvance();
StringLiteral libraryUri = _parseUri();
List<Configuration> configurations = _parseConfigurations();
- Token deferredToken = null;
- Token asToken = null;
- SimpleIdentifier prefix = null;
+ Token deferredToken;
+ Token asToken;
+ SimpleIdentifier prefix;
if (_matchesKeyword(Keyword.DEFERRED)) {
deferredToken = getAndAdvance();
}
@@ -4102,8 +4102,8 @@
}
FinalConstVarOrType holder = parseFinalConstVarOrType(!inFunctionType,
inFunctionType: inFunctionType);
- Token thisKeyword = null;
- Token period = null;
+ Token thisKeyword;
+ Token period;
if (_matchesKeyword(Keyword.THIS)) {
thisKeyword = getAndAdvance();
period = _expect(TokenType.PERIOD);
@@ -4339,7 +4339,7 @@
return parseStringLiteral();
} else if (type == TokenType.INT) {
Token token = getAndAdvance();
- int value = null;
+ int value;
try {
value = int.parse(token.lexeme);
} on FormatException {
@@ -4374,7 +4374,7 @@
return astFactory.doubleLiteral(token, value);
} else if (type == TokenType.HEXADECIMAL) {
Token token = getAndAdvance();
- int value = null;
+ int value;
try {
value = int.parse(token.lexeme);
} on FormatException {
@@ -4443,8 +4443,8 @@
RedirectingConstructorInvocation parseRedirectingConstructorInvocation(
bool hasPeriod) {
Token keyword = getAndAdvance();
- Token period = null;
- SimpleIdentifier constructorName = null;
+ Token period;
+ SimpleIdentifier constructorName;
if (hasPeriod) {
period = getAndAdvance();
if (_matchesIdentifier()) {
@@ -4482,7 +4482,7 @@
expression, asOperator, parseTypeNotVoid(true));
} else if (keyword == Keyword.IS) {
Token isOperator = getAndAdvance();
- Token notOperator = null;
+ Token notOperator;
if (_matches(TokenType.BANG)) {
notOperator = getAndAdvance();
}
@@ -4614,7 +4614,7 @@
}
_treeDepth++;
try {
- List<Label> labels = null;
+ List<Label> labels;
while (
_matchesIdentifier() && _currentToken.next.type == TokenType.COLON) {
Label label = parseLabel(isDeclaration: true);
@@ -4664,8 +4664,8 @@
/// 'super' ('.' identifier)? arguments
SuperConstructorInvocation parseSuperConstructorInvocation() {
Token keyword = getAndAdvance();
- Token period = null;
- SimpleIdentifier constructorName = null;
+ Token period;
+ SimpleIdentifier constructorName;
if (_matches(TokenType.PERIOD)) {
period = getAndAdvance();
constructorName = parseSimpleIdentifier();
@@ -4695,7 +4695,7 @@
Expression expression = parseExpression2();
Token rightParenthesis = _expect(TokenType.CLOSE_PAREN);
Token leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET);
- Token defaultKeyword = null;
+ Token defaultKeyword;
List<SwitchMember> members = <SwitchMember>[];
TokenType type = _currentToken.type;
while (type != TokenType.EOF && type != TokenType.CLOSE_CURLY_BRACKET) {
@@ -4852,20 +4852,20 @@
Token tryKeyword = getAndAdvance();
Block body = _parseBlockChecked();
List<CatchClause> catchClauses = <CatchClause>[];
- Block finallyClause = null;
+ Block finallyClause;
while (_matchesKeyword(Keyword.ON) || _matchesKeyword(Keyword.CATCH)) {
- Token onKeyword = null;
- TypeName exceptionType = null;
+ Token onKeyword;
+ TypeName exceptionType;
if (_matchesKeyword(Keyword.ON)) {
onKeyword = getAndAdvance();
exceptionType = parseTypeNotVoid(false);
}
- Token catchKeyword = null;
- Token leftParenthesis = null;
- SimpleIdentifier exceptionParameter = null;
- Token comma = null;
- SimpleIdentifier stackTraceParameter = null;
- Token rightParenthesis = null;
+ Token catchKeyword;
+ Token leftParenthesis;
+ SimpleIdentifier exceptionParameter;
+ Token comma;
+ SimpleIdentifier stackTraceParameter;
+ Token rightParenthesis;
if (_matchesKeyword(Keyword.CATCH)) {
catchKeyword = getAndAdvance();
leftParenthesis = _expect(TokenType.OPEN_PAREN);
@@ -4888,7 +4888,7 @@
rightParenthesis,
catchBody));
}
- Token finallyKeyword = null;
+ Token finallyKeyword;
if (_matchesKeyword(Keyword.FINALLY)) {
finallyKeyword = getAndAdvance();
finallyClause = _parseBlockChecked();
@@ -4942,7 +4942,7 @@
/// typeWithoutFunction
/// | functionType
TypeAnnotation parseTypeAnnotation(bool inExpression) {
- TypeAnnotation type = null;
+ TypeAnnotation type;
if (_atGenericFunctionTypeAfterReturnType(_currentToken)) {
// Generic function type with no return type.
type = parseGenericFunctionTypeAfterReturnType(null);
@@ -4994,7 +4994,7 @@
/// functionType
/// | typeNotVoidWithoutFunction
TypeAnnotation parseTypeNotVoid(bool inExpression) {
- TypeAnnotation type = null;
+ TypeAnnotation type;
if (_atGenericFunctionTypeAfterReturnType(_currentToken)) {
// Generic function type with no return type.
type = parseGenericFunctionTypeAfterReturnType(null);
@@ -5150,8 +5150,8 @@
// user is in the middle of inserting "int bar;" prior to
// "@deprecated foo() {}").
SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
- Token equals = null;
- Expression initializer = null;
+ Token equals;
+ Expression initializer;
if (_matches(TokenType.EQ)) {
equals = getAndAdvance();
initializer = parseExpression2();
@@ -5268,7 +5268,7 @@
/// 'yield' '*'? expression ';'
YieldStatement parseYieldStatement() {
Token yieldToken = getAndAdvance();
- Token star = null;
+ Token star;
if (_matches(TokenType.STAR)) {
star = getAndAdvance();
}
@@ -5390,7 +5390,7 @@
///
/// This method must be kept in sync with [parseTypeAnnotation].
Token skipTypeAnnotation(Token startToken) {
- Token next = null;
+ Token next;
if (_atGenericFunctionTypeAfterReturnType(startToken)) {
// Generic function type with no return type.
next = skipGenericFunctionTypeAfterReturnType(startToken);
@@ -6053,7 +6053,7 @@
if (_matches(TokenType.COMMA)) {
comma = getAndAdvance();
if (_matches(TokenType.CLOSE_PAREN)) {
- comma = null;
+ comma;
} else {
message = parseExpression2();
if (_matches(TokenType.COMMA)) {
@@ -6142,14 +6142,14 @@
TypeParameterList typeParameters) {
Token equals = _expect(TokenType.EQ);
TypeName superclass = parseTypeName(false);
- WithClause withClause = null;
+ WithClause withClause;
if (_matchesKeyword(Keyword.WITH)) {
withClause = parseWithClause();
} else {
_reportErrorForCurrentToken(
ParserErrorCode.EXPECTED_TOKEN, [Keyword.WITH.lexeme]);
}
- ImplementsClause implementsClause = null;
+ ImplementsClause implementsClause;
if (_matchesKeyword(Keyword.IMPLEMENTS)) {
implementsClause = parseImplementsClause();
}
@@ -6186,7 +6186,7 @@
/// Parse a list of configurations. Return the configurations that were
/// parsed, or `null` if there are no configurations.
List<Configuration> _parseConfigurations() {
- List<Configuration> configurations = null;
+ List<Configuration> configurations;
while (_matchesKeyword(Keyword.IF)) {
configurations ??= <Configuration>[];
configurations.add(parseConfiguration());
@@ -6204,8 +6204,8 @@
SimpleIdentifier name,
FormalParameterList parameters) {
bool bodyAllowed = externalKeyword == null;
- Token separator = null;
- List<ConstructorInitializer> initializers = null;
+ Token separator;
+ List<ConstructorInitializer> initializers;
if (_matches(TokenType.COLON)) {
separator = getAndAdvance();
initializers = <ConstructorInitializer>[];
@@ -6239,7 +6239,7 @@
ParserErrorCode.FACTORY_WITH_INITIALIZERS, factoryKeyword);
}
}
- ConstructorName redirectedConstructor = null;
+ ConstructorName redirectedConstructor;
FunctionBody body;
if (_matches(TokenType.EQ)) {
separator = getAndAdvance();
@@ -6333,17 +6333,17 @@
// better.
//
List<FormalParameter> parameters = <FormalParameter>[];
- Token leftSquareBracket = null;
- Token rightSquareBracket = null;
- Token leftCurlyBracket = null;
- Token rightCurlyBracket = null;
+ Token leftSquareBracket;
+ Token rightSquareBracket;
+ Token leftCurlyBracket;
+ Token rightCurlyBracket;
ParameterKind kind = ParameterKind.REQUIRED;
bool firstParameter = true;
bool reportedMultiplePositionalGroups = false;
bool reportedMultipleNamedGroups = false;
bool reportedMixedGroups = false;
bool wasOptionalParameter = false;
- Token initialToken = null;
+ Token initialToken;
do {
if (firstParameter) {
firstParameter = false;
@@ -6430,7 +6430,7 @@
ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP,
['}', ']']);
rightCurlyBracket = rightSquareBracket;
- rightSquareBracket = null;
+ rightSquareBracket;
// Skip over synthetic closer inserted by fasta
// since we've already reported an error
if (_currentToken.type == TokenType.CLOSE_CURLY_BRACKET &&
@@ -6452,7 +6452,7 @@
ParserErrorCode.WRONG_TERMINATOR_FOR_PARAMETER_GROUP,
[']', '}']);
rightSquareBracket = rightCurlyBracket;
- rightCurlyBracket = null;
+ rightCurlyBracket;
// Skip over synthetic closer inserted by fasta
// since we've already reported an error
if (_currentToken.type == TokenType.CLOSE_SQUARE_BRACKET &&
@@ -6535,12 +6535,12 @@
/// returnType? name
FunctionTypeAlias _parseFunctionTypeAlias(
CommentAndMetadata commentAndMetadata, Token keyword) {
- TypeAnnotation returnType = null;
+ TypeAnnotation returnType;
if (hasReturnTypeInTypeAlias) {
returnType = parseTypeAnnotation(false);
}
SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true);
- TypeParameterList typeParameters = null;
+ TypeParameterList typeParameters;
if (_matches(TokenType.LT)) {
typeParameters = parseTypeParameterList();
}
@@ -6989,7 +6989,7 @@
}
} else {
Token openToken = getAndAdvance();
- Expression expression = null;
+ Expression expression;
if (_matchesKeyword(Keyword.THIS)) {
expression = astFactory.thisExpression(getAndAdvance());
} else {
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 16c150d..1a6ab3f 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1864,7 +1864,7 @@
/// Return `true` if the given [expression] is resolved to a constant
/// variable.
bool _isDebugConstant(Expression expression) {
- Element element = null;
+ Element element;
if (expression is Identifier) {
element = expression.staticElement;
} else if (expression is PropertyAccess) {
@@ -3044,22 +3044,22 @@
/// The class declaration representing the class containing the current node,
/// or `null` if the current node is not contained in a class.
- ClassDeclaration _enclosingClassDeclaration = null;
+ ClassDeclaration _enclosingClassDeclaration;
/// The function type alias representing the function type containing the
/// current node, or `null` if the current node is not contained in a function
/// type alias.
- FunctionTypeAlias _enclosingFunctionTypeAlias = null;
+ FunctionTypeAlias _enclosingFunctionTypeAlias;
/// The element representing the function containing the current node, or
/// `null` if the current node is not contained in a function.
- ExecutableElement _enclosingFunction = null;
+ ExecutableElement _enclosingFunction;
/// The mixin declaration representing the class containing the current node,
/// or `null` if the current node is not contained in a mixin.
- MixinDeclaration _enclosingMixinDeclaration = null;
+ MixinDeclaration _enclosingMixinDeclaration;
- InferenceContext inferenceContext = null;
+ InferenceContext inferenceContext;
/// The object keeping track of which elements have had their types promoted.
TypePromotionManager _promoteManager;
@@ -3171,7 +3171,7 @@
}
}
- NullabilitySuffix get _noneOrStarSuffix {
+ NullabilitySuffix get noneOrStarSuffix {
return _nonNullableEnabled
? NullabilitySuffix.none
: NullabilitySuffix.star;
@@ -3189,7 +3189,7 @@
/// @param expression the expression with which the element is associated
/// @return the element associated with the given expression
VariableElement getOverridableStaticElement(Expression expression) {
- Element element = null;
+ Element element;
if (expression is SimpleIdentifier) {
element = expression.staticElement;
} else if (expression is PrefixedIdentifier) {
@@ -3241,7 +3241,7 @@
// parameter and return type are in terms of the surrounding context.
return fnType.instantiate(typeParameters.map((TypeParameter t) {
return t.declaredElement.instantiate(
- nullabilitySuffix: _noneOrStarSuffix,
+ nullabilitySuffix: noneOrStarSuffix,
);
}).toList());
}
@@ -4312,9 +4312,9 @@
// because it needs to be visited in the context of the constructor
// invocation.
//
+ node.accept(elementResolver);
InferenceContext.setType(node.argumentList, node.staticElement?.type);
node.argumentList?.accept(this);
- node.accept(elementResolver);
node.accept(typeAnalyzer);
}
@@ -4419,9 +4419,9 @@
// because it needs to be visited in the context of the constructor
// invocation.
//
+ node.accept(elementResolver);
InferenceContext.setType(node.argumentList, node.staticElement?.type);
node.argumentList?.accept(this);
- node.accept(elementResolver);
node.accept(typeAnalyzer);
}
@@ -4994,7 +4994,7 @@
int requiredParameterCount = 0;
int unnamedParameterCount = 0;
List<ParameterElement> unnamedParameters = new List<ParameterElement>();
- Map<String, ParameterElement> namedParameters = null;
+ Map<String, ParameterElement> namedParameters;
int length = parameters.length;
for (int i = 0; i < length; i++) {
ParameterElement parameter = parameters[i];
@@ -5016,7 +5016,7 @@
List<ParameterElement> resolvedParameters =
new List<ParameterElement>(argumentCount);
int positionalArgumentCount = 0;
- HashSet<String> usedNames = null;
+ HashSet<String> usedNames;
bool noBlankArguments = true;
for (int i = 0; i < argumentCount; i++) {
Expression argument = arguments[i];
@@ -6124,7 +6124,7 @@
return;
}
- DartType type = null;
+ DartType type;
if (element == DynamicElementImpl.instance) {
_setElement(typeName, element);
type = DynamicTypeImpl.instance;
@@ -6548,8 +6548,8 @@
final Source source;
final AnalysisErrorListener errorListener;
- Scope libraryScope = null;
- TypeNameResolver typeNameResolver = null;
+ Scope libraryScope;
+ TypeNameResolver typeNameResolver;
TypeParameterBoundsResolver(this.typeSystem, this.library, this.source,
this.errorListener, FeatureSet featureSet)
@@ -6636,7 +6636,7 @@
void _resolveTypeParameters(
TypeParameterList typeParameters, Scope createTypeParametersScope()) {
if (typeParameters != null) {
- Scope typeParametersScope = null;
+ Scope typeParametersScope;
for (TypeParameter typeParameter in typeParameters.typeParameters) {
TypeAnnotation bound = typeParameter.bound;
if (bound != null) {
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 67dfd49..f981dcf 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -367,7 +367,7 @@
@override
void visitMapLiteralEntry(MapLiteralEntry node) {
- String libraryName = null;
+ String libraryName;
Expression key = node.key;
if (key is SimpleStringLiteral) {
libraryName = "$_LIBRARY_PREFIX${key.value}";
@@ -486,7 +486,7 @@
* 'lib' directory within the SDK.
*/
@override
- String path = null;
+ String path;
/**
* The name of the category containing the library. Unless otherwise specified
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index e8108bb..5d44d4b 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -107,9 +107,21 @@
* inferred type parameters found by the resolver.
*/
void inferConstructorName(ConstructorName node, InterfaceType type) {
+ // TODO(scheglov) Inline.
node.type.type = type;
- if (type != _typeSystem.instantiateToBounds(type.element.type)) {
- _resolver.inferenceContext.recordInference(node.parent, type);
+ // TODO(scheglov) Remove when DDC stops using analyzer.
+ var element = type.element;
+ if (element.typeParameters.isNotEmpty) {
+ var typeParameterBounds = _typeSystem.instantiateTypeFormalsToBounds(
+ element.typeParameters,
+ );
+ var instantiatedToBounds = element.instantiate(
+ typeArguments: typeParameterBounds,
+ nullabilitySuffix: _noneOrStarSuffix,
+ );
+ if (type != instantiatedToBounds) {
+ _resolver.inferenceContext.recordInference(node.parent, type);
+ }
}
}
@@ -1389,13 +1401,13 @@
}
ClassElement returnType = library.getType(elementName);
if (returnType != null) {
- if (returnType.typeParameters.isNotEmpty) {
- // Caller can't deal with unbound type parameters, so substitute
- // `dynamic`.
- return returnType.type.instantiate(
- returnType.typeParameters.map((_) => _dynamicType).toList());
- }
- return returnType.type;
+ return returnType.instantiate(
+ typeArguments: List.filled(
+ returnType.typeParameters.length,
+ _dynamicType,
+ ),
+ nullabilitySuffix: _noneOrStarSuffix,
+ );
}
}
return null;
@@ -1802,7 +1814,7 @@
e.library.source.uri.toString() == 'dart:_foreign_helper' &&
e.name == 'JS') {
String typeStr = _getFirstArgumentAsString(node.argumentList);
- DartType returnType = null;
+ DartType returnType;
if (typeStr == '-dynamic') {
returnType = _typeProvider.bottomType;
} else {
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index f6687b4..810d916 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -1345,7 +1345,7 @@
TokenFactory.tokenFromKeyword(Keyword.EXTENDS), bound);
static TypeParameterList typeParameterList([List<String> typeNames]) {
- List<TypeParameter> typeParameters = null;
+ List<TypeParameter> typeParameters;
if (typeNames != null && typeNames.isNotEmpty) {
typeParameters = new List<TypeParameter>();
for (String typeName in typeNames) {
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 7a84adf..d64f2d5 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -361,7 +361,7 @@
}
List<TypeParameterElement> getFreeParameters(DartType rootType) {
- List<TypeParameterElement> parameters = null;
+ List<TypeParameterElement> parameters;
Set<DartType> visitedTypes = new HashSet<DartType>();
void appendParameters(DartType type) {
@@ -1174,7 +1174,7 @@
}
static List<T> _transformList<T>(List<T> list, T f(T t)) {
- List<T> newList = null;
+ List<T> newList;
for (var i = 0; i < list.length; i++) {
var item = list[i];
var newItem = f(item);
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 52439ce..8217608 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -1266,8 +1266,8 @@
}
}
- String docComplete = null;
- String docSummary = null;
+ String docComplete;
+ String docSummary;
void setDartDoc(AnnotatedNode node) {
if (node.documentationComment != null) {
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index bb96dd0..ff48204 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -381,8 +381,14 @@
_indexUnitDeclarations(unitContext, unitRef, unitNode);
}
- MethodElementImpl _method(ClassElementImpl enclosing, Reference reference) {
- enclosing.methods;
+ MethodElementImpl _method(ElementImpl enclosing, Reference reference) {
+ if (enclosing is ClassElementImpl) {
+ enclosing.methods;
+ } else if (enclosing is ExtensionElementImpl) {
+ enclosing.methods;
+ } else {
+ throw StateError('${enclosing.runtimeType}');
+ }
// Requesting methods sets elements for all of them.
assert(reference.element != null);
return reference.element;
diff --git a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
index ac7435a..5d77644 100644
--- a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
@@ -10,15 +10,18 @@
import 'package:analyzer/src/generated/resolver.dart';
import 'package:analyzer/src/summary2/ast_resolver.dart';
import 'package:analyzer/src/summary2/link.dart';
+import 'package:analyzer/src/summary2/linking_node_scope.dart';
class MetadataResolver extends ThrowingAstVisitor<void> {
final Linker _linker;
final LibraryElement _libraryElement;
final Scope _libraryScope;
final CompilationUnitElement _unitElement;
+ Scope _scope;
- MetadataResolver(this._linker, this._libraryElement, this._libraryScope,
- this._unitElement);
+ MetadataResolver(
+ this._linker, this._libraryElement, this._libraryScope, this._unitElement)
+ : _scope = _libraryScope;
@override
void visitAnnotation(Annotation node) {
@@ -27,7 +30,7 @@
var holder = ElementHolder();
node.accept(LocalElementBuilder(holder, null));
- var astResolver = AstResolver(_linker, _libraryElement, _libraryScope);
+ var astResolver = AstResolver(_linker, _libraryElement, _scope);
astResolver.rewriteAst(node);
astResolver.resolve(node);
}
@@ -36,7 +39,13 @@
void visitClassDeclaration(ClassDeclaration node) {
node.metadata.accept(this);
node.typeParameters?.accept(this);
- node.members.accept(this);
+
+ _scope = LinkingNodeContext.get(node).scope;
+ try {
+ node.members.accept(this);
+ } finally {
+ _scope = _libraryScope;
+ }
}
@override
@@ -82,7 +91,13 @@
void visitExtensionDeclaration(ExtensionDeclaration node) {
node.metadata.accept(this);
node.typeParameters?.accept(this);
- node.members.accept(this);
+
+ _scope = LinkingNodeContext.get(node).scope;
+ try {
+ node.members.accept(this);
+ } finally {
+ _scope = _libraryScope;
+ }
}
@override
@@ -161,7 +176,13 @@
void visitMixinDeclaration(MixinDeclaration node) {
node.metadata.accept(this);
node.typeParameters?.accept(this);
- node.members.accept(this);
+
+ _scope = LinkingNodeContext.get(node).scope;
+ try {
+ node.members.accept(this);
+ } finally {
+ _scope = _libraryScope;
+ }
}
@override
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 2cef609..76b23f9 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -94,9 +94,9 @@
variable.initializer.accept(LocalElementBuilder(holder, null));
(element as VariableElementImpl).encloseElements(holder.functions);
- InferenceContext.setType(variable.initializer, typeNode.type);
var astResolver = AstResolver(linker, _library, _scope);
astResolver.rewriteAst(variable.initializer);
+ InferenceContext.setType(variable.initializer, typeNode.type);
astResolver.resolve(variable.initializer);
}
}
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index 3a196922..0c0a8e6 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -1012,7 +1012,7 @@
var type = functionType.returnType;
- ClassElement expectedElement = null;
+ ClassElement expectedElement;
if (body.isAsynchronous) {
if (body.isGenerator) {
// Stream<T> -> T
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index d0e19d8..a4707b5 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -147,7 +147,7 @@
*/
DartType _computeParameterType(ParameterElement parameter, int index,
List<FunctionType> overriddenTypes) {
- DartType parameterType = null;
+ DartType parameterType;
int length = overriddenTypes.length;
for (int i = 0; i < length; i++) {
ParameterElement matchingParameter = _getCorrespondingParameter(
@@ -191,7 +191,7 @@
* want to be smarter about it.
*/
DartType _computeReturnType(Iterable<DartType> overriddenReturnTypes) {
- DartType returnType = null;
+ DartType returnType;
for (DartType type in overriddenReturnTypes) {
if (type == null) {
type = typeProvider.dynamicType;
@@ -567,7 +567,7 @@
* Initialize a newly created gatherer to gather all of the variables that
* pass the given [filter] (or all variables if no filter is provided).
*/
- VariableGatherer([this.filter = null]);
+ VariableGatherer([this.filter]);
@override
void visitSimpleIdentifier(SimpleIdentifier node) {
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 7e9a9ed..87a5af6 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -35,6 +35,10 @@
return _node(search, (n) => n is Block);
}
+ BooleanLiteral booleanLiteral(String search) {
+ return _node(search, (n) => n is BooleanLiteral);
+ }
+
BreakStatement breakStatement(String search) {
return _node(search, (n) => n is BreakStatement);
}
@@ -75,6 +79,10 @@
return _node(search, (n) => n is DoStatement);
}
+ DoubleLiteral doubleLiteral(String search) {
+ return _node(search, (n) => n is DoubleLiteral);
+ }
+
ExportDirective export(String search) {
return _node(search, (n) => n is ExportDirective);
}
@@ -179,6 +187,10 @@
return _node(search, (n) => n is NamedExpression);
}
+ NullLiteral nullLiteral(String search) {
+ return _node(search, (n) => n is NullLiteral);
+ }
+
ParenthesizedExpression parenthesized(String search) {
return _node(search, (n) => n is ParenthesizedExpression);
}
@@ -239,6 +251,10 @@
return _node(search, (n) => n is SwitchStatement);
}
+ SymbolLiteral symbolLiteral(String search) {
+ return _node(search, (n) => n is SymbolLiteral);
+ }
+
ThisExpression this_(String search) {
return _node(search, (n) => n is ThisExpression);
}
@@ -290,7 +306,7 @@
AstNode _node(String search, bool Function(AstNode) predicate) {
var index = content.indexOf(search);
- if (content.indexOf(search, index + 1) != -1) {
+ if (content.contains(search, index + 1)) {
throw new StateError('The pattern |$search| is not unique in:\n$content');
}
if (index < 0) {
diff --git a/pkg/analyzer/lib/src/util/glob.dart b/pkg/analyzer/lib/src/util/glob.dart
index 97c122f..0283753 100644
--- a/pkg/analyzer/lib/src/util/glob.dart
+++ b/pkg/analyzer/lib/src/util/glob.dart
@@ -81,8 +81,8 @@
static bool _hasJustPrefix(String pattern, String prefix) {
if (pattern.startsWith(prefix)) {
int prefixLength = prefix.length;
- return pattern.indexOf('*', prefixLength) == -1 &&
- pattern.indexOf('?', prefixLength) == -1;
+ return !pattern.contains('*', prefixLength) &&
+ !pattern.contains('?', prefixLength);
}
return false;
}
diff --git a/pkg/analyzer/lib/src/workspace/bazel.dart b/pkg/analyzer/lib/src/workspace/bazel.dart
index d66c851..5fcbbaf 100644
--- a/pkg/analyzer/lib/src/workspace/bazel.dart
+++ b/pkg/analyzer/lib/src/workspace/bazel.dart
@@ -80,7 +80,7 @@
String fileUriPart = uriPath.substring(slash + 1);
String filePath = fileUriPart.replaceAll('/', _context.separator);
- if (packageName.indexOf('.') == -1) {
+ if (!packageName.contains('.')) {
String fullFilePath = _context.join(_workspace.root, 'third_party',
'dart', packageName, 'lib', filePath);
File file = _workspace.findFile(fullFilePath);
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
index 4a90853..db57bbb 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_test.dart
@@ -165,6 +165,10 @@
var v = const A(foo);
''', [
error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 116, 3),
+ error(
+ CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+ 116,
+ 3),
]);
}
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index 6a4c187..8f4902a7 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -588,7 +588,7 @@
test_visitConstructorName_unnamed() async {
ClassElementImpl classA = ElementFactory.classElement2("A");
- String constructorName = null;
+ String constructorName;
ConstructorElement constructor =
ElementFactory.constructorElement2(classA, constructorName);
classA.constructors = <ConstructorElement>[constructor];
@@ -738,7 +738,7 @@
test_visitInstanceCreationExpression_unnamed() async {
ClassElementImpl classA = ElementFactory.classElement2("A");
- String constructorName = null;
+ String constructorName;
ConstructorElement constructor =
ElementFactory.constructorElement2(classA, constructorName);
classA.constructors = <ConstructorElement>[constructor];
@@ -754,7 +754,7 @@
test_visitInstanceCreationExpression_unnamed_namedParameter() async {
ClassElementImpl classA = ElementFactory.classElement2("A");
- String constructorName = null;
+ String constructorName;
ConstructorElementImpl constructor =
ElementFactory.constructorElement2(classA, constructorName);
String parameterName = "a";
diff --git a/pkg/analyzer/test/generated/error_suppression_test.dart b/pkg/analyzer/test/generated/error_suppression_test.dart
index fc6c5d50c..d3e8852 100644
--- a/pkg/analyzer/test/generated/error_suppression_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_test.dart
@@ -2,13 +2,10 @@
// 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:analyzer/error/error.dart';
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
-import 'resolver_test_case.dart';
+import '../src/dart/resolution/driver_resolution.dart';
main() {
defineReflectiveSuite(() {
@@ -17,221 +14,203 @@
}
@reflectiveTest
-class ErrorSuppressionTest extends ResolverTestCase {
+class ErrorSuppressionTest extends DriverResolutionTest {
String get ignoredCode => 'const_initialized_with_non_constant_value';
- List<ErrorCode> get reportedCodes => [
- CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
- ];
-
- List<ErrorCode> get reportedCodesWithAssignment => [
- StaticTypeWarningCode.INVALID_ASSIGNMENT,
- CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE,
- ];
-
test_error_code_mismatch() async {
- Source source = addSource('''
+ await assertErrorsInCode('''
// ignore: $ignoredCode
int x = '';
const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
-''');
- await computeAnalysisResult(source);
- assertErrors(source, reportedCodesWithAssignment);
+''', [
+ error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 61, 2),
+ error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 75,
+ 1),
+ ]);
}
test_ignore_first() async {
- Source source = addSource('''
+ await assertErrorsInCode('''
// ignore: invalid_assignment
int x = '';
// ... but no ignore here ...
const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
-''');
- await computeAnalysisResult(source);
- assertErrors(source, reportedCodes);
+''', [
+ error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 82,
+ 1),
+ ]);
}
test_ignore_first_trailing() async {
- Source source = addSource('''
+ await assertErrorsInCode('''
int x = ''; // ignore: invalid_assignment
// ... but no ignore here ...
const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
-''');
- await computeAnalysisResult(source);
- assertErrors(source, reportedCodes);
+''', [
+ error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 82,
+ 1),
+ ]);
}
test_ignore_for_file() async {
- Source source = addSource('''
+ await assertErrorsInCode('''
int x = ''; //INVALID_ASSIGNMENT
const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
// ignore_for_file: invalid_assignment
-''');
- await computeAnalysisResult(source);
- assertErrors(source, reportedCodes);
+''', [
+ error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 44,
+ 1),
+ ]);
}
test_ignore_for_file_whitespace_variant() async {
- Source source = addSource('''
+ await assertNoErrorsInCode('''
//ignore_for_file: $ignoredCode , invalid_assignment
int x = ''; //INVALID_ASSIGNMENT
const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
''');
- await computeAnalysisResult(source);
- assertErrors(source, []);
}
test_ignore_only_trailing() async {
- Source source = addSource('''
+ await assertNoErrorsInCode('''
int x = ''; // ignore: invalid_assignment
''');
- await computeAnalysisResult(source);
- assertErrors(source, []);
}
test_ignore_second() async {
- Source source = addSource('''
+ await assertErrorsInCode('''
//INVALID_ASSIGNMENT
int x = '';
// ignore: $ignoredCode
const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
-''');
- await computeAnalysisResult(source);
- assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+''', [
+ error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 29, 2),
+ ]);
}
test_ignore_second_trailing() async {
- Source source = addSource('''
+ await assertErrorsInCode('''
//INVALID_ASSIGNMENT
int x = '';
const y = x; // ignore: $ignoredCode
-''');
- await computeAnalysisResult(source);
- assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+''', [
+ error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 29, 2),
+ ]);
}
test_ignore_upper_case() async {
- Source source = addSource('''
+ await assertNoErrorsInCode('''
int x = ''; // ignore: INVALID_ASSIGNMENT
''');
- await computeAnalysisResult(source);
- assertErrors(source, []);
}
test_invalid_error_code() async {
- Source source = addSource('''
+ await assertErrorsInCode('''
// ignore: right_format_wrong_code
int x = '';
const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
-''');
- await computeAnalysisResult(source);
- assertErrors(source, reportedCodesWithAssignment);
+''', [
+ error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 43, 2),
+ error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 57,
+ 1),
+ ]);
}
test_missing_error_codes() async {
- Source source = addSource('''
+ await assertErrorsInCode('''
int x = 3;
// ignore:
const String y = x; //INVALID_ASSIGNMENT, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
-''');
- await computeAnalysisResult(source);
- assertErrors(source, reportedCodesWithAssignment);
+''', [
+ error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 43,
+ 1),
+ error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 43, 1),
+ ]);
}
test_missing_metadata_suffix() async {
- Source source = addSource('''
+ await assertErrorsInCode('''
// ignore invalid_assignment
String y = 3; //INVALID_ASSIGNMENT
-''');
- await computeAnalysisResult(source);
- assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+''', [
+ error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 40, 1),
+ ]);
}
test_multiple_comments() async {
- Source source = addSource('''
+ await assertErrorsInCode('''
int x = ''; //This is the first comment...
// ignore: $ignoredCode
const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
-''');
- await computeAnalysisResult(source);
- assertErrors(source, [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
+''', [
+ error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 8, 2),
+ ]);
}
test_multiple_ignore_for_files() async {
- Source source = addSource('''
+ await assertNoErrorsInCode('''
int x = ''; //INVALID_ASSIGNMENT
const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
// ignore_for_file: invalid_assignment,$ignoredCode
''');
- await computeAnalysisResult(source);
- assertErrors(source, []);
}
test_multiple_ignores() async {
- Source source = addSource('''
+ await assertNoErrorsInCode('''
int x = 3;
// ignore: invalid_assignment, $ignoredCode
const String y = x; //INVALID_ASSIGNMENT, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
''');
- await computeAnalysisResult(source);
- assertErrors(source, []);
}
test_multiple_ignores_trailing() async {
- Source source = addSource('''
+ await assertNoErrorsInCode('''
int x = 3;
const String y = x; // ignore: invalid_assignment, $ignoredCode
''');
- await computeAnalysisResult(source);
- assertErrors(source, []);
}
test_multiple_ignores_whitespace_variant_1() async {
- Source source = addSource('''
+ await assertNoErrorsInCode('''
int x = 3;
//ignore:invalid_assignment,$ignoredCode
const String y = x; //INVALID_ASSIGNMENT, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
''');
- await computeAnalysisResult(source);
- assertErrors(source, []);
}
test_multiple_ignores_whitespace_variant_2() async {
- Source source = addSource('''
+ await assertNoErrorsInCode('''
int x = 3;
//ignore: invalid_assignment,$ignoredCode
const String y = x; //INVALID_ASSIGNMENT, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
''');
- await computeAnalysisResult(source);
- assertErrors(source, []);
}
test_multiple_ignores_whitespace_variant_3() async {
- Source source = addSource('''
+ await assertNoErrorsInCode('''
int x = 3;
// ignore: invalid_assignment,$ignoredCode
const String y = x; //INVALID_ASSIGNMENT, CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
''');
- await computeAnalysisResult(source);
- assertErrors(source, []);
}
test_no_ignores() async {
- Source source = addSource('''
+ await assertErrorsInCode('''
int x = ''; //INVALID_ASSIGNMENT
const y = x; //CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE
-''');
- await computeAnalysisResult(source);
- assertErrors(source, reportedCodesWithAssignment);
+''', [
+ error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 8, 2),
+ error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 44,
+ 1),
+ ]);
}
test_trailing_not_above() async {
- Source source = addSource('''
+ await assertErrorsInCode('''
int x = ''; // ignore: invalid_assignment
int y = '';
-''');
- await computeAnalysisResult(source);
- assertErrors(source, [
- StaticTypeWarningCode.INVALID_ASSIGNMENT,
+''', [
+ error(StaticTypeWarningCode.INVALID_ASSIGNMENT, 50, 2),
]);
}
}
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index e97dbde..f5d274f 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -166,6 +166,29 @@
''');
}
+ test_fuzz_15() async {
+ // `@A` is not a valid annotation, it is missing arguments.
+ // There was a bug that we did not check for arguments being missing.
+ await _assertCanBeAnalyzed(r'''
+class A<T> {}
+
+@A
+class B {}
+''');
+ }
+
+ test_fuzz_16() async {
+ // The default constructor of `A` does not have formal parameters.
+ // But we give it arguments.
+ // There was a bug that we did not check for this mismatch.
+ await _assertCanBeAnalyzed(r'''
+class A<T> {}
+
+@A(0)
+class B {}
+''');
+ }
+
test_fuzz_38091() async {
// https://github.com/dart-lang/sdk/issues/38091
// this caused an infinite loop in parser recovery
diff --git a/pkg/analyzer/test/generated/issues_test.dart b/pkg/analyzer/test/generated/issues_test.dart
index 93b97b9..198943b 100644
--- a/pkg/analyzer/test/generated/issues_test.dart
+++ b/pkg/analyzer/test/generated/issues_test.dart
@@ -16,6 +16,26 @@
/// not obvious where to put the test otherwise.
@reflectiveTest
class IssuesTest extends DriverResolutionTest {
+ /// https://github.com/dart-lang/sdk/issues/38565
+ ///
+ /// The issue was that type inference for annotation instantiation
+ /// was done incorrectly, without resolving arguments to the annotation
+ /// constructor. So, we were trying to perform type inference using null
+ /// types of arguments.
+ test_issue38565() async {
+ await resolveTestCode('''
+class A<T> {
+ const A(int a);
+}
+
+class C {
+ @A(0)
+ int field;
+}
+''');
+ // Should not crash.
+ }
+
/// https://github.com/dart-lang/sdk/issues/38589
test_issue38589() async {
await resolveTestCode('''
diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
index b219c94..75f8910 100644
--- a/pkg/analyzer/test/generated/non_hint_code_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
@@ -3,11 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/source_io.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../src/dart/resolution/driver_resolution.dart';
-import 'resolver_test_case.dart';
+import 'test_support.dart';
main() {
defineReflectiveSuite(() {
@@ -190,22 +189,24 @@
}
}
-class PubSuggestionCodeTest extends ResolverTestCase {
+class PubSuggestionCodeTest extends DriverResolutionTest {
// TODO(brianwilkerson) The tests in this class are not being run, and all but
// the first would fail. We should implement these checks and enable the
// tests.
test_import_package() async {
await assertErrorsInCode('''
import 'package:somepackage/other.dart';
-''', [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
+''', [
+ error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 0, 0),
+ ]);
}
test_import_packageWithDotDot() async {
await assertErrorsInCode('''
import 'package:somepackage/../other.dart';
''', [
- CompileTimeErrorCode.URI_DOES_NOT_EXIST,
- HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
+ error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 0, 0),
+ error(HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT, 0, 0),
]);
}
@@ -213,71 +214,70 @@
await assertErrorsInCode('''
import 'package:../other.dart';
''', [
- CompileTimeErrorCode.URI_DOES_NOT_EXIST,
- HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
+ error(CompileTimeErrorCode.URI_DOES_NOT_EXIST, 0, 0),
+ error(HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT, 0, 0),
]);
}
test_import_referenceIntoLibDirectory() async {
- addNamedSource("/myproj/pubspec.yaml", "");
- addNamedSource("/myproj/lib/other.dart", "");
- Source source =
- addNamedSource("/myproj/web/test.dart", "import '../lib/other.dart';");
- await computeAnalysisResult(source);
- assertErrors(
- source, [HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE]);
+ newFile("/myproj/pubspec.yaml", content: "");
+ newFile("/myproj/lib/other.dart", content: "");
+ await _assertErrorsInCodeInFile(
+ "/myproj/web/test.dart", "import '../lib/other.dart';", [
+ error(HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE, 0, 0),
+ ]);
}
test_import_referenceIntoLibDirectory_no_pubspec() async {
- addNamedSource("/myproj/lib/other.dart", "");
- Source source =
- addNamedSource("/myproj/web/test.dart", "import '../lib/other.dart';");
- await computeAnalysisResult(source);
- assertNoErrors(source);
+ newFile("/myproj/lib/other.dart", content: "");
+ await _assertErrorsInCodeInFile(
+ "/myproj/web/test.dart", "import '../lib/other.dart';", []);
}
test_import_referenceOutOfLibDirectory() async {
- addNamedSource("/myproj/pubspec.yaml", "");
- addNamedSource("/myproj/web/other.dart", "");
- Source source =
- addNamedSource("/myproj/lib/test.dart", "import '../web/other.dart';");
- await computeAnalysisResult(source);
- assertErrors(
- source, [HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE]);
+ newFile("/myproj/pubspec.yaml", content: "");
+ newFile("/myproj/web/other.dart", content: "");
+ await _assertErrorsInCodeInFile(
+ "/myproj/lib/test.dart", "import '../web/other.dart';", [
+ error(HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE, 0, 0),
+ ]);
}
test_import_referenceOutOfLibDirectory_no_pubspec() async {
- addNamedSource("/myproj/web/other.dart", "");
- Source source =
- addNamedSource("/myproj/lib/test.dart", "import '../web/other.dart';");
- await computeAnalysisResult(source);
- assertNoErrors(source);
+ newFile("/myproj/web/other.dart", content: "");
+ await _assertErrorsInCodeInFile(
+ "/myproj/lib/test.dart", "import '../web/other.dart';", []);
}
test_import_valid_inside_lib1() async {
- addNamedSource("/myproj/pubspec.yaml", "");
- addNamedSource("/myproj/lib/other.dart", "");
- Source source =
- addNamedSource("/myproj/lib/test.dart", "import 'other.dart';");
- await computeAnalysisResult(source);
- assertNoErrors(source);
+ newFile("/myproj/pubspec.yaml", content: "");
+ newFile("/myproj/lib/other.dart", content: "");
+ await _assertErrorsInCodeInFile(
+ "/myproj/lib/test.dart", "import 'other.dart';", []);
}
test_import_valid_inside_lib2() async {
- addNamedSource("/myproj/pubspec.yaml", "");
- addNamedSource("/myproj/lib/bar/other.dart", "");
- Source source = addNamedSource(
- "/myproj/lib/foo/test.dart", "import '../bar/other.dart';");
- await computeAnalysisResult(source);
- assertNoErrors(source);
+ newFile("/myproj/pubspec.yaml", content: "");
+ newFile("/myproj/lib/bar/other.dart", content: "");
+ await _assertErrorsInCodeInFile(
+ "/myproj/lib/foo/test.dart", "import '../bar/other.dart';", []);
}
test_import_valid_outside_lib() async {
- addNamedSource("/myproj/pubspec.yaml", "");
- addNamedSource("/myproj/web/other.dart", "");
- Source source =
- addNamedSource("/myproj/lib2/test.dart", "import '../web/other.dart';");
- await computeAnalysisResult(source);
- assertNoErrors(source);
+ newFile("/myproj/pubspec.yaml", content: "");
+ newFile("/myproj/web/other.dart", content: "");
+ await _assertErrorsInCodeInFile(
+ "/myproj/lib2/test.dart", "import '../web/other.dart';", []);
+ }
+
+ Future<void> _assertErrorsInCodeInFile(
+ String path, String content, List<ExpectedError> expectedErrors) async {
+ path = convertPath(path);
+ newFile(path, content: content);
+ result = await resolveFile(path);
+
+ var errorListener = new GatheringErrorListener();
+ errorListener.addAll(result.errors);
+ errorListener.assertErrors(expectedErrors);
}
}
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index c92e79d..11a75d9 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -1681,6 +1681,34 @@
expect(extension.members, hasLength(0));
}
+ void test_constructor_named() {
+ var unit = parseCompilationUnit('''
+extension E on C {
+ E.named();
+}
+class C {}
+''', errors: [
+ expectedError(ParserErrorCode.EXTENSION_DECLARES_CONSTRUCTOR, 21, 1),
+ ]);
+ expect(unit.declarations, hasLength(2));
+ var extension = unit.declarations[0] as ExtensionDeclaration;
+ expect(extension.members, hasLength(0));
+ }
+
+ void test_constructor_unnamed() {
+ var unit = parseCompilationUnit('''
+extension E on C {
+ E();
+}
+class C {}
+''', errors: [
+ expectedError(ParserErrorCode.EXTENSION_DECLARES_CONSTRUCTOR, 21, 1),
+ ]);
+ expect(unit.declarations, hasLength(2));
+ var extension = unit.declarations[0] as ExtensionDeclaration;
+ expect(extension.members, hasLength(0));
+ }
+
void test_missing_on() {
var unit = parseCompilationUnit('extension E', errors: [
expectedError(ParserErrorCode.EXPECTED_TOKEN, 10, 1),
@@ -1802,133 +1830,6 @@
}
}
-@reflectiveTest
-class VarianceParserTest_Fasta extends FastaParserTestCase {
- @override
- CompilationUnit parseCompilationUnit(String content,
- {List<ErrorCode> codes,
- List<ExpectedError> errors,
- FeatureSet featureSet}) {
- return super.parseCompilationUnit(content,
- codes: codes,
- errors: errors,
- featureSet: featureSet ??
- FeatureSet.forTesting(
- sdkVersion: '2.5.0',
- additionalFeatures: [Feature.variance],
- ));
- }
-
- void test_class_enabled_single() {
- var unit = parseCompilationUnit('class A<in T> { }');
- expect(unit.declarations, hasLength(1));
- var classDecl = unit.declarations[0] as ClassDeclaration;
- expect(classDecl.name.name, 'A');
- expect(classDecl.typeParameters.typeParameters, hasLength(1));
- expect(classDecl.typeParameters.typeParameters[0].name.name, 'T');
- }
-
- void test_class_enabled_multipleVariances() {
- var unit = parseCompilationUnit('class A<in out inout T> { }', errors: [
- expectedError(ParserErrorCode.MULTIPLE_VARIANCE_MODIFIERS, 11, 3),
- expectedError(ParserErrorCode.MULTIPLE_VARIANCE_MODIFIERS, 15, 5)
- ]);
- expect(unit.declarations, hasLength(1));
- var classDecl = unit.declarations[0] as ClassDeclaration;
- expect(classDecl.name.name, 'A');
- expect(classDecl.typeParameters.typeParameters, hasLength(1));
- expect(classDecl.typeParameters.typeParameters[0].name.name, 'T');
- }
-
- void test_class_disabled_single() {
- parseCompilationUnit('class A<out T> { }',
- errors: [
- expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 8, 3),
- ],
- featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
- }
-
- void test_class_disabled_multiple() {
- parseCompilationUnit('class A<in T, inout U, out V> { }',
- errors: [
- expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 8, 2),
- expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 14, 5),
- expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 23, 3)
- ],
- featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
- }
-
- void test_mixin_enabled_single() {
- var unit = parseCompilationUnit('mixin A<inout T> { }');
- expect(unit.declarations, hasLength(1));
- var mixinDecl = unit.declarations[0] as MixinDeclaration;
- expect(mixinDecl.name.name, 'A');
- expect(mixinDecl.typeParameters.typeParameters, hasLength(1));
- expect(mixinDecl.typeParameters.typeParameters[0].name.name, 'T');
- }
-
- void test_mixin_disabled_single() {
- parseCompilationUnit('mixin A<inout T> { }',
- errors: [
- expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 8, 5),
- ],
- featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
- }
-
- void test_mixin_disabled_multiple() {
- parseCompilationUnit('mixin A<inout T, out U> { }',
- errors: [
- expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 8, 5),
- expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 17, 3),
- ],
- featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
- }
-
- void test_typedef_enabled() {
- parseCompilationUnit('typedef A<inout X> = X Function(X);', errors: [
- expectedError(ParserErrorCode.EXPECTED_TOKEN, 16, 1),
- ]);
- }
-
- void test_typedef_disabled() {
- parseCompilationUnit('typedef A<inout X> = X Function(X);',
- errors: [
- expectedError(ParserErrorCode.EXPECTED_TOKEN, 16, 1),
- ],
- featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
- }
-
- void test_list_enabled() {
- parseCompilationUnit('List<out String> stringList = [];', errors: [
- expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 6),
- ]);
- }
-
- void test_list_disabled() {
- parseCompilationUnit('List<out String> stringList = [];',
- errors: [
- expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 6),
- ],
- featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
- }
-
- void test_function_enabled() {
- parseCompilationUnit('void A(in int value) {}', errors: [
- expectedError(ParserErrorCode.MISSING_IDENTIFIER, 7, 2),
- expectedError(ParserErrorCode.EXPECTED_TOKEN, 10, 3),
- ]);
- }
-
- void test_function_disabled() {
- parseCompilationUnit('void A(in int value) {}',
- errors: [
- expectedError(ParserErrorCode.MISSING_IDENTIFIER, 7, 2),
- expectedError(ParserErrorCode.EXPECTED_TOKEN, 10, 3),
- ],
- featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
- }
-}
-
/**
* Implementation of [AbstractParserTestCase] specialized for testing the
* Fasta parser.
@@ -2959,6 +2860,21 @@
parseCompilationUnit('f() { var x = g!.x + 7; }');
}
+ void test_nullCheckBeforeIndex() {
+ // https://github.com/dart-lang/sdk/issues/37708
+ var unit = parseCompilationUnit('f() { foo.bar!.baz[arg]; }');
+ var funct = unit.declarations[0] as FunctionDeclaration;
+ var body = funct.functionExpression.body as BlockFunctionBody;
+ var statement = body.block.statements[0] as ExpressionStatement;
+ var expression = statement.expression as IndexExpression;
+ expect(expression.index.toSource(), 'arg');
+ var propertyAccess = expression.target as PropertyAccess;
+ expect(propertyAccess.propertyName.toSource(), 'baz');
+ var target = propertyAccess.target as PostfixExpression;
+ expect(target.operand.toSource(), 'foo.bar');
+ expect(target.operator.lexeme, '!');
+ }
+
void test_nullCheckBeforeMethodCall() {
parseCompilationUnit('f() { var x = g!.m() + 7; }');
}
@@ -3119,21 +3035,6 @@
expect(target.operand.toSource(), "foo");
}
- void test_nullCheckBeforeIndex() {
- // https://github.com/dart-lang/sdk/issues/37708
- var unit = parseCompilationUnit('f() { foo.bar!.baz[arg]; }');
- var funct = unit.declarations[0] as FunctionDeclaration;
- var body = funct.functionExpression.body as BlockFunctionBody;
- var statement = body.block.statements[0] as ExpressionStatement;
- var expression = statement.expression as IndexExpression;
- expect(expression.index.toSource(), 'arg');
- var propertyAccess = expression.target as PropertyAccess;
- expect(propertyAccess.propertyName.toSource(), 'baz');
- var target = propertyAccess.target as PostfixExpression;
- expect(target.operand.toSource(), 'foo.bar');
- expect(target.operator.lexeme, '!');
- }
-
void test_nullCheckOnLiteral_disabled() {
parseCompilationUnit('f() { var x = 0!; }',
errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 15, 1)],
@@ -4356,3 +4257,130 @@
expect(declarationList.variables, hasLength(1));
}
}
+
+@reflectiveTest
+class VarianceParserTest_Fasta extends FastaParserTestCase {
+ @override
+ CompilationUnit parseCompilationUnit(String content,
+ {List<ErrorCode> codes,
+ List<ExpectedError> errors,
+ FeatureSet featureSet}) {
+ return super.parseCompilationUnit(content,
+ codes: codes,
+ errors: errors,
+ featureSet: featureSet ??
+ FeatureSet.forTesting(
+ sdkVersion: '2.5.0',
+ additionalFeatures: [Feature.variance],
+ ));
+ }
+
+ void test_class_disabled_multiple() {
+ parseCompilationUnit('class A<in T, inout U, out V> { }',
+ errors: [
+ expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 8, 2),
+ expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 14, 5),
+ expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 23, 3)
+ ],
+ featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
+ }
+
+ void test_class_disabled_single() {
+ parseCompilationUnit('class A<out T> { }',
+ errors: [
+ expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 8, 3),
+ ],
+ featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
+ }
+
+ void test_class_enabled_multipleVariances() {
+ var unit = parseCompilationUnit('class A<in out inout T> { }', errors: [
+ expectedError(ParserErrorCode.MULTIPLE_VARIANCE_MODIFIERS, 11, 3),
+ expectedError(ParserErrorCode.MULTIPLE_VARIANCE_MODIFIERS, 15, 5)
+ ]);
+ expect(unit.declarations, hasLength(1));
+ var classDecl = unit.declarations[0] as ClassDeclaration;
+ expect(classDecl.name.name, 'A');
+ expect(classDecl.typeParameters.typeParameters, hasLength(1));
+ expect(classDecl.typeParameters.typeParameters[0].name.name, 'T');
+ }
+
+ void test_class_enabled_single() {
+ var unit = parseCompilationUnit('class A<in T> { }');
+ expect(unit.declarations, hasLength(1));
+ var classDecl = unit.declarations[0] as ClassDeclaration;
+ expect(classDecl.name.name, 'A');
+ expect(classDecl.typeParameters.typeParameters, hasLength(1));
+ expect(classDecl.typeParameters.typeParameters[0].name.name, 'T');
+ }
+
+ void test_function_disabled() {
+ parseCompilationUnit('void A(in int value) {}',
+ errors: [
+ expectedError(ParserErrorCode.MISSING_IDENTIFIER, 7, 2),
+ expectedError(ParserErrorCode.EXPECTED_TOKEN, 10, 3),
+ ],
+ featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
+ }
+
+ void test_function_enabled() {
+ parseCompilationUnit('void A(in int value) {}', errors: [
+ expectedError(ParserErrorCode.MISSING_IDENTIFIER, 7, 2),
+ expectedError(ParserErrorCode.EXPECTED_TOKEN, 10, 3),
+ ]);
+ }
+
+ void test_list_disabled() {
+ parseCompilationUnit('List<out String> stringList = [];',
+ errors: [
+ expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 6),
+ ],
+ featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
+ }
+
+ void test_list_enabled() {
+ parseCompilationUnit('List<out String> stringList = [];', errors: [
+ expectedError(ParserErrorCode.EXPECTED_TOKEN, 9, 6),
+ ]);
+ }
+
+ void test_mixin_disabled_multiple() {
+ parseCompilationUnit('mixin A<inout T, out U> { }',
+ errors: [
+ expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 8, 5),
+ expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 17, 3),
+ ],
+ featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
+ }
+
+ void test_mixin_disabled_single() {
+ parseCompilationUnit('mixin A<inout T> { }',
+ errors: [
+ expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 8, 5),
+ ],
+ featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
+ }
+
+ void test_mixin_enabled_single() {
+ var unit = parseCompilationUnit('mixin A<inout T> { }');
+ expect(unit.declarations, hasLength(1));
+ var mixinDecl = unit.declarations[0] as MixinDeclaration;
+ expect(mixinDecl.name.name, 'A');
+ expect(mixinDecl.typeParameters.typeParameters, hasLength(1));
+ expect(mixinDecl.typeParameters.typeParameters[0].name.name, 'T');
+ }
+
+ void test_typedef_disabled() {
+ parseCompilationUnit('typedef A<inout X> = X Function(X);',
+ errors: [
+ expectedError(ParserErrorCode.EXPECTED_TOKEN, 16, 1),
+ ],
+ featureSet: FeatureSet.forTesting(sdkVersion: '2.5.0'));
+ }
+
+ void test_typedef_enabled() {
+ parseCompilationUnit('typedef A<inout X> = X Function(X);', errors: [
+ expectedError(ParserErrorCode.EXPECTED_TOKEN, 16, 1),
+ ]);
+ }
+}
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 1ff1558..6b7c83e 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -222,7 +222,7 @@
if (token == null) {
return;
}
- Token previousToken = null;
+ Token previousToken;
int previousEnd = -1;
Token currentToken = token;
while (currentToken != null && currentToken.type != TokenType.EOF) {
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index b1a5532..eb0cec2 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -1212,8 +1212,8 @@
_assertHasPrevious(clone);
}
Token stopOriginalToken = originalNode.endToken.next;
- Token skipCloneComment = null;
- Token skipOriginalComment = null;
+ Token skipCloneComment;
+ Token skipOriginalComment;
while (original != stopOriginalToken) {
expect(clone, isNotNull);
_assertEqualToken(clone, original);
diff --git a/pkg/analyzer/test/src/context/builder_test.dart b/pkg/analyzer/test/src/context/builder_test.dart
index 03fb7a6..cfe7454 100644
--- a/pkg/analyzer/test/src/context/builder_test.dart
+++ b/pkg/analyzer/test/src/context/builder_test.dart
@@ -65,7 +65,7 @@
* The path to the default SDK, or `null` if the test has not explicitly
* invoked [createDefaultSdk].
*/
- String defaultSdkPath = null;
+ String defaultSdkPath;
_MockLintRule _mockLintRule;
_MockLintRule _mockLintRule2;
diff --git a/pkg/analyzer/test/src/dart/analysis/base.dart b/pkg/analyzer/test/src/dart/analysis/base.dart
index 46ac748..29aeeb5 100644
--- a/pkg/analyzer/test/src/dart/analysis/base.dart
+++ b/pkg/analyzer/test/src/dart/analysis/base.dart
@@ -26,7 +26,7 @@
* Finds an [Element] with the given [name].
*/
Element findChildElement(Element root, String name, [ElementKind kind]) {
- Element result = null;
+ Element result;
root.accept(new _ElementVisitorFunctionWrapper((Element element) {
if (element.name != name) {
return;
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
index 7c00d1f..1e9c3fb 100644
--- a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
@@ -56,6 +56,7 @@
}
''', [
error(ParserErrorCode.EXPECTED_TOKEN, 10, 1),
+ error(CompileTimeErrorCode.UNDEFINED_CLASS, 12, 0),
error(ParserErrorCode.EXPECTED_TYPE_NAME, 12, 1),
error(ParserErrorCode.EXTENSION_DECLARES_CONSTRUCTOR, 16, 1),
]);
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
index e76fb1b..e9b17ee 100644
--- a/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
@@ -6,6 +6,7 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:meta/meta.dart';
import 'package:test/test.dart';
@@ -316,6 +317,23 @@
validateBinaryExpression();
}
+ test_operator_onTearoff() async {
+ // https://github.com/dart-lang/sdk/issues/38653
+ await assertErrorsInCode('''
+f(){
+ E(null).v++;
+}
+extension E on Object{
+ v() {}
+}
+''', [
+ error(CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER, 15, 1),
+ ]);
+ findDeclarationAndOverride(
+ declarationName: 'E ', overrideSearch: 'E(null)');
+ validateOverride();
+ }
+
test_operator_prefix_noTypeArguments() async {
newFile('/test/lib/lib.dart', content: '''
class A {}
diff --git a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
index c2520f8..c617a00 100644
--- a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
@@ -103,6 +103,7 @@
expect(value.getField('a').getField('f').toIntValue(), 42);
}
+ @FailingTest(reason: 'Reverted because of dartbug.com/38565')
test_sameLibrary_genericClass_constructor_unnamed() async {
await assertNoErrorsInCode(r'''
class A<T> {
diff --git a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
index 9d2253f..97b6c70 100644
--- a/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/argument_type_not_assignable_test.dart
@@ -36,7 +36,7 @@
// mismatch. Furthermore, the error message should mention both _A and the
// filenames so the user can figure out what's going on.
String message = result.errors[0].message;
- expect(message.indexOf("_A") >= 0, isTrue);
+ expect(message.contains("_A"), isTrue);
}
test_annotation_namedConstructor() async {
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 6831be1..4418dfc 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -69,15 +69,17 @@
bool annotateNullability: false,
}) {
var writer = new _ElementWriter(
- withCodeRanges: withCodeRanges,
- withConstElements: withConstElements,
- withExportScope: withExportScope,
- withFullyResolvedAst: withFullyResolvedAst,
- withOffsets: withOffsets,
- withSyntheticAccessors: withSyntheticAccessors,
- withSyntheticFields: withSyntheticFields,
- withTypes: withTypes,
- annotateNullability: annotateNullability);
+ selfUriStr: '${library.source.uri}',
+ withCodeRanges: withCodeRanges,
+ withConstElements: withConstElements,
+ withExportScope: withExportScope,
+ withFullyResolvedAst: withFullyResolvedAst,
+ withOffsets: withOffsets,
+ withSyntheticAccessors: withSyntheticAccessors,
+ withSyntheticFields: withSyntheticFields,
+ withTypes: withTypes,
+ annotateNullability: annotateNullability,
+ );
writer.writeLibraryElement(library);
String actualText = writer.buffer.toString();
@@ -138,6 +140,7 @@
* Writes the canonical text presentation of elements.
*/
class _ElementWriter {
+ final String selfUriStr;
final bool withCodeRanges;
final bool withExportScope;
final bool withFullyResolvedAst;
@@ -149,16 +152,20 @@
final bool annotateNullability;
final StringBuffer buffer = new StringBuffer();
- _ElementWriter(
- {this.withCodeRanges,
- this.withConstElements: true,
- this.withExportScope: false,
- this.withFullyResolvedAst: false,
- this.withOffsets: false,
- this.withSyntheticAccessors: false,
- this.withSyntheticFields: false,
- this.withTypes: false,
- this.annotateNullability: false});
+ String indent = '';
+
+ _ElementWriter({
+ this.selfUriStr,
+ this.withCodeRanges,
+ this.withConstElements: true,
+ this.withExportScope: false,
+ this.withFullyResolvedAst: false,
+ this.withOffsets: false,
+ this.withSyntheticAccessors: false,
+ this.withSyntheticFields: false,
+ this.withTypes: false,
+ this.annotateNullability: false,
+ });
bool isDynamicType(DartType type) => type is DynamicTypeImpl;
@@ -226,25 +233,35 @@
buffer.writeln(' {');
- e.fields.forEach(writePropertyInducingElement);
- e.accessors.forEach(writePropertyAccessorElement);
+ _withIndent(() {
+ e.fields.forEach(writePropertyInducingElement);
+ e.accessors.forEach(writePropertyAccessorElement);
- if (e.isEnum) {
- expect(e.constructors, isEmpty);
- } else {
- expect(e.constructors, isNotEmpty);
- }
+ if (e.isEnum) {
+ expect(e.constructors, isEmpty);
+ } else {
+ expect(e.constructors, isNotEmpty);
+ }
- if (e.constructors.length == 1 &&
- e.constructors[0].isSynthetic &&
- e.mixins.isEmpty) {
- expect(e.constructors[0].parameters, isEmpty);
- } else {
- e.constructors.forEach(writeConstructorElement);
- }
+ if (e.constructors.length == 1 &&
+ e.constructors[0].isSynthetic &&
+ e.mixins.isEmpty) {
+ expect(e.constructors[0].parameters, isEmpty);
+ } else {
+ e.constructors.forEach(writeConstructorElement);
+ }
- e.methods.forEach(writeMethodElement);
+ e.methods.forEach(writeMethodElement);
+ });
+
buffer.writeln('}');
+
+ if (withFullyResolvedAst) {
+ _withIndent(() {
+ _writeResolvedMetadata(e.metadata);
+ _writeResolvedTypeParameters(e.typeParameters);
+ });
+ }
}
void writeCodeRange(Element e) {
@@ -292,16 +309,28 @@
}
}
- if (e is ConstructorElementImpl) {
- if (e.constantInitializers != null) {
- writeList(' : ', '', e.constantInitializers, ', ', writeNode);
+ var initializers = (e as ConstructorElementImpl).constantInitializers;
+ if (withFullyResolvedAst) {
+ buffer.writeln(';');
+ if (initializers != null && initializers.isNotEmpty) {
+ _withIndent(() {
+ _writelnWithIndent('constantInitializers');
+ _withIndent(() {
+ for (var initializer in initializers) {
+ _writeResolvedNode(initializer);
+ }
+ });
+ });
}
+ } else {
+ if (initializers != null) {
+ writeList(' : ', '', initializers, ', ', writeNode);
+ }
+ buffer.writeln(';');
}
expect(e.isAsynchronous, isFalse);
expect(e.isGenerator, isFalse);
-
- buffer.writeln(';');
}
void writeDocumentation(Element e, [String prefix = '']) {
@@ -355,10 +384,21 @@
}
buffer.writeln(' {');
- e.fields.forEach(writePropertyInducingElement);
- e.accessors.forEach(writePropertyAccessorElement);
- e.methods.forEach(writeMethodElement);
+
+ _withIndent(() {
+ e.fields.forEach(writePropertyInducingElement);
+ e.accessors.forEach(writePropertyAccessorElement);
+ e.methods.forEach(writeMethodElement);
+ });
+
buffer.writeln('}');
+
+ if (withFullyResolvedAst) {
+ _withIndent(() {
+ _writeResolvedMetadata(e.metadata);
+ _writeResolvedTypeParameters(e.typeParameters);
+ });
+ }
}
void writeFunctionElement(FunctionElement e) {
@@ -488,6 +528,10 @@
}
void writeMetadata(Element e, String prefix, String separator) {
+ if (withFullyResolvedAst) {
+ return;
+ }
+
if (e.metadata.isNotEmpty) {
writeList(prefix, '', e.metadata, '$separator$prefix', (a) {
writeNode((a as ElementAnnotationImpl).annotationAst);
@@ -520,6 +564,13 @@
} else {
buffer.writeln(' {}');
}
+
+ if (withFullyResolvedAst) {
+ _withIndent(() {
+ _writeResolvedTypeParameters(e.typeParameters);
+ _writeResolvedMetadata(e.metadata);
+ });
+ }
}
void writeName(Element e) {
@@ -540,14 +591,7 @@
}
}
- void writeNode(AstNode e, {String indent: '', Expression enclosing}) {
- if (withFullyResolvedAst) {
- buffer.writeln();
- var printer = ResolvedAstPrinter(buffer, indent);
- e.accept(printer);
- return;
- }
-
+ void writeNode(AstNode e, {Expression enclosing}) {
bool needsParenthesis = e is Expression &&
enclosing != null &&
e.precedence < enclosing.precedence;
@@ -961,25 +1005,35 @@
writeVariableTypeInferenceError(e);
- if (e is ConstVariableElement) {
- Expression initializer = (e as ConstVariableElement).constantInitializer;
- if (initializer != null) {
- buffer.write(' = ');
- writeNode(
- initializer,
- indent: ' ' * (e is FieldElement ? 4 : 2),
- );
- if (withFullyResolvedAst) {
- return;
+ if (withFullyResolvedAst) {
+ buffer.writeln(';');
+ _withIndent(() {
+ _writeResolvedMetadata(e.metadata);
+ if (e is ConstVariableElement) {
+ var initializer = (e as ConstVariableElement).constantInitializer;
+ if (initializer != null) {
+ _writelnWithIndent('constantInitializer');
+ _withIndent(() {
+ _writeResolvedNode(initializer);
+ });
+ }
+ }
+ });
+ } else {
+ if (e is ConstVariableElement) {
+ Expression initializer =
+ (e as ConstVariableElement).constantInitializer;
+ if (initializer != null) {
+ buffer.write(' = ');
+ writeNode(initializer);
}
}
+ buffer.writeln(';');
}
// TODO(scheglov) Paul: One of the things that was hardest to get right
// when resynthesizing the element model was the synthetic function for the
// initializer. Can we write that out (along with its return type)?
-
- buffer.writeln(';');
}
void writeType(DartType type) {
@@ -1047,7 +1101,9 @@
}
void writeTypeParameterElements(List<TypeParameterElement> elements) {
- writeList('<', '>', elements, ', ', writeTypeParameterElement);
+ if (!withFullyResolvedAst) {
+ writeList('<', '>', elements, ', ', writeTypeParameterElement);
+ }
}
void writeUnitElement(CompilationUnitElement e) {
@@ -1135,6 +1191,18 @@
return components.join(';');
}
+ void _withIndent(void Function() f) {
+ var indent = this.indent;
+ this.indent = '$indent ';
+ f();
+ this.indent = indent;
+ }
+
+ void _writelnWithIndent(String line) {
+ buffer.write(indent);
+ buffer.writeln(line);
+ }
+
bool _writeParameters(Iterable<ParameterElement> parameters, bool commaNeeded,
String prefix, String suffix) {
if (parameters.isEmpty) return commaNeeded;
@@ -1160,6 +1228,44 @@
buffer.write(suffix);
return commaNeeded;
}
+
+ void _writeResolvedMetadata(List<ElementAnnotation> metadata) {
+ if (metadata.isNotEmpty) {
+ _writelnWithIndent('metadata');
+ _withIndent(() {
+ for (ElementAnnotationImpl annotation in metadata) {
+ _writeResolvedNode(annotation.annotationAst);
+ }
+ });
+ }
+ }
+
+ void _writeResolvedNode(AstNode node) {
+ buffer.write(indent);
+ node.accept(
+ ResolvedAstPrinter(
+ selfUriStr: selfUriStr,
+ sink: buffer,
+ indent: indent,
+ ),
+ );
+ }
+
+ void _writeResolvedTypeParameters(List<TypeParameterElement> elements) {
+ if (elements.isNotEmpty) {
+ _writelnWithIndent('typeParameters');
+ _withIndent(() {
+ for (TypeParameterElementImpl e in elements) {
+ _writelnWithIndent(e.name);
+ _withIndent(() {
+ _writelnWithIndent('bound: ${e.bound}');
+ _writelnWithIndent('defaultType: ${e.defaultType}');
+ _writeResolvedMetadata(e.metadata);
+ });
+ }
+ });
+ }
+ }
}
class _Replacement {
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index 551cad1..93a5e30 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -4,26 +4,77 @@
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/summary2/reference.dart';
+import 'package:meta/meta.dart';
/// Prints AST as a tree, with properties and children.
class ResolvedAstPrinter extends ThrowingAstVisitor<void> {
- StringSink _sink;
+ final String _selfUriStr;
+ final StringSink _sink;
String _indent = '';
- ResolvedAstPrinter(StringSink sink, String indent)
- : _sink = sink,
+ ResolvedAstPrinter({
+ @required String selfUriStr,
+ @required StringSink sink,
+ @required String indent,
+ }) : _selfUriStr = selfUriStr,
+ _sink = sink,
_indent = indent;
@override
+ void visitAnnotation(Annotation node) {
+ _writeln('Annotation');
+ _withIndent(() {
+ _writeNode('arguments', node.arguments);
+ _writeNode('constructorName', node.constructorName);
+ _writeElement('element', node.element);
+ _writeNode('name', node.name);
+ });
+ }
+
+ @override
+ void visitArgumentList(ArgumentList node) {
+ _writeln('ArgumentList');
+ _withIndent(() {
+ _writeNodeList('arguments', node.arguments);
+ });
+ }
+
+ @override
void visitCompilationUnit(CompilationUnit node) {
super.visitCompilationUnit(node);
}
@override
- void visitIntegerLiteral(IntegerLiteral node) {
- _writeln('IntegerLiteral(${node.literal.lexeme})');
+ void visitConstructorName(ConstructorName node) {
+ _writeln('ConstructorName');
_withIndent(() {
- _writeln2('staticType: ', node.staticType);
+ _writeNode('name', node.name);
+ _writeNode('type', node.type);
+ });
+ }
+
+ @override
+ void visitInstanceCreationExpression(InstanceCreationExpression node) {
+ _writeln('InstanceCreationExpression');
+ _withIndent(() {
+ _writeNode('argumentList', node.argumentList);
+ _writeNode('constructorName', node.constructorName);
+ _writeElement('staticElement', node.staticElement);
+ _writeType('staticType', node.staticType);
+ });
+ }
+
+ @override
+ void visitIntegerLiteral(IntegerLiteral node) {
+ _writeln('IntegerLiteral');
+ _withIndent(() {
+ _writelnWithIndent('literal: ${node.literal}');
+ _writeType('staticType', node.staticType);
});
}
@@ -31,13 +82,74 @@
void visitListLiteral(ListLiteral node) {
_writeln('ListLiteral');
_withIndent(() {
- _writeln2('isConst: ', node.isConst);
- _writeln2('staticType: ', node.staticType);
- _writeTypeArgumentList('typeArguments', node.typeArguments);
_writeNodeList('elements', node.elements);
+ _writeType('staticType', node.staticType);
+ _writeNode('typeArguments', node.typeArguments);
});
}
+ @override
+ void visitRedirectingConstructorInvocation(
+ RedirectingConstructorInvocation node,
+ ) {
+ _writeln('RedirectingConstructorInvocation');
+ _withIndent(() {
+ _writeNode('argumentList', node.argumentList);
+ _writeNode('constructorName', node.constructorName);
+ _writeElement('staticElement', node.staticElement);
+ });
+ }
+
+ @override
+ void visitSimpleIdentifier(SimpleIdentifier node) {
+ _writeln('SimpleIdentifier');
+ _withIndent(() {
+ _writeAuxiliaryElements('auxiliaryElements', node.auxiliaryElements);
+ _writeElement('staticElement', node.staticElement);
+ _writeType('staticType', node.staticType);
+ _writelnWithIndent('token: ${node.token}');
+ });
+ }
+
+ @override
+ void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+ _writeln('SuperConstructorInvocation');
+ _withIndent(() {
+ _writeNode('argumentList', node.argumentList);
+ _writeNode('constructorName', node.constructorName);
+ _writeElement('staticElement', node.staticElement);
+ });
+ }
+
+ @override
+ void visitTypeName(TypeName node) {
+ _writeln('TypeName');
+ _withIndent(() {
+ _writeNode('name', node.name);
+ _writeType('type', node.type);
+ _writeNode('typeArguments', node.typeArguments);
+ });
+ }
+
+ String _referenceToString(Reference reference) {
+ if (reference.parent.name == '@unit') {
+ var libraryUriStr = reference.parent.parent.name;
+ if (libraryUriStr == _selfUriStr) {
+ return 'self';
+ }
+ return libraryUriStr;
+ }
+
+ var name = reference.name;
+ if (name.startsWith('@')) {
+ return _referenceToString(reference.parent);
+ }
+ if (name.isEmpty) {
+ name = '•';
+ }
+ return _referenceToString(reference.parent) + '::$name';
+ }
+
void _withIndent(void Function() f) {
var indent = _indent;
_indent = '$_indent ';
@@ -45,32 +157,64 @@
_indent = indent;
}
+ void _writeAuxiliaryElements(String name, AuxiliaryElements elements) {
+ if (elements != null) {
+ throw UnimplementedError();
+ }
+ }
+
+ void _writeElement(String name, Element element) {
+ _sink.write(_indent);
+ _sink.write('$name: ');
+ if (element == null) {
+ _sink.writeln('<null>');
+ } else if (element is Member) {
+ _sink.writeln(_nameOfMemberClass(element));
+ _withIndent(() {
+ _writeElement('base', element.baseElement);
+ _writelnWithIndent('substitution: ${element.substitution.map}');
+ });
+ } else {
+ var reference = (element as ElementImpl).reference;
+ var referenceStr = _referenceToString(reference);
+ _sink.writeln(referenceStr);
+ }
+ }
+
void _writeln(String line) {
- _sink.write('$_indent');
_sink.writeln(line);
}
- void _writeln2(String prefix, Object o) {
- _sink.write('$_indent');
- _sink.write(prefix);
- _sink.writeln(o);
+ void _writelnWithIndent(String line) {
+ _sink.write(_indent);
+ _sink.writeln(line);
+ }
+
+ void _writeNode(String name, AstNode node) {
+ if (node != null) {
+ _sink.write(_indent);
+ _sink.write('$name: ');
+ node.accept(this);
+ }
}
void _writeNodeList(String name, NodeList nodeList) {
if (nodeList.isNotEmpty) {
- _writeln(name);
+ _writelnWithIndent(name);
_withIndent(() {
- nodeList.accept(this);
+ for (var node in nodeList) {
+ _sink.write(_indent);
+ node.accept(this);
+ }
});
}
}
- void _writeTypeArgumentList(String name, TypeArgumentList node) {
- if (node != null) {
- _writeln(name);
- _withIndent(() {
- node.arguments?.accept(this);
- });
- }
+ void _writeType(String name, DartType type) {
+ _writelnWithIndent('$name: $type');
+ }
+
+ static String _nameOfMemberClass(Member member) {
+ return '${member.runtimeType}';
}
}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
index 6785245..618e653 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast2_test.dart
@@ -33,9 +33,6 @@
/// The shared SDK bundle, computed once and shared among test invocations.
static LinkedNodeBundle _sdkBundle;
- @override
- bool get isAstBasedSummary => true;
-
LinkedNodeBundle get sdkBundle {
if (_sdkBundle != null) return _sdkBundle;
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 86a1ada..54294ea 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -1256,21 +1256,12 @@
class C<T extends D> {}
class D<T extends C> {}
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
notSimplyBounded class C<T extends D<dynamic>> {
}
notSimplyBounded class D<T extends C<dynamic>> {
}
''');
- } else {
- checkElementText(library, r'''
-notSimplyBounded class C<T extends D<dynamic>> {
-}
-notSimplyBounded class D<T extends C<D<dynamic>>> {
-}
-''');
- }
}
test_class_notSimplyBounded_complex_by_reference_to_cycle() async {
@@ -1353,21 +1344,12 @@
typedef F(G value);
typedef G(F value);
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
notSimplyBounded typedef F = dynamic Function(dynamic Function(dynamic Function(dynamic)) value);
notSimplyBounded typedef G = dynamic Function(dynamic Function(dynamic) value);
notSimplyBounded class C<T extends dynamic Function(dynamic Function(dynamic Function(dynamic)))> {
}
''');
- } else {
- checkElementText(library, r'''
-notSimplyBounded typedef F = dynamic Function(dynamic Function(dynamic Function(...)) value);
-notSimplyBounded typedef G = dynamic Function(dynamic Function(dynamic Function(...)) value);
-notSimplyBounded class C<T extends dynamic Function(dynamic Function(...))> {
-}
-''');
- }
}
test_class_notSimplyBounded_self() async {
@@ -2574,10 +2556,9 @@
P2<int>(),
];
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- '''
+ checkElementText(
+ library,
+ '''
class P<T> {
const P();
}
@@ -2592,27 +2573,7 @@
P2/*location: test.dart;P2*/<
int/*location: dart:core;int*/>()];
''',
- withTypes: true);
- } else {
- checkElementText(
- library,
- '''
-class P<T> {
- const P();
-}
-class P1<T> extends P<T> {
- const P1();
-}
-class P2<T> extends P<T> {
- const P2();
-}
-const List<P<dynamic>> values = const /*typeArgs=dynamic*/[const /*typeArgs=dynamic*/
- P1/*location: test.dart;P1*/(), const
- P2/*location: test.dart;P2*/<
- int/*location: dart:core;int*/>()];
-''',
- withTypes: true);
- }
+ withTypes: true);
}
test_const_invalid_field_const() async {
@@ -2728,8 +2689,7 @@
import 'a.dart' as p;
const V = const p.C<int, String>.named(1, '222');
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
import 'a.dart' as p;
const C<int, String> V = const
p/*location: test.dart;p*/.
@@ -2738,16 +2698,6 @@
String/*location: dart:core;String*/>.
named/*location: a.dart;C;named*/(1, '222');
''');
- } else {
- checkElementText(library, r'''
-import 'a.dart' as p;
-const C<int, String> V = const
- C/*location: a.dart;C*/<
- int/*location: dart:core;int*/,
- String/*location: dart:core;String*/>.
- named/*location: a.dart;C;named*/(1, '222');
-''');
- }
}
test_const_invokeConstructor_generic_noTypeArguments() async {
@@ -2813,8 +2763,7 @@
import 'a.dart' as p;
const V = const p.C<int, String>();
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
import 'a.dart' as p;
const C<int, String> V = const
p/*location: test.dart;p*/.
@@ -2822,15 +2771,6 @@
int/*location: dart:core;int*/,
String/*location: dart:core;String*/>();
''');
- } else {
- checkElementText(library, r'''
-import 'a.dart' as p;
-const C<int, String> V = const
- C/*location: a.dart;C*/<
- int/*location: dart:core;int*/,
- String/*location: dart:core;String*/>();
-''');
- }
}
test_const_invokeConstructor_named() async {
@@ -2840,8 +2780,7 @@
}
const V = const C.named(true, 1, 2, d: 'ccc', e: 3.4);
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class C {
const C.named(bool a, int b, int c, {String d}, {double e});
}
@@ -2851,18 +2790,6 @@
d/*location: test.dart;C;named;d*/: 'ccc',
e/*location: test.dart;C;named;e*/: 3.4);
''');
- } else {
- checkElementText(library, r'''
-class C {
- const C.named(bool a, int b, int c, {String d}, {double e});
-}
-const C V = const
- C/*location: test.dart;C*/.
- named/*location: test.dart;C;named*/(true, 1, 2,
- d/*location: null*/: 'ccc',
- e/*location: null*/: 3.4);
-''');
- }
}
test_const_invokeConstructor_named_imported() async {
@@ -2893,22 +2820,13 @@
import 'a.dart' as p;
const V = const p.C.named();
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
import 'a.dart' as p;
const C V = const
p/*location: test.dart;p*/.
C/*location: a.dart;C*/.
named/*location: a.dart;C;named*/();
''');
- } else {
- checkElementText(library, r'''
-import 'a.dart' as p;
-const C V = const
- C/*location: a.dart;C*/.
- named/*location: a.dart;C;named*/();
-''');
- }
}
test_const_invokeConstructor_named_unresolved() async {
@@ -2916,23 +2834,13 @@
class C {}
const V = const C.named();
''', allowErrors: true);
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class C {
}
const C V = const
C/*location: test.dart;C*/.
named/*location: null*/();
''');
- } else {
- checkElementText(library, r'''
-class C {
-}
-const dynamic V = const
- C/*location: test.dart;C*/.
- named/*location: null*/();
-''');
- }
}
test_const_invokeConstructor_named_unresolved2() async {
@@ -2955,23 +2863,13 @@
import 'a.dart' as p;
const V = const p.C.named();
''', allowErrors: true);
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
import 'a.dart' as p;
const C V = const
p/*location: test.dart;p*/.
C/*location: a.dart;C*/.
named/*location: null*/();
''');
- } else {
- checkElementText(library, r'''
-import 'a.dart' as p;
-const dynamic V = const
- p/*location: test.dart;p*/.
- C/*location: a.dart;C*/.
- named/*location: null*/();
-''');
- }
}
test_const_invokeConstructor_named_unresolved4() async {
@@ -3006,23 +2904,13 @@
class C<T> {}
const V = const C.named();
''', allowErrors: true);
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class C<T> {
}
const C<dynamic> V = const
C/*location: test.dart;C*/.
named/*location: null*/();
''');
- } else {
- checkElementText(library, r'''
-class C<T> {
-}
-const dynamic V = const
- C/*location: test.dart;C*/.
- named/*location: null*/();
-''');
- }
}
test_const_invokeConstructor_unnamed() async {
@@ -3068,20 +2956,12 @@
import 'a.dart' as p;
const V = const p.C();
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
import 'a.dart' as p;
const C V = const
p/*location: test.dart;p*/.
C/*location: a.dart;C*/();
''');
- } else {
- checkElementText(library, r'''
-import 'a.dart' as p;
-const C V = const
- C/*location: a.dart;C*/();
-''');
- }
}
test_const_invokeConstructor_unnamed_unresolved() async {
@@ -3282,63 +3162,40 @@
var library = await checkLibrary('''
const Object x = const [1];
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- '''
+ checkElementText(
+ library,
+ '''
const Object x = const /*typeArgs=int*/[1];
''',
- withTypes: true);
- } else {
- checkElementText(library, '''
-const Object x = const <
- int/*location: dart:core;int*/>[1];
-''');
- }
+ withTypes: true);
}
test_const_list_spread() async {
var library = await checkLibrary('''
const Object x = const <int>[...<int>[1]];
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- '''
+ checkElementText(
+ library,
+ '''
const Object x = const <
int/*location: dart:core;int*/>[...<
int/*location: dart:core;int*/>[1]];
''',
- withTypes: true);
- } else {
- checkElementText(library, '''
-const Object x = const <
- int/*location: dart:core;int*/>[...const <
- int/*location: dart:core;int*/>[1]];
-''');
- }
+ withTypes: true);
}
test_const_list_spread_null_aware() async {
var library = await checkLibrary('''
const Object x = const <int>[...?<int>[1]];
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- '''
+ checkElementText(
+ library,
+ '''
const Object x = const <
int/*location: dart:core;int*/>[...?<
int/*location: dart:core;int*/>[1]];
''',
- withTypes: true);
- } else {
- checkElementText(library, '''
-const Object x = const <
- int/*location: dart:core;int*/>[...?const <
- int/*location: dart:core;int*/>[1]];
-''');
- }
+ withTypes: true);
}
test_const_map_if() async {
@@ -3376,72 +3233,44 @@
var library = await checkLibrary('''
const Object x = const {1: 1.0};
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- '''
+ checkElementText(
+ library,
+ '''
const Object x = const /*typeArgs=int,double*/{1: 1.0}/*isMap*/;
''',
- withTypes: true);
- } else {
- checkElementText(library, '''
-const Object x = const <
- int/*location: dart:core;int*/,
- double/*location: dart:core;double*/>{1: 1.0}/*isMap*/;
-''');
- }
+ withTypes: true);
}
test_const_map_spread() async {
var library = await checkLibrary('''
const Object x = const <int, int>{...<int, int>{1: 2}};
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- '''
+ checkElementText(
+ library,
+ '''
const Object x = const <
int/*location: dart:core;int*/,
int/*location: dart:core;int*/>{...<
int/*location: dart:core;int*/,
int/*location: dart:core;int*/>{1: 2}/*isMap*/}/*isMap*/;
''',
- withTypes: true);
- } else {
- checkElementText(library, '''
-const Object x = const <
- int/*location: dart:core;int*/,
- int/*location: dart:core;int*/>{...const <
- int/*location: dart:core;int*/,
- int/*location: dart:core;int*/>{1: 2}/*isMap*/}/*isMap*/;
-''');
- }
+ withTypes: true);
}
test_const_map_spread_null_aware() async {
var library = await checkLibrary('''
const Object x = const <int, int>{...?<int, int>{1: 2}};
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- '''
+ checkElementText(
+ library,
+ '''
const Object x = const <
int/*location: dart:core;int*/,
int/*location: dart:core;int*/>{...?<
int/*location: dart:core;int*/,
int/*location: dart:core;int*/>{1: 2}/*isMap*/}/*isMap*/;
''',
- withTypes: true);
- } else {
- checkElementText(library, '''
-const Object x = const <
- int/*location: dart:core;int*/,
- int/*location: dart:core;int*/>{...?const <
- int/*location: dart:core;int*/,
- int/*location: dart:core;int*/>{1: 2}/*isMap*/}/*isMap*/;
-''');
- }
+ withTypes: true);
}
test_const_parameterDefaultValue_initializingFormal_functionTyped() async {
@@ -3938,63 +3767,40 @@
var library = await checkLibrary('''
const Object x = const {1};
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- '''
+ checkElementText(
+ library,
+ '''
const Object x = const /*typeArgs=int*/{1}/*isSet*/;
''',
- withTypes: true);
- } else {
- checkElementText(library, '''
-const Object x = const <
- int/*location: dart:core;int*/>{1}/*isSet*/;
-''');
- }
+ withTypes: true);
}
test_const_set_spread() async {
var library = await checkLibrary('''
const Object x = const <int>{...<int>{1}};
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- '''
+ checkElementText(
+ library,
+ '''
const Object x = const <
int/*location: dart:core;int*/>{...<
int/*location: dart:core;int*/>{1}/*isSet*/}/*isSet*/;
''',
- withTypes: true);
- } else {
- checkElementText(library, '''
-const Object x = const <
- int/*location: dart:core;int*/>{...const <
- int/*location: dart:core;int*/>{1}/*isSet*/}/*isSet*/;
-''');
- }
+ withTypes: true);
}
test_const_set_spread_null_aware() async {
var library = await checkLibrary('''
const Object x = const <int>{...?<int>{1}};
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- '''
+ checkElementText(
+ library,
+ '''
const Object x = const <
int/*location: dart:core;int*/>{...?<
int/*location: dart:core;int*/>{1}/*isSet*/}/*isSet*/;
''',
- withTypes: true);
- } else {
- checkElementText(library, '''
-const Object x = const <
- int/*location: dart:core;int*/>{...?const <
- int/*location: dart:core;int*/>{1}/*isSet*/}/*isSet*/;
-''');
- }
+ withTypes: true);
}
test_const_topLevel_binary() async {
@@ -4044,30 +3850,18 @@
var library = await checkLibrary(r'''
const vConditional = (1 == 2) ? 11 : 22;
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
const int vConditional = (1 == 2) ? 11 : 22;
''');
- } else {
- checkElementText(library, r'''
-const int vConditional = 1 == 2 ? 11 : 22;
-''');
- }
}
test_const_topLevel_identical() async {
var library = await checkLibrary(r'''
const vIdentical = (1 == 2) ? 11 : 22;
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
const int vIdentical = (1 == 2) ? 11 : 22;
''');
- } else {
- checkElementText(library, r'''
-const int vIdentical = 1 == 2 ? 11 : 22;
-''');
- }
}
test_const_topLevel_ifNull() async {
@@ -4159,16 +3953,9 @@
var library = await checkLibrary(r'''
const c = throw 42;
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
const dynamic c = throw 42;
''');
- } else {
- // This is a bug.
- checkElementText(library, r'''
-const dynamic c;
-''');
- }
}
test_const_topLevel_typedList() async {
@@ -4219,20 +4006,12 @@
import 'a.dart' as p;
const v = const <p.C>[];
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
import 'a.dart' as p;
const List<C> v = const <
p/*location: test.dart;p*/.
C/*location: a.dart;C*/>[];
''');
- } else {
- checkElementText(library, r'''
-import 'a.dart' as p;
-const List<C> v = const <
- C/*location: a.dart;C*/>[];
-''');
- }
}
test_const_topLevel_typedList_typedefArgument() async {
@@ -4240,21 +4019,11 @@
typedef int F(String id);
const v = const <F>[];
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
typedef F = int Function(String id);
const List<int Function(String)> v = const <
F/*location: test.dart;F*/>[];
''');
- } else {
- // This is wrong.
- // `F` must be the reference to `typedef F` element, not the type.
- checkElementText(library, r'''
-typedef F = int Function(String id);
-const List<int Function(String)> v = const <
- null/*location: test.dart;F;-*/>[];
-''');
- }
}
test_const_topLevel_typedMap() async {
@@ -4370,24 +4139,13 @@
static const b = null;
}
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class C {
static const dynamic a =
b/*location: test.dart;C;b?*/;
static const dynamic b = null;
}
''');
- } else {
- checkElementText(library, r'''
-class C {
- static const dynamic a =
- C/*location: test.dart;C*/.
- b/*location: test.dart;C;b?*/;
- static const dynamic b = null;
-}
-''');
- }
}
test_constExpr_pushReference_staticMethod_simpleIdentifier() async {
@@ -4397,24 +4155,13 @@
static m() {}
}
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class C {
static const dynamic Function() a =
m/*location: test.dart;C;m*/;
static dynamic m() {}
}
''');
- } else {
- checkElementText(library, r'''
-class C {
- static const dynamic Function() a =
- C/*location: test.dart;C*/.
- m/*location: test.dart;C;m*/;
- static dynamic m() {}
-}
-''');
- }
}
test_constructor_documented() async {
@@ -4527,8 +4274,7 @@
: this(A<Function()>());
}
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class A<T> {
const A();
}
@@ -4538,7 +4284,35 @@
A/*location: test.dart;A*/<Function()>());
}
''');
- }
+ }
+
+ test_constructor_initializers_superInvocation_argumentContextType() async {
+ var library = await checkLibrary('''
+class A {
+ const A(List<String> values);
+}
+class B extends A {
+ const B() : super(const []);
+}
+''');
+ checkElementText(
+ library,
+ r'''
+class A {
+ const A(List<String> values);
+}
+class B extends A {
+ const B();
+ constantInitializers
+ SuperConstructorInvocation
+ argumentList: ArgumentList
+ arguments
+ ListLiteral
+ staticType: List<String>
+ staticElement: self::A::•
+}
+''',
+ withFullyResolvedAst: true);
}
test_constructor_initializers_superInvocation_named() async {
@@ -4590,8 +4364,7 @@
const C() : super.aaa(1, b: 2);
}
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class A {
const A.aaa(dynamic a, {int b});
}
@@ -4601,18 +4374,6 @@
b/*location: test.dart;A;aaa;b*/: 2);
}
''');
- } else {
- checkElementText(library, r'''
-class A {
- const A.aaa(dynamic a, {int b});
-}
-class C extends A {
- const C() : super.
- aaa/*location: test.dart;A;aaa*/(1,
- b/*location: null*/: 2);
-}
-''');
- }
}
test_constructor_initializers_superInvocation_unnamed() async {
@@ -4634,6 +4395,31 @@
''');
}
+ test_constructor_initializers_thisInvocation_argumentContextType() async {
+ var library = await checkLibrary('''
+class A {
+ const A(List<String> values);
+ const A.empty() : this(const []);
+}
+''');
+ checkElementText(
+ library,
+ r'''
+class A {
+ const A(List<String> values);
+ const A.empty() = A;
+ constantInitializers
+ RedirectingConstructorInvocation
+ argumentList: ArgumentList
+ arguments
+ ListLiteral
+ staticType: List<String>
+ staticElement: self::A::•
+}
+''',
+ withFullyResolvedAst: true);
+ }
+
test_constructor_initializers_thisInvocation_named() async {
var library = await checkLibrary('''
class C {
@@ -4657,8 +4443,7 @@
const C.named(a, {int b});
}
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class C {
const C() = C.named : this.
named/*location: test.dart;C;named*/(1,
@@ -4666,16 +4451,6 @@
const C.named(dynamic a, {int b});
}
''');
- } else {
- checkElementText(library, r'''
-class C {
- const C() = C.named : this.
- named/*location: test.dart;C;named*/(1,
- b/*location: null*/: 2);
- const C.named(dynamic a, {int b});
-}
-''');
- }
}
test_constructor_initializers_thisInvocation_unnamed() async {
@@ -5042,21 +4817,12 @@
C() : this.named();
}
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class C {
C.named();
C();
}
''');
- } else {
- checkElementText(library, r'''
-class C {
- C.named();
- C() = C.named;
-}
-''');
- }
}
test_constructor_redirected_thisInvocation_unnamed() async {
@@ -5096,21 +4862,12 @@
C.named() : this();
}
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class C {
C();
C.named();
}
''');
- } else {
- checkElementText(library, r'''
-class C {
- C();
- C.named() = C;
-}
-''');
- }
}
test_constructor_withCycles_const() async {
@@ -5194,8 +4951,7 @@
void foo({a: const A<Function()>()}) {}
}
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class A<T> {
const A();
}
@@ -5204,7 +4960,6 @@
A/*location: test.dart;A*/<Function()>()}) {}
}
''');
- }
}
test_defaultValue_refersToExtension_method_inside() async {
@@ -5259,10 +5014,9 @@
const C([B<T> b = const B()]);
}
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- r'''
+ checkElementText(
+ library,
+ r'''
class B<T> {
const B();
}
@@ -5271,18 +5025,7 @@
B/*location: test.dart;B*/()]);
}
''',
- withTypes: true);
- } else {
- checkElementText(library, r'''
-class B<T> {
- const B();
-}
-class C<T> {
- const C([B<T> b = const
- B/*location: test.dart;B*/()]);
-}
-''');
- }
+ withTypes: true);
}
test_defaultValue_refersToGenericClass_constructor2() async {
@@ -5295,10 +5038,9 @@
const C([A<T> a = const B()]);
}
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- r'''
+ checkElementText(
+ library,
+ r'''
abstract class A<T> {
}
class B<T> implements A<T> {
@@ -5309,20 +5051,7 @@
B/*location: test.dart;B*/()]);
}
''',
- withTypes: true);
- } else {
- checkElementText(library, r'''
-abstract class A<T> {
-}
-class B<T> implements A<T> {
- const B();
-}
-class C<T> implements A<Iterable<T>> {
- const C([A<T> a = const
- B/*location: test.dart;B*/()]);
-}
-''');
- }
+ withTypes: true);
}
test_defaultValue_refersToGenericClass_functionG() async {
@@ -5332,26 +5061,16 @@
}
void foo<T>([B<T> b = const B()]) {}
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- r'''
+ checkElementText(
+ library,
+ r'''
class B<T> {
const B();
}
void foo<T>([B<T> b = const /*typeArgs=Null*/
B/*location: test.dart;B*/()]) {}
''',
- withTypes: true);
- } else {
- checkElementText(library, r'''
-class B<T> {
- const B();
-}
-void foo<T>([B<T> b = const
- B/*location: test.dart;B*/()]) {}
-''');
- }
+ withTypes: true);
}
test_defaultValue_refersToGenericClass_methodG() async {
@@ -5363,10 +5082,9 @@
void foo<T>([B<T> b = const B()]) {}
}
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- r'''
+ checkElementText(
+ library,
+ r'''
class B<T> {
const B();
}
@@ -5375,18 +5093,7 @@
B/*location: test.dart;B*/()]) {}
}
''',
- withTypes: true);
- } else {
- checkElementText(library, r'''
-class B<T> {
- const B();
-}
-class C {
- void foo<T>([B<T> b = const
- B/*location: test.dart;B*/()]) {}
-}
-''');
- }
+ withTypes: true);
}
test_defaultValue_refersToGenericClass_methodG_classG() async {
@@ -5398,10 +5105,9 @@
void foo<E2>([B<E1, E2> b = const B()]) {}
}
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- r'''
+ checkElementText(
+ library,
+ r'''
class B<T1, T2> {
const B();
}
@@ -5410,18 +5116,7 @@
B/*location: test.dart;B*/()]) {}
}
''',
- withTypes: true);
- } else {
- checkElementText(library, r'''
-class B<T1, T2> {
- const B();
-}
-class C<E1> {
- void foo<E2>([B<E1, E2> b = const
- B/*location: test.dart;B*/()]) {}
-}
-''');
- }
+ withTypes: true);
}
test_defaultValue_refersToGenericClass_methodNG() async {
@@ -5433,10 +5128,9 @@
void foo([B<T> b = const B()]) {}
}
''');
- if (isAstBasedSummary) {
- checkElementText(
- library,
- r'''
+ checkElementText(
+ library,
+ r'''
class B<T> {
const B();
}
@@ -5445,18 +5139,7 @@
B/*location: test.dart;B*/()]) {}
}
''',
- withTypes: true);
- } else {
- checkElementText(library, r'''
-class B<T> {
- const B();
-}
-class C<T> {
- void foo([B<T> b = const
- B/*location: test.dart;B*/()]) {}
-}
-''');
- }
+ withTypes: true);
}
test_duplicateDeclaration_class() async {
@@ -6234,8 +5917,7 @@
const B();
}
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class A<T> {
const A();
}
@@ -6247,7 +5929,6 @@
const B();
}
''');
- }
}
test_field_final_hasInitializer_noConstConstructor() async {
@@ -6431,10 +6112,10 @@
library,
r'''
class C1 {
- final List<int> f1 =
- ListLiteral
- isConst: true
- staticType: List<int>
+ final List<int> f1;
+ constantInitializer
+ ListLiteral
+ staticType: List<int>
const C1();
}
class C2 {
@@ -6832,15 +6513,9 @@
var library = await checkLibrary('''
typedef F<X extends F> = Function(F);
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
notSimplyBounded typedef F<X> = dynamic Function();
''');
- } else {
- checkElementText(library, r'''
-notSimplyBounded typedef F<X extends dynamic Function(...)> = dynamic Function(dynamic Function(...) );
-''');
- }
}
test_getter_documented() async {
@@ -6894,8 +6569,7 @@
}
const x = C.named(42);
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
class C {
final Object x;
const C.named(Object this.x);
@@ -6904,17 +6578,6 @@
C/*location: test.dart;C*/.
named/*location: test.dart;C;named*/(42);
''');
- } else {
- checkElementText(library, r'''
-class C {
- final Object x;
- const C.named(Object this.x);
-}
-const C x = const
- C/*location: test.dart;C*/.
- named/*location: test.dart;C;named*/(42);
-''');
- }
}
test_implicitTopLevelVariable_getterFirst() async {
@@ -8047,19 +7710,11 @@
import 'c.dart';
foo([p = V]) {}
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
import 'c.dart';
dynamic foo([dynamic p =
V/*location: a.dart;V*/]) {}
''');
- } else {
- checkElementText(library, r'''
-import 'c.dart';
-dynamic foo([dynamic p =
- V/*location: null*/]) {}
-''');
- }
}
test_invalid_nameConflict_local() async {
@@ -8068,21 +7723,12 @@
V() {}
var V;
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
dynamic V;
dynamic foo([dynamic p =
V/*location: test.dart;V?*/]) {}
dynamic V() {}
''');
- } else {
- checkElementText(library, r'''
-dynamic V;
-dynamic foo([dynamic p =
- V/*location: null*/]) {}
-dynamic V() {}
-''');
- }
}
test_invalid_setterParameter_fieldFormalParameter() async {
@@ -8459,6 +8105,62 @@
''');
}
+ test_metadata_class_scope() async {
+ var library = await checkLibrary(r'''
+const foo = 0;
+
+@foo
+class C<@foo T> {
+ static const foo = 1;
+ @foo
+ void bar() {}
+}
+''');
+ checkElementText(
+ library,
+ r'''
+class C {
+ static const int foo;
+ constantInitializer
+ IntegerLiteral
+ literal: 1
+ staticType: int
+ void bar() {}
+ metadata
+ Annotation
+ element: self::C::foo
+ name: SimpleIdentifier
+ staticElement: self::C::foo
+ staticType: int
+ token: foo
+}
+ metadata
+ Annotation
+ element: self::foo
+ name: SimpleIdentifier
+ staticElement: self::foo
+ staticType: int
+ token: foo
+ typeParameters
+ T
+ bound: null
+ defaultType: dynamic
+ metadata
+ Annotation
+ element: self::foo
+ name: SimpleIdentifier
+ staticElement: self::foo
+ staticType: int
+ token: foo
+const int foo;
+ constantInitializer
+ IntegerLiteral
+ literal: 0
+ staticType: int
+''',
+ withFullyResolvedAst: true);
+ }
+
test_metadata_classDeclaration() async {
var library = await checkLibrary(r'''
const a = null;
@@ -8522,8 +8224,7 @@
@foo.A.named()
class C {}
''');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
import 'foo.dart' as foo;
@
foo/*location: test.dart;foo*/.
@@ -8532,16 +8233,6 @@
class C {
}
''');
- } else {
- checkElementText(library, r'''
-import 'foo.dart' as foo;
-@
- A/*location: foo.dart;A*/.
- named/*location: foo.dart;A;named*/()
-class C {
-}
-''');
- }
}
test_metadata_constructor_call_unnamed() async {
@@ -8561,8 +8252,7 @@
addLibrarySource('/foo.dart', 'class A { const A(); }');
var library =
await checkLibrary('import "foo.dart" as foo; @foo.A() class C {}');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
import 'foo.dart' as foo;
@
foo/*location: test.dart;foo*/.
@@ -8570,15 +8260,6 @@
class C {
}
''');
- } else {
- checkElementText(library, r'''
-import 'foo.dart' as foo;
-@
- A/*location: foo.dart;A*/()
-class C {
-}
-''');
- }
}
test_metadata_constructor_call_with_args() async {
@@ -8661,6 +8342,63 @@
''');
}
+ test_metadata_extension_scope() async {
+ featureSet = enableExtensionMethods;
+ var library = await checkLibrary(r'''
+const foo = 0;
+
+@foo
+extension E<@foo T> on int {
+ static const foo = 1;
+ @foo
+ void bar() {}
+}
+''');
+ checkElementText(
+ library,
+ r'''
+extension E on int {
+ static const int foo;
+ constantInitializer
+ IntegerLiteral
+ literal: 1
+ staticType: int
+ void bar() {}
+ metadata
+ Annotation
+ element: self::E::foo
+ name: SimpleIdentifier
+ staticElement: self::E::foo
+ staticType: int
+ token: foo
+}
+ metadata
+ Annotation
+ element: self::foo
+ name: SimpleIdentifier
+ staticElement: self::foo
+ staticType: int
+ token: foo
+ typeParameters
+ T
+ bound: null
+ defaultType: null
+ metadata
+ Annotation
+ element: self::foo
+ name: SimpleIdentifier
+ staticElement: self::foo
+ staticType: int
+ token: foo
+const int foo;
+ constantInitializer
+ IntegerLiteral
+ literal: 0
+ staticType: int
+''',
+ withFullyResolvedAst: true);
+ }
+
test_metadata_extensionDeclaration() async {
featureSet = enableExtensionMethods;
var library = await checkLibrary(r'''
@@ -8819,23 +8557,13 @@
test_metadata_invalid_classDeclaration() async {
var library = await checkLibrary('f(_) {} @f(42) class C {}');
- if (isAstBasedSummary) {
- checkElementText(library, r'''
+ checkElementText(library, r'''
@
f/*location: test.dart;f*/(42)
class C {
}
dynamic f(dynamic _) {}
''');
- } else {
- checkElementText(library, r'''
-@
- __unresolved__/*location: null*/
-class C {
-}
-dynamic f(dynamic _) {}
-''');
- }
}
test_metadata_libraryDirective() async {
@@ -8925,6 +8653,62 @@
''');
}
+ test_metadata_mixin_scope() async {
+ var library = await checkLibrary(r'''
+const foo = 0;
+
+@foo
+mixin M<@foo T> {
+ static const foo = 1;
+ @foo
+ void bar() {}
+}
+''');
+ checkElementText(
+ library,
+ r'''
+mixin M on Object {
+ static const int foo;
+ constantInitializer
+ IntegerLiteral
+ literal: 1
+ staticType: int
+ void bar() {}
+ metadata
+ Annotation
+ element: self::M::foo
+ name: SimpleIdentifier
+ staticElement: self::M::foo
+ staticType: int
+ token: foo
+}
+ metadata
+ Annotation
+ element: self::foo
+ name: SimpleIdentifier
+ staticElement: self::foo
+ staticType: int
+ token: foo
+ typeParameters
+ T
+ bound: null
+ defaultType: dynamic
+ metadata
+ Annotation
+ element: self::foo
+ name: SimpleIdentifier
+ staticElement: self::foo
+ staticType: int
+ token: foo
+const int foo;
+ constantInitializer
+ IntegerLiteral
+ literal: 0
+ staticType: int
+''',
+ withFullyResolvedAst: true);
+ }
+
test_metadata_mixinDeclaration() async {
var library = await checkLibrary(r'''
const a = null;
@@ -10107,25 +9891,15 @@
var a = A(() => b);
var b = A(() => a);
''');
- if (isAstBasedSummary) {
- // There is no cycle with `a` and `b`, because `A` is not generic,
- // so the type of `new A(...)` does not depend on its arguments.
- checkElementText(library, '''
+ // There is no cycle with `a` and `b`, because `A` is not generic,
+ // so the type of `new A(...)` does not depend on its arguments.
+ checkElementText(library, '''
class A {
A(dynamic _);
}
A a;
A b;
''');
- } else {
- checkElementText(library, '''
-class A {
- A(dynamic _);
-}
-dynamic a/*error: dependencyCycle*/;
-dynamic b/*error: dependencyCycle*/;
-''');
- }
}
test_type_inference_multiplyDefinedElement() async {
@@ -11416,6 +11190,42 @@
''');
}
+ test_variableInitializer_contextType_after_astRewrite() async {
+ var library = await checkLibrary(r'''
+class A<T> {
+ const A();
+}
+const A<int> a = A();
+''');
+ checkElementText(
+ library,
+ r'''
+class A {
+ const A();
+}
+ typeParameters
+ T
+ bound: null
+ defaultType: dynamic
+const A<int> a;
+ constantInitializer
+ InstanceCreationExpression
+ argumentList: ArgumentList
+ constructorName: ConstructorName
+ type: TypeName
+ name: SimpleIdentifier
+ staticElement: self::A
+ staticType: A<dynamic>
+ token: A
+ type: A<int>
+ staticElement: ConstructorMember
+ base: self::A::•
+ substitution: {T: int}
+ staticType: A<int>
+''',
+ withFullyResolvedAst: true);
+ }
+
test_variables() async {
var library = await checkLibrary('int i; int j;');
checkElementText(library, r'''
diff --git a/pkg/analyzer/test/src/summary/test_strategies.dart b/pkg/analyzer/test/src/summary/test_strategies.dart
index 83e49ed..0fc7bdc 100644
--- a/pkg/analyzer/test/src/summary/test_strategies.dart
+++ b/pkg/analyzer/test/src/summary/test_strategies.dart
@@ -54,8 +54,6 @@
set declaredVariables(DeclaredVariables declaredVariables);
- bool get isAstBasedSummary => false;
-
MemoryResourceProvider get resourceProvider;
void set testFile(String value);
@@ -84,9 +82,6 @@
<String, UnlinkedUnitBuilder>{};
PackageBundleAssembler bundleAssembler = new PackageBundleAssembler();
-
- @override
- bool get isAstBasedSummary => false;
}
/// [SerializedMockSdk] is a singleton class representing the result of
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index 2158740..36d5eb0 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -3394,9 +3394,7 @@
}
test_inferTypesOnGenericInstantiationsInLibraryCycle() async {
- // Note: this is a regression test for a non-deterministic behavior we used to
- // have with inference in library cycles. If you see this test flake out,
- // change `test` to `skip_test` and reopen bug #48.
+ // Note: this is a regression test for bug #48.
addFile('''
import 'main.dart';
abstract class I<E> {
diff --git a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
index 0a8d7ee..fc52165 100644
--- a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
+++ b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
@@ -224,7 +224,7 @@
class AbstractStrongTest with ResourceProviderMixin {
bool _checkCalled = true;
- AnalysisDriver _driver = null;
+ AnalysisDriver _driver;
Map<String, List<Folder>> packageMap;
diff --git a/pkg/analyzer/test/verify_diagnostics_test.dart b/pkg/analyzer/test/verify_diagnostics_test.dart
index b881193..e829ba7 100644
--- a/pkg/analyzer/test/verify_diagnostics_test.dart
+++ b/pkg/analyzer/test/verify_diagnostics_test.dart
@@ -120,9 +120,6 @@
} else if (snippet.indexOf(errorRangeStart, rangeEnd) > 0) {
_reportProblem('More than one error range in example');
}
- if (snippet.indexOf('extension') >= 0) {
- DateTime.now();
- }
return _SnippetData(
snippet.substring(0, rangeStart) +
snippet.substring(rangeStart + errorRangeStart.length, rangeEnd) +
diff --git a/pkg/analyzer/tool/diagnostics/generate.dart b/pkg/analyzer/tool/diagnostics/generate.dart
index 7f51a0d..c5f56bf 100644
--- a/pkg/analyzer/tool/diagnostics/generate.dart
+++ b/pkg/analyzer/tool/diagnostics/generate.dart
@@ -73,7 +73,7 @@
List<CodePath> paths = [];
for (int i = 0; i < documentationPaths.length; i++) {
String docPath = pathContext.joinAll(documentationPaths[i]);
- String declPath = null;
+ String declPath;
if (declarationPaths[i] != null) {
declPath = pathContext.joinAll(declarationPaths[i]);
}
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index 8e9c085..7e9a695 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -218,6 +218,8 @@
/// Returns `true` if [element] is a superclass of `List`.
bool isListSupertype(ClassEntity element);
+ InterfaceType getConstantListTypeFor(InterfaceType sourceType);
+
InterfaceType getConstantMapTypeFor(InterfaceType sourceType,
{bool hasProtoKey: false, bool onlyStringKeys: false});
@@ -1016,6 +1018,12 @@
}
@override
+ InterfaceType getConstantListTypeFor(InterfaceType sourceType) =>
+ sourceType.treatAsRaw
+ ? _env.getRawType(jsArrayClass)
+ : _env.createInterfaceType(jsArrayClass, sourceType.typeArguments);
+
+ @override
InterfaceType getConstantMapTypeFor(InterfaceType sourceType,
{bool hasProtoKey: false, bool onlyStringKeys: false}) {
ClassEntity classElement = onlyStringKeys
diff --git a/pkg/compiler/lib/src/constants/constant_system.dart b/pkg/compiler/lib/src/constants/constant_system.dart
index 47aa5ed..566c2b9 100644
--- a/pkg/compiler/lib/src/constants/constant_system.dart
+++ b/pkg/compiler/lib/src/constants/constant_system.dart
@@ -87,8 +87,12 @@
new StringConstantValue(string);
BoolConstantValue createBool(bool value) => new BoolConstantValue(value);
NullConstantValue createNull() => new NullConstantValue();
-ListConstantValue createList(InterfaceType type, List<ConstantValue> values) =>
- new ListConstantValue(type, values);
+
+ListConstantValue createList(CommonElements commonElements,
+ InterfaceType sourceType, List<ConstantValue> values) {
+ InterfaceType type = commonElements.getConstantListTypeFor(sourceType);
+ return ListConstantValue(type, values);
+}
ConstantValue createType(CommonElements commonElements, DartType type) {
InterfaceType instanceType = commonElements.typeLiteralType;
@@ -174,7 +178,7 @@
} else {
keysType = commonElements.listType(sourceType.typeArguments.first);
}
- ListConstantValue keysList = new ListConstantValue(keysType, keys);
+ ListConstantValue keysList = createList(commonElements, keysType, keys);
InterfaceType type = commonElements.getConstantMapTypeFor(sourceType,
hasProtoKey: hasProtoKey, onlyStringKeys: onlyStringKeys);
return new JavaScriptMapConstant(
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index 61be000..095bec3 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -375,8 +375,8 @@
@override
ConstantValue evaluate(EvaluationEnvironment environment) {
- return constant_system.createList(
- type, values.map((v) => v.evaluate(environment)).toList());
+ return constant_system.createList(environment.commonElements, type,
+ values.map((v) => v.evaluate(environment)).toList());
}
@override
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index 6ff3566..3c39f11 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -353,7 +353,8 @@
@override
void handleAsExpression(ir.AsExpression node, ir.DartType operandType) {
- if (typeEnvironment.isSubtypeOf(operandType, node.type)) {
+ if (typeEnvironment.isSubtypeOf(
+ operandType, node.type, ir.SubtypeCheckMode.ignoringNullabilities)) {
// Skip unneeded casts.
return;
}
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 084ffd0..d686190 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -286,7 +286,8 @@
getTypeAsInstanceOf(receiverType, superclass));
ir.DartType setterType =
receiverSubstitution.substituteType(interfaceTarget.setterType);
- if (!typeEnvironment.isSubtypeOf(valueType, setterType)) {
+ if (!typeEnvironment.isSubtypeOf(
+ valueType, setterType, ir.SubtypeCheckMode.ignoringNullabilities)) {
// We need to insert an implicit cast to preserve the invariant that
// a property set with a known interface target is also statically
// checked.
@@ -484,7 +485,8 @@
for (int i = 0; i < node.arguments.positional.length; i++) {
ir.DartType argumentType = argumentTypes.positional[i];
ir.DartType parameterType = parameterTypes.positionalParameters[i];
- if (!typeEnvironment.isSubtypeOf(argumentType, parameterType)) {
+ if (!typeEnvironment.isSubtypeOf(argumentType, parameterType,
+ ir.SubtypeCheckMode.ignoringNullabilities)) {
neededPositionalChecks[i] = parameterType;
}
}
@@ -497,7 +499,8 @@
ir.DartType parameterType = parameterTypes.namedParameters
.singleWhere((namedType) => namedType.name == namedArgument.name)
.type;
- if (!typeEnvironment.isSubtypeOf(argumentType, parameterType)) {
+ if (!typeEnvironment.isSubtypeOf(argumentType, parameterType,
+ ir.SubtypeCheckMode.ignoringNullabilities)) {
neededNamedChecks[argumentIndex] = parameterType;
}
}
@@ -719,7 +722,8 @@
assert(
node.promotedType == null ||
promotedType == typeEnvironment.nullType ||
- typeEnvironment.isSubtypeOf(promotedType, node.promotedType),
+ typeEnvironment.isSubtypeOf(promotedType, node.promotedType,
+ ir.SubtypeCheckMode.ignoringNullabilities),
"Unexpected promotion of ${node.variable} in ${node.parent}. "
"Expected ${node.promotedType}, found $promotedType");
_expressionTypeCache[node] = promotedType;
@@ -1474,7 +1478,8 @@
// TODO(johnniwinther): Special-case the `== null` representation to
// make it faster.
for (ir.DartType type in falseTypes) {
- if (typeEnvironment.isSubtypeOf(declaredType, type)) {
+ if (typeEnvironment.isSubtypeOf(
+ declaredType, type, ir.SubtypeCheckMode.ignoringNullabilities)) {
return typeEnvironment.nullType;
}
}
@@ -1484,9 +1489,11 @@
if (type == typeEnvironment.nullType) {
return type;
}
- if (typeEnvironment.isSubtypeOf(type, candidate)) {
+ if (typeEnvironment.isSubtypeOf(
+ type, candidate, ir.SubtypeCheckMode.ignoringNullabilities)) {
candidate = type;
- } else if (!typeEnvironment.isSubtypeOf(candidate, type)) {
+ } else if (!typeEnvironment.isSubtypeOf(
+ candidate, type, ir.SubtypeCheckMode.ignoringNullabilities)) {
// We cannot promote. No single type is most specific.
// TODO(johnniwinther): Compute implied types? For instance when the
// declared type is `Iterable<String>` and tested type is
@@ -1745,9 +1752,11 @@
// Keep the current candidate.
} else if (candidate == typeEnvironment.nullType) {
candidate = type;
- } else if (typeEnvironment.isSubtypeOf(candidate, type)) {
+ } else if (typeEnvironment.isSubtypeOf(
+ candidate, type, ir.SubtypeCheckMode.ignoringNullabilities)) {
candidate = type;
- } else if (!typeEnvironment.isSubtypeOf(type, candidate)) {
+ } else if (!typeEnvironment.isSubtypeOf(
+ type, candidate, ir.SubtypeCheckMode.ignoringNullabilities)) {
// We cannot promote. No promoted type of one path is a supertype of
// the promoted type from all other paths.
// TODO(johnniwinther): Compute a greatest lower bound, instead?
@@ -1872,7 +1881,8 @@
changed = true;
Set<ir.DartType> newTypesOfInterest = new Set<ir.DartType>();
for (ir.DartType typeOfInterest in info.typesOfInterest) {
- if (typeEnvironment.isSubtypeOf(type, typeOfInterest)) {
+ if (typeEnvironment.isSubtypeOf(type, typeOfInterest,
+ ir.SubtypeCheckMode.ignoringNullabilities)) {
newTypesOfInterest.add(typeOfInterest);
}
}
diff --git a/pkg/compiler/lib/src/ir/visitors.dart b/pkg/compiler/lib/src/ir/visitors.dart
index 6c08757..b41805a 100644
--- a/pkg/compiler/lib/src/ir/visitors.dart
+++ b/pkg/compiler/lib/src/ir/visitors.dart
@@ -728,7 +728,8 @@
}
DartType type = elementMap.commonElements
.listType(elementMap.getDartType(node.typeArgument));
- return constant_system.createList(type, elements);
+ return constant_system.createList(
+ elementMap.commonElements, type, elements);
}
@override
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index b9a78c9..b7dfa1a 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -473,10 +473,7 @@
jsAst.Expression maybeAddListTypeArgumentsNewRti(
ConstantValue constant, InterfaceType type, jsAst.Expression value) {
- // List<T> --> JSArray<T>
- if (type.element != _commonElements.jsArrayClass) {
- type = InterfaceType(_commonElements.jsArrayClass, type.typeArguments);
- }
+ assert(type.element == _commonElements.jsArrayClass);
if (_rtiNeed.classNeedsTypeArguments(type.element)) {
return new jsAst.Call(
getHelperProperty(_commonElements.setRuntimeTypeInfo),
diff --git a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
index b6f90d4..13fbaf9 100644
--- a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
@@ -35,57 +35,6 @@
InterceptorData get _interceptorData => _closedWorld.interceptorData;
- jsAst.Expression generateClassConstructor(
- ClassEntity classElement, List<jsAst.Name> fields, bool hasRtiField) {
- // TODO(sra): Implement placeholders in VariableDeclaration position:
- //
- // String constructorName = namer.getNameOfClass(classElement);
- // return js.statement('function #(#) { #; }',
- // [ constructorName, fields,
- // fields.map(
- // (name) => js('this.# = #', [name, name]))]));
- dynamic typeParameters = const <jsAst.Parameter>[];
- dynamic typeInits = const <jsAst.Expression>[];
- if (hasRtiField) {
- dynamic rtiName = _namer.rtiFieldJsName;
- typeParameters = rtiName;
- typeInits = js('this.# = #', [rtiName, rtiName]);
- }
- List<jsAst.Parameter> parameters = new List<jsAst.Parameter>.generate(
- fields.length, (i) => new jsAst.Parameter('t$i'));
- List<jsAst.Expression> fieldInitializers =
- new List<jsAst.Expression>.generate(fields.length, (i) {
- return js('this.# = #', [fields[i], parameters[i]]);
- });
- return js('function(#, #) { #; #; this.#();}', [
- parameters,
- typeParameters,
- fieldInitializers,
- typeInits,
- _namer.fixedNames.deferredAction
- ]);
- }
-
- jsAst.Expression generateGetter(MemberEntity member, jsAst.Name fieldName) {
- ClassEntity cls = member.enclosingClass;
- String receiver =
- _interceptorData.isInterceptedClass(cls) ? 'receiver' : 'this';
- List<String> args =
- _interceptorData.isInterceptedMethod(member) ? ['receiver'] : [];
- return js('function(#) { return #.# }', [args, receiver, fieldName]);
- }
-
- jsAst.Expression generateSetter(MemberEntity member, jsAst.Name fieldName) {
- ClassEntity cls = member.enclosingClass;
- String receiver =
- _interceptorData.isInterceptedClass(cls) ? 'receiver' : 'this';
- List<String> args =
- _interceptorData.isInterceptedMethod(member) ? ['receiver'] : [];
- // TODO(floitsch): remove 'return'?
- return js(
- 'function(#, v) { return #.# = v; }', [args, receiver, fieldName]);
- }
-
/// Documentation wanted -- johnniwinther
///
/// Invariant: [member] must be a declaration element.
diff --git a/pkg/compiler/lib/src/kernel/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart
index 78da253..4e4571e 100644
--- a/pkg/compiler/lib/src/kernel/kernel_impact.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_impact.dart
@@ -847,7 +847,8 @@
if (member.isAbstract) {
cls = elementMap.elementEnvironment.getSuperClass(cls);
} else {
- return member.enclosingClass != commonElements.objectClass;
+ return member.enclosingClass != commonElements.objectClass &&
+ member.enclosingClass != commonElements.jsInterceptorClass;
}
}
return false;
diff --git a/pkg/dart2native/bin/dart2native.dart b/pkg/dart2native/bin/dart2native.dart
index f15d5d2..475c993 100644
--- a/pkg/dart2native/bin/dart2native.dart
+++ b/pkg/dart2native/bin/dart2native.dart
@@ -140,12 +140,13 @@
}[parsedArgs['output-kind']];
final sourcePath = path.canonicalize(path.normalize(parsedArgs.rest[0]));
+ final sourceWithoutDart = sourcePath.replaceFirst(new RegExp(r'\.dart$'), '');
final outputPath =
path.canonicalize(path.normalize(parsedArgs['output'] != null
? parsedArgs['output']
: {
- Kind.aot: '${sourcePath}.aot',
- Kind.exe: '${sourcePath}.exe',
+ Kind.aot: '${sourceWithoutDart}.aot',
+ Kind.exe: '${sourceWithoutDart}.exe',
}[kind]));
if (!FileSystemEntity.isFileSync(sourcePath)) {
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index 645dd90..4a2f6e6 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -446,10 +446,14 @@
/// Returns the canonical name to refer to the Dart library.
@protected
js_ast.Identifier emitLibraryName(Library library) {
+ // Avoid adding the dart:_runtime to _imports when our runtime unit tests
+ // import it explicitly. It will always be implicitly imported.
+ if (isSdkInternalRuntime(library)) return runtimeModule;
+
// It's either one of the libraries in this module, or it's an import.
- var libraryId = js_ast.TemporaryId(jsLibraryName(library));
return _libraries[library] ??
- _imports.putIfAbsent(library, () => libraryId);
+ _imports.putIfAbsent(
+ library, () => js_ast.TemporaryId(jsLibraryName(library)));
}
/// Emits imports and extension methods into [items].
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index c741457..8401522 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -243,6 +243,7 @@
fe.IncrementalCompiler incrementalCompiler;
fe.WorkerInputComponent cachedSdkInput;
bool recordUsedInputs = argResults['used-inputs-file'] != null;
+ List<Uri> inputSummaries = summaryModules.keys.toList();
if (useAnalyzer || !useIncrementalCompiler) {
compilerState = await fe.initializeCompiler(
oldCompilerState,
@@ -251,7 +252,7 @@
compileSdk ? null : sourcePathToUri(sdkSummaryPath),
sourcePathToUri(packageFile),
sourcePathToUri(librarySpecPath),
- summaryModules.keys.toList(),
+ inputSummaries,
DevCompilerTarget(
TargetFlags(trackWidgetCreation: trackWidgetCreation)),
fileSystem: fileSystem,
@@ -286,7 +287,7 @@
compileSdk ? null : sourcePathToUri(sdkSummaryPath),
sourcePathToUri(packageFile),
sourcePathToUri(librarySpecPath),
- summaryModules.keys.toList(),
+ inputSummaries,
inputDigests,
DevCompilerTarget(
TargetFlags(trackWidgetCreation: trackWidgetCreation)),
@@ -299,8 +300,6 @@
compilerState.workerInputCache[sourcePathToUri(sdkSummaryPath)];
}
- List<Uri> inputSummaries = compilerState.options.inputSummaries;
-
// TODO(jmesserly): is there a cleaner way to do this?
//
// Ideally we'd manage our own batch compilation caching rather than rely on
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 57b2fe0..db30dd1 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -5044,7 +5044,10 @@
// }
//
var isTypeError = node.isTypeError;
- if (!isTypeError && _types.isSubtypeOf(from, to)) return jsFrom;
+ if (!isTypeError &&
+ _types.isSubtypeOf(from, to, SubtypeCheckMode.ignoringNullabilities)) {
+ return jsFrom;
+ }
// All Dart number types map to a JS double.
if (_typeRep.isNumber(from) && _typeRep.isNumber(to)) {
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 5ae85a5..3bd4a1f 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -64,7 +64,16 @@
uri.scheme == 'dart' &&
(uri.path == 'core' || uri.path == '_interceptors');
+ /// Returns [true] if [uri] represents a test script has been whitelisted to
+ /// import private platform libraries.
+ ///
+ /// Unit tests for the dart:_runtime library have imports like this. It is
+ /// only allowed from a specific SDK test directory or through the modular
+ /// test framework.
bool _allowedTestLibrary(Uri uri) {
+ // Multi-root scheme used by modular test framework.
+ if (uri.scheme == 'dev-dart-app') return true;
+
String scriptName = uri.path;
return scriptName.contains('tests/compiler/dartdevc_native');
}
diff --git a/pkg/dev_compiler/test/modular_ddc_suite.dart b/pkg/dev_compiler/test/modular_ddc_suite.dart
index fac2975..4c2a413 100644
--- a/pkg/dev_compiler/test/modular_ddc_suite.dart
+++ b/pkg/dev_compiler/test/modular_ddc_suite.dart
@@ -36,7 +36,17 @@
IOPipeline([
DDCStep(),
RunD8(),
- ], cacheSharedModules: true, saveIntermediateResultsForTesting: false));
+ ], cacheSharedModules: true));
+
+ // DDC only test suite.
+ await runSuite(
+ sdkRoot.resolve('tests/compiler/dartdevc/modular/'),
+ 'tests/compiler/dartdevc/modular',
+ _options,
+ IOPipeline([
+ DDCStep(),
+ RunD8(),
+ ], cacheSharedModules: true));
}
const sumId = DataId("sum");
diff --git a/pkg/dev_compiler/test/modular_suite.dart b/pkg/dev_compiler/test/modular_suite.dart
index 2442d93..0b4e1e6 100644
--- a/pkg/dev_compiler/test/modular_suite.dart
+++ b/pkg/dev_compiler/test/modular_suite.dart
@@ -81,6 +81,9 @@
extraArgs = ['--packages-file', '$rootScheme:/.packages'];
}
+ Module sdkModule =
+ module.isSdk ? module : module.dependencies.firstWhere((m) => m.isSdk);
+
List<String> args = [
_kernelWorkerScript,
'--summary-only',
@@ -93,8 +96,14 @@
...extraArgs,
'--output',
'${toUri(module, dillId)}',
+ if (!module.isSdk) ...[
+ '--dart-sdk-summary',
+ '${toUri(sdkModule, dillId)}',
+ '--exclude-non-sources',
+ ],
...(transitiveDependencies
- .expand((m) => ['--input-linked', '${toUri(m, dillId)}'])),
+ .where((m) => !m.isSdk)
+ .expand((m) => ['--input-summary', '${toUri(m, dillId)}'])),
...(sources.expand((String uri) => ['--source', uri])),
...(flags.expand((String flag) => ['--enable-experiment', flag])),
];
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
index 052e2dd..d36bd4a 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
@@ -43,7 +43,7 @@
const Map<ExperimentalFlag, bool> defaultExperimentalFlags = {
ExperimentalFlag.constantUpdate2018: true,
ExperimentalFlag.controlFlowCollections: true,
- ExperimentalFlag.extensionMethods: false,
+ ExperimentalFlag.extensionMethods: true,
ExperimentalFlag.nonNullable: false,
ExperimentalFlag.setLiterals: true,
ExperimentalFlag.spreadCollections: true,
diff --git a/pkg/front_end/lib/src/api_prototype/memory_file_system.dart b/pkg/front_end/lib/src/api_prototype/memory_file_system.dart
index fd091bb..3618c93 100644
--- a/pkg/front_end/lib/src/api_prototype/memory_file_system.dart
+++ b/pkg/front_end/lib/src/api_prototype/memory_file_system.dart
@@ -26,7 +26,9 @@
Uri currentDirectory;
MemoryFileSystem(Uri currentDirectory)
- : currentDirectory = _addTrailingSlash(currentDirectory);
+ : currentDirectory = _addTrailingSlash(currentDirectory) {
+ _directories.add(currentDirectory);
+ }
@override
MemoryFileSystemEntity entityForUri(Uri uri) {
diff --git a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
index 6c6b5a4..57080d9 100644
--- a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
@@ -9,7 +9,7 @@
import 'package:front_end/src/api_prototype/compiler_options.dart';
-import 'package:kernel/kernel.dart' show Component, CanonicalName, Library;
+import 'package:kernel/kernel.dart' show Component, Library;
import 'package:kernel/target/targets.dart' show Target;
@@ -20,23 +20,27 @@
import '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
-import '../api_prototype/front_end.dart' show CompilerResult;
-
import '../api_prototype/file_system.dart' show FileSystem;
+import '../api_prototype/front_end.dart' show CompilerResult;
+
import '../base/processed_options.dart' show ProcessedOptions;
-import '../fasta/compiler_context.dart' show CompilerContext;
-
-import '../fasta/incremental_compiler.dart' show IncrementalCompiler;
-
import '../kernel_generator_impl.dart' show generateKernel;
-import 'compiler_state.dart'
- show InitializedCompilerState, WorkerInputComponent, digestsEqual;
+import 'compiler_state.dart' show InitializedCompilerState;
+
+import 'modular_incremental_compilation.dart' as modular
+ show initializeIncrementalCompiler;
+
+export '../api_prototype/compiler_options.dart'
+ show parseExperimentalFlags, parseExperimentalArguments;
export '../api_prototype/diagnostic_message.dart' show DiagnosticMessage;
+export '../api_prototype/experimental_flags.dart'
+ show ExperimentalFlag, parseExperimentalFlag;
+
export '../api_prototype/standard_file_system.dart' show StandardFileSystem;
export '../api_prototype/terminal_color_support.dart'
@@ -48,11 +52,9 @@
export 'compiler_state.dart' show InitializedCompilerState;
-import 'util.dart' show equalMaps, equalSets;
-
/// Initializes the compiler for a modular build.
///
-/// Re-uses cached components from [_workerInputCache], and reloads them
+/// Re-uses cached components from [oldState.workerInputCache], and reloads them
/// as necessary based on [workerInputDigests].
Future<InitializedCompilerState> initializeIncrementalCompiler(
InitializedCompilerState oldState,
@@ -67,193 +69,26 @@
Iterable<String> experiments,
bool outlineOnly,
{bool trackNeededDillLibraries: false}) async {
- final List<int> sdkDigest = workerInputDigests[sdkSummary];
- if (sdkDigest == null) {
- throw new StateError("Expected to get digest for $sdkSummary");
- }
- IncrementalCompiler incrementalCompiler;
- CompilerOptions options;
- ProcessedOptions processedOpts;
- WorkerInputComponent cachedSdkInput;
- Map<Uri, WorkerInputComponent> workerInputCache =
- oldState?.workerInputCache ?? new Map<Uri, WorkerInputComponent>();
- Map<Uri, Uri> workerInputCacheLibs =
- oldState?.workerInputCacheLibs ?? new Map<Uri, Uri>();
-
- bool startOver = false;
+ List<Component> outputLoadedInputSummaries =
+ new List<Component>(summaryInputs.length);
Map<ExperimentalFlag, bool> experimentalFlags = parseExperimentalFlags(
parseExperimentalArguments(experiments),
onError: (e) => throw e);
-
- if (oldState == null ||
- oldState.incrementalCompiler == null ||
- oldState.incrementalCompiler.outlineOnly != outlineOnly ||
- !equalMaps(oldState.options.experimentalFlags, experimentalFlags) ||
- !equalSets(oldState.tags, tags)) {
- // No - or immediately not correct - previous state.
- startOver = true;
-
- // We'll load a new sdk, anything loaded already will have a wrong root.
- workerInputCache.clear();
- workerInputCacheLibs.clear();
- } else {
- // We do have a previous state.
- cachedSdkInput = workerInputCache[sdkSummary];
- if (cachedSdkInput == null ||
- !digestsEqual(cachedSdkInput.digest, sdkDigest)) {
- // The sdk is out of date.
- startOver = true;
- // We'll load a new sdk, anything loaded already will have a wrong root.
- workerInputCache.clear();
- workerInputCacheLibs.clear();
- }
- }
-
- if (startOver) {
- // The sdk was either not cached or it has changed.
- options = new CompilerOptions()
- ..sdkSummary = sdkSummary
- ..packagesFileUri = packagesFile
- ..librariesSpecificationUri = librariesSpecificationUri
- ..target = target
- ..fileSystem = fileSystem
- ..omitPlatform = true
- ..environmentDefines = const {}
- ..experimentalFlags = experimentalFlags;
-
- processedOpts = new ProcessedOptions(options: options);
- cachedSdkInput = new WorkerInputComponent(
- sdkDigest, await processedOpts.loadSdkSummary(null));
- workerInputCache[sdkSummary] = cachedSdkInput;
- for (Library lib in cachedSdkInput.component.libraries) {
- if (workerInputCacheLibs.containsKey(lib.importUri)) {
- throw new StateError("Duplicate sources in sdk.");
- }
- workerInputCacheLibs[lib.importUri] = sdkSummary;
- }
-
- incrementalCompiler = new IncrementalCompiler.fromComponent(
- new CompilerContext(processedOpts),
- cachedSdkInput.component,
- outlineOnly);
- incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
- } else {
- options = oldState.options;
- processedOpts = oldState.processedOpts;
- Component sdkComponent = cachedSdkInput.component;
- // Reset the state of the component.
- for (Library lib in sdkComponent.libraries) {
- lib.isExternal = cachedSdkInput.externalLibs.contains(lib.importUri);
- }
-
- // Make sure the canonical name root knows about the sdk - otherwise we
- // won't be able to link to it when loading more outlines.
- sdkComponent.adoptChildren();
-
- // TODO(jensj): This is - at least currently - necessary,
- // although it's not entirely obvious why.
- // It likely has to do with several outlines containing the same libraries.
- // Once that stops (and we check for it) we can probably remove this,
- // and instead only do it when about to reuse an outline in the
- // 'inputSummaries.add(component);' line further down.
- for (WorkerInputComponent cachedInput in workerInputCache.values) {
- cachedInput.component.adoptChildren();
- }
-
- // Reuse the incremental compiler, but reset as needed.
- incrementalCompiler = oldState.incrementalCompiler;
- incrementalCompiler.invalidateAllSources();
- incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
- options.packagesFileUri = packagesFile;
- options.fileSystem = fileSystem;
- processedOpts.clearFileSystemCache();
- }
-
- // Then read all the input summary components.
- CanonicalName nameRoot = cachedSdkInput.component.root;
- final List<Component> inputSummaries = <Component>[];
- Map<Uri, Uri> libraryToInputDill;
- if (trackNeededDillLibraries) {
- libraryToInputDill = new Map<Uri, Uri>();
- }
- List<Uri> loadFromDill = new List<Uri>();
- Set<Uri> inputSummariesSet = new Set<Uri>();
- for (Uri summary in summaryInputs) {
- inputSummariesSet.add(summary);
- WorkerInputComponent cachedInput = workerInputCache[summary];
- List<int> summaryDigest = workerInputDigests[summary];
- if (summaryDigest == null) {
- throw new StateError("Expected to get digest for $summary");
- }
- if (cachedInput == null ||
- cachedInput.component.root != nameRoot ||
- !digestsEqual(cachedInput.digest, summaryDigest)) {
- // Remove any old libraries from workerInputCacheLibs.
- Component component = cachedInput?.component;
- if (component != null) {
- for (Library lib in component.libraries) {
- workerInputCacheLibs.remove(lib.importUri);
- }
- }
-
- loadFromDill.add(summary);
- } else {
- // Need to reset cached components so they are usable again.
- Component component = cachedInput.component;
- for (Library lib in component.libraries) {
- lib.isExternal = cachedInput.externalLibs.contains(lib.importUri);
- if (trackNeededDillLibraries) {
- libraryToInputDill[lib.importUri] = summary;
- }
- }
- inputSummaries.add(component);
- }
- }
-
- for (int i = 0; i < loadFromDill.length; i++) {
- Uri summary = loadFromDill[i];
- List<int> summaryDigest = workerInputDigests[summary];
- if (summaryDigest == null) {
- throw new StateError("Expected to get digest for $summary");
- }
- WorkerInputComponent cachedInput = new WorkerInputComponent(
- summaryDigest,
- await processedOpts.loadComponent(
- await fileSystem.entityForUri(summary).readAsBytes(), nameRoot,
- alwaysCreateNewNamedNodes: true));
- workerInputCache[summary] = cachedInput;
- inputSummaries.add(cachedInput.component);
- for (Library lib in cachedInput.component.libraries) {
- if (workerInputCacheLibs.containsKey(lib.importUri)) {
- Uri fromSummary = workerInputCacheLibs[lib.importUri];
- if (inputSummariesSet.contains(fromSummary)) {
- throw new StateError(
- "Asked to load several summaries that contain the same library.");
- } else {
- // Library contained in old cached component. Flush that cache.
- Component component = workerInputCache.remove(fromSummary).component;
- for (Library lib in component.libraries) {
- workerInputCacheLibs.remove(lib.importUri);
- }
- }
- } else {
- workerInputCacheLibs[lib.importUri] = summary;
- }
-
- if (trackNeededDillLibraries) {
- libraryToInputDill[lib.importUri] = summary;
- }
- }
- }
-
- incrementalCompiler.setModulesToLoadOnNextComputeDelta(inputSummaries);
-
- return new InitializedCompilerState(options, processedOpts,
- workerInputCache: workerInputCache,
- workerInputCacheLibs: workerInputCacheLibs,
- incrementalCompiler: incrementalCompiler,
- tags: tags,
- libraryToInputDill: libraryToInputDill);
+ return modular.initializeIncrementalCompiler(
+ oldState,
+ tags,
+ outputLoadedInputSummaries,
+ sdkSummary,
+ packagesFile,
+ librariesSpecificationUri,
+ summaryInputs,
+ workerInputDigests,
+ target,
+ fileSystem: fileSystem,
+ experimentalFlags: experimentalFlags,
+ outlineOnly: outlineOnly,
+ omitPlatform: true,
+ trackNeededDillLibraries: trackNeededDillLibraries);
}
Future<InitializedCompilerState> initializeCompiler(
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index 8885e67..0a5122b 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -6,7 +6,7 @@
import 'package:kernel/class_hierarchy.dart';
-import 'package:kernel/kernel.dart' show Component, CanonicalName, Library;
+import 'package:kernel/kernel.dart' show Component;
import 'package:kernel/target/targets.dart' show Target;
@@ -24,16 +24,14 @@
import '../base/processed_options.dart' show ProcessedOptions;
-import '../fasta/compiler_context.dart' show CompilerContext;
-
-import '../fasta/incremental_compiler.dart' show IncrementalCompiler;
-
import '../kernel_generator_impl.dart' show generateKernel;
-import 'compiler_state.dart'
- show InitializedCompilerState, WorkerInputComponent, digestsEqual;
+import 'compiler_state.dart' show InitializedCompilerState;
-import 'util.dart' show equalLists, equalMaps, equalSets;
+import 'modular_incremental_compilation.dart' as modular
+ show initializeIncrementalCompiler;
+
+import 'util.dart' show equalLists, equalMaps;
export '../api_prototype/compiler_options.dart'
show CompilerOptions, parseExperimentalFlags, parseExperimentalArguments;
@@ -132,6 +130,10 @@
return new InitializedCompilerState(options, processedOpts);
}
+/// Initializes the compiler for a modular build.
+///
+/// Re-uses cached components from [oldState.workerInputCache], and reloads them
+/// as necessary based on [workerInputDigests].
Future<InitializedCompilerState> initializeIncrementalCompiler(
InitializedCompilerState oldState,
Set<String> tags,
@@ -148,183 +150,25 @@
Map<ExperimentalFlag, bool> experiments,
Map<String, String> environmentDefines,
bool trackNeededDillLibraries: false}) async {
- inputSummaries.sort((a, b) => a.toString().compareTo(b.toString()));
-
- IncrementalCompiler incrementalCompiler;
- WorkerInputComponent cachedSdkInput;
- CompilerOptions options;
- ProcessedOptions processedOpts;
-
- Map<Uri, WorkerInputComponent> workerInputCache =
- oldState?.workerInputCache ?? new Map<Uri, WorkerInputComponent>();
- Map<Uri, Uri> workerInputCacheLibs =
- oldState?.workerInputCacheLibs ?? new Map<Uri, Uri>();
-
- final List<int> sdkDigest = workerInputDigests[sdkSummary];
- if (sdkDigest == null) {
- throw new StateError("Expected to get sdk digest at $sdkSummary");
- }
-
- cachedSdkInput = workerInputCache[sdkSummary];
-
- if (oldState == null ||
- oldState.incrementalCompiler == null ||
- oldState.options.compileSdk != compileSdk ||
- cachedSdkInput == null ||
- !digestsEqual(cachedSdkInput.digest, sdkDigest) ||
- !equalMaps(oldState.options.experimentalFlags, experiments) ||
- !equalMaps(oldState.options.environmentDefines, environmentDefines) ||
- !equalSets(oldState.tags, tags)) {
- // No - or immediately not correct - previous state.
- options = new CompilerOptions()
- ..compileSdk = compileSdk
- ..sdkRoot = sdkRoot
- ..sdkSummary = sdkSummary
- ..packagesFileUri = packagesFile
- ..inputSummaries = inputSummaries
- ..librariesSpecificationUri = librariesSpecificationUri
- ..target = target
- ..fileSystem = fileSystem ?? StandardFileSystem.instance
- ..environmentDefines = environmentDefines;
- if (experiments != null) options.experimentalFlags = experiments;
-
- // We'll load a new sdk, anything loaded already will have a wrong root.
- workerInputCache.clear();
- workerInputCacheLibs.clear();
-
- processedOpts = new ProcessedOptions(options: options);
-
- cachedSdkInput = new WorkerInputComponent(
- sdkDigest, await processedOpts.loadSdkSummary(null));
- workerInputCache[sdkSummary] = cachedSdkInput;
- for (Library lib in cachedSdkInput.component.libraries) {
- if (workerInputCacheLibs.containsKey(lib.importUri)) {
- throw new StateError("Duplicate sources in sdk.");
- }
- workerInputCacheLibs[lib.importUri] = sdkSummary;
- }
-
- incrementalCompiler = new IncrementalCompiler.fromComponent(
- new CompilerContext(processedOpts), cachedSdkInput.component);
- incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
- } else {
- options = oldState.options;
- options.inputSummaries = inputSummaries;
- processedOpts = oldState.processedOpts;
-
- for (Library lib in cachedSdkInput.component.libraries) {
- lib.isExternal = false;
- }
- cachedSdkInput.component.adoptChildren();
- for (WorkerInputComponent cachedInput in workerInputCache.values) {
- cachedInput.component.adoptChildren();
- }
-
- // Reuse the incremental compiler, but reset as needed.
- incrementalCompiler = oldState.incrementalCompiler;
- incrementalCompiler.invalidateAllSources();
- incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
- options.packagesFileUri = packagesFile;
- options.fileSystem = fileSystem;
- processedOpts.clearFileSystemCache();
- }
- InitializedCompilerState compilerState = new InitializedCompilerState(
- options, processedOpts,
- workerInputCache: workerInputCache,
- incrementalCompiler: incrementalCompiler);
-
- CanonicalName nameRoot = cachedSdkInput.component.root;
- Map<Uri, Uri> libraryToInputDill;
- if (trackNeededDillLibraries) {
- libraryToInputDill = new Map<Uri, Uri>();
- }
- List<int> loadFromDillIndexes = new List<int>();
-
- // Notice that the ordering of the input summaries matter, so we need to
- // keep them in order.
- if (doneInputSummaries.length != inputSummaries.length) {
- throw new ArgumentError("Invalid length.");
- }
- Set<Uri> inputSummariesSet = new Set<Uri>();
- for (int i = 0; i < inputSummaries.length; i++) {
- Uri inputSummary = inputSummaries[i];
- inputSummariesSet.add(inputSummary);
- WorkerInputComponent cachedInput = workerInputCache[inputSummary];
- List<int> digest = workerInputDigests[inputSummary];
- if (digest == null) {
- throw new StateError("Expected to get digest for $inputSummary");
- }
- if (cachedInput == null ||
- cachedInput.component.root != nameRoot ||
- !digestsEqual(digest, cachedInput.digest)) {
- // Remove any old libraries from workerInputCacheLibs.
- Component component = cachedInput?.component;
- if (component != null) {
- for (Library lib in component.libraries) {
- workerInputCacheLibs.remove(lib.importUri);
- }
- }
-
- loadFromDillIndexes.add(i);
- } else {
- // Need to reset cached components so they are usable again.
- Component component = cachedInput.component;
- for (Library lib in component.libraries) {
- lib.isExternal = cachedInput.externalLibs.contains(lib.importUri);
- if (trackNeededDillLibraries) {
- libraryToInputDill[lib.importUri] = inputSummary;
- }
- }
- component.computeCanonicalNames();
- doneInputSummaries[i] = component;
- }
- }
-
- for (int i = 0; i < loadFromDillIndexes.length; i++) {
- int index = loadFromDillIndexes[i];
- Uri summary = inputSummaries[index];
- List<int> digest = workerInputDigests[summary];
- if (digest == null) {
- throw new StateError("Expected to get digest for $summary");
- }
- List<int> bytes = await fileSystem.entityForUri(summary).readAsBytes();
- WorkerInputComponent cachedInput = new WorkerInputComponent(
- digest,
- await compilerState.processedOpts
- .loadComponent(bytes, nameRoot, alwaysCreateNewNamedNodes: true));
- workerInputCache[summary] = cachedInput;
- doneInputSummaries[index] = cachedInput.component;
- for (Library lib in cachedInput.component.libraries) {
- if (workerInputCacheLibs.containsKey(lib.importUri)) {
- Uri fromSummary = workerInputCacheLibs[lib.importUri];
- if (inputSummariesSet.contains(fromSummary)) {
- throw new StateError(
- "Asked to load several summaries that contain the same library.");
- } else {
- // Library contained in old cached component. Flush that cache.
- Component component = workerInputCache.remove(fromSummary).component;
- for (Library lib in component.libraries) {
- workerInputCacheLibs.remove(lib.importUri);
- }
- }
- } else {
- workerInputCacheLibs[lib.importUri] = summary;
- }
-
- if (trackNeededDillLibraries) {
- libraryToInputDill[lib.importUri] = summary;
- }
- }
- }
-
- incrementalCompiler.setModulesToLoadOnNextComputeDelta(doneInputSummaries);
-
- return new InitializedCompilerState(options, processedOpts,
- workerInputCache: workerInputCache,
- workerInputCacheLibs: workerInputCacheLibs,
- incrementalCompiler: incrementalCompiler,
- tags: tags,
- libraryToInputDill: libraryToInputDill);
+ return modular.initializeIncrementalCompiler(
+ oldState,
+ tags,
+ doneInputSummaries,
+ sdkSummary,
+ packagesFile,
+ librariesSpecificationUri,
+ inputSummaries,
+ workerInputDigests,
+ target,
+ compileSdk: compileSdk,
+ sdkRoot: sdkRoot,
+ fileSystem: fileSystem ?? StandardFileSystem.instance,
+ experimentalFlags: experiments,
+ environmentDefines:
+ environmentDefines ?? const <ExperimentalFlag, bool>{},
+ outlineOnly: false,
+ omitPlatform: false,
+ trackNeededDillLibraries: trackNeededDillLibraries);
}
Future<DdcResult> compile(InitializedCompilerState compilerState,
diff --git a/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
new file mode 100644
index 0000000..5244f74
--- /dev/null
+++ b/pkg/front_end/lib/src/api_unstable/modular_incremental_compilation.dart
@@ -0,0 +1,243 @@
+// Copyright (c) 2019, 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' show Future;
+
+import 'package:kernel/kernel.dart' show Component, CanonicalName, Library;
+
+import 'package:kernel/target/targets.dart' show Target;
+
+import '../api_prototype/compiler_options.dart' show CompilerOptions;
+
+import '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
+
+import '../api_prototype/file_system.dart' show FileSystem;
+
+import '../base/processed_options.dart' show ProcessedOptions;
+
+import '../fasta/compiler_context.dart' show CompilerContext;
+
+import '../fasta/incremental_compiler.dart' show IncrementalCompiler;
+
+import 'compiler_state.dart'
+ show InitializedCompilerState, WorkerInputComponent, digestsEqual;
+
+import 'util.dart' show equalMaps, equalSets;
+
+/// Initializes the compiler for a modular build.
+///
+/// Re-uses cached components from [oldState.workerInputCache], and reloads them
+/// as necessary based on [workerInputDigests].
+///
+/// Notes:
+/// * [outputLoadedInputSummaries] should be given as an empty list of the same
+/// size as the [inputSummaries]. The input summaries are loaded (or taken
+/// from cache) and placed in this list in order, i.e. the `i`-th entry in
+/// [outputLoadedInputSummaries] after this call corresponds to the component
+/// loaded from the `i`-th entry in [inputSummaries].
+Future<InitializedCompilerState> initializeIncrementalCompiler(
+ InitializedCompilerState oldState,
+ Set<String> tags,
+ List<Component> outputLoadedInputSummaries,
+ Uri sdkSummary,
+ Uri packagesFile,
+ Uri librariesSpecificationUri,
+ List<Uri> inputSummaries,
+ Map<Uri, List<int>> workerInputDigests,
+ Target target,
+ {bool compileSdk: false,
+ Uri sdkRoot: null,
+ FileSystem fileSystem,
+ Map<ExperimentalFlag, bool> experimentalFlags,
+ Map<String, String> environmentDefines: const {},
+ bool outlineOnly,
+ bool omitPlatform: false,
+ bool trackNeededDillLibraries: false}) async {
+ final List<int> sdkDigest = workerInputDigests[sdkSummary];
+ if (sdkDigest == null) {
+ throw new StateError("Expected to get digest for $sdkSummary");
+ }
+
+ Map<Uri, WorkerInputComponent> workerInputCache =
+ oldState?.workerInputCache ?? new Map<Uri, WorkerInputComponent>();
+ Map<Uri, Uri> workerInputCacheLibs =
+ oldState?.workerInputCacheLibs ?? new Map<Uri, Uri>();
+
+ WorkerInputComponent cachedSdkInput = workerInputCache[sdkSummary];
+
+ IncrementalCompiler incrementalCompiler;
+ CompilerOptions options;
+ ProcessedOptions processedOpts;
+
+ if (oldState == null ||
+ oldState.incrementalCompiler == null ||
+ oldState.options.compileSdk != compileSdk ||
+ oldState.incrementalCompiler.outlineOnly != outlineOnly ||
+ !equalMaps(oldState.options.experimentalFlags, experimentalFlags) ||
+ !equalMaps(oldState.options.environmentDefines, environmentDefines) ||
+ !equalSets(oldState.tags, tags) ||
+ cachedSdkInput == null ||
+ !digestsEqual(cachedSdkInput.digest, sdkDigest)) {
+ // No - or immediately not correct - previous state.
+ // We'll load a new sdk, anything loaded already will have a wrong root.
+ workerInputCache.clear();
+ workerInputCacheLibs.clear();
+
+ // The sdk was either not cached or it has changed.
+ options = new CompilerOptions()
+ ..compileSdk = compileSdk
+ ..sdkRoot = sdkRoot
+ ..sdkSummary = sdkSummary
+ ..packagesFileUri = packagesFile
+ ..librariesSpecificationUri = librariesSpecificationUri
+ ..target = target
+ ..fileSystem = fileSystem
+ ..omitPlatform = omitPlatform
+ ..environmentDefines = environmentDefines
+ ..experimentalFlags = experimentalFlags;
+
+ processedOpts = new ProcessedOptions(options: options);
+ cachedSdkInput = new WorkerInputComponent(
+ sdkDigest, await processedOpts.loadSdkSummary(null));
+ workerInputCache[sdkSummary] = cachedSdkInput;
+ for (Library lib in cachedSdkInput.component.libraries) {
+ if (workerInputCacheLibs.containsKey(lib.importUri)) {
+ throw new StateError("Duplicate sources in sdk.");
+ }
+ workerInputCacheLibs[lib.importUri] = sdkSummary;
+ }
+
+ incrementalCompiler = new IncrementalCompiler.fromComponent(
+ new CompilerContext(processedOpts),
+ cachedSdkInput.component,
+ outlineOnly);
+ incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
+ } else {
+ options = oldState.options;
+ processedOpts = oldState.processedOpts;
+ Component sdkComponent = cachedSdkInput.component;
+ // Reset the state of the component.
+ for (Library lib in sdkComponent.libraries) {
+ lib.isExternal = cachedSdkInput.externalLibs.contains(lib.importUri);
+ }
+
+ // Make sure the canonical name root knows about the sdk - otherwise we
+ // won't be able to link to it when loading more outlines.
+ sdkComponent.adoptChildren();
+
+ // TODO(jensj): This is - at least currently - necessary,
+ // although it's not entirely obvious why.
+ // It likely has to do with several outlines containing the same libraries.
+ // Once that stops (and we check for it) we can probably remove this,
+ // and instead only do it when about to reuse an outline in the
+ // 'inputSummaries.add(component);' line further down.
+ for (WorkerInputComponent cachedInput in workerInputCache.values) {
+ cachedInput.component.adoptChildren();
+ }
+
+ // Reuse the incremental compiler, but reset as needed.
+ incrementalCompiler = oldState.incrementalCompiler;
+ incrementalCompiler.invalidateAllSources();
+ incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
+ options.packagesFileUri = packagesFile;
+ options.fileSystem = fileSystem;
+ processedOpts.clearFileSystemCache();
+ }
+
+ // Then read all the input summary components.
+ CanonicalName nameRoot = cachedSdkInput.component.root;
+ Map<Uri, Uri> libraryToInputDill;
+ if (trackNeededDillLibraries) {
+ libraryToInputDill = new Map<Uri, Uri>();
+ }
+ List<int> loadFromDillIndexes = new List<int>();
+
+ // Notice that the ordering of the input summaries matter, so we need to
+ // keep them in order.
+ if (outputLoadedInputSummaries.length != inputSummaries.length) {
+ throw new ArgumentError("Invalid length.");
+ }
+ Set<Uri> inputSummariesSet = new Set<Uri>();
+ for (int i = 0; i < inputSummaries.length; i++) {
+ Uri summaryUri = inputSummaries[i];
+ inputSummariesSet.add(summaryUri);
+ WorkerInputComponent cachedInput = workerInputCache[summaryUri];
+ List<int> digest = workerInputDigests[summaryUri];
+ if (digest == null) {
+ throw new StateError("Expected to get digest for $summaryUri");
+ }
+ if (cachedInput == null ||
+ cachedInput.component.root != nameRoot ||
+ !digestsEqual(digest, cachedInput.digest)) {
+ // Remove any old libraries from workerInputCacheLibs.
+ Component component = cachedInput?.component;
+ if (component != null) {
+ for (Library lib in component.libraries) {
+ workerInputCacheLibs.remove(lib.importUri);
+ }
+ }
+
+ loadFromDillIndexes.add(i);
+ } else {
+ // Need to reset cached components so they are usable again.
+ Component component = cachedInput.component;
+ for (Library lib in component.libraries) {
+ lib.isExternal = cachedInput.externalLibs.contains(lib.importUri);
+ if (trackNeededDillLibraries) {
+ libraryToInputDill[lib.importUri] = summaryUri;
+ }
+ }
+ component.computeCanonicalNames(); // this isn't needed, is it?
+ outputLoadedInputSummaries[i] = component;
+ }
+ }
+
+ for (int i = 0; i < loadFromDillIndexes.length; i++) {
+ int index = loadFromDillIndexes[i];
+ Uri summaryUri = inputSummaries[index];
+ List<int> digest = workerInputDigests[summaryUri];
+ if (digest == null) {
+ throw new StateError("Expected to get digest for $summaryUri");
+ }
+
+ List<int> bytes = await fileSystem.entityForUri(summaryUri).readAsBytes();
+ WorkerInputComponent cachedInput = new WorkerInputComponent(
+ digest,
+ await processedOpts.loadComponent(bytes, nameRoot,
+ alwaysCreateNewNamedNodes: true));
+ workerInputCache[summaryUri] = cachedInput;
+ outputLoadedInputSummaries[index] = cachedInput.component;
+ for (Library lib in cachedInput.component.libraries) {
+ if (workerInputCacheLibs.containsKey(lib.importUri)) {
+ Uri fromSummary = workerInputCacheLibs[lib.importUri];
+ if (inputSummariesSet.contains(fromSummary)) {
+ throw new StateError(
+ "Asked to load several summaries that contain the same library.");
+ } else {
+ // Library contained in old cached component. Flush that cache.
+ Component component = workerInputCache.remove(fromSummary).component;
+ for (Library lib in component.libraries) {
+ workerInputCacheLibs.remove(lib.importUri);
+ }
+ }
+ } else {
+ workerInputCacheLibs[lib.importUri] = summaryUri;
+ }
+
+ if (trackNeededDillLibraries) {
+ libraryToInputDill[lib.importUri] = summaryUri;
+ }
+ }
+ }
+
+ incrementalCompiler
+ .setModulesToLoadOnNextComputeDelta(outputLoadedInputSummaries);
+
+ return new InitializedCompilerState(options, processedOpts,
+ workerInputCache: workerInputCache,
+ workerInputCacheLibs: workerInputCacheLibs,
+ incrementalCompiler: incrementalCompiler,
+ tags: tags,
+ libraryToInputDill: libraryToInputDill);
+}
diff --git a/pkg/front_end/lib/src/base/common.dart b/pkg/front_end/lib/src/base/common.dart
new file mode 100644
index 0000000..e511a04
--- /dev/null
+++ b/pkg/front_end/lib/src/base/common.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2019, 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.
+
+/// If `true`, data that would not otherwise be kept is stored for testing.
+bool retainDataForTesting = false;
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index c4a1632..ee0b627 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -51,7 +51,10 @@
import 'package:kernel/type_algebra.dart' as type_algebra
show getSubstitutionMap;
-import 'package:kernel/type_environment.dart' show TypeEnvironment;
+import 'package:kernel/type_environment.dart'
+ show SubtypeCheckMode, TypeEnvironment;
+
+import '../../base/common.dart';
import '../dill/dill_member_builder.dart' show DillMemberBuilder;
@@ -166,6 +169,8 @@
ClassBuilder actualOrigin;
+ ClassBuilder patchForTesting;
+
ClassBuilder(
List<MetadataBuilder> metadata,
int modifiers,
@@ -1165,9 +1170,12 @@
DartType subtype = inParameter ? interfaceType : declaredType;
DartType supertype = inParameter ? declaredType : interfaceType;
- if (types.isSubtypeOfKernel(subtype, supertype)) {
+ if (types.isSubtypeOfKernel(
+ subtype, supertype, SubtypeCheckMode.ignoringNullabilities)) {
// No problem--the proper subtyping relation is satisfied.
- } else if (isCovariant && types.isSubtypeOfKernel(supertype, subtype)) {
+ } else if (isCovariant &&
+ types.isSubtypeOfKernel(
+ supertype, subtype, SubtypeCheckMode.ignoringNullabilities)) {
// No problem--the overriding parameter is marked "covariant" and has
// a type which is a subtype of the parameter it overrides.
} else if (subtype is InvalidType || supertype is InvalidType) {
@@ -1523,6 +1531,9 @@
void applyPatch(Builder patch) {
if (patch is ClassBuilder) {
patch.actualOrigin = this;
+ if (retainDataForTesting) {
+ patchForTesting = patch;
+ }
// TODO(ahe): Complain if `patch.supertype` isn't null.
scope.local.forEach((String name, Builder member) {
Builder memberPatch = patch.scope.local[name];
@@ -1627,7 +1638,8 @@
DartType typeArgument = typeArguments[i];
// Check whether the [typeArgument] respects the bounds of
// [typeParameter].
- if (!typeEnvironment.isSubtypeOf(typeArgument, typeParameterBound)) {
+ if (!typeEnvironment.isSubtypeOf(typeArgument, typeParameterBound,
+ SubtypeCheckMode.ignoringNullabilities)) {
addProblem(
templateRedirectingFactoryIncompatibleTypeArgument.withArguments(
typeArgument, typeParameterBound),
@@ -1685,7 +1697,8 @@
if (redirecteeType == null) return;
// Check whether [redirecteeType] <: [factoryType].
- if (!typeEnvironment.isSubtypeOf(redirecteeType, factoryType)) {
+ if (!typeEnvironment.isSubtypeOf(
+ redirecteeType, factoryType, SubtypeCheckMode.ignoringNullabilities)) {
addProblem(
templateIncompatibleRedirecteeFunctionType.withArguments(
redirecteeType, factoryType),
diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
index f591207..2f1777b 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
@@ -156,4 +156,10 @@
newTypes.add(newType);
return newType;
}
+
+ FunctionTypeBuilder withNullabilityBuilder(
+ NullabilityBuilder nullabilityBuilder) {
+ return new FunctionTypeBuilder(
+ returnType, typeVariables, formals, nullabilityBuilder);
+ }
}
diff --git a/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart b/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart
index a0f7861..2ecb4a6 100644
--- a/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart
@@ -4,7 +4,8 @@
library fasta.mixin_application_builder;
-import 'builder.dart' show LibraryBuilder, TypeBuilder, TypeVariableBuilder;
+import 'builder.dart'
+ show LibraryBuilder, NullabilityBuilder, TypeBuilder, TypeVariableBuilder;
import 'package:kernel/ast.dart' show InterfaceType, Supertype;
@@ -23,6 +24,10 @@
String get name => null;
+ NullabilityBuilder get nullabilityBuilder {
+ return unsupported("nullabilityBuilder", -1, null);
+ }
+
String get debugName => "MixinApplicationBuilder";
StringBuffer printOn(StringBuffer buffer) {
@@ -61,6 +66,12 @@
return unsupported("buildInvalidType", message.charOffset, message.uri);
}
+ @override
+ MixinApplicationBuilder withNullabilityBuilder(
+ NullabilityBuilder nullabilityBuilder) {
+ return unsupported("withNullabilityBuilder", -1, null);
+ }
+
MixinApplicationBuilder clone(List<TypeBuilder> newTypes) {
int charOffset = -1; // TODO(dmitryas): Provide these.
Uri fileUri = null; // TODO(dmitryas): Provide these.
diff --git a/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart b/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
index 6357975..592ecf2 100644
--- a/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
@@ -74,5 +74,6 @@
return buffer..write(name ?? fullNameForErrors);
}
- String toString() => "$debugName(${printOn(new StringBuffer())})";
+ String toString() =>
+ "${isPatch ? 'patch ' : ''}$debugName(${printOn(new StringBuffer())})";
}
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index 38a57ae..a956d76 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -296,4 +296,10 @@
newTypes.add(newType);
return newType;
}
+
+ NamedTypeBuilder withNullabilityBuilder(
+ NullabilityBuilder nullabilityBuilder) {
+ return new NamedTypeBuilder(name, nullabilityBuilder, arguments)
+ ..bind(declaration);
+ }
}
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index d818e4d..0335f23 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -11,6 +11,8 @@
import 'package:kernel/type_algebra.dart';
+import '../../base/common.dart';
+
import 'builder.dart'
show
Builder,
@@ -459,6 +461,7 @@
final Procedure _procedure;
final int charOpenParenOffset;
final ProcedureKind kind;
+ ProcedureBuilder patchForTesting;
AsyncMarker actualAsyncModifier = AsyncMarker.Sync;
@@ -553,8 +556,8 @@
_procedure.isConst = isConst;
if (isExtensionMethod) {
ExtensionBuilder extensionBuilder = parent;
- procedure.isExtensionMember = true;
- procedure.isStatic = true;
+ _procedure.isExtensionMember = true;
+ _procedure.isStatic = true;
String kindInfix = '';
if (isExtensionInstanceMember) {
// Instance getter and setter are converted to methods so we use an
@@ -574,18 +577,18 @@
throw new UnsupportedError(
'Unexpected extension method kind ${kind}');
}
- procedure.kind = ProcedureKind.Method;
+ _procedure.kind = ProcedureKind.Method;
}
- procedure.name = new Name(
+ _procedure.name = new Name(
'${extensionBuilder.name}|${kindInfix}${name}',
libraryBuilder.library);
} else {
_procedure.isStatic = isStatic;
_procedure.name = new Name(name, libraryBuilder.library);
}
- }
- if (extensionTearOff != null) {
- _buildExtensionTearOff(libraryBuilder, parent);
+ if (extensionTearOff != null) {
+ _buildExtensionTearOff(libraryBuilder, parent);
+ }
}
return _procedure;
}
@@ -698,7 +701,7 @@
Statement closureBody = new ReturnStatement(
new StaticInvocation(
- procedure,
+ _procedure,
new Arguments(closurePositionalArguments,
types: typeArguments, named: closureNamedArguments))
..fileOffset = fileOffset)
@@ -709,10 +712,10 @@
typeParameters: closureTypeParameters,
positionalParameters: closurePositionalParameters,
namedParameters: closureNamedParameters,
- requiredParameterCount: procedure.function.requiredParameterCount - 1,
+ requiredParameterCount: _procedure.function.requiredParameterCount - 1,
returnType: closureReturnType,
- asyncMarker: procedure.function.asyncMarker,
- dartAsyncMarker: procedure.function.dartAsyncMarker))
+ asyncMarker: _procedure.function.asyncMarker,
+ dartAsyncMarker: _procedure.function.dartAsyncMarker))
..fileOffset = fileOffset;
_extensionTearOff
@@ -783,6 +786,9 @@
if (patch is ProcedureBuilder) {
if (checkPatch(patch)) {
patch.actualOrigin = this;
+ if (retainDataForTesting) {
+ patchForTesting = patch;
+ }
}
} else {
reportPatchMismatch(patch);
@@ -807,6 +813,8 @@
@override
ConstructorBuilder actualOrigin;
+ ConstructorBuilder patchForTesting;
+
Constructor get actualConstructor => _constructor;
ConstructorBuilder(
@@ -998,6 +1006,9 @@
if (patch is ConstructorBuilder) {
if (checkPatch(patch)) {
patch.actualOrigin = this;
+ if (retainDataForTesting) {
+ patchForTesting = patch;
+ }
}
} else {
reportPatchMismatch(patch);
diff --git a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
index f07de9d..7a7bc4c 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
@@ -150,10 +150,9 @@
/// [arguments] have already been built.
DartType buildTypesWithBuiltArguments(LibraryBuilder library,
Nullability nullability, List<DartType> arguments) {
- // TODO(dmitryas): Use [nullability].
DartType thisType = buildThisType(library);
if (const DynamicType() == thisType) return thisType;
- FunctionType result = thisType;
+ FunctionType result = thisType.withNullability(nullability);
if (typedef.typeParameters.isEmpty && arguments == null) return result;
Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{};
for (int i = 0; i < typedef.typeParameters.length; i++) {
@@ -209,8 +208,9 @@
NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments) {
DartType thisType = buildThisType(library);
if (thisType is InvalidType) return thisType;
- FunctionType result = thisType;
- if (typedef.typeParameters.isEmpty && arguments == null) return result;
+ if (typedef.typeParameters.isEmpty && arguments == null) {
+ return thisType.withNullability(nullabilityBuilder.build(library));
+ }
// Otherwise, substitute.
return buildTypesWithBuiltArguments(
library,
diff --git a/pkg/front_end/lib/src/fasta/builder/type_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
index 93b1ade..ae2428b 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
@@ -10,6 +10,7 @@
import '../scope.dart';
import 'library_builder.dart';
+import 'nullability_builder.dart';
import 'type_declaration_builder.dart';
import 'type_variable_builder.dart';
@@ -32,6 +33,8 @@
/// May return null, for example, for mixin applications.
Object get name;
+ NullabilityBuilder get nullabilityBuilder;
+
String get debugName;
StringBuffer printOn(StringBuffer buffer);
@@ -65,4 +68,6 @@
Supertype buildMixedInType(
LibraryBuilder library, int charOffset, Uri fileUri);
+
+ TypeBuilder withNullabilityBuilder(NullabilityBuilder nullabilityBuilder);
}
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
index b46cd36..d45a8c7 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_member_builder.dart
@@ -26,7 +26,7 @@
bool get isStatic => _descriptor.isStatic;
@override
- bool get isExternal => _descriptor.isExternal;
+ bool get isExternal => member.isExternal;
@override
Procedure get procedure {
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 ad6ebd4..34eb285 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -161,12 +161,9 @@
DartType _type,
DartType
_type2)> templateArgumentTypeNotAssignable = const Template<
- Message Function(DartType _type,
- DartType _type2)>(
+ Message Function(DartType _type, DartType _type2)>(
messageTemplate:
r"""The argument type '#type' can't be assigned to the parameter type '#type2'.""",
- tipTemplate:
- r"""Try changing the type of the parameter, or casting the argument to '#type2'.""",
withArguments: _withArgumentsArgumentTypeNotAssignable);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -188,7 +185,6 @@
message:
"""The argument type '${type}' can't be assigned to the parameter type '${type2}'.""" +
labeler.originMessages,
- tip: """Try changing the type of the parameter, or casting the argument to '${type2}'.""",
arguments: {'type': _type, 'type2': _type2});
}
@@ -422,7 +418,6 @@
const Template<Message Function(Token token)>(
messageTemplate:
r"""The built-in identifier '#lexeme' can't be used as a type.""",
- tipTemplate: r"""Try correcting the name to match an existing type.""",
withArguments: _withArgumentsBuiltInIdentifierAsType);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -437,7 +432,6 @@
return new Message(codeBuiltInIdentifierAsType,
message:
"""The built-in identifier '${lexeme}' can't be used as a type.""",
- tip: """Try correcting the name to match an existing type.""",
arguments: {'token': token});
}
@@ -770,7 +764,7 @@
"CantUsePrefixWithNullAware",
analyzerCodes: <String>["PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT"],
message: r"""A prefix can't be used with null-aware operators.""",
- tip: r"""It should be safe to remove the '?' as a prefix is never null.""");
+ tip: r"""Try replacing '?.' with '.'""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeCatchSyntax = messageCatchSyntax;
@@ -1771,7 +1765,7 @@
Message Function(String name)>(
messageTemplate: r"""The const variable '#name' must be initialized.""",
tipTemplate:
- r"""Try adding an initializer ('= <expression>') to the declaration.""",
+ r"""Try adding an initializer ('= expression') to the declaration.""",
withArguments: _withArgumentsConstFieldWithoutInitializer);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1786,8 +1780,7 @@
name = demangleMixinApplicationName(name);
return new Message(codeConstFieldWithoutInitializer,
message: """The const variable '${name}' must be initialized.""",
- tip:
- """Try adding an initializer ('= <expression>') to the declaration.""",
+ tip: """Try adding an initializer ('= expression') to the declaration.""",
arguments: {'name': name});
}
@@ -2909,8 +2902,8 @@
"EqualityCannotBeEqualityOperand",
index: 1,
message:
- r"""An equality expression can't be an operand of another equality expression.""",
- tip: r"""Try re-writing the expression.""");
+ r"""A comparison expression can't be an operand of another comparison expression.""",
+ tip: r"""Try putting parentheses around one of the comparisons.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String string)> templateExpectedAfterButGot =
@@ -3469,6 +3462,32 @@
tip: r"""Try removing the field declaration or making it a static field""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+ templateExtensionMemberConflictsWithObjectMember =
+ const Template<Message Function(String name)>(
+ messageTemplate:
+ r"""This extension member conflicts with Object member '#name'.""",
+ withArguments: _withArgumentsExtensionMemberConflictsWithObjectMember);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+ codeExtensionMemberConflictsWithObjectMember =
+ const Code<Message Function(String name)>(
+ "ExtensionMemberConflictsWithObjectMember",
+ templateExtensionMemberConflictsWithObjectMember,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsExtensionMemberConflictsWithObjectMember(String name) {
+ if (name.isEmpty) throw 'No name provided';
+ name = demangleMixinApplicationName(name);
+ return new Message(codeExtensionMemberConflictsWithObjectMember,
+ message:
+ """This extension member conflicts with Object member '${name}'.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeExternalClass = messageExternalClass;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -3539,7 +3558,8 @@
const MessageCode messageExternalField = const MessageCode("ExternalField",
index: 50,
message: r"""Fields can't be declared to be 'external'.""",
- tip: r"""Try removing the keyword 'external'.""");
+ tip:
+ r"""Try removing the keyword 'external', or replacing the field by an external getter and/or setter.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeExternalMethodWithBody = messageExternalMethodWithBody;
@@ -4103,7 +4123,7 @@
const MessageCode messageFieldInitializedOutsideDeclaringClass = const MessageCode(
"FieldInitializedOutsideDeclaringClass",
index: 88,
- message: r"""A field can only be initialized in it's declaring class""",
+ message: r"""A field can only be initialized in its declaring class""",
tip:
r"""Try passing a value into the superclass constructor, or moving the initialization into the constructor body.""");
@@ -4206,7 +4226,7 @@
Message Function(String name)>(
messageTemplate: r"""The final variable '#name' must be initialized.""",
tipTemplate:
- r"""Try adding an initializer ('= <expression>') to the declaration.""",
+ r"""Try adding an initializer ('= expression') to the declaration.""",
withArguments: _withArgumentsFinalFieldWithoutInitializer);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -4221,8 +4241,7 @@
name = demangleMixinApplicationName(name);
return new Message(codeFinalFieldWithoutInitializer,
message: """The final variable '${name}' must be initialized.""",
- tip:
- """Try adding an initializer ('= <expression>') to the declaration.""",
+ tip: """Try adding an initializer ('= expression') to the declaration.""",
arguments: {'name': name});
}
@@ -4423,7 +4442,7 @@
templateGenericFunctionTypeInferredAsActualTypeArgument =
const Template<Message Function(DartType _type)>(
messageTemplate:
- r"""Unexpected generic function type '#type' inferred as a type argument.""",
+ r"""Generic function type '#type' inferred as a type argument.""",
tipTemplate:
r"""Try providing a non-generic function type explicitly.""",
withArguments:
@@ -4445,7 +4464,7 @@
String type = typeParts.join();
return new Message(codeGenericFunctionTypeInferredAsActualTypeArgument,
message:
- """Unexpected generic function type '${type}' inferred as a type argument.""" +
+ """Generic function type '${type}' inferred as a type argument.""" +
labeler.originMessages,
tip: """Try providing a non-generic function type explicitly.""",
arguments: {'type': _type});
@@ -4460,7 +4479,7 @@
const MessageCode("GenericFunctionTypeUsedAsActualTypeArgument",
analyzerCodes: <String>["GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT"],
message:
- r"""Unexpected generic function type found in a type argument.""",
+ r"""A generic function type can't be used as a type argument.""",
tip: r"""Try using a non-generic function type.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6145,8 +6164,6 @@
Message Function(DartType _type, DartType _type2)>(
messageTemplate:
r"""A value of type '#type' can't be assigned to a variable of type '#type2'.""",
- tipTemplate:
- r"""Try changing the type of the left hand side, or casting the right hand side to '#type2'.""",
withArguments: _withArgumentsInvalidAssignment);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -6167,7 +6184,6 @@
message:
"""A value of type '${type}' can't be assigned to a variable of type '${type2}'.""" +
labeler.originMessages,
- tip: """Try changing the type of the left hand side, or casting the right hand side to '${type2}'.""",
arguments: {'type': _type, 'type2': _type2});
}
@@ -6659,8 +6675,7 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const MessageCode messageInvalidVoid = const MessageCode("InvalidVoid",
analyzerCodes: <String>["EXPECTED_TYPE_NAME"],
- message:
- r"""Type 'void' can't be used here because it isn't a return type.""",
+ message: r"""Type 'void' can't be used here.""",
tip:
r"""Try removing 'void' keyword or replace it with 'var', 'final', or a type.""");
@@ -6935,7 +6950,7 @@
const MessageCode messageMissingAssignableSelector = const MessageCode(
"MissingAssignableSelector",
index: 35,
- message: r"""Missing selector such as '.<identifier>' or '[0]'.""",
+ message: r"""Missing selector such as '.identifier' or '[0]'.""",
tip: r"""Try adding a selector.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -7162,7 +7177,7 @@
"MissingPrefixInDeferredImport",
index: 30,
message: r"""Deferred imports should have a prefix.""",
- tip: r"""Try adding a prefix to the import.""");
+ tip: r"""Try adding a prefix to the import by adding an 'as' clause.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeMissingTypedefParameters = messageMissingTypedefParameters;
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 43af7e5..61e208b 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -9,11 +9,9 @@
import 'package:front_end/src/fasta/dill/dill_class_builder.dart'
show DillClassBuilder;
-import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
-
import 'package:kernel/binary/ast_from_binary.dart'
show
- BinaryBuilder,
+ BinaryBuilderWithMetadata,
CanonicalNameError,
CanonicalNameSdkError,
InvalidKernelVersionError;
@@ -730,7 +728,7 @@
if (summaryBytes != null) {
ticker.logMs("Read ${c.options.sdkSummary}");
data.component = c.options.target.configureComponent(new Component());
- new BinaryBuilder(summaryBytes,
+ new BinaryBuilderWithMetadata(summaryBytes,
disableLazyReading: false, disableLazyClassReading: true)
.readComponent(data.component);
ticker.logMs("Deserialized ${c.options.sdkSummary}");
@@ -755,7 +753,8 @@
// We're going to output all we read here so lazy loading it
// doesn't make sense.
- new BinaryBuilder(initializationBytes, disableLazyReading: true)
+ new BinaryBuilderWithMetadata(initializationBytes,
+ disableLazyReading: true)
.readComponent(data.component, checkCanonicalNames: true);
// Check the any package-urls still point to the same file
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 656b1ae..6d6ca44 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -7,6 +7,7 @@
import 'dart:core' hide MapEntry;
import 'package:kernel/ast.dart';
+import 'package:kernel/type_environment.dart';
import '../builder/declaration_builder.dart';
@@ -826,59 +827,9 @@
body, transformSetLiterals, transformCollections);
}
- // For async, async*, and sync* functions with declared return types, we
- // need to determine whether those types are valid.
if (builder.returnType != null) {
- DartType returnType = builder.function.returnType;
- // We use the same trick in each case below. For example to decide whether
- // Future<T> <: [returnType] for every T, we rely on Future<Bot> and
- // transitivity of the subtyping relation because Future<Bot> <: Future<T>
- // for every T.
-
- // We use [problem == null] to signal success.
- Message problem;
- switch (asyncModifier) {
- case AsyncMarker.Async:
- DartType futureBottomType = libraryBuilder.loader.futureOfBottom;
- if (!typeEnvironment.isSubtypeOf(futureBottomType, returnType)) {
- problem = fasta.messageIllegalAsyncReturnType;
- }
- break;
-
- case AsyncMarker.AsyncStar:
- DartType streamBottomType = libraryBuilder.loader.streamOfBottom;
- if (returnType is VoidType) {
- problem = fasta.messageIllegalAsyncGeneratorVoidReturnType;
- } else if (!typeEnvironment.isSubtypeOf(
- streamBottomType, returnType)) {
- problem = fasta.messageIllegalAsyncGeneratorReturnType;
- }
- break;
-
- case AsyncMarker.SyncStar:
- DartType iterableBottomType = libraryBuilder.loader.iterableOfBottom;
- if (returnType is VoidType) {
- problem = fasta.messageIllegalSyncGeneratorVoidReturnType;
- } else if (!typeEnvironment.isSubtypeOf(
- iterableBottomType, returnType)) {
- problem = fasta.messageIllegalSyncGeneratorReturnType;
- }
- break;
-
- case AsyncMarker.Sync:
- break; // skip
- case AsyncMarker.SyncYielding:
- unexpected("async, async*, sync, or sync*", "$asyncModifier",
- member.charOffset, uri);
- break;
- }
-
- if (problem != null) {
- // TODO(hillerstrom): once types get annotated with location
- // information, we can improve the quality of the error message by
- // using the offset of [returnType] (and the length of its name).
- addProblem(problem, member.charOffset, member.name.length);
- }
+ checkAsyncReturnType(asyncModifier, builder.function.returnType,
+ member.charOffset, member.name.length);
}
if (builder.kind == ProcedureKind.Setter) {
@@ -947,6 +898,62 @@
finishVariableMetadata();
}
+ void checkAsyncReturnType(AsyncMarker asyncModifier, DartType returnType,
+ int charOffset, int length) {
+ // For async, async*, and sync* functions with declared return types, we
+ // need to determine whether those types are valid.
+ // We use the same trick in each case below. For example to decide whether
+ // Future<T> <: [returnType] for every T, we rely on Future<Bot> and
+ // transitivity of the subtyping relation because Future<Bot> <: Future<T>
+ // for every T.
+
+ // We use [problem == null] to signal success.
+ Message problem;
+ switch (asyncModifier) {
+ case AsyncMarker.Async:
+ DartType futureBottomType = libraryBuilder.loader.futureOfBottom;
+ if (!typeEnvironment.isSubtypeOf(futureBottomType, returnType,
+ SubtypeCheckMode.ignoringNullabilities)) {
+ problem = fasta.messageIllegalAsyncReturnType;
+ }
+ break;
+
+ case AsyncMarker.AsyncStar:
+ DartType streamBottomType = libraryBuilder.loader.streamOfBottom;
+ if (returnType is VoidType) {
+ problem = fasta.messageIllegalAsyncGeneratorVoidReturnType;
+ } else if (!typeEnvironment.isSubtypeOf(streamBottomType, returnType,
+ SubtypeCheckMode.ignoringNullabilities)) {
+ problem = fasta.messageIllegalAsyncGeneratorReturnType;
+ }
+ break;
+
+ case AsyncMarker.SyncStar:
+ DartType iterableBottomType = libraryBuilder.loader.iterableOfBottom;
+ if (returnType is VoidType) {
+ problem = fasta.messageIllegalSyncGeneratorVoidReturnType;
+ } else if (!typeEnvironment.isSubtypeOf(iterableBottomType, returnType,
+ SubtypeCheckMode.ignoringNullabilities)) {
+ problem = fasta.messageIllegalSyncGeneratorReturnType;
+ }
+ break;
+
+ case AsyncMarker.Sync:
+ break; // skip
+ case AsyncMarker.SyncYielding:
+ unexpected("async, async*, sync, or sync*", "$asyncModifier",
+ member.charOffset, uri);
+ break;
+ }
+
+ if (problem != null) {
+ // TODO(hillerstrom): once types get annotated with location
+ // information, we can improve the quality of the error message by
+ // using the offset of [returnType] (and the length of its name).
+ addProblem(problem, charOffset, length);
+ }
+ }
+
/// Ensure that the containing library of the [member] has been loaded.
///
/// This is for instance important for lazy dill library builders where this
@@ -4070,6 +4077,10 @@
}
FunctionDeclarationImpl.setHasImplicitReturnType(
declaration, hasImplicitReturnType);
+ if (!hasImplicitReturnType) {
+ checkAsyncReturnType(asyncModifier, function.returnType,
+ variable.fileOffset, variable.name.length);
+ }
variable.type = function.functionType;
if (isFunctionExpression) {
@@ -5036,7 +5047,8 @@
..fileOffset = assignmentOffset;
} else {
if (formalType != null &&
- !typeEnvironment.isSubtypeOf(formalType, builder.field.type)) {
+ !typeEnvironment.isSubtypeOf(formalType, builder.field.type,
+ SubtypeCheckMode.ignoringNullabilities)) {
libraryBuilder.addProblem(
fasta.templateInitializingFormalTypeMismatch
.withArguments(name, formalType, builder.field.type),
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index 991fa4e..c588cd2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -26,6 +26,7 @@
import 'package:kernel/core_types.dart' show CoreTypes;
import 'package:kernel/type_algebra.dart' show Substitution;
+import 'package:kernel/type_environment.dart';
import '../dill/dill_member_builder.dart' show DillMemberBuilder;
@@ -1997,8 +1998,9 @@
}
@override
- bool isSubtypeOf(DartType subtype, DartType supertype) {
- return hierarchy.types.isSubtypeOfKernel(subtype, supertype);
+ bool isSubtypeOf(
+ DartType subtype, DartType supertype, SubtypeCheckMode mode) {
+ return hierarchy.types.isSubtypeOfKernel(subtype, supertype, mode);
}
@override
@@ -2095,7 +2097,8 @@
if (a.hadTypesInferred) {
if (b.isSetter &&
(!impliesSetter(a) ||
- hierarchy.types.isSubtypeOfKernel(type, a.field.type))) {
+ hierarchy.types.isSubtypeOfKernel(type, a.field.type,
+ SubtypeCheckMode.ignoringNullabilities))) {
type = a.field.type;
} else {
reportCantInferFieldType(classBuilder, a);
@@ -2263,9 +2266,11 @@
bool isMoreSpecific(ClassHierarchyBuilder hierarchy, DartType a, DartType b) {
if (isSetter) {
- return hierarchy.types.isSubtypeOfKernel(b, a);
+ return hierarchy.types
+ .isSubtypeOfKernel(b, a, SubtypeCheckMode.ignoringNullabilities);
} else {
- return hierarchy.types.isSubtypeOfKernel(a, b);
+ return hierarchy.types
+ .isSubtypeOfKernel(a, b, SubtypeCheckMode.ignoringNullabilities);
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 0821f5e..f477cee 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -1858,7 +1858,8 @@
}
}
}
- return typeEnvironment.isSubtypeOf(constantType, type);
+ return typeEnvironment.isSubtypeOf(
+ constantType, type, SubtypeCheckMode.ignoringNullabilities);
}
Constant ensureIsSubtype(Constant constant, DartType type, TreeNode node) {
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 e1f4092..2a22a37 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -1961,10 +1961,12 @@
List<DartType> explicitTypeArguments,
int extensionTypeParameterCount,
{bool isNullAware}) {
+ assert(getterBuilder != null || setterBuilder != null);
String targetName;
Procedure readTarget;
Procedure invokeTarget;
if (getterBuilder != null) {
+ assert(!getterBuilder.isStatic);
if (getterBuilder is AccessErrorBuilder) {
AccessErrorBuilder error = getterBuilder;
getterBuilder = error.builder;
@@ -1989,12 +1991,21 @@
}
}
Procedure writeTarget;
- if (setterBuilder is AccessErrorBuilder) {
- targetName ??= setterBuilder.name;
- } else if (setterBuilder != null && setterBuilder.isSetter) {
- MemberBuilder memberBuilder = setterBuilder;
- writeTarget = memberBuilder.member;
- targetName ??= memberBuilder.name;
+ if (setterBuilder != null) {
+ assert(!setterBuilder.isStatic);
+ if (setterBuilder is AccessErrorBuilder) {
+ targetName ??= setterBuilder.name;
+ } else if (setterBuilder.isSetter) {
+ MemberBuilder memberBuilder = setterBuilder;
+ writeTarget = memberBuilder.member;
+ targetName ??= memberBuilder.name;
+ } else {
+ return unhandled(
+ "${setterBuilder.runtimeType}",
+ "InstanceExtensionAccessGenerator.fromBuilder",
+ offsetForToken(token),
+ helper.uri);
+ }
}
return new ExplicitExtensionInstanceAccessGenerator(
helper,
@@ -2554,10 +2565,16 @@
return _makeInvalidRead();
}
- Generator _createInstanceAccess(Name name, {bool isNullAware}) {
+ Generator _createInstanceAccess(Token token, Name name, {bool isNullAware}) {
Builder getter = extensionBuilder.lookupLocalMember(name.name);
+ if (getter != null && getter.isStatic) {
+ getter = null;
+ }
Builder setter =
extensionBuilder.lookupLocalMember(name.name, setter: true);
+ if (setter != null && setter.isStatic) {
+ setter = null;
+ }
if (getter == null && setter == null) {
return new UnresolvedNameGenerator(_helper, token, name);
}
@@ -2580,7 +2597,7 @@
messageNotAConstantExpression, fileOffset, token.length);
}
Generator generator =
- _createInstanceAccess(send.name, isNullAware: isNullAware);
+ _createInstanceAccess(send.token, send.name, isNullAware: isNullAware);
if (send.arguments != null) {
return generator.doInvocation(offsetForToken(send.token), send.arguments);
} else {
@@ -2590,7 +2607,8 @@
@override
doInvocation(int offset, Arguments arguments) {
- Generator generator = _createInstanceAccess(callName, isNullAware: false);
+ Generator generator =
+ _createInstanceAccess(token, callName, isNullAware: false);
return generator.doInvocation(offset, arguments);
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
index 3c7ea2e..99e4ad8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
@@ -5,7 +5,7 @@
library fasta.implicit_type;
import 'package:kernel/ast.dart'
- show DartType, DartTypeVisitor, DartTypeVisitor1, Visitor;
+ show DartType, DartTypeVisitor, DartTypeVisitor1, Nullability, Visitor;
import '../../scanner/token.dart' show Token;
@@ -18,11 +18,11 @@
Token initializerToken;
bool isStarted = false;
- get nullability =>
- unsupported("nullability", member.charOffset, member.fileUri);
-
ImplicitFieldType(this.member, this.initializerToken);
+ Nullability get nullability =>
+ unsupported("nullability", member.charOffset, member.fileUri);
+
R accept<R>(DartTypeVisitor<R> v) {
throw unsupported("accept", member.charOffset, member.fileUri);
}
@@ -34,4 +34,8 @@
visitChildren(Visitor<Object> v) {
unsupported("visitChildren", member.charOffset, member.fileUri);
}
+
+ ImplicitFieldType withNullability(Nullability nullability) {
+ return unsupported("withNullability", member.charOffset, member.fileUri);
+ }
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart
index 6cb9d18..e9a98e5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_type_argument.dart
@@ -5,7 +5,7 @@
library fasta.implicit_type_argument;
import 'package:kernel/ast.dart'
- show DartType, DartTypeVisitor, DartTypeVisitor1, Visitor;
+ show DartType, DartTypeVisitor, DartTypeVisitor1, Nullability, Visitor;
import '../problems.dart' show unhandled, unsupported;
@@ -18,7 +18,7 @@
const ImplicitTypeArgument();
@override
- get nullability => unsupported("nullability", -1, null);
+ Nullability get nullability => unsupported("nullability", -1, null);
@override
R accept<R>(DartTypeVisitor<R> v) {
@@ -34,4 +34,9 @@
visitChildren(Visitor<Object> v) {
unhandled("$runtimeType", "${v.runtimeType}", -1, null);
}
+
+ @override
+ ImplicitTypeArgument withNullability(Nullability nullability) {
+ return unsupported("withNullability", -1, null);
+ }
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 816cc1e..c1b4dc0 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -366,12 +366,9 @@
}
bool hasExplicitTypeArguments =
getExplicitTypeArguments(node.arguments) != null;
- DartType inferredType = inferrer.inferInvocation(
- typeContext,
- node.fileOffset,
- node.target.function.thisFunctionType,
- computeConstructorReturnType(node.target),
- node.arguments,
+ DartType inferredType = inferrer.inferInvocation(typeContext,
+ node.fileOffset, node.target.function.thisFunctionType, node.arguments,
+ returnType: computeConstructorReturnType(node.target),
isConst: node.isConst);
if (!inferrer.isTopLevel) {
SourceLibraryBuilder library = inferrer.library;
@@ -396,8 +393,8 @@
: new FunctionType([], const DynamicType());
bool hadExplicitTypeArguments =
getExplicitTypeArguments(node.arguments) != null;
- DartType inferredType = inferrer.inferInvocation(typeContext,
- node.fileOffset, calleeType, calleeType.returnType, node.arguments);
+ DartType inferredType = inferrer.inferInvocation(
+ typeContext, node.fileOffset, calleeType, node.arguments);
Expression replacement = new StaticInvocation(node.target, node.arguments);
if (!inferrer.isTopLevel &&
!hadExplicitTypeArguments &&
@@ -531,12 +528,9 @@
FactoryConstructorInvocationJudgment node, DartType typeContext) {
bool hadExplicitTypeArguments =
getExplicitTypeArguments(node.arguments) != null;
- DartType inferredType = inferrer.inferInvocation(
- typeContext,
- node.fileOffset,
- node.target.function.thisFunctionType,
- computeConstructorReturnType(node.target),
- node.arguments,
+ DartType inferredType = inferrer.inferInvocation(typeContext,
+ node.fileOffset, node.target.function.thisFunctionType, node.arguments,
+ returnType: computeConstructorReturnType(node.target),
isConst: node.isConst);
node.hasBeenInferred = true;
if (!inferrer.isTopLevel) {
@@ -795,8 +789,8 @@
node.fileOffset,
substitution.substituteType(
node.target.function.thisFunctionType.withoutTypeParameters),
- inferrer.thisType,
node.argumentsJudgment,
+ returnType: inferrer.thisType,
skipTypeArgumentInference: true);
}
@@ -1386,9 +1380,13 @@
mapEntryClass, <DartType>[actualKeyType, actualValueType]);
bool isMap = inferrer.typeSchemaEnvironment.isSubtypeOf(
- spreadType, inferrer.coreTypes.mapRawType(inferrer.library.nullable));
- bool isIterable = inferrer.typeSchemaEnvironment.isSubtypeOf(spreadType,
- inferrer.coreTypes.iterableRawType(inferrer.library.nullable));
+ spreadType,
+ inferrer.coreTypes.mapRawType(inferrer.library.nullable),
+ SubtypeCheckMode.ignoringNullabilities);
+ bool isIterable = inferrer.typeSchemaEnvironment.isSubtypeOf(
+ spreadType,
+ inferrer.coreTypes.iterableRawType(inferrer.library.nullable),
+ SubtypeCheckMode.ignoringNullabilities);
if (isMap && !isIterable) {
mapSpreadOffset = entry.fileOffset;
}
@@ -4162,12 +4160,9 @@
typeArguments[i] = new TypeParameterType(classTypeParameters[i]);
}
ArgumentsImpl.setNonInferrableArgumentTypes(node.arguments, typeArguments);
- inferrer.inferInvocation(
- null,
- node.fileOffset,
- node.target.function.thisFunctionType,
- node.target.enclosingClass.thisType,
- node.arguments,
+ inferrer.inferInvocation(null, node.fileOffset,
+ node.target.function.thisFunctionType, node.arguments,
+ returnType: node.target.enclosingClass.thisType,
skipTypeArgumentInference: true);
ArgumentsImpl.removeNonInferrableArgumentTypes(node.arguments);
}
@@ -4313,8 +4308,8 @@
: new FunctionType([], const DynamicType());
bool hadExplicitTypeArguments =
getExplicitTypeArguments(node.arguments) != null;
- DartType inferredType = inferrer.inferInvocation(typeContext,
- node.fileOffset, calleeType, calleeType.returnType, node.arguments);
+ DartType inferredType = inferrer.inferInvocation(
+ typeContext, node.fileOffset, calleeType, node.arguments);
if (!inferrer.isTopLevel &&
!hadExplicitTypeArguments &&
node.target != null) {
@@ -4356,8 +4351,8 @@
node.fileOffset,
substitution.substituteType(
node.target.function.thisFunctionType.withoutTypeParameters),
- inferrer.thisType,
node.arguments,
+ returnType: inferrer.thisType,
skipTypeArgumentInference: true);
}
@@ -4620,8 +4615,8 @@
inferrer.typeSchemaEnvironment.futureType(const DynamicType());
if (node.arguments != null) {
FunctionType calleeType = new FunctionType([], inferredType);
- inferrer.inferInvocation(typeContext, node.fileOffset, calleeType,
- calleeType.returnType, node.arguments);
+ inferrer.inferInvocation(
+ typeContext, node.fileOffset, calleeType, node.arguments);
}
return new ExpressionInferenceResult(inferredType);
}
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 627fbc5..e1dbaf4 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
@@ -24,6 +24,8 @@
import 'package:kernel/type_algebra.dart' show Substitution;
+import 'package:kernel/type_environment.dart';
+
import 'package:kernel/clone.dart';
import '../../base/instrumentation.dart'
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
index 6e519f9..0e7d4d4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
@@ -46,7 +46,8 @@
import 'package:kernel/core_types.dart' show CoreTypes;
-import 'package:kernel/type_environment.dart' show TypeEnvironment;
+import 'package:kernel/type_environment.dart'
+ show SubtypeCheckMode, TypeEnvironment;
import 'package:kernel/visitor.dart' show Transformer;
@@ -248,7 +249,8 @@
VariableDeclaration elt;
Statement loopBody;
if (element.elementType == null ||
- !typeEnvironment.isSubtypeOf(element.elementType, elementType)) {
+ !typeEnvironment.isSubtypeOf(element.elementType, elementType,
+ SubtypeCheckMode.ignoringNullabilities)) {
elt = new VariableDeclaration(null,
type: const DynamicType(), isFinal: true);
VariableDeclaration castedVar = new VariableDeclaration.forValue(
@@ -439,7 +441,8 @@
VariableDeclaration elt;
Statement loopBody;
if (entry.entryType == null ||
- !typeEnvironment.isSubtypeOf(entry.entryType, entryType)) {
+ !typeEnvironment.isSubtypeOf(entry.entryType, entryType,
+ SubtypeCheckMode.ignoringNullabilities)) {
elt = new VariableDeclaration(null,
type: new InterfaceType(mapEntryClass,
<DartType>[const DynamicType(), const DynamicType()]),
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 544ff1d..bcceaad 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -120,6 +120,29 @@
return Variance.unrelated;
}
+/// Combines syntactic nullabilities on types for performing type substitution.
+///
+/// The syntactic substitution should preserve a `?` if it was either on the
+/// type parameter occurrence or on the type argument replacing it.
+NullabilityBuilder combineNullabilityBuildersForSubstitution(
+ NullabilityBuilder a, NullabilityBuilder b) {
+ assert(
+ (identical(a, const NullabilityBuilder.nullable()) ||
+ identical(a, const NullabilityBuilder.omitted())) &&
+ (identical(b, const NullabilityBuilder.nullable()) ||
+ identical(b, const NullabilityBuilder.omitted())),
+ "Both arguments to combineNullabilityBuildersForSubstitution "
+ "should be identical to either 'const NullabilityBuilder.nullable()' or "
+ "'const NullabilityBuilder.omitted()'.");
+
+ if (identical(a, const NullabilityBuilder.nullable()) ||
+ identical(b, const NullabilityBuilder.nullable())) {
+ return const NullabilityBuilder.nullable();
+ }
+
+ return const NullabilityBuilder.omitted();
+}
+
TypeBuilder substituteRange(
TypeBuilder type,
Map<TypeVariableBuilder, TypeBuilder> upperSubstitution,
@@ -130,9 +153,21 @@
if (type is NamedTypeBuilder) {
if (type.declaration is TypeVariableBuilder) {
if (variance == Variance.contravariant) {
- return lowerSubstitution[type.declaration] ?? type;
+ TypeBuilder replacement = lowerSubstitution[type.declaration];
+ if (replacement != null) {
+ return replacement.withNullabilityBuilder(
+ combineNullabilityBuildersForSubstitution(
+ replacement.nullabilityBuilder, type.nullabilityBuilder));
+ }
+ return type;
}
- return upperSubstitution[type.declaration] ?? type;
+ TypeBuilder replacement = upperSubstitution[type.declaration];
+ if (replacement != null) {
+ return replacement.withNullabilityBuilder(
+ combineNullabilityBuildersForSubstitution(
+ replacement.nullabilityBuilder, type.nullabilityBuilder));
+ }
+ return type;
}
if (type.arguments == null || type.arguments.length == 0) {
return type;
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
index 45d0275..0bb51ac 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -178,6 +178,7 @@
result.add(" extends ");
param.bound.accept(this);
}
+ first = false;
}
result.add(">");
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/types.dart b/pkg/front_end/lib/src/fasta/kernel/types.dart
index a70d416..bf19015 100644
--- a/pkg/front_end/lib/src/fasta/kernel/types.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/types.dart
@@ -22,6 +22,8 @@
import 'package:kernel/type_algebra.dart' show Substitution;
+import 'package:kernel/type_environment.dart';
+
import 'kernel_builder.dart' show ClassHierarchyBuilder;
class Types {
@@ -30,7 +32,7 @@
Types(this.hierarchy);
/// Returns true if [s] is a subtype of [t].
- bool isSubtypeOfKernel(DartType s, DartType t) {
+ bool isSubtypeOfKernel(DartType s, DartType t, SubtypeCheckMode mode) {
if (s is InvalidType) {
// InvalidType is a bottom type.
return true;
@@ -231,13 +233,15 @@
throw "Numbers of type arguments don't match $s $t.";
}
for (int i = 0; i < s.length; i++) {
- if (!isSubtypeOfKernel(s[i], t[i])) return false;
+ if (!isSubtypeOfKernel(
+ s[i], t[i], SubtypeCheckMode.ignoringNullabilities)) return false;
}
return true;
}
bool isSameTypeKernel(DartType s, DartType t) {
- return isSubtypeOfKernel(s, t) && isSubtypeOfKernel(t, s);
+ return isSubtypeOfKernel(s, t, SubtypeCheckMode.ignoringNullabilities) &&
+ isSubtypeOfKernel(t, s, SubtypeCheckMode.ignoringNullabilities);
}
}
@@ -301,7 +305,8 @@
@override
bool isTypeParameterRelated(TypeParameterType s, Nullability sNullability,
InterfaceType t, Nullability tNullability, Types types) {
- return types.isSubtypeOfKernel(s.parameter.bound, t);
+ return types.isSubtypeOfKernel(
+ s.parameter.bound, t, SubtypeCheckMode.ignoringNullabilities);
}
@override
@@ -312,11 +317,14 @@
Nullability tNullability,
Types types) {
List<DartType> arguments = futureOr.typeArguments;
- if (!types.isSubtypeOfKernel(arguments.single, t)) {
+ if (!types.isSubtypeOfKernel(
+ arguments.single, t, SubtypeCheckMode.ignoringNullabilities)) {
return false; // Rule 7.1
}
if (!types.isSubtypeOfKernel(
- new InterfaceType(types.hierarchy.futureClass, arguments), t)) {
+ new InterfaceType(types.hierarchy.futureClass, arguments),
+ t,
+ SubtypeCheckMode.ignoringNullabilities)) {
return false; // Rule 7.2
}
return true;
@@ -329,7 +337,8 @@
InterfaceType t,
Nullability tNullability,
Types types) {
- return types.isSubtypeOfKernel(intersection.promotedBound, t); // Rule 12.
+ return types.isSubtypeOfKernel(intersection.promotedBound, t,
+ SubtypeCheckMode.ignoringNullabilities); // Rule 12.
}
@override
@@ -348,7 +357,8 @@
bool isTypedefRelated(TypedefType s, Nullability sNullability,
InterfaceType t, Nullability tNullability, Types types) {
// Rule 5.
- return types.isSubtypeOfKernel(s.unalias, t);
+ return types.isSubtypeOfKernel(
+ s.unalias, t, SubtypeCheckMode.ignoringNullabilities);
}
@override
@@ -397,7 +407,10 @@
}
s = substitution.substituteType(s.withoutTypeParameters);
}
- if (!types.isSubtypeOfKernel(s.returnType, t.returnType)) return false;
+ if (!types.isSubtypeOfKernel(
+ s.returnType, t.returnType, SubtypeCheckMode.ignoringNullabilities)) {
+ return false;
+ }
List<DartType> sPositional = s.positionalParameters;
List<DartType> tPositional = t.positionalParameters;
if (s.requiredParameterCount > t.requiredParameterCount) {
@@ -409,7 +422,8 @@
return false;
}
for (int i = 0; i < tPositional.length; i++) {
- if (!types.isSubtypeOfKernel(tPositional[i], sPositional[i])) {
+ if (!types.isSubtypeOfKernel(tPositional[i], sPositional[i],
+ SubtypeCheckMode.ignoringNullabilities)) {
// Rule 15, Tj <: Sj.
return false;
}
@@ -431,8 +445,8 @@
if (sNamed[sCount].name == name) break;
}
if (sCount == sNamed.length) return false;
- if (!types.isSubtypeOfKernel(
- tNamed[tCount].type, sNamed[sCount].type)) {
+ if (!types.isSubtypeOfKernel(tNamed[tCount].type, sNamed[sCount].type,
+ SubtypeCheckMode.ignoringNullabilities)) {
return false;
}
}
@@ -470,21 +484,24 @@
Nullability tNullability,
Types types) {
// Rule 12.
- return types.isSubtypeOfKernel(intersection.promotedBound, t);
+ return types.isSubtypeOfKernel(
+ intersection.promotedBound, t, SubtypeCheckMode.ignoringNullabilities);
}
@override
bool isTypeParameterRelated(TypeParameterType s, Nullability sNullability,
FunctionType t, Nullability tNullability, Types types) {
// Rule 13.
- return types.isSubtypeOfKernel(s.parameter.bound, t);
+ return types.isSubtypeOfKernel(
+ s.parameter.bound, t, SubtypeCheckMode.ignoringNullabilities);
}
@override
bool isTypedefRelated(TypedefType s, Nullability sNullability, FunctionType t,
Nullability tNullability, Types types) {
// Rule 5.
- return types.isSubtypeOfKernel(s.unalias, t);
+ return types.isSubtypeOfKernel(
+ s.unalias, t, SubtypeCheckMode.ignoringNullabilities);
}
@override
@@ -502,7 +519,8 @@
TypeParameterType t, Nullability tNullability, Types types) {
return s.parameter == t.parameter ||
// Rule 13.
- types.isSubtypeOfKernel(s.bound, t);
+ types.isSubtypeOfKernel(
+ s.bound, t, SubtypeCheckMode.ignoringNullabilities);
}
@override
@@ -546,7 +564,8 @@
@override
bool isTypedefRelated(TypedefType s, Nullability sNullability,
TypeParameterType t, Nullability tNullability, Types types) {
- return types.isSubtypeOfKernel(s.unalias, t);
+ return types.isSubtypeOfKernel(
+ s.unalias, t, SubtypeCheckMode.ignoringNullabilities);
}
@override
@@ -562,19 +581,22 @@
@override
bool isInterfaceRelated(InterfaceType s, Nullability sNullability,
TypedefType t, Nullability tNullability, Types types) {
- return types.isSubtypeOfKernel(s, t.unalias);
+ return types.isSubtypeOfKernel(
+ s, t.unalias, SubtypeCheckMode.ignoringNullabilities);
}
@override
bool isDynamicRelated(DynamicType s, Nullability sNullability, TypedefType t,
Nullability tNullability, Types types) {
- return types.isSubtypeOfKernel(s, t.unalias);
+ return types.isSubtypeOfKernel(
+ s, t.unalias, SubtypeCheckMode.ignoringNullabilities);
}
@override
bool isFunctionRelated(FunctionType s, Nullability sNullability,
TypedefType t, Nullability tNullability, Types types) {
- return types.isSubtypeOfKernel(s, t.unalias);
+ return types.isSubtypeOfKernel(
+ s, t.unalias, SubtypeCheckMode.ignoringNullabilities);
}
@override
@@ -584,7 +606,8 @@
TypedefType t,
Nullability tNullability,
Types types) {
- return types.isSubtypeOfKernel(futureOr, t.unalias);
+ return types.isSubtypeOfKernel(
+ futureOr, t.unalias, SubtypeCheckMode.ignoringNullabilities);
}
@override
@@ -594,25 +617,29 @@
TypedefType t,
Nullability tNullability,
Types types) {
- return types.isSubtypeOfKernel(intersection, t.unalias);
+ return types.isSubtypeOfKernel(
+ intersection, t.unalias, SubtypeCheckMode.ignoringNullabilities);
}
@override
bool isTypeParameterRelated(TypeParameterType s, Nullability sNullability,
TypedefType t, Nullability tNullability, Types types) {
- return types.isSubtypeOfKernel(s, t.unalias);
+ return types.isSubtypeOfKernel(
+ s, t.unalias, SubtypeCheckMode.ignoringNullabilities);
}
@override
bool isTypedefRelated(TypedefType s, Nullability sNullability, TypedefType t,
Nullability tNullability, Types types) {
- return types.isSubtypeOfKernel(s.unalias, t.unalias);
+ return types.isSubtypeOfKernel(
+ s.unalias, t.unalias, SubtypeCheckMode.ignoringNullabilities);
}
@override
bool isVoidRelated(VoidType s, Nullability sNullability, TypedefType t,
Nullability tNullability, Types types) {
- return types.isSubtypeOfKernel(s, t.unalias);
+ return types.isSubtypeOfKernel(
+ s, t.unalias, SubtypeCheckMode.ignoringNullabilities);
}
}
@@ -623,12 +650,15 @@
bool isInterfaceRelated(InterfaceType s, Nullability sNullability,
InterfaceType futureOr, Nullability futureOrNullability, Types types) {
List<DartType> arguments = futureOr.typeArguments;
- if (types.isSubtypeOfKernel(s, arguments.single)) {
+ if (types.isSubtypeOfKernel(
+ s, arguments.single, SubtypeCheckMode.ignoringNullabilities)) {
return true; // Rule 11.
}
// Rule 10.
return types.isSubtypeOfKernel(
- s, new InterfaceType(types.hierarchy.futureClass, arguments));
+ s,
+ new InterfaceType(types.hierarchy.futureClass, arguments),
+ SubtypeCheckMode.ignoringNullabilities);
}
@override
@@ -639,48 +669,55 @@
Nullability tFutureOrNullability,
Types types) {
// This follows from combining rules 7, 10, and 11.
- return types.isSubtypeOfKernel(
- sFutureOr.typeArguments.single, tFutureOr.typeArguments.single);
+ return types.isSubtypeOfKernel(sFutureOr.typeArguments.single,
+ tFutureOr.typeArguments.single, SubtypeCheckMode.ignoringNullabilities);
}
@override
bool isDynamicRelated(DynamicType s, Nullability sNullability,
InterfaceType futureOr, Nullability futureOrNullability, Types types) {
// Rule 11.
- return types.isSubtypeOfKernel(s, futureOr.typeArguments.single);
+ return types.isSubtypeOfKernel(s, futureOr.typeArguments.single,
+ SubtypeCheckMode.ignoringNullabilities);
}
@override
bool isVoidRelated(VoidType s, Nullability sNullability,
InterfaceType futureOr, Nullability futureOrNullability, Types types) {
// Rule 11.
- return types.isSubtypeOfKernel(s, futureOr.typeArguments.single);
+ return types.isSubtypeOfKernel(s, futureOr.typeArguments.single,
+ SubtypeCheckMode.ignoringNullabilities);
}
@override
bool isTypeParameterRelated(TypeParameterType s, Nullability sNullability,
InterfaceType futureOr, Nullability futureOrNullability, Types types) {
List<DartType> arguments = futureOr.typeArguments;
- if (types.isSubtypeOfKernel(s, arguments.single)) {
+ if (types.isSubtypeOfKernel(
+ s, arguments.single, SubtypeCheckMode.ignoringNullabilities)) {
// Rule 11.
return true;
}
- if (types.isSubtypeOfKernel(s.parameter.bound, futureOr)) {
+ if (types.isSubtypeOfKernel(
+ s.parameter.bound, futureOr, SubtypeCheckMode.ignoringNullabilities)) {
// Rule 13.
return true;
}
// Rule 10.
return types.isSubtypeOfKernel(
- s, new InterfaceType(types.hierarchy.futureClass, arguments));
+ s,
+ new InterfaceType(types.hierarchy.futureClass, arguments),
+ SubtypeCheckMode.ignoringNullabilities);
}
@override
bool isFunctionRelated(FunctionType s, Nullability sNullability,
InterfaceType futureOr, Nullability futureOrNullability, Types types) {
// Rule 11.
- return types.isSubtypeOfKernel(s, futureOr.typeArguments.single);
+ return types.isSubtypeOfKernel(s, futureOr.typeArguments.single,
+ SubtypeCheckMode.ignoringNullabilities);
}
@override
@@ -696,13 +733,15 @@
return true;
}
// Rule 12.
- return types.isSubtypeOfKernel(intersection.promotedBound, futureOr);
+ return types.isSubtypeOfKernel(intersection.promotedBound, futureOr,
+ SubtypeCheckMode.ignoringNullabilities);
}
@override
bool isTypedefRelated(TypedefType s, Nullability sNullability,
InterfaceType futureOr, Nullability futureOrNullability, Types types) {
- return types.isSubtypeOfKernel(s.unalias, futureOr);
+ return types.isSubtypeOfKernel(
+ s.unalias, futureOr, SubtypeCheckMode.ignoringNullabilities);
}
}
@@ -723,7 +762,8 @@
tIntersection,
tIntersectionNullability,
types) &&
- types.isSubtypeOfKernel(sIntersection, tIntersection.promotedBound);
+ types.isSubtypeOfKernel(sIntersection, tIntersection.promotedBound,
+ SubtypeCheckMode.ignoringNullabilities);
}
@override
@@ -736,7 +776,8 @@
// Rule 9.
return const IsTypeParameterSubtypeOf().isTypeParameterRelated(
s, sNullability, intersection, intersectionNullability, types) &&
- types.isSubtypeOfKernel(s, intersection.promotedBound);
+ types.isSubtypeOfKernel(s, intersection.promotedBound,
+ SubtypeCheckMode.ignoringNullabilities);
}
@override
@@ -787,7 +828,8 @@
Nullability intersectionNullability,
Types types) {
// Rule 5.
- return types.isSubtypeOfKernel(s.unalias, intersection);
+ return types.isSubtypeOfKernel(
+ s.unalias, intersection, SubtypeCheckMode.ignoringNullabilities);
}
@override
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index f2753bd..9e548fb 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -3444,7 +3444,7 @@
beforeInitializers?.next, token);
break;
case DeclarationKind.Extension:
- if (optional(';', bodyStart)) {
+ if (optional(';', bodyStart) && externalToken == null) {
reportRecoverableError(isOperator ? name.next : name,
fasta.messageExtensionDeclaresAbstractMember);
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index fd7df17..09ac319 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -4,6 +4,7 @@
import 'dart:core' hide MapEntry;
import 'package:kernel/ast.dart';
+import '../../base/common.dart';
import '../builder/declaration.dart';
import '../builder/extension_builder.dart';
import '../builder/library_builder.dart';
@@ -12,22 +13,26 @@
import '../builder/type_builder.dart';
import '../builder/type_variable_builder.dart';
import '../scope.dart';
-import 'source_library_builder.dart';
import '../kernel/kernel_builder.dart';
-
import '../problems.dart';
-
import '../fasta_codes.dart'
show
+ messagePatchDeclarationMismatch,
+ messagePatchDeclarationOrigin,
noLength,
templateConflictsWithMember,
templateConflictsWithMemberWarning,
templateConflictsWithSetter,
- templateConflictsWithSetterWarning;
+ templateConflictsWithSetterWarning,
+ templateExtensionMemberConflictsWithObjectMember;
+import 'source_library_builder.dart';
class SourceExtensionBuilder extends ExtensionBuilder {
final Extension _extension;
+ SourceExtensionBuilder _origin;
+ SourceExtensionBuilder patchForTesting;
+
SourceExtensionBuilder(
List<MetadataBuilder> metadata,
int modifiers,
@@ -48,7 +53,10 @@
super(metadata, modifiers, name, parent, nameOffset, scope,
typeParameters, onType);
- Extension get extension => _extension;
+ @override
+ SourceExtensionBuilder get origin => _origin ?? this;
+
+ Extension get extension => isPatch ? origin._extension : _extension;
/// Builds the [Extension] for this extension build and inserts the members
/// into the [Library] of [libraryBuilder].
@@ -61,8 +69,20 @@
Extension build(
SourceLibraryBuilder libraryBuilder, LibraryBuilder coreLibrary,
{bool addMembersToLibrary}) {
+ ClassBuilder objectClassBuilder =
+ coreLibrary.lookupLocalMember('Object', required: true);
void buildBuilders(String name, Builder declaration) {
do {
+ Builder objectGetter = objectClassBuilder.lookupLocalMember(name);
+ Builder objectSetter =
+ objectClassBuilder.lookupLocalMember(name, setter: true);
+ if (objectGetter != null || objectSetter != null) {
+ addProblem(
+ templateExtensionMemberConflictsWithObjectMember
+ .withArguments(name),
+ declaration.charOffset,
+ name.length);
+ }
if (declaration.parent != this) {
if (fileUri != declaration.parent.fileUri) {
unexpected("$fileUri", "${declaration.parent.fileUri}", charOffset,
@@ -75,7 +95,7 @@
Field field = declaration.build(libraryBuilder);
if (addMembersToLibrary && declaration.next == null) {
libraryBuilder.library.addMember(field);
- _extension.members.add(new ExtensionMemberDescriptor(
+ extension.members.add(new ExtensionMemberDescriptor(
name: new Name(declaration.name, libraryBuilder.library),
member: field.reference,
isStatic: declaration.isStatic,
@@ -83,7 +103,9 @@
}
} else if (declaration is ProcedureBuilder) {
Member function = declaration.build(libraryBuilder);
- if (addMembersToLibrary && declaration.next == null) {
+ if (addMembersToLibrary &&
+ !declaration.isPatch &&
+ declaration.next == null) {
libraryBuilder.library.addMember(function);
ExtensionMemberKind kind;
switch (declaration.kind) {
@@ -103,11 +125,10 @@
unsupported("Extension method kind: ${declaration.kind}",
declaration.charOffset, declaration.fileUri);
}
- _extension.members.add(new ExtensionMemberDescriptor(
+ extension.members.add(new ExtensionMemberDescriptor(
name: new Name(declaration.name, libraryBuilder.library),
member: function.reference,
isStatic: declaration.isStatic,
- isExternal: declaration.isExternal,
kind: kind));
Procedure tearOff = declaration.extensionTearOff;
if (tearOff != null) {
@@ -116,7 +137,6 @@
name: new Name(declaration.name, libraryBuilder.library),
member: tearOff.reference,
isStatic: false,
- isExternal: false,
kind: ExtensionMemberKind.TearOff));
}
}
@@ -157,4 +177,46 @@
return _extension;
}
+
+ @override
+ void applyPatch(Builder patch) {
+ if (patch is SourceExtensionBuilder) {
+ patch._origin = this;
+ if (retainDataForTesting) {
+ patchForTesting = patch;
+ }
+ scope.local.forEach((String name, Builder member) {
+ Builder memberPatch = patch.scope.local[name];
+ if (memberPatch != null) {
+ member.applyPatch(memberPatch);
+ }
+ });
+ scope.setters.forEach((String name, Builder member) {
+ Builder memberPatch = patch.scope.setters[name];
+ if (memberPatch != null) {
+ member.applyPatch(memberPatch);
+ }
+ });
+
+ // TODO(johnniwinther): Check that type parameters and on-type match
+ // with origin declaration.
+ } else {
+ library.addProblem(messagePatchDeclarationMismatch, patch.charOffset,
+ noLength, patch.fileUri, context: [
+ messagePatchDeclarationOrigin.withLocation(
+ fileUri, charOffset, noLength)
+ ]);
+ }
+ }
+
+ @override
+ int finishPatch() {
+ if (!isPatch) return 0;
+
+ int count = 0;
+ scope.forEach((String name, Builder declaration) {
+ count += declaration.finishPatch();
+ });
+ return count;
+ }
}
diff --git a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
index f2243b2..83ce151 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
@@ -20,6 +20,8 @@
import 'package:kernel/type_algebra.dart' show Substitution;
+import 'package:kernel/type_environment.dart' show SubtypeCheckMode;
+
import 'type_schema.dart' show UnknownType;
abstract class StandardBounds {
@@ -30,7 +32,7 @@
InterfaceType get objectLegacyRawType;
InterfaceType get functionLegacyRawType;
- bool isSubtypeOf(DartType subtype, DartType supertype);
+ bool isSubtypeOf(DartType subtype, DartType supertype, SubtypeCheckMode mode);
InterfaceType getLegacyLeastUpperBound(
InterfaceType type1, InterfaceType type2);
@@ -94,11 +96,11 @@
// Otherwise, the lower bounds of two types is one of them it if it is a
// subtype of the other.
- if (isSubtypeOf(type1, type2)) {
+ if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
return type1;
}
- if (isSubtypeOf(type2, type1)) {
+ if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
return type2;
}
@@ -408,10 +410,10 @@
// 3. Otherwise return the spec-defined standard upper bound. This will
// be an upper bound, might (or might not) be least, and might
// (or might not) be a well-formed type.
- if (isSubtypeOf(type1, type2)) {
+ if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
return type2;
}
- if (isSubtypeOf(type2, type1)) {
+ if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
return type1;
}
if (type1 is InterfaceType &&
@@ -463,10 +465,10 @@
// type variable first. Alternatively, you could probably choose to treat
// it as just an instance of the interface type upper bound problem, with
// the "inheritance" chain extended by the bounds placed on the variables.
- if (isSubtypeOf(type1, type2)) {
+ if (isSubtypeOf(type1, type2, SubtypeCheckMode.ignoringNullabilities)) {
return type2;
}
- if (isSubtypeOf(type2, type1)) {
+ if (isSubtypeOf(type2, type1, SubtypeCheckMode.ignoringNullabilities)) {
return type1;
}
if (type1 is TypeParameterType) {
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 faf4afd..e51fb8d 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
@@ -12,8 +12,9 @@
import 'package:kernel/core_types.dart' show CoreTypes;
-import 'package:kernel/type_algebra.dart'
- show FreshTypeParameters, getFreshTypeParameters, Substitution;
+import 'package:kernel/type_algebra.dart';
+
+import 'package:kernel/type_environment.dart';
import 'package:kernel/src/bounds_checks.dart' show calculateBounds;
@@ -349,8 +350,8 @@
assert(_needToInferReturnType);
DartType inferredType =
inferrer.inferReturnType(_inferredUnwrappedReturnOrYieldType);
- if (!inferrer.typeSchemaEnvironment
- .isSubtypeOf(inferredType, returnOrYieldContext)) {
+ if (!inferrer.typeSchemaEnvironment.isSubtypeOf(inferredType,
+ returnOrYieldContext, SubtypeCheckMode.ignoringNullabilities)) {
// If the inferred return type isn't a subtype of the context, we use the
// context.
inferredType = greatestClosure(inferrer.coreTypes, returnOrYieldContext);
@@ -525,8 +526,10 @@
}
bool isAssignable(DartType expectedType, DartType actualType) {
- return typeSchemaEnvironment.isSubtypeOf(expectedType, actualType) ||
- typeSchemaEnvironment.isSubtypeOf(actualType, expectedType);
+ return typeSchemaEnvironment.isSubtypeOf(
+ expectedType, actualType, SubtypeCheckMode.ignoringNullabilities) ||
+ typeSchemaEnvironment.isSubtypeOf(
+ actualType, expectedType, SubtypeCheckMode.ignoringNullabilities);
}
/// Checks whether [actualType] can be assigned to the greatest closure of
@@ -602,12 +605,14 @@
}
if (expectedType == null ||
- typeSchemaEnvironment.isSubtypeOf(actualType, expectedType)) {
+ typeSchemaEnvironment.isSubtypeOf(
+ actualType, expectedType, SubtypeCheckMode.ignoringNullabilities)) {
// Types are compatible.
return null;
}
- if (!typeSchemaEnvironment.isSubtypeOf(expectedType, actualType)) {
+ if (!typeSchemaEnvironment.isSubtypeOf(
+ expectedType, actualType, SubtypeCheckMode.ignoringNullabilities)) {
// Error: not assignable. Perform error recovery.
TreeNode parent = expression.parent;
Expression errorNode = new AsExpression(
@@ -790,7 +795,8 @@
DartType typeArgument = inferredTypeArguments[index];
DartType bound =
inferredSubstitution.substituteType(typeParameter.bound);
- if (!typeSchemaEnvironment.isSubtypeOf(typeArgument, bound)) {
+ if (!typeSchemaEnvironment.isSubtypeOf(typeArgument, bound,
+ SubtypeCheckMode.ignoringNullabilities)) {
return;
}
}
@@ -805,7 +811,8 @@
.substituteType(extensionBuilder.extension.onType);
}
- if (typeSchemaEnvironment.isSubtypeOf(receiverType, onType)) {
+ if (typeSchemaEnvironment.isSubtypeOf(
+ receiverType, onType, SubtypeCheckMode.ignoringNullabilities)) {
ExtensionAccessCandidate candidate = new ExtensionAccessCandidate(
onType,
onTypeInstantiateToBounds,
@@ -1639,26 +1646,33 @@
}
DartType inferInvocation(DartType typeContext, int offset,
- FunctionType calleeType, DartType returnType, Arguments arguments,
+ FunctionType calleeType, Arguments arguments,
{bool isOverloadedArithmeticOperator: false,
+ DartType returnType,
DartType receiverType,
bool skipTypeArgumentInference: false,
bool isConst: false,
bool isImplicitExtensionMember: false}) {
+ assert(
+ returnType == null || !containsFreeFunctionTypeVariables(returnType),
+ "Return type $returnType contains free variables."
+ "Provided function type: $calleeType.");
int extensionTypeParameterCount = getExtensionTypeParameterCount(arguments);
if (extensionTypeParameterCount != 0) {
+ assert(returnType == null,
+ "Unexpected explicit return type for extension method invocation.");
return _inferGenericExtensionMethodInvocation(extensionTypeParameterCount,
- typeContext, offset, calleeType, returnType, arguments,
+ typeContext, offset, calleeType, arguments,
isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
receiverType: receiverType,
skipTypeArgumentInference: skipTypeArgumentInference,
isConst: isConst,
isImplicitExtensionMember: isImplicitExtensionMember);
}
- return _inferInvocation(
- typeContext, offset, calleeType, returnType, arguments,
+ return _inferInvocation(typeContext, offset, calleeType, arguments,
isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
receiverType: receiverType,
+ returnType: returnType,
skipTypeArgumentInference: skipTypeArgumentInference,
isConst: isConst,
isImplicitExtensionMember: isImplicitExtensionMember);
@@ -1669,7 +1683,6 @@
DartType typeContext,
int offset,
FunctionType calleeType,
- DartType returnType,
Arguments arguments,
{bool isOverloadedArithmeticOperator: false,
DartType receiverType,
@@ -1685,8 +1698,8 @@
Arguments extensionArguments = helper.forest.createArguments(
arguments.fileOffset, [arguments.positional.first],
types: getExplicitExtensionTypeArguments(arguments));
- _inferInvocation(const UnknownType(), offset, extensionFunctionType,
- extensionFunctionType.returnType, extensionArguments,
+ _inferInvocation(
+ const UnknownType(), offset, extensionFunctionType, extensionArguments,
skipTypeArgumentInference: skipTypeArgumentInference,
receiverType: receiverType,
isImplicitExtensionMember: isImplicitExtensionMember);
@@ -1705,13 +1718,11 @@
typeParameters: targetTypeParameters);
targetFunctionType =
extensionSubstitution.substituteType(targetFunctionType);
- DartType targetReturnType =
- extensionSubstitution.substituteType(returnType);
Arguments targetArguments = helper.forest.createArguments(
arguments.fileOffset, arguments.positional.skip(1).toList(),
named: arguments.named, types: getExplicitTypeArguments(arguments));
- DartType inferredType = _inferInvocation(typeContext, offset,
- targetFunctionType, targetReturnType, targetArguments,
+ DartType inferredType = _inferInvocation(
+ typeContext, offset, targetFunctionType, targetArguments,
isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
skipTypeArgumentInference: skipTypeArgumentInference,
isConst: isConst);
@@ -1731,13 +1742,18 @@
/// Performs the type inference steps that are shared by all kinds of
/// invocations (constructors, instance methods, and static methods).
DartType _inferInvocation(DartType typeContext, int offset,
- FunctionType calleeType, DartType returnType, Arguments arguments,
+ FunctionType calleeType, Arguments arguments,
{bool isOverloadedArithmeticOperator: false,
bool isBinaryOperator: false,
DartType receiverType,
+ DartType returnType,
bool skipTypeArgumentInference: false,
bool isConst: false,
bool isImplicitExtensionMember: false}) {
+ assert(
+ returnType == null || !containsFreeFunctionTypeVariables(returnType),
+ "Return type $returnType contains free variables."
+ "Provided function type: $calleeType.");
lastInferredSubstitution = null;
lastCalleeType = null;
List<TypeParameter> calleeTypeParameters = calleeType.typeParameters;
@@ -1753,7 +1769,9 @@
// in which me must do this, to avoid a performance regression?
FreshTypeParameters fresh = getFreshTypeParameters(calleeTypeParameters);
calleeType = fresh.applyToFunctionType(calleeType);
- returnType = fresh.substitute(returnType);
+ if (returnType != null) {
+ returnType = fresh.substitute(returnType);
+ }
calleeTypeParameters = fresh.freshTypeParameters;
}
List<DartType> explicitTypeArguments = getExplicitTypeArguments(arguments);
@@ -1776,8 +1794,13 @@
}
inferredTypes = new List<DartType>.filled(
calleeTypeParameters.length, const UnknownType());
- typeSchemaEnvironment.inferGenericFunctionOrType(returnType,
- calleeTypeParameters, null, null, typeContext, inferredTypes);
+ typeSchemaEnvironment.inferGenericFunctionOrType(
+ returnType ?? calleeType.returnType,
+ calleeTypeParameters,
+ null,
+ null,
+ typeContext,
+ inferredTypes);
substitution =
Substitution.fromPairs(calleeTypeParameters, inferredTypes);
} else if (explicitTypeArguments != null &&
@@ -1869,7 +1892,7 @@
if (inferenceNeeded) {
typeSchemaEnvironment.inferGenericFunctionOrType(
- returnType,
+ returnType ?? calleeType.returnType,
calleeTypeParameters,
formalTypes,
actualTypes,
@@ -1912,9 +1935,21 @@
DartType inferredType;
lastInferredSubstitution = substitution;
lastCalleeType = calleeType;
- inferredType = substitution == null
- ? returnType
- : substitution.substituteType(returnType);
+ if (returnType != null) {
+ inferredType = substitution == null
+ ? returnType
+ : substitution.substituteType(returnType);
+ } else {
+ if (substitution != null) {
+ calleeType =
+ substitution.substituteType(calleeType.withoutTypeParameters);
+ }
+ inferredType = calleeType.returnType;
+ }
+ assert(
+ !containsFreeFunctionTypeVariables(inferredType),
+ "Inferred return type $inferredType contains free variables."
+ "Inferred function type: $calleeType.");
return inferredType;
}
@@ -2142,8 +2177,8 @@
target, node, node.receiver, arguments);
arguments = replacement.arguments;
}
- DartType inferredType = inferInvocation(typeContext, node.fileOffset,
- functionType, functionType.returnType, arguments,
+ DartType inferredType = inferInvocation(
+ typeContext, node.fileOffset, functionType, arguments,
isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
receiverType: receiverType,
isImplicitExtensionMember: target.isExtensionMember);
@@ -2252,8 +2287,8 @@
parent?.replaceChild(expression, error);
return const ExpressionInferenceResult(const DynamicType());
}
- DartType inferredType = inferInvocation(typeContext, fileOffset,
- functionType, functionType.returnType, arguments,
+ DartType inferredType = inferInvocation(
+ typeContext, fileOffset, functionType, arguments,
isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
receiverType: receiverType,
isImplicitExtensionMember: target.isExtensionMember);
@@ -2614,7 +2649,8 @@
}
if (expectedType is FunctionType) return true;
if (expectedType == typeSchemaEnvironment.functionLegacyRawType) {
- if (!typeSchemaEnvironment.isSubtypeOf(actualType, expectedType)) {
+ if (!typeSchemaEnvironment.isSubtypeOf(
+ actualType, expectedType, SubtypeCheckMode.ignoringNullabilities)) {
return true;
}
}
@@ -2915,10 +2951,10 @@
ExtensionAccessCandidate other) {
if (this.isPlatform == other.isPlatform) {
// Both are platform or not platform.
- bool thisIsSubtype =
- typeSchemaEnvironment.isSubtypeOf(this.onType, other.onType);
- bool thisIsSupertype =
- typeSchemaEnvironment.isSubtypeOf(other.onType, this.onType);
+ bool thisIsSubtype = typeSchemaEnvironment.isSubtypeOf(
+ this.onType, other.onType, SubtypeCheckMode.ignoringNullabilities);
+ bool thisIsSupertype = typeSchemaEnvironment.isSubtypeOf(
+ other.onType, this.onType, SubtypeCheckMode.ignoringNullabilities);
if (thisIsSubtype && !thisIsSupertype) {
// This is subtype of other and not vice-versa.
return true;
@@ -2927,9 +2963,13 @@
return false;
} else if (thisIsSubtype || thisIsSupertype) {
thisIsSubtype = typeSchemaEnvironment.isSubtypeOf(
- this.onTypeInstantiateToBounds, other.onTypeInstantiateToBounds);
+ this.onTypeInstantiateToBounds,
+ other.onTypeInstantiateToBounds,
+ SubtypeCheckMode.ignoringNullabilities);
thisIsSupertype = typeSchemaEnvironment.isSubtypeOf(
- other.onTypeInstantiateToBounds, this.onTypeInstantiateToBounds);
+ other.onTypeInstantiateToBounds,
+ this.onTypeInstantiateToBounds,
+ SubtypeCheckMode.ignoringNullabilities);
if (thisIsSubtype && !thisIsSupertype) {
// This is subtype of other and not vice-versa.
return true;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart b/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
index f8f0ff5..bb90d9d 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
@@ -5,6 +5,8 @@
import 'package:kernel/ast.dart'
show DartType, Expression, TypeParameterType, VariableDeclaration;
+import 'package:kernel/type_environment.dart' show SubtypeCheckMode;
+
import '../fasta_codes.dart' show templateInternalProblemStackNotEmpty;
import '../problems.dart' show internalProblem;
@@ -682,16 +684,18 @@
// What we do now depends on the relationship between the previous type of
// the variable and the type we are checking against.
DartType previousType = previousPromotedType ?? variable.type;
- if (promoter.typeSchemaEnvironment.isSubtypeOf(checkedType, previousType)) {
+ if (promoter.typeSchemaEnvironment.isSubtypeOf(
+ checkedType, previousType, SubtypeCheckMode.ignoringNullabilities)) {
// The type we are checking against is a subtype of the previous type of
// the variable, so this is a refinement; we can promote.
return checkedType;
} else if (previousType is TypeParameterType &&
- promoter.typeSchemaEnvironment
- .isSubtypeOf(checkedType, previousType.bound)) {
+ promoter.typeSchemaEnvironment.isSubtypeOf(checkedType,
+ previousType.bound, SubtypeCheckMode.ignoringNullabilities)) {
// The type we are checking against is a subtype of the bound of the
// previous type of the variable; we can promote the bound.
- return new TypeParameterType(previousType.parameter, checkedType);
+ return new TypeParameterType(
+ previousType.parameter, checkedType, previousType.nullability);
} else {
// The types aren't sufficiently related; we can't promote.
return previousPromotedType;
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
index 1634efb..6a2aa4e 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
@@ -10,6 +10,7 @@
FunctionType,
InterfaceType,
NamedType,
+ Nullability,
TypedefType,
Visitor;
@@ -18,8 +19,6 @@
import 'package:kernel/text/ast_to_text.dart'
show Annotator, NameSystem, Printer, globalDebuggingNames;
-import '../problems.dart' show unsupported;
-
/// Determines whether a type schema contains `?` somewhere inside it.
bool isKnown(DartType schema) => schema.accept(new _IsKnownVisitor());
@@ -60,7 +59,7 @@
/// purely part of the local inference process.
class UnknownType extends DartType {
@override
- get nullability => unsupported("nullability", -1, null);
+ Nullability get nullability => null;
const UnknownType();
@@ -81,6 +80,9 @@
@override
visitChildren(Visitor<dynamic> v) {}
+
+ @override
+ UnknownType withNullability(Nullability nullability) => this;
}
/// Visitor that computes [isKnown].
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 5f8280e..8339567 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
@@ -19,6 +19,8 @@
import 'package:kernel/type_algebra.dart' show Substitution;
+import 'package:kernel/type_environment.dart' show SubtypeCheckMode;
+
import 'package:kernel/src/hierarchy_based_type_environment.dart'
show HierarchyBasedTypeEnvironment;
@@ -267,7 +269,8 @@
if (success && !hasOmittedBound(typeParam)) {
// If everything else succeeded, check the `extends` constraint.
DartType extendsConstraint = typeParamBound;
- success = isSubtypeOf(inferred, extendsConstraint);
+ success = isSubtypeOf(inferred, extendsConstraint,
+ SubtypeCheckMode.ignoringNullabilities);
}
if (!success) {
@@ -288,10 +291,11 @@
}
@override
- bool isSubtypeOf(DartType subtype, DartType supertype) {
+ bool isSubtypeOf(
+ DartType subtype, DartType supertype, SubtypeCheckMode mode) {
if (subtype is UnknownType) return true;
if (subtype == Null && supertype is UnknownType) return true;
- return super.isSubtypeOf(subtype, supertype);
+ return super.isSubtypeOf(subtype, supertype, mode);
}
bool isEmptyContext(DartType context) {
@@ -359,8 +363,10 @@
/// Determine if the given [type] satisfies the given type [constraint].
bool typeSatisfiesConstraint(DartType type, TypeConstraint constraint) {
- return isSubtypeOf(constraint.lower, type) &&
- isSubtypeOf(type, constraint.upper);
+ return isSubtypeOf(
+ constraint.lower, type, SubtypeCheckMode.ignoringNullabilities) &&
+ isSubtypeOf(
+ type, constraint.upper, SubtypeCheckMode.ignoringNullabilities);
}
DartType _inferTypeParameterFromAll(DartType typeFromContextInference,
diff --git a/pkg/front_end/lib/src/testing/id_extractor.dart b/pkg/front_end/lib/src/testing/id_extractor.dart
index 0afbb82..a7be604 100644
--- a/pkg/front_end/lib/src/testing/id_extractor.dart
+++ b/pkg/front_end/lib/src/testing/id_extractor.dart
@@ -61,9 +61,8 @@
DataExtractor(this.actualMap);
- void computeForLibrary(Library library, {bool useFileUri: false}) {
- LibraryId id =
- new LibraryId(useFileUri ? library.fileUri : library.importUri);
+ void computeForLibrary(Library library) {
+ LibraryId id = new LibraryId(library.fileUri);
T value = computeLibraryValue(id, library);
registerValue(library.fileUri, null, id, value, library);
}
diff --git a/pkg/front_end/lib/src/testing/id_testing.dart b/pkg/front_end/lib/src/testing/id_testing.dart
index 6aba9fb..3c49ea0 100644
--- a/pkg/front_end/lib/src/testing/id_testing.dart
+++ b/pkg/front_end/lib/src/testing/id_testing.dart
@@ -214,6 +214,8 @@
entry;
}
}
+ assert(
+ mainTestFile != null, "No 'main.dart' test file found for $testFile.");
}
String annotatedCode = new File.fromUri(mainTestFile.uri).readAsStringSync();
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index ec92375..68aa64d 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -8,6 +8,7 @@
import '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
import '../api_prototype/terminal_color_support.dart'
show printDiagnosticMessage;
+import '../base/common.dart';
import '../fasta/messages.dart' show FormattedMessage;
import '../fasta/severity.dart' show Severity;
import '../kernel_generator_impl.dart' show InternalCompilerResult;
@@ -42,8 +43,10 @@
final String marker;
final String name;
final Map<ExperimentalFlag, bool> experimentalFlags;
+ final Uri librariesSpecificationUri;
- const TestConfig(this.marker, this.name, {this.experimentalFlags = const {}});
+ const TestConfig(this.marker, this.name,
+ {this.experimentalFlags = const {}, this.librariesSpecificationUri});
void customizeCompilerOptions(CompilerOptions options) {}
}
@@ -180,6 +183,7 @@
/// Creates a test runner for [dataComputer] on [testedConfigs].
RunTestFunction runTestFor<T>(
DataComputer<T> dataComputer, List<TestConfig> testedConfigs) {
+ retainDataForTesting = true;
return (TestData testData,
{bool testAfterFailures, bool verbose, bool succinct, bool printCode}) {
return runTest(testData, dataComputer, testedConfigs,
@@ -242,6 +246,13 @@
};
options.debugDump = printCode;
options.experimentalFlags.addAll(config.experimentalFlags);
+ if (config.librariesSpecificationUri != null) {
+ Set<Uri> testFiles =
+ testData.memorySourceFiles.keys.map(createUriForFileName).toSet();
+ if (testFiles.contains(config.librariesSpecificationUri)) {
+ options.librariesSpecificationUri = config.librariesSpecificationUri;
+ }
+ }
config.customizeCompilerOptions(options);
InternalCompilerResult compilerResult = await compileScript(
testData.memorySourceFiles,
diff --git a/pkg/front_end/lib/src/testing/id_testing_utils.dart b/pkg/front_end/lib/src/testing/id_testing_utils.dart
index d32d8f5..0c98653 100644
--- a/pkg/front_end/lib/src/testing/id_testing_utils.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_utils.dart
@@ -62,7 +62,7 @@
(Extension extension) => extension.name == extensionName, orElse: () {
if (required) {
throw new ArgumentError(
- "Extension '$extensionName' not found in '$library'.");
+ "Extension '$extensionName' not found in '${library.importUri}'.");
}
return null;
});
@@ -151,7 +151,7 @@
lookupClassBuilder(compilerResult, cls, required: required);
MemberBuilder memberBuilder;
if (classBuilder != null) {
- if (member is Constructor) {
+ if (member is Constructor || member is Procedure && member.isFactory) {
memberBuilder = classBuilder.constructors.local[memberName];
} else if (member is Procedure && member.isSetter) {
memberBuilder = classBuilder.scope.setters[memberName];
@@ -527,9 +527,6 @@
/// Returns a textual representation of [descriptor] to be used in testing.
String extensionMethodDescriptorToText(ExtensionMemberDescriptor descriptor) {
StringBuffer sb = new StringBuffer();
- if (descriptor.isExternal) {
- sb.write('external ');
- }
if (descriptor.isStatic) {
sb.write('static ');
}
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 34bb332..ccc99a2 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -215,6 +215,7 @@
ExtensionDeclaresAbstractMember/example: Fail
ExtensionDeclaresConstructor/example: Fail
ExtensionDeclaresInstanceField/example: Fail
+ExtensionMemberConflictsWithObjectMember/analyzerCode: Fail
ExtraneousModifier/part_wrapped_script1: Fail
ExtraneousModifier/part_wrapped_script2: Fail
ExtraneousModifier/part_wrapped_script3: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 2782772..e67853d 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -457,8 +457,8 @@
EqualityCannotBeEqualityOperand:
index: 1
- template: "An equality expression can't be an operand of another equality expression."
- tip: "Try re-writing the expression."
+ template: "A comparison expression can't be an operand of another comparison expression."
+ tip: "Try putting parentheses around one of the comparisons."
analyzerCode: ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND
script:
- "main() { var b = a < b < c; }"
@@ -703,7 +703,7 @@
ExternalField:
index: 50
template: "Fields can't be declared to be 'external'."
- tip: "Try removing the keyword 'external'."
+ tip: "Try removing the keyword 'external', or replacing the field by an external getter and/or setter."
analyzerCode: ParserErrorCode.EXTERNAL_FIELD
script:
- "class C { external var f; }"
@@ -926,7 +926,7 @@
script: "main() sync {}"
InvalidVoid:
- template: "Type 'void' can't be used here because it isn't a return type."
+ template: "Type 'void' can't be used here."
tip: "Try removing 'void' keyword or replace it with 'var', 'final', or a type."
analyzerCode: EXPECTED_TYPE_NAME
script:
@@ -943,7 +943,7 @@
FieldInitializedOutsideDeclaringClass:
index: 88
- template: "A field can only be initialized in it's declaring class"
+ template: "A field can only be initialized in its declaring class"
tip: "Try passing a value into the superclass constructor, or moving the initialization into the constructor body."
analyzerCode: ParserErrorCode.FIELD_INITIALIZED_OUTSIDE_DECLARING_CLASS
script:
@@ -1137,7 +1137,6 @@
BuiltInIdentifierAsType:
template: "The built-in identifier '#lexeme' can't be used as a type."
- tip: "Try correcting the name to match an existing type."
analyzerCode: BUILT_IN_IDENTIFIER_AS_TYPE
BuiltInIdentifierInDeclaration:
@@ -1265,12 +1264,12 @@
ConstFieldWithoutInitializer:
template: "The const variable '#name' must be initialized."
- tip: "Try adding an initializer ('= <expression>') to the declaration."
+ tip: "Try adding an initializer ('= expression') to the declaration."
analyzerCode: CONST_NOT_INITIALIZED
FinalFieldWithoutInitializer:
template: "The final variable '#name' must be initialized."
- tip: "Try adding an initializer ('= <expression>') to the declaration."
+ tip: "Try adding an initializer ('= expression') to the declaration."
analyzerCode: FINAL_NOT_INITIALIZED
MetadataTypeArguments:
@@ -1718,7 +1717,7 @@
MissingPrefixInDeferredImport:
index: 30
template: "Deferred imports should have a prefix."
- tip: "Try adding a prefix to the import."
+ tip: "Try adding a prefix to the import by adding an 'as' clause."
analyzerCode: ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMPORT
DeferredAfterPrefix:
@@ -1936,6 +1935,13 @@
template: "This is the type variable."
severity: CONTEXT
+ExtensionMemberConflictsWithObjectMember:
+ template: "This extension member conflicts with Object member '#name'."
+ script:
+ extension Extension on String {
+ int get noSuchMethod => 42;
+ }
+
DeclaredMemberConflictsWithInheritedMember:
template: "Can't declare a member that conflicts with an inherited one."
analyzerCode: DECLARED_MEMBER_CONFLICTS_WITH_INHERITED
@@ -2781,7 +2787,7 @@
MissingAssignableSelector:
index: 35
- template: "Missing selector such as '.<identifier>' or '[0]'."
+ template: "Missing selector such as '.identifier' or '[0]'."
tip: "Try adding a selector."
analyzerCode: ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR
script:
@@ -2833,12 +2839,10 @@
ArgumentTypeNotAssignable:
template: "The argument type '#type' can't be assigned to the parameter type '#type2'."
- tip: "Try changing the type of the parameter, or casting the argument to '#type2'."
analyzerCode: ARGUMENT_TYPE_NOT_ASSIGNABLE
InvalidAssignment:
template: "A value of type '#type' can't be assigned to a variable of type '#type2'."
- tip: "Try changing the type of the left hand side, or casting the right hand side to '#type2'."
analyzerCode: INVALID_ASSIGNMENT
script: >
main() {
@@ -3157,7 +3161,7 @@
CantUsePrefixWithNullAware:
template: "A prefix can't be used with null-aware operators."
- tip: "It should be safe to remove the '?' as a prefix is never null."
+ tip: "Try replacing '?.' with '.'"
analyzerCode: PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT
script: |
import "dart:core" as prefix;
@@ -3418,7 +3422,7 @@
class C = Object with M;
GenericFunctionTypeUsedAsActualTypeArgument:
- template: "Unexpected generic function type found in a type argument."
+ template: "A generic function type can't be used as a type argument."
tip: "Try using a non-generic function type."
analyzerCode: GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT
script:
@@ -3434,7 +3438,7 @@
}
GenericFunctionTypeInferredAsActualTypeArgument:
- template: "Unexpected generic function type '#type' inferred as a type argument."
+ template: "Generic function type '#type' inferred as a type argument."
tip: "Try providing a non-generic function type explicitly."
analyzerCode: GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT
script:
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex.dart.intertwined.expect
new file mode 100644
index 0000000..7bf2cde
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex.dart.intertwined.expect
@@ -0,0 +1,88 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, foo)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(foo)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(foo, expression)
+ listener: handleNoTypeArguments(.)
+ parseArgumentsOpt(foo)
+ listener: handleNoArguments(.)
+ listener: handleSend(foo, .)
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ parseSend(., expressionContinuation)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(bar, expressionContinuation)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(bar)
+ listener: handleNoArguments(!)
+ listener: handleSend(bar, !)
+ listener: endBinaryExpression(.)
+ listener: handleNonNullAssertExpression(!)
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ parseSend(., expressionContinuation)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(baz, expressionContinuation)
+ listener: handleNoTypeArguments([)
+ parseArgumentsOpt(baz)
+ listener: handleNoArguments([)
+ listener: handleSend(baz, [)
+ listener: endBinaryExpression(.)
+ parseArgumentOrIndexStar(baz, Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex_with_parens.dart.intertwined.expect
new file mode 100644
index 0000000..69fcc2c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckBeforeIndex_with_parens.dart.intertwined.expect
@@ -0,0 +1,99 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, ()
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclaration({, false)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(()
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseParenthesizedExpressionOrFunctionLiteral({)
+ parseParenthesizedExpression({)
+ parseExpressionInParenthesis({)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(foo, expression)
+ listener: handleNoTypeArguments(.)
+ parseArgumentsOpt(foo)
+ listener: handleNoArguments(.)
+ listener: handleSend(foo, .)
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ parseSend(., expressionContinuation)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(bar, expressionContinuation)
+ listener: handleNoTypeArguments())
+ parseArgumentsOpt(bar)
+ listener: handleNoArguments())
+ listener: handleSend(bar, ))
+ listener: endBinaryExpression(.)
+ ensureCloseParen(bar, ()
+ listener: handleParenthesizedExpression(()
+ listener: handleNonNullAssertExpression(!)
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ parseSend(., expressionContinuation)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(baz, expressionContinuation)
+ listener: handleNoTypeArguments([)
+ parseArgumentsOpt(baz)
+ listener: handleNoArguments([)
+ listener: handleSend(baz, [)
+ listener: endBinaryExpression(.)
+ parseArgumentOrIndexStar(baz, Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex.dart.intertwined.expect
new file mode 100644
index 0000000..109f304
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex.dart.intertwined.expect
@@ -0,0 +1,68 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, obj)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(obj)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(obj, expression)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(obj)
+ listener: handleNoArguments(!)
+ listener: handleSend(obj, !)
+ listener: handleNonNullAssertExpression(!)
+ parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2.dart.intertwined.expect
new file mode 100644
index 0000000..0b43b40
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2.dart.intertwined.expect
@@ -0,0 +1,83 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, obj)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(obj)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(obj, expression)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(obj)
+ listener: handleNoArguments(!)
+ listener: handleSend(obj, !)
+ listener: handleNonNullAssertExpression(!)
+ parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ listener: handleNonNullAssertExpression(!)
+ parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg2, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg2)
+ listener: handleNoArguments(])
+ listener: handleSend(arg2, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2_with_parens.dart.intertwined.expect
new file mode 100644
index 0000000..6c15e07
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex2_with_parens.dart.intertwined.expect
@@ -0,0 +1,114 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, ()
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclaration({, false)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(()
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseParenthesizedExpressionOrFunctionLiteral({)
+ parseParenthesizedExpression({)
+ parseExpressionInParenthesis({)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(()
+ parseParenthesizedExpression(()
+ parseExpressionInParenthesis(()
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(()
+ parseParenthesizedExpression(()
+ parseExpressionInParenthesis(()
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(obj, expression)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(obj)
+ listener: handleNoArguments(!)
+ listener: handleSend(obj, !)
+ listener: handleNonNullAssertExpression(!)
+ ensureCloseParen(!, ()
+ listener: handleParenthesizedExpression(()
+ parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ ensureCloseParen(], ()
+ listener: handleParenthesizedExpression(()
+ listener: handleNonNullAssertExpression(!)
+ ensureCloseParen(!, ()
+ listener: handleParenthesizedExpression(()
+ parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg2, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg2)
+ listener: handleNoArguments(])
+ listener: handleSend(arg2, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3.dart.intertwined.expect
new file mode 100644
index 0000000..f3b48e4
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3.dart.intertwined.expect
@@ -0,0 +1,78 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, foo)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(foo)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(foo, expression)
+ listener: handleNoTypeArguments(.)
+ parseArgumentsOpt(foo)
+ listener: handleNoArguments(.)
+ listener: handleSend(foo, .)
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ parseSend(., expressionContinuation)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(bar, expressionContinuation)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(bar)
+ listener: handleNoArguments(!)
+ listener: handleSend(bar, !)
+ listener: endBinaryExpression(.)
+ listener: handleNonNullAssertExpression(!)
+ parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3_with_parens.dart.intertwined.expect
new file mode 100644
index 0000000..c349f09
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex3_with_parens.dart.intertwined.expect
@@ -0,0 +1,89 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, ()
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclaration({, false)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(()
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseParenthesizedExpressionOrFunctionLiteral({)
+ parseParenthesizedExpression({)
+ parseExpressionInParenthesis({)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(foo, expression)
+ listener: handleNoTypeArguments(.)
+ parseArgumentsOpt(foo)
+ listener: handleNoArguments(.)
+ listener: handleSend(foo, .)
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ parseSend(., expressionContinuation)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(bar, expressionContinuation)
+ listener: handleNoTypeArguments())
+ parseArgumentsOpt(bar)
+ listener: handleNoArguments())
+ listener: handleSend(bar, ))
+ listener: endBinaryExpression(.)
+ ensureCloseParen(bar, ()
+ listener: handleParenthesizedExpression(()
+ listener: handleNonNullAssertExpression(!)
+ parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4.dart.intertwined.expect
new file mode 100644
index 0000000..89095e5
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4.dart.intertwined.expect
@@ -0,0 +1,79 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, foo)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(foo)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(foo, expression)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(foo)
+ listener: handleNoArguments(!)
+ listener: handleSend(foo, !)
+ listener: handleNonNullAssertExpression(!)
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ parseSend(., expressionContinuation)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(bar, expressionContinuation)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(bar)
+ listener: handleNoArguments(!)
+ listener: handleSend(bar, !)
+ listener: endBinaryExpression(.)
+ listener: handleNonNullAssertExpression(!)
+ parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4_with_parens.dart.intertwined.expect
new file mode 100644
index 0000000..4e8d872
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex4_with_parens.dart.intertwined.expect
@@ -0,0 +1,100 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, ()
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclaration({, false)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(()
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseParenthesizedExpressionOrFunctionLiteral({)
+ parseParenthesizedExpression({)
+ parseExpressionInParenthesis({)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(()
+ parseParenthesizedExpression(()
+ parseExpressionInParenthesis(()
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(foo, expression)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(foo)
+ listener: handleNoArguments(!)
+ listener: handleSend(foo, !)
+ listener: handleNonNullAssertExpression(!)
+ ensureCloseParen(!, ()
+ listener: handleParenthesizedExpression(()
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ parseSend(., expressionContinuation)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(bar, expressionContinuation)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(bar)
+ listener: handleNoArguments(!)
+ listener: handleSend(bar, !)
+ listener: endBinaryExpression(.)
+ listener: handleNonNullAssertExpression(!)
+ ensureCloseParen(!, ()
+ listener: handleParenthesizedExpression(()
+ parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5.dart.intertwined.expect
new file mode 100644
index 0000000..c6b3abd
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5.dart.intertwined.expect
@@ -0,0 +1,93 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, foo)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(foo)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(foo, expression)
+ listener: handleNoTypeArguments(.)
+ parseArgumentsOpt(foo)
+ listener: handleNoArguments(.)
+ listener: handleSend(foo, .)
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ parseSend(., expressionContinuation)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(bar, expressionContinuation)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(bar)
+ listener: handleNoArguments(!)
+ listener: handleSend(bar, !)
+ listener: endBinaryExpression(.)
+ listener: handleNonNullAssertExpression(!)
+ parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ listener: handleNonNullAssertExpression(!)
+ parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg2, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg2)
+ listener: handleNoArguments(])
+ listener: handleSend(arg2, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5_with_parens.dart.intertwined.expect
new file mode 100644
index 0000000..1f1f0bf
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex5_with_parens.dart.intertwined.expect
@@ -0,0 +1,124 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, ()
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclaration({, false)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(()
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseParenthesizedExpressionOrFunctionLiteral({)
+ parseParenthesizedExpression({)
+ parseExpressionInParenthesis({)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(()
+ parseParenthesizedExpression(()
+ parseExpressionInParenthesis(()
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(()
+ parseParenthesizedExpression(()
+ parseExpressionInParenthesis(()
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(foo, expression)
+ listener: handleNoTypeArguments(.)
+ parseArgumentsOpt(foo)
+ listener: handleNoArguments(.)
+ listener: handleSend(foo, .)
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ parseSend(., expressionContinuation)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(bar, expressionContinuation)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(bar)
+ listener: handleNoArguments(!)
+ listener: handleSend(bar, !)
+ listener: endBinaryExpression(.)
+ listener: handleNonNullAssertExpression(!)
+ ensureCloseParen(!, ()
+ listener: handleParenthesizedExpression(()
+ parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ ensureCloseParen(], ()
+ listener: handleParenthesizedExpression(()
+ listener: handleNonNullAssertExpression(!)
+ ensureCloseParen(!, ()
+ listener: handleParenthesizedExpression(()
+ parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg2, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg2)
+ listener: handleNoArguments(])
+ listener: handleSend(arg2, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6.dart.intertwined.expect
new file mode 100644
index 0000000..795f82d
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6.dart.intertwined.expect
@@ -0,0 +1,94 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, foo)
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(foo)
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseSendOrFunctionLiteral({, expression)
+ parseSend({, expression)
+ ensureIdentifier({, expression)
+ listener: handleIdentifier(foo, expression)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(foo)
+ listener: handleNoArguments(!)
+ listener: handleSend(foo, !)
+ listener: handleNonNullAssertExpression(!)
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ parseSend(., expressionContinuation)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(bar, expressionContinuation)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(bar)
+ listener: handleNoArguments(!)
+ listener: handleSend(bar, !)
+ listener: endBinaryExpression(.)
+ listener: handleNonNullAssertExpression(!)
+ parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ listener: handleNonNullAssertExpression(!)
+ parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg2, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg2)
+ listener: handleNoArguments(])
+ listener: handleSend(arg2, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6_with_parens.dart.intertwined.expect
new file mode 100644
index 0000000..41a6cb6
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex6_with_parens.dart.intertwined.expect
@@ -0,0 +1,135 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, ()
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclaration({, false)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(()
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseParenthesizedExpressionOrFunctionLiteral({)
+ parseParenthesizedExpression({)
+ parseExpressionInParenthesis({)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(()
+ parseParenthesizedExpression(()
+ parseExpressionInParenthesis(()
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(()
+ parseParenthesizedExpression(()
+ parseExpressionInParenthesis(()
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseParenthesizedExpressionOrFunctionLiteral(()
+ parseParenthesizedExpression(()
+ parseExpressionInParenthesis(()
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(foo, expression)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(foo)
+ listener: handleNoArguments(!)
+ listener: handleSend(foo, !)
+ listener: handleNonNullAssertExpression(!)
+ ensureCloseParen(!, ()
+ listener: handleParenthesizedExpression(()
+ parsePrimary(., expressionContinuation)
+ parseSendOrFunctionLiteral(., expressionContinuation)
+ parseSend(., expressionContinuation)
+ ensureIdentifier(., expressionContinuation)
+ listener: handleIdentifier(bar, expressionContinuation)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(bar)
+ listener: handleNoArguments(!)
+ listener: handleSend(bar, !)
+ listener: endBinaryExpression(.)
+ listener: handleNonNullAssertExpression(!)
+ ensureCloseParen(!, ()
+ listener: handleParenthesizedExpression(()
+ parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ ensureCloseParen(], ()
+ listener: handleParenthesizedExpression(()
+ listener: handleNonNullAssertExpression(!)
+ ensureCloseParen(!, ()
+ listener: handleParenthesizedExpression(()
+ parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg2, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg2)
+ listener: handleNoArguments(])
+ listener: handleSend(arg2, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex_with_parens.dart.intertwined.expect b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex_with_parens.dart.intertwined.expect
new file mode 100644
index 0000000..0f8729a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/nnbd/nullCheckOnIndex_with_parens.dart.intertwined.expect
@@ -0,0 +1,79 @@
+parseUnit(f)
+ skipErrorTokens(f)
+ listener: beginCompilationUnit(f)
+ syntheticPreviousToken(f)
+ parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+ parseMetadataStar()
+ listener: beginMetadataStar(f)
+ listener: endMetadataStar(0)
+ parseTopLevelMemberImpl()
+ listener: beginTopLevelMember(f)
+ parseTopLevelMethod(, null, , Instance of 'NoType', null, f)
+ listener: beginTopLevelMethod(, null)
+ listener: handleNoType()
+ ensureIdentifier(, topLevelFunctionDeclaration)
+ listener: handleIdentifier(f, topLevelFunctionDeclaration)
+ parseMethodTypeVar(f)
+ listener: handleNoTypeVariables(()
+ parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
+ parseFormalParameters(f, MemberKind.TopLevelMethod)
+ parseFormalParametersRest((, MemberKind.TopLevelMethod)
+ listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+ listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+ parseAsyncModifierOpt())
+ listener: handleAsyncModifier(null, null)
+ inPlainSync()
+ parseFunctionBody(), false, false)
+ listener: beginBlockFunctionBody({)
+ notEofOrValue(}, ()
+ parseStatement({)
+ parseStatementX({)
+ parseExpressionStatementOrDeclaration({, false)
+ parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+ looksLikeLocalFunction(()
+ parseExpressionStatement({)
+ parseExpression({)
+ parsePrecedenceExpression({, 1, true)
+ parseUnaryExpression({, true)
+ parsePrimary({, expression)
+ parseParenthesizedExpressionOrFunctionLiteral({)
+ parseParenthesizedExpression({)
+ parseExpressionInParenthesis({)
+ parseExpressionInParenthesisRest(()
+ parseExpression(()
+ parsePrecedenceExpression((, 1, true)
+ parseUnaryExpression((, true)
+ parsePrimary((, expression)
+ parseSendOrFunctionLiteral((, expression)
+ parseSend((, expression)
+ ensureIdentifier((, expression)
+ listener: handleIdentifier(obj, expression)
+ listener: handleNoTypeArguments(!)
+ parseArgumentsOpt(obj)
+ listener: handleNoArguments(!)
+ listener: handleSend(obj, !)
+ listener: handleNonNullAssertExpression(!)
+ ensureCloseParen(!, ()
+ listener: handleParenthesizedExpression(()
+ parseArgumentOrIndexStar(), Instance of 'NoTypeParamOrArg')
+ parseExpression([)
+ parsePrecedenceExpression([, 1, true)
+ parseUnaryExpression([, true)
+ parsePrimary([, expression)
+ parseSendOrFunctionLiteral([, expression)
+ parseSend([, expression)
+ ensureIdentifier([, expression)
+ listener: handleIdentifier(arg, expression)
+ listener: handleNoTypeArguments(])
+ parseArgumentsOpt(arg)
+ listener: handleNoArguments(])
+ listener: handleSend(arg, ])
+ listener: handleIndexedExpression([, ])
+ ensureSemicolon(])
+ listener: handleExpressionStatement(;)
+ notEofOrValue(}, })
+ listener: endBlockFunctionBody(1, {, })
+ listener: endTopLevelMethod(f, null, })
+ listener: endTopLevelDeclaration()
+ reportAllErrorTokens(f)
+ listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/test/extensions/data/as_show/lib.dart b/pkg/front_end/test/extensions/data/as_show/lib.dart
new file mode 100644
index 0000000..e89ef0c
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/as_show/lib.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2019, 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: scope=[Extension1]*/
+
+/*class: Extension1:
+ builder-name=Extension1,
+ builder-onType=String,
+ extension-members=[
+ method1=Extension1|method1,
+ tearoff method1=Extension1|get#method1],
+ extension-name=Extension1,
+ extension-onType=String
+*/
+extension Extension1 on String {
+ /*member: Extension1|method1:
+ builder-name=method1,
+ builder-params=[#this],
+ member-name=Extension1|method1,
+ member-params=[#this]
+ */
+ method1() {}
+
+ /*member: Extension1|get#method1:
+ builder-name=method1,
+ builder-params=[#this],
+ member-name=Extension1|get#method1,
+ member-params=[#this]*/
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/extensions/data/as_show/libraries.json b/pkg/front_end/test/extensions/data/as_show/libraries.json
new file mode 100644
index 0000000..7a584cb
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/as_show/libraries.json
@@ -0,0 +1,9 @@
+{
+ "none": {
+ "libraries": {
+ "test": {
+ "uri": "origin.dart"
+ }
+ }
+ }
+}
diff --git a/pkg/front_end/test/extensions/data/as_show/main.dart b/pkg/front_end/test/extensions/data/as_show/main.dart
new file mode 100644
index 0000000..2a7d2d1
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/as_show/main.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2019, 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: scope=[lib.dart.Extension1,origin.dart.Extension2]*/
+
+import 'lib.dart' as lib1;
+import 'lib.dart' show Extension1;
+
+// ignore: uri_does_not_exist
+import 'dart:test' as lib2;
+// ignore: uri_does_not_exist
+import 'dart:test' show Extension2;
+
+main() {
+ "".method1();
+ Extension1("").method1();
+ "".method2();
+ Extension2("").method2();
+}
diff --git a/pkg/front_end/test/extensions/data/as_show/origin.dart b/pkg/front_end/test/extensions/data/as_show/origin.dart
new file mode 100644
index 0000000..1b36bb9
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/as_show/origin.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2019, 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: scope=[Extension2]*/
+
+/*class: Extension2:
+ builder-name=Extension2,
+ builder-onType=String,
+ extension-members=[
+ method2=Extension2|method2,
+ tearoff method2=Extension2|get#method2],
+ extension-name=Extension2,
+ extension-onType=String
+*/
+extension Extension2 on String {
+/*member: Extension2|method2:
+ builder-name=method2,
+ builder-params=[#this],
+ member-name=Extension2|method2,
+ member-params=[#this]
+ */
+method2() {}
+
+/*member: Extension2|get#method2:
+ builder-name=method2,
+ builder-params=[#this],
+ member-name=Extension2|get#method2,
+ member-params=[#this]*/
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/extensions/data/patching/libraries.json b/pkg/front_end/test/extensions/data/patching/libraries.json
new file mode 100644
index 0000000..a697508
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/patching/libraries.json
@@ -0,0 +1,12 @@
+{
+ "none": {
+ "libraries": {
+ "test": {
+ "patches": [
+ "patch.dart"
+ ],
+ "uri": "origin.dart"
+ }
+ }
+ }
+}
diff --git a/pkg/front_end/test/extensions/data/patching/main.dart b/pkg/front_end/test/extensions/data/patching/main.dart
new file mode 100644
index 0000000..9599059
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/patching/main.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2019, 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: scope=[origin.dart.Extension,origin.dart.GenericExtension]*/
+
+// ignore: uri_does_not_exist
+import 'dart:test';
+
+main() {
+ "".instanceMethod();
+ "".genericInstanceMethod<int>(0);
+ "".instanceProperty = "".instanceProperty;
+ Extension.staticMethod();
+ Extension.genericStaticMethod<int>(0);
+ Extension.staticProperty = Extension.staticProperty;
+ true.instanceMethod();
+ true.genericInstanceMethod<int>(0);
+ true.instanceProperty = true.instanceProperty;
+ GenericExtension.staticMethod();
+ GenericExtension.genericStaticMethod<int>(0);
+ GenericExtension.staticProperty = GenericExtension.staticProperty;
+}
diff --git a/pkg/front_end/test/extensions/data/patching/origin.dart b/pkg/front_end/test/extensions/data/patching/origin.dart
new file mode 100644
index 0000000..1a5b69e
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/patching/origin.dart
@@ -0,0 +1,108 @@
+// Copyright (c) 2019, 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: scope=[Extension,GenericExtension]*/
+
+/*class: Extension:
+ builder-name=Extension,
+ builder-onType=String,
+ extension-members=[
+ genericInstanceMethod=Extension|genericInstanceMethod,
+ getter instanceProperty=Extension|get#instanceProperty,
+ instanceMethod=Extension|instanceMethod,
+ setter instanceProperty=Extension|set#instanceProperty,
+ static genericStaticMethod=Extension|genericStaticMethod,
+ static getter staticProperty=Extension|staticProperty,
+ static setter staticProperty=Extension|staticProperty=,
+ static staticMethod=Extension|staticMethod,
+ tearoff genericInstanceMethod=Extension|get#genericInstanceMethod,
+ tearoff instanceMethod=Extension|get#instanceMethod,
+ ],
+ extension-name=Extension,
+ extension-onType=String
+*/
+extension Extension on String {
+ /*member: Extension|get#instanceMethod:
+ builder-name=instanceMethod,
+ builder-params=[#this],
+ member-name=Extension|get#instanceMethod,
+ member-params=[#this]
+ */
+ external int instanceMethod();
+
+ /*member: Extension|get#genericInstanceMethod:
+ builder-name=genericInstanceMethod,
+ builder-params=[#this,t],
+ builder-type-params=[T],
+ member-name=Extension|get#genericInstanceMethod,
+ member-params=[#this]
+ */
+ external T genericInstanceMethod<T>(T t);
+
+ external static int staticMethod();
+
+ external static T genericStaticMethod<T>(T t);
+
+ external int get instanceProperty;
+
+ external void set instanceProperty(int value);
+
+ external static int get staticProperty;
+
+ external static void set staticProperty(int value);
+}
+
+/*class: GenericExtension:
+ builder-name=GenericExtension,
+ builder-onType=T,
+ builder-type-params=[T],
+ extension-members=[
+ genericInstanceMethod=GenericExtension|genericInstanceMethod,
+ getter instanceProperty=GenericExtension|get#instanceProperty,
+ instanceMethod=GenericExtension|instanceMethod,
+ setter instanceProperty=GenericExtension|set#instanceProperty,
+ static genericStaticMethod=GenericExtension|genericStaticMethod,
+ static getter staticProperty=GenericExtension|staticProperty,
+ static setter staticProperty=GenericExtension|staticProperty=,
+ static staticMethod=GenericExtension|staticMethod,
+ tearoff genericInstanceMethod=GenericExtension|get#genericInstanceMethod,
+ tearoff instanceMethod=GenericExtension|get#instanceMethod
+ ],
+ extension-name=GenericExtension,
+ extension-onType=T,
+ extension-type-params=[T]
+*/
+extension GenericExtension<T> on T {
+ /*member: GenericExtension|get#instanceMethod:
+ builder-name=instanceMethod,
+ builder-params=[#this],
+ builder-type-params=[T],
+ member-name=GenericExtension|get#instanceMethod,
+ member-params=[#this],
+ member-type-params=[T]
+ */
+ external int instanceMethod();
+
+ /*member: GenericExtension|get#genericInstanceMethod:
+ builder-name=genericInstanceMethod,
+ builder-params=[#this,t],
+ builder-type-params=[T,T],
+ member-name=GenericExtension|get#genericInstanceMethod,
+ member-params=[#this],
+ member-type-params=[#T]
+ */
+ external T genericInstanceMethod<T>(T t);
+
+ external static int staticMethod();
+
+ external static T genericStaticMethod<T>(T t);
+
+ external int get instanceProperty;
+
+ external void set instanceProperty(int value);
+
+ external static int get staticProperty;
+
+ external static void set staticProperty(int value);
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/extensions/data/patching/patch.dart b/pkg/front_end/test/extensions/data/patching/patch.dart
new file mode 100644
index 0000000..32edfc4
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/patching/patch.dart
@@ -0,0 +1,163 @@
+// Copyright (c) 2019, 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.
+
+// ignore: import_internal_library
+import 'dart:_internal';
+
+@patch
+extension Extension on String {
+ /*member: Extension|instanceMethod:
+ builder-name=instanceMethod,
+ builder-params=[#this],
+ member-name=Extension|instanceMethod,
+ member-params=[#this]
+ */
+ @patch
+ int instanceMethod() => 42;
+
+ /*member: Extension|genericInstanceMethod:
+ builder-name=genericInstanceMethod,
+ builder-params=[#this,t],
+ builder-type-params=[T],
+ member-name=Extension|genericInstanceMethod,
+ member-params=[#this,t],
+ member-type-params=[T]
+ */
+ @patch
+ T genericInstanceMethod<T>(T t) => t;
+
+ /*member: Extension|staticMethod:
+ builder-name=staticMethod,
+ member-name=Extension|staticMethod
+ */
+ @patch
+ static int staticMethod() => 87;
+
+ /*member: Extension|genericStaticMethod:
+ builder-name=genericStaticMethod,
+ builder-params=[t],
+ builder-type-params=[T],
+ member-name=Extension|genericStaticMethod,
+ member-params=[t],
+ member-type-params=[T]
+ */
+ @patch
+ static T genericStaticMethod<T>(T t) => t;
+
+ /*member: Extension|get#instanceProperty:
+ builder-name=instanceProperty,
+ builder-params=[#this],
+ member-name=Extension|get#instanceProperty,
+ member-params=[#this]
+ */
+ @patch
+ int get instanceProperty => 123;
+
+ /*member: Extension|set#instanceProperty:
+ builder-name=instanceProperty,
+ builder-params=[#this,value],
+ member-name=Extension|set#instanceProperty,
+ member-params=[#this,value]
+ */
+ @patch
+ void set instanceProperty(int value) {}
+
+ /*member: Extension|staticProperty:
+ builder-name=staticProperty,
+ member-name=Extension|staticProperty
+ */
+ @patch
+ static int get staticProperty => 237;
+
+ /*member: Extension|staticProperty=:
+ builder-name=staticProperty,
+ builder-params=[value],
+ member-name=Extension|staticProperty=,
+ member-params=[value]
+ */
+ @patch
+ static void set staticProperty(int value) {}
+}
+
+
+@patch
+extension GenericExtension<T> on T {
+ /*member: GenericExtension|instanceMethod:
+ builder-name=instanceMethod,
+ builder-params=[#this],
+ builder-type-params=[T],
+ member-name=GenericExtension|instanceMethod,
+ member-params=[#this],
+ member-type-params=[T]
+ */
+ @patch
+ int instanceMethod() => 42;
+
+ /*member: GenericExtension|genericInstanceMethod:
+ builder-name=genericInstanceMethod,
+ builder-params=[#this,t],
+ builder-type-params=[T,T],
+ member-name=GenericExtension|genericInstanceMethod,
+ member-params=[#this,t],
+ member-type-params=[#T,T]
+ */
+ @patch
+ T genericInstanceMethod<T>(T t) => t;
+
+ /*member: GenericExtension|staticMethod:
+ builder-name=staticMethod,
+ member-name=GenericExtension|staticMethod
+ */
+ @patch
+ static int staticMethod() => 87;
+
+ /*member: GenericExtension|genericStaticMethod:
+ builder-name=genericStaticMethod,
+ builder-params=[t],
+ builder-type-params=[T],
+ member-name=GenericExtension|genericStaticMethod,
+ member-params=[t],
+ member-type-params=[T]
+ */
+ @patch
+ static T genericStaticMethod<T>(T t) => t;
+
+ /*member: GenericExtension|get#instanceProperty:
+ builder-name=instanceProperty,
+ builder-params=[#this],
+ builder-type-params=[T],
+ member-name=GenericExtension|get#instanceProperty,
+ member-params=[#this],
+ member-type-params=[T]
+ */
+ @patch
+ int get instanceProperty => 123;
+
+ /*member: GenericExtension|set#instanceProperty:
+ builder-name=instanceProperty,
+ builder-params=[#this,value],
+ builder-type-params=[T],
+ member-name=GenericExtension|set#instanceProperty,
+ member-params=[#this,value],
+ member-type-params=[T]
+ */
+ @patch
+ void set instanceProperty(int value) {}
+
+ /*member: GenericExtension|staticProperty:
+ builder-name=staticProperty,
+ member-name=GenericExtension|staticProperty
+ */
+ @patch
+ static int get staticProperty => 237;
+
+ /*member: GenericExtension|staticProperty=:
+ builder-name=staticProperty,
+ builder-params=[value],
+ member-name=GenericExtension|staticProperty=,
+ member-params=[value]
+ */
+ @patch
+ static void set staticProperty(int value) {}
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart
index 33e8fb4..880d249 100644
--- a/pkg/front_end/test/extensions/extensions_test.dart
+++ b/pkg/front_end/test/extensions/extensions_test.dart
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
import 'dart:io' show Directory, Platform;
+import 'package:front_end/src/api_prototype/experimental_flags.dart'
+ show ExperimentalFlag;
import 'package:front_end/src/fasta/builder/builder.dart';
import 'package:front_end/src/fasta/builder/extension_builder.dart';
import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
@@ -22,8 +24,11 @@
supportedMarkers: sharedMarkers,
createUriForFileName: createUriForFileName,
onFailure: onFailure,
- runTest: runTestFor(
- const ExtensionsDataComputer(), [cfeExtensionMethodsConfig]));
+ runTest: runTestFor(const ExtensionsDataComputer(), [
+ new TestConfig(cfeMarker, 'cfe with extension methods',
+ experimentalFlags: const {ExperimentalFlag.extensionMethods: true},
+ librariesSpecificationUri: createUriForFileName('libraries.json'))
+ ]));
}
class ExtensionsDataComputer extends DataComputer<Features> {
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
index 1908a65..c92c98e 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
@@ -8,6 +8,7 @@
import 'package:kernel/core_types.dart';
import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/testing/mock_sdk_component.dart';
+import 'package:kernel/type_environment.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -691,13 +692,17 @@
void test_unknown_at_bottom() {
var A = coreTypes.rawType(_addClass(_class('A')), Nullability.legacy);
var env = _makeEnv();
- expect(env.isSubtypeOf(unknownType, A), isTrue);
+ expect(
+ env.isSubtypeOf(unknownType, A, SubtypeCheckMode.ignoringNullabilities),
+ isTrue);
}
void test_unknown_at_top() {
var A = coreTypes.rawType(_addClass(_class('A')), Nullability.legacy);
var env = _makeEnv();
- expect(env.isSubtypeOf(A, unknownType), isTrue);
+ expect(
+ env.isSubtypeOf(A, unknownType, SubtypeCheckMode.ignoringNullabilities),
+ isTrue);
}
Class _addClass(Class c) {
diff --git a/pkg/front_end/test/fasta/types/fasta_types_test.dart b/pkg/front_end/test/fasta/types/fasta_types_test.dart
index f4dc886..5d3659ad 100644
--- a/pkg/front_end/test/fasta/types/fasta_types_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_types_test.dart
@@ -26,6 +26,7 @@
show ClassHierarchyBuilder, ClassBuilder;
import "package:front_end/src/fasta/ticker.dart" show Ticker;
+import 'package:kernel/type_environment.dart';
import "kernel_type_parser.dart" show KernelEnvironment, KernelFromParsedType;
@@ -73,7 +74,8 @@
}
bool isSubtypeImpl(DartType subtype, DartType supertype) {
- return hierarchy.types.isSubtypeOfKernel(subtype, supertype);
+ return hierarchy.types.isSubtypeOfKernel(
+ subtype, supertype, SubtypeCheckMode.ignoringNullabilities);
}
KernelEnvironment extend(String typeParameters) {
diff --git a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
index c8af98e..d03b95d 100644
--- a/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
+++ b/pkg/front_end/test/fasta/types/kernel_type_parser_test.dart
@@ -12,7 +12,8 @@
import "package:kernel/text/ast_to_text.dart" show Printer;
-import "package:kernel/type_environment.dart" show TypeEnvironment;
+import "package:kernel/type_environment.dart"
+ show SubtypeCheckMode, TypeEnvironment;
import "kernel_type_parser.dart"
show KernelEnvironment, KernelFromParsedType, parseLibrary;
@@ -42,7 +43,7 @@
typedef Typedef<T extends self::Object* = dynamic> = <S extends self::Object* = dynamic>(T*) →* S*;
typedef VoidFunction = () →* void;
-typedef TestDefaultTypes = () →* self::DefaultTypes<dynamic, self::Object, self::List<dynamic>*, self::List<self::Object>*, self::Comparable<dynamic>*, (<BottomType>) →* void, () →* self::Comparable<dynamic>*>;
+typedef TestDefaultTypes = () →* self::DefaultTypes<dynamic, self::Object, self::List<dynamic>, self::List<self::Object>, self::Comparable<dynamic>, (<BottomType>) → void, () → self::Comparable<dynamic>>;
typedef Id<T extends self::Object* = dynamic> = T*;
typedef TestSorting = ({a: self::int, b: self::int, c: self::int}) →* void;
class Object {
@@ -71,13 +72,13 @@
}
class bool extends self::Object {
}
-class DefaultTypes<S extends self::Object* = dynamic, T extends self::Object = self::Object, U extends self::List<self::DefaultTypes::S*> = self::List<dynamic>*, V extends self::List<self::DefaultTypes::T> = self::List<self::Object>*, W extends self::Comparable<self::DefaultTypes::W> = self::Comparable<dynamic>*, X extends (self::DefaultTypes::W) → void = (<BottomType>) →* void, Y extends () → self::DefaultTypes::W = () →* self::Comparable<dynamic>*> extends self::Object {
+class DefaultTypes<S extends self::Object* = dynamic, T extends self::Object = self::Object, U extends self::List<self::DefaultTypes::S*> = self::List<dynamic>, V extends self::List<self::DefaultTypes::T> = self::List<self::Object>, W extends self::Comparable<self::DefaultTypes::W> = self::Comparable<dynamic>, X extends (self::DefaultTypes::W) → void = (<BottomType>) → void, Y extends () → self::DefaultTypes::W = () → self::Comparable<dynamic>> extends self::Object {
}
class Super extends self::Object implements self::Comparable<self::Sub> {
}
class Sub extends self::Super {
}
-class FBound<T extends self::FBound<self::FBound::T> = self::FBound<dynamic>*> extends self::Object {
+class FBound<T extends self::FBound<self::FBound::T> = self::FBound<dynamic>> extends self::Object {
}
class MixinApplication = self::Object with self::FBound<self::MixinApplication> {
}
@@ -119,8 +120,8 @@
}
bool isSubtypeImpl(DartType subtype, DartType supertype) {
- return new TypeEnvironment(coreTypes, hierarchy)
- .isSubtypeOf(subtype, supertype);
+ return new TypeEnvironment(coreTypes, hierarchy).isSubtypeOf(
+ subtype, supertype, SubtypeCheckMode.ignoringNullabilities);
}
KernelEnvironment extend(String typeParameters) {
diff --git a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
index dc3e3f8..c46d75a 100644
--- a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
+++ b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
@@ -14,7 +14,8 @@
import "package:kernel/target/targets.dart" show NoneTarget, TargetFlags;
-import "package:kernel/type_environment.dart" show TypeEnvironment;
+import "package:kernel/type_environment.dart"
+ show SubtypeCheckMode, TypeEnvironment;
import "kernel_type_parser.dart"
show KernelEnvironment, KernelFromParsedType, parseLibrary;
@@ -101,7 +102,8 @@
void performChecks(List<SubtypeCheck> checks, TypeEnvironment environment) {
for (int i = 0; i < checks.length; i++) {
SubtypeCheck check = checks[i];
- bool isSubtype = environment.isSubtypeOf(check.s, check.t);
+ bool isSubtype = environment.isSubtypeOf(
+ check.s, check.t, SubtypeCheckMode.ignoringNullabilities);
if (isSubtype != check.isSubtype) {
throw "Check failed: $check";
}
@@ -112,7 +114,8 @@
List<SubtypeCheck> checks, ClassHierarchyBuilder hierarchy) {
for (int i = 0; i < checks.length; i++) {
SubtypeCheck check = checks[i];
- bool isSubtype = hierarchy.types.isSubtypeOfKernel(check.s, check.t);
+ bool isSubtype = hierarchy.types.isSubtypeOfKernel(
+ check.s, check.t, SubtypeCheckMode.ignoringNullabilities);
if (isSubtype != check.isSubtype) {
throw "Check failed: $check";
}
diff --git a/pkg/front_end/test/id_testing/id_testing_test.dart b/pkg/front_end/test/id_testing/id_testing_test.dart
index 07d99ba..92a4fb5 100644
--- a/pkg/front_end/test/id_testing/id_testing_test.dart
+++ b/pkg/front_end/test/id_testing/id_testing_test.dart
@@ -58,7 +58,7 @@
Library library, Map<Id, ActualData<String>> actualMap,
{bool verbose}) {
new IdTestingDataExtractor(compilerResult, actualMap)
- .computeForLibrary(library, useFileUri: true);
+ .computeForLibrary(library);
}
@override
diff --git a/pkg/front_end/test/language_versioning/language_versioning_test.dart b/pkg/front_end/test/language_versioning/language_versioning_test.dart
index 691df94..a387f9a 100644
--- a/pkg/front_end/test/language_versioning/language_versioning_test.dart
+++ b/pkg/front_end/test/language_versioning/language_versioning_test.dart
@@ -52,7 +52,7 @@
Library library, Map<Id, ActualData<String>> actualMap,
{bool verbose}) {
new LanguageVersioningDataExtractor(compilerResult, actualMap)
- .computeForLibrary(library, useFileUri: true);
+ .computeForLibrary(library);
}
@override
diff --git a/pkg/front_end/test/parser_test.dart b/pkg/front_end/test/parser_test.dart
index 3c6cffb..9daee4d 100644
--- a/pkg/front_end/test/parser_test.dart
+++ b/pkg/front_end/test/parser_test.dart
@@ -31,6 +31,8 @@
import 'parser_test_listener.dart' show ParserTestListener;
+import 'parser_test_parser.dart' show TestParser;
+
const String EXPECTATIONS = '''
[
{
@@ -58,17 +60,18 @@
Context(this.updateExpectations);
final List<Step> steps = const <Step>[
- const ParserStep(),
+ const ListenerStep(),
+ const IntertwinedStep(),
];
final ExpectationSet expectationSet =
new ExpectationSet.fromJsonList(jsonDecode(EXPECTATIONS));
}
-class ParserStep extends Step<TestDescription, TestDescription, Context> {
- const ParserStep();
+class ListenerStep extends Step<TestDescription, TestDescription, Context> {
+ const ListenerStep();
- String get name => "parser";
+ String get name => "listener";
Future<Result<TestDescription>> run(
TestDescription description, Context context) async {
@@ -94,3 +97,43 @@
".expect", "${parserTestListener.sb}", description.uri, description);
}
}
+
+class IntertwinedStep extends Step<TestDescription, TestDescription, Context> {
+ const IntertwinedStep();
+
+ String get name => "intertwined";
+
+ Future<Result<TestDescription>> run(
+ TestDescription description, Context context) async {
+ File f = new File.fromUri(description.uri);
+ List<int> rawBytes = f.readAsBytesSync();
+
+ Uint8List bytes = new Uint8List(rawBytes.length + 1);
+ bytes.setRange(0, rawBytes.length, rawBytes);
+
+ Utf8BytesScanner scanner =
+ new Utf8BytesScanner(bytes, includeComments: true);
+ Token firstToken = scanner.tokenize();
+
+ if (firstToken == null) {
+ return crash(description, StackTrace.current);
+ }
+
+ ParserTestListener2 parserTestListener = new ParserTestListener2();
+ TestParser parser = new TestParser(parserTestListener);
+ parserTestListener.parser = parser;
+ parser.sb = parserTestListener.sb;
+ parser.parseUnit(firstToken);
+
+ return context.match<TestDescription>(
+ ".intertwined.expect", "${parser.sb}", description.uri, description);
+ }
+}
+
+class ParserTestListener2 extends ParserTestListener {
+ TestParser parser;
+
+ void doPrint(String s) {
+ sb.writeln((" " * parser.indent) + "listener: " + s);
+ }
+}
diff --git a/pkg/front_end/test/parser_test_listener_creator.dart b/pkg/front_end/test/parser_test_listener_creator.dart
index 1d625bf..35851e7 100644
--- a/pkg/front_end/test/parser_test_listener_creator.dart
+++ b/pkg/front_end/test/parser_test_listener_creator.dart
@@ -11,8 +11,17 @@
import 'package:front_end/src/fasta/parser/member_kind.dart';
import 'package:front_end/src/fasta/scanner/utf8_bytes_scanner.dart';
import 'package:front_end/src/scanner/token.dart';
+import 'package:dart_style/dart_style.dart' show DartFormatter;
-main() {
+StringSink out;
+
+main(List<String> args) {
+ if (args.contains("--stdout")) {
+ out = stdout;
+ } else {
+ out = new StringBuffer();
+ }
+
File f = new File.fromUri(
Platform.script.resolve("../lib/src/fasta/parser/listener.dart"));
List<int> rawBytes = f.readAsBytesSync();
@@ -23,7 +32,7 @@
Utf8BytesScanner scanner = new Utf8BytesScanner(bytes, includeComments: true);
Token firstToken = scanner.tokenize();
- print("""
+ out.write("""
// Copyright (c) 2019, 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.
@@ -47,15 +56,17 @@
void doPrint(String s) {
sb.writeln((" " * indent) + s);
}
- """);
+""");
ParserCreatorListener listener = new ParserCreatorListener();
ClassMemberParser parser = new ClassMemberParser(listener);
parser.parseUnit(firstToken);
- print("""
+ out.writeln("}");
+
+ if (out is StringBuffer) {
+ stdout.write(new DartFormatter().format("$out"));
}
- """);
}
class ParserCreatorListener extends Listener {
@@ -79,13 +90,14 @@
void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
Token beginInitializers, Token endToken) {
if (insideListenerClass) {
+ out.write(" ");
Token token = beginToken;
Token latestToken;
while (true) {
if (latestToken != null && latestToken.charEnd < token.charOffset) {
- stdout.write(" ");
+ out.write(" ");
}
- stdout.write(token.lexeme);
+ out.write(token.lexeme);
if ((token is BeginToken &&
token.type == TokenType.OPEN_CURLY_BRACKET) ||
token is SimpleToken && token.type == TokenType.FUNCTION) {
@@ -99,29 +111,29 @@
}
if (token is SimpleToken && token.type == TokenType.FUNCTION) {
- stdout.write(" null;");
+ out.write(" null;");
} else {
- stdout.write("\n");
+ out.write("\n ");
if (currentMethodName.startsWith("end")) {
- stdout.write("indent--;\n");
+ out.write("indent--;\n ");
}
- stdout.write("doPrint('$currentMethodName(");
+ out.write("doPrint('$currentMethodName(");
String separator = "";
for (int i = 0; i < parameters.length; i++) {
- stdout.write(separator);
- stdout.write(r"''$");
- stdout.write(parameters[i]);
+ out.write(separator);
+ out.write(r"' '$");
+ out.write(parameters[i]);
separator = ", ";
}
- stdout.write(")');\n");
+ out.write(")');\n ");
if (currentMethodName.startsWith("begin")) {
- stdout.write("indent++;\n");
+ out.write(" indent++;\n ");
}
- stdout.write("}");
+ out.write("}");
}
- stdout.write("\n\n");
+ out.write("\n\n");
}
parameters.clear();
currentMethodName = null;
diff --git a/pkg/front_end/test/parser_test_parser.dart b/pkg/front_end/test/parser_test_parser.dart
new file mode 100644
index 0000000..6d87b69
--- /dev/null
+++ b/pkg/front_end/test/parser_test_parser.dart
@@ -0,0 +1,2091 @@
+// Copyright (c) 2019, 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/fasta/parser/listener.dart' show Listener;
+import 'package:front_end/src/fasta/parser/parser.dart' show Parser;
+import 'package:front_end/src/scanner/token.dart';
+import 'package:front_end/src/fasta/fasta_codes.dart';
+import 'package:front_end/src/fasta/scanner.dart';
+import 'package:front_end/src/fasta/parser/assert.dart';
+import 'package:front_end/src/fasta/parser/declaration_kind.dart';
+import 'package:front_end/src/fasta/parser/directive_context.dart';
+import 'package:front_end/src/fasta/parser/formal_parameter_kind.dart';
+import 'package:front_end/src/fasta/parser/identifier_context.dart';
+import 'package:front_end/src/fasta/parser/member_kind.dart';
+import 'package:front_end/src/fasta/parser/token_stream_rewriter.dart';
+import 'package:front_end/src/fasta/parser/type_info.dart';
+
+// THIS FILE IS AUTO GENERATED BY 'test/parser_test_parser_creator.dart'
+
+class TestParser extends Parser {
+ TestParser(Listener listener) : super(listener);
+
+ int indent = 0;
+ StringBuffer sb = new StringBuffer();
+
+ void doPrint(String s) {
+ sb.writeln((" " * indent) + s);
+ }
+
+ Uri get uri {
+ doPrint('uri()');
+ indent++;
+ var result = super.uri;
+ indent--;
+ return result;
+ }
+
+ TokenStreamRewriter get rewriter {
+ doPrint('rewriter()');
+ indent++;
+ var result = super.rewriter;
+ indent--;
+ return result;
+ }
+
+ bool get inGenerator {
+ doPrint('inGenerator()');
+ indent++;
+ var result = super.inGenerator;
+ indent--;
+ return result;
+ }
+
+ bool get inAsync {
+ doPrint('inAsync()');
+ indent++;
+ var result = super.inAsync;
+ indent--;
+ return result;
+ }
+
+ bool get inPlainSync {
+ doPrint('inPlainSync()');
+ indent++;
+ var result = super.inPlainSync;
+ indent--;
+ return result;
+ }
+
+ bool get isBreakAllowed {
+ doPrint('isBreakAllowed()');
+ indent++;
+ var result = super.isBreakAllowed;
+ indent--;
+ return result;
+ }
+
+ bool get isContinueAllowed {
+ doPrint('isContinueAllowed()');
+ indent++;
+ var result = super.isContinueAllowed;
+ indent--;
+ return result;
+ }
+
+ bool get isContinueWithLabelAllowed {
+ doPrint('isContinueWithLabelAllowed()');
+ indent++;
+ var result = super.isContinueWithLabelAllowed;
+ indent--;
+ return result;
+ }
+
+ Token parseUnit(Token token) {
+ doPrint('parseUnit(' '$token)');
+ indent++;
+ var result = super.parseUnit(token);
+ indent--;
+ return result;
+ }
+
+ Token parseDirectives(Token token) {
+ doPrint('parseDirectives(' '$token)');
+ indent++;
+ var result = super.parseDirectives(token);
+ indent--;
+ return result;
+ }
+
+ Token parseTopLevelDeclaration(Token token) {
+ doPrint('parseTopLevelDeclaration(' '$token)');
+ indent++;
+ var result = super.parseTopLevelDeclaration(token);
+ indent--;
+ return result;
+ }
+
+ Token parseTopLevelDeclarationImpl(
+ Token token, DirectiveContext directiveState) {
+ doPrint('parseTopLevelDeclarationImpl(' '$token, ' '$directiveState)');
+ indent++;
+ var result = super.parseTopLevelDeclarationImpl(token, directiveState);
+ indent--;
+ return result;
+ }
+
+ Token parseClassDeclarationModifiers(Token start, Token keyword) {
+ doPrint('parseClassDeclarationModifiers(' '$start, ' '$keyword)');
+ indent++;
+ var result = super.parseClassDeclarationModifiers(start, keyword);
+ indent--;
+ return result;
+ }
+
+ void parseTopLevelKeywordModifiers(Token start, Token keyword) {
+ doPrint('parseTopLevelKeywordModifiers(' '$start, ' '$keyword)');
+ indent++;
+ var result = super.parseTopLevelKeywordModifiers(start, keyword);
+ indent--;
+ return result;
+ }
+
+ void reportTopLevelModifierError(Token modifier, Token afterModifiers) {
+ doPrint('reportTopLevelModifierError(' '$modifier, ' '$afterModifiers)');
+ indent++;
+ var result = super.reportTopLevelModifierError(modifier, afterModifiers);
+ indent--;
+ return result;
+ }
+
+ Token parseTopLevelKeywordDeclaration(
+ Token start, Token keyword, DirectiveContext directiveState) {
+ doPrint('parseTopLevelKeywordDeclaration('
+ '$start, '
+ '$keyword, '
+ '$directiveState)');
+ indent++;
+ var result =
+ super.parseTopLevelKeywordDeclaration(start, keyword, directiveState);
+ indent--;
+ return result;
+ }
+
+ Token parseLibraryName(Token libraryKeyword) {
+ doPrint('parseLibraryName(' '$libraryKeyword)');
+ indent++;
+ var result = super.parseLibraryName(libraryKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseImportPrefixOpt(Token token) {
+ doPrint('parseImportPrefixOpt(' '$token)');
+ indent++;
+ var result = super.parseImportPrefixOpt(token);
+ indent--;
+ return result;
+ }
+
+ Token parseImport(Token importKeyword) {
+ doPrint('parseImport(' '$importKeyword)');
+ indent++;
+ var result = super.parseImport(importKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseImportRecovery(Token token) {
+ doPrint('parseImportRecovery(' '$token)');
+ indent++;
+ var result = super.parseImportRecovery(token);
+ indent--;
+ return result;
+ }
+
+ Token parseConditionalUriStar(Token token) {
+ doPrint('parseConditionalUriStar(' '$token)');
+ indent++;
+ var result = super.parseConditionalUriStar(token);
+ indent--;
+ return result;
+ }
+
+ Token parseConditionalUri(Token token) {
+ doPrint('parseConditionalUri(' '$token)');
+ indent++;
+ var result = super.parseConditionalUri(token);
+ indent--;
+ return result;
+ }
+
+ Token parseDottedName(Token token) {
+ doPrint('parseDottedName(' '$token)');
+ indent++;
+ var result = super.parseDottedName(token);
+ indent--;
+ return result;
+ }
+
+ Token parseExport(Token exportKeyword) {
+ doPrint('parseExport(' '$exportKeyword)');
+ indent++;
+ var result = super.parseExport(exportKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseCombinatorStar(Token token) {
+ doPrint('parseCombinatorStar(' '$token)');
+ indent++;
+ var result = super.parseCombinatorStar(token);
+ indent--;
+ return result;
+ }
+
+ Token parseHide(Token token) {
+ doPrint('parseHide(' '$token)');
+ indent++;
+ var result = super.parseHide(token);
+ indent--;
+ return result;
+ }
+
+ Token parseShow(Token token) {
+ doPrint('parseShow(' '$token)');
+ indent++;
+ var result = super.parseShow(token);
+ indent--;
+ return result;
+ }
+
+ Token parseIdentifierList(Token token) {
+ doPrint('parseIdentifierList(' '$token)');
+ indent++;
+ var result = super.parseIdentifierList(token);
+ indent--;
+ return result;
+ }
+
+ Token parseTypeList(Token token) {
+ doPrint('parseTypeList(' '$token)');
+ indent++;
+ var result = super.parseTypeList(token);
+ indent--;
+ return result;
+ }
+
+ Token parsePartOrPartOf(Token partKeyword, DirectiveContext directiveState) {
+ doPrint('parsePartOrPartOf(' '$partKeyword, ' '$directiveState)');
+ indent++;
+ var result = super.parsePartOrPartOf(partKeyword, directiveState);
+ indent--;
+ return result;
+ }
+
+ Token parsePart(Token partKeyword) {
+ doPrint('parsePart(' '$partKeyword)');
+ indent++;
+ var result = super.parsePart(partKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parsePartOf(Token partKeyword) {
+ doPrint('parsePartOf(' '$partKeyword)');
+ indent++;
+ var result = super.parsePartOf(partKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseMetadataStar(Token token) {
+ doPrint('parseMetadataStar(' '$token)');
+ indent++;
+ var result = super.parseMetadataStar(token);
+ indent--;
+ return result;
+ }
+
+ Token parseMetadata(Token token) {
+ doPrint('parseMetadata(' '$token)');
+ indent++;
+ var result = super.parseMetadata(token);
+ indent--;
+ return result;
+ }
+
+ Token parseScript(Token token) {
+ doPrint('parseScript(' '$token)');
+ indent++;
+ var result = super.parseScript(token);
+ indent--;
+ return result;
+ }
+
+ Token parseTypedef(Token typedefKeyword) {
+ doPrint('parseTypedef(' '$typedefKeyword)');
+ indent++;
+ var result = super.parseTypedef(typedefKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseMixinApplicationRest(Token token) {
+ doPrint('parseMixinApplicationRest(' '$token)');
+ indent++;
+ var result = super.parseMixinApplicationRest(token);
+ indent--;
+ return result;
+ }
+
+ Token parseWithClauseOpt(Token token) {
+ doPrint('parseWithClauseOpt(' '$token)');
+ indent++;
+ var result = super.parseWithClauseOpt(token);
+ indent--;
+ return result;
+ }
+
+ Token parseGetterOrFormalParameters(
+ Token token, Token name, bool isGetter, MemberKind kind) {
+ doPrint('parseGetterOrFormalParameters('
+ '$token, '
+ '$name, '
+ '$isGetter, '
+ '$kind)');
+ indent++;
+ var result =
+ super.parseGetterOrFormalParameters(token, name, isGetter, kind);
+ indent--;
+ return result;
+ }
+
+ Token parseFormalParametersOpt(Token token, MemberKind kind) {
+ doPrint('parseFormalParametersOpt(' '$token, ' '$kind)');
+ indent++;
+ var result = super.parseFormalParametersOpt(token, kind);
+ indent--;
+ return result;
+ }
+
+ Token skipFormalParameters(Token token, MemberKind kind) {
+ doPrint('skipFormalParameters(' '$token, ' '$kind)');
+ indent++;
+ var result = super.skipFormalParameters(token, kind);
+ indent--;
+ return result;
+ }
+
+ Token skipFormalParametersRest(Token token, MemberKind kind) {
+ doPrint('skipFormalParametersRest(' '$token, ' '$kind)');
+ indent++;
+ var result = super.skipFormalParametersRest(token, kind);
+ indent--;
+ return result;
+ }
+
+ Token parseFormalParametersRequiredOpt(Token token, MemberKind kind) {
+ doPrint('parseFormalParametersRequiredOpt(' '$token, ' '$kind)');
+ indent++;
+ var result = super.parseFormalParametersRequiredOpt(token, kind);
+ indent--;
+ return result;
+ }
+
+ Token parseFormalParameters(Token token, MemberKind kind) {
+ doPrint('parseFormalParameters(' '$token, ' '$kind)');
+ indent++;
+ var result = super.parseFormalParameters(token, kind);
+ indent--;
+ return result;
+ }
+
+ Token parseFormalParametersRest(Token token, MemberKind kind) {
+ doPrint('parseFormalParametersRest(' '$token, ' '$kind)');
+ indent++;
+ var result = super.parseFormalParametersRest(token, kind);
+ indent--;
+ return result;
+ }
+
+ Message missingParameterMessage(MemberKind kind) {
+ doPrint('missingParameterMessage(' '$kind)');
+ indent++;
+ var result = super.missingParameterMessage(kind);
+ indent--;
+ return result;
+ }
+
+ Token parseFormalParameter(
+ Token token, FormalParameterKind parameterKind, MemberKind memberKind) {
+ doPrint(
+ 'parseFormalParameter(' '$token, ' '$parameterKind, ' '$memberKind)');
+ indent++;
+ var result = super.parseFormalParameter(token, parameterKind, memberKind);
+ indent--;
+ return result;
+ }
+
+ Token parseOptionalPositionalParameters(Token token, MemberKind kind) {
+ doPrint('parseOptionalPositionalParameters(' '$token, ' '$kind)');
+ indent++;
+ var result = super.parseOptionalPositionalParameters(token, kind);
+ indent--;
+ return result;
+ }
+
+ Token parseOptionalNamedParameters(Token token, MemberKind kind) {
+ doPrint('parseOptionalNamedParameters(' '$token, ' '$kind)');
+ indent++;
+ var result = super.parseOptionalNamedParameters(token, kind);
+ indent--;
+ return result;
+ }
+
+ Token parseQualified(Token token, IdentifierContext context,
+ IdentifierContext continuationContext) {
+ doPrint('parseQualified(' '$token, ' '$context, ' '$continuationContext)');
+ indent++;
+ var result = super.parseQualified(token, context, continuationContext);
+ indent--;
+ return result;
+ }
+
+ Token parseQualifiedRestOpt(
+ Token token, IdentifierContext continuationContext) {
+ doPrint('parseQualifiedRestOpt(' '$token, ' '$continuationContext)');
+ indent++;
+ var result = super.parseQualifiedRestOpt(token, continuationContext);
+ indent--;
+ return result;
+ }
+
+ Token parseQualifiedRest(Token token, IdentifierContext context) {
+ doPrint('parseQualifiedRest(' '$token, ' '$context)');
+ indent++;
+ var result = super.parseQualifiedRest(token, context);
+ indent--;
+ return result;
+ }
+
+ Token skipBlock(Token token) {
+ doPrint('skipBlock(' '$token)');
+ indent++;
+ var result = super.skipBlock(token);
+ indent--;
+ return result;
+ }
+
+ Token parseEnum(Token enumKeyword) {
+ doPrint('parseEnum(' '$enumKeyword)');
+ indent++;
+ var result = super.parseEnum(enumKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseClassOrNamedMixinApplication(
+ Token abstractToken, Token classKeyword) {
+ doPrint('parseClassOrNamedMixinApplication('
+ '$abstractToken, '
+ '$classKeyword)');
+ indent++;
+ var result =
+ super.parseClassOrNamedMixinApplication(abstractToken, classKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseNamedMixinApplication(
+ Token token, Token begin, Token classKeyword) {
+ doPrint(
+ 'parseNamedMixinApplication(' '$token, ' '$begin, ' '$classKeyword)');
+ indent++;
+ var result = super.parseNamedMixinApplication(token, begin, classKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseClass(
+ Token token, Token begin, Token classKeyword, String className) {
+ doPrint(
+ 'parseClass(' '$token, ' '$begin, ' '$classKeyword, ' '$className)');
+ indent++;
+ var result = super.parseClass(token, begin, classKeyword, className);
+ indent--;
+ return result;
+ }
+
+ Token parseClassHeaderOpt(Token token, Token begin, Token classKeyword) {
+ doPrint('parseClassHeaderOpt(' '$token, ' '$begin, ' '$classKeyword)');
+ indent++;
+ var result = super.parseClassHeaderOpt(token, begin, classKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseClassHeaderRecovery(Token token, Token begin, Token classKeyword) {
+ doPrint('parseClassHeaderRecovery(' '$token, ' '$begin, ' '$classKeyword)');
+ indent++;
+ var result = super.parseClassHeaderRecovery(token, begin, classKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseClassExtendsOpt(Token token) {
+ doPrint('parseClassExtendsOpt(' '$token)');
+ indent++;
+ var result = super.parseClassExtendsOpt(token);
+ indent--;
+ return result;
+ }
+
+ Token parseClassOrMixinImplementsOpt(Token token) {
+ doPrint('parseClassOrMixinImplementsOpt(' '$token)');
+ indent++;
+ var result = super.parseClassOrMixinImplementsOpt(token);
+ indent--;
+ return result;
+ }
+
+ Token parseMixin(Token mixinKeyword) {
+ doPrint('parseMixin(' '$mixinKeyword)');
+ indent++;
+ var result = super.parseMixin(mixinKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseMixinHeaderOpt(Token token, Token mixinKeyword) {
+ doPrint('parseMixinHeaderOpt(' '$token, ' '$mixinKeyword)');
+ indent++;
+ var result = super.parseMixinHeaderOpt(token, mixinKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseMixinHeaderRecovery(
+ Token token, Token mixinKeyword, Token headerStart) {
+ doPrint('parseMixinHeaderRecovery('
+ '$token, '
+ '$mixinKeyword, '
+ '$headerStart)');
+ indent++;
+ var result =
+ super.parseMixinHeaderRecovery(token, mixinKeyword, headerStart);
+ indent--;
+ return result;
+ }
+
+ Token parseMixinOnOpt(Token token) {
+ doPrint('parseMixinOnOpt(' '$token)');
+ indent++;
+ var result = super.parseMixinOnOpt(token);
+ indent--;
+ return result;
+ }
+
+ Token parseMixinOn(Token token) {
+ doPrint('parseMixinOn(' '$token)');
+ indent++;
+ var result = super.parseMixinOn(token);
+ indent--;
+ return result;
+ }
+
+ Token parseExtension(Token extensionKeyword) {
+ doPrint('parseExtension(' '$extensionKeyword)');
+ indent++;
+ var result = super.parseExtension(extensionKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseStringPart(Token token) {
+ doPrint('parseStringPart(' '$token)');
+ indent++;
+ var result = super.parseStringPart(token);
+ indent--;
+ return result;
+ }
+
+ Token insertSyntheticIdentifier(Token token, IdentifierContext context,
+ {Message message, Token messageOnToken}) {
+ doPrint('insertSyntheticIdentifier('
+ '$token, '
+ '$context, '
+ 'message: $message, '
+ 'messageOnToken: $messageOnToken)');
+ indent++;
+ var result = super.insertSyntheticIdentifier(token, context,
+ message: message, messageOnToken: messageOnToken);
+ indent--;
+ return result;
+ }
+
+ Token ensureIdentifier(Token token, IdentifierContext context) {
+ doPrint('ensureIdentifier(' '$token, ' '$context)');
+ indent++;
+ var result = super.ensureIdentifier(token, context);
+ indent--;
+ return result;
+ }
+
+ bool notEofOrValue(String value, Token token) {
+ doPrint('notEofOrValue(' '$value, ' '$token)');
+ indent++;
+ var result = super.notEofOrValue(value, token);
+ indent--;
+ return result;
+ }
+
+ Token parseTypeVariablesOpt(Token token) {
+ doPrint('parseTypeVariablesOpt(' '$token)');
+ indent++;
+ var result = super.parseTypeVariablesOpt(token);
+ indent--;
+ return result;
+ }
+
+ Token parseTopLevelMember(Token token) {
+ doPrint('parseTopLevelMember(' '$token)');
+ indent++;
+ var result = super.parseTopLevelMember(token);
+ indent--;
+ return result;
+ }
+
+ Token parseTopLevelMemberImpl(Token token) {
+ doPrint('parseTopLevelMemberImpl(' '$token)');
+ indent++;
+ var result = super.parseTopLevelMemberImpl(token);
+ indent--;
+ return result;
+ }
+
+ Token parseFields(
+ Token beforeStart,
+ Token externalToken,
+ Token staticToken,
+ Token covariantToken,
+ Token lateToken,
+ Token varFinalOrConst,
+ Token beforeType,
+ TypeInfo typeInfo,
+ Token name,
+ DeclarationKind kind) {
+ doPrint('parseFields('
+ '$beforeStart, '
+ '$externalToken, '
+ '$staticToken, '
+ '$covariantToken, '
+ '$lateToken, '
+ '$varFinalOrConst, '
+ '$beforeType, '
+ '$typeInfo, '
+ '$name, '
+ '$kind)');
+ indent++;
+ var result = super.parseFields(
+ beforeStart,
+ externalToken,
+ staticToken,
+ covariantToken,
+ lateToken,
+ varFinalOrConst,
+ beforeType,
+ typeInfo,
+ name,
+ kind);
+ indent--;
+ return result;
+ }
+
+ Token parseTopLevelMethod(Token beforeStart, Token externalToken,
+ Token beforeType, TypeInfo typeInfo, Token getOrSet, Token name) {
+ doPrint('parseTopLevelMethod('
+ '$beforeStart, '
+ '$externalToken, '
+ '$beforeType, '
+ '$typeInfo, '
+ '$getOrSet, '
+ '$name)');
+ indent++;
+ var result = super.parseTopLevelMethod(
+ beforeStart, externalToken, beforeType, typeInfo, getOrSet, name);
+ indent--;
+ return result;
+ }
+
+ Token parseMethodTypeVar(Token name) {
+ doPrint('parseMethodTypeVar(' '$name)');
+ indent++;
+ var result = super.parseMethodTypeVar(name);
+ indent--;
+ return result;
+ }
+
+ Token parseFieldInitializerOpt(Token token, Token name, Token lateToken,
+ Token varFinalOrConst, DeclarationKind kind) {
+ doPrint('parseFieldInitializerOpt('
+ '$token, '
+ '$name, '
+ '$lateToken, '
+ '$varFinalOrConst, '
+ '$kind)');
+ indent++;
+ var result = super.parseFieldInitializerOpt(
+ token, name, lateToken, varFinalOrConst, kind);
+ indent--;
+ return result;
+ }
+
+ Token parseVariableInitializerOpt(Token token) {
+ doPrint('parseVariableInitializerOpt(' '$token)');
+ indent++;
+ var result = super.parseVariableInitializerOpt(token);
+ indent--;
+ return result;
+ }
+
+ Token parseInitializersOpt(Token token) {
+ doPrint('parseInitializersOpt(' '$token)');
+ indent++;
+ var result = super.parseInitializersOpt(token);
+ indent--;
+ return result;
+ }
+
+ Token parseInitializers(Token token) {
+ doPrint('parseInitializers(' '$token)');
+ indent++;
+ var result = super.parseInitializers(token);
+ indent--;
+ return result;
+ }
+
+ Token parseInitializer(Token token) {
+ doPrint('parseInitializer(' '$token)');
+ indent++;
+ var result = super.parseInitializer(token);
+ indent--;
+ return result;
+ }
+
+ Token parseSuperInitializerExpression(final Token start) {
+ doPrint('parseSuperInitializerExpression(' '$start)');
+ indent++;
+ var result = super.parseSuperInitializerExpression(start);
+ indent--;
+ return result;
+ }
+
+ Token parseInitializerExpressionRest(Token token) {
+ doPrint('parseInitializerExpressionRest(' '$token)');
+ indent++;
+ var result = super.parseInitializerExpressionRest(token);
+ indent--;
+ return result;
+ }
+
+ Token ensureBlock(Token token,
+ Template<Message Function(Token token)> template, String blockKind) {
+ doPrint('ensureBlock(' '$token, ' '$template, ' '$blockKind)');
+ indent++;
+ var result = super.ensureBlock(token, template, blockKind);
+ indent--;
+ return result;
+ }
+
+ Token insertBlock(Token token) {
+ doPrint('insertBlock(' '$token)');
+ indent++;
+ var result = super.insertBlock(token);
+ indent--;
+ return result;
+ }
+
+ Token ensureCloseParen(Token token, Token openParen) {
+ doPrint('ensureCloseParen(' '$token, ' '$openParen)');
+ indent++;
+ var result = super.ensureCloseParen(token, openParen);
+ indent--;
+ return result;
+ }
+
+ Token ensureColon(Token token) {
+ doPrint('ensureColon(' '$token)');
+ indent++;
+ var result = super.ensureColon(token);
+ indent--;
+ return result;
+ }
+
+ Token ensureLiteralString(Token token) {
+ doPrint('ensureLiteralString(' '$token)');
+ indent++;
+ var result = super.ensureLiteralString(token);
+ indent--;
+ return result;
+ }
+
+ Token ensureSemicolon(Token token) {
+ doPrint('ensureSemicolon(' '$token)');
+ indent++;
+ var result = super.ensureSemicolon(token);
+ indent--;
+ return result;
+ }
+
+ Token rewriteAndRecover(Token token, Message message, Token newToken) {
+ doPrint('rewriteAndRecover(' '$token, ' '$message, ' '$newToken)');
+ indent++;
+ var result = super.rewriteAndRecover(token, message, newToken);
+ indent--;
+ return result;
+ }
+
+ Token rewriteSquareBrackets(Token token) {
+ doPrint('rewriteSquareBrackets(' '$token)');
+ indent++;
+ var result = super.rewriteSquareBrackets(token);
+ indent--;
+ return result;
+ }
+
+ Token skipUnexpectedTokenOpt(Token token, List<String> expectedNext) {
+ doPrint('skipUnexpectedTokenOpt(' '$token, ' '$expectedNext)');
+ indent++;
+ var result = super.skipUnexpectedTokenOpt(token, expectedNext);
+ indent--;
+ return result;
+ }
+
+ Token parseNativeClause(Token token) {
+ doPrint('parseNativeClause(' '$token)');
+ indent++;
+ var result = super.parseNativeClause(token);
+ indent--;
+ return result;
+ }
+
+ Token skipClassOrMixinOrExtensionBody(Token token) {
+ doPrint('skipClassOrMixinOrExtensionBody(' '$token)');
+ indent++;
+ var result = super.skipClassOrMixinOrExtensionBody(token);
+ indent--;
+ return result;
+ }
+
+ Token parseClassOrMixinOrExtensionBody(
+ Token token, DeclarationKind kind, String enclosingDeclarationName) {
+ doPrint('parseClassOrMixinOrExtensionBody('
+ '$token, '
+ '$kind, '
+ '$enclosingDeclarationName)');
+ indent++;
+ var result = super.parseClassOrMixinOrExtensionBody(
+ token, kind, enclosingDeclarationName);
+ indent--;
+ return result;
+ }
+
+ bool isUnaryMinus(Token token) {
+ doPrint('isUnaryMinus(' '$token)');
+ indent++;
+ var result = super.isUnaryMinus(token);
+ indent--;
+ return result;
+ }
+
+ Token parseClassMember(Token token, String className) {
+ doPrint('parseClassMember(' '$token, ' '$className)');
+ indent++;
+ var result = super.parseClassMember(token, className);
+ indent--;
+ return result;
+ }
+
+ Token parseMixinMember(Token token, String mixinName) {
+ doPrint('parseMixinMember(' '$token, ' '$mixinName)');
+ indent++;
+ var result = super.parseMixinMember(token, mixinName);
+ indent--;
+ return result;
+ }
+
+ Token parseExtensionMember(Token token, String extensionName) {
+ doPrint('parseExtensionMember(' '$token, ' '$extensionName)');
+ indent++;
+ var result = super.parseExtensionMember(token, extensionName);
+ indent--;
+ return result;
+ }
+
+ Token parseClassOrMixinOrExtensionMemberImpl(
+ Token token, DeclarationKind kind, String enclosingDeclarationName) {
+ doPrint('parseClassOrMixinOrExtensionMemberImpl('
+ '$token, '
+ '$kind, '
+ '$enclosingDeclarationName)');
+ indent++;
+ var result = super.parseClassOrMixinOrExtensionMemberImpl(
+ token, kind, enclosingDeclarationName);
+ indent--;
+ return result;
+ }
+
+ Token parseMethod(
+ Token beforeStart,
+ Token externalToken,
+ Token staticToken,
+ Token covariantToken,
+ Token lateToken,
+ Token varFinalOrConst,
+ Token beforeType,
+ TypeInfo typeInfo,
+ Token getOrSet,
+ Token name,
+ DeclarationKind kind,
+ String enclosingDeclarationName) {
+ doPrint('parseMethod('
+ '$beforeStart, '
+ '$externalToken, '
+ '$staticToken, '
+ '$covariantToken, '
+ '$lateToken, '
+ '$varFinalOrConst, '
+ '$beforeType, '
+ '$typeInfo, '
+ '$getOrSet, '
+ '$name, '
+ '$kind, '
+ '$enclosingDeclarationName)');
+ indent++;
+ var result = super.parseMethod(
+ beforeStart,
+ externalToken,
+ staticToken,
+ covariantToken,
+ lateToken,
+ varFinalOrConst,
+ beforeType,
+ typeInfo,
+ getOrSet,
+ name,
+ kind,
+ enclosingDeclarationName);
+ indent--;
+ return result;
+ }
+
+ Token parseFactoryMethod(Token token, DeclarationKind kind, Token beforeStart,
+ Token externalToken, Token staticOrCovariant, Token varFinalOrConst) {
+ doPrint('parseFactoryMethod('
+ '$token, '
+ '$kind, '
+ '$beforeStart, '
+ '$externalToken, '
+ '$staticOrCovariant, '
+ '$varFinalOrConst)');
+ indent++;
+ var result = super.parseFactoryMethod(token, kind, beforeStart,
+ externalToken, staticOrCovariant, varFinalOrConst);
+ indent--;
+ return result;
+ }
+
+ Token parseOperatorName(Token token) {
+ doPrint('parseOperatorName(' '$token)');
+ indent++;
+ var result = super.parseOperatorName(token);
+ indent--;
+ return result;
+ }
+
+ Token parseFunctionExpression(Token token) {
+ doPrint('parseFunctionExpression(' '$token)');
+ indent++;
+ var result = super.parseFunctionExpression(token);
+ indent--;
+ return result;
+ }
+
+ Token parseFunctionLiteral(
+ Token start,
+ Token beforeName,
+ Token name,
+ TypeInfo typeInfo,
+ TypeParamOrArgInfo typeParam,
+ IdentifierContext context) {
+ doPrint('parseFunctionLiteral('
+ '$start, '
+ '$beforeName, '
+ '$name, '
+ '$typeInfo, '
+ '$typeParam, '
+ '$context)');
+ indent++;
+ var result = super.parseFunctionLiteral(
+ start, beforeName, name, typeInfo, typeParam, context);
+ indent--;
+ return result;
+ }
+
+ Token parseNamedFunctionRest(
+ Token beforeName, Token begin, Token formals, bool isFunctionExpression) {
+ doPrint('parseNamedFunctionRest('
+ '$beforeName, '
+ '$begin, '
+ '$formals, '
+ '$isFunctionExpression)');
+ indent++;
+ var result = super.parseNamedFunctionRest(
+ beforeName, begin, formals, isFunctionExpression);
+ indent--;
+ return result;
+ }
+
+ Token parseAsyncOptBody(
+ Token token, bool ofFunctionExpression, bool allowAbstract) {
+ doPrint('parseAsyncOptBody('
+ '$token, '
+ '$ofFunctionExpression, '
+ '$allowAbstract)');
+ indent++;
+ var result =
+ super.parseAsyncOptBody(token, ofFunctionExpression, allowAbstract);
+ indent--;
+ return result;
+ }
+
+ Token parseConstructorReference(Token token, [TypeParamOrArgInfo typeArg]) {
+ doPrint('parseConstructorReference(' '$token, ' '$typeArg)');
+ indent++;
+ var result = super.parseConstructorReference(token, typeArg);
+ indent--;
+ return result;
+ }
+
+ Token parseRedirectingFactoryBody(Token token) {
+ doPrint('parseRedirectingFactoryBody(' '$token)');
+ indent++;
+ var result = super.parseRedirectingFactoryBody(token);
+ indent--;
+ return result;
+ }
+
+ Token skipFunctionBody(Token token, bool isExpression, bool allowAbstract) {
+ doPrint('skipFunctionBody(' '$token, ' '$isExpression, ' '$allowAbstract)');
+ indent++;
+ var result = super.skipFunctionBody(token, isExpression, allowAbstract);
+ indent--;
+ return result;
+ }
+
+ Token parseFunctionBody(
+ Token token, bool ofFunctionExpression, bool allowAbstract) {
+ doPrint('parseFunctionBody('
+ '$token, '
+ '$ofFunctionExpression, '
+ '$allowAbstract)');
+ indent++;
+ var result =
+ super.parseFunctionBody(token, ofFunctionExpression, allowAbstract);
+ indent--;
+ return result;
+ }
+
+ Token parseExpressionFunctionBody(Token token, bool ofFunctionExpression) {
+ doPrint('parseExpressionFunctionBody(' '$token, ' '$ofFunctionExpression)');
+ indent++;
+ var result = super.parseExpressionFunctionBody(token, ofFunctionExpression);
+ indent--;
+ return result;
+ }
+
+ Token skipAsyncModifier(Token token) {
+ doPrint('skipAsyncModifier(' '$token)');
+ indent++;
+ var result = super.skipAsyncModifier(token);
+ indent--;
+ return result;
+ }
+
+ Token parseAsyncModifierOpt(Token token) {
+ doPrint('parseAsyncModifierOpt(' '$token)');
+ indent++;
+ var result = super.parseAsyncModifierOpt(token);
+ indent--;
+ return result;
+ }
+
+ Token parseStatement(Token token) {
+ doPrint('parseStatement(' '$token)');
+ indent++;
+ var result = super.parseStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseStatementX(Token token) {
+ doPrint('parseStatementX(' '$token)');
+ indent++;
+ var result = super.parseStatementX(token);
+ indent--;
+ return result;
+ }
+
+ Token parseYieldStatement(Token token) {
+ doPrint('parseYieldStatement(' '$token)');
+ indent++;
+ var result = super.parseYieldStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseReturnStatement(Token token) {
+ doPrint('parseReturnStatement(' '$token)');
+ indent++;
+ var result = super.parseReturnStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseLabel(Token token) {
+ doPrint('parseLabel(' '$token)');
+ indent++;
+ var result = super.parseLabel(token);
+ indent--;
+ return result;
+ }
+
+ Token parseLabeledStatement(Token token) {
+ doPrint('parseLabeledStatement(' '$token)');
+ indent++;
+ var result = super.parseLabeledStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseExpressionStatement(Token token) {
+ doPrint('parseExpressionStatement(' '$token)');
+ indent++;
+ var result = super.parseExpressionStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseExpression(Token token) {
+ doPrint('parseExpression(' '$token)');
+ indent++;
+ var result = super.parseExpression(token);
+ indent--;
+ return result;
+ }
+
+ Token parseExpressionWithoutCascade(Token token) {
+ doPrint('parseExpressionWithoutCascade(' '$token)');
+ indent++;
+ var result = super.parseExpressionWithoutCascade(token);
+ indent--;
+ return result;
+ }
+
+ Token parseConditionalExpressionRest(Token token) {
+ doPrint('parseConditionalExpressionRest(' '$token)');
+ indent++;
+ var result = super.parseConditionalExpressionRest(token);
+ indent--;
+ return result;
+ }
+
+ Token parsePrecedenceExpression(
+ Token token, int precedence, bool allowCascades) {
+ doPrint('parsePrecedenceExpression('
+ '$token, '
+ '$precedence, '
+ '$allowCascades)');
+ indent++;
+ var result =
+ super.parsePrecedenceExpression(token, precedence, allowCascades);
+ indent--;
+ return result;
+ }
+
+ Token parseCascadeExpression(Token token) {
+ doPrint('parseCascadeExpression(' '$token)');
+ indent++;
+ var result = super.parseCascadeExpression(token);
+ indent--;
+ return result;
+ }
+
+ Token parseUnaryExpression(Token token, bool allowCascades) {
+ doPrint('parseUnaryExpression(' '$token, ' '$allowCascades)');
+ indent++;
+ var result = super.parseUnaryExpression(token, allowCascades);
+ indent--;
+ return result;
+ }
+
+ Token parseArgumentOrIndexStar(Token token, TypeParamOrArgInfo typeArg) {
+ doPrint('parseArgumentOrIndexStar(' '$token, ' '$typeArg)');
+ indent++;
+ var result = super.parseArgumentOrIndexStar(token, typeArg);
+ indent--;
+ return result;
+ }
+
+ Token parsePrimary(Token token, IdentifierContext context) {
+ doPrint('parsePrimary(' '$token, ' '$context)');
+ indent++;
+ var result = super.parsePrimary(token, context);
+ indent--;
+ return result;
+ }
+
+ Token parseParenthesizedExpressionOrFunctionLiteral(Token token) {
+ doPrint('parseParenthesizedExpressionOrFunctionLiteral(' '$token)');
+ indent++;
+ var result = super.parseParenthesizedExpressionOrFunctionLiteral(token);
+ indent--;
+ return result;
+ }
+
+ Token ensureParenthesizedCondition(Token token) {
+ doPrint('ensureParenthesizedCondition(' '$token)');
+ indent++;
+ var result = super.ensureParenthesizedCondition(token);
+ indent--;
+ return result;
+ }
+
+ Token parseParenthesizedExpression(Token token) {
+ doPrint('parseParenthesizedExpression(' '$token)');
+ indent++;
+ var result = super.parseParenthesizedExpression(token);
+ indent--;
+ return result;
+ }
+
+ Token parseExpressionInParenthesis(Token token) {
+ doPrint('parseExpressionInParenthesis(' '$token)');
+ indent++;
+ var result = super.parseExpressionInParenthesis(token);
+ indent--;
+ return result;
+ }
+
+ Token parseExpressionInParenthesisRest(Token token) {
+ doPrint('parseExpressionInParenthesisRest(' '$token)');
+ indent++;
+ var result = super.parseExpressionInParenthesisRest(token);
+ indent--;
+ return result;
+ }
+
+ Token parseThisExpression(Token token, IdentifierContext context) {
+ doPrint('parseThisExpression(' '$token, ' '$context)');
+ indent++;
+ var result = super.parseThisExpression(token, context);
+ indent--;
+ return result;
+ }
+
+ Token parseSuperExpression(Token token, IdentifierContext context) {
+ doPrint('parseSuperExpression(' '$token, ' '$context)');
+ indent++;
+ var result = super.parseSuperExpression(token, context);
+ indent--;
+ return result;
+ }
+
+ Token parseLiteralListSuffix(Token token, Token constKeyword) {
+ doPrint('parseLiteralListSuffix(' '$token, ' '$constKeyword)');
+ indent++;
+ var result = super.parseLiteralListSuffix(token, constKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseLiteralSetOrMapSuffix(Token token, Token constKeyword) {
+ doPrint('parseLiteralSetOrMapSuffix(' '$token, ' '$constKeyword)');
+ indent++;
+ var result = super.parseLiteralSetOrMapSuffix(token, constKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseLiteralFunctionSuffix(Token token) {
+ doPrint('parseLiteralFunctionSuffix(' '$token)');
+ indent++;
+ var result = super.parseLiteralFunctionSuffix(token);
+ indent--;
+ return result;
+ }
+
+ Token parseLiteralListSetMapOrFunction(
+ final Token start, Token constKeyword) {
+ doPrint('parseLiteralListSetMapOrFunction(' '$start, ' '$constKeyword)');
+ indent++;
+ var result = super.parseLiteralListSetMapOrFunction(start, constKeyword);
+ indent--;
+ return result;
+ }
+
+ Token parseMapLiteralEntry(Token token) {
+ doPrint('parseMapLiteralEntry(' '$token)');
+ indent++;
+ var result = super.parseMapLiteralEntry(token);
+ indent--;
+ return result;
+ }
+
+ Token parseSendOrFunctionLiteral(Token token, IdentifierContext context) {
+ doPrint('parseSendOrFunctionLiteral(' '$token, ' '$context)');
+ indent++;
+ var result = super.parseSendOrFunctionLiteral(token, context);
+ indent--;
+ return result;
+ }
+
+ Token ensureArguments(Token token) {
+ doPrint('ensureArguments(' '$token)');
+ indent++;
+ var result = super.ensureArguments(token);
+ indent--;
+ return result;
+ }
+
+ Token parseConstructorInvocationArguments(Token token) {
+ doPrint('parseConstructorInvocationArguments(' '$token)');
+ indent++;
+ var result = super.parseConstructorInvocationArguments(token);
+ indent--;
+ return result;
+ }
+
+ Token parseNewExpression(Token token) {
+ doPrint('parseNewExpression(' '$token)');
+ indent++;
+ var result = super.parseNewExpression(token);
+ indent--;
+ return result;
+ }
+
+ Token parseImplicitCreationExpression(
+ Token token, TypeParamOrArgInfo typeArg) {
+ doPrint('parseImplicitCreationExpression(' '$token, ' '$typeArg)');
+ indent++;
+ var result = super.parseImplicitCreationExpression(token, typeArg);
+ indent--;
+ return result;
+ }
+
+ Token parseConstExpression(Token token) {
+ doPrint('parseConstExpression(' '$token)');
+ indent++;
+ var result = super.parseConstExpression(token);
+ indent--;
+ return result;
+ }
+
+ Token parseLiteralInt(Token token) {
+ doPrint('parseLiteralInt(' '$token)');
+ indent++;
+ var result = super.parseLiteralInt(token);
+ indent--;
+ return result;
+ }
+
+ Token parseLiteralDouble(Token token) {
+ doPrint('parseLiteralDouble(' '$token)');
+ indent++;
+ var result = super.parseLiteralDouble(token);
+ indent--;
+ return result;
+ }
+
+ Token parseLiteralString(Token token) {
+ doPrint('parseLiteralString(' '$token)');
+ indent++;
+ var result = super.parseLiteralString(token);
+ indent--;
+ return result;
+ }
+
+ Token parseLiteralSymbol(Token token) {
+ doPrint('parseLiteralSymbol(' '$token)');
+ indent++;
+ var result = super.parseLiteralSymbol(token);
+ indent--;
+ return result;
+ }
+
+ Token parseSingleLiteralString(Token token) {
+ doPrint('parseSingleLiteralString(' '$token)');
+ indent++;
+ var result = super.parseSingleLiteralString(token);
+ indent--;
+ return result;
+ }
+
+ Token parseIdentifierExpression(Token token) {
+ doPrint('parseIdentifierExpression(' '$token)');
+ indent++;
+ var result = super.parseIdentifierExpression(token);
+ indent--;
+ return result;
+ }
+
+ Token parseLiteralBool(Token token) {
+ doPrint('parseLiteralBool(' '$token)');
+ indent++;
+ var result = super.parseLiteralBool(token);
+ indent--;
+ return result;
+ }
+
+ Token parseLiteralNull(Token token) {
+ doPrint('parseLiteralNull(' '$token)');
+ indent++;
+ var result = super.parseLiteralNull(token);
+ indent--;
+ return result;
+ }
+
+ Token parseSend(Token token, IdentifierContext context) {
+ doPrint('parseSend(' '$token, ' '$context)');
+ indent++;
+ var result = super.parseSend(token, context);
+ indent--;
+ return result;
+ }
+
+ Token skipArgumentsOpt(Token token) {
+ doPrint('skipArgumentsOpt(' '$token)');
+ indent++;
+ var result = super.skipArgumentsOpt(token);
+ indent--;
+ return result;
+ }
+
+ Token parseArgumentsOpt(Token token) {
+ doPrint('parseArgumentsOpt(' '$token)');
+ indent++;
+ var result = super.parseArgumentsOpt(token);
+ indent--;
+ return result;
+ }
+
+ Token parseArguments(Token token) {
+ doPrint('parseArguments(' '$token)');
+ indent++;
+ var result = super.parseArguments(token);
+ indent--;
+ return result;
+ }
+
+ Token parseArgumentsRest(Token token) {
+ doPrint('parseArgumentsRest(' '$token)');
+ indent++;
+ var result = super.parseArgumentsRest(token);
+ indent--;
+ return result;
+ }
+
+ Token parseIsOperatorRest(Token token) {
+ doPrint('parseIsOperatorRest(' '$token)');
+ indent++;
+ var result = super.parseIsOperatorRest(token);
+ indent--;
+ return result;
+ }
+
+ TypeInfo computeTypeAfterIsOrAs(Token token) {
+ doPrint('computeTypeAfterIsOrAs(' '$token)');
+ indent++;
+ var result = super.computeTypeAfterIsOrAs(token);
+ indent--;
+ return result;
+ }
+
+ Token parseAsOperatorRest(Token token) {
+ doPrint('parseAsOperatorRest(' '$token)');
+ indent++;
+ var result = super.parseAsOperatorRest(token);
+ indent--;
+ return result;
+ }
+
+ Token skipChainedAsIsOperators(Token token) {
+ doPrint('skipChainedAsIsOperators(' '$token)');
+ indent++;
+ var result = super.skipChainedAsIsOperators(token);
+ indent--;
+ return result;
+ }
+
+ bool looksLikeLocalFunction(Token token) {
+ doPrint('looksLikeLocalFunction(' '$token)');
+ indent++;
+ var result = super.looksLikeLocalFunction(token);
+ indent--;
+ return result;
+ }
+
+ bool looksLikeFunctionBody(Token token) {
+ doPrint('looksLikeFunctionBody(' '$token)');
+ indent++;
+ var result = super.looksLikeFunctionBody(token);
+ indent--;
+ return result;
+ }
+
+ Token parseExpressionStatementOrConstDeclaration(final Token start) {
+ doPrint('parseExpressionStatementOrConstDeclaration(' '$start)');
+ indent++;
+ var result = super.parseExpressionStatementOrConstDeclaration(start);
+ indent--;
+ return result;
+ }
+
+ Token parseExpressionStatementOrDeclaration(final Token start,
+ [bool onlyParseVariableDeclarationStart = false]) {
+ doPrint('parseExpressionStatementOrDeclaration('
+ '$start, '
+ '$onlyParseVariableDeclarationStart)');
+ indent++;
+ var result = super.parseExpressionStatementOrDeclaration(
+ start, onlyParseVariableDeclarationStart);
+ indent--;
+ return result;
+ }
+
+ Token parseExpressionStatementOrDeclarationAfterModifiers(
+ final Token beforeType,
+ final Token start,
+ final Token lateToken,
+ Token varFinalOrConst,
+ TypeInfo typeInfo,
+ bool onlyParseVariableDeclarationStart) {
+ doPrint('parseExpressionStatementOrDeclarationAfterModifiers('
+ '$beforeType, '
+ '$start, '
+ '$lateToken, '
+ '$varFinalOrConst, '
+ '$typeInfo, '
+ '$onlyParseVariableDeclarationStart)');
+ indent++;
+ var result = super.parseExpressionStatementOrDeclarationAfterModifiers(
+ beforeType,
+ start,
+ lateToken,
+ varFinalOrConst,
+ typeInfo,
+ onlyParseVariableDeclarationStart);
+ indent--;
+ return result;
+ }
+
+ Token parseVariablesDeclarationRest(Token token, bool endWithSemicolon) {
+ doPrint('parseVariablesDeclarationRest(' '$token, ' '$endWithSemicolon)');
+ indent++;
+ var result = super.parseVariablesDeclarationRest(token, endWithSemicolon);
+ indent--;
+ return result;
+ }
+
+ Token parseOptionallyInitializedIdentifier(Token token) {
+ doPrint('parseOptionallyInitializedIdentifier(' '$token)');
+ indent++;
+ var result = super.parseOptionallyInitializedIdentifier(token);
+ indent--;
+ return result;
+ }
+
+ Token parseIfStatement(Token token) {
+ doPrint('parseIfStatement(' '$token)');
+ indent++;
+ var result = super.parseIfStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseForStatement(Token token, Token awaitToken) {
+ doPrint('parseForStatement(' '$token, ' '$awaitToken)');
+ indent++;
+ var result = super.parseForStatement(token, awaitToken);
+ indent--;
+ return result;
+ }
+
+ Token parseForLoopPartsStart(Token awaitToken, Token forToken) {
+ doPrint('parseForLoopPartsStart(' '$awaitToken, ' '$forToken)');
+ indent++;
+ var result = super.parseForLoopPartsStart(awaitToken, forToken);
+ indent--;
+ return result;
+ }
+
+ Token parseForLoopPartsMid(Token token, Token awaitToken, Token forToken) {
+ doPrint('parseForLoopPartsMid(' '$token, ' '$awaitToken, ' '$forToken)');
+ indent++;
+ var result = super.parseForLoopPartsMid(token, awaitToken, forToken);
+ indent--;
+ return result;
+ }
+
+ Token parseForRest(Token awaitToken, Token token, Token forToken) {
+ doPrint('parseForRest(' '$awaitToken, ' '$token, ' '$forToken)');
+ indent++;
+ var result = super.parseForRest(awaitToken, token, forToken);
+ indent--;
+ return result;
+ }
+
+ Token parseForLoopPartsRest(Token token, Token forToken, Token awaitToken) {
+ doPrint('parseForLoopPartsRest(' '$token, ' '$forToken, ' '$awaitToken)');
+ indent++;
+ var result = super.parseForLoopPartsRest(token, forToken, awaitToken);
+ indent--;
+ return result;
+ }
+
+ Token parseForInRest(
+ Token token, Token awaitToken, Token forToken, Token identifier) {
+ doPrint('parseForInRest('
+ '$token, '
+ '$awaitToken, '
+ '$forToken, '
+ '$identifier)');
+ indent++;
+ var result = super.parseForInRest(token, awaitToken, forToken, identifier);
+ indent--;
+ return result;
+ }
+
+ Token parseForInLoopPartsRest(
+ Token token, Token awaitToken, Token forToken, Token identifier) {
+ doPrint('parseForInLoopPartsRest('
+ '$token, '
+ '$awaitToken, '
+ '$forToken, '
+ '$identifier)');
+ indent++;
+ var result =
+ super.parseForInLoopPartsRest(token, awaitToken, forToken, identifier);
+ indent--;
+ return result;
+ }
+
+ Token parseWhileStatement(Token token) {
+ doPrint('parseWhileStatement(' '$token)');
+ indent++;
+ var result = super.parseWhileStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseDoWhileStatement(Token token) {
+ doPrint('parseDoWhileStatement(' '$token)');
+ indent++;
+ var result = super.parseDoWhileStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseBlock(Token token, String blockKind) {
+ doPrint('parseBlock(' '$token, ' '$blockKind)');
+ indent++;
+ var result = super.parseBlock(token, blockKind);
+ indent--;
+ return result;
+ }
+
+ Token parseInvalidBlock(Token token) {
+ doPrint('parseInvalidBlock(' '$token)');
+ indent++;
+ var result = super.parseInvalidBlock(token);
+ indent--;
+ return result;
+ }
+
+ bool looksLikeAwaitExpression(Token token) {
+ doPrint('looksLikeAwaitExpression(' '$token)');
+ indent++;
+ var result = super.looksLikeAwaitExpression(token);
+ indent--;
+ return result;
+ }
+
+ Token parseAwaitExpression(Token token, bool allowCascades) {
+ doPrint('parseAwaitExpression(' '$token, ' '$allowCascades)');
+ indent++;
+ var result = super.parseAwaitExpression(token, allowCascades);
+ indent--;
+ return result;
+ }
+
+ Token parseThrowExpression(Token token, bool allowCascades) {
+ doPrint('parseThrowExpression(' '$token, ' '$allowCascades)');
+ indent++;
+ var result = super.parseThrowExpression(token, allowCascades);
+ indent--;
+ return result;
+ }
+
+ Token parseRethrowStatement(Token token) {
+ doPrint('parseRethrowStatement(' '$token)');
+ indent++;
+ var result = super.parseRethrowStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseTryStatement(Token token) {
+ doPrint('parseTryStatement(' '$token)');
+ indent++;
+ var result = super.parseTryStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseSwitchStatement(Token token) {
+ doPrint('parseSwitchStatement(' '$token)');
+ indent++;
+ var result = super.parseSwitchStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseSwitchBlock(Token token) {
+ doPrint('parseSwitchBlock(' '$token)');
+ indent++;
+ var result = super.parseSwitchBlock(token);
+ indent--;
+ return result;
+ }
+
+ Token peekPastLabels(Token token) {
+ doPrint('peekPastLabels(' '$token)');
+ indent++;
+ var result = super.peekPastLabels(token);
+ indent--;
+ return result;
+ }
+
+ Token parseStatementsInSwitchCase(
+ Token token,
+ Token peek,
+ Token begin,
+ int labelCount,
+ int expressionCount,
+ Token defaultKeyword,
+ Token colonAfterDefault) {
+ doPrint('parseStatementsInSwitchCase('
+ '$token, '
+ '$peek, '
+ '$begin, '
+ '$labelCount, '
+ '$expressionCount, '
+ '$defaultKeyword, '
+ '$colonAfterDefault)');
+ indent++;
+ var result = super.parseStatementsInSwitchCase(token, peek, begin,
+ labelCount, expressionCount, defaultKeyword, colonAfterDefault);
+ indent--;
+ return result;
+ }
+
+ Token parseBreakStatement(Token token) {
+ doPrint('parseBreakStatement(' '$token)');
+ indent++;
+ var result = super.parseBreakStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseAssert(Token token, Assert kind) {
+ doPrint('parseAssert(' '$token, ' '$kind)');
+ indent++;
+ var result = super.parseAssert(token, kind);
+ indent--;
+ return result;
+ }
+
+ Token parseAssertStatement(Token token) {
+ doPrint('parseAssertStatement(' '$token)');
+ indent++;
+ var result = super.parseAssertStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseContinueStatement(Token token) {
+ doPrint('parseContinueStatement(' '$token)');
+ indent++;
+ var result = super.parseContinueStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token parseEmptyStatement(Token token) {
+ doPrint('parseEmptyStatement(' '$token)');
+ indent++;
+ var result = super.parseEmptyStatement(token);
+ indent--;
+ return result;
+ }
+
+ Token previousToken(Token beforeToken, Token token) {
+ doPrint('previousToken(' '$beforeToken, ' '$token)');
+ indent++;
+ var result = super.previousToken(beforeToken, token);
+ indent--;
+ return result;
+ }
+
+ Token parseInvalidOperatorDeclaration(
+ Token beforeStart,
+ Token externalToken,
+ Token staticToken,
+ Token covariantToken,
+ Token lateToken,
+ Token varFinalOrConst,
+ Token beforeType,
+ DeclarationKind kind) {
+ doPrint('parseInvalidOperatorDeclaration('
+ '$beforeStart, '
+ '$externalToken, '
+ '$staticToken, '
+ '$covariantToken, '
+ '$lateToken, '
+ '$varFinalOrConst, '
+ '$beforeType, '
+ '$kind)');
+ indent++;
+ var result = super.parseInvalidOperatorDeclaration(
+ beforeStart,
+ externalToken,
+ staticToken,
+ covariantToken,
+ lateToken,
+ varFinalOrConst,
+ beforeType,
+ kind);
+ indent--;
+ return result;
+ }
+
+ Token recoverFromInvalidMember(
+ Token token,
+ Token beforeStart,
+ Token externalToken,
+ Token staticToken,
+ Token covariantToken,
+ Token lateToken,
+ Token varFinalOrConst,
+ Token beforeType,
+ TypeInfo typeInfo,
+ Token getOrSet,
+ DeclarationKind kind,
+ String enclosingDeclarationName) {
+ doPrint('recoverFromInvalidMember('
+ '$token, '
+ '$beforeStart, '
+ '$externalToken, '
+ '$staticToken, '
+ '$covariantToken, '
+ '$lateToken, '
+ '$varFinalOrConst, '
+ '$beforeType, '
+ '$typeInfo, '
+ '$getOrSet, '
+ '$kind, '
+ '$enclosingDeclarationName)');
+ indent++;
+ var result = super.recoverFromInvalidMember(
+ token,
+ beforeStart,
+ externalToken,
+ staticToken,
+ covariantToken,
+ lateToken,
+ varFinalOrConst,
+ beforeType,
+ typeInfo,
+ getOrSet,
+ kind,
+ enclosingDeclarationName);
+ indent--;
+ return result;
+ }
+
+ Token recoverFromStackOverflow(Token token) {
+ doPrint('recoverFromStackOverflow(' '$token)');
+ indent++;
+ var result = super.recoverFromStackOverflow(token);
+ indent--;
+ return result;
+ }
+
+ void reportRecoverableError(Token token, Message message) {
+ doPrint('reportRecoverableError(' '$token, ' '$message)');
+ indent++;
+ var result = super.reportRecoverableError(token, message);
+ indent--;
+ return result;
+ }
+
+ void reportRecoverableErrorWithToken(Token token, dynamic template) {
+ doPrint('reportRecoverableErrorWithToken(' '$token, ' '$template)');
+ indent++;
+ var result = super.reportRecoverableErrorWithToken(token, template);
+ indent--;
+ return result;
+ }
+
+ Token reportAllErrorTokens(Token token) {
+ doPrint('reportAllErrorTokens(' '$token)');
+ indent++;
+ var result = super.reportAllErrorTokens(token);
+ indent--;
+ return result;
+ }
+
+ Token skipErrorTokens(Token token) {
+ doPrint('skipErrorTokens(' '$token)');
+ indent++;
+ var result = super.skipErrorTokens(token);
+ indent--;
+ return result;
+ }
+
+ Token parseInvalidTopLevelDeclaration(Token token) {
+ doPrint('parseInvalidTopLevelDeclaration(' '$token)');
+ indent++;
+ var result = super.parseInvalidTopLevelDeclaration(token);
+ indent--;
+ return result;
+ }
+
+ Token reportAndSkipClassInClass(Token token) {
+ doPrint('reportAndSkipClassInClass(' '$token)');
+ indent++;
+ var result = super.reportAndSkipClassInClass(token);
+ indent--;
+ return result;
+ }
+
+ Token reportAndSkipEnumInClass(Token token) {
+ doPrint('reportAndSkipEnumInClass(' '$token)');
+ indent++;
+ var result = super.reportAndSkipEnumInClass(token);
+ indent--;
+ return result;
+ }
+
+ Token reportAndSkipTypedefInClass(Token token) {
+ doPrint('reportAndSkipTypedefInClass(' '$token)');
+ indent++;
+ var result = super.reportAndSkipTypedefInClass(token);
+ indent--;
+ return result;
+ }
+
+ Token link(BeginToken beginToken, Token endToken) {
+ doPrint('link(' '$beginToken, ' '$endToken)');
+ indent++;
+ var result = super.link(beginToken, endToken);
+ indent--;
+ return result;
+ }
+
+ Token syntheticPreviousToken(Token token) {
+ doPrint('syntheticPreviousToken(' '$token)');
+ indent++;
+ var result = super.syntheticPreviousToken(token);
+ indent--;
+ return result;
+ }
+
+ Token findDartDoc(Token token) {
+ doPrint('findDartDoc(' '$token)');
+ indent++;
+ var result = super.findDartDoc(token);
+ indent--;
+ return result;
+ }
+
+ int parseCommentReferences(Token dartdoc) {
+ doPrint('parseCommentReferences(' '$dartdoc)');
+ indent++;
+ var result = super.parseCommentReferences(dartdoc);
+ indent--;
+ return result;
+ }
+
+ int parseReferencesInMultiLineComment(Token multiLineDoc) {
+ doPrint('parseReferencesInMultiLineComment(' '$multiLineDoc)');
+ indent++;
+ var result = super.parseReferencesInMultiLineComment(multiLineDoc);
+ indent--;
+ return result;
+ }
+
+ int parseReferencesInSingleLineComments(Token token) {
+ doPrint('parseReferencesInSingleLineComments(' '$token)');
+ indent++;
+ var result = super.parseReferencesInSingleLineComments(token);
+ indent--;
+ return result;
+ }
+
+ int parseCommentReferencesInText(Token commentToken, int start, int end) {
+ doPrint(
+ 'parseCommentReferencesInText(' '$commentToken, ' '$start, ' '$end)');
+ indent++;
+ var result = super.parseCommentReferencesInText(commentToken, start, end);
+ indent--;
+ return result;
+ }
+
+ int findReferenceEnd(String comment, int index, int end) {
+ doPrint('findReferenceEnd(' '$comment, ' '$index, ' '$end)');
+ indent++;
+ var result = super.findReferenceEnd(comment, index, end);
+ indent--;
+ return result;
+ }
+
+ bool parseOneCommentReference(Token token, int referenceOffset) {
+ doPrint('parseOneCommentReference(' '$token, ' '$referenceOffset)');
+ indent++;
+ var result = super.parseOneCommentReference(token, referenceOffset);
+ indent--;
+ return result;
+ }
+
+ void parseOneCommentReferenceRest(
+ Token begin,
+ int referenceOffset,
+ Token newKeyword,
+ Token prefix,
+ Token period,
+ Token identifierOrOperator) {
+ doPrint('parseOneCommentReferenceRest('
+ '$begin, '
+ '$referenceOffset, '
+ '$newKeyword, '
+ '$prefix, '
+ '$period, '
+ '$identifierOrOperator)');
+ indent++;
+ var result = super.parseOneCommentReferenceRest(begin, referenceOffset,
+ newKeyword, prefix, period, identifierOrOperator);
+ indent--;
+ return result;
+ }
+
+ bool isLinkText(String comment, int rightIndex) {
+ doPrint('isLinkText(' '$comment, ' '$rightIndex)');
+ indent++;
+ var result = super.isLinkText(comment, rightIndex);
+ indent--;
+ return result;
+ }
+}
diff --git a/pkg/front_end/test/parser_test_parser_creator.dart b/pkg/front_end/test/parser_test_parser_creator.dart
new file mode 100644
index 0000000..2079d47
--- /dev/null
+++ b/pkg/front_end/test/parser_test_parser_creator.dart
@@ -0,0 +1,240 @@
+// Copyright (c) 2019, 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:io';
+import 'dart:typed_data';
+
+import 'package:front_end/src/fasta/parser.dart';
+import 'package:front_end/src/fasta/parser/formal_parameter_kind.dart';
+import 'package:front_end/src/fasta/parser/listener.dart';
+import 'package:front_end/src/fasta/parser/member_kind.dart';
+import 'package:front_end/src/fasta/scanner/utf8_bytes_scanner.dart';
+import 'package:front_end/src/scanner/token.dart';
+import 'package:dart_style/dart_style.dart' show DartFormatter;
+
+StringSink out;
+
+main(List<String> args) {
+ if (args.contains("--stdout")) {
+ out = stdout;
+ } else {
+ out = new StringBuffer();
+ }
+
+ File f = new File.fromUri(
+ Platform.script.resolve("../lib/src/fasta/parser/parser.dart"));
+ List<int> rawBytes = f.readAsBytesSync();
+
+ Uint8List bytes = new Uint8List(rawBytes.length + 1);
+ bytes.setRange(0, rawBytes.length, rawBytes);
+
+ Utf8BytesScanner scanner = new Utf8BytesScanner(bytes, includeComments: true);
+ Token firstToken = scanner.tokenize();
+
+ out.write("""
+// Copyright (c) 2019, 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/fasta/parser/listener.dart' show Listener;
+import 'package:front_end/src/fasta/parser/parser.dart' show Parser;
+import 'package:front_end/src/scanner/token.dart';
+import 'package:front_end/src/fasta/fasta_codes.dart';
+import 'package:front_end/src/fasta/scanner.dart';
+import 'package:front_end/src/fasta/parser/assert.dart';
+import 'package:front_end/src/fasta/parser/declaration_kind.dart';
+import 'package:front_end/src/fasta/parser/directive_context.dart';
+import 'package:front_end/src/fasta/parser/formal_parameter_kind.dart';
+import 'package:front_end/src/fasta/parser/identifier_context.dart';
+import 'package:front_end/src/fasta/parser/member_kind.dart';
+import 'package:front_end/src/fasta/parser/token_stream_rewriter.dart';
+import 'package:front_end/src/fasta/parser/type_info.dart';
+
+// THIS FILE IS AUTO GENERATED BY 'test/parser_test_parser_creator.dart'
+
+class TestParser extends Parser {
+ TestParser(Listener listener) : super(listener);
+
+ int indent = 0;
+ StringBuffer sb = new StringBuffer();
+
+ void doPrint(String s) {
+ sb.writeln((" " * indent) + s);
+ }
+""");
+
+ ParserCreatorListener listener = new ParserCreatorListener();
+ ClassMemberParser parser = new ClassMemberParser(listener);
+ parser.parseUnit(firstToken);
+
+ out.writeln("}");
+
+ if (out is StringBuffer) {
+ stdout.write(new DartFormatter().format("$out"));
+ }
+}
+
+class ParserCreatorListener extends Listener {
+ bool insideParserClass = false;
+ String currentMethodName;
+ List<String> parameters = <String>[];
+ List<String> parametersNamed = <String>[];
+
+ void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
+ if (name.lexeme == "Parser") insideParserClass = true;
+ }
+
+ void endClassDeclaration(Token beginToken, Token endToken) {
+ insideParserClass = false;
+ }
+
+ void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
+ Token varFinalOrConst, Token getOrSet, Token name) {
+ currentMethodName = name.lexeme;
+ }
+
+ void endClassConstructor(Token getOrSet, Token beginToken, Token beginParam,
+ Token beginInitializers, Token endToken) {
+ parameters.clear();
+ parametersNamed.clear();
+ currentMethodName = null;
+ }
+
+ void endClassMethod(Token getOrSet, Token beginToken, Token beginParam,
+ Token beginInitializers, Token endToken) {
+ if (insideParserClass && !currentMethodName.startsWith("_")) {
+ Token token = beginToken;
+ Token latestToken;
+ out.write(" ");
+ while (true) {
+ if (troubleParameterTokens.containsKey(token)) {
+ if (latestToken != null && latestToken.charEnd < token.charOffset) {
+ out.write(" ");
+ }
+ out.write("dynamic");
+ token = troubleParameterTokens[token];
+ }
+ if (latestToken != null && latestToken.charEnd < token.charOffset) {
+ out.write(" ");
+ }
+ if (token is SimpleToken && token.type == TokenType.FUNCTION) {
+ // Don't write out the '=>'.
+ out.write("{");
+ break;
+ }
+ out.write(token.lexeme);
+ if (token is BeginToken &&
+ token.type == TokenType.OPEN_CURLY_BRACKET &&
+ (beginParam == null ||
+ beginParam.endGroup == endToken ||
+ token.charOffset > beginParam.endGroup.charOffset)) {
+ break;
+ }
+ if (token == endToken) {
+ throw token.runtimeType;
+ }
+ latestToken = token;
+ token = token.next;
+ }
+
+ out.write("\n ");
+ out.write("doPrint('$currentMethodName(");
+ String separator = "";
+ for (int i = 0; i < parameters.length; i++) {
+ out.write(separator);
+ out.write(r"' '$");
+ out.write(parameters[i]);
+ separator = ", ";
+ }
+ for (int i = 0; i < parametersNamed.length; i++) {
+ out.write(separator);
+ out.write("' '");
+ out.write(parametersNamed[i]);
+ out.write(r": $");
+ out.write(parametersNamed[i]);
+ separator = ", ";
+ }
+ out.write(")');\n ");
+
+ out.write("indent++;\n ");
+ out.write("var result = super.$currentMethodName");
+ if (getOrSet != null && getOrSet.lexeme == "get") {
+ // no parens
+ out.write(";\n ");
+ } else {
+ out.write("(");
+ String separator = "";
+ for (int i = 0; i < parameters.length; i++) {
+ out.write(separator);
+ out.write(parameters[i]);
+ separator = ", ";
+ }
+ for (int i = 0; i < parametersNamed.length; i++) {
+ out.write(separator);
+ out.write(parametersNamed[i]);
+ out.write(": ");
+ out.write(parametersNamed[i]);
+ separator = ", ";
+ }
+ out.write(");\n ");
+ }
+ out.write("indent--;\n ");
+ out.write("return result;\n ");
+ out.write("}");
+ out.write("\n\n");
+ }
+ parameters.clear();
+ parametersNamed.clear();
+ currentMethodName = null;
+ }
+
+ int formalParametersNestLevel = 0;
+ void beginFormalParameters(Token token, MemberKind kind) {
+ formalParametersNestLevel++;
+ }
+
+ void endFormalParameters(
+ int count, Token beginToken, Token endToken, MemberKind kind) {
+ formalParametersNestLevel--;
+ }
+
+ Token currentFormalParameterToken;
+
+ void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
+ Token covariantToken, Token varFinalOrConst) {
+ if (formalParametersNestLevel == 1) {
+ currentFormalParameterToken = token;
+ }
+ }
+
+ Map<Token, Token> troubleParameterTokens = {};
+
+ void handleIdentifier(Token token, IdentifierContext context) {
+ if (formalParametersNestLevel > 0 && token.lexeme.startsWith("_")) {
+ troubleParameterTokens[currentFormalParameterToken] = null;
+ }
+ }
+
+ void endFormalParameter(
+ Token thisKeyword,
+ Token periodAfterThis,
+ Token nameToken,
+ Token initializerStart,
+ Token initializerEnd,
+ FormalParameterKind kind,
+ MemberKind memberKind) {
+ if (formalParametersNestLevel != 1) {
+ return;
+ }
+ if (troubleParameterTokens.containsKey(currentFormalParameterToken)) {
+ troubleParameterTokens[currentFormalParameterToken] = nameToken;
+ }
+ currentFormalParameterToken = null;
+ if (kind == FormalParameterKind.optionalNamed) {
+ parametersNamed.add(nameToken.lexeme);
+ } else {
+ parameters.add(nameToken.lexeme);
+ }
+ }
+}
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 351b53d..aa8e429 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -509,6 +509,7 @@
moves
msg
murmur
+mus
n
na
nameless
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index 40d83cd..493e5cd 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -464,6 +464,7 @@
compare
comparing
comparison
+comparisons
compatibility
compatible
compilation
@@ -567,6 +568,7 @@
continued
continues
continuing
+contraposition
contrast
contravariance
contravariant
@@ -1413,6 +1415,7 @@
interpreting
intersect
intersection
+intertwined
into
intrinsic
introduce
@@ -1887,6 +1890,7 @@
output
outside
over
+overall
overflow
overloadable
overloaded
@@ -2697,6 +2701,7 @@
terminating
termination
terminology
+terms
ternary
test
testcase
@@ -2742,6 +2747,7 @@
thumb
thus
time
+timeline
times
tip
to
@@ -2802,6 +2808,7 @@
triplet
triplets
trivial
+trouble
true
truly
truncate
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
index 8789584..c02e68e 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
@@ -1,11 +1,10 @@
Errors: {
org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'A<dynamic>' can't be assigned to a variable of type 'T'.
- 'A' is from 'pkg/front_end/testcases/expression/main.dart'.
- Try changing the type of the left hand side, or casting the right hand side to 'T'.
T k = new A();
^
}
method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
return () → dart.core::Null? {
- main::A::debugExpr::T* k = let final<BottomType> #t1 = invalid-expression "org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'A<dynamic>' can't be assigned to a variable of type 'T'.\n - 'A' is from 'pkg/front_end/testcases/expression/main.dart'.\nTry changing the type of the left hand side, or casting the right hand side to 'T'.\n T k = new A();\n ^" in new main::A::•<dynamic>() as{TypeError} <BottomType>;
+ main::A::debugExpr::T* k = let final<BottomType> #t1 = invalid-expression "org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'A<dynamic>' can't be assigned to a variable of type 'T'.\n - 'A' is from 'pkg/front_end/testcases/expression/main.dart'.\n T k = new A();\n ^" in new main::A::•<dynamic>() as{TypeError} <BottomType>;
};
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.strong.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.strong.expect
index b551a0a..c99820d 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.strong.expect
@@ -9,32 +9,32 @@
// classA.method();
// ^^^^^^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:24:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:24:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension(classA).method();
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:10:21: Context: This is the type variable whose bound isn't conformed to.
// extension Extension<T extends B> on Class<T> {
// ^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:25:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:25:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension<A>(classA).method();
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:10:21: Context: This is the type variable whose bound isn't conformed to.
// extension Extension<T extends B> on Class<T> {
// ^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:31:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:31:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension<A>(classB).method();
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:10:21: Context: This is the type variable whose bound isn't conformed to.
// extension Extension<T extends B> on Class<T> {
// ^
@@ -59,42 +59,42 @@
// genericMethod<S extends B>(S s) {}
// ^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:37:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:37:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension(classB).genericMethod(a);
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:12:17: Context: This is the type variable whose bound isn't conformed to.
// genericMethod<S extends B>(S s) {}
// ^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:40:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:40:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension<A>(classB).genericMethod(a);
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:10:21: Context: This is the type variable whose bound isn't conformed to.
// extension Extension<T extends B> on Class<T> {
// ^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:40:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:40:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension<A>(classB).genericMethod(a);
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:12:17: Context: This is the type variable whose bound isn't conformed to.
// genericMethod<S extends B>(S s) {}
// ^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:43:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:43:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension<B>(classB).genericMethod(a);
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:12:17: Context: This is the type variable whose bound isn't conformed to.
// genericMethod<S extends B>(S s) {}
// ^
diff --git a/pkg/front_end/testcases/extensions/check_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/check_bounds.dart.strong.transformed.expect
index b551a0a..c99820d 100644
--- a/pkg/front_end/testcases/extensions/check_bounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/check_bounds.dart.strong.transformed.expect
@@ -9,32 +9,32 @@
// classA.method();
// ^^^^^^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:24:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:24:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension(classA).method();
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:10:21: Context: This is the type variable whose bound isn't conformed to.
// extension Extension<T extends B> on Class<T> {
// ^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:25:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:25:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension<A>(classA).method();
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:10:21: Context: This is the type variable whose bound isn't conformed to.
// extension Extension<T extends B> on Class<T> {
// ^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:31:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:31:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|method'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension<A>(classB).method();
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:10:21: Context: This is the type variable whose bound isn't conformed to.
// extension Extension<T extends B> on Class<T> {
// ^
@@ -59,42 +59,42 @@
// genericMethod<S extends B>(S s) {}
// ^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:37:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:37:21: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension(classB).genericMethod(a);
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:12:17: Context: This is the type variable whose bound isn't conformed to.
// genericMethod<S extends B>(S s) {}
// ^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:40:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:40:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'T' on 'Extension|genericMethod'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension<A>(classB).genericMethod(a);
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:10:21: Context: This is the type variable whose bound isn't conformed to.
// extension Extension<T extends B> on Class<T> {
// ^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:40:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:40:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension<A>(classB).genericMethod(a);
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:12:17: Context: This is the type variable whose bound isn't conformed to.
// genericMethod<S extends B>(S s) {}
// ^
//
-// pkg/front_end/testcases/extensions/check_bounds.dart:43:3: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
+// pkg/front_end/testcases/extensions/check_bounds.dart:43:24: Error: Inferred type argument 'A' doesn't conform to the bound 'B' of the type variable 'S' on 'Extension|genericMethod'.
// - 'A' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// - 'B' is from 'pkg/front_end/testcases/extensions/check_bounds.dart'.
// Try specifying type arguments explicitly so that they conform to the bounds.
// Extension<B>(classB).genericMethod(a);
-// ^
+// ^
// pkg/front_end/testcases/extensions/check_bounds.dart:12:17: Context: This is the type variable whose bound isn't conformed to.
// genericMethod<S extends B>(S s) {}
// ^
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart b/pkg/front_end/testcases/extensions/conflict_with_object.dart
new file mode 100644
index 0000000..4d25f0e
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2019, 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.
+
+extension Extension on String {
+ int get noSuchMethod => 42;
+ void set hashCode(int value) {}
+ int runtimeType() {}
+ operator ==(other) => false;
+ static String toString() => 'Foo';
+}
+
+main() {
+ int value;
+ expect(true, "".noSuchMethod is Function);
+ value = Extension("").noSuchMethod;
+ Extension("").hashCode = 42;
+ expect(true, "".runtimeType is Type);
+ expect(true, Extension("").runtimeType is Function);
+ value = Extension("").runtimeType();
+ expect(true, "" == "");
+ expect('Foo', Extension.toString());
+}
+
+errors() {
+ int value;
+ value = "".noSuchMethod;
+ "".hashCode = 42;
+ value = "".runtimeType;
+}
+
+expect(expected, actual) {
+ if (expected != actual) {
+ throw 'Mismatch: expected=$expected, actual=$actual';
+ }
+}
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.outline.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.outline.expect
new file mode 100644
index 0000000..4d46ff2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.outline.expect
@@ -0,0 +1,53 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:6:11: Error: This extension member conflicts with Object member 'noSuchMethod'.
+// int get noSuchMethod => 42;
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:8:7: Error: This extension member conflicts with Object member 'runtimeType'.
+// int runtimeType() {}
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:9:12: Error: This extension member conflicts with Object member '=='.
+// operator ==(other) => false;
+// ^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:10:17: Error: This extension member conflicts with Object member 'toString'.
+// static String toString() => 'Foo';
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:7:12: Error: This extension member conflicts with Object member 'hashCode'.
+// void set hashCode(int value) {}
+// ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Extension on core::String* {
+ get noSuchMethod = self::Extension|get#noSuchMethod;
+ method runtimeType = self::Extension|runtimeType;
+ tearoff runtimeType = self::Extension|get#runtimeType;
+ operator == = self::Extension|==;
+ static method toString = self::Extension|toString;
+ set hashCode = self::Extension|set#hashCode;
+}
+static method Extension|get#noSuchMethod(final core::String* #this) → core::int*
+ ;
+static method Extension|set#hashCode(final core::String* #this, core::int* value) → void
+ ;
+static method Extension|runtimeType(final core::String* #this) → core::int*
+ ;
+static method Extension|get#runtimeType(final core::String* #this) → () →* core::int*
+ return () → core::int* => self::Extension|runtimeType(#this);
+static method Extension|==(final core::String* #this, dynamic other) → dynamic
+ ;
+static method Extension|toString() → core::String*
+ ;
+static method main() → dynamic
+ ;
+static method errors() → dynamic
+ ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+ ;
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.expect
new file mode 100644
index 0000000..891feb9
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.expect
@@ -0,0 +1,91 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:6:11: Error: This extension member conflicts with Object member 'noSuchMethod'.
+// int get noSuchMethod => 42;
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:8:7: Error: This extension member conflicts with Object member 'runtimeType'.
+// int runtimeType() {}
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:9:12: Error: This extension member conflicts with Object member '=='.
+// operator ==(other) => false;
+// ^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:10:17: Error: This extension member conflicts with Object member 'toString'.
+// static String toString() => 'Foo';
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:7:12: Error: This extension member conflicts with Object member 'hashCode'.
+// void set hashCode(int value) {}
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:27:14: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'int'.
+// - 'Invocation' is from 'dart:core'.
+// value = "".noSuchMethod;
+// ^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:28:6: Error: The setter 'hashCode' isn't defined for the class 'String'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'hashCode'.
+// "".hashCode = 42;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:29:14: Error: A value of type 'Type' can't be assigned to a variable of type 'int'.
+// - 'Type' is from 'dart:core'.
+// value = "".runtimeType;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Extension on core::String* {
+ get noSuchMethod = self::Extension|get#noSuchMethod;
+ method runtimeType = self::Extension|runtimeType;
+ tearoff runtimeType = self::Extension|get#runtimeType;
+ operator == = self::Extension|==;
+ static method toString = self::Extension|toString;
+ set hashCode = self::Extension|set#hashCode;
+}
+static method Extension|get#noSuchMethod(final core::String* #this) → core::int*
+ return 42;
+static method Extension|set#hashCode(final core::String* #this, core::int* value) → void {}
+static method Extension|runtimeType(final core::String* #this) → core::int* {}
+static method Extension|get#runtimeType(final core::String* #this) → () →* core::int*
+ return () → core::int* => self::Extension|runtimeType(#this);
+static method Extension|==(final core::String* #this, dynamic other) → dynamic
+ return false;
+static method Extension|toString() → core::String*
+ return "Foo";
+static method main() → dynamic {
+ core::int* value;
+ self::expect(true, "".{core::Object::noSuchMethod} is core::Function*);
+ value = self::Extension|get#noSuchMethod("");
+ self::Extension|set#hashCode("", 42);
+ self::expect(true, "".{core::Object::runtimeType} is core::Type*);
+ self::expect(true, self::Extension|get#runtimeType("") is core::Function*);
+ value = self::Extension|runtimeType("");
+ self::expect(true, "".{core::String::==}(""));
+ self::expect("Foo", self::Extension|toString());
+}
+static method errors() → dynamic {
+ core::int* value;
+ value = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:27:14: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'int'.
+ - 'Invocation' is from 'dart:core'.
+ value = \"\".noSuchMethod;
+ ^" in "".{core::Object::noSuchMethod} as{TypeError} core::int*;
+ invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:28:6: Error: The setter 'hashCode' isn't defined for the class 'String'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'hashCode'.
+ \"\".hashCode = 42;
+ ^^^^^^^^";
+ value = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:29:14: Error: A value of type 'Type' can't be assigned to a variable of type 'int'.
+ - 'Type' is from 'dart:core'.
+ value = \"\".runtimeType;
+ ^" in "".{core::Object::runtimeType} as{TypeError} core::int*;
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+ if(!expected.{core::Object::==}(actual)) {
+ throw "Mismatch: expected=${expected}, actual=${actual}";
+ }
+}
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.transformed.expect
new file mode 100644
index 0000000..891feb9
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.strong.transformed.expect
@@ -0,0 +1,91 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:6:11: Error: This extension member conflicts with Object member 'noSuchMethod'.
+// int get noSuchMethod => 42;
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:8:7: Error: This extension member conflicts with Object member 'runtimeType'.
+// int runtimeType() {}
+// ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:9:12: Error: This extension member conflicts with Object member '=='.
+// operator ==(other) => false;
+// ^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:10:17: Error: This extension member conflicts with Object member 'toString'.
+// static String toString() => 'Foo';
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:7:12: Error: This extension member conflicts with Object member 'hashCode'.
+// void set hashCode(int value) {}
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:27:14: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'int'.
+// - 'Invocation' is from 'dart:core'.
+// value = "".noSuchMethod;
+// ^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:28:6: Error: The setter 'hashCode' isn't defined for the class 'String'.
+// Try correcting the name to the name of an existing setter, or defining a setter or field named 'hashCode'.
+// "".hashCode = 42;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/conflict_with_object.dart:29:14: Error: A value of type 'Type' can't be assigned to a variable of type 'int'.
+// - 'Type' is from 'dart:core'.
+// value = "".runtimeType;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Extension on core::String* {
+ get noSuchMethod = self::Extension|get#noSuchMethod;
+ method runtimeType = self::Extension|runtimeType;
+ tearoff runtimeType = self::Extension|get#runtimeType;
+ operator == = self::Extension|==;
+ static method toString = self::Extension|toString;
+ set hashCode = self::Extension|set#hashCode;
+}
+static method Extension|get#noSuchMethod(final core::String* #this) → core::int*
+ return 42;
+static method Extension|set#hashCode(final core::String* #this, core::int* value) → void {}
+static method Extension|runtimeType(final core::String* #this) → core::int* {}
+static method Extension|get#runtimeType(final core::String* #this) → () →* core::int*
+ return () → core::int* => self::Extension|runtimeType(#this);
+static method Extension|==(final core::String* #this, dynamic other) → dynamic
+ return false;
+static method Extension|toString() → core::String*
+ return "Foo";
+static method main() → dynamic {
+ core::int* value;
+ self::expect(true, "".{core::Object::noSuchMethod} is core::Function*);
+ value = self::Extension|get#noSuchMethod("");
+ self::Extension|set#hashCode("", 42);
+ self::expect(true, "".{core::Object::runtimeType} is core::Type*);
+ self::expect(true, self::Extension|get#runtimeType("") is core::Function*);
+ value = self::Extension|runtimeType("");
+ self::expect(true, "".{core::String::==}(""));
+ self::expect("Foo", self::Extension|toString());
+}
+static method errors() → dynamic {
+ core::int* value;
+ value = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:27:14: Error: A value of type 'dynamic Function(Invocation)' can't be assigned to a variable of type 'int'.
+ - 'Invocation' is from 'dart:core'.
+ value = \"\".noSuchMethod;
+ ^" in "".{core::Object::noSuchMethod} as{TypeError} core::int*;
+ invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:28:6: Error: The setter 'hashCode' isn't defined for the class 'String'.
+Try correcting the name to the name of an existing setter, or defining a setter or field named 'hashCode'.
+ \"\".hashCode = 42;
+ ^^^^^^^^";
+ value = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/extensions/conflict_with_object.dart:29:14: Error: A value of type 'Type' can't be assigned to a variable of type 'int'.
+ - 'Type' is from 'dart:core'.
+ value = \"\".runtimeType;
+ ^" in "".{core::Object::runtimeType} as{TypeError} core::int*;
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+ if(!expected.{core::Object::==}(actual)) {
+ throw "Mismatch: expected=${expected}, actual=${actual}";
+ }
+}
diff --git a/pkg/front_end/testcases/extensions/conflict_with_object.dart.type_promotion.expect b/pkg/front_end/testcases/extensions/conflict_with_object.dart.type_promotion.expect
new file mode 100644
index 0000000..3748577
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/conflict_with_object.dart.type_promotion.expect
@@ -0,0 +1,12 @@
+pkg/front_end/testcases/extensions/conflict_with_object.dart:16:9: Context: Write to value@422
+ value = Extension("").noSuchMethod;
+ ^
+pkg/front_end/testcases/extensions/conflict_with_object.dart:20:9: Context: Write to value@422
+ value = Extension("").runtimeType();
+ ^
+pkg/front_end/testcases/extensions/conflict_with_object.dart:27:9: Context: Write to value@762
+ value = "".noSuchMethod;
+ ^
+pkg/front_end/testcases/extensions/conflict_with_object.dart:29:9: Context: Write to value@762
+ value = "".runtimeType;
+ ^
diff --git a/pkg/front_end/testcases/extensions/default_values.dart b/pkg/front_end/testcases/extensions/default_values.dart
index 0b08f6d..eb948c2 100644
--- a/pkg/front_end/testcases/extensions/default_values.dart
+++ b/pkg/front_end/testcases/extensions/default_values.dart
@@ -28,9 +28,8 @@
expect(123, tearOff3());
}
-
expect(expected, actual) {
if (expected != actual) {
throw 'Mismatch: expected=$expected, actual=$actual';
}
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/testcases/extensions/extension_setter_error.dart.strong.expect b/pkg/front_end/testcases/extensions/extension_setter_error.dart.strong.expect
index 569b235..7711d44 100644
--- a/pkg/front_end/testcases/extensions/extension_setter_error.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter_error.dart.strong.expect
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/extensions/extension_setter_error.dart:13:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
// - 'GenericClass' is from 'pkg/front_end/testcases/extensions/extension_setter_error.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'GenericClass<double>'.
// expect(null, GenericExtension<double>(genericClass).setter = null);
// ^
//
@@ -24,7 +23,6 @@
self::GenericClass<core::int*>* genericClass = new self::GenericClass::•<core::int*>();
self::expect(null, let final self::GenericClass<core::int*>* #t1 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/extensions/extension_setter_error.dart:13:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
- 'GenericClass' is from 'pkg/front_end/testcases/extensions/extension_setter_error.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'GenericClass<double>'.
expect(null, GenericExtension<double>(genericClass).setter = null);
^" in genericClass as{TypeError} self::GenericClass<core::double*>* in let final core::Null? #t3 = null in let final void #t4 = self::GenericExtension|set#setter<core::double*>(#t1, #t3) in #t3);
}
diff --git a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart
new file mode 100644
index 0000000..72989b9
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2019, 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.
+
+/// Regression test for missing substitution of type variable used in the
+/// return type of a generic method on a generic extension.
+
+class Class<T> {}
+
+extension Extension<T> on Class<T> {
+ R method<R>(T t) => null;
+}
+
+main() {
+ new Class<int>().method(0)?.toString();
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.outline.expect b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.outline.expect
new file mode 100644
index 0000000..a666b12
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.outline.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object* = dynamic> extends core::Object {
+ synthetic constructor •() → self::Class<self::Class::T*>*
+ ;
+}
+extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+ method method = self::Extension|method;
+ tearoff method = self::Extension|get#method;
+}
+static method Extension|method<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(final self::Class<self::Extension|method::T*>* #this, self::Extension|method::T* t) → self::Extension|method::R*
+ ;
+static method Extension|get#method<T extends core::Object* = dynamic>(final self::Class<self::Extension|get#method::T*>* #this) → <R extends core::Object* = dynamic>(self::Extension|get#method::T*) →* R*
+ return <R extends core::Object* = dynamic>(self::Extension|get#method::T* t) → R* => self::Extension|method<self::Extension|get#method::T*, R*>(#this, t);
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.strong.expect b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.strong.expect
new file mode 100644
index 0000000..5de03f0
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.strong.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object* = dynamic> extends core::Object {
+ synthetic constructor •() → self::Class<self::Class::T*>*
+ : super core::Object::•()
+ ;
+}
+extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+ method method = self::Extension|method;
+ tearoff method = self::Extension|get#method;
+}
+static method Extension|method<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(final self::Class<self::Extension|method::T*>* #this, self::Extension|method::T* t) → self::Extension|method::R*
+ return null;
+static method Extension|get#method<T extends core::Object* = dynamic>(final self::Class<self::Extension|get#method::T*>* #this) → <R extends core::Object* = dynamic>(self::Extension|get#method::T*) →* R*
+ return <R extends core::Object* = dynamic>(self::Extension|get#method::T* t) → R* => self::Extension|method<self::Extension|get#method::T*, R*>(#this, t);
+static method main() → dynamic {
+ let final dynamic #t1 = self::Extension|method<core::int*, dynamic>(new self::Class::•<core::int*>(), 0) in #t1.{core::Object::==}(null) ?{core::String*} null : #t1.{core::Object::toString}();
+}
diff --git a/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.strong.transformed.expect
new file mode 100644
index 0000000..5de03f0
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/generic_function_in_generic_extension.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Class<T extends core::Object* = dynamic> extends core::Object {
+ synthetic constructor •() → self::Class<self::Class::T*>*
+ : super core::Object::•()
+ ;
+}
+extension Extension<T extends core::Object* = dynamic> on self::Class<T*>* {
+ method method = self::Extension|method;
+ tearoff method = self::Extension|get#method;
+}
+static method Extension|method<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(final self::Class<self::Extension|method::T*>* #this, self::Extension|method::T* t) → self::Extension|method::R*
+ return null;
+static method Extension|get#method<T extends core::Object* = dynamic>(final self::Class<self::Extension|get#method::T*>* #this) → <R extends core::Object* = dynamic>(self::Extension|get#method::T*) →* R*
+ return <R extends core::Object* = dynamic>(self::Extension|get#method::T* t) → R* => self::Extension|method<self::Extension|get#method::T*, R*>(#this, t);
+static method main() → dynamic {
+ let final dynamic #t1 = self::Extension|method<core::int*, dynamic>(new self::Class::•<core::int*>(), 0) in #t1.{core::Object::==}(null) ?{core::String*} null : #t1.{core::Object::toString}();
+}
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.expect
index 86beef5..ab40325 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.expect
@@ -22,36 +22,36 @@
// Extension<int>(c1).method(null);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:3: Error: Getter not found: 'foo'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:17: Error: Getter not found: 'foo'.
// Extension(c1).foo;
-// ^^^
+// ^^^
//
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:30:3: Error: Setter not found: 'foo'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:30:17: Error: Setter not found: 'foo'.
// Extension(c1).foo = null;
-// ^^^
+// ^^^
//
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:31:17: Error: Method not found: 'foo'.
// Extension(c1).foo();
// ^^^
//
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:3: Error: Too few positional arguments: 2 required, 1 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 2 required, 1 given.
// Extension(c1).method();
-// ^
+// ^
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
// method(a) {}
// ^^^^^^^^^^^^^...
//
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:3: Error: Too many positional arguments: 2 allowed, but 3 found.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 2 allowed, but 3 found.
// Try removing the extra positional arguments.
// Extension(c1).method(1, 2);
-// ^
+// ^
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
// method(a) {}
// ^^^^^^^^^^^^^...
//
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:3: Error: Too few positional arguments: 2 required, 1 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 2 required, 1 given.
// Extension(c1).method(a: 1);
-// ^
+// ^
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
// method(a) {}
// ^^^^^^^^^^^^^...
@@ -63,9 +63,9 @@
// method(a) {}
// ^^^^^^^^^^^^^...
//
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:3: Error: Expected 0 type arguments.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:17: Error: Expected 0 type arguments.
// Extension(c1).method<int>(null);
-// ^
+// ^
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
// method(a) {}
// ^^^^^^^^^^^^^...
@@ -108,19 +108,16 @@
//
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
// - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
-// Try changing the type of the parameter, or casting the argument to 'Class'.
// Extension(s).method(null);
// ^
//
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
// - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
-// Try changing the type of the parameter, or casting the argument to 'GenericClass<dynamic>'.
// GenericExtension(s).method();
// ^
//
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
// - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
-// Try changing the type of the parameter, or casting the argument to 'GenericClass<int>'.
// GenericExtension<int>(s).method();
// ^
//
@@ -171,34 +168,33 @@
^^^^^^^^^".method(null);
self::Extension|method(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
- 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
-Try changing the type of the parameter, or casting the argument to 'Class'.
Extension(s).method(null);
^" in s as{TypeError} self::Class*, null);
- invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:3: Error: Getter not found: 'foo'.
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:17: Error: Getter not found: 'foo'.
Extension(c1).foo;
- ^^^";
- invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:30:3: Error: Setter not found: 'foo'.
+ ^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:30:17: Error: Setter not found: 'foo'.
Extension(c1).foo = null;
- ^^^";
+ ^^^";
invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:31:17: Error: Method not found: 'foo'.
Extension(c1).foo();
^^^";
- invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:3: Error: Too few positional arguments: 2 required, 1 given.
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 2 required, 1 given.
Extension(c1).method();
- ^";
- invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:3: Error: Too many positional arguments: 2 allowed, but 3 found.
+ ^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 2 allowed, but 3 found.
Try removing the extra positional arguments.
Extension(c1).method(1, 2);
- ^";
- invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:3: Error: Too few positional arguments: 2 required, 1 given.
+ ^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 2 required, 1 given.
Extension(c1).method(a: 1);
- ^";
+ ^";
invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:38:27: Error: No named parameter with the name 'a'.
Extension(c1).method(1, a: 2);
^";
- invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:3: Error: Expected 0 type arguments.
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:17: Error: Expected 0 type arguments.
Extension(c1).method<int>(null);
- ^";
+ ^";
self::GenericClass<core::int*>* c2 = new self::GenericClass::•<core::int*>();
invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:42:3: Error: Explicit extension application requires exactly 1 positional argument.
GenericExtension().method();
@@ -229,12 +225,10 @@
^^^^^^^^^^^^^^^^".method();
self::GenericExtension|method<dynamic>(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
- 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
-Try changing the type of the parameter, or casting the argument to 'GenericClass<dynamic>'.
GenericExtension(s).method();
^" in s as{TypeError} self::GenericClass<dynamic>*);
self::GenericExtension|method<core::int*>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
- 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
-Try changing the type of the parameter, or casting the argument to 'GenericClass<int>'.
GenericExtension<int>(s).method();
^" in s as{TypeError} self::GenericClass<core::int*>*);
}
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.transformed.expect
index 86beef5..ab40325 100644
--- a/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_access.dart.strong.transformed.expect
@@ -22,36 +22,36 @@
// Extension<int>(c1).method(null);
// ^^^^^^^^^
//
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:3: Error: Getter not found: 'foo'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:17: Error: Getter not found: 'foo'.
// Extension(c1).foo;
-// ^^^
+// ^^^
//
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:30:3: Error: Setter not found: 'foo'.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:30:17: Error: Setter not found: 'foo'.
// Extension(c1).foo = null;
-// ^^^
+// ^^^
//
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:31:17: Error: Method not found: 'foo'.
// Extension(c1).foo();
// ^^^
//
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:3: Error: Too few positional arguments: 2 required, 1 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 2 required, 1 given.
// Extension(c1).method();
-// ^
+// ^
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
// method(a) {}
// ^^^^^^^^^^^^^...
//
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:3: Error: Too many positional arguments: 2 allowed, but 3 found.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 2 allowed, but 3 found.
// Try removing the extra positional arguments.
// Extension(c1).method(1, 2);
-// ^
+// ^
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
// method(a) {}
// ^^^^^^^^^^^^^...
//
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:3: Error: Too few positional arguments: 2 required, 1 given.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 2 required, 1 given.
// Extension(c1).method(a: 1);
-// ^
+// ^
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
// method(a) {}
// ^^^^^^^^^^^^^...
@@ -63,9 +63,9 @@
// method(a) {}
// ^^^^^^^^^^^^^...
//
-// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:3: Error: Expected 0 type arguments.
+// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:17: Error: Expected 0 type arguments.
// Extension(c1).method<int>(null);
-// ^
+// ^
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:8:3: Context: Found this candidate, but the arguments don't match.
// method(a) {}
// ^^^^^^^^^^^^^...
@@ -108,19 +108,16 @@
//
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
// - 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
-// Try changing the type of the parameter, or casting the argument to 'Class'.
// Extension(s).method(null);
// ^
//
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
// - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
-// Try changing the type of the parameter, or casting the argument to 'GenericClass<dynamic>'.
// GenericExtension(s).method();
// ^
//
// pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
// - 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
-// Try changing the type of the parameter, or casting the argument to 'GenericClass<int>'.
// GenericExtension<int>(s).method();
// ^
//
@@ -171,34 +168,33 @@
^^^^^^^^^".method(null);
self::Extension|method(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:28:13: Error: The argument type 'String' can't be assigned to the parameter type 'Class'.
- 'Class' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
-Try changing the type of the parameter, or casting the argument to 'Class'.
Extension(s).method(null);
^" in s as{TypeError} self::Class*, null);
- invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:3: Error: Getter not found: 'foo'.
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:29:17: Error: Getter not found: 'foo'.
Extension(c1).foo;
- ^^^";
- invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:30:3: Error: Setter not found: 'foo'.
+ ^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:30:17: Error: Setter not found: 'foo'.
Extension(c1).foo = null;
- ^^^";
+ ^^^";
invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:31:17: Error: Method not found: 'foo'.
Extension(c1).foo();
^^^";
- invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:3: Error: Too few positional arguments: 2 required, 1 given.
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:32:17: Error: Too few positional arguments: 2 required, 1 given.
Extension(c1).method();
- ^";
- invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:3: Error: Too many positional arguments: 2 allowed, but 3 found.
+ ^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:36:17: Error: Too many positional arguments: 2 allowed, but 3 found.
Try removing the extra positional arguments.
Extension(c1).method(1, 2);
- ^";
- invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:3: Error: Too few positional arguments: 2 required, 1 given.
+ ^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:37:17: Error: Too few positional arguments: 2 required, 1 given.
Extension(c1).method(a: 1);
- ^";
+ ^";
invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:38:27: Error: No named parameter with the name 'a'.
Extension(c1).method(1, a: 2);
^";
- invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:3: Error: Expected 0 type arguments.
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:39:17: Error: Expected 0 type arguments.
Extension(c1).method<int>(null);
- ^";
+ ^";
self::GenericClass<core::int*>* c2 = new self::GenericClass::•<core::int*>();
invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:42:3: Error: Explicit extension application requires exactly 1 positional argument.
GenericExtension().method();
@@ -229,12 +225,10 @@
^^^^^^^^^^^^^^^^".method();
self::GenericExtension|method<dynamic>(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:51:20: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<dynamic>'.
- 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
-Try changing the type of the parameter, or casting the argument to 'GenericClass<dynamic>'.
GenericExtension(s).method();
^" in s as{TypeError} self::GenericClass<dynamic>*);
self::GenericExtension|method<core::int*>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_access.dart:52:25: Error: The argument type 'String' can't be assigned to the parameter type 'GenericClass<int>'.
- 'GenericClass' is from 'pkg/front_end/testcases/extensions/invalid_explicit_access.dart'.
-Try changing the type of the parameter, or casting the argument to 'GenericClass<int>'.
GenericExtension<int>(s).method();
^" in s as{TypeError} self::GenericClass<core::int*>*);
}
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart
new file mode 100644
index 0000000..3fdcc7d
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2019, 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.
+
+extension Extension on String {
+ static method() {}
+ static get getter => null;
+ static set setter(_) {}
+ static get property => null;
+ static set property(_) {}
+ static var field;
+}
+
+main() {}
+
+errors() {
+ String s = "";
+ Extension(s).method();
+ Extension(s).method;
+ Extension(s).method = 42;
+ Extension(s).getter;
+ Extension(s).getter = 42;
+ Extension(s).setter;
+ Extension(s).setter = 42;
+ Extension(s).property;
+ Extension(s).property = 42;
+ Extension(s).field;
+ Extension(s).field = 42;
+}
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.outline.expect b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.outline.expect
new file mode 100644
index 0000000..76899b5
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.outline.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+extension Extension on core::String* {
+ static method method = self::Extension|method;
+ static get getter = get self::Extension|getter;
+ static get property = get self::Extension|property;
+ static field field = self::Extension|field;
+ static set setter = set self::Extension|setter;
+ static set property = set self::Extension|property;
+}
+static field dynamic Extension|field;
+static method Extension|method() → dynamic
+ ;
+static get Extension|getter() → dynamic
+ ;
+static set Extension|setter(dynamic _) → void
+ ;
+static get Extension|property() → dynamic
+ ;
+static set Extension|property(dynamic _) → void
+ ;
+static method main() → dynamic
+ ;
+static method errors() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.strong.expect b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.strong.expect
new file mode 100644
index 0000000..6317f7b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.strong.expect
@@ -0,0 +1,104 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:18:16: Error: Method not found: 'method'.
+// Extension(s).method();
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:19:16: Error: Getter not found: 'method'.
+// Extension(s).method;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:20:16: Error: Setter not found: 'method'.
+// Extension(s).method = 42;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:21:16: Error: Getter not found: 'getter'.
+// Extension(s).getter;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:22:16: Error: Setter not found: 'getter'.
+// Extension(s).getter = 42;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:23:16: Error: Getter not found: 'setter'.
+// Extension(s).setter;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:24:16: Error: Setter not found: 'setter'.
+// Extension(s).setter = 42;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:25:16: Error: Getter not found: 'property'.
+// Extension(s).property;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:26:16: Error: Setter not found: 'property'.
+// Extension(s).property = 42;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:27:16: Error: Getter not found: 'field'.
+// Extension(s).field;
+// ^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:28:16: Error: Setter not found: 'field'.
+// Extension(s).field = 42;
+// ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Extension on core::String* {
+ static method method = self::Extension|method;
+ static get getter = get self::Extension|getter;
+ static get property = get self::Extension|property;
+ static field field = self::Extension|field;
+ static set setter = set self::Extension|setter;
+ static set property = set self::Extension|property;
+}
+static field dynamic Extension|field;
+static method Extension|method() → dynamic {}
+static get Extension|getter() → dynamic
+ return null;
+static set Extension|setter(dynamic _) → void {}
+static get Extension|property() → dynamic
+ return null;
+static set Extension|property(dynamic _) → void {}
+static method main() → dynamic {}
+static method errors() → dynamic {
+ core::String* s = "";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:18:16: Error: Method not found: 'method'.
+ Extension(s).method();
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:19:16: Error: Getter not found: 'method'.
+ Extension(s).method;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:20:16: Error: Setter not found: 'method'.
+ Extension(s).method = 42;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:21:16: Error: Getter not found: 'getter'.
+ Extension(s).getter;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:22:16: Error: Setter not found: 'getter'.
+ Extension(s).getter = 42;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:23:16: Error: Getter not found: 'setter'.
+ Extension(s).setter;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:24:16: Error: Setter not found: 'setter'.
+ Extension(s).setter = 42;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:25:16: Error: Getter not found: 'property'.
+ Extension(s).property;
+ ^^^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:26:16: Error: Setter not found: 'property'.
+ Extension(s).property = 42;
+ ^^^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:27:16: Error: Getter not found: 'field'.
+ Extension(s).field;
+ ^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:28:16: Error: Setter not found: 'field'.
+ Extension(s).field = 42;
+ ^^^^^";
+}
diff --git a/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.strong.transformed.expect
new file mode 100644
index 0000000..6317f7b
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart.strong.transformed.expect
@@ -0,0 +1,104 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:18:16: Error: Method not found: 'method'.
+// Extension(s).method();
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:19:16: Error: Getter not found: 'method'.
+// Extension(s).method;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:20:16: Error: Setter not found: 'method'.
+// Extension(s).method = 42;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:21:16: Error: Getter not found: 'getter'.
+// Extension(s).getter;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:22:16: Error: Setter not found: 'getter'.
+// Extension(s).getter = 42;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:23:16: Error: Getter not found: 'setter'.
+// Extension(s).setter;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:24:16: Error: Setter not found: 'setter'.
+// Extension(s).setter = 42;
+// ^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:25:16: Error: Getter not found: 'property'.
+// Extension(s).property;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:26:16: Error: Setter not found: 'property'.
+// Extension(s).property = 42;
+// ^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:27:16: Error: Getter not found: 'field'.
+// Extension(s).field;
+// ^^^^^
+//
+// pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:28:16: Error: Setter not found: 'field'.
+// Extension(s).field = 42;
+// ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+extension Extension on core::String* {
+ static method method = self::Extension|method;
+ static get getter = get self::Extension|getter;
+ static get property = get self::Extension|property;
+ static field field = self::Extension|field;
+ static set setter = set self::Extension|setter;
+ static set property = set self::Extension|property;
+}
+static field dynamic Extension|field;
+static method Extension|method() → dynamic {}
+static get Extension|getter() → dynamic
+ return null;
+static set Extension|setter(dynamic _) → void {}
+static get Extension|property() → dynamic
+ return null;
+static set Extension|property(dynamic _) → void {}
+static method main() → dynamic {}
+static method errors() → dynamic {
+ core::String* s = "";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:18:16: Error: Method not found: 'method'.
+ Extension(s).method();
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:19:16: Error: Getter not found: 'method'.
+ Extension(s).method;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:20:16: Error: Setter not found: 'method'.
+ Extension(s).method = 42;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:21:16: Error: Getter not found: 'getter'.
+ Extension(s).getter;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:22:16: Error: Setter not found: 'getter'.
+ Extension(s).getter = 42;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:23:16: Error: Getter not found: 'setter'.
+ Extension(s).setter;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:24:16: Error: Setter not found: 'setter'.
+ Extension(s).setter = 42;
+ ^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:25:16: Error: Getter not found: 'property'.
+ Extension(s).property;
+ ^^^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:26:16: Error: Setter not found: 'property'.
+ Extension(s).property = 42;
+ ^^^^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:27:16: Error: Getter not found: 'field'.
+ Extension(s).field;
+ ^^^^^";
+ invalid-expression "pkg/front_end/testcases/extensions/invalid_explicit_static_access.dart:28:16: Error: Setter not found: 'field'.
+ Extension(s).field = 42;
+ ^^^^^";
+}
diff --git a/pkg/front_end/testcases/extensions/tear_offs.dart.strong.expect b/pkg/front_end/testcases/extensions/tear_offs.dart.strong.expect
index 86c38ea..826d872 100644
--- a/pkg/front_end/testcases/extensions/tear_offs.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/tear_offs.dart.strong.expect
@@ -3,19 +3,16 @@
// Problems in library:
//
// pkg/front_end/testcases/extensions/tear_offs.dart:17:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
// int Function(int) intId = getter;
// ^
//
// pkg/front_end/testcases/extensions/tear_offs.dart:30:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'num Function(num)'.
// num Function(num) numId = c.getter;
// ^
//
-// pkg/front_end/testcases/extensions/tear_offs.dart:31:32: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool Function(bool)'.
+// pkg/front_end/testcases/extensions/tear_offs.dart:31:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
// bool Function(bool) boolId = Extension(c).getter;
-// ^
+// ^
//
import self as self;
import "dart:core" as core;
@@ -47,7 +44,6 @@
return () → dynamic => self::Extension|method(#this);
static method Extension|errors(final self::Class* #this) → dynamic {
(core::int*) →* core::int* intId = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:17:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
-Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
int Function(int) intId = getter;
^" in self::Extension|get#getter(#this) as{TypeError} (core::int*) →* core::int*;
}
@@ -61,11 +57,9 @@
static method errors() → dynamic {
self::Class* c = new self::Class::•();
(core::num*) →* core::num* numId = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:30:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
-Try changing the type of the left hand side, or casting the right hand side to 'num Function(num)'.
num Function(num) numId = c.getter;
^" in self::Extension|get#getter(c) as{TypeError} (core::num*) →* core::num*;
- (core::bool*) →* core::bool* boolId = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:31:32: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool Function(bool)'.
+ (core::bool*) →* core::bool* boolId = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:31:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
bool Function(bool) boolId = Extension(c).getter;
- ^" in self::Extension|get#getter(c) as{TypeError} (core::bool*) →* core::bool*;
+ ^" in self::Extension|get#getter(c) as{TypeError} (core::bool*) →* core::bool*;
}
diff --git a/pkg/front_end/testcases/extensions/tear_offs.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/tear_offs.dart.strong.transformed.expect
index 86c38ea..826d872 100644
--- a/pkg/front_end/testcases/extensions/tear_offs.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/tear_offs.dart.strong.transformed.expect
@@ -3,19 +3,16 @@
// Problems in library:
//
// pkg/front_end/testcases/extensions/tear_offs.dart:17:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
// int Function(int) intId = getter;
// ^
//
// pkg/front_end/testcases/extensions/tear_offs.dart:30:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'num Function(num)'.
// num Function(num) numId = c.getter;
// ^
//
-// pkg/front_end/testcases/extensions/tear_offs.dart:31:32: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool Function(bool)'.
+// pkg/front_end/testcases/extensions/tear_offs.dart:31:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
// bool Function(bool) boolId = Extension(c).getter;
-// ^
+// ^
//
import self as self;
import "dart:core" as core;
@@ -47,7 +44,6 @@
return () → dynamic => self::Extension|method(#this);
static method Extension|errors(final self::Class* #this) → dynamic {
(core::int*) →* core::int* intId = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:17:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
-Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
int Function(int) intId = getter;
^" in self::Extension|get#getter(#this) as{TypeError} (core::int*) →* core::int*;
}
@@ -61,11 +57,9 @@
static method errors() → dynamic {
self::Class* c = new self::Class::•();
(core::num*) →* core::num* numId = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:30:31: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'num Function(num)'.
-Try changing the type of the left hand side, or casting the right hand side to 'num Function(num)'.
num Function(num) numId = c.getter;
^" in self::Extension|get#getter(c) as{TypeError} (core::num*) →* core::num*;
- (core::bool*) →* core::bool* boolId = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:31:32: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool Function(bool)'.
+ (core::bool*) →* core::bool* boolId = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/extensions/tear_offs.dart:31:45: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'bool Function(bool)'.
bool Function(bool) boolId = Extension(c).getter;
- ^" in self::Extension|get#getter(c) as{TypeError} (core::bool*) →* core::bool*;
+ ^" in self::Extension|get#getter(c) as{TypeError} (core::bool*) →* core::bool*;
}
diff --git a/pkg/front_end/testcases/general/bug32414a.dart.strong.expect b/pkg/front_end/testcases/general/bug32414a.dart.strong.expect
index ef9dfa5..c83aa71 100644
--- a/pkg/front_end/testcases/general/bug32414a.dart.strong.expect
+++ b/pkg/front_end/testcases/general/bug32414a.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/general/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// b = 42;
// ^
//
@@ -14,7 +13,6 @@
dynamic a = 5;
core::String* b = a.{core::Object::toString}();
b = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
b = 42;
^" in 42 as{TypeError} core::String*;
}
diff --git a/pkg/front_end/testcases/general/bug32414a.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug32414a.dart.strong.transformed.expect
index ef9dfa5..c83aa71 100644
--- a/pkg/front_end/testcases/general/bug32414a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug32414a.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/general/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// b = 42;
// ^
//
@@ -14,7 +13,6 @@
dynamic a = 5;
core::String* b = a.{core::Object::toString}();
b = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
b = 42;
^" in 42 as{TypeError} core::String*;
}
diff --git a/pkg/front_end/testcases/general/bug33298.dart.strong.expect b/pkg/front_end/testcases/general/bug33298.dart.strong.expect
index 57e3d95..9f48c8a 100644
--- a/pkg/front_end/testcases/general/bug33298.dart.strong.expect
+++ b/pkg/front_end/testcases/general/bug33298.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/general/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
-// Try changing the type of the parameter, or casting the argument to 'dynamic Function(String)'.
// List<String> list6 = ['a', 'b', 'c'].map(c).toList();
// ^
//
@@ -41,7 +40,6 @@
self::C* c = new self::C::•();
core::List<core::String*>* list5 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(c.{self::C::call}<core::String*>).{core::Iterable::toList}();
core::List<core::String*>* list6 = <core::String*>["a", "b", "c"].{core::Iterable::map}<dynamic>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/general/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
-Try changing the type of the parameter, or casting the argument to 'dynamic Function(String)'.
List<String> list6 = ['a', 'b', 'c'].map(c).toList();
^" in (let final self::C* #t4 = c in #t4.==(null) ?{<T extends core::Object* = dynamic>(T*) →* T*} null : #t4.{self::C::call}) as{TypeError} (core::String*) →* dynamic).{core::Iterable::toList}() as{TypeError} core::List<core::String*>*;
}
diff --git a/pkg/front_end/testcases/general/bug33298.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug33298.dart.strong.transformed.expect
index 57e3d95..9f48c8a 100644
--- a/pkg/front_end/testcases/general/bug33298.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug33298.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/general/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
-// Try changing the type of the parameter, or casting the argument to 'dynamic Function(String)'.
// List<String> list6 = ['a', 'b', 'c'].map(c).toList();
// ^
//
@@ -41,7 +40,6 @@
self::C* c = new self::C::•();
core::List<core::String*>* list5 = <core::String*>["a", "b", "c"].{core::Iterable::map}<core::String*>(c.{self::C::call}<core::String*>).{core::Iterable::toList}();
core::List<core::String*>* list6 = <core::String*>["a", "b", "c"].{core::Iterable::map}<dynamic>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/general/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
-Try changing the type of the parameter, or casting the argument to 'dynamic Function(String)'.
List<String> list6 = ['a', 'b', 'c'].map(c).toList();
^" in (let final self::C* #t4 = c in #t4.==(null) ?{<T extends core::Object* = dynamic>(T*) →* T*} null : #t4.{self::C::call}) as{TypeError} (core::String*) →* dynamic).{core::Iterable::toList}() as{TypeError} core::List<core::String*>*;
}
diff --git a/pkg/front_end/testcases/general/cascade.dart.strong.expect b/pkg/front_end/testcases/general/cascade.dart.strong.expect
index b60aced..808b5ca 100644
--- a/pkg/front_end/testcases/general/cascade.dart.strong.expect
+++ b/pkg/front_end/testcases/general/cascade.dart.strong.expect
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/general/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// [1]
// ^
//
@@ -35,7 +34,6 @@
core::print(list);
list = let final core::List<core::int*>* #t13 = <core::int*>[let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
[1]
^" in <core::int*>[1] as{TypeError} core::int*] in let final dynamic #t15 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
index af029ef..a6369df 100644
--- a/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/general/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// [1]
// ^
//
@@ -35,7 +34,6 @@
core::print(list);
list = let final core::List<core::int*>* #t13 = <core::int*>[let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:26:5: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
[1]
^" in <core::int*>[1] as{TypeError} core::int*] in let final core::String* #t15 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:28:13: Error: The getter 'last' isn't defined for the class 'int'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'last'.
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect
index c0c603a..c865110 100644
--- a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect
@@ -36,32 +36,26 @@
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>[if (oracle("foo")) "bar"];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>{if (oracle("foo")) "bar", null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>[if (oracle("foo")) ...["bar"]];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>{if (oracle("foo")) ...["bar"], null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
// ^
//
@@ -81,32 +75,26 @@
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>[if (oracle("foo")) 42 else 3.14];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>[if (oracle("foo")) 42 else 3.14];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>{if (oracle("foo")) 42 else 3.14, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>{if (oracle("foo")) 42 else 3.14, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
// ^
//
@@ -149,57 +137,46 @@
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
// List<int> list20 = [if (42) 42];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
// Set<int> set20 = {if (42) 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
// Map<int, int> map30 = {if (42) 42: 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// List<String> list40 = <String>[if (oracle("foo")) true else 42];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// List<String> list40 = <String>[if (oracle("foo")) true else 42];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// Set<String> set40 = <String>{if (oracle("foo")) true else 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// Set<String> set40 = <String>{if (oracle("foo")) true else 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
// ^
//
@@ -231,52 +208,42 @@
// ^^^^^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>[for (int i = 0; oracle("foo"); i++) "bar"];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
// ^
//
@@ -296,32 +263,26 @@
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
// ^
//
@@ -371,32 +332,26 @@
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var list20 = [for (int i in ["not", "int"]) i];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var list20 = [for (int i in ["not", "int"]) i];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var set20 = {for (int i in ["not", "int"]) i, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var set20 = {for (int i in ["not", "int"]) i, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
// ^
//
@@ -416,47 +371,38 @@
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
// var list60 = [for (; "not bool";) 42];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
// var set60 = {for (; "not bool";) 42, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
// var map60 = {for (; "not bool";) "bar": 42, "baz": null};
// ^
//
@@ -1024,7 +970,6 @@
final core::List<core::int*>* #t140 = <core::int*>[];
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t140.{core::List::add}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>[if (oracle(\"foo\")) \"bar\"];
^" in "bar" as{TypeError} core::int*);
} =>#t140;
@@ -1032,7 +977,6 @@
final core::Set<core::int*>* #t142 = col::LinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>{if (oracle(\"foo\")) \"bar\", null};
^" in "bar" as{TypeError} core::int*);
#t142.{core::Set::add}(null);
@@ -1041,7 +985,6 @@
final core::Map<core::String*, core::int*>* #t144 = <core::String*, core::int*>{};
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
^" in "bar" as{TypeError} core::int*);
#t144.{core::Map::[]=}("baz", null);
@@ -1050,7 +993,6 @@
final core::List<core::int*>* #t146 = <core::int*>[];
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
for (final core::int* #t147 in <core::int*>[let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>[if (oracle(\"foo\")) ...[\"bar\"]];
^" in "bar" as{TypeError} core::int*])
#t146.{core::List::add}(#t147);
@@ -1059,7 +1001,6 @@
final core::Set<core::int*>* #t149 = col::LinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
for (final core::int* #t150 in <core::int*>[let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>{if (oracle(\"foo\")) ...[\"bar\"], null};
^" in "bar" as{TypeError} core::int*])
#t149.{core::Set::add}(#t150);
@@ -1069,7 +1010,6 @@
final core::Map<core::String*, core::int*>* #t152 = <core::String*, core::int*>{};
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
for (final core::MapEntry<core::String*, core::int*>* #t153 in <core::String*, core::int*>{"bar": let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
#t152.{core::Map::[]=}(#t153.{core::MapEntry::key}, #t153.{core::MapEntry::value});
@@ -1103,12 +1043,10 @@
final core::List<core::String*>* #t157 = <core::String*>[];
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t157.{core::List::add}(let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>[if (oracle(\"foo\")) 42 else 3.14];
^" in 42 as{TypeError} core::String*);
else
#t157.{core::List::add}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>[if (oracle(\"foo\")) 42 else 3.14];
^" in 3.14 as{TypeError} core::String*);
} =>#t157;
@@ -1116,12 +1054,10 @@
final core::Set<core::String*>* #t160 = col::LinkedHashSet::•<core::String*>();
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>{if (oracle(\"foo\")) 42 else 3.14, null};
^" in 42 as{TypeError} core::String*);
else
#t160.{core::Set::add}(let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>{if (oracle(\"foo\")) 42 else 3.14, null};
^" in 3.14 as{TypeError} core::String*);
#t160.{core::Set::add}(null);
@@ -1130,12 +1066,10 @@
final core::Map<core::String*, core::String*>* #t163 = <core::String*, core::String*>{};
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
^" in 42 as{TypeError} core::String*);
else
#t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
^" in 3.14 as{TypeError} core::String*);
#t163.{core::Map::[]=}("baz", null);
@@ -1217,7 +1151,6 @@
core::List<core::int*>* list20 = block {
final core::List<core::int*>* #t170 = <core::int*>[];
if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
List<int> list20 = [if (42) 42];
^" in 42 as{TypeError} core::bool*)
#t170.{core::List::add}(42);
@@ -1225,7 +1158,6 @@
core::Set<core::int*>* set20 = block {
final core::Set<core::int*>* #t172 = col::LinkedHashSet::•<core::int*>();
if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
Set<int> set20 = {if (42) 42};
^" in 42 as{TypeError} core::bool*)
#t172.{core::Set::add}(42);
@@ -1233,7 +1165,6 @@
core::Map<core::int*, core::int*>* map30 = block {
final core::Map<core::int*, core::int*>* #t174 = <core::int*, core::int*>{};
if(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
Map<int, int> map30 = {if (42) 42: 42};
^" in 42 as{TypeError} core::bool*)
#t174.{core::Map::[]=}(42, 42);
@@ -1242,12 +1173,10 @@
final core::List<core::String*>* #t176 = <core::String*>[];
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t176.{core::List::add}(let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
^" in true as{TypeError} core::String*);
else
#t176.{core::List::add}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
^" in 42 as{TypeError} core::String*);
} =>#t176;
@@ -1255,12 +1184,10 @@
final core::Set<core::String*>* #t179 = col::LinkedHashSet::•<core::String*>();
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
^" in true as{TypeError} core::String*);
else
#t179.{core::Set::add}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
^" in 42 as{TypeError} core::String*);
} =>#t179;
@@ -1268,12 +1195,10 @@
final core::Map<core::String*, core::int*>* #t182 = <core::String*, core::int*>{};
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t182.{core::Map::[]=}(let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
^" in true as{TypeError} core::String*, 42);
else
#t182.{core::Map::[]=}(let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
^" in 42 as{TypeError} core::String*, 42);
} =>#t182;
@@ -1281,12 +1206,10 @@
final core::Map<core::int*, core::String*>* #t185 = <core::int*, core::String*>{};
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t185.{core::Map::[]=}(42, let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
^" in true as{TypeError} core::String*);
else
#t185.{core::Map::[]=}(42, let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
^" in 42 as{TypeError} core::String*);
} =>#t185;
@@ -1889,7 +1812,6 @@
final core::List<core::int*>* #t342 = <core::int*>[];
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
#t342.{core::List::add}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
^" in "bar" as{TypeError} core::int*);
} =>#t342;
@@ -1897,7 +1819,6 @@
final core::Set<core::int*>* #t344 = col::LinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
#t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
^" in "bar" as{TypeError} core::int*);
#t344.{core::Set::add}(null);
@@ -1906,14 +1827,11 @@
final core::Map<core::int*, core::int*>* #t346 = <core::int*, core::int*>{};
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
#t346.{core::Map::[]=}(let final<BottomType> #t347 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
^" in "bar" as{TypeError} core::int*, let final<BottomType> #t348 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
^" in "bar" as{TypeError} core::int*);
#t346.{core::Map::[]=}(let final<BottomType> #t349 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
^" in "baz" as{TypeError} core::int*, null);
} =>#t346;
@@ -1921,7 +1839,6 @@
final core::List<core::int*>* #t350 = <core::int*>[];
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
for (final core::int* #t351 in <core::int*>[let final<BottomType> #t352 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
^" in "bar" as{TypeError} core::int*])
#t350.{core::List::add}(#t351);
@@ -1930,7 +1847,6 @@
final core::Set<core::int*>* #t353 = col::LinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
for (final core::int* #t354 in <core::int*>[let final<BottomType> #t355 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
^" in "bar" as{TypeError} core::int*])
#t353.{core::Set::add}(#t354);
@@ -1940,15 +1856,12 @@
final core::Map<core::int*, core::int*>* #t356 = <core::int*, core::int*>{};
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
for (final core::MapEntry<core::int*, core::int*>* #t357 in <core::int*, core::int*>{let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
^" in "bar" as{TypeError} core::int*: let final<BottomType> #t359 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
#t356.{core::Map::[]=}(#t357.{core::MapEntry::key}, #t357.{core::MapEntry::value});
#t356.{core::Map::[]=}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
^" in "baz" as{TypeError} core::int*, null);
} =>#t356;
@@ -1981,12 +1894,10 @@
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError} core::bool*)
#t363.{core::List::add}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
^" in 42 as{TypeError} core::String*);
else
#t363.{core::List::add}(let final<BottomType> #t365 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
^" in 3.14 as{TypeError} core::String*);
} =>#t363;
@@ -1995,12 +1906,10 @@
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError} core::bool*)
#t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
^" in 42 as{TypeError} core::String*);
else
#t366.{core::Set::add}(let final<BottomType> #t368 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
^" in 3.14 as{TypeError} core::String*);
#t366.{core::Set::add}(null);
@@ -2010,12 +1919,10 @@
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError} core::bool*)
#t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
^" in 42 as{TypeError} core::String*);
else
#t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
^" in 3.14 as{TypeError} core::String*);
#t369.{core::Map::[]=}("baz", null);
@@ -2139,10 +2046,8 @@
core::List<core::int*>* list20 = block {
final core::List<core::int*>* #t388 = <core::int*>[];
for (core::int* i in <core::int*>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var list20 = [for (int i in [\"not\", \"int\"]) i];
^" in "not" as{TypeError} core::int*, let final<BottomType> #t390 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var list20 = [for (int i in [\"not\", \"int\"]) i];
^" in "int" as{TypeError} core::int*])
#t388.{core::List::add}(i);
@@ -2150,10 +2055,8 @@
core::Set<core::int*>* set20 = block {
final core::Set<core::int*>* #t391 = col::LinkedHashSet::•<core::int*>();
for (core::int* i in <core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var set20 = {for (int i in [\"not\", \"int\"]) i, null};
^" in "not" as{TypeError} core::int*, let final<BottomType> #t393 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var set20 = {for (int i in [\"not\", \"int\"]) i, null};
^" in "int" as{TypeError} core::int*])
#t391.{core::Set::add}(i);
@@ -2162,10 +2065,8 @@
core::Map<core::String*, core::int*>* map20 = block {
final core::Map<core::String*, core::int*>* #t394 = <core::String*, core::int*>{};
for (core::int* i in <core::int*>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
^" in "not" as{TypeError} core::int*, let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
^" in "int" as{TypeError} core::int*])
#t394.{core::Map::[]=}("bar", i);
@@ -2200,10 +2101,8 @@
core::List<core::int*>* list40 = block {
final core::List<core::int*>* #t403 = <core::int*>[];
await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t404 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
^" in "not" as{TypeError} core::int*, let final<BottomType> #t405 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
^" in "int" as{TypeError} core::int*]))
#t403.{core::List::add}(i);
@@ -2211,10 +2110,8 @@
core::Set<core::int*>* set40 = block {
final core::Set<core::int*>* #t406 = col::LinkedHashSet::•<core::int*>();
await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t407 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
^" in "not" as{TypeError} core::int*, let final<BottomType> #t408 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
^" in "int" as{TypeError} core::int*]))
#t406.{core::Set::add}(i);
@@ -2223,10 +2120,8 @@
core::Map<core::String*, core::int*>* map40 = block {
final core::Map<core::String*, core::int*>* #t409 = <core::String*, core::int*>{};
await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t410 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
^" in "not" as{TypeError} core::int*, let final<BottomType> #t411 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
^" in "int" as{TypeError} core::int*]))
#t409.{core::Map::[]=}("bar", i);
@@ -2252,7 +2147,6 @@
core::List<core::int*>* list60 = block {
final core::List<core::int*>* #t415 = <core::int*>[];
for (; let final<BottomType> #t416 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
var list60 = [for (; \"not bool\";) 42];
^" in "not bool" as{TypeError} core::bool*; )
#t415.{core::List::add}(42);
@@ -2260,7 +2154,6 @@
core::Set<core::int*>* set60 = block {
final core::Set<core::int*>* #t417 = col::LinkedHashSet::•<core::int*>();
for (; let final<BottomType> #t418 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
var set60 = {for (; \"not bool\";) 42, null};
^" in "not bool" as{TypeError} core::bool*; )
#t417.{core::Set::add}(42);
@@ -2269,7 +2162,6 @@
core::Map<core::String*, core::int*>* map60 = block {
final core::Map<core::String*, core::int*>* #t419 = <core::String*, core::int*>{};
for (; let final<BottomType> #t420 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
^" in "not bool" as{TypeError} core::bool*; )
#t419.{core::Map::[]=}("bar", 42);
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
index 27878cb..4360cc9 100644
--- a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
@@ -36,32 +36,26 @@
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>[if (oracle("foo")) "bar"];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>{if (oracle("foo")) "bar", null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>[if (oracle("foo")) ...["bar"]];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>{if (oracle("foo")) ...["bar"], null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
// ^
//
@@ -81,32 +75,26 @@
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>[if (oracle("foo")) 42 else 3.14];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>[if (oracle("foo")) 42 else 3.14];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>{if (oracle("foo")) 42 else 3.14, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>{if (oracle("foo")) 42 else 3.14, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
// ^
//
@@ -149,57 +137,46 @@
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
// List<int> list20 = [if (42) 42];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
// Set<int> set20 = {if (42) 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
// Map<int, int> map30 = {if (42) 42: 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// List<String> list40 = <String>[if (oracle("foo")) true else 42];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// List<String> list40 = <String>[if (oracle("foo")) true else 42];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// Set<String> set40 = <String>{if (oracle("foo")) true else 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// Set<String> set40 = <String>{if (oracle("foo")) true else 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
// ^
//
@@ -231,52 +208,42 @@
// ^^^^^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>[for (int i = 0; oracle("foo"); i++) "bar"];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
// ^
//
@@ -296,32 +263,26 @@
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
// ^
//
@@ -371,32 +332,26 @@
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var list20 = [for (int i in ["not", "int"]) i];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var list20 = [for (int i in ["not", "int"]) i];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var set20 = {for (int i in ["not", "int"]) i, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var set20 = {for (int i in ["not", "int"]) i, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
// ^
//
@@ -416,47 +371,38 @@
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
// var list60 = [for (; "not bool";) 42];
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
// var set60 = {for (; "not bool";) 42, null};
// ^
//
// pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
// var map60 = {for (; "not bool";) "bar": 42, "baz": null};
// ^
//
@@ -1024,7 +970,6 @@
final core::List<core::int*>* #t140 = <core::int*>[];
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t140.{core::List::add}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>[if (oracle(\"foo\")) \"bar\"];
^" in "bar" as{TypeError} core::int*);
} =>#t140;
@@ -1032,7 +977,6 @@
final core::Set<core::int*>* #t142 = col::LinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>{if (oracle(\"foo\")) \"bar\", null};
^" in "bar" as{TypeError} core::int*);
#t142.{core::Set::add}(null);
@@ -1041,7 +985,6 @@
final core::Map<core::String*, core::int*>* #t144 = <core::String*, core::int*>{};
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
^" in "bar" as{TypeError} core::int*);
#t144.{core::Map::[]=}("baz", null);
@@ -1050,7 +993,6 @@
final core::List<core::int*>* #t146 = <core::int*>[];
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
for (final core::int* #t147 in <core::int*>[let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>[if (oracle(\"foo\")) ...[\"bar\"]];
^" in "bar" as{TypeError} core::int*])
#t146.{core::List::add}(#t147);
@@ -1059,7 +1001,6 @@
final core::Set<core::int*>* #t149 = col::LinkedHashSet::•<core::int*>();
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
for (final core::int* #t150 in <core::int*>[let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>{if (oracle(\"foo\")) ...[\"bar\"], null};
^" in "bar" as{TypeError} core::int*])
#t149.{core::Set::add}(#t150);
@@ -1069,7 +1010,6 @@
final core::Map<core::String*, core::int*>* #t152 = <core::String*, core::int*>{};
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
for (final core::MapEntry<core::String*, core::int*>* #t153 in <core::String*, core::int*>{"bar": let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
#t152.{core::Map::[]=}(#t153.{core::MapEntry::key}, #t153.{core::MapEntry::value});
@@ -1103,12 +1043,10 @@
final core::List<core::String*>* #t157 = <core::String*>[];
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t157.{core::List::add}(let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>[if (oracle(\"foo\")) 42 else 3.14];
^" in 42 as{TypeError} core::String*);
else
#t157.{core::List::add}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>[if (oracle(\"foo\")) 42 else 3.14];
^" in 3.14 as{TypeError} core::String*);
} =>#t157;
@@ -1116,12 +1054,10 @@
final core::Set<core::String*>* #t160 = col::LinkedHashSet::•<core::String*>();
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>{if (oracle(\"foo\")) 42 else 3.14, null};
^" in 42 as{TypeError} core::String*);
else
#t160.{core::Set::add}(let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>{if (oracle(\"foo\")) 42 else 3.14, null};
^" in 3.14 as{TypeError} core::String*);
#t160.{core::Set::add}(null);
@@ -1130,12 +1066,10 @@
final core::Map<core::String*, core::String*>* #t163 = <core::String*, core::String*>{};
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
^" in 42 as{TypeError} core::String*);
else
#t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
^" in 3.14 as{TypeError} core::String*);
#t163.{core::Map::[]=}("baz", null);
@@ -1217,7 +1151,6 @@
core::List<core::int*>* list20 = block {
final core::List<core::int*>* #t170 = <core::int*>[];
if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
List<int> list20 = [if (42) 42];
^" in 42 as{TypeError} core::bool*)
#t170.{core::List::add}(42);
@@ -1225,7 +1158,6 @@
core::Set<core::int*>* set20 = block {
final core::Set<core::int*>* #t172 = col::LinkedHashSet::•<core::int*>();
if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
Set<int> set20 = {if (42) 42};
^" in 42 as{TypeError} core::bool*)
#t172.{core::Set::add}(42);
@@ -1233,7 +1165,6 @@
core::Map<core::int*, core::int*>* map30 = block {
final core::Map<core::int*, core::int*>* #t174 = <core::int*, core::int*>{};
if(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
Map<int, int> map30 = {if (42) 42: 42};
^" in 42 as{TypeError} core::bool*)
#t174.{core::Map::[]=}(42, 42);
@@ -1242,12 +1173,10 @@
final core::List<core::String*>* #t176 = <core::String*>[];
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t176.{core::List::add}(let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
^" in true as{TypeError} core::String*);
else
#t176.{core::List::add}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
^" in 42 as{TypeError} core::String*);
} =>#t176;
@@ -1255,12 +1184,10 @@
final core::Set<core::String*>* #t179 = col::LinkedHashSet::•<core::String*>();
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
^" in true as{TypeError} core::String*);
else
#t179.{core::Set::add}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
^" in 42 as{TypeError} core::String*);
} =>#t179;
@@ -1268,12 +1195,10 @@
final core::Map<core::String*, core::int*>* #t182 = <core::String*, core::int*>{};
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t182.{core::Map::[]=}(let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
^" in true as{TypeError} core::String*, 42);
else
#t182.{core::Map::[]=}(let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
^" in 42 as{TypeError} core::String*, 42);
} =>#t182;
@@ -1281,12 +1206,10 @@
final core::Map<core::int*, core::String*>* #t185 = <core::int*, core::String*>{};
if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
#t185.{core::Map::[]=}(42, let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
^" in true as{TypeError} core::String*);
else
#t185.{core::Map::[]=}(42, let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
^" in 42 as{TypeError} core::String*);
} =>#t185;
@@ -1904,7 +1827,6 @@
final core::List<core::int*>* #t342 = <core::int*>[];
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
#t342.{core::List::add}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
^" in "bar" as{TypeError} core::int*);
} =>#t342;
@@ -1912,7 +1834,6 @@
final core::Set<core::int*>* #t344 = col::LinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
#t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
^" in "bar" as{TypeError} core::int*);
#t344.{core::Set::add}(null);
@@ -1921,14 +1842,11 @@
final core::Map<core::int*, core::int*>* #t346 = <core::int*, core::int*>{};
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
#t346.{core::Map::[]=}(let final<BottomType> #t347 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
^" in "bar" as{TypeError} core::int*, let final<BottomType> #t348 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
^" in "bar" as{TypeError} core::int*);
#t346.{core::Map::[]=}(let final<BottomType> #t349 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
^" in "baz" as{TypeError} core::int*, null);
} =>#t346;
@@ -1936,7 +1854,6 @@
final core::List<core::int*>* #t350 = <core::int*>[];
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
for (final core::int* #t351 in <core::int*>[let final<BottomType> #t352 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
^" in "bar" as{TypeError} core::int*])
#t350.{core::List::add}(#t351);
@@ -1945,7 +1862,6 @@
final core::Set<core::int*>* #t353 = col::LinkedHashSet::•<core::int*>();
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
for (final core::int* #t354 in <core::int*>[let final<BottomType> #t355 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
^" in "bar" as{TypeError} core::int*])
#t353.{core::Set::add}(#t354);
@@ -1955,15 +1871,12 @@
final core::Map<core::int*, core::int*>* #t356 = <core::int*, core::int*>{};
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
for (final core::MapEntry<core::int*, core::int*>* #t357 in <core::int*, core::int*>{let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
^" in "bar" as{TypeError} core::int*: let final<BottomType> #t359 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
#t356.{core::Map::[]=}(#t357.{core::MapEntry::key}, #t357.{core::MapEntry::value});
#t356.{core::Map::[]=}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
<int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
^" in "baz" as{TypeError} core::int*, null);
} =>#t356;
@@ -1996,12 +1909,10 @@
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError} core::bool*)
#t363.{core::List::add}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
^" in 42 as{TypeError} core::String*);
else
#t363.{core::List::add}(let final<BottomType> #t365 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
^" in 3.14 as{TypeError} core::String*);
} =>#t363;
@@ -2010,12 +1921,10 @@
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError} core::bool*)
#t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
^" in 42 as{TypeError} core::String*);
else
#t366.{core::Set::add}(let final<BottomType> #t368 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
^" in 3.14 as{TypeError} core::String*);
#t366.{core::Set::add}(null);
@@ -2025,12 +1934,10 @@
for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
if(self::oracle<dynamic>() as{TypeError} core::bool*)
#t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
^" in 42 as{TypeError} core::String*);
else
#t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
<String, String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) \"bar\": 42 else \"bar\": 3.14, \"baz\": null};
^" in 3.14 as{TypeError} core::String*);
#t369.{core::Map::[]=}("baz", null);
@@ -2154,10 +2061,8 @@
core::List<core::int*>* list20 = block {
final core::List<core::int*>* #t388 = <core::int*>[];
for (core::int* i in <core::int*>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var list20 = [for (int i in [\"not\", \"int\"]) i];
^" in "not" as{TypeError} core::int*, let final<BottomType> #t390 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var list20 = [for (int i in [\"not\", \"int\"]) i];
^" in "int" as{TypeError} core::int*])
#t388.{core::List::add}(i);
@@ -2165,10 +2070,8 @@
core::Set<core::int*>* set20 = block {
final core::Set<core::int*>* #t391 = col::LinkedHashSet::•<core::int*>();
for (core::int* i in <core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var set20 = {for (int i in [\"not\", \"int\"]) i, null};
^" in "not" as{TypeError} core::int*, let final<BottomType> #t393 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var set20 = {for (int i in [\"not\", \"int\"]) i, null};
^" in "int" as{TypeError} core::int*])
#t391.{core::Set::add}(i);
@@ -2177,10 +2080,8 @@
core::Map<core::String*, core::int*>* map20 = block {
final core::Map<core::String*, core::int*>* #t394 = <core::String*, core::int*>{};
for (core::int* i in <core::int*>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
^" in "not" as{TypeError} core::int*, let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
^" in "int" as{TypeError} core::int*])
#t394.{core::Map::[]=}("bar", i);
@@ -2274,10 +2175,8 @@
final core::List<core::int*>* #t412 = <core::int*>[];
{
dynamic :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t413 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
^" in "not" as{TypeError} core::int*, let final<BottomType> #t414 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
^" in "int" as{TypeError} core::int*]);
asy::_asyncStarListenHelper(:stream, :async_op);
@@ -2304,10 +2203,8 @@
final core::Set<core::int*>* #t418 = col::LinkedHashSet::•<core::int*>();
{
dynamic :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t419 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
^" in "not" as{TypeError} core::int*, let final<BottomType> #t420 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
^" in "int" as{TypeError} core::int*]);
asy::_asyncStarListenHelper(:stream, :async_op);
@@ -2336,10 +2233,8 @@
final core::Map<core::String*, core::int*>* #t424 = <core::String*, core::int*>{};
{
dynamic :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t425 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
^" in "not" as{TypeError} core::int*, let final<BottomType> #t426 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
^" in "int" as{TypeError} core::int*]);
asy::_asyncStarListenHelper(:stream, :async_op);
@@ -2385,7 +2280,6 @@
core::List<core::int*>* list60 = block {
final core::List<core::int*>* #t433 = <core::int*>[];
for (; let final<BottomType> #t434 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
var list60 = [for (; \"not bool\";) 42];
^" in "not bool" as{TypeError} core::bool*; )
#t433.{core::List::add}(42);
@@ -2393,7 +2287,6 @@
core::Set<core::int*>* set60 = block {
final core::Set<core::int*>* #t435 = col::LinkedHashSet::•<core::int*>();
for (; let final<BottomType> #t436 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
var set60 = {for (; \"not bool\";) 42, null};
^" in "not bool" as{TypeError} core::bool*; )
#t435.{core::Set::add}(42);
@@ -2402,7 +2295,6 @@
core::Map<core::String*, core::int*>* map60 = block {
final core::Map<core::String*, core::int*>* #t437 = <core::String*, core::int*>{};
for (; let final<BottomType> #t438 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
^" in "not bool" as{TypeError} core::bool*; )
#t437.{core::Map::[]=}("bar", 42);
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.strong.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.strong.expect
index 4c4931a..ab5443b 100644
--- a/pkg/front_end/testcases/general/function_type_assignments.dart.strong.expect
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.strong.expect
@@ -3,19 +3,16 @@
// Problems in library:
//
// pkg/front_end/testcases/general/function_type_assignments.dart:11:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String x = identity; // No bound
// ^
//
// pkg/front_end/testcases/general/function_type_assignments.dart:12:12: Error: A value of type 'T Function<T extends Object>(T)' can't be assigned to a variable of type 'String'.
// - 'Object' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String y = identityObject; // Object bound
// ^
//
// pkg/front_end/testcases/general/function_type_assignments.dart:13:12: Error: A value of type 'T Function<T extends List<T>>(T)' can't be assigned to a variable of type 'String'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String z = identityList; // List<T> bound
// ^
//
@@ -23,17 +20,14 @@
import "dart:core" as core;
static field core::String* x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/function_type_assignments.dart:11:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String x = identity; // No bound
^" in (#C1) as{TypeError} core::String*;
static field core::String* y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/general/function_type_assignments.dart:12:12: Error: A value of type 'T Function<T extends Object>(T)' can't be assigned to a variable of type 'String'.
- 'Object' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String y = identityObject; // Object bound
^" in (#C2) as{TypeError} core::String*;
static field core::String* z = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/general/function_type_assignments.dart:13:12: Error: A value of type 'T Function<T extends List<T>>(T)' can't be assigned to a variable of type 'String'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String z = identityList; // List<T> bound
^" in (#C3) as{TypeError} core::String*;
static method identity<T extends core::Object* = dynamic>(self::identity::T* t) → self::identity::T*
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.strong.transformed.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.strong.transformed.expect
index 4c4931a..ab5443b 100644
--- a/pkg/front_end/testcases/general/function_type_assignments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.strong.transformed.expect
@@ -3,19 +3,16 @@
// Problems in library:
//
// pkg/front_end/testcases/general/function_type_assignments.dart:11:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String x = identity; // No bound
// ^
//
// pkg/front_end/testcases/general/function_type_assignments.dart:12:12: Error: A value of type 'T Function<T extends Object>(T)' can't be assigned to a variable of type 'String'.
// - 'Object' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String y = identityObject; // Object bound
// ^
//
// pkg/front_end/testcases/general/function_type_assignments.dart:13:12: Error: A value of type 'T Function<T extends List<T>>(T)' can't be assigned to a variable of type 'String'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String z = identityList; // List<T> bound
// ^
//
@@ -23,17 +20,14 @@
import "dart:core" as core;
static field core::String* x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/function_type_assignments.dart:11:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String x = identity; // No bound
^" in (#C1) as{TypeError} core::String*;
static field core::String* y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/general/function_type_assignments.dart:12:12: Error: A value of type 'T Function<T extends Object>(T)' can't be assigned to a variable of type 'String'.
- 'Object' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String y = identityObject; // Object bound
^" in (#C2) as{TypeError} core::String*;
static field core::String* z = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/general/function_type_assignments.dart:13:12: Error: A value of type 'T Function<T extends List<T>>(T)' can't be assigned to a variable of type 'String'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String z = identityList; // List<T> bound
^" in (#C3) as{TypeError} core::String*;
static method identity<T extends core::Object* = dynamic>(self::identity::T* t) → self::identity::T*
diff --git a/pkg/front_end/testcases/general/generic_function_type_in_message.dart b/pkg/front_end/testcases/general/generic_function_type_in_message.dart
new file mode 100644
index 0000000..e4eaf36
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_type_in_message.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2019, 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.
+
+num add<A extends num, B extends num>(A a, B b) => a + b;
+
+test() {
+ int x = add;
+}
+
+main() {
+ if (add(1,2) < 3) test();
+}
diff --git a/pkg/front_end/testcases/general/generic_function_type_in_message.dart.outline.expect b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.outline.expect
new file mode 100644
index 0000000..c236efd
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method add<A extends core::num* = core::num*, B extends core::num* = core::num*>(self::add::A* a, self::add::B* b) → core::num*
+ ;
+static method test() → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/general/generic_function_type_in_message.dart.strong.expect b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.strong.expect
new file mode 100644
index 0000000..e9469d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.strong.expect
@@ -0,0 +1,26 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/generic_function_type_in_message.dart:8:11: Error: A value of type 'num Function<A extends num, B extends num>(A, B)' can't be assigned to a variable of type 'int'.
+// int x = add;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method add<A extends core::num* = core::num*, B extends core::num* = core::num*>(self::add::A* a, self::add::B* b) → core::num*
+ return a.{core::num::+}(b);
+static method test() → dynamic {
+ core::int* x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/generic_function_type_in_message.dart:8:11: Error: A value of type 'num Function<A extends num, B extends num>(A, B)' can't be assigned to a variable of type 'int'.
+ int x = add;
+ ^" in (#C1) as{TypeError} core::int*;
+}
+static method main() → dynamic {
+ if(self::add<core::int*, core::int*>(1, 2).{core::num::<}(3))
+ self::test();
+}
+
+constants {
+ #C1 = tearoff self::add
+}
diff --git a/pkg/front_end/testcases/general/generic_function_type_in_message.dart.strong.transformed.expect b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.strong.transformed.expect
new file mode 100644
index 0000000..e9469d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/generic_function_type_in_message.dart.strong.transformed.expect
@@ -0,0 +1,26 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/generic_function_type_in_message.dart:8:11: Error: A value of type 'num Function<A extends num, B extends num>(A, B)' can't be assigned to a variable of type 'int'.
+// int x = add;
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+static method add<A extends core::num* = core::num*, B extends core::num* = core::num*>(self::add::A* a, self::add::B* b) → core::num*
+ return a.{core::num::+}(b);
+static method test() → dynamic {
+ core::int* x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/generic_function_type_in_message.dart:8:11: Error: A value of type 'num Function<A extends num, B extends num>(A, B)' can't be assigned to a variable of type 'int'.
+ int x = add;
+ ^" in (#C1) as{TypeError} core::int*;
+}
+static method main() → dynamic {
+ if(self::add<core::int*, core::int*>(1, 2).{core::num::<}(3))
+ self::test();
+}
+
+constants {
+ #C1 = tearoff self::add
+}
diff --git a/pkg/front_end/testcases/general/invalid_assignment.dart.strong.expect b/pkg/front_end/testcases/general/invalid_assignment.dart.strong.expect
index 0085ccf..b5ac381 100644
--- a/pkg/front_end/testcases/general/invalid_assignment.dart.strong.expect
+++ b/pkg/front_end/testcases/general/invalid_assignment.dart.strong.expect
@@ -3,18 +3,15 @@
// Problems in library:
//
// pkg/front_end/testcases/general/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// i = s;
// ^
//
// pkg/front_end/testcases/general/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// i ??= s;
// ^
//
// pkg/front_end/testcases/general/invalid_assignment.dart:15:5: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
// - 'A' is from 'pkg/front_end/testcases/general/invalid_assignment.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A'.
// a += 1;
// ^
//
@@ -31,18 +28,15 @@
static method test(core::int* i, core::String* s, self::A* a) → dynamic {
i = 1;
i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
i = s;
^" in s as{TypeError} core::int*;
i.{core::num::==}(null) ?{core::int*} i = 1 : null;
i.{core::num::==}(null) ?{core::Object*} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/general/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
i ??= s;
^" in s as{TypeError} core::int* : null;
a = new self::A::•();
a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/general/invalid_assignment.dart:15:5: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
- 'A' is from 'pkg/front_end/testcases/general/invalid_assignment.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A'.
a += 1;
^" in a.{self::A::+}(1) as{TypeError} self::A*;
}
diff --git a/pkg/front_end/testcases/general/invalid_assignment.dart.strong.transformed.expect b/pkg/front_end/testcases/general/invalid_assignment.dart.strong.transformed.expect
index 0085ccf..b5ac381 100644
--- a/pkg/front_end/testcases/general/invalid_assignment.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/invalid_assignment.dart.strong.transformed.expect
@@ -3,18 +3,15 @@
// Problems in library:
//
// pkg/front_end/testcases/general/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// i = s;
// ^
//
// pkg/front_end/testcases/general/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// i ??= s;
// ^
//
// pkg/front_end/testcases/general/invalid_assignment.dart:15:5: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
// - 'A' is from 'pkg/front_end/testcases/general/invalid_assignment.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A'.
// a += 1;
// ^
//
@@ -31,18 +28,15 @@
static method test(core::int* i, core::String* s, self::A* a) → dynamic {
i = 1;
i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
i = s;
^" in s as{TypeError} core::int*;
i.{core::num::==}(null) ?{core::int*} i = 1 : null;
i.{core::num::==}(null) ?{core::Object*} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/general/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
i ??= s;
^" in s as{TypeError} core::int* : null;
a = new self::A::•();
a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/general/invalid_assignment.dart:15:5: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
- 'A' is from 'pkg/front_end/testcases/general/invalid_assignment.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A'.
a += 1;
^" in a.{self::A::+}(1) as{TypeError} self::A*;
}
diff --git a/pkg/front_end/testcases/general/optional.dart.strong.expect b/pkg/front_end/testcases/general/optional.dart.strong.expect
index 42a1431..6c29683 100644
--- a/pkg/front_end/testcases/general/optional.dart.strong.expect
+++ b/pkg/front_end/testcases/general/optional.dart.strong.expect
@@ -5,7 +5,6 @@
// pkg/front_end/testcases/general/optional.dart:47:21: Error: The argument type 'InvalidListener' can't be assigned to the parameter type 'Listener'.
// - 'InvalidListener' is from 'pkg/front_end/testcases/general/optional.dart'.
// - 'Listener' is from 'pkg/front_end/testcases/general/optional.dart'.
-// Try changing the type of the parameter, or casting the argument to 'Listener'.
// extern.listen(new InvalidListener());
// ^
//
@@ -84,7 +83,6 @@
extern.{self::External::listen}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/optional.dart:47:21: Error: The argument type 'InvalidListener' can't be assigned to the parameter type 'Listener'.
- 'InvalidListener' is from 'pkg/front_end/testcases/general/optional.dart'.
- 'Listener' is from 'pkg/front_end/testcases/general/optional.dart'.
-Try changing the type of the parameter, or casting the argument to 'Listener'.
extern.listen(new InvalidListener());
^" in new self::InvalidListener::•() as{TypeError} self::Listener*);
dynamic nothing1 = foo.{self::Foo::method}();
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.expect
index 14038f4..1a27647 100644
--- a/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.expect
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
-// Try changing the type of the parameter, or casting the argument to 'T'.
// Foo.from(String _init) : this._internal(x: _init);
// ^
//
@@ -14,7 +13,6 @@
generic-covariant-impl field self::Foo::T* x;
constructor from(core::String* _init) → self::Foo<self::Foo::T*>*
: this self::Foo::_internal(x: let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
-Try changing the type of the parameter, or casting the argument to 'T'.
Foo.from(String _init) : this._internal(x: _init);
^" in _init as{TypeError} <BottomType>)
;
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.transformed.expect
index 14038f4..1a27647 100644
--- a/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
-// Try changing the type of the parameter, or casting the argument to 'T'.
// Foo.from(String _init) : this._internal(x: _init);
// ^
//
@@ -14,7 +13,6 @@
generic-covariant-impl field self::Foo::T* x;
constructor from(core::String* _init) → self::Foo<self::Foo::T*>*
: this self::Foo::_internal(x: let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
-Try changing the type of the parameter, or casting the argument to 'T'.
Foo.from(String _init) : this._internal(x: _init);
^" in _init as{TypeError} <BottomType>)
;
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
index 0013246..c5e1b01 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
@@ -13,31 +13,26 @@
//
// pkg/front_end/testcases/general/spread_collection_inference.dart:98:36: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int lhs30 = /*@ typeArgs=int* */ [...spread];
// ^
//
// pkg/front_end/testcases/general/spread_collection_inference.dart:100:36: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
// - 'Set' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int set30 = /*@ typeArgs=int* */ {...spread, 42};
// ^
//
// pkg/front_end/testcases/general/spread_collection_inference.dart:103:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
// - 'Set' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// {...spread};
// ^
//
// pkg/front_end/testcases/general/spread_collection_inference.dart:106:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
// - 'Map' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// {...mapSpread, "baz": 42};
// ^
//
// pkg/front_end/testcases/general/spread_collection_inference.dart:109:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
// - 'Map' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// {...mapSpread};
// ^
//
@@ -235,7 +230,6 @@
^";
core::int* lhs30 = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:98:36: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int lhs30 = /*@ typeArgs=int* */ [...spread];
^" in ( block {
final core::List<core::int*>* #t45 = <core::int*>[];
@@ -244,7 +238,6 @@
} =>#t45) as{TypeError} core::int*;
core::int* set30 = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:100:36: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
- 'Set' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int set30 = /*@ typeArgs=int* */ {...spread, 42};
^" in ( block {
final core::Set<core::int*>* #t48 = col::LinkedHashSet::•<core::int*>();
@@ -254,7 +247,6 @@
} =>#t48) as{TypeError} core::int*;
core::int* set30ambiguous = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:103:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
- 'Set' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
{...spread};
^" in ( block {
final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
@@ -265,7 +257,6 @@
} =>#t51) as{TypeError} core::int*;
core::int* map30 = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:106:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
- 'Map' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
{...mapSpread, \"baz\": 42};
^" in ( block {
final core::Map<core::String*, core::int*>* #t55 = <core::String*, core::int*>{};
@@ -275,7 +266,6 @@
} =>#t55) as{TypeError} core::int*;
core::int* map30ambiguous = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:109:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
- 'Map' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
{...mapSpread};
^" in ( block {
final core::Map<core::String*, core::int*>* #t58 = <core::String*, core::int*>{};
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
index 00963f1..3a6b58b 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
@@ -13,31 +13,26 @@
//
// pkg/front_end/testcases/general/spread_collection_inference.dart:98:36: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int lhs30 = /*@ typeArgs=int* */ [...spread];
// ^
//
// pkg/front_end/testcases/general/spread_collection_inference.dart:100:36: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
// - 'Set' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int set30 = /*@ typeArgs=int* */ {...spread, 42};
// ^
//
// pkg/front_end/testcases/general/spread_collection_inference.dart:103:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
// - 'Set' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// {...spread};
// ^
//
// pkg/front_end/testcases/general/spread_collection_inference.dart:106:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
// - 'Map' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// {...mapSpread, "baz": 42};
// ^
//
// pkg/front_end/testcases/general/spread_collection_inference.dart:109:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
// - 'Map' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// {...mapSpread};
// ^
//
@@ -235,7 +230,6 @@
^";
core::int* lhs30 = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:98:36: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int lhs30 = /*@ typeArgs=int* */ [...spread];
^" in ( block {
final core::List<core::int*>* #t45 = <core::int*>[];
@@ -244,7 +238,6 @@
} =>#t45) as{TypeError} core::int*;
core::int* set30 = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:100:36: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
- 'Set' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int set30 = /*@ typeArgs=int* */ {...spread, 42};
^" in ( block {
final core::Set<core::int*>* #t48 = col::LinkedHashSet::•<core::int*>();
@@ -254,7 +247,6 @@
} =>#t48) as{TypeError} core::int*;
core::int* set30ambiguous = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:103:7: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
- 'Set' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
{...spread};
^" in ( block {
final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
@@ -265,7 +257,6 @@
} =>#t51) as{TypeError} core::int*;
core::int* map30 = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:106:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
- 'Map' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
{...mapSpread, \"baz\": 42};
^" in ( block {
final core::Map<core::String*, core::int*>* #t55 = <core::String*, core::int*>{};
@@ -275,7 +266,6 @@
} =>#t55) as{TypeError} core::int*;
core::int* map30ambiguous = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:109:7: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
- 'Map' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
{...mapSpread};
^" in ( block {
final core::Map<core::String*, core::int*>* #t58 = <core::String*, core::int*>{};
diff --git a/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.expect b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.expect
index b0d2afa..ee44e8f 100644
--- a/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.expect
+++ b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.expect
@@ -6,7 +6,6 @@
// - 'List' is from 'dart:core'.
// - 'int/*1*/' is from 'pkg/front_end/testcases/general/type_parameter_type_named_int.dart'.
// - 'int/*2*/' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
// list = value;
// ^
//
@@ -30,7 +29,6 @@
- 'List' is from 'dart:core'.
- 'int/*1*/' is from 'pkg/front_end/testcases/general/type_parameter_type_named_int.dart'.
- 'int/*2*/' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
list = value;
^" in value as{TypeError} core::List<core::int*>*;
}
diff --git a/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.transformed.expect
index b0d2afa..ee44e8f 100644
--- a/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.transformed.expect
@@ -6,7 +6,6 @@
// - 'List' is from 'dart:core'.
// - 'int/*1*/' is from 'pkg/front_end/testcases/general/type_parameter_type_named_int.dart'.
// - 'int/*2*/' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
// list = value;
// ^
//
@@ -30,7 +29,6 @@
- 'List' is from 'dart:core'.
- 'int/*1*/' is from 'pkg/front_end/testcases/general/type_parameter_type_named_int.dart'.
- 'int/*2*/' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
list = value;
^" in value as{TypeError} core::List<core::int*>*;
}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
index 45ab27e..8d7d832 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ 1;
// ^
//
@@ -16,7 +15,6 @@
() →* core::String* g = f;
g = () → core::String* {
return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ 1;
^" in 1 as{TypeError} core::String*;
};
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect
index 45ab27e..8d7d832 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ 1;
// ^
//
@@ -16,7 +15,6 @@
() →* core::String* g = f;
g = () → core::String* {
return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:12:45: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ 1;
^" in 1 as{TypeError} core::String*;
};
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
index d506668..f8657ce 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
// ^
//
@@ -24,7 +23,6 @@
self::C<core::num*>* c_num2 = let final self::C<core::num*>* #t1 = new self::C::•<core::num*>(456) in let final dynamic #t2 = #t1.{self::C::t} = 1.0 in #t1;
self::C<dynamic>* c_dynamic = new self::C::•<dynamic>(42);
x.{self::C::t} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
^" in "hello" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
index 095e6b5..3bc4490 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
// ^
//
@@ -24,7 +23,6 @@
self::C<core::num*>* c_num2 = let final self::C<core::num*>* #t1 = new self::C::•<core::num*>(456) in let final core::double* #t2 = #t1.{self::C::t} = 1.0 in #t1;
self::C<dynamic>* c_dynamic = new self::C::•<dynamic>(42);
x.{self::C::t} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
^" in "hello" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
index d2d97ba..860cc4e 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
// ^
//
@@ -24,7 +23,6 @@
static method test() → dynamic {
self::C<core::int*>* x = self::C::•<core::int*>(42);
x.{self::C::t} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
^" in "hello" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
index d2d97ba..860cc4e 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
// ^
//
@@ -24,7 +23,6 @@
static method test() → dynamic {
self::C<core::int*>* x = self::C::•<core::int*>(42);
x.{self::C::t} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
^" in "hello" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
index 70d558d..a30551f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// l = /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
// ^
//
@@ -13,7 +12,6 @@
static method test() → void {
core::List<core::int*>* l;
l = <core::int*>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
l = /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"];
^" in "hello" as{TypeError} core::int*];
l = l = <core::int*>[1];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect
index 70d558d..a30551f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// l = /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
// ^
//
@@ -13,7 +12,6 @@
static method test() → void {
core::List<core::int*>* l;
l = <core::int*>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
l = /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"];
^" in "hello" as{TypeError} core::int*];
l = l = <core::int*>[1];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
index 362c6b2..fb74527 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
@@ -3,52 +3,42 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
// ^
//
@@ -79,51 +69,41 @@
new self::F0::•(<core::int*>[]);
new self::F0::•(<core::int*>[3]);
new self::F0::•(<core::int*>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
new self::F0::•(<core::int*>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
new self::F1::•(a: <core::int*>[]);
new self::F1::•(a: <core::int*>[3]);
new self::F1::•(a: <core::int*>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^" in "hello" as{TypeError} core::int*]);
new self::F1::•(a: <core::int*>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
new self::F2::•(<core::int*>[]);
new self::F2::•(<core::int*>[3]);
new self::F2::•(<core::int*>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
new self::F2::•(<core::int*>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
new self::F3::•(<core::Iterable<core::int*>*>[]);
new self::F3::•(<core::Iterable<core::int*>*>[<core::int*>[3]]);
new self::F3::•(<core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
^" in "hello" as{TypeError} core::int*]]);
new self::F3::•(<core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
new self::F4::•(a: <core::Iterable<core::int*>*>[]);
new self::F4::•(a: <core::Iterable<core::int*>*>[<core::int*>[3]]);
new self::F4::•(a: <core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
^" in "hello" as{TypeError} core::int*]]);
new self::F4::•(a: <core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect
index 362c6b2..fb74527 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect
@@ -3,52 +3,42 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
// ^
//
@@ -79,51 +69,41 @@
new self::F0::•(<core::int*>[]);
new self::F0::•(<core::int*>[3]);
new self::F0::•(<core::int*>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
new self::F0::•(<core::int*>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
new self::F1::•(a: <core::int*>[]);
new self::F1::•(a: <core::int*>[3]);
new self::F1::•(a: <core::int*>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^" in "hello" as{TypeError} core::int*]);
new self::F1::•(a: <core::int*>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
new self::F2::•(<core::int*>[]);
new self::F2::•(<core::int*>[3]);
new self::F2::•(<core::int*>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
new self::F2::•(<core::int*>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
new self::F3::•(<core::Iterable<core::int*>*>[]);
new self::F3::•(<core::Iterable<core::int*>*>[<core::int*>[3]]);
new self::F3::•(<core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
^" in "hello" as{TypeError} core::int*]]);
new self::F3::•(<core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
new self::F4::•(a: <core::Iterable<core::int*>*>[]);
new self::F4::•(a: <core::Iterable<core::int*>*>[<core::int*>[3]]);
new self::F4::•(a: <core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
^" in "hello" as{TypeError} core::int*]]);
new self::F4::•(a: <core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
index 25b17e9..50c0c51 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
@@ -3,52 +3,42 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// f1(a: /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
// ^
//
@@ -64,51 +54,41 @@
self::f0(<core::int*>[]);
self::f0(<core::int*>[3]);
self::f0(<core::int*>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
self::f0(<core::int*>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
^" in "hello" as{TypeError} core::int*, 3]);
self::f1(a: <core::int*>[]);
self::f1(a: <core::int*>[3]);
self::f1(a: <core::int*>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
f1(a: /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
self::f1(a: <core::int*>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
self::f2(<core::int*>[]);
self::f2(<core::int*>[3]);
self::f2(<core::int*>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
self::f2(<core::int*>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
^" in "hello" as{TypeError} core::int*, 3]);
self::f3(<core::Iterable<core::int*>*>[]);
self::f3(<core::Iterable<core::int*>*>[<core::int*>[3]]);
self::f3(<core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
^" in "hello" as{TypeError} core::int*]]);
self::f3(<core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
self::f4(a: <core::Iterable<core::int*>*>[]);
self::f4(a: <core::Iterable<core::int*>*>[<core::int*>[3]]);
self::f4(a: <core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
^" in "hello" as{TypeError} core::int*]]);
self::f4(a: <core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect
index 25b17e9..50c0c51 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect
@@ -3,52 +3,42 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// f1(a: /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
// ^
//
@@ -64,51 +54,41 @@
self::f0(<core::int*>[]);
self::f0(<core::int*>[3]);
self::f0(<core::int*>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
self::f0(<core::int*>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
^" in "hello" as{TypeError} core::int*, 3]);
self::f1(a: <core::int*>[]);
self::f1(a: <core::int*>[3]);
self::f1(a: <core::int*>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
f1(a: /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
self::f1(a: <core::int*>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:23:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
self::f2(<core::int*>[]);
self::f2(<core::int*>[3]);
self::f2(<core::int*>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
self::f2(<core::int*>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\", 3]);
^" in "hello" as{TypeError} core::int*, 3]);
self::f3(<core::Iterable<core::int*>*>[]);
self::f3(<core::Iterable<core::int*>*>[<core::int*>[3]]);
self::f3(<core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
^" in "hello" as{TypeError} core::int*]]);
self::f3(<core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
self::f4(a: <core::Iterable<core::int*>*>[]);
self::f4(a: <core::Iterable<core::int*>*>[<core::int*>[3]]);
self::f4(a: <core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
^" in "hello" as{TypeError} core::int*]]);
self::f4(a: <core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
index e7f54af..e52fb83 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
@@ -3,53 +3,43 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:69: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String Function(int)'.
// l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:80: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// l3 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (int x) => 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ x;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:76: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function(int)'.
// l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=List<String*>* */ (String
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// x;
// ^
//
@@ -67,16 +57,13 @@
(core::int*) →* core::String* l0 = (core::int* x) → core::Null? => null;
(core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
(core::int*) →* core::String* l2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:69: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
-Try changing the type of the left hand side, or casting the right hand side to 'String Function(int)'.
l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
^" in ((core::String* x) → core::String* => "hello") as{TypeError} (core::int*) →* core::String*;
(core::int*) →* core::String* l3 = (core::int* x) → core::String* => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:80: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
l3 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (int x) => 3;
^" in 3 as{TypeError} core::String*;
(core::int*) →* core::String* l4 = (core::int* x) → core::String* {
return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ 3;
^" in 3 as{TypeError} core::String*;
};
@@ -85,18 +72,15 @@
(core::int*) →* core::String* l0 = (core::int* x) → core::Null? => null;
(core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
(core::int*) →* core::String* l2 = (core::int* x) → core::String* => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
3;
^" in 3 as{TypeError} core::String*;
(core::int*) →* core::String* l3 = (core::int* x) → core::String* {
return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ 3;
^" in 3 as{TypeError} core::String*;
};
(core::int*) →* core::String* l4 = (core::int* x) → core::String* {
return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ x;
^" in x as{TypeError} core::String*;
};
@@ -106,16 +90,13 @@
(core::int*) →* core::List<core::String*>* l1 = (core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
(core::int*) →* core::List<core::String*>* l2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:76: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function(int)'.
l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=List<String*>* */ (String
^" in ((core::String* x) → core::List<core::String*>* => <core::String*>["hello"]) as{TypeError} (core::int*) →* core::List<core::String*>*;
(core::int*) →* core::List<core::String*>* l3 = (core::int* x) → core::List<core::String*>* => <core::String*>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*];
(core::int*) →* core::List<core::String*>* l4 = (core::int* x) → core::List<core::String*>* {
return <core::String*>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*];
};
@@ -124,7 +105,6 @@
(core::int*) →* core::int* l0 = (core::int* x) → core::int* => x;
(core::int*) →* core::int* l1 = (core::int* x) → core::int* => x.{core::num::+}(1);
(core::int*) →* core::String* l2 = (core::int* x) → core::String* => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
x;
^" in x as{TypeError} core::String*;
(core::int*) →* core::String* l3 = (core::int* x) → core::String* => invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'int'.
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
index e7f54af..e52fb83 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
@@ -3,53 +3,43 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:69: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String Function(int)'.
// l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:80: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// l3 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (int x) => 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ x;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:76: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function(int)'.
// l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=List<String*>* */ (String
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// x;
// ^
//
@@ -67,16 +57,13 @@
(core::int*) →* core::String* l0 = (core::int* x) → core::Null? => null;
(core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
(core::int*) →* core::String* l2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:69: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
-Try changing the type of the left hand side, or casting the right hand side to 'String Function(int)'.
l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
^" in ((core::String* x) → core::String* => "hello") as{TypeError} (core::int*) →* core::String*;
(core::int*) →* core::String* l3 = (core::int* x) → core::String* => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:80: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
l3 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (int x) => 3;
^" in 3 as{TypeError} core::String*;
(core::int*) →* core::String* l4 = (core::int* x) → core::String* {
return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:20:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ 3;
^" in 3 as{TypeError} core::String*;
};
@@ -85,18 +72,15 @@
(core::int*) →* core::String* l0 = (core::int* x) → core::Null? => null;
(core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
(core::int*) →* core::String* l2 = (core::int* x) → core::String* => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
3;
^" in 3 as{TypeError} core::String*;
(core::int*) →* core::String* l3 = (core::int* x) → core::String* {
return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:31:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ 3;
^" in 3 as{TypeError} core::String*;
};
(core::int*) →* core::String* l4 = (core::int* x) → core::String* {
return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:34:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ x;
^" in x as{TypeError} core::String*;
};
@@ -106,16 +90,13 @@
(core::int*) →* core::List<core::String*>* l1 = (core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
(core::int*) →* core::List<core::String*>* l2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:76: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function(int)'.
l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=List<String*>* */ (String
^" in ((core::String* x) → core::List<core::String*>* => <core::String*>["hello"]) as{TypeError} (core::int*) →* core::List<core::String*>*;
(core::int*) →* core::List<core::String*>* l3 = (core::int* x) → core::List<core::String*>* => <core::String*>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:46:58: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*];
(core::int*) →* core::List<core::String*>* l4 = (core::int* x) → core::List<core::String*>* {
return <core::String*>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*];
};
@@ -124,7 +105,6 @@
(core::int*) →* core::int* l0 = (core::int* x) → core::int* => x;
(core::int*) →* core::int* l1 = (core::int* x) → core::int* => x.{core::num::+}(1);
(core::int*) →* core::String* l2 = (core::int* x) → core::String* => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:60:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
x;
^" in x as{TypeError} core::String*;
(core::int*) →* core::String* l3 = (core::int* x) → core::String* => invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:63:14: Error: The method 'substring' isn't defined for the class 'int'.
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
index df3f4ac..c46c3b5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
@@ -3,52 +3,42 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
// ^
//
@@ -79,51 +69,41 @@
new self::F0::•<core::int*>(<core::int*>[]);
new self::F0::•<core::int*>(<core::int*>[3]);
new self::F0::•<core::int*>(<core::int*>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
new self::F0::•<core::int*>(<core::int*>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
new self::F1::•<core::int*>(a: <core::int*>[]);
new self::F1::•<core::int*>(a: <core::int*>[3]);
new self::F1::•<core::int*>(a: <core::int*>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^" in "hello" as{TypeError} core::int*]);
new self::F1::•<core::int*>(a: <core::int*>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
new self::F2::•<core::int*>(<core::int*>[]);
new self::F2::•<core::int*>(<core::int*>[3]);
new self::F2::•<core::int*>(<core::int*>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
new self::F2::•<core::int*>(<core::int*>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
new self::F3::•<core::int*>(<core::Iterable<core::int*>*>[]);
new self::F3::•<core::int*>(<core::Iterable<core::int*>*>[<core::int*>[3]]);
new self::F3::•<core::int*>(<core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
^" in "hello" as{TypeError} core::int*]]);
new self::F3::•<core::int*>(<core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
new self::F4::•<core::int*>(a: <core::Iterable<core::int*>*>[]);
new self::F4::•<core::int*>(a: <core::Iterable<core::int*>*>[<core::int*>[3]]);
new self::F4::•<core::int*>(a: <core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
^" in "hello" as{TypeError} core::int*]]);
new self::F4::•<core::int*>(a: <core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
new self::F3::•<dynamic>(<core::Iterable<dynamic>*>[]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
index df3f4ac..c46c3b5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
@@ -3,52 +3,42 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
// ^
//
@@ -79,51 +69,41 @@
new self::F0::•<core::int*>(<core::int*>[]);
new self::F0::•<core::int*>(<core::int*>[3]);
new self::F0::•<core::int*>(<core::int*>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
new self::F0::•<core::int*>(<core::int*>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:34:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
new self::F1::•<core::int*>(a: <core::int*>[]);
new self::F1::•<core::int*>(a: <core::int*>[3]);
new self::F1::•<core::int*>(a: <core::int*>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:41:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^" in "hello" as{TypeError} core::int*]);
new self::F1::•<core::int*>(a: <core::int*>[let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:44:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
new self::F2::•<core::int*>(<core::int*>[]);
new self::F2::•<core::int*>(<core::int*>[3]);
new self::F2::•<core::int*>(<core::int*>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:72: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
^" in "hello" as{TypeError} core::int*]);
new self::F2::•<core::int*>(<core::int*>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:53:48: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3]);
new self::F3::•<core::int*>(<core::Iterable<core::int*>*>[]);
new self::F3::•<core::int*>(<core::Iterable<core::int*>*>[<core::int*>[3]]);
new self::F3::•<core::int*>(<core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
^" in "hello" as{TypeError} core::int*]]);
new self::F3::•<core::int*>(<core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
new self::F4::•<core::int*>(a: <core::Iterable<core::int*>*>[]);
new self::F4::•<core::int*>(a: <core::Iterable<core::int*>*>[<core::int*>[3]]);
new self::F4::•<core::int*>(a: <core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
^" in "hello" as{TypeError} core::int*]]);
new self::F4::•<core::int*>(a: <core::Iterable<core::int*>*>[<core::int*>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:70: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
^" in "hello" as{TypeError} core::int*], <core::int*>[3]]);
new self::F3::•<dynamic>(<core::Iterable<dynamic>*>[]);
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
index 3adb8ba..40d578f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
@@ -3,53 +3,43 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:68: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String Function<S>(int)'.
// v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (int x) => 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ x;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:75: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function<S>(int)'.
// v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=List<String*>* */ (String
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// x;
// ^
//
@@ -69,16 +59,13 @@
v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
v = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:68: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
-Try changing the type of the left hand side, or casting the right hand side to 'String Function<S>(int)'.
v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
^" in (<T extends core::Object* = dynamic>(core::String* x) → core::String* => "hello") as{TypeError} <S extends core::Object* = dynamic>(core::int*) →* core::String*;
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (int x) => 3;
^" in 3 as{TypeError} core::String*;
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ 3;
^" in 3 as{TypeError} core::String*;
};
@@ -90,18 +77,15 @@
v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
3;
^" in 3 as{TypeError} core::String*;
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ 3;
^" in 3 as{TypeError} core::String*;
};
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ x;
^" in x as{TypeError} core::String*;
};
@@ -114,16 +98,13 @@
v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
v = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:75: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function<S>(int)'.
v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=List<String*>* */ (String
^" in (<T extends core::Object* = dynamic>(core::String* x) → core::List<core::String*>* => <core::String*>["hello"]) as{TypeError} <S extends core::Object* = dynamic>(core::int*) →* core::List<core::String*>*;
v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* => <core::String*>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*];
v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* {
return <core::String*>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*];
};
@@ -140,7 +121,6 @@
x = <T extends core::Object* = dynamic>(core::int* x) → core::int* => x.{core::num::+}(1);
<T extends core::Object* = dynamic>(core::int*) →* core::String* y = int2String;
y = <T extends core::Object* = dynamic>(core::int* x) → core::String* => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
x;
^" in x as{TypeError} core::String*;
y = <T extends core::Object* = dynamic>(core::int* x) → core::String* => invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'int'.
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
index 3adb8ba..40d578f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
@@ -3,53 +3,43 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:68: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String Function<S>(int)'.
// v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (int x) => 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ 3;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// return /*error:RETURN_OF_INVALID_TYPE*/ x;
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:75: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function<S>(int)'.
// v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=List<String*>* */ (String
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// x;
// ^
//
@@ -69,16 +59,13 @@
v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
v = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:68: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
-Try changing the type of the left hand side, or casting the right hand side to 'String Function<S>(int)'.
v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
^" in (<T extends core::Object* = dynamic>(core::String* x) → core::String* => "hello") as{TypeError} <S extends core::Object* = dynamic>(core::int*) →* core::String*;
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (int x) => 3;
^" in 3 as{TypeError} core::String*;
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
return let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:18:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ 3;
^" in 3 as{TypeError} core::String*;
};
@@ -90,18 +77,15 @@
v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
3;
^" in 3 as{TypeError} core::String*;
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
return let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:30:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ 3;
^" in 3 as{TypeError} core::String*;
};
v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:33:47: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
return /*error:RETURN_OF_INVALID_TYPE*/ x;
^" in x as{TypeError} core::String*;
};
@@ -114,16 +98,13 @@
v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
v = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:75: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function<S>(int)'.
v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=List<String*>* */ (String
^" in (<T extends core::Object* = dynamic>(core::String* x) → core::List<core::String*>* => <core::String*>["hello"]) as{TypeError} <S extends core::Object* = dynamic>(core::int*) →* core::List<core::String*>*;
v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* => <core::String*>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:46:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*];
v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* {
return <core::String*>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:50:52: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*];
};
@@ -140,7 +121,6 @@
x = <T extends core::Object* = dynamic>(core::int* x) → core::int* => x.{core::num::+}(1);
<T extends core::Object* = dynamic>(core::int*) →* core::String* y = int2String;
y = <T extends core::Object* = dynamic>(core::int* x) → core::String* => let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:64:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
x;
^" in x as{TypeError} core::String*;
y = <T extends core::Object* = dynamic>(core::int* x) → core::String* => invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:66:10: Error: The method 'substring' isn't defined for the class 'int'.
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
index 35c8e0e..7a22f09 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
@@ -15,129 +15,106 @@
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'B<String, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
// - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
// - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
// a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>("hello", 3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'B<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
// - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
// - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
// a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
// - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
// - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
// A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
// - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
// - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
// A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'D<num, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
// - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
// - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
// a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>("hello");
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'D<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
// - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
// - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
// a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
// ^
//
@@ -210,17 +187,13 @@
}
{
self::A<core::int*, core::String*>* a0 = new self::A::•<core::int*, core::String*>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
^" in 3 as{TypeError} core::String*);
self::A<core::int*, core::String*>* a1 = new self::A::named<core::int*, core::String*>(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
^" in 3 as{TypeError} core::String*);
}
@@ -232,29 +205,23 @@
self::A<core::int*, core::String*>* a4 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'B<String, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
- 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
- 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>(\"hello\", 3);
^" in new self::B::•<core::String*, dynamic>("hello", 3) as{TypeError} self::A<core::int*, core::String*>*;
self::A<core::int*, core::String*>* a5 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'B<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
- 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
- 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(
^" in new self::B::named<dynamic, dynamic>("hello", 3) as{TypeError} self::A<core::int*, core::String*>*;
}
{
self::A<core::int*, core::String*>* a0 = new self::B::•<core::String*, core::int*>(let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
^" in 3 as{TypeError} core::String*, let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
^" in "hello" as{TypeError} core::int*);
self::A<core::int*, core::String*>* a1 = new self::B::named<core::String*, core::int*>(let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
^" in 3 as{TypeError} core::String*, let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
^" in "hello" as{TypeError} core::int*);
}
@@ -266,23 +233,19 @@
self::A<core::int*, core::int*>* a4 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
- 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
- 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
^" in new self::C::•<dynamic>(3) as{TypeError} self::A<core::int*, core::int*>*;
self::A<core::int*, core::int*>* a5 = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
- 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
- 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
^" in new self::C::named<dynamic>(3) as{TypeError} self::A<core::int*, core::int*>*;
}
{
self::A<core::int*, core::int*>* a0 = new self::C::•<core::int*>(let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
^" in "hello" as{TypeError} core::int*);
self::A<core::int*, core::int*>* a1 = new self::C::named<core::int*>(let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
^" in "hello" as{TypeError} core::int*);
}
@@ -294,23 +257,19 @@
self::A<core::int*, core::String*>* a4 = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'D<num, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
- 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
- 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>(\"hello\");
^" in new self::D::•<core::num*, dynamic>("hello") as{TypeError} self::A<core::int*, core::String*>*;
self::A<core::int*, core::String*>* a5 = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'D<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
- 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
- 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(
^" in new self::D::named<dynamic, dynamic>("hello") as{TypeError} self::A<core::int*, core::String*>*;
}
{
self::A<core::int*, core::String*>* a0 = new self::D::•<dynamic, core::String*>(let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
^" in 3 as{TypeError} core::String*);
self::A<core::int*, core::String*>* a1 = new self::D::named<dynamic, core::String*>(let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
^" in 3 as{TypeError} core::String*);
}
@@ -320,23 +279,18 @@
{
self::A<core::int*, core::String*>* a0 = new self::F::•<core::int*, core::String*>(3, "hello", a: <core::int*>[3], b: <core::String*>["hello"]);
self::A<core::int*, core::String*>* a1 = new self::F::•<core::int*, core::String*>(3, "hello", a: <core::int*>[let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^" in "hello" as{TypeError} core::int*], b: <core::String*>[let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*]);
self::A<core::int*, core::String*>* a2 = new self::F::named<core::int*, core::String*>(3, "hello", 3, "hello");
self::A<core::int*, core::String*>* a3 = new self::F::named<core::int*, core::String*>(3, "hello");
self::A<core::int*, core::String*>* a4 = new self::F::named<core::int*, core::String*>(3, "hello", let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
^" in 3 as{TypeError} core::String*);
self::A<core::int*, core::String*>* a5 = new self::F::named<core::int*, core::String*>(3, "hello", let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
^" in "hello" as{TypeError} core::int*);
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
index 35c8e0e..7a22f09 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
@@ -15,129 +15,106 @@
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'B<String, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
// - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
// - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
// a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>("hello", 3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'B<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
// - 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
// - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
// a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
// - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
// - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
// A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
// - 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
// - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
// A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'D<num, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
// - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
// - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
// a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>("hello");
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'D<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
// - 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
// - 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
// a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
// ^
//
@@ -210,17 +187,13 @@
}
{
self::A<core::int*, core::String*>* a0 = new self::A::•<core::int*, core::String*>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:53:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:54:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
^" in 3 as{TypeError} core::String*);
self::A<core::int*, core::String*>* a1 = new self::A::named<core::int*, core::String*>(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:56:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:57:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
^" in 3 as{TypeError} core::String*);
}
@@ -232,29 +205,23 @@
self::A<core::int*, core::String*>* a4 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:65:47: Error: A value of type 'B<String, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
- 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
- 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
a4 = /*error:INVALID_ASSIGNMENT*/ new B<String, dynamic>(\"hello\", 3);
^" in new self::B::•<core::String*, dynamic>("hello", 3) as{TypeError} self::A<core::int*, core::String*>*;
self::A<core::int*, core::String*>* a5 = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:67:47: Error: A value of type 'B<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
- 'B' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
- 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
a5 = /*error:INVALID_ASSIGNMENT*/ new B<dynamic, dynamic>.named(
^" in new self::B::named<dynamic, dynamic>("hello", 3) as{TypeError} self::A<core::int*, core::String*>*;
}
{
self::A<core::int*, core::String*>* a0 = new self::B::•<core::String*, core::int*>(let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:72:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
^" in 3 as{TypeError} core::String*, let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:73:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
^" in "hello" as{TypeError} core::int*);
self::A<core::int*, core::String*>* a1 = new self::B::named<core::String*, core::int*>(let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:75:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
^" in 3 as{TypeError} core::String*, let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:76:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
^" in "hello" as{TypeError} core::int*);
}
@@ -266,23 +233,19 @@
self::A<core::int*, core::int*>* a4 = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:83:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
- 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
- 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
^" in new self::C::•<dynamic>(3) as{TypeError} self::A<core::int*, core::int*>*;
self::A<core::int*, core::int*>* a5 = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:84:55: Error: A value of type 'C<dynamic>' can't be assigned to a variable of type 'A<int, int>'.
- 'C' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
- 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
^" in new self::C::named<dynamic>(3) as{TypeError} self::A<core::int*, core::int*>*;
}
{
self::A<core::int*, core::int*>* a0 = new self::C::•<core::int*>(let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:88:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
^" in "hello" as{TypeError} core::int*);
self::A<core::int*, core::int*>* a1 = new self::C::named<core::int*>(let final<BottomType> #t16 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:90:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
^" in "hello" as{TypeError} core::int*);
}
@@ -294,23 +257,19 @@
self::A<core::int*, core::String*>* a4 = let final<BottomType> #t17 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:98:47: Error: A value of type 'D<num, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
- 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
- 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
a4 = /*error:INVALID_ASSIGNMENT*/ new D<num, dynamic>(\"hello\");
^" in new self::D::•<core::num*, dynamic>("hello") as{TypeError} self::A<core::int*, core::String*>*;
self::A<core::int*, core::String*>* a5 = let final<BottomType> #t18 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:100:47: Error: A value of type 'D<dynamic, dynamic>' can't be assigned to a variable of type 'A<int, String>'.
- 'D' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
- 'A' is from 'pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
a5 = /*error:INVALID_ASSIGNMENT*/ new D<dynamic, dynamic>.named(
^" in new self::D::named<dynamic, dynamic>("hello") as{TypeError} self::A<core::int*, core::String*>*;
}
{
self::A<core::int*, core::String*>* a0 = new self::D::•<dynamic, core::String*>(let final<BottomType> #t19 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:105:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
^" in 3 as{TypeError} core::String*);
self::A<core::int*, core::String*>* a1 = new self::D::named<dynamic, core::String*>(let final<BottomType> #t20 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:107:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
^" in 3 as{TypeError} core::String*);
}
@@ -320,23 +279,18 @@
{
self::A<core::int*, core::String*>* a0 = new self::F::•<core::int*, core::String*>(3, "hello", a: <core::int*>[3], b: <core::String*>["hello"]);
self::A<core::int*, core::String*>* a1 = new self::F::•<core::int*, core::String*>(3, "hello", a: <core::int*>[let final<BottomType> #t21 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:118:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^" in "hello" as{TypeError} core::int*], b: <core::String*>[let final<BottomType> #t22 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:121:54: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*]);
self::A<core::int*, core::String*>* a2 = new self::F::named<core::int*, core::String*>(3, "hello", 3, "hello");
self::A<core::int*, core::String*>* a3 = new self::F::named<core::int*, core::String*>(3, "hello");
self::A<core::int*, core::String*>* a4 = new self::F::named<core::int*, core::String*>(3, "hello", let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:129:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, let final<BottomType> #t24 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:130:48: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
^" in 3 as{TypeError} core::String*);
self::A<core::int*, core::String*>* a5 = new self::F::named<core::int*, core::String*>(3, "hello", let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart:134:48: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
^" in "hello" as{TypeError} core::int*);
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
index 6f0f9ee..fc86f60 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
@@ -3,17 +3,14 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
@@ -30,7 +27,6 @@
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
-// Try changing the type of the left hand side, or casting the right hand side to 'num'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
@@ -41,7 +37,6 @@
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
-// Try changing the type of the left hand side, or casting the right hand side to 'num'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
@@ -52,22 +47,18 @@
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
@@ -75,7 +66,6 @@
import "dart:core" as core;
static method foo([core::List<core::String*>* list1 = #C1, core::List<core::String*>* list2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
^"]) → void {}
static method main() → void {
@@ -83,11 +73,9 @@
core::List<core::int*>* l0 = <core::int*>[];
core::List<core::int*>* l1 = <core::int*>[3];
core::List<core::int*>* l2 = <core::int*>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^" in "hello" as{TypeError} core::int*];
core::List<core::int*>* l3 = <core::int*>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3];
}
@@ -113,7 +101,6 @@
Change the type of the list literal or the context in which it is used.
List<int> l2 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
^" in <core::num*>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
-Try changing the type of the left hand side, or casting the right hand side to 'num'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^" in "hello" as{TypeError} core::num*];
core::List<core::int*>* l3 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
@@ -121,7 +108,6 @@
Change the type of the list literal or the context in which it is used.
List<int> l3 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
^" in <core::num*>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
-Try changing the type of the left hand side, or casting the right hand side to 'num'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::num*, 3];
}
@@ -129,21 +115,17 @@
core::Iterable<core::int*>* i0 = <core::int*>[];
core::Iterable<core::int*>* i1 = <core::int*>[3];
core::Iterable<core::int*>* i2 = <core::int*>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^" in "hello" as{TypeError} core::int*];
core::Iterable<core::int*>* i3 = <core::int*>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3];
}
{
const core::List<core::int*>* c2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^";
const core::List<core::int*>* c3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^";
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect
index 6f0f9ee..fc86f60 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect
@@ -3,17 +3,14 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
@@ -30,7 +27,6 @@
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
-// Try changing the type of the left hand side, or casting the right hand side to 'num'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
@@ -41,7 +37,6 @@
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
-// Try changing the type of the left hand side, or casting the right hand side to 'num'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
@@ -52,22 +47,18 @@
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
// ^
//
@@ -75,7 +66,6 @@
import "dart:core" as core;
static method foo([core::List<core::String*>* list1 = #C1, core::List<core::String*>* list2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:11:89: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
^"]) → void {}
static method main() → void {
@@ -83,11 +73,9 @@
core::List<core::int*>* l0 = <core::int*>[];
core::List<core::int*>* l1 = <core::int*>[3];
core::List<core::int*>* l2 = <core::int*>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:19:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^" in "hello" as{TypeError} core::int*];
core::List<core::int*>* l3 = <core::int*>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:22:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3];
}
@@ -113,7 +101,6 @@
Change the type of the list literal or the context in which it is used.
List<int> l2 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
^" in <core::num*>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:36:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
-Try changing the type of the left hand side, or casting the right hand side to 'num'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^" in "hello" as{TypeError} core::num*];
core::List<core::int*>* l3 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:38:61: Error: The list literal type 'List<num>' isn't of expected type 'List<int>'.
@@ -121,7 +108,6 @@
Change the type of the list literal or the context in which it is used.
List<int> l3 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[
^" in <core::num*>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:39:50: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
-Try changing the type of the left hand side, or casting the right hand side to 'num'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::num*, 3];
}
@@ -129,21 +115,17 @@
core::Iterable<core::int*>* i0 = <core::int*>[];
core::Iterable<core::int*>* i1 = <core::int*>[3];
core::Iterable<core::int*>* i2 = <core::int*>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:47:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^" in "hello" as{TypeError} core::int*];
core::Iterable<core::int*>* i3 = <core::int*>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:50:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^" in "hello" as{TypeError} core::int*, 3];
}
{
const core::List<core::int*>* c2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:58:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
^";
const core::List<core::int*>* c3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart:61:89: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
^";
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
index a4d1d04..82a617d 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
@@ -3,47 +3,38 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// 3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// 3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// "hello": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": 3
// ^
//
@@ -66,22 +57,18 @@
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// 3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
@@ -89,7 +76,6 @@
import "dart:core" as core;
static method foo([core::Map<core::int*, core::String*>* m1 = #C4, core::Map<core::int*, core::String*>* m2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
^"]) → void {}
static method test() → void {
@@ -97,18 +83,14 @@
core::Map<core::int*, core::String*>* l0 = <core::int*, core::String*>{};
core::Map<core::int*, core::String*>* l1 = <core::int*, core::String*>{3: "hello"};
core::Map<core::int*, core::String*>* l2 = <core::int*, core::String*>{let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
^" in "hello" as{TypeError} core::int*: "hello"};
core::Map<core::int*, core::String*>* l3 = <core::int*, core::String*>{3: let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*};
core::Map<core::int*, core::String*>* l4 = <core::int*, core::String*>{3: "hello", let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
^" in "hello" as{TypeError} core::int*: let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*};
}
@@ -124,11 +106,9 @@
core::Map<dynamic, core::String*>* l1 = <dynamic, core::String*>{3: "hello"};
core::Map<dynamic, core::String*>* l2 = <dynamic, core::String*>{"hello": "hello"};
core::Map<dynamic, core::String*>* l3 = <dynamic, core::String*>{3: let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*};
core::Map<dynamic, core::String*>* l4 = <dynamic, core::String*>{3: "hello", "hello": let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
\"hello\": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*};
}
@@ -136,12 +116,10 @@
core::Map<core::int*, dynamic>* l0 = <core::int*, dynamic>{};
core::Map<core::int*, dynamic>* l1 = <core::int*, dynamic>{3: "hello"};
core::Map<core::int*, dynamic>* l2 = <core::int*, dynamic>{let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
^" in "hello" as{TypeError} core::int*: "hello"};
core::Map<core::int*, dynamic>* l3 = <core::int*, dynamic>{3: 3};
core::Map<core::int*, dynamic>* l4 = <core::int*, dynamic>{3: "hello", let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": 3
^" in "hello" as{TypeError} core::int*: 3};
}
@@ -164,15 +142,12 @@
}
{
const core::Map<core::int*, core::String*>* l2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
^";
const core::Map<core::int*, core::String*>* l3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
^";
const core::Map<core::int*, core::String*>* l4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
^";
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect
index a4d1d04..82a617d 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect
@@ -3,47 +3,38 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// 3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// 3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// "hello": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": "hello"
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": 3
// ^
//
@@ -66,22 +57,18 @@
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// 3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:89:87: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
// ^
//
@@ -89,7 +76,6 @@
import "dart:core" as core;
static method foo([core::Map<core::int*, core::String*>* m1 = #C4, core::Map<core::int*, core::String*>* m2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:12:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
^"]) → void {}
static method test() → void {
@@ -97,18 +83,14 @@
core::Map<core::int*, core::String*>* l0 = <core::int*, core::String*>{};
core::Map<core::int*, core::String*>* l1 = <core::int*, core::String*>{3: "hello"};
core::Map<core::int*, core::String*>* l2 = <core::int*, core::String*>{let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:20:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
^" in "hello" as{TypeError} core::int*: "hello"};
core::Map<core::int*, core::String*>* l3 = <core::int*, core::String*>{3: let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:23:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*};
core::Map<core::int*, core::String*>* l4 = <core::int*, core::String*>{3: "hello", let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:27:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
^" in "hello" as{TypeError} core::int*: let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:28:51: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*};
}
@@ -124,11 +106,9 @@
core::Map<dynamic, core::String*>* l1 = <dynamic, core::String*>{3: "hello"};
core::Map<dynamic, core::String*>* l2 = <dynamic, core::String*>{"hello": "hello"};
core::Map<dynamic, core::String*>* l3 = <dynamic, core::String*>{3: let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:48:50: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*};
core::Map<dynamic, core::String*>* l4 = <dynamic, core::String*>{3: "hello", "hello": let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:52:56: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
\"hello\": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
^" in 3 as{TypeError} core::String*};
}
@@ -136,12 +116,10 @@
core::Map<core::int*, dynamic>* l0 = <core::int*, dynamic>{};
core::Map<core::int*, dynamic>* l1 = <core::int*, dynamic>{3: "hello"};
core::Map<core::int*, dynamic>* l2 = <core::int*, dynamic>{let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:59:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": \"hello\"
^" in "hello" as{TypeError} core::int*: "hello"};
core::Map<core::int*, dynamic>* l3 = <core::int*, dynamic>{3: 3};
core::Map<core::int*, dynamic>* l4 = <core::int*, dynamic>{3: "hello", let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:64:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": 3
^" in "hello" as{TypeError} core::int*: 3};
}
@@ -164,15 +142,12 @@
}
{
const core::Map<core::int*, core::String*>* l2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:80:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
^";
const core::Map<core::int*, core::String*>* l3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:84:86: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
^";
const core::Map<core::int*, core::String*>* l4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart:88:79: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
^";
}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
index b3a5d51..a07fb00 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
@@ -5,28 +5,24 @@
// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:69: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
// - 'MyStream' is from 'pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<int>'.
// yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ MyStream();
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:70: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
// - 'List' is from 'dart:core'.
// - 'Stream' is from 'dart:async'.
-// Try changing the type of the left hand side, or casting the right hand side to 'Stream<List<int>>'.
// yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:69: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
// - 'List' is from 'dart:core'.
// - 'Map' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'Map<int, int>'.
// yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:79: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
// - 'Map' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'Iterable<Map<int, int>>'.
// yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic, dynamic */ Map();
// ^
//
@@ -45,13 +41,11 @@
yield let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:69: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
- 'MyStream' is from 'pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<int>'.
yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ MyStream();
^" in self::MyStream::•<dynamic>() as{TypeError} core::List<core::int*>*;
yield* let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:70: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
- 'List' is from 'dart:core'.
- 'Stream' is from 'dart:async'.
-Try changing the type of the left hand side, or casting the right hand side to 'Stream<List<int>>'.
yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
^" in core::List::•<dynamic>() as{TypeError} asy::Stream<core::List<core::int*>*>*;
yield* self::MyStream::•<core::List<core::int*>*>();
@@ -61,13 +55,11 @@
yield let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:69: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
- 'List' is from 'dart:core'.
- 'Map' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'Map<int, int>'.
yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
^" in core::List::•<dynamic>() as{TypeError} core::Map<core::int*, core::int*>*;
yield* let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:79: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
- 'Map' is from 'dart:core'.
- 'Iterable' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'Iterable<Map<int, int>>'.
yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic, dynamic */ Map();
^" in core::Map::•<dynamic, dynamic>() as{TypeError} core::Iterable<core::Map<core::int*, core::int*>*>*;
yield* core::List::•<core::Map<core::int*, core::int*>*>();
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
index 295f142..0f46239 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
@@ -5,28 +5,24 @@
// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:69: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
// - 'MyStream' is from 'pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<int>'.
// yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ MyStream();
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:70: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
// - 'List' is from 'dart:core'.
// - 'Stream' is from 'dart:async'.
-// Try changing the type of the left hand side, or casting the right hand side to 'Stream<List<int>>'.
// yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:69: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
// - 'List' is from 'dart:core'.
// - 'Map' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'Map<int, int>'.
// yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
// ^
//
// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:79: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
// - 'Map' is from 'dart:core'.
// - 'Iterable' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'Iterable<Map<int, int>>'.
// yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic, dynamic */ Map();
// ^
//
@@ -62,7 +58,6 @@
if(:controller.{asy::_AsyncStarStreamController::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:69: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
- 'MyStream' is from 'pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<int>'.
yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ MyStream();
^" in self::MyStream::•<dynamic>() as{TypeError} core::List<core::int*>*))
return null;
@@ -71,7 +66,6 @@
if(:controller.{asy::_AsyncStarStreamController::addStream}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:70: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
- 'List' is from 'dart:core'.
- 'Stream' is from 'dart:async'.
-Try changing the type of the left hand side, or casting the right hand side to 'Stream<List<int>>'.
yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
^" in core::_GrowableList::•<dynamic>(0) as{TypeError} asy::Stream<core::List<core::int*>*>*))
return null;
@@ -110,7 +104,6 @@
:iterator.{core::_SyncIterator::_current} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:69: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
- 'List' is from 'dart:core'.
- 'Map' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'Map<int, int>'.
yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
^" in core::_GrowableList::•<dynamic>(0) as{TypeError} core::Map<core::int*, core::int*>*;
[yield] true;
@@ -119,7 +112,6 @@
:iterator.{core::_SyncIterator::_yieldEachIterable} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:79: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
- 'Map' is from 'dart:core'.
- 'Iterable' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'Iterable<Map<int, int>>'.
yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic, dynamic */ Map();
^" in core::Map::•<dynamic, dynamic>() as{TypeError} core::Iterable<core::Map<core::int*, core::int*>*>*;
[yield] true;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
index e0b1bf3..3865a9a 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
@@ -5,7 +5,6 @@
// pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'Future<int>'.
// - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards.dart'.
// - 'Future' is from 'dart:async'.
-// Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
// Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
// ^
//
@@ -38,7 +37,6 @@
asy::Future<core::int*>* f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'Future<int>'.
- 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards.dart'.
- 'Future' is from 'dart:async'.
-Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
^" in f as{TypeError} asy::Future<core::int*>*;
asy::Future<core::num*>* f3 = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3) as asy::Future<core::double*>*;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
index e0b1bf3..3865a9a 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
@@ -5,7 +5,6 @@
// pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'Future<int>'.
// - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards.dart'.
// - 'Future' is from 'dart:async'.
-// Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
// Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
// ^
//
@@ -38,7 +37,6 @@
asy::Future<core::int*>* f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards.dart:21:49: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'Future<int>'.
- 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards.dart'.
- 'Future' is from 'dart:async'.
-Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
^" in f as{TypeError} asy::Future<core::int*>*;
asy::Future<core::num*>* f3 = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3) as asy::Future<core::double*>*;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
index a92b944..ebacc67 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'MyFuture<int>'.
// - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards_2.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'MyFuture<int>'.
// MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
// ^
//
@@ -36,7 +35,6 @@
self::MyFuture<core::double*>* f = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3);
self::MyFuture<core::int*>* f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'MyFuture<int>'.
- 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards_2.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'MyFuture<int>'.
MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
^" in f as{TypeError} self::MyFuture<core::int*>*;
self::MyFuture<core::num*>* f3 = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3) as self::MyFuture<core::double*>*;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
index a92b944..ebacc67 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'MyFuture<int>'.
// - 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards_2.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'MyFuture<int>'.
// MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
// ^
//
@@ -36,7 +35,6 @@
self::MyFuture<core::double*>* f = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3);
self::MyFuture<core::int*>* f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_2.dart:21:51: Error: A value of type 'MyFuture<double>' can't be assigned to a variable of type 'MyFuture<int>'.
- 'MyFuture' is from 'pkg/front_end/testcases/inference/future_then_upwards_2.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'MyFuture<int>'.
MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
^" in f as{TypeError} self::MyFuture<core::int*>*;
self::MyFuture<core::num*>* f3 = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3) as self::MyFuture<core::double*>*;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
index 1983524..e7c7bc4 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'Future<double>' can't be assigned to a variable of type 'Future<int>'.
// - 'Future' is from 'dart:async'.
-// Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
// Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
// ^
//
@@ -36,7 +35,6 @@
asy::Future<core::double*>* f = self::foo().{asy::Future::then}<core::double*>((dynamic _) → core::double* => 2.3);
asy::Future<core::int*>* f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'Future<double>' can't be assigned to a variable of type 'Future<int>'.
- 'Future' is from 'dart:async'.
-Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
^" in f as{TypeError} asy::Future<core::int*>*;
asy::Future<core::num*>* f3 = self::foo().{asy::Future::then}<core::double*>((dynamic _) → core::double* => 2.3) as asy::Future<core::double*>*;
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
index 1983524..e7c7bc4 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'Future<double>' can't be assigned to a variable of type 'Future<int>'.
// - 'Future' is from 'dart:async'.
-// Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
// Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
// ^
//
@@ -36,7 +35,6 @@
asy::Future<core::double*>* f = self::foo().{asy::Future::then}<core::double*>((dynamic _) → core::double* => 2.3);
asy::Future<core::int*>* f2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_then_upwards_3.dart:21:49: Error: A value of type 'Future<double>' can't be assigned to a variable of type 'Future<int>'.
- 'Future' is from 'dart:async'.
-Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
^" in f as{TypeError} asy::Future<core::int*>*;
asy::Future<core::num*>* f3 = self::foo().{asy::Future::then}<core::double*>((dynamic _) → core::double* => 2.3) as asy::Future<core::double*>*;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
index 81d1269..8c541ca 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/inference/future_union_downwards.dart:21:47: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
// - 'FutureOr' is from 'dart:async'.
-// Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
// new /*@ typeArgs=int* */ Future.value('hi'));
// ^
//
@@ -35,7 +34,6 @@
static field self::MyFuture<dynamic>* f;
static field asy::Future<core::int*>* t1 = self::f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:47: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
- 'FutureOr' is from 'dart:async'.
-Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
new /*@ typeArgs=int* */ Future.value('hi'));
^" in "hi" as{TypeError} asy::FutureOr<core::int*>*));
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]);
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 68ec181..873f587 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
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/inference/future_union_downwards.dart:21:47: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
// - 'FutureOr' is from 'dart:async'.
-// Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
// new /*@ typeArgs=int* */ Future.value('hi'));
// ^
//
@@ -35,7 +34,6 @@
static field self::MyFuture<dynamic>* f;
static field asy::Future<core::int*>* t1 = self::f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:47: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
- 'FutureOr' is from 'dart:async'.
-Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
new /*@ typeArgs=int* */ Future.value('hi'));
^" in "hi" as{TypeError} asy::FutureOr<core::int*>*));
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]);
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
index bb00772..a309a4b 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:47: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
// - 'FutureOr' is from 'dart:async'.
-// Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
// new /*@ typeArgs=int* */ Future.value('hi'));
// ^
//
@@ -35,7 +34,6 @@
static field asy::Future<dynamic>* f;
static field asy::Future<core::int*>* t1 = self::f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:47: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
- 'FutureOr' is from 'dart:async'.
-Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
new /*@ typeArgs=int* */ Future.value('hi'));
^" in "hi" as{TypeError} asy::FutureOr<core::int*>*));
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]);
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 66f2ce1..af242e2 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
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:47: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
// - 'FutureOr' is from 'dart:async'.
-// Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
// new /*@ typeArgs=int* */ Future.value('hi'));
// ^
//
@@ -35,7 +34,6 @@
static field asy::Future<dynamic>* f;
static field asy::Future<core::int*>* t1 = self::f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:47: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
- 'FutureOr' is from 'dart:async'.
-Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
new /*@ typeArgs=int* */ Future.value('hi'));
^" in "hi" as{TypeError} asy::FutureOr<core::int*>*));
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]);
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
index 44e61bf..d2a93e7 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
@@ -3,22 +3,18 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:35: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*@ typeArgs=int* */ max(1, 2.0));
// ^
//
// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:35: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*@ typeArgs=int* */ min(1, 2.0));
// ^
//
// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:37: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// printInt(/*@ typeArgs=int* */ min("hi", "there"));
// ^
//
// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:43: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// printInt(/*@ typeArgs=int* */ min("hi", "there"));
// ^
//
@@ -42,20 +38,16 @@
self::printInt(self::myMax(1, 2) as{TypeError} core::int*);
self::printInt(self::myMax(1, 2) as core::int*);
self::printInt(math::max<core::int*>(1, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:35: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*@ typeArgs=int* */ max(1, 2.0));
^" in 2.0 as{TypeError} core::int*));
self::printInt(math::min<core::int*>(1, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:35: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*@ typeArgs=int* */ min(1, 2.0));
^" in 2.0 as{TypeError} core::int*));
self::printDouble(math::max<core::double*>(1.0, 2.0));
self::printDouble(math::min<core::double*>(1.0, 2.0));
self::printInt(math::min<core::int*>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:37: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
printInt(/*@ typeArgs=int* */ min(\"hi\", \"there\"));
^" in "hi" as{TypeError} core::int*, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:43: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
printInt(/*@ typeArgs=int* */ min(\"hi\", \"there\"));
^" in "there" as{TypeError} core::int*));
}
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
index 44e61bf..d2a93e7 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
@@ -3,22 +3,18 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:35: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*@ typeArgs=int* */ max(1, 2.0));
// ^
//
// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:35: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*@ typeArgs=int* */ min(1, 2.0));
// ^
//
// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:37: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// printInt(/*@ typeArgs=int* */ min("hi", "there"));
// ^
//
// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:43: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// printInt(/*@ typeArgs=int* */ min("hi", "there"));
// ^
//
@@ -42,20 +38,16 @@
self::printInt(self::myMax(1, 2) as{TypeError} core::int*);
self::printInt(self::myMax(1, 2) as core::int*);
self::printInt(math::max<core::int*>(1, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:35: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*@ typeArgs=int* */ max(1, 2.0));
^" in 2.0 as{TypeError} core::int*));
self::printInt(math::min<core::int*>(1, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:35: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*@ typeArgs=int* */ min(1, 2.0));
^" in 2.0 as{TypeError} core::int*));
self::printDouble(math::max<core::double*>(1.0, 2.0));
self::printDouble(math::min<core::double*>(1.0, 2.0));
self::printInt(math::min<core::int*>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:37: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
printInt(/*@ typeArgs=int* */ min(\"hi\", \"there\"));
^" in "hi" as{TypeError} core::int*, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:43: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
printInt(/*@ typeArgs=int* */ min(\"hi\", \"there\"));
^" in "there" as{TypeError} core::int*));
}
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
index ca2d8a1..0e19c3a 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*@ typeArgs=String* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
// ^
//
@@ -15,7 +14,6 @@
static method test() → dynamic {
core::String* x = self::f<core::String*>(<core::String*>["hi"]);
core::String* y = self::f<core::String*>(<core::String*>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*@ typeArgs=String* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
^" in 42 as{TypeError} core::String*]);
}
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
index ca2d8a1..0e19c3a 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// /*@ typeArgs=String* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
// ^
//
@@ -15,7 +14,6 @@
static method test() → dynamic {
core::String* x = self::f<core::String*>(<core::String*>["hi"]);
core::String* y = self::f<core::String*>(<core::String*>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
/*@ typeArgs=String* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
^" in 42 as{TypeError} core::String*]);
}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
index b10198f..899b8b0 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
@@ -3,32 +3,26 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
-// Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
// /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
// ^
//
// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
-// Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
// /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
// ^
//
// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
-// Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
// takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
// ^
//
// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
-// Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
// takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
// ^
//
// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
-// Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
// . /*@target=C::m*/ m);
// ^
//
// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
-// Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
// . /*@target=C::m*/ m);
// ^
//
@@ -57,11 +51,9 @@
self::takeDDO(#C1<core::double*>);
self::takeOOI((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
self::takeIDI(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
-Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
^" in (#C1<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
self::takeDID(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
-Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
^" in (#C1<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
self::takeOON((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
@@ -77,11 +69,9 @@
self::takeDDO(#C2<core::double*>);
self::takeOOI((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
self::takeIDI(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
-Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
^" in (#C2<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
self::takeDID(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
-Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
^" in (#C2<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
self::takeOON((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
@@ -99,11 +89,9 @@
self::takeOOO((new self::C::•().{self::C::m}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
self::takeOOI((new self::C::•().{self::C::m}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
self::takeIDI(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
-Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
. /*@target=C::m*/ m);
^" in (new self::C::•().{self::C::m}<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
self::takeDID(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
-Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
. /*@target=C::m*/ m);
^" in (new self::C::•().{self::C::m}<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
index b10198f..899b8b0 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
@@ -3,32 +3,26 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
-// Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
// /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
// ^
//
// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
-// Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
// /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
// ^
//
// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
-// Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
// takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
// ^
//
// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
-// Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
// takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
// ^
//
// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
-// Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
// . /*@target=C::m*/ m);
// ^
//
// pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
-// Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
// . /*@target=C::m*/ m);
// ^
//
@@ -57,11 +51,9 @@
self::takeDDO(#C1<core::double*>);
self::takeOOI((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
self::takeIDI(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:28:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
-Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
^" in (#C1<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
self::takeDID(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:30:73: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
-Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
^" in (#C1<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
self::takeOON((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
@@ -77,11 +69,9 @@
self::takeDDO(#C2<core::double*>);
self::takeOOI((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
self::takeIDI(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:46:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
-Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
^" in (#C2<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
self::takeDID(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:47:72: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
-Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
^" in (#C2<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
self::takeOON((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
@@ -99,11 +89,9 @@
self::takeOOO((new self::C::•().{self::C::m}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
self::takeOOI((new self::C::•().{self::C::m}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
self::takeIDI(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
-Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
. /*@target=C::m*/ m);
^" in (new self::C::•().{self::C::m}<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
self::takeDID(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
-Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
. /*@target=C::m*/ m);
^" in (new self::C::•().{self::C::m}<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
}
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
index ab233fa..45a9f96 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// 1.0);
// ^
//
@@ -13,7 +12,6 @@
static method f() → void {
core::List<core::String*>* y;
core::Iterable<core::String*>* x = y.{core::Iterable::map}<core::String*>((core::String* z) → core::String* => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
1.0);
^" in 1.0 as{TypeError} core::String*);
}
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect
index ab233fa..45a9f96 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// 1.0);
// ^
//
@@ -13,7 +12,6 @@
static method f() → void {
core::List<core::String*>* y;
core::Iterable<core::String*>* x = y.{core::Iterable::map}<core::String*>((core::String* z) → core::String* => let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_inference_error.dart:13:11: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
1.0);
^" in 1.0 as{TypeError} core::String*);
}
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
index cf8de52..7967409 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
@@ -10,7 +10,6 @@
//
// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:111: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
// - 'FutureOr' is from 'dart:async'.
-// Try changing the type of the parameter, or casting the argument to 'FutureOr<String> Function(FutureOr<String>, int)'.
// /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@ returnType=String* */ (String
// ^
//
@@ -32,7 +31,6 @@
^" as{TypeError} asy::FutureOr<core::String*>*));
asy::Future<core::String*>* results3 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:111: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
- 'FutureOr' is from 'dart:async'.
-Try changing the type of the parameter, or casting the argument to 'FutureOr<String> Function(FutureOr<String>, int)'.
/*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@ returnType=String* */ (String
^" in ((core::String* x, core::int* y) → core::String* => x.{core::String::+}(y.{core::int::toString}())) as{TypeError} (asy::FutureOr<core::String*>*, core::int*) →* asy::FutureOr<core::String*>*));
asy::Future<core::String*>* results4 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → core::String* => list.{core::Iterable::fold}<core::String*>("", (core::String* x, core::int* y) → core::String* => x.{core::String::+}(y.{core::int::toString}())));
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
index cf8de52..7967409 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
@@ -10,7 +10,6 @@
//
// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:111: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
// - 'FutureOr' is from 'dart:async'.
-// Try changing the type of the parameter, or casting the argument to 'FutureOr<String> Function(FutureOr<String>, int)'.
// /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@ returnType=String* */ (String
// ^
//
@@ -32,7 +31,6 @@
^" as{TypeError} asy::FutureOr<core::String*>*));
asy::Future<core::String*>* results3 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:111: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
- 'FutureOr' is from 'dart:async'.
-Try changing the type of the parameter, or casting the argument to 'FutureOr<String> Function(FutureOr<String>, int)'.
/*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@ returnType=String* */ (String
^" in ((core::String* x, core::int* y) → core::String* => x.{core::String::+}(y.{core::int::toString}())) as{TypeError} (asy::FutureOr<core::String*>*, core::int*) →* asy::FutureOr<core::String*>*));
asy::Future<core::String*>* results4 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → core::String* => list.{core::Iterable::fold}<core::String*>("", (core::String* x, core::int* y) → core::String* => x.{core::String::+}(y.{core::int::toString}())));
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
index 2d18242..bb7d545 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
@@ -3,17 +3,14 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
// ^
//
// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
// ^
//
// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
// ^
//
@@ -42,18 +39,15 @@
core::int* i;
s = new self::B::•().{self::B::x} as{TypeError} core::String*;
s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
^" in new self::B::•().{self::B::y} as{TypeError} core::String*;
s = new self::B::•().{self::B::z};
s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
^" in new self::B::•().{self::B::w} as{TypeError} core::String*;
i = new self::B::•().{self::B::x} as{TypeError} core::int*;
i = new self::B::•().{self::B::y};
i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
^" in new self::B::•().{self::B::z} as{TypeError} core::int*;
i = new self::B::•().{self::B::w};
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
index 2d18242..bb7d545 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
@@ -3,17 +3,14 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
// ^
//
// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
// ^
//
// pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
// ^
//
@@ -42,18 +39,15 @@
core::int* i;
s = new self::B::•().{self::B::x} as{TypeError} core::String*;
s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
^" in new self::B::•().{self::B::y} as{TypeError} core::String*;
s = new self::B::•().{self::B::z};
s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
^" in new self::B::•().{self::B::w} as{TypeError} core::String*;
i = new self::B::•().{self::B::x} as{TypeError} core::int*;
i = new self::B::•().{self::B::y};
i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
^" in new self::B::•().{self::B::z} as{TypeError} core::int*;
i = new self::B::•().{self::B::w};
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
index 0dd5e96..8880525 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
@@ -18,69 +18,58 @@
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:36:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
// - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A'.
// a = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
// - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'B'.
// b = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:41:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
// - 'Set' is from 'dart:core'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
// c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
// - 'Set' is from 'dart:core'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
// c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
// - 'Map' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'Map<dynamic, dynamic>'.
// d = /*error:INVALID_ASSIGNMENT*/ 3;
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
// - 'Map' is from 'dart:core'.
// - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A'.
// e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// f = /*error:INVALID_ASSIGNMENT*/ false;
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// g = /*error:INVALID_ASSIGNMENT*/ false;
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:52:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
// - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'B'.
// h = /*error:INVALID_ASSIGNMENT*/ false;
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:56:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
// - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'B'.
// j = /*error:INVALID_ASSIGNMENT*/ false;
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:57:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
// - 'List' is from 'dart:core'.
// - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'B'.
// j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
// ^
//
@@ -123,13 +112,11 @@
static method test1() → dynamic {
self::a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:36:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
- 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A'.
a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} self::A*;
self::a = new self::B::•(3);
self::b = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
- 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'B'.
b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} self::B*;
self::b = new self::B::•(3);
@@ -137,42 +124,35 @@
self::c1 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:41:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
- 'Set' is from 'dart:core'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
^" in (let final core::Set<dynamic>* #t6 = col::LinkedHashSet::•<dynamic>() in #t6) as{TypeError} core::List<dynamic>*;
self::c2 = <dynamic>[];
self::c2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
- 'Set' is from 'dart:core'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
^" in (let final core::Set<dynamic>* #t8 = col::LinkedHashSet::•<dynamic>() in #t8) as{TypeError} core::List<dynamic>*;
self::d = <dynamic, dynamic>{};
self::d = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
- 'Map' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'Map<dynamic, dynamic>'.
d = /*error:INVALID_ASSIGNMENT*/ 3;
^" in 3 as{TypeError} core::Map<dynamic, dynamic>*;
self::e = new self::A::•();
self::e = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
- 'Map' is from 'dart:core'.
- 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A'.
e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
^" in <dynamic, dynamic>{} as{TypeError} self::A*;
self::f = 3;
self::f = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
f = /*error:INVALID_ASSIGNMENT*/ false;
^" in false as{TypeError} core::int*;
self::g = 1;
self::g = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
g = /*error:INVALID_ASSIGNMENT*/ false;
^" in false as{TypeError} core::int*;
self::h = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:52:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
- 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'B'.
h = /*error:INVALID_ASSIGNMENT*/ false;
^" in false as{TypeError} self::B*;
self::h = new self::B::•("b");
@@ -180,13 +160,11 @@
self::j = new self::B::•("b");
self::j = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:56:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
- 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'B'.
j = /*error:INVALID_ASSIGNMENT*/ false;
^" in false as{TypeError} self::B*;
self::j = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:57:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
- 'List' is from 'dart:core'.
- 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'B'.
j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
^" in <dynamic>[] as{TypeError} self::B*;
}
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
index 1766be7..4db29402 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
@@ -18,69 +18,58 @@
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:36:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
// - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A'.
// a = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
// - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'B'.
// b = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:41:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
// - 'Set' is from 'dart:core'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
// c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
// - 'Set' is from 'dart:core'.
// - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
// c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
// - 'Map' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'Map<dynamic, dynamic>'.
// d = /*error:INVALID_ASSIGNMENT*/ 3;
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
// - 'Map' is from 'dart:core'.
// - 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A'.
// e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// f = /*error:INVALID_ASSIGNMENT*/ false;
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// g = /*error:INVALID_ASSIGNMENT*/ false;
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:52:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
// - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'B'.
// h = /*error:INVALID_ASSIGNMENT*/ false;
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:56:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
// - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'B'.
// j = /*error:INVALID_ASSIGNMENT*/ false;
// ^
//
// pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:57:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
// - 'List' is from 'dart:core'.
// - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'B'.
// j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
// ^
//
@@ -123,13 +112,11 @@
static method test1() → dynamic {
self::a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:36:36: Error: A value of type 'String' can't be assigned to a variable of type 'A'.
- 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A'.
a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} self::A*;
self::a = new self::B::•(3);
self::b = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:38:36: Error: A value of type 'String' can't be assigned to a variable of type 'B'.
- 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'B'.
b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} self::B*;
self::b = new self::B::•(3);
@@ -137,42 +124,35 @@
self::c1 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:41:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
- 'Set' is from 'dart:core'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
^" in (let final core::Set<dynamic>* #t6 = col::LinkedHashSet::•<dynamic>() in #t6) as{TypeError} core::List<dynamic>*;
self::c2 = <dynamic>[];
self::c2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
- 'Set' is from 'dart:core'.
- 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<dynamic>'.
c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
^" in (let final core::Set<dynamic>* #t8 = col::LinkedHashSet::•<dynamic>() in #t8) as{TypeError} core::List<dynamic>*;
self::d = <dynamic, dynamic>{};
self::d = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
- 'Map' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'Map<dynamic, dynamic>'.
d = /*error:INVALID_ASSIGNMENT*/ 3;
^" in 3 as{TypeError} core::Map<dynamic, dynamic>*;
self::e = new self::A::•();
self::e = let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:47:67: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'A'.
- 'Map' is from 'dart:core'.
- 'A' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A'.
e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
^" in <dynamic, dynamic>{} as{TypeError} self::A*;
self::f = 3;
self::f = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:49:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
f = /*error:INVALID_ASSIGNMENT*/ false;
^" in false as{TypeError} core::int*;
self::g = 1;
self::g = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:51:36: Error: A value of type 'bool' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
g = /*error:INVALID_ASSIGNMENT*/ false;
^" in false as{TypeError} core::int*;
self::h = let final<BottomType> #t13 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:52:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
- 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'B'.
h = /*error:INVALID_ASSIGNMENT*/ false;
^" in false as{TypeError} self::B*;
self::h = new self::B::•("b");
@@ -180,13 +160,11 @@
self::j = new self::B::•("b");
self::j = let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:56:36: Error: A value of type 'bool' can't be assigned to a variable of type 'B'.
- 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'B'.
j = /*error:INVALID_ASSIGNMENT*/ false;
^" in false as{TypeError} self::B*;
self::j = let final<BottomType> #t15 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:57:58: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'B'.
- 'List' is from 'dart:core'.
- 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'B'.
j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
^" in <dynamic>[] as{TypeError} self::B*;
}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
index a041075..26971fe 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
@@ -3,12 +3,10 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// x = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// y = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -21,11 +19,9 @@
static field core::int* y = inf::x;
static method test1() → dynamic {
inf::x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
self::y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
index a041075..26971fe 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
@@ -3,12 +3,10 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// x = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// y = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -21,11 +19,9 @@
static field core::int* y = inf::x;
static method test1() → dynamic {
inf::x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:13:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
self::y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart:14:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
index 83a033e..adb045f 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
@@ -3,12 +3,10 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// A.x = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// B.y = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -26,11 +24,9 @@
}
static method test1() → dynamic {
inf::A::x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
A.x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
self::B::y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
B.y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
index 83a033e..adb045f 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
@@ -3,12 +3,10 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// A.x = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// B.y = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -26,11 +24,9 @@
}
static method test1() → dynamic {
inf::A::x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:15:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
A.x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
self::B::y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
B.y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
index 9afb6a2..e2dd820 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
// ^
//
@@ -25,7 +24,6 @@
}
static method foo() → dynamic {
core::String* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
^" in new self::B::•().{self::B::x} as{TypeError} core::String*;
core::int* z = new self::B::•().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect
index 9afb6a2..e2dd820 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
// ^
//
@@ -25,7 +24,6 @@
}
static method foo() → dynamic {
core::String* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
^" in new self::B::•().{self::B::x} as{TypeError} core::String*;
core::int* z = new self::B::•().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
index d26cb7a..75a45d2 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
// ^
//
@@ -25,7 +24,6 @@
}
static method foo() → dynamic {
core::String* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
^" in new self::B::•().{self::B::x} as{TypeError} core::String*;
core::int* z = new self::B::•().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect
index d26cb7a..75a45d2 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
// ^
//
@@ -25,7 +24,6 @@
}
static method foo() → dynamic {
core::String* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
^" in new self::B::•().{self::B::x} as{TypeError} core::String*;
core::int* z = new self::B::•().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
index 6a786ef..84f5869 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// x = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -13,7 +12,6 @@
static method test1() → dynamic {
core::int* x = 3;
x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect
index 6a786ef..84f5869 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// x = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -13,7 +12,6 @@
static method test1() → dynamic {
core::int* x = 3;
x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
index 3249285..d6ac624 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// x = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -13,7 +12,6 @@
static method test2() → dynamic {
core::int* x = 3;
x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect
index 3249285..d6ac624 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// x = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -13,7 +12,6 @@
static method test2() → dynamic {
core::int* x = 3;
x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
index d3cee19..3476cd7 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
@@ -3,17 +3,14 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// a = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// b = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// c = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -30,19 +27,16 @@
method test1() → dynamic {
core::int* a = this.{self::A::x};
a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
a = 3;
core::int* b = this.{self::A::y};
b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
b = 4;
core::int* c = this.{self::A::z};
c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
c = 4;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
index d3cee19..3476cd7 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
@@ -3,17 +3,14 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// a = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// b = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// c = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -30,19 +27,16 @@
method test1() → dynamic {
core::int* a = this.{self::A::x};
a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
a = 3;
core::int* b = this.{self::A::y};
b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
b = 4;
core::int* c = this.{self::A::z};
c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
c = 4;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
index 347287a..74c22b4 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
@@ -3,17 +3,14 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// a = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// b = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// c = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -26,19 +23,16 @@
static method test1() → dynamic {
core::int* a = self::x;
a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
a = 3;
core::int* b = self::y;
b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
b = 4;
core::int* c = self::z;
c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
c = 4;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect
index 347287a..74c22b4 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect
@@ -3,17 +3,14 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// a = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// b = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// c = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -26,19 +23,16 @@
static method test1() → dynamic {
core::int* a = self::x;
a = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
a = 3;
core::int* b = self::y;
b = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
b = 4;
core::int* c = self::z;
c = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:36: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
c = 4;
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
index 759a5f0..eead399 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
// ^
//
@@ -30,7 +29,6 @@
static method foo() → dynamic {
core::int* y = new self::C::•().{self::C::x};
core::String* z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
^" in new self::C::•().{self::C::x} as{TypeError} core::String*;
}
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
index 759a5f0..eead399 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
// ^
//
@@ -30,7 +29,6 @@
static method foo() → dynamic {
core::int* y = new self::C::•().{self::C::x};
core::String* z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
^" in new self::C::•().{self::C::x} as{TypeError} core::String*;
}
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
index 32fb9c9..e011236 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
@@ -16,7 +16,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
// ^
//
@@ -43,7 +42,6 @@
static method foo() → dynamic {
core::int* y = new test::C::•().{test::C::x};
core::String* z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
^" in new test::C::•().{test::C::x} as{TypeError} core::String*;
}
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect
index 32fb9c9..e011236 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect
@@ -16,7 +16,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
// ^
//
@@ -43,7 +42,6 @@
static method foo() → dynamic {
core::int* y = new test::C::•().{test::C::x};
core::String* z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
^" in new test::C::•().{test::C::x} as{TypeError} core::String*;
}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
index ceadc8a..9ba269b 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
@@ -3,12 +3,10 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// get w => /*error:RETURN_OF_INVALID_TYPE*/ "hello";
// ^
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
// ^
//
@@ -30,13 +28,11 @@
return 3;
get w() → core::int*
return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
get w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
^" in "hello" as{TypeError} core::int*;
}
static method foo() → dynamic {
core::String* y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
^" in new self::B::•().{self::B::x} as{TypeError} core::String*;
core::int* z = new self::B::•().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
index ceadc8a..9ba269b 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
@@ -3,12 +3,10 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// get w => /*error:RETURN_OF_INVALID_TYPE*/ "hello";
// ^
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
// ^
//
@@ -30,13 +28,11 @@
return 3;
get w() → core::int*
return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:15:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
get w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
^" in "hello" as{TypeError} core::int*;
}
static method foo() → dynamic {
core::String* y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
^" in new self::B::•().{self::B::x} as{TypeError} core::String*;
core::int* z = new self::B::•().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
index b926ab0..6bfd5ee 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;
// ^
//
@@ -26,7 +25,6 @@
}
static method foo() → dynamic {
core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;
^" in new self::B::•<core::String*>().{self::B::x} as{TypeError} core::int*;
core::String* z = new self::B::•<core::String*>().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
index b926ab0..6bfd5ee 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;
// ^
//
@@ -26,7 +25,6 @@
}
static method foo() → dynamic {
core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;
^" in new self::B::•<core::String*>().{self::B::x} as{TypeError} core::int*;
core::String* z = new self::B::•<core::String*>().{self::B::x};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
index f2818be..fcd1d67 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// . /*@target=B::m*/ m(null, null);
// ^
//
@@ -38,7 +37,6 @@
}
static method foo() → dynamic {
core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
. /*@target=B::m*/ m(null, null);
^" in new self::B::•<dynamic>().{self::B::m}(null, null) as{TypeError} core::int*;
core::String* z = new self::B::•<dynamic>().{self::B::m}(null, null);
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
index f2818be..fcd1d67 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// . /*@target=B::m*/ m(null, null);
// ^
//
@@ -38,7 +37,6 @@
}
static method foo() → dynamic {
core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
. /*@target=B::m*/ m(null, null);
^" in new self::B::•<dynamic>().{self::B::m}(null, null) as{TypeError} core::int*;
core::String* z = new self::B::•<dynamic>().{self::B::m}(null, null);
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
index 59fb457..62bff19 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// . /*@target=A::value*/ value;
// ^
//
@@ -35,7 +34,6 @@
}
static method foo() → dynamic {
core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
. /*@target=A::value*/ value;
^" in new self::B::•<core::String*>().{self::B::m}(null, null).{self::A::value} as{TypeError} core::int*;
core::String* z = new self::B::•<core::String*>().{self::B::m}(null, null).{self::A::value};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
index 59fb457..62bff19 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// . /*@target=A::value*/ value;
// ^
//
@@ -35,7 +34,6 @@
}
static method foo() → dynamic {
core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
. /*@target=A::value*/ value;
^" in new self::B::•<core::String*>().{self::B::m}(null, null).{self::A::value} as{TypeError} core::int*;
core::String* z = new self::B::•<core::String*>().{self::B::m}(null, null).{self::A::value};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
index 0351235..fe2a499 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
@@ -18,7 +18,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// . /*@target=A::value*/ value;
// ^
//
@@ -50,7 +49,6 @@
}
static method foo() → dynamic {
core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
. /*@target=A::value*/ value;
^" in new test::B::•<core::String*>().{test::B::m}(null, null).{test::A::value} as{TypeError} core::int*;
core::String* z = new test::B::•<core::String*>().{test::B::m}(null, null).{test::A::value};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
index 0351235..fe2a499 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
@@ -18,7 +18,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// . /*@target=A::value*/ value;
// ^
//
@@ -50,7 +49,6 @@
}
static method foo() → dynamic {
core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
. /*@target=A::value*/ value;
^" in new test::B::•<core::String*>().{test::B::m}(null, null).{test::A::value} as{TypeError} core::int*;
core::String* z = new test::B::•<core::String*>().{test::B::m}(null, null).{test::A::value};
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
index cd22a1d..12a0f49 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
@@ -3,18 +3,15 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int x = /*error:INVALID_ASSIGNMENT*/ i;
// ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int x = /*error:INVALID_ASSIGNMENT*/ i;
// ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
// - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String y = /*error:INVALID_ASSIGNMENT*/ x;
// ^
//
@@ -47,7 +44,6 @@
method foo(generic-covariant-impl self::Bar::T* t) → void {
for (core::String* i in t) {
core::int* x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int x = /*error:INVALID_ASSIGNMENT*/ i;
^" in i as{TypeError} core::int*;
}
@@ -60,7 +56,6 @@
method foo(generic-covariant-impl self::Baz::S* t) → void {
for (self::Baz::T* i in t) {
core::int* x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int x = /*error:INVALID_ASSIGNMENT*/ i;
^" in i as{TypeError} core::int*;
self::Baz::T* y = i;
@@ -72,7 +67,6 @@
for (self::Foo* x in list) {
core::String* y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
- 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String y = /*error:INVALID_ASSIGNMENT*/ x;
^" in x as{TypeError} core::String*;
}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
index cd22a1d..12a0f49 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
@@ -3,18 +3,15 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int x = /*error:INVALID_ASSIGNMENT*/ i;
// ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int x = /*error:INVALID_ASSIGNMENT*/ i;
// ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
// - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String y = /*error:INVALID_ASSIGNMENT*/ x;
// ^
//
@@ -47,7 +44,6 @@
method foo(generic-covariant-impl self::Bar::T* t) → void {
for (core::String* i in t) {
core::int* x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:15:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int x = /*error:INVALID_ASSIGNMENT*/ i;
^" in i as{TypeError} core::int*;
}
@@ -60,7 +56,6 @@
method foo(generic-covariant-impl self::Baz::S* t) → void {
for (self::Baz::T* i in t) {
core::int* x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:23:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int x = /*error:INVALID_ASSIGNMENT*/ i;
^" in i as{TypeError} core::int*;
self::Baz::T* y = i;
@@ -72,7 +67,6 @@
for (self::Foo* x in list) {
core::String* y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:32:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
- 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String y = /*error:INVALID_ASSIGNMENT*/ x;
^" in x as{TypeError} core::String*;
}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
index cf89449..ab6817c 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
@@ -3,18 +3,15 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int x = /*error:INVALID_ASSIGNMENT*/ i;
// ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int x = /*error:INVALID_ASSIGNMENT*/ i;
// ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
// - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String y = /*error:INVALID_ASSIGNMENT*/ x;
// ^
//
@@ -50,7 +47,6 @@
method foo(generic-covariant-impl self::Bar::T* t) → dynamic async {
await for (core::String* i in t) {
core::int* x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int x = /*error:INVALID_ASSIGNMENT*/ i;
^" in i as{TypeError} core::int*;
}
@@ -63,7 +59,6 @@
method foo(generic-covariant-impl self::Baz::S* t) → dynamic async {
await for (self::Baz::T* i in t) {
core::int* x = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int x = /*error:INVALID_ASSIGNMENT*/ i;
^" in i as{TypeError} core::int*;
self::Baz::T* y = i;
@@ -79,7 +74,6 @@
await for (self::Foo* x in myStream) {
core::String* y = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
- 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String y = /*error:INVALID_ASSIGNMENT*/ x;
^" in x as{TypeError} core::String*;
}
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 87def0a..55072fa 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
@@ -3,18 +3,15 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int x = /*error:INVALID_ASSIGNMENT*/ i;
// ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// int x = /*error:INVALID_ASSIGNMENT*/ i;
// ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
// - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
// String y = /*error:INVALID_ASSIGNMENT*/ x;
// ^
//
@@ -76,7 +73,6 @@
core::String* i = :for-iterator.{asy::_StreamIterator::current};
{
core::int* x = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int x = /*error:INVALID_ASSIGNMENT*/ i;
^" in i as{TypeError} core::int*;
}
@@ -137,7 +133,6 @@
self::Baz::T* i = :for-iterator.{asy::_StreamIterator::current};
{
core::int* x = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
int x = /*error:INVALID_ASSIGNMENT*/ i;
^" in i as{TypeError} core::int*;
self::Baz::T* y = i;
@@ -201,7 +196,6 @@
{
core::String* y = let final<BottomType> #t11 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
- 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
String y = /*error:INVALID_ASSIGNMENT*/ x;
^" in x as{TypeError} core::String*;
}
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
index 3edce78..3caa837 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// Foo([this.x = /*error:INVALID_ASSIGNMENT*/ "1"]);
// ^
//
@@ -13,7 +12,6 @@
class Foo extends core::Object {
field core::int* x = 1;
constructor •([core::int* x = invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);
^"]) → self::Foo*
: self::Foo::x = x, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect
index 3edce78..3caa837 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// Foo([this.x = /*error:INVALID_ASSIGNMENT*/ "1"]);
// ^
//
@@ -13,7 +12,6 @@
class Foo extends core::Object {
field core::int* x = 1;
constructor •([core::int* x = invalid-expression "pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart:10:46: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);
^"]) → self::Foo*
: self::Foo::x = x, super core::Object::•()
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect
index 26a93d8..11fc86a 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart:10:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
// func = f.call;
// ^
//
@@ -13,7 +12,6 @@
static method test(<T extends core::Object* = dynamic>(T*) →* T* f) → void {
(core::int*) →* core::int* func;
func = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart:10:12: Error: A value of type 'T Function<T>(T)' can't be assigned to a variable of type 'int Function(int)'.
-Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
func = f.call;
^" in f.call as{TypeError} (core::int*) →* core::int*;
}
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
index 89d9a84..2c8a187 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
@@ -3,17 +3,14 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
// ^
//
// pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
// ^
//
// pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-// Try changing the type of the parameter, or casting the argument to 'num'.
// x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
// ^
//
@@ -23,11 +20,9 @@
static method test1() → dynamic {
core::List<core::int*>* x = <core::int*>[1, 2, 3];
x.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
^" in "hi" as{TypeError} core::int*);
x.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
^" in 4.0 as{TypeError} core::int*);
x.{core::List::add}(4);
@@ -36,7 +31,6 @@
static method test2() → dynamic {
core::List<core::num*>* x = <core::num*>[1, 2.0, 3];
x.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-Try changing the type of the parameter, or casting the argument to 'num'.
x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
^" in "hi" as{TypeError} core::num*);
x.{core::List::add}(4.0);
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
index 89d9a84..2c8a187 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
@@ -3,17 +3,14 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
// ^
//
// pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
// ^
//
// pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-// Try changing the type of the parameter, or casting the argument to 'num'.
// x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
// ^
//
@@ -23,11 +20,9 @@
static method test1() → dynamic {
core::List<core::int*>* x = <core::int*>[1, 2, 3];
x.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
^" in "hi" as{TypeError} core::int*);
x.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
^" in 4.0 as{TypeError} core::int*);
x.{core::List::add}(4);
@@ -36,7 +31,6 @@
static method test2() → dynamic {
core::List<core::num*>* x = <core::num*>[1, 2.0, 3];
x.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-Try changing the type of the parameter, or casting the argument to 'num'.
x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
^" in "hi" as{TypeError} core::num*);
x.{core::List::add}(4.0);
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
index 2578c7b..e24becc 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
@@ -3,17 +3,14 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
// ^
//
// pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
// ^
//
// pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-// Try changing the type of the parameter, or casting the argument to 'num'.
// x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
// ^
//
@@ -24,11 +21,9 @@
static field core::List<core::num*>* x2 = <core::num*>[1, 2.0, 3];
static method test1() → dynamic {
self::x1.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
^" in "hi" as{TypeError} core::int*);
self::x1.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
^" in 4.0 as{TypeError} core::int*);
self::x1.{core::List::add}(4);
@@ -36,7 +31,6 @@
}
static method test2() → dynamic {
self::x2.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-Try changing the type of the parameter, or casting the argument to 'num'.
x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
^" in "hi" as{TypeError} core::num*);
self::x2.{core::List::add}(4.0);
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
index 2578c7b..e24becc 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
@@ -3,17 +3,14 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
// ^
//
// pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
// ^
//
// pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-// Try changing the type of the parameter, or casting the argument to 'num'.
// x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
// ^
//
@@ -24,11 +21,9 @@
static field core::List<core::num*>* x2 = <core::num*>[1, 2.0, 3];
static method test1() → dynamic {
self::x1.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
^" in "hi" as{TypeError} core::int*);
self::x1.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
^" in 4.0 as{TypeError} core::int*);
self::x1.{core::List::add}(4);
@@ -36,7 +31,6 @@
}
static method test2() → dynamic {
self::x2.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-Try changing the type of the parameter, or casting the argument to 'num'.
x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
^" in "hi" as{TypeError} core::num*);
self::x2.{core::List::add}(4.0);
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
index 603476d..1a8ef87 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/inference/local_return_and_yield.dart:19:38: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
// - 'FutureOr' is from 'dart:async'.
-// Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
// return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
// ^
//
@@ -22,7 +21,6 @@
function b() → asy::Future<(core::int*) →* core::int*>* async {
return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:38: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
- 'FutureOr' is from 'dart:async'.
-Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int*) →* core::int*>*;
}
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 34219f6..02cb679 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
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/inference/local_return_and_yield.dart:19:38: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
// - 'FutureOr' is from 'dart:async'.
-// Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
// return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
// ^
//
@@ -33,7 +32,6 @@
{
:return_value = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:38: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
- 'FutureOr' is from 'dart:async'.
-Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int*) →* core::int*>*;
break #L1;
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
index 2449679..1f1aeac 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
@@ -3,28 +3,23 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
// ^
//
// pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
// ^
//
// pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
// ^
//
// pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-// Try changing the type of the parameter, or casting the argument to 'num'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
// ^
//
// pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
// - 'Pattern' is from 'dart:core'.
-// Try changing the type of the parameter, or casting the argument to 'Pattern'.
// x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
// ^
//
@@ -35,15 +30,12 @@
core::Map<core::int*, core::String*>* x = <core::int*, core::String*>{1: "x", 2: "y"};
x.{core::Map::[]=}(3, "z");
x.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
^" in "hi" as{TypeError} core::int*, "w");
x.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
^" in 4.0 as{TypeError} core::int*, "u");
x.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
^" in 42 as{TypeError} core::String*);
core::Map<core::num*, core::String*>* y = x;
@@ -52,13 +44,11 @@
core::Map<core::num*, core::Pattern*>* x = <core::num*, core::Pattern*>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
x.{core::Map::[]=}(3, "z");
x.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-Try changing the type of the parameter, or casting the argument to 'num'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
^" in "hi" as{TypeError} core::num*, "w");
x.{core::Map::[]=}(4.0, "u");
x.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
- 'Pattern' is from 'dart:core'.
-Try changing the type of the parameter, or casting the argument to 'Pattern'.
x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
^" in 42 as{TypeError} core::Pattern*);
core::Pattern* p = null;
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
index 2449679..1f1aeac 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
@@ -3,28 +3,23 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
// ^
//
// pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
// ^
//
// pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
// ^
//
// pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-// Try changing the type of the parameter, or casting the argument to 'num'.
// /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
// ^
//
// pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
// - 'Pattern' is from 'dart:core'.
-// Try changing the type of the parameter, or casting the argument to 'Pattern'.
// x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
// ^
//
@@ -35,15 +30,12 @@
core::Map<core::int*, core::String*>* x = <core::int*, core::String*>{1: "x", 2: "y"};
x.{core::Map::[]=}(3, "z");
x.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
^" in "hi" as{TypeError} core::int*, "w");
x.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:14:46: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
^" in 4.0 as{TypeError} core::int*, "u");
x.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
^" in 42 as{TypeError} core::String*);
core::Map<core::num*, core::String*>* y = x;
@@ -52,13 +44,11 @@
core::Map<core::num*, core::Pattern*>* x = <core::num*, core::Pattern*>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
x.{core::Map::[]=}(3, "z");
x.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:27:46: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-Try changing the type of the parameter, or casting the argument to 'num'.
/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
^" in "hi" as{TypeError} core::num*, "w");
x.{core::Map::[]=}(4.0, "u");
x.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
- 'Pattern' is from 'dart:core'.
-Try changing the type of the parameter, or casting the argument to 'Pattern'.
x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
^" in 42 as{TypeError} core::Pattern*);
core::Pattern* p = null;
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
index 7af3179..4505766 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
@@ -3,28 +3,23 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
// ^
//
// pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
// ^
//
// pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
// ^
//
// pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-// Try changing the type of the parameter, or casting the argument to 'num'.
// x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
// ^
//
// pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
// - 'Pattern' is from 'dart:core'.
-// Try changing the type of the parameter, or casting the argument to 'Pattern'.
// x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
// ^
//
@@ -36,15 +31,12 @@
static method test1() → dynamic {
self::x1.{core::Map::[]=}(3, "z");
self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
^" in "hi" as{TypeError} core::int*, "w");
self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
^" in 4.0 as{TypeError} core::int*, "u");
self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
^" in 42 as{TypeError} core::String*);
core::Map<core::num*, core::String*>* y = self::x1;
@@ -52,13 +44,11 @@
static method test2() → dynamic {
self::x2.{core::Map::[]=}(3, "z");
self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-Try changing the type of the parameter, or casting the argument to 'num'.
x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
^" in "hi" as{TypeError} core::num*, "w");
self::x2.{core::Map::[]=}(4.0, "u");
self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
- 'Pattern' is from 'dart:core'.
-Try changing the type of the parameter, or casting the argument to 'Pattern'.
x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
^" in 42 as{TypeError} core::Pattern*);
core::Pattern* p = null;
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
index 7af3179..4505766 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
@@ -3,28 +3,23 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
// ^
//
// pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-// Try changing the type of the parameter, or casting the argument to 'int'.
// x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
// ^
//
// pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-// Try changing the type of the parameter, or casting the argument to 'String'.
// x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
// ^
//
// pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-// Try changing the type of the parameter, or casting the argument to 'num'.
// x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
// ^
//
// pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
// - 'Pattern' is from 'dart:core'.
-// Try changing the type of the parameter, or casting the argument to 'Pattern'.
// x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
// ^
//
@@ -36,15 +31,12 @@
static method test1() → dynamic {
self::x1.{core::Map::[]=}(3, "z");
self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
^" in "hi" as{TypeError} core::int*, "w");
self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
-Try changing the type of the parameter, or casting the argument to 'int'.
x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
^" in 4.0 as{TypeError} core::int*, "u");
self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: The argument type 'int' can't be assigned to the parameter type 'String'.
-Try changing the type of the parameter, or casting the argument to 'String'.
x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
^" in 42 as{TypeError} core::String*);
core::Map<core::num*, core::String*>* y = self::x1;
@@ -52,13 +44,11 @@
static method test2() → dynamic {
self::x2.{core::Map::[]=}(3, "z");
self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
-Try changing the type of the parameter, or casting the argument to 'num'.
x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
^" in "hi" as{TypeError} core::num*, "w");
self::x2.{core::Map::[]=}(4.0, "u");
self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: The argument type 'int' can't be assigned to the parameter type 'Pattern'.
- 'Pattern' is from 'dart:core'.
-Try changing the type of the parameter, or casting the argument to 'Pattern'.
x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
^" in 42 as{TypeError} core::Pattern*);
core::Pattern* p = null;
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
index a896508..0353c68 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
@@ -3,12 +3,10 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -24,12 +22,10 @@
static method test5() → dynamic {
self::A* a1 = new self::A::•();
a1.{self::A::x} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
self::A* a2 = new self::A::•();
a2.{self::A::x} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect
index a896508..0353c68 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect
@@ -3,12 +3,10 @@
// Problems in library:
//
// pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
// pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ "hi";
// ^
//
@@ -24,12 +22,10 @@
static method test5() → dynamic {
self::A* a1 = new self::A::•();
a1.{self::A::x} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
self::A* a2 = new self::A::•();
a2.{self::A::x} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
^" in "hi" as{TypeError} core::int*;
}
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
index 6c9873d..a34ea59 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
// - 'FutureOr' is from 'dart:async'.
-// Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
// return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
// ^
//
@@ -21,7 +20,6 @@
static method b() → asy::Future<(core::int*) →* core::int*>* async {
return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
- 'FutureOr' is from 'dart:async'.
-Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int*) →* core::int*>*;
}
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 d2f7099..0dba3ea 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
@@ -4,7 +4,6 @@
//
// pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
// - 'FutureOr' is from 'dart:async'.
-// Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
// return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
// ^
//
@@ -32,7 +31,6 @@
{
:return_value = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
- 'FutureOr' is from 'dart:async'.
-Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int*) →* core::int*>*;
break #L1;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect
index 67be699..1f7e3c2 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect
@@ -2,8 +2,8 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:19: Error: An equality expression can't be an operand of another equality expression.
-// Try re-writing the expression.
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:19: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
// var v = (f<dynamic>)(() {
// ^
//
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect
index 8c4c41b..973e1f4 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect
@@ -2,8 +2,8 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:15: Error: An equality expression can't be an operand of another equality expression.
-// Try re-writing the expression.
+// pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:15: Error: A comparison expression can't be an operand of another comparison expression.
+// Try putting parentheses around one of the comparisons.
// var v = (f<int>)(() {
// ^
//
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
index 82e6557..4468732 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
@@ -3,37 +3,30 @@
// Problems in library:
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:108:34: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
// /*@ target=num::+ */ += getInt();
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:118:53: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
// var /*@ type=int* */ v10 = /*@ target=num::+ */ ++super
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:122:36: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
// ['x'] /*@ target=num::+ */ ++;
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:248:37: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ target=double::+ */ += getInt();
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:252:37: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ target=double::+ */ += getNum();
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:254:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var /*@ type=double* */ v10 = /*@ target=double::+ */ ++super
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:259:43: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// ['x'] /*@ target=double::+ */ ++;
// ^
//
@@ -94,17 +87,14 @@
core::num* v5 = let final core::String* #t69 = "x" in let final core::int* #t70 = super.{self::Base::[]}(#t69) in #t70.{core::num::==}(null) ?{core::num*} let final core::num* #t71 = self::getNum() as{TypeError} core::double* in let final void #t72 = super.{self::Base::[]=}(#t69, #t71) in #t71 : #t70;
core::num* v6 = let final core::String* #t73 = "x" in let final core::int* #t74 = super.{self::Base::[]}(#t73) in #t74.{core::num::==}(null) ?{core::num*} let final core::double* #t75 = self::getDouble() in let final void #t76 = super.{self::Base::[]=}(#t73, #t75) in #t75 : #t74;
core::int* v7 = let final core::String* #t77 = "x" in let final core::int* #t78 = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:108:34: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-Try changing the type of the left hand side, or casting the right hand side to 'double'.
/*@ target=num::+ */ += getInt();
^" in super.{self::Base::[]}(#t77).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t80 = super.{self::Base::[]=}(#t77, #t78) in #t78;
core::num* v8 = let final core::String* #t81 = "x" in let final core::num* #t82 = super.{self::Base::[]}(#t81).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t83 = super.{self::Base::[]=}(#t81, #t82) in #t82;
core::double* v9 = let final core::String* #t84 = "x" in let final core::double* #t85 = super.{self::Base::[]}(#t84).{core::num::+}(self::getDouble()) in let final void #t86 = super.{self::Base::[]=}(#t84, #t85) in #t85;
core::int* v10 = let final core::String* #t87 = "x" in let final core::int* #t88 = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:118:53: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-Try changing the type of the left hand side, or casting the right hand side to 'double'.
var /*@ type=int* */ v10 = /*@ target=num::+ */ ++super
^" in super.{self::Base::[]}(#t87).{core::num::+}(1) as{TypeError} core::double* in let final void #t90 = super.{self::Base::[]=}(#t87, #t88) in #t88;
core::int* v11 = let final core::String* #t91 = "x" in let final core::int* #t92 = super.{self::Base::[]}(#t91) in let final void #t93 = super.{self::Base::[]=}(#t91, let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:122:36: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-Try changing the type of the left hand side, or casting the right hand side to 'double'.
['x'] /*@ target=num::+ */ ++;
^" in #t92.{core::num::+}(1) as{TypeError} core::double*) in #t92;
}
@@ -168,19 +158,15 @@
core::num* v4 = let final core::String* #t192 = "x" in let final core::double* #t193 = super.{self::Base::[]}(#t192) in #t193.{core::num::==}(null) ?{core::num*} let final core::int* #t194 = self::getInt() in let final void #t195 = super.{self::Base::[]=}(#t192, #t194) in #t194 : #t193;
core::num* v5 = let final core::String* #t196 = "x" in let final core::double* #t197 = super.{self::Base::[]}(#t196) in #t197.{core::num::==}(null) ?{core::num*} let final core::num* #t198 = self::getNum() as{TypeError} core::int* in let final void #t199 = super.{self::Base::[]=}(#t196, #t198) in #t198 : #t197;
core::double* v7 = let final core::String* #t200 = "x" in let final core::double* #t201 = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:248:37: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ target=double::+ */ += getInt();
^" in super.{self::Base::[]}(#t200).{core::double::+}(self::getInt()) as{TypeError} core::int* in let final void #t203 = super.{self::Base::[]=}(#t200, #t201) in #t201;
core::double* v8 = let final core::String* #t204 = "x" in let final core::double* #t205 = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:252:37: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ target=double::+ */ += getNum();
^" in super.{self::Base::[]}(#t204).{core::double::+}(self::getNum()) as{TypeError} core::int* in let final void #t207 = super.{self::Base::[]=}(#t204, #t205) in #t205;
core::double* v10 = let final core::String* #t208 = "x" in let final core::double* #t209 = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:254:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var /*@ type=double* */ v10 = /*@ target=double::+ */ ++super
^" in super.{self::Base::[]}(#t208).{core::double::+}(1) as{TypeError} core::int* in let final void #t211 = super.{self::Base::[]=}(#t208, #t209) in #t209;
core::double* v11 = let final core::String* #t212 = "x" in let final core::double* #t213 = super.{self::Base::[]}(#t212) in let final void #t214 = super.{self::Base::[]=}(#t212, let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:259:43: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
['x'] /*@ target=double::+ */ ++;
^" in #t213.{core::double::+}(1) as{TypeError} core::int*) in #t213;
}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
index 805d030..e9c7b8e 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
@@ -3,37 +3,30 @@
// Problems in library:
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:111:28: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
// /*@target=num::+*/ += getInt();
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:121:51: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
// var /*@ type=int* */ v10 = /*@target=num::+*/ ++this
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:28: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
// /*@target=num::+*/ ++;
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:268:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@target=double::+*/ += getInt();
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:272:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@target=double::+*/ += getNum();
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:274:57: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var /*@ type=double* */ v10 = /*@target=double::+*/ ++this
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:279:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@target=double::+*/ ++;
// ^
//
@@ -89,17 +82,14 @@
core::num* v5 = let final core::String* #t76 = "x" in let final core::int* #t77 = this.{self::Test3::[]}(#t76) in #t77.{core::num::==}(null) ?{core::num*} let final core::num* #t78 = self::getNum() as{TypeError} core::double* in let final void #t79 = this.{self::Test3::[]=}(#t76, #t78) in #t78 : #t77;
core::num* v6 = let final core::String* #t80 = "x" in let final core::int* #t81 = this.{self::Test3::[]}(#t80) in #t81.{core::num::==}(null) ?{core::num*} let final core::double* #t82 = self::getDouble() in let final void #t83 = this.{self::Test3::[]=}(#t80, #t82) in #t82 : #t81;
core::int* v7 = let final core::String* #t84 = "x" in let final core::int* #t85 = let final<BottomType> #t86 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:111:28: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-Try changing the type of the left hand side, or casting the right hand side to 'double'.
/*@target=num::+*/ += getInt();
^" in this.{self::Test3::[]}(#t84).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t87 = this.{self::Test3::[]=}(#t84, #t85) in #t85;
core::num* v8 = let final core::String* #t88 = "x" in let final core::num* #t89 = this.{self::Test3::[]}(#t88).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t90 = this.{self::Test3::[]=}(#t88, #t89) in #t89;
core::double* v9 = let final core::String* #t91 = "x" in let final core::double* #t92 = this.{self::Test3::[]}(#t91).{core::num::+}(self::getDouble()) in let final void #t93 = this.{self::Test3::[]=}(#t91, #t92) in #t92;
core::int* v10 = let final core::String* #t94 = "x" in let final core::int* #t95 = let final<BottomType> #t96 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:121:51: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-Try changing the type of the left hand side, or casting the right hand side to 'double'.
var /*@ type=int* */ v10 = /*@target=num::+*/ ++this
^" in this.{self::Test3::[]}(#t94).{core::num::+}(1) as{TypeError} core::double* in let final void #t97 = this.{self::Test3::[]=}(#t94, #t95) in #t95;
core::int* v11 = let final core::String* #t98 = "x" in let final core::int* #t99 = this.{self::Test3::[]}(#t98) in let final void #t100 = this.{self::Test3::[]=}(#t98, let final<BottomType> #t101 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:28: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-Try changing the type of the left hand side, or casting the right hand side to 'double'.
/*@target=num::+*/ ++;
^" in #t99.{core::num::+}(1) as{TypeError} core::double*) in #t99;
}
@@ -171,19 +161,15 @@
core::num* v4 = let final core::String* #t208 = "x" in let final core::double* #t209 = this.{self::Test7::[]}(#t208) in #t209.{core::num::==}(null) ?{core::num*} let final core::int* #t210 = self::getInt() in let final void #t211 = this.{self::Test7::[]=}(#t208, #t210) in #t210 : #t209;
core::num* v5 = let final core::String* #t212 = "x" in let final core::double* #t213 = this.{self::Test7::[]}(#t212) in #t213.{core::num::==}(null) ?{core::num*} let final core::num* #t214 = self::getNum() as{TypeError} core::int* in let final void #t215 = this.{self::Test7::[]=}(#t212, #t214) in #t214 : #t213;
core::double* v7 = let final core::String* #t216 = "x" in let final core::double* #t217 = let final<BottomType> #t218 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:268:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@target=double::+*/ += getInt();
^" in this.{self::Test7::[]}(#t216).{core::double::+}(self::getInt()) as{TypeError} core::int* in let final void #t219 = this.{self::Test7::[]=}(#t216, #t217) in #t217;
core::double* v8 = let final core::String* #t220 = "x" in let final core::double* #t221 = let final<BottomType> #t222 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:272:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@target=double::+*/ += getNum();
^" in this.{self::Test7::[]}(#t220).{core::double::+}(self::getNum()) as{TypeError} core::int* in let final void #t223 = this.{self::Test7::[]=}(#t220, #t221) in #t221;
core::double* v10 = let final core::String* #t224 = "x" in let final core::double* #t225 = let final<BottomType> #t226 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:274:57: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var /*@ type=double* */ v10 = /*@target=double::+*/ ++this
^" in this.{self::Test7::[]}(#t224).{core::double::+}(1) as{TypeError} core::int* in let final void #t227 = this.{self::Test7::[]=}(#t224, #t225) in #t225;
core::double* v11 = let final core::String* #t228 = "x" in let final core::double* #t229 = this.{self::Test7::[]}(#t228) in let final void #t230 = this.{self::Test7::[]=}(#t228, let final<BottomType> #t231 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:279:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@target=double::+*/ ++;
^" in #t229.{core::double::+}(1) as{TypeError} core::int*) in #t229;
}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
index 7ee2c5a..7eb4b1c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
@@ -3,37 +3,30 @@
// Problems in library:
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:90:79: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
// t /*@target=Test::[]*/ /*@target=Test::[]=*/ ['x'] /*@ target=num::+ */ +=
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:102:28: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
// /*@ target=num::+ */ ++t /*@target=Test::[]*/ /*@target=Test::[]=*/ ['x'];
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:105:33: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
// 'x'] /*@ target=num::+ */ ++;
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:211:36: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// 'x'] /*@ target=double::+ */ += getInt();
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:214:36: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// 'x'] /*@ target=double::+ */ += getNum();
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:217:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// /*@ target=double::+ */ ++t
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:221:36: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// 'x'] /*@ target=double::+ */ ++;
// ^
//
@@ -82,17 +75,14 @@
core::num* v5 = let final self::Test<core::int*, core::double*>* #t90 = t in let final core::String* #t91 = "x" in let final core::int* #t92 = #t90.{self::Test::[]}(#t91) in #t92.{core::num::==}(null) ?{core::num*} let final core::num* #t93 = self::getNum() as{TypeError} core::double* in let final void #t94 = #t90.{self::Test::[]=}(#t91, #t93) in #t93 : #t92;
core::num* v6 = let final self::Test<core::int*, core::double*>* #t95 = t in let final core::String* #t96 = "x" in let final core::int* #t97 = #t95.{self::Test::[]}(#t96) in #t97.{core::num::==}(null) ?{core::num*} let final core::double* #t98 = self::getDouble() in let final void #t99 = #t95.{self::Test::[]=}(#t96, #t98) in #t98 : #t97;
core::int* v7 = let final self::Test<core::int*, core::double*>* #t100 = t in let final core::String* #t101 = "x" in let final core::int* #t102 = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:90:79: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-Try changing the type of the left hand side, or casting the right hand side to 'double'.
t /*@target=Test::[]*/ /*@target=Test::[]=*/ ['x'] /*@ target=num::+ */ +=
^" in #t100.{self::Test::[]}(#t101).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t104 = #t100.{self::Test::[]=}(#t101, #t102) in #t102;
core::num* v8 = let final self::Test<core::int*, core::double*>* #t105 = t in let final core::String* #t106 = "x" in let final core::num* #t107 = #t105.{self::Test::[]}(#t106).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t108 = #t105.{self::Test::[]=}(#t106, #t107) in #t107;
core::double* v9 = let final self::Test<core::int*, core::double*>* #t109 = t in let final core::String* #t110 = "x" in let final core::double* #t111 = #t109.{self::Test::[]}(#t110).{core::num::+}(self::getDouble()) in let final void #t112 = #t109.{self::Test::[]=}(#t110, #t111) in #t111;
core::int* v10 = let final self::Test<core::int*, core::double*>* #t113 = t in let final core::String* #t114 = "x" in let final core::int* #t115 = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:102:28: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-Try changing the type of the left hand side, or casting the right hand side to 'double'.
/*@ target=num::+ */ ++t /*@target=Test::[]*/ /*@target=Test::[]=*/ ['x'];
^" in #t113.{self::Test::[]}(#t114).{core::num::+}(1) as{TypeError} core::double* in let final void #t117 = #t113.{self::Test::[]=}(#t114, #t115) in #t115;
core::int* v11 = let final self::Test<core::int*, core::double*>* #t118 = t in let final core::String* #t119 = "x" in let final core::int* #t120 = #t118.{self::Test::[]}(#t119) in let final void #t121 = #t118.{self::Test::[]=}(#t119, let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:105:33: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-Try changing the type of the left hand side, or casting the right hand side to 'double'.
'x'] /*@ target=num::+ */ ++;
^" in #t120.{core::num::+}(1) as{TypeError} core::double*) in #t120;
}
@@ -136,19 +126,15 @@
core::num* v4 = let final self::Test<core::double*, core::int*>* #t250 = t in let final core::String* #t251 = "x" in let final core::double* #t252 = #t250.{self::Test::[]}(#t251) in #t252.{core::num::==}(null) ?{core::num*} let final core::int* #t253 = self::getInt() in let final void #t254 = #t250.{self::Test::[]=}(#t251, #t253) in #t253 : #t252;
core::num* v5 = let final self::Test<core::double*, core::int*>* #t255 = t in let final core::String* #t256 = "x" in let final core::double* #t257 = #t255.{self::Test::[]}(#t256) in #t257.{core::num::==}(null) ?{core::num*} let final core::num* #t258 = self::getNum() as{TypeError} core::int* in let final void #t259 = #t255.{self::Test::[]=}(#t256, #t258) in #t258 : #t257;
core::double* v7 = let final self::Test<core::double*, core::int*>* #t260 = t in let final core::String* #t261 = "x" in let final core::double* #t262 = let final<BottomType> #t263 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:211:36: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
'x'] /*@ target=double::+ */ += getInt();
^" in #t260.{self::Test::[]}(#t261).{core::double::+}(self::getInt()) as{TypeError} core::int* in let final void #t264 = #t260.{self::Test::[]=}(#t261, #t262) in #t262;
core::double* v8 = let final self::Test<core::double*, core::int*>* #t265 = t in let final core::String* #t266 = "x" in let final core::double* #t267 = let final<BottomType> #t268 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:214:36: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
'x'] /*@ target=double::+ */ += getNum();
^" in #t265.{self::Test::[]}(#t266).{core::double::+}(self::getNum()) as{TypeError} core::int* in let final void #t269 = #t265.{self::Test::[]=}(#t266, #t267) in #t267;
core::double* v10 = let final self::Test<core::double*, core::int*>* #t270 = t in let final core::String* #t271 = "x" in let final core::double* #t272 = let final<BottomType> #t273 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:217:31: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
/*@ target=double::+ */ ++t
^" in #t270.{self::Test::[]}(#t271).{core::double::+}(1) as{TypeError} core::int* in let final void #t274 = #t270.{self::Test::[]=}(#t271, #t272) in #t272;
core::double* v11 = let final self::Test<core::double*, core::int*>* #t275 = t in let final core::String* #t276 = "x" in let final core::double* #t277 = #t275.{self::Test::[]}(#t276) in let final void #t278 = #t275.{self::Test::[]=}(#t276, let final<BottomType> #t279 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:221:36: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
'x'] /*@ target=double::+ */ ++;
^" in #t277.{core::double::+}(1) as{TypeError} core::int*) in #t277;
}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
index 9749d80..e4b1a05 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
@@ -4,25 +4,21 @@
//
// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:39: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
// - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A'.
// var v_prefix_pp = (/*@ target=A::+ */ ++new /*@ type=B* */ B()
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:39: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
// - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A'.
// var v_prefix_mm = (/*@ target=A::- */ --new /*@ type=B* */ B()
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:23:45: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
// - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A'.
// /*@ type=int* */ /*@ target=A::+ */ ++);
// ^
//
// pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:26:48: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
// - 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A'.
// /*@ type=double* */ /*@ target=A::- */ --);
// ^
//
@@ -46,22 +42,18 @@
}
static field core::int* v_prefix_pp = let final self::B* #t1 = new self::B::•() in #t1.{self::B::a} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:39: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
- 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A'.
var v_prefix_pp = (/*@ target=A::+ */ ++new /*@ type=B* */ B()
^" in #t1.{self::B::a}.{self::A::+}(1) as{TypeError} self::A*;
static field core::double* v_prefix_mm = let final self::B* #t3 = new self::B::•() in #t3.{self::B::a} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:39: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
- 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A'.
var v_prefix_mm = (/*@ target=A::- */ --new /*@ type=B* */ B()
^" in #t3.{self::B::a}.{self::A::-}(1) as{TypeError} self::A*;
static field self::A* v_postfix_pp = let final self::B* #t5 = new self::B::•() in let final self::A* #t6 = #t5.{self::B::a} in let final core::int* #t7 = #t5.{self::B::a} = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:23:45: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
- 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A'.
/*@ type=int* */ /*@ target=A::+ */ ++);
^" in #t6.{self::A::+}(1) as{TypeError} self::A* in #t6;
static field self::A* v_postfix_mm = let final self::B* #t9 = new self::B::•() in let final self::A* #t10 = #t9.{self::B::a} in let final core::double* #t11 = #t9.{self::B::a} = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:26:48: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
- 'A' is from 'pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A'.
/*@ type=double* */ /*@ target=A::- */ --);
^" in #t10.{self::A::-}(1) as{TypeError} self::A* in #t10;
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
index 97a4e94..ce63906 100644
--- a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:13: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
// var x = i = s;
// ^
//
@@ -13,7 +12,6 @@
static field core::int* i;
static field core::String* s;
static field core::String* x = self::i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart:9:13: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
var x = i = s;
^" in self::s as{TypeError} core::int*;
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/function_types.dart.outline.expect b/pkg/front_end/testcases/nnbd/function_types.dart.outline.expect
index 30f7d49..3579c0d 100644
--- a/pkg/front_end/testcases/nnbd/function_types.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/function_types.dart.outline.expect
@@ -17,7 +17,7 @@
;
static method bar() → () → void
;
-static method baz() → () → void
+static method baz() → () →? void
;
static method hest() → () → void
;
diff --git a/pkg/front_end/testcases/nnbd/function_types.dart.strong.expect b/pkg/front_end/testcases/nnbd/function_types.dart.strong.expect
index 71aef3b..588caa0 100644
--- a/pkg/front_end/testcases/nnbd/function_types.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/function_types.dart.strong.expect
@@ -18,7 +18,7 @@
static method foo() → void {}
static method bar() → () → void
return #C1;
-static method baz() → () → void
+static method baz() → () →? void
return #C1;
static method hest() → () → void
return #C1;
@@ -30,7 +30,7 @@
() → void g;
() →? void f = g;
() → void fBar = self::bar();
- () → void fBaz = self::baz();
+ () →? void fBaz = self::baz();
() → void fHest = self::hest();
() →? void fFisk = self::fisk();
}
diff --git a/pkg/front_end/testcases/nnbd/function_types.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/function_types.dart.strong.transformed.expect
index 71aef3b..588caa0 100644
--- a/pkg/front_end/testcases/nnbd/function_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/function_types.dart.strong.transformed.expect
@@ -18,7 +18,7 @@
static method foo() → void {}
static method bar() → () → void
return #C1;
-static method baz() → () → void
+static method baz() → () →? void
return #C1;
static method hest() → () → void
return #C1;
@@ -30,7 +30,7 @@
() → void g;
() →? void f = g;
() → void fBar = self::bar();
- () → void fBaz = self::baz();
+ () →? void fBaz = self::baz();
() → void fHest = self::hest();
() →? void fFisk = self::fisk();
}
diff --git a/pkg/front_end/testcases/nnbd/intersection_types.dart b/pkg/front_end/testcases/nnbd/intersection_types.dart
new file mode 100644
index 0000000..d33b476
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/intersection_types.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2019, 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.
+
+// The test checks the computation of the nullabilities of intersection types.
+
+class A {}
+class B extends A {}
+class C extends B {}
+
+class Foo<T extends A?> {
+ doPromotionsToNullable(T t) {
+ if (t is B?) {
+ var bar = t;
+ if (t is C?) {
+ var baz = t;
+ }
+ }
+ }
+
+ doPromotionsToNonNullable(T t) {
+ if (t is B) {
+ var bar = t;
+ if (t is C) {
+ var baz = t;
+ }
+ }
+ }
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/intersection_types.dart.outline.expect b/pkg/front_end/testcases/nnbd/intersection_types.dart.outline.expect
new file mode 100644
index 0000000..26de83e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/intersection_types.dart.outline.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → self::A*
+ ;
+}
+class B extends self::A {
+ synthetic constructor •() → self::B*
+ ;
+}
+class C extends self::B {
+ synthetic constructor •() → self::C*
+ ;
+}
+class Foo<T extends self::A? = self::A?> extends core::Object {
+ synthetic constructor •() → self::Foo<self::Foo::T*>*
+ ;
+ method doPromotionsToNullable(generic-covariant-impl self::Foo::T% t) → dynamic
+ ;
+ method doPromotionsToNonNullable(generic-covariant-impl self::Foo::T% t) → dynamic
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.expect b/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.expect
new file mode 100644
index 0000000..a65870d3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → self::A*
+ : super core::Object::•()
+ ;
+}
+class B extends self::A {
+ synthetic constructor •() → self::B*
+ : super self::A::•()
+ ;
+}
+class C extends self::B {
+ synthetic constructor •() → self::C*
+ : super self::B::•()
+ ;
+}
+class Foo<T extends self::A? = self::A?> extends core::Object {
+ synthetic constructor •() → self::Foo<self::Foo::T*>*
+ : super core::Object::•()
+ ;
+ method doPromotionsToNullable(generic-covariant-impl self::Foo::T% t) → dynamic {
+ if(t is self::B?) {
+ self::Foo::T% & self::B? /* '%' & '?' = '%' */ bar = t{self::Foo::T% & self::B? /* '%' & '?' = '%' */};
+ if(t{self::Foo::T% & self::B? /* '%' & '?' = '%' */} is self::C?) {
+ self::Foo::T% & self::C? /* '%' & '?' = '%' */ baz = t{self::Foo::T% & self::C? /* '%' & '?' = '%' */};
+ }
+ }
+ }
+ method doPromotionsToNonNullable(generic-covariant-impl self::Foo::T% t) → dynamic {
+ if(t is self::B) {
+ self::Foo::T% & self::B /* '%' & '!' = '!' */ bar = t{self::Foo::T% & self::B /* '%' & '!' = '!' */};
+ if(t{self::Foo::T% & self::B /* '%' & '!' = '!' */} is self::C) {
+ self::Foo::T & self::C /* '!' & '!' = '!' */ baz = t{self::Foo::T & self::C /* '!' & '!' = '!' */};
+ }
+ }
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.transformed.expect
new file mode 100644
index 0000000..a65870d3
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/intersection_types.dart.strong.transformed.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+ synthetic constructor •() → self::A*
+ : super core::Object::•()
+ ;
+}
+class B extends self::A {
+ synthetic constructor •() → self::B*
+ : super self::A::•()
+ ;
+}
+class C extends self::B {
+ synthetic constructor •() → self::C*
+ : super self::B::•()
+ ;
+}
+class Foo<T extends self::A? = self::A?> extends core::Object {
+ synthetic constructor •() → self::Foo<self::Foo::T*>*
+ : super core::Object::•()
+ ;
+ method doPromotionsToNullable(generic-covariant-impl self::Foo::T% t) → dynamic {
+ if(t is self::B?) {
+ self::Foo::T% & self::B? /* '%' & '?' = '%' */ bar = t{self::Foo::T% & self::B? /* '%' & '?' = '%' */};
+ if(t{self::Foo::T% & self::B? /* '%' & '?' = '%' */} is self::C?) {
+ self::Foo::T% & self::C? /* '%' & '?' = '%' */ baz = t{self::Foo::T% & self::C? /* '%' & '?' = '%' */};
+ }
+ }
+ }
+ method doPromotionsToNonNullable(generic-covariant-impl self::Foo::T% t) → dynamic {
+ if(t is self::B) {
+ self::Foo::T% & self::B /* '%' & '!' = '!' */ bar = t{self::Foo::T% & self::B /* '%' & '!' = '!' */};
+ if(t{self::Foo::T% & self::B /* '%' & '!' = '!' */} is self::C) {
+ self::Foo::T & self::C /* '!' & '!' = '!' */ baz = t{self::Foo::T & self::C /* '!' & '!' = '!' */};
+ }
+ }
+ }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/intersection_types.dart.type_promotion.expect b/pkg/front_end/testcases/nnbd/intersection_types.dart.type_promotion.expect
new file mode 100644
index 0000000..ffa128e
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/intersection_types.dart.type_promotion.expect
@@ -0,0 +1,12 @@
+pkg/front_end/testcases/nnbd/intersection_types.dart:13:11: Context: Possible promotion of t@403
+ if (t is B?) {
+ ^^
+pkg/front_end/testcases/nnbd/intersection_types.dart:15:13: Context: Possible promotion of t@403
+ if (t is C?) {
+ ^^
+pkg/front_end/testcases/nnbd/intersection_types.dart:22:11: Context: Possible promotion of t@403
+ if (t is B) {
+ ^^
+pkg/front_end/testcases/nnbd/intersection_types.dart:24:13: Context: Possible promotion of t@403
+ if (t is C) {
+ ^^
diff --git a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart
new file mode 100644
index 0000000..eefd595
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2019, 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.
+
+// The test checks the nullability of the result of the type substitution
+// performed as a part of type inference, including its fall-back mechanism
+// which is instantiate-to-bounds.
+
+foo<T extends Object?, S extends List<T>>(T t) => null;
+
+bar<T extends Object?, S extends List<T?>>(T t) => null;
+
+baz(int? x, int y) {
+ foo(x);
+ bar(y);
+}
+
+class A<T extends Object?, S extends Object> {
+ hest<X extends T, Y extends List<X>, Z extends List<X?>>() => null;
+ fisk<X extends S, Y extends List<X>, Z extends List<X?>>() => null;
+ mus<X extends Object?, Y extends List<X>, Z extends List<X?>>() => null;
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.outline.expect b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.outline.expect
new file mode 100644
index 0000000..5c95be5
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.outline.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object? = core::Object?, S extends core::Object = core::Object> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T*, self::A::S*>*
+ ;
+ method hest<generic-covariant-impl X extends self::A::T% = self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
+ ;
+ method fisk<generic-covariant-impl X extends self::A::S = self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
+ ;
+ method mus<X extends core::Object? = core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
+ ;
+}
+static method foo<T extends core::Object? = core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
+ ;
+static method bar<T extends core::Object? = core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
+ ;
+static method baz(core::int? x, core::int y) → dynamic
+ ;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.expect b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.expect
new file mode 100644
index 0000000..ed9375c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object? = core::Object?, S extends core::Object = core::Object> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T*, self::A::S*>*
+ : super core::Object::•()
+ ;
+ method hest<generic-covariant-impl X extends self::A::T% = self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
+ return null;
+ method fisk<generic-covariant-impl X extends self::A::S = self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
+ return null;
+ method mus<X extends core::Object? = core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
+ return null;
+}
+static method foo<T extends core::Object? = core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
+ return null;
+static method bar<T extends core::Object? = core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
+ return null;
+static method baz(core::int? x, core::int y) → dynamic {
+ self::foo<core::int?, core::List<core::int?>>(x);
+ self::bar<core::int, core::List<core::int?>>(y);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..ed9375c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/substitution_in_inference.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::Object? = core::Object?, S extends core::Object = core::Object> extends core::Object {
+ synthetic constructor •() → self::A<self::A::T*, self::A::S*>*
+ : super core::Object::•()
+ ;
+ method hest<generic-covariant-impl X extends self::A::T% = self::A::T%, Y extends core::List<self::A::hest::X%> = core::List<self::A::T%>, Z extends core::List<self::A::hest::X?> = core::List<self::A::T?>>() → dynamic
+ return null;
+ method fisk<generic-covariant-impl X extends self::A::S = self::A::S, Y extends core::List<self::A::fisk::X> = core::List<self::A::S>, Z extends core::List<self::A::fisk::X?> = core::List<self::A::S?>>() → dynamic
+ return null;
+ method mus<X extends core::Object? = core::Object?, Y extends core::List<self::A::mus::X%> = core::List<core::Object?>, Z extends core::List<self::A::mus::X?> = core::List<core::Object?>>() → dynamic
+ return null;
+}
+static method foo<T extends core::Object? = core::Object?, S extends core::List<self::foo::T%> = core::List<core::Object?>>(self::foo::T% t) → dynamic
+ return null;
+static method bar<T extends core::Object? = core::Object?, S extends core::List<self::bar::T?> = core::List<core::Object?>>(self::bar::T% t) → dynamic
+ return null;
+static method baz(core::int? x, core::int y) → dynamic {
+ self::foo<core::int?, core::List<core::int?>>(x);
+ self::bar<core::int, core::List<core::int?>>(y);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35151.dart.outline.expect
index fc08a34..b1d19a9 100644
--- a/pkg/front_end/testcases/regress/issue_35151.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.outline.expect
@@ -2,7 +2,7 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in it's declaring class
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in its declaring class
// Try passing a value into the superclass constructor, or moving the initialization into the constructor body.
// B() : super.a = 42;
// ^
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35151.dart.strong.expect
index 38d2b3a..6ae43db 100644
--- a/pkg/front_end/testcases/regress/issue_35151.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.strong.expect
@@ -2,7 +2,7 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in it's declaring class
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in its declaring class
// Try passing a value into the superclass constructor, or moving the initialization into the constructor body.
// B() : super.a = 42;
// ^
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35151.dart.strong.transformed.expect
index 38d2b3a..6ae43db 100644
--- a/pkg/front_end/testcases/regress/issue_35151.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in it's declaring class
+// pkg/front_end/testcases/regress/issue_35151.dart:10:15: Error: A field can only be initialized in its declaring class
// Try passing a value into the superclass constructor, or moving the initialization into the constructor body.
// B() : super.a = 42;
// ^
diff --git a/pkg/front_end/testcases/regress/issue_37681.dart b/pkg/front_end/testcases/regress/issue_37681.dart
new file mode 100644
index 0000000..ca0cd8b
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_37681.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2019, 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() async {
+ int f_async() async { return 42; }
+ print(await f_async());
+
+ int f_async_star() async* { yield 42; }
+ await for (var x in f_async_star() as dynamic) {
+ print(x);
+ }
+
+ int f_sync_star() sync* { yield 42; }
+ for (var x in f_sync_star() as dynamic) {
+ print(x);
+ }
+}
diff --git a/pkg/front_end/testcases/regress/issue_37681.dart.outline.expect b/pkg/front_end/testcases/regress/issue_37681.dart.outline.expect
new file mode 100644
index 0000000..6a28c0d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_37681.dart.outline.expect
@@ -0,0 +1,5 @@
+library;
+import self as self;
+
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/regress/issue_37681.dart.strong.expect b/pkg/front_end/testcases/regress/issue_37681.dart.strong.expect
new file mode 100644
index 0000000..3166bc2
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_37681.dart.strong.expect
@@ -0,0 +1,38 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_37681.dart:6:7: Error: Functions marked 'async' must have a return type assignable to 'Future'.
+// int f_async() async { return 42; }
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_37681.dart:9:7: Error: Functions marked 'async*' must have a return type assignable to 'Stream'.
+// int f_async_star() async* { yield 42; }
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_37681.dart:14:7: Error: Functions marked 'sync*' must have a return type assignable to 'Iterable'.
+// int f_sync_star() sync* { yield 42; }
+// ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+static method main() → dynamic async {
+ function f_async() → core::int* async {
+ return 42;
+ }
+ core::print(await f_async.call());
+ function f_async_star() → core::int* async* {
+ yield 42;
+ }
+ await for (dynamic x in (f_async_star.call() as dynamic) as{TypeError} asy::Stream<dynamic>*) {
+ core::print(x);
+ }
+ function f_sync_star() → core::int* sync* {
+ yield 42;
+ }
+ for (dynamic x in (f_sync_star.call() as dynamic) as{TypeError} core::Iterable<dynamic>*) {
+ core::print(x);
+ }
+}
diff --git a/pkg/front_end/testcases/regress/issue_37681.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_37681.dart.strong.transformed.expect
new file mode 100644
index 0000000..5cffed8
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_37681.dart.strong.transformed.expect
@@ -0,0 +1,154 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/regress/issue_37681.dart:6:7: Error: Functions marked 'async' must have a return type assignable to 'Future'.
+// int f_async() async { return 42; }
+// ^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_37681.dart:9:7: Error: Functions marked 'async*' must have a return type assignable to 'Stream'.
+// int f_async_star() async* { yield 42; }
+// ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/regress/issue_37681.dart:14:7: Error: Functions marked 'sync*' must have a return type assignable to 'Iterable'.
+// int f_sync_star() sync* { yield 42; }
+// ^^^^^^^^^^^
+//
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method main() → dynamic /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ asy::FutureOr<dynamic>* :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ dynamic :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ dynamic :saved_try_context_var0;
+ dynamic :saved_try_context_var1;
+ dynamic :exception0;
+ dynamic :stack_trace0;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L1:
+ {
+ function f_async() → core::int* /* originally async */ {
+ final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+ asy::FutureOr<dynamic>* :return_value;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ dynamic :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try {
+ #L2:
+ {
+ :return_value = 42;
+ break #L2;
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :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);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+ }
+ [yield] let dynamic #t1 = asy::_awaitHelper(f_async.call(), :async_op_then, :async_op_error, :async_op) in null;
+ core::print(:result);
+ function f_async_star() → core::int* /* originally async* */ {
+ asy::_AsyncStarStreamController<dynamic>* :controller;
+ dynamic :controller_stream;
+ dynamic :async_stack_trace;
+ dynamic :async_op_then;
+ dynamic :async_op_error;
+ dynamic :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ dynamic :saved_try_context_var0;
+ dynamic :saved_try_context_var1;
+ function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding
+ try
+ try {
+ #L3:
+ {
+ if(:controller.{asy::_AsyncStarStreamController::add}(42))
+ return null;
+ else
+ [yield] null;
+ }
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+ :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+ }
+ finally {
+ :controller.{asy::_AsyncStarStreamController::close}();
+ }
+ :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+ :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+ :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+ :controller = new asy::_AsyncStarStreamController::•<dynamic>(:async_op);
+ :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+ return :controller_stream;
+ }
+ {
+ dynamic :stream = (f_async_star.call() as dynamic) as{TypeError} asy::Stream<dynamic>*;
+ asy::_asyncStarListenHelper(:stream, :async_op);
+ asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+ try
+ #L4:
+ while (true) {
+ dynamic #t2 = asy::_asyncStarMoveNextHelper(:stream);
+ [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+ if(:result) {
+ dynamic x = :for-iterator.{asy::_StreamIterator::current};
+ {
+ core::print(x);
+ }
+ }
+ else
+ break #L4;
+ }
+ finally
+ if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+ [yield] let dynamic #t4 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+ :result;
+ }
+ }
+ function f_sync_star() → core::int* /* originally sync* */ {
+ dynamic :await_jump_var = 0;
+ dynamic :await_ctx_var;
+ function :sync_op(core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
+ {
+ {
+ :iterator.{core::_SyncIterator::_current} = 42;
+ [yield] true;
+ }
+ }
+ return false;
+ }
+ return new core::_SyncIterable::•<dynamic>(:sync_op);
+ }
+ for (dynamic x in (f_sync_star.call() as dynamic) as{TypeError} core::Iterable<dynamic>*) {
+ core::print(x);
+ }
+ }
+ asy::_completeOnAsyncReturn(:async_completer, :return_value);
+ return;
+ }
+ on dynamic catch(dynamic :exception, dynamic :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);
+ :async_completer.start(:async_op);
+ return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
index d90577e..e262b07 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'double' can't be assigned to the parameter type 'U'.
-// Try changing the type of the parameter, or casting the argument to 'U'.
// this.f<U>(1.5);
// ^
//
@@ -23,7 +22,6 @@
method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void {}
method g1<generic-covariant-impl U extends self::C::T* = self::C::T*>() → void {
this.{self::C::f}<self::C::g1::U*>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'double' can't be assigned to the parameter type 'U'.
-Try changing the type of the parameter, or casting the argument to 'U'.
this.f<U>(1.5);
^" in 1.5 as{TypeError} <BottomType>);
}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
index d90577e..e262b07 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
@@ -3,7 +3,6 @@
// Problems in library:
//
// pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'double' can't be assigned to the parameter type 'U'.
-// Try changing the type of the parameter, or casting the argument to 'U'.
// this.f<U>(1.5);
// ^
//
@@ -23,7 +22,6 @@
method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void {}
method g1<generic-covariant-impl U extends self::C::T* = self::C::T*>() → void {
this.{self::C::f}<self::C::g1::U*>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart:11:15: Error: The argument type 'double' can't be assigned to the parameter type 'U'.
-Try changing the type of the parameter, or casting the argument to 'U'.
this.f<U>(1.5);
^" in 1.5 as{TypeError} <BottomType>);
}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
index 8d3508c..1a716ef 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
@@ -3,12 +3,10 @@
// Problems in library:
//
// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:46: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
// d.value /*@ checkReturn=(num*) ->* num* */ += 1;
// ^
//
// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:48: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
// d.value /*@ checkReturn=(num*) ->* num* */ += 1;
// ^
//
@@ -55,14 +53,12 @@
static method main() → void {
self::D* d = new self::D::•(new self::C::•<core::num*>(#C1));
let final self::D* #t1 = d in #t1.{self::D::value} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:46: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
-Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
d.value /*@ checkReturn=(num*) ->* num* */ += 1;
^" in (#t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
self::expect(d.{self::D::setValue}(0), 1);
d = new self::D::•(new self::C::•<core::num*>(#C2));
self::expectTypeError(() → core::Null? {
let final self::D* #t3 = d in #t3.{self::D::value} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:48: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
-Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
d.value /*@ checkReturn=(num*) ->* num* */ += 1;
^" in (#t3.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
});
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
index 8d3508c..1a716ef 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
@@ -3,12 +3,10 @@
// Problems in library:
//
// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:46: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
// d.value /*@ checkReturn=(num*) ->* num* */ += 1;
// ^
//
// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:48: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
// d.value /*@ checkReturn=(num*) ->* num* */ += 1;
// ^
//
@@ -55,14 +53,12 @@
static method main() → void {
self::D* d = new self::D::•(new self::C::•<core::num*>(#C1));
let final self::D* #t1 = d in #t1.{self::D::value} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:46: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
-Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
d.value /*@ checkReturn=(num*) ->* num* */ += 1;
^" in (#t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
self::expect(d.{self::D::setValue}(0), 1);
d = new self::D::•(new self::C::•<core::num*>(#C2));
self::expectTypeError(() → core::Null? {
let final self::D* #t3 = d in #t3.{self::D::value} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:48: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
-Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
d.value /*@ checkReturn=(num*) ->* num* */ += 1;
^" in (#t3.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
});
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
index 26a02ad..d3b1e07 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
@@ -4,25 +4,21 @@
//
// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:54: Error: The argument type 'B<num>' can't be assigned to the parameter type 'B<void Function(num)>'.
// - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-// Try changing the type of the parameter, or casting the argument to 'B<void Function(num)>'.
// c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
// ^
//
// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:62: Error: The argument type 'B<num>' can't be assigned to the parameter type 'B<void Function(num)>'.
// - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-// Try changing the type of the parameter, or casting the argument to 'B<void Function(num)>'.
// var y = c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
// ^
//
// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:55: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
// - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
// c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
// ^
//
// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:63: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
// - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
// var z = c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
// ^
//
@@ -48,22 +44,18 @@
static method test(self::C<core::num*>* c) → void {
let final self::C<core::num*>* #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x} as{TypeError} self::B<(core::num*) →* void>*).{self::B::+}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:54: Error: The argument type 'B<num>' can't be assigned to the parameter type 'B<void Function(num)>'.
- 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-Try changing the type of the parameter, or casting the argument to 'B<void Function(num)>'.
c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>*);
self::B<(core::num*) →* void>* y = let final self::C<core::num*>* #t3 = c in #t3.{self::C::x} = (#t3.{self::C::x} as{TypeError} self::B<(core::num*) →* void>*).{self::B::+}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:62: Error: The argument type 'B<num>' can't be assigned to the parameter type 'B<void Function(num)>'.
- 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-Try changing the type of the parameter, or casting the argument to 'B<void Function(num)>'.
var y = c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>*);
let final self::C<core::num*>* #t5 = c in (#t5.{self::C::x} as{TypeError} self::B<(core::num*) →* void>*).{core::Object::==}(null) ?{self::B<core::Object*>*} #t5.{self::C::x} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:55: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
- 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>* : null;
self::B<core::Object*>* z = let final self::C<core::num*>* #t7 = c in let final self::B<(core::num*) →* void>* #t8 = #t7.{self::C::x} as{TypeError} self::B<(core::num*) →* void>* in #t8.{core::Object::==}(null) ?{self::B<core::Object*>*} #t7.{self::C::x} = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:63: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
- 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
var z = c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>* : #t8;
}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
index 26a02ad..d3b1e07 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
@@ -4,25 +4,21 @@
//
// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:54: Error: The argument type 'B<num>' can't be assigned to the parameter type 'B<void Function(num)>'.
// - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-// Try changing the type of the parameter, or casting the argument to 'B<void Function(num)>'.
// c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
// ^
//
// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:62: Error: The argument type 'B<num>' can't be assigned to the parameter type 'B<void Function(num)>'.
// - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-// Try changing the type of the parameter, or casting the argument to 'B<void Function(num)>'.
// var y = c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
// ^
//
// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:55: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
// - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
// c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
// ^
//
// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:63: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
// - 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
// var z = c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
// ^
//
@@ -48,22 +44,18 @@
static method test(self::C<core::num*>* c) → void {
let final self::C<core::num*>* #t1 = c in #t1.{self::C::x} = (#t1.{self::C::x} as{TypeError} self::B<(core::num*) →* void>*).{self::B::+}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:54: Error: The argument type 'B<num>' can't be assigned to the parameter type 'B<void Function(num)>'.
- 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-Try changing the type of the parameter, or casting the argument to 'B<void Function(num)>'.
c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>*);
self::B<(core::num*) →* void>* y = let final self::C<core::num*>* #t3 = c in #t3.{self::C::x} = (#t3.{self::C::x} as{TypeError} self::B<(core::num*) →* void>*).{self::B::+}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:62: Error: The argument type 'B<num>' can't be assigned to the parameter type 'B<void Function(num)>'.
- 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-Try changing the type of the parameter, or casting the argument to 'B<void Function(num)>'.
var y = c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>*);
let final self::C<core::num*>* #t5 = c in (#t5.{self::C::x} as{TypeError} self::B<(core::num*) →* void>*).{core::Object::==}(null) ?{self::B<core::Object*>*} #t5.{self::C::x} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:55: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
- 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>* : null;
self::B<core::Object*>* z = let final self::C<core::num*>* #t7 = c in let final self::B<(core::num*) →* void>* #t8 = #t7.{self::C::x} as{TypeError} self::B<(core::num*) →* void>* in #t8.{core::Object::==}(null) ?{self::B<core::Object*>*} #t7.{self::C::x} = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:63: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
- 'B' is from 'pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
var z = c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>* : #t8;
}
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect
index 7a16814..486d1399 100644
--- a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect
@@ -34,7 +34,6 @@
// - 'Set' is from 'dart:core'.
// - 'FutureOr' is from 'dart:async'.
// - 'LinkedHashSet' is from 'dart:collection'.
-// Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashSet<int>>'.
// FutureOr<LinkedHashSet<int>> lhsfun2() => {};
// ^
//
@@ -42,7 +41,6 @@
// - 'Map' is from 'dart:core'.
// - 'FutureOr' is from 'dart:async'.
// - 'LinkedHashMap' is from 'dart:collection'.
-// Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashMap<int, bool>>'.
// FutureOr<LinkedHashMap<int, bool>> lhmfun2() => {};
// ^
//
@@ -112,7 +110,6 @@
- 'Set' is from 'dart:core'.
- 'FutureOr' is from 'dart:async'.
- 'LinkedHashSet' is from 'dart:collection'.
-Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashSet<int>>'.
FutureOr<LinkedHashSet<int>> lhsfun2() => {};
^" in (let final core::Set<dynamic>* #t14 = col::LinkedHashSet::•<dynamic>() in #t14) as{TypeError} asy::FutureOr<col::LinkedHashSet<core::int*>*>*;
static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*
@@ -120,6 +117,5 @@
- 'Map' is from 'dart:core'.
- 'FutureOr' is from 'dart:async'.
- 'LinkedHashMap' is from 'dart:collection'.
-Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashMap<int, bool>>'.
FutureOr<LinkedHashMap<int, bool>> lhmfun2() => {};
^" in <dynamic, dynamic>{} as{TypeError} asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*;
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
index 2dce7db..5af0f46 100644
--- a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
@@ -34,7 +34,6 @@
// - 'Set' is from 'dart:core'.
// - 'FutureOr' is from 'dart:async'.
// - 'LinkedHashSet' is from 'dart:collection'.
-// Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashSet<int>>'.
// FutureOr<LinkedHashSet<int>> lhsfun2() => {};
// ^
//
@@ -42,7 +41,6 @@
// - 'Map' is from 'dart:core'.
// - 'FutureOr' is from 'dart:async'.
// - 'LinkedHashMap' is from 'dart:collection'.
-// Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashMap<int, bool>>'.
// FutureOr<LinkedHashMap<int, bool>> lhmfun2() => {};
// ^
//
@@ -271,7 +269,6 @@
- 'Set' is from 'dart:core'.
- 'FutureOr' is from 'dart:async'.
- 'LinkedHashSet' is from 'dart:collection'.
-Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashSet<int>>'.
FutureOr<LinkedHashSet<int>> lhsfun2() => {};
^" in (let final core::Set<dynamic>* #t24 = col::LinkedHashSet::•<dynamic>() in #t24) as{TypeError} asy::FutureOr<col::LinkedHashSet<core::int*>*>*;
static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*
@@ -279,6 +276,5 @@
- 'Map' is from 'dart:core'.
- 'FutureOr' is from 'dart:async'.
- 'LinkedHashMap' is from 'dart:collection'.
-Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashMap<int, bool>>'.
FutureOr<LinkedHashMap<int, bool>> lhmfun2() => {};
^" in <dynamic, dynamic>{} as{TypeError} asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*;
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 6bafcf8..bed5b80 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -12,6 +12,7 @@
extensions/annotations: TextSerializationFailure
extensions/check_bounds: TextSerializationFailure
extensions/compounds: TextSerializationFailure
+extensions/conflict_with_object: TextSerializationFailure
extensions/conflicts: TextSerializationFailure
extensions/default_values: TextSerializationFailure
extensions/direct_instance_access: TextSerializationFailure
@@ -27,17 +28,19 @@
extensions/extension_methods: TextSerializationFailure
extensions/extension_setter: TextSerializationFailure
extensions/extension_setter_error: TypeCheckError
+extensions/generic_function_in_generic_extension: TextSerializationFailure
extensions/getter_setter_conflict: TextSerializationFailure
extensions/if_null: TextSerializationFailure
extensions/implicit_extension_inference: TextSerializationFailure
extensions/implicit_this: TextSerializationFailure
extensions/index: TextSerializationFailure
-extensions/internal_resolution: TextSerializationFailure
extensions/instance_access: TextSerializationFailure
extensions/instance_access_of_static: TextSerializationFailure
extensions/instance_members: TextSerializationFailure
extensions/instance_tearoff: TextSerializationFailure
+extensions/internal_resolution: TextSerializationFailure
extensions/invalid_explicit_access: TextSerializationFailure
+extensions/invalid_explicit_static_access: TextSerializationFailure
extensions/nested_on_types: TextSerializationFailure
extensions/null_aware: TextSerializationFailure
extensions/on_function_type: TextSerializationFailure
@@ -158,6 +161,7 @@
general/function_type_recovery: TextSerializationFailure # Was: Pass
general/functions: TextSerializationFailure # Was: Pass
general/future_or_test: TextSerializationFailure # Was: Pass
+general/generic_function_type_in_message: TextSerializationFailure
general/having_part_with_part_and_annotation: TextSerializationFailure
general/having_part_with_parts_and_annotation: TextSerializationFailure
general/hello: TextSerializationFailure # Was: Pass
@@ -857,10 +861,12 @@
nested_variance_test: TextSerializationFailure
new_const_insertion/simple: TextSerializationFailure # Was: Pass
nnbd/function_types: TextSerializationFailure
+nnbd/intersection_types: TextSerializationFailure
nnbd/late: TextSerializationFailure
nnbd/null_check: TextSerializationFailure
nnbd/nullable_param: TextSerializationFailure
nnbd/required: TextSerializationFailure
+nnbd/substitution_in_inference: TextSerializationFailure
nnbd/type_parameter_types: TextSerializationFailure
no_such_method_forwarders/abstract_accessors_from_field: TextSerializationFailure # Was: Pass
no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in: TextSerializationFailure # Was: Pass
@@ -1045,6 +1051,7 @@
regress/issue_36669: TextSerializationFailure
regress/issue_36793: TextSerializationFailure
regress/issue_37285: TextSerializationFailure
+regress/issue_37681: TextSerializationFailure
runtime_checks/call_kinds: TextSerializationFailure # Was: Pass
runtime_checks/call_kinds_get: TextSerializationFailure # Was: Pass
runtime_checks/call_kinds_set: TextSerializationFailure # Was: Pass
@@ -1118,6 +1125,6 @@
runtime_checks_new/stub_from_interface_covariant_from_interface: TextSerializationFailure # Was: Pass
runtime_checks_new/stub_from_interface_covariant_from_super: TextSerializationFailure # Was: Pass
set_literals/disambiguation_rule: TextSerializationFailure # Was: RuntimeError
+top_level_variance_test: TextSerializationFailure
variance/class_type_parameter_modifier: TextSerializationFailure
variance/mixin_type_parameter_modifier: TextSerializationFailure
-top_level_variance_test: TextSerializationFailure
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index d8a353e..333a741 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -353,7 +353,7 @@
type ExtensionMemberDescriptor {
StringReference name;
ExtensionMemberKind kind;
- Byte flags (isStatic, isExternal);
+ Byte flags (isStatic);
MemberReference member;
}
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index cd777e3..49f81a9 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1350,7 +1350,6 @@
/// Information about an member declaration in an extension.
class ExtensionMemberDescriptor {
static const int FlagStatic = 1 << 0; // Must match serialized bit positions.
- static const int FlagExternal = 1 << 1;
/// The name of the extension member.
///
@@ -1387,28 +1386,16 @@
Reference member;
ExtensionMemberDescriptor(
- {this.name,
- this.kind,
- bool isStatic: false,
- bool isExternal: false,
- this.member}) {
+ {this.name, this.kind, bool isStatic: false, this.member}) {
this.isStatic = isStatic;
- this.isExternal = isExternal;
}
/// Return `true` if the extension method was declared as `static`.
bool get isStatic => flags & FlagStatic != 0;
- /// Return `true` if the extension method was declared as `external`.
- bool get isExternal => flags & FlagExternal != 0;
-
void set isStatic(bool value) {
flags = value ? (flags | FlagStatic) : (flags & ~FlagStatic);
}
-
- void set isExternal(bool value) {
- flags = value ? (flags | FlagExternal) : (flags & ~FlagExternal);
- }
}
// ------------------------------------------------------------------------
@@ -5411,6 +5398,12 @@
/// If this is a typedef type, unfolds its type definition once, otherwise
/// returns the type itself.
DartType get unaliasOnce => this;
+
+ /// Creates a copy of the type with the given [nullability] if possible.
+ ///
+ /// Some types have fixed nullabilities, such as `dynamic`, `invalid-type`,
+ /// `void`, or `bottom`.
+ DartType withNullability(Nullability nullability);
}
/// The type arising from invalid type annotations.
@@ -5430,6 +5423,8 @@
bool operator ==(Object other) => other is InvalidType;
Nullability get nullability => throw "InvalidType doesn't have nullability";
+
+ InvalidType withNullability(Nullability nullability) => this;
}
class DynamicType extends DartType {
@@ -5445,6 +5440,8 @@
bool operator ==(Object other) => other is DynamicType;
Nullability get nullability => Nullability.nullable;
+
+ DynamicType withNullability(Nullability nullability) => this;
}
class VoidType extends DartType {
@@ -5460,6 +5457,8 @@
bool operator ==(Object other) => other is VoidType;
Nullability get nullability => Nullability.nullable;
+
+ VoidType withNullability(Nullability nullability) => this;
}
class BottomType extends DartType {
@@ -5475,6 +5474,8 @@
bool operator ==(Object other) => other is BottomType;
Nullability get nullability => Nullability.nonNullable;
+
+ BottomType withNullability(Nullability nullability) => this;
}
class InterfaceType extends DartType {
@@ -5537,6 +5538,12 @@
}
return hash;
}
+
+ InterfaceType withNullability(Nullability nullability) {
+ return nullability == this.nullability
+ ? this
+ : new InterfaceType.byReference(className, typeArguments, nullability);
+ }
}
/// A possibly generic function type.
@@ -5668,6 +5675,18 @@
}
return hash;
}
+
+ FunctionType withNullability(Nullability nullability) {
+ if (nullability == this.nullability) return this;
+ FunctionType result = FunctionType(positionalParameters, returnType,
+ namedParameters: namedParameters,
+ typeParameters: typeParameters,
+ nullability: nullability,
+ requiredParameterCount: requiredParameterCount,
+ typedefType: typedefType?.withNullability(nullability));
+ if (typeParameters.isEmpty) return result;
+ return getFreshTypeParameters(typeParameters).applyToFunctionType(result);
+ }
}
/// A use of a [Typedef] as a type.
@@ -5699,7 +5718,9 @@
}
DartType get unaliasOnce {
- return Substitution.fromTypedefType(this).substituteType(typedefNode.type);
+ return Substitution.fromTypedefType(this)
+ .substituteType(typedefNode.type)
+ .withNullability(nullability);
}
DartType get unalias {
@@ -5728,6 +5749,13 @@
}
return hash;
}
+
+ TypedefType withNullability(Nullability nullability) {
+ return nullability == this.nullability
+ ? this
+ : new TypedefType.byReference(
+ typedefReference, typeArguments, nullability);
+ }
}
/// A named parameter in [FunctionType].
@@ -5842,6 +5870,19 @@
promotedBound);
}
+ /// Gets a new [TypeParameterType] with given [typeParameterTypeNullability].
+ ///
+ /// In contrast with other types, [TypeParameterType.withNullability] doesn't
+ /// set the overall nullability of the returned type but sets that of the
+ /// left-hand side of the intersection type. In case [promotedBound] is null,
+ /// it is an equivalent of setting the overall nullability.
+ TypeParameterType withNullability(Nullability typeParameterTypeNullability) {
+ return typeParameterTypeNullability == this.typeParameterTypeNullability
+ ? this
+ : new TypeParameterType(
+ parameter, promotedBound, typeParameterTypeNullability);
+ }
+
/// Gets the nullability of a type-parameter type based on the bound.
///
/// This is a helper function to be used when the bound of the type parameter
@@ -6731,9 +6772,12 @@
/// or referenced from the metadata payload.
///
/// Currently due to binary format specifics Catch and MapEntry nodes
- /// can't have metadata attached to them.
+ /// can't have metadata attached to them. Also, metadata is not saved on
+ /// Block nodes inside BlockExpressions.
static bool isSupported(TreeNode node) {
- return !(node is MapEntry || node is Catch);
+ return !(node is MapEntry ||
+ node is Catch ||
+ (node is Block && node.parent is BlockExpression));
}
}
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index f717ce2..4ef7288 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -5,6 +5,7 @@
import 'dart:core' hide MapEntry;
import 'dart:convert';
+import 'dart:developer';
import 'dart:typed_data';
import '../ast.dart';
@@ -454,34 +455,36 @@
///
/// The input bytes may contain multiple files concatenated.
void readComponent(Component component, {bool checkCanonicalNames: false}) {
- _checkEmptyInput();
+ Timeline.timeSync("BinaryBuilder.readComponent", () {
+ _checkEmptyInput();
- // Check that we have a .dill file and it has the correct version before we
- // start decoding it. Otherwise we will fail for cryptic reasons.
- int offset = _byteOffset;
- int magic = readUint32();
- if (magic != Tag.ComponentFile) {
- throw ArgumentError('Not a .dill file (wrong magic number).');
- }
- int version = readUint32();
- if (version != Tag.BinaryFormatVersion) {
- throw InvalidKernelVersionError(version);
- }
- _byteOffset = offset;
- List<int> componentFileSizes = _indexComponents();
- if (componentFileSizes.length > 1) {
- _disableLazyReading = true;
- _disableLazyClassReading = true;
- }
- int componentFileIndex = 0;
- while (_byteOffset < _bytes.length) {
- _readOneComponent(component, componentFileSizes[componentFileIndex]);
- ++componentFileIndex;
- }
+ // Check that we have a .dill file and it has the correct version before we
+ // start decoding it. Otherwise we will fail for cryptic reasons.
+ int offset = _byteOffset;
+ int magic = readUint32();
+ if (magic != Tag.ComponentFile) {
+ throw ArgumentError('Not a .dill file (wrong magic number).');
+ }
+ int version = readUint32();
+ if (version != Tag.BinaryFormatVersion) {
+ throw InvalidKernelVersionError(version);
+ }
+ _byteOffset = offset;
+ List<int> componentFileSizes = _indexComponents();
+ if (componentFileSizes.length > 1) {
+ _disableLazyReading = true;
+ _disableLazyClassReading = true;
+ }
+ int componentFileIndex = 0;
+ while (_byteOffset < _bytes.length) {
+ _readOneComponent(component, componentFileSizes[componentFileIndex]);
+ ++componentFileIndex;
+ }
- if (checkCanonicalNames) {
- _checkCanonicalNameChildren(component.root);
- }
+ if (checkCanonicalNames) {
+ _checkCanonicalNameChildren(component.root);
+ }
+ });
}
/// Deserializes the source and stores it in [component].
@@ -2266,8 +2269,16 @@
/// and are awaiting to be parsed and attached to nodes.
List<_MetadataSubsection> _subsections;
- BinaryBuilderWithMetadata(bytes, [filename])
- : super(bytes, filename: filename);
+ BinaryBuilderWithMetadata(List<int> bytes,
+ {String filename,
+ bool disableLazyReading = false,
+ bool disableLazyClassReading = false,
+ bool alwaysCreateNewNamedNodes})
+ : super(bytes,
+ filename: filename,
+ disableLazyReading: disableLazyReading,
+ disableLazyClassReading: disableLazyClassReading,
+ alwaysCreateNewNamedNodes: alwaysCreateNewNamedNodes);
@override
void _readMetadataMappings(
@@ -2381,6 +2392,13 @@
}
@override
+ Extension readExtension() {
+ final nodeOffset = _byteOffset;
+ final result = super.readExtension();
+ return _associateMetadata(result, nodeOffset);
+ }
+
+ @override
Field readField() {
final nodeOffset = _byteOffset;
final result = super.readField();
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 8abfe1b..babd66e 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -5,11 +5,12 @@
import 'dart:core' hide MapEntry;
import 'dart:convert' show utf8;
+import 'dart:developer';
+import 'dart:io' show BytesBuilder;
+import 'dart:typed_data';
import '../ast.dart';
import 'tag.dart';
-import 'dart:io' show BytesBuilder;
-import 'dart:typed_data';
/// Writes to a binary file.
///
@@ -83,6 +84,7 @@
_sink.addBytes(bytes);
}
+ @pragma("vm:prefer-inline")
void writeUInt30(int value) {
assert(value >= 0 && value >> 30 == 0);
if (value < 0x80) {
@@ -539,30 +541,32 @@
}
void writeComponentFile(Component component) {
- computeCanonicalNames(component);
- final componentOffset = getBufferOffset();
- writeUInt32(Tag.ComponentFile);
- writeUInt32(Tag.BinaryFormatVersion);
- writeListOfStrings(component.problemsAsJson);
- indexLinkTable(component);
- _collectMetadata(component);
- if (_metadataSubsections != null) {
- _writeNodeMetadataImpl(component, componentOffset);
- }
- libraryOffsets = <int>[];
- CanonicalName main = getCanonicalNameOfMember(component.mainMethod);
- if (main != null) {
- checkCanonicalName(main);
- }
- writeLibraries(component);
- writeUriToSource(component.uriToSource);
- writeLinkTable(component);
- _writeMetadataSection(component);
- writeStringTable(stringIndexer);
- writeConstantTable(_constantIndexer);
- writeComponentIndex(component, component.libraries);
+ Timeline.timeSync("BinaryPrinter.writeComponentFile", () {
+ computeCanonicalNames(component);
+ final componentOffset = getBufferOffset();
+ writeUInt32(Tag.ComponentFile);
+ writeUInt32(Tag.BinaryFormatVersion);
+ writeListOfStrings(component.problemsAsJson);
+ indexLinkTable(component);
+ _collectMetadata(component);
+ if (_metadataSubsections != null) {
+ _writeNodeMetadataImpl(component, componentOffset);
+ }
+ libraryOffsets = <int>[];
+ CanonicalName main = getCanonicalNameOfMember(component.mainMethod);
+ if (main != null) {
+ checkCanonicalName(main);
+ }
+ writeLibraries(component);
+ writeUriToSource(component.uriToSource);
+ writeLinkTable(component);
+ _writeMetadataSection(component);
+ writeStringTable(stringIndexer);
+ writeConstantTable(_constantIndexer);
+ writeComponentIndex(component, component.libraries);
- _flush();
+ _flush();
+ });
}
void writeListOfStrings(List<String> strings) {
@@ -2605,6 +2609,7 @@
_doubleBufferUint8[6], _doubleBufferUint8[7]);
}
+ @pragma("vm:prefer-inline")
void addByte(int byte) {
_buffer[length++] = byte;
if (length == SIZE) {
@@ -2615,6 +2620,7 @@
}
}
+ @pragma("vm:prefer-inline")
void addByte2(int byte1, int byte2) {
if (length < SAFE_SIZE) {
_buffer[length++] = byte1;
@@ -2625,6 +2631,7 @@
}
}
+ @pragma("vm:prefer-inline")
void addByte4(int byte1, int byte2, int byte3, int byte4) {
if (length < SAFE_SIZE) {
_buffer[length++] = byte1;
diff --git a/pkg/kernel/lib/naive_type_checker.dart b/pkg/kernel/lib/naive_type_checker.dart
index 0e31d92..27985e7 100644
--- a/pkg/kernel/lib/naive_type_checker.dart
+++ b/pkg/kernel/lib/naive_type_checker.dart
@@ -7,6 +7,7 @@
import 'kernel.dart';
import 'type_checker.dart' as type_checker;
import 'type_algebra.dart';
+import 'type_environment.dart';
abstract class FailureListener {
void reportFailure(TreeNode node, String message);
@@ -90,7 +91,8 @@
} else {
final DartType ownType = getterType(host, ownMember);
final DartType superType = getterType(host, superMember);
- if (!environment.isSubtypeOf(ownType, superType)) {
+ if (!environment.isSubtypeOf(
+ ownType, superType, SubtypeCheckMode.ignoringNullabilities)) {
return failures.reportInvalidOverride(ownMember, superMember, '''
${ownType} is not a subtype of ${superType}
''');
@@ -106,8 +108,8 @@
/// Check if [subtype] is subtype of [supertype] after applying
/// type parameter [substitution].
- bool _isSubtypeOf(DartType subtype, DartType supertype) =>
- environment.isSubtypeOf(subtype, supertype);
+ bool _isSubtypeOf(DartType subtype, DartType supertype) => environment
+ .isSubtypeOf(subtype, supertype, SubtypeCheckMode.ignoringNullabilities);
Substitution _makeSubstitutionForMember(Class host, Member member) {
final hostType =
@@ -232,8 +234,10 @@
void checkAssignable(TreeNode where, DartType from, DartType to) {
// Note: we permit implicit downcasts.
if (from != to &&
- !environment.isSubtypeOf(from, to) &&
- !environment.isSubtypeOf(to, from)) {
+ !environment.isSubtypeOf(
+ from, to, SubtypeCheckMode.ignoringNullabilities) &&
+ !environment.isSubtypeOf(
+ to, from, SubtypeCheckMode.ignoringNullabilities)) {
failures.reportNotAssignable(where, from, to);
}
}
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index 1e59288..363f5e7 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -20,7 +20,7 @@
import '../type_algebra.dart' show Substitution, substitute;
-import '../type_environment.dart' show TypeEnvironment;
+import '../type_environment.dart' show SubtypeCheckMode, TypeEnvironment;
import '../util/graph.dart' show Graph, computeStrongComponents;
@@ -275,7 +275,9 @@
result ??= <TypeArgumentIssue>[];
result.add(new TypeArgumentIssue(argument, variables[i], type));
} else if (!typeEnvironment.isSubtypeOf(
- argument, substitute(variables[i].bound, substitutionMap))) {
+ argument,
+ substitute(variables[i].bound, substitutionMap),
+ SubtypeCheckMode.ignoringNullabilities)) {
result ??= <TypeArgumentIssue>[];
result.add(new TypeArgumentIssue(argument, variables[i], type));
}
@@ -321,7 +323,9 @@
result
.add(new TypeArgumentIssue(argumentsToReport[i], variables[i], type));
} else if (!typeEnvironment.isSubtypeOf(
- argument, substitute(variables[i].bound, substitutionMap))) {
+ argument,
+ substitute(variables[i].bound, substitutionMap),
+ SubtypeCheckMode.ignoringNullabilities)) {
result ??= <TypeArgumentIssue>[];
result
.add(new TypeArgumentIssue(argumentsToReport[i], variables[i], type));
@@ -361,7 +365,9 @@
result ??= <TypeArgumentIssue>[];
result.add(new TypeArgumentIssue(argument, parameters[i], null));
} else if (!typeEnvironment.isSubtypeOf(
- argument, substitute(parameters[i].bound, substitutionMap))) {
+ argument,
+ substitute(parameters[i].bound, substitutionMap),
+ SubtypeCheckMode.ignoringNullabilities)) {
result ??= <TypeArgumentIssue>[];
result.add(new TypeArgumentIssue(argument, parameters[i], null));
}
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 707b3a1..d3a9b1a 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1189,7 +1189,6 @@
++indentation;
node.members.forEach((ExtensionMemberDescriptor descriptor) {
writeIndentation();
- writeModifier(descriptor.isExternal, 'external');
writeModifier(descriptor.isStatic, 'static');
switch (descriptor.kind) {
case ExtensionMemberKind.Method:
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index cfd4617..cb25f2c 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -76,6 +76,12 @@
return new _OccurrenceVisitor(variables).visit(type);
}
+/// Returns `true` if [type] contains any free type variables, that is, type
+/// variable for function types whose function type is part of [type].
+bool containsFreeFunctionTypeVariables(DartType type) {
+ return new _FreeFunctionTypeVariableVisitor().visit(type);
+}
+
/// Given a set of type variables, finds a substitution of those variables such
/// that the two given types becomes equal, or returns `null` if no such
/// substitution exists.
@@ -146,7 +152,8 @@
typeParameters: freshTypeParameters,
requiredParameterCount: type.requiredParameterCount,
typedefType:
- type.typedefType == null ? null : substitute(type.typedefType));
+ type.typedefType == null ? null : substitute(type.typedefType),
+ nullability: type.nullability);
DartType substitute(DartType type) => substitution.substituteType(type);
@@ -440,7 +447,7 @@
int before = useCounter;
var typeArguments = node.typeArguments.map(visit).toList();
if (useCounter == before) return node;
- return new InterfaceType(node.classNode, typeArguments);
+ return new InterfaceType(node.classNode, typeArguments, node.nullability);
}
DartType visitTypedefType(TypedefType node) {
@@ -448,7 +455,7 @@
int before = useCounter;
var typeArguments = node.typeArguments.map(visit).toList();
if (useCounter == before) return node;
- return new TypedefType(node.typedefNode, typeArguments);
+ return new TypedefType(node.typedefNode, typeArguments, node.nullability);
}
List<TypeParameter> freshTypeParameters(List<TypeParameter> parameters) {
@@ -470,6 +477,13 @@
// any uses, but does not tell if the resulting function type is distinct.
// Our own use counter will get incremented if something from our
// environment has been used inside the function.
+ assert(
+ node.typeParameters.every((TypeParameter parameter) =>
+ lookup(parameter, true) == null &&
+ lookup(parameter, false) == null),
+ "Function type variables cannot be substituted while still attached "
+ "to the function. Perform substitution on "
+ "`FunctionType.withoutTypeParameters` instead.");
var inner = node.typeParameters.isEmpty ? this : newInnerEnvironment();
int before = this.useCounter;
// Invert the variance when translating parameters.
@@ -490,7 +504,8 @@
namedParameters: namedParameters,
typeParameters: typeParameters,
requiredParameterCount: node.requiredParameterCount,
- typedefType: typedefType);
+ typedefType: typedefType,
+ nullability: node.nullability);
}
void bumpCountersUntil(_TypeSubstitutor target) {
@@ -505,7 +520,7 @@
DartType getSubstitute(TypeParameter variable) {
var environment = this;
while (environment != null) {
- var replacement = environment.lookup(variable, covariantContext);
+ DartType replacement = environment.lookup(variable, covariantContext);
if (replacement != null) {
bumpCountersUntil(environment);
return replacement;
@@ -515,8 +530,59 @@
return null;
}
+ /// Combines nullabilities of types during type substitution.
+ ///
+ /// In a type substitution, for example, when `int` is substituted for `T` in
+ /// `List<T?>`, the nullability of the occurrence of the type parameter should
+ /// be combined with the nullability of the type that is being substituted for
+ /// that type parameter. In the example above it's the nullability of `T?`
+ /// and `int`. The function computes the nullability for the replacement as
+ /// per the following table:
+ ///
+ /// | arg \ var | ! | ? | * | % |
+ /// |-----------|-----|-----|-----|-----|
+ /// | ! | ! | ? | * | ! |
+ /// | ? | N/A | ? | ? | ? |
+ /// | * | * | ? | * | * |
+ /// | % | N/A | ? | * | % |
+ ///
+ /// Here `!` denotes `Nullability.nonNullable`, `?` denotes
+ /// `Nullability.nullable`, `*` denotes `Nullability.legacy`, and `%` denotes
+ /// `Nullability.neither`. The table elements marked with N/A denote the
+ /// cases that should yield a type error before the substitution is performed.
+ static Nullability combineNullabilitiesForSubstitution(
+ Nullability a, Nullability b) {
+ // In the table above we may extend the function given by it, replacing N/A
+ // with whatever is easier to implement. In this implementation, we extend
+ // the table function as follows:
+ //
+ // | arg \ var | ! | ? | * | % |
+ // |-----------|-----|-----|-----|-----|
+ // | ! | ! | ? | * | ! |
+ // | ? | ? | ? | ? | ? |
+ // | * | * | ? | * | * |
+ // | % | % | ? | * | % |
+ //
+
+ if (a == Nullability.nullable || b == Nullability.nullable) {
+ return Nullability.nullable;
+ }
+
+ if (a == Nullability.legacy || b == Nullability.legacy) {
+ return Nullability.legacy;
+ }
+
+ return a;
+ }
+
DartType visitTypeParameterType(TypeParameterType node) {
- return getSubstitute(node.parameter) ?? node;
+ DartType replacement = getSubstitute(node.parameter);
+ if (replacement is InvalidType) return replacement;
+ if (replacement != null) {
+ return replacement.withNullability(combineNullabilitiesForSubstitution(
+ replacement.nullability, node.nullability));
+ }
+ return node;
}
}
@@ -713,7 +779,7 @@
}
}
-class _OccurrenceVisitor extends DartTypeVisitor<bool> {
+class _OccurrenceVisitor implements DartTypeVisitor<bool> {
final Set<TypeParameter> variables;
_OccurrenceVisitor(this.variables);
@@ -724,6 +790,11 @@
return visit(node.type);
}
+ bool defaultDartType(DartType node) {
+ throw new UnsupportedError("Unsupported type $node (${node.runtimeType}.");
+ }
+
+ bool visitBottomType(BottomType node) => false;
bool visitInvalidType(InvalidType node) => false;
bool visitDynamicType(DynamicType node) => false;
bool visitVoidType(VoidType node) => false;
@@ -754,3 +825,53 @@
return node.defaultType.accept(this);
}
}
+
+class _FreeFunctionTypeVariableVisitor implements DartTypeVisitor<bool> {
+ final Set<TypeParameter> variables = new Set<TypeParameter>();
+
+ _FreeFunctionTypeVariableVisitor();
+
+ bool visit(DartType node) => node.accept(this);
+
+ bool defaultDartType(DartType node) {
+ throw new UnsupportedError("Unsupported type $node (${node.runtimeType}.");
+ }
+
+ bool visitNamedType(NamedType node) {
+ return visit(node.type);
+ }
+
+ bool visitBottomType(BottomType node) => false;
+ bool visitInvalidType(InvalidType node) => false;
+ bool visitDynamicType(DynamicType node) => false;
+ bool visitVoidType(VoidType node) => false;
+
+ bool visitInterfaceType(InterfaceType node) {
+ return node.typeArguments.any(visit);
+ }
+
+ bool visitTypedefType(TypedefType node) {
+ return node.typeArguments.any(visit);
+ }
+
+ bool visitFunctionType(FunctionType node) {
+ variables.addAll(node.typeParameters);
+ bool result = node.typeParameters.any(handleTypeParameter) ||
+ node.positionalParameters.any(visit) ||
+ node.namedParameters.any(visitNamedType) ||
+ visit(node.returnType);
+ variables.removeAll(node.typeParameters);
+ return result;
+ }
+
+ bool visitTypeParameterType(TypeParameterType node) {
+ return node.parameter.parent == null && !variables.contains(node.parameter);
+ }
+
+ bool handleTypeParameter(TypeParameter node) {
+ assert(variables.contains(node));
+ if (node.bound.accept(this)) return true;
+ if (node.defaultType == null) return false;
+ return node.defaultType.accept(this);
+ }
+}
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index 31518fa..b6cfaa3 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -142,6 +142,51 @@
}
}
+/// The value enum for internal states of [IsSubtypeOf].
+enum _IsSubtypeOfValues {
+ always,
+ onlyIfIgnoringNullabilities,
+ never,
+}
+
+/// Result of a nullability-aware subtype check.
+///
+/// It is assumed that if a subtype check succeeds for two types in full-NNBD
+/// mode, it also succeeds for those two types if the nullability markers on the
+/// types and all of their sub-terms are ignored (that is, in the pre-NNBD
+/// mode). By contraposition, if a subtype check fails for two types when the
+/// nullability markers are ignored, it should also fail for those types in
+/// full-NNBD mode.
+class IsSubtypeOf {
+ final _IsSubtypeOfValues _value;
+
+ /// Subtype check succeeds in both modes.
+ const IsSubtypeOf.always() : _value = _IsSubtypeOfValues.always;
+
+ /// Subtype check succeeds only if the nullability markers are ignored.
+ ///
+ /// This implies that if the nullability markers aren't ignored, the subtype
+ /// check fails.
+ const IsSubtypeOf.onlyIfIgnoringNullabilities()
+ : _value = _IsSubtypeOfValues.onlyIfIgnoringNullabilities;
+
+ /// Subtype check fails in both modes.
+ const IsSubtypeOf.never() : _value = _IsSubtypeOfValues.never;
+
+ bool isSubtypeWhenIgnoringNullabilities() {
+ return _value != _IsSubtypeOfValues.never;
+ }
+
+ bool isSubtypeWhenUsingNullabilities() {
+ return _value == _IsSubtypeOfValues.always;
+ }
+}
+
+enum SubtypeCheckMode {
+ withNullabilities,
+ ignoringNullabilities,
+}
+
/// The part of [TypeEnvironment] that deals with subtype tests.
///
/// This lives in a separate class so it can be tested independently of the SDK.
@@ -178,16 +223,36 @@
}
/// Returns true if [subtype] is a subtype of [supertype].
- bool isSubtypeOf(DartType subtype, DartType supertype) {
+ bool isSubtypeOf(
+ DartType subtype, DartType supertype, SubtypeCheckMode mode) {
+ IsSubtypeOf result =
+ performNullabilityAwareSubtypeCheck(subtype, supertype);
+ switch (mode) {
+ case SubtypeCheckMode.ignoringNullabilities:
+ return result.isSubtypeWhenIgnoringNullabilities();
+ case SubtypeCheckMode.withNullabilities:
+ return result.isSubtypeWhenUsingNullabilities();
+ default:
+ throw new StateError("Unhandled subtype checking mode '$mode'");
+ }
+ }
+
+ /// Performs a nullability-aware subtype check.
+ ///
+ /// The outcome is described in the comments to [IsSubtypeOf].
+ IsSubtypeOf performNullabilityAwareSubtypeCheck(
+ DartType subtype, DartType supertype) {
subtype = subtype.unalias;
supertype = supertype.unalias;
- if (identical(subtype, supertype)) return true;
- if (subtype is BottomType) return true;
+ if (identical(subtype, supertype)) return const IsSubtypeOf.always();
+ if (subtype is BottomType) return const IsSubtypeOf.always();
if (subtype == nullType) {
// See rule 4 of the subtype rules from the Dart Language Specification.
- return supertype is! BottomType;
+ return supertype is BottomType
+ ? const IsSubtypeOf.never()
+ : const IsSubtypeOf.always();
}
- if (isTop(supertype)) return true;
+ if (isTop(supertype)) return const IsSubtypeOf.always();
// Handle FutureOr<T> union type.
if (subtype is InterfaceType &&
@@ -197,14 +262,18 @@
identical(supertype.classNode, futureOrClass)) {
var supertypeArg = supertype.typeArguments[0];
// FutureOr<A> <: FutureOr<B> iff A <: B
- return isSubtypeOf(subtypeArg, supertypeArg);
+ return performNullabilityAwareSubtypeCheck(subtypeArg, supertypeArg);
}
// given t1 is Future<A> | A, then:
// (Future<A> | A) <: t2 iff Future<A> <: t2 and A <: t2.
var subtypeFuture = futureType(subtypeArg);
- return isSubtypeOf(subtypeFuture, supertype) &&
- isSubtypeOf(subtypeArg, supertype);
+ return performNullabilityAwareSubtypeCheck(subtypeFuture, supertype)
+ .isSubtypeWhenIgnoringNullabilities() &&
+ performNullabilityAwareSubtypeCheck(subtypeArg, supertype)
+ .isSubtypeWhenIgnoringNullabilities()
+ ? const IsSubtypeOf.always()
+ : const IsSubtypeOf.never();
}
if (supertype is InterfaceType &&
@@ -213,58 +282,67 @@
// t1 <: (Future<A> | A) iff t1 <: Future<A> or t1 <: A
var supertypeArg = supertype.typeArguments[0];
var supertypeFuture = futureType(supertypeArg);
- return isSubtypeOf(subtype, supertypeFuture) ||
- isSubtypeOf(subtype, supertypeArg);
+ return performNullabilityAwareSubtypeCheck(subtype, supertypeFuture)
+ .isSubtypeWhenIgnoringNullabilities() ||
+ performNullabilityAwareSubtypeCheck(subtype, supertypeArg)
+ .isSubtypeWhenIgnoringNullabilities()
+ ? const IsSubtypeOf.always()
+ : const IsSubtypeOf.never();
}
if (subtype is InterfaceType && supertype is InterfaceType) {
var upcastType = getTypeAsInstanceOf(subtype, supertype.classNode);
- if (upcastType == null) return false;
+ if (upcastType == null) return const IsSubtypeOf.never();
for (int i = 0; i < upcastType.typeArguments.length; ++i) {
// Termination: the 'supertype' parameter decreases in size.
- if (!isSubtypeOf(
- upcastType.typeArguments[i], supertype.typeArguments[i])) {
- return false;
+ if (!performNullabilityAwareSubtypeCheck(
+ upcastType.typeArguments[i], supertype.typeArguments[i])
+ .isSubtypeWhenIgnoringNullabilities()) {
+ return const IsSubtypeOf.never();
}
}
- return true;
+ return const IsSubtypeOf.always();
}
if (subtype is TypeParameterType) {
if (supertype is TypeParameterType &&
subtype.parameter == supertype.parameter) {
if (supertype.promotedBound != null) {
- return isSubtypeOf(subtype.bound, supertype.bound);
+ return performNullabilityAwareSubtypeCheck(
+ subtype.bound, supertype.bound);
} else {
// Promoted bound should always be a subtype of the declared bound.
assert(subtype.promotedBound == null ||
- isSubtypeOf(subtype.bound, supertype.bound));
- return true;
+ performNullabilityAwareSubtypeCheck(
+ subtype.bound, supertype.bound)
+ .isSubtypeWhenIgnoringNullabilities());
+ return const IsSubtypeOf.always();
}
}
// Termination: if there are no cyclically bound type parameters, this
// recursive call can only occur a finite number of times, before reaching
// a shrinking recursive call (or terminating).
- return isSubtypeOf(subtype.bound, supertype);
+ return performNullabilityAwareSubtypeCheck(subtype.bound, supertype);
}
if (subtype is FunctionType) {
- if (supertype == functionLegacyRawType) return true;
+ if (supertype == functionLegacyRawType) return const IsSubtypeOf.always();
if (supertype is FunctionType) {
- return _isFunctionSubtypeOf(subtype, supertype);
+ return _performNullabilityAwareFunctionSubtypeCheck(subtype, supertype);
}
}
- return false;
+ return const IsSubtypeOf.never();
}
- bool _isFunctionSubtypeOf(FunctionType subtype, FunctionType supertype) {
+ IsSubtypeOf _performNullabilityAwareFunctionSubtypeCheck(
+ FunctionType subtype, FunctionType supertype) {
if (subtype.requiredParameterCount > supertype.requiredParameterCount) {
- return false;
+ return const IsSubtypeOf.never();
}
if (subtype.positionalParameters.length <
supertype.positionalParameters.length) {
- return false;
+ return const IsSubtypeOf.never();
}
if (subtype.typeParameters.length != supertype.typeParameters.length) {
- return false;
+ return const IsSubtypeOf.never();
}
if (subtype.typeParameters.isNotEmpty) {
var substitution = <TypeParameter, DartType>{};
@@ -281,22 +359,28 @@
// recursive call can only occur a finite number of times before
// reaching a shrinking recursive call (or terminating).
// TODO(dmitryas): Replace it with one recursive descent instead of two.
- if (!isSubtypeOf(superParameter.bound, subBound) ||
- !isSubtypeOf(subBound, superParameter.bound)) {
- return false;
+ if (!performNullabilityAwareSubtypeCheck(superParameter.bound, subBound)
+ .isSubtypeWhenIgnoringNullabilities() ||
+ !performNullabilityAwareSubtypeCheck(subBound, superParameter.bound)
+ .isSubtypeWhenIgnoringNullabilities()) {
+ return const IsSubtypeOf.never();
}
}
subtype = substitute(subtype.withoutTypeParameters, substitution);
}
- if (!isSubtypeOf(subtype.returnType, supertype.returnType)) {
- return false;
+ if (!performNullabilityAwareSubtypeCheck(
+ subtype.returnType, supertype.returnType)
+ .isSubtypeWhenIgnoringNullabilities()) {
+ return const IsSubtypeOf.never();
}
for (int i = 0; i < supertype.positionalParameters.length; ++i) {
var supertypeParameter = supertype.positionalParameters[i];
var subtypeParameter = subtype.positionalParameters[i];
// Termination: Both types shrink in size.
- if (!isSubtypeOf(supertypeParameter, subtypeParameter)) {
- return false;
+ if (!performNullabilityAwareSubtypeCheck(
+ supertypeParameter, subtypeParameter)
+ .isSubtypeWhenIgnoringNullabilities()) {
+ return const IsSubtypeOf.never();
}
}
int subtypeNameIndex = 0;
@@ -306,13 +390,17 @@
supertypeParameter.name) {
++subtypeNameIndex;
}
- if (subtypeNameIndex == subtype.namedParameters.length) return false;
+ if (subtypeNameIndex == subtype.namedParameters.length) {
+ return const IsSubtypeOf.never();
+ }
NamedType subtypeParameter = subtype.namedParameters[subtypeNameIndex];
// Termination: Both types shrink in size.
- if (!isSubtypeOf(supertypeParameter.type, subtypeParameter.type)) {
- return false;
+ if (!performNullabilityAwareSubtypeCheck(
+ supertypeParameter.type, subtypeParameter.type)
+ .isSubtypeWhenIgnoringNullabilities()) {
+ return const IsSubtypeOf.never();
}
}
- return true;
+ return const IsSubtypeOf.always();
}
}
diff --git a/pkg/kernel/test/load_concat_dill_keeps_source_test.dart b/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
new file mode 100644
index 0000000..3226148
--- /dev/null
+++ b/pkg/kernel/test/load_concat_dill_keeps_source_test.dart
@@ -0,0 +1,100 @@
+// Copyright (c) 2019, 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.
+
+// Test that 79cc54e51924cd5a6bdc2bd1771f2d0ee7af8899 works as intended.
+
+import 'dart:convert';
+
+import 'package:kernel/binary/ast_from_binary.dart';
+import 'package:kernel/binary/ast_to_binary.dart';
+import 'package:kernel/kernel.dart';
+
+Uri uri1 = Uri.parse("foo://lib1.dart");
+Uri uri2 = Uri.parse("foo://lib2.dart");
+
+main() {
+ Library library1 = new Library(uri1)..fileUri = uri1;
+ Library library2 = new Library(uri2)..fileUri = uri2;
+ Procedure p1 = new Procedure(new Name("p1"), ProcedureKind.Method,
+ new FunctionNode(new ReturnStatement()))
+ ..fileUri = uri2;
+ Procedure p2 = new Procedure(new Name("p2"), ProcedureKind.Method,
+ new FunctionNode(new ReturnStatement()))
+ ..fileUri = uri1;
+ library1.addMember(p1);
+ library2.addMember(p2);
+
+ Component component = new Component(libraries: [library1, library2]);
+ component.uriToSource[uri1] = new Source(
+ [42, 2 * 42], const Utf8Encoder().convert("source #1"), uri1, uri1);
+ component.uriToSource[uri2] = new Source(
+ [43, 3 * 43], const Utf8Encoder().convert("source #2"), uri1, uri1);
+ expectSource(serialize(component), true, true);
+
+ Component cPartial1 = new Component(nameRoot: component.root)
+ ..libraries.add(library1);
+ cPartial1.uriToSource[uri1] = new Source(
+ [42, 2 * 42], const Utf8Encoder().convert("source #1"), uri1, uri1);
+ cPartial1.uriToSource[uri2] =
+ new Source([43, 3 * 43], const <int>[], uri1, uri1);
+ List<int> partial1Serialized = serialize(cPartial1);
+ expectSource(partial1Serialized, true, false);
+
+ Component cPartial2 = new Component(nameRoot: component.root)
+ ..libraries.add(library2);
+ cPartial2.uriToSource[uri1] =
+ new Source([42, 2 * 42], const <int>[], uri1, uri1);
+ cPartial2.uriToSource[uri2] = new Source(
+ [43, 3 * 43], const Utf8Encoder().convert("source #2"), uri1, uri1);
+ List<int> partial2Serialized = serialize(cPartial2);
+ expectSource(partial2Serialized, false, true);
+
+ List<int> combined = new List<int>();
+ combined.addAll(partial1Serialized);
+ combined.addAll(partial2Serialized);
+ expectSource(combined, true, true);
+}
+
+void expectSource(List<int> data, bool expect1, bool expect2) {
+ BinaryBuilder builder = new BinaryBuilder(data);
+ Component tmp = new Component();
+ builder.readComponent(tmp);
+ if (tmp.uriToSource[uri1] == null) throw "No data for $uri1";
+ if (tmp.uriToSource[uri2] == null) throw "No data for $uri2";
+ if (expect1 && tmp.uriToSource[uri1].source.isEmpty) {
+ throw "No data for $uri1";
+ }
+ if (!expect1 && tmp.uriToSource[uri1].source.isNotEmpty) {
+ throw "Unexpected data for $uri1";
+ }
+ if (expect2 && tmp.uriToSource[uri2].source.isEmpty) {
+ throw "No data data for $uri2";
+ }
+ if (!expect2 && tmp.uriToSource[uri2].source.isNotEmpty) {
+ throw "Unexpected data for $uri2";
+ }
+}
+
+List<int> serialize(Component c) {
+ SimpleSink sink = new SimpleSink();
+ BinaryPrinter printerWhole = new BinaryPrinter(sink);
+ printerWhole.writeComponentFile(c);
+ List<int> result = new List<int>();
+ for (List<int> chunk in sink.chunks) {
+ result.addAll(chunk);
+ }
+ return result;
+}
+
+class SimpleSink implements Sink<List<int>> {
+ final List<List<int>> chunks = <List<int>>[];
+
+ @override
+ void add(List<int> chunk) {
+ chunks.add(chunk);
+ }
+
+ @override
+ void close() {}
+}
diff --git a/pkg/nnbd_migration/lib/instrumentation.dart b/pkg/nnbd_migration/lib/instrumentation.dart
index 7689928..7b52b3c 100644
--- a/pkg/nnbd_migration/lib/instrumentation.dart
+++ b/pkg/nnbd_migration/lib/instrumentation.dart
@@ -70,6 +70,11 @@
/// - Its [destinationNode] is nullable.
bool get isSatisfied;
+ /// Indicates whether all the upstream nodes of this edge are nullable (and
+ /// thus downstream nullability propagation should try to make the destination
+ /// node nullable, if possible).
+ bool get isTriggered;
+
/// A boolean indicating whether the graph edge is a "union" edge. Union
/// edges are edges for which the nullability propagation algorithm tries to
/// ensure that both the [sourceNode] and the [destinationNode] have the
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
new file mode 100644
index 0000000..272fe5d
--- /dev/null
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -0,0 +1,254 @@
+// Copyright (c) 2019, 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:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/element/type_provider.dart';
+import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:front_end/src/fasta/flow_analysis/flow_analysis.dart';
+import 'package:meta/meta.dart';
+import 'package:nnbd_migration/src/decorated_class_hierarchy.dart';
+import 'package:nnbd_migration/src/variables.dart';
+
+/// This class visits the AST of code being migrated, after graph propagation,
+/// to figure out what changes need to be made to the code. It doesn't actually
+/// make the changes; it simply reports what changes are necessary through
+/// abstract methods.
+abstract class FixBuilder extends GeneralizingAstVisitor<DartType> {
+ /// The decorated class hierarchy for this migration run.
+ final DecoratedClassHierarchy _decoratedClassHierarchy;
+
+ /// Type provider providing non-nullable types.
+ final TypeProvider _typeProvider;
+
+ /// The type system.
+ final TypeSystem _typeSystem;
+
+ /// Variables for this migration run.
+ final Variables _variables;
+
+ /// If we are visiting a function body or initializer, instance of flow
+ /// analysis. Otherwise `null`.
+ FlowAnalysis<Statement, Expression, PromotableElement, DartType>
+ _flowAnalysis;
+
+ /// If we are visiting a function body or initializer, assigned variable
+ /// information used in flow analysis. Otherwise `null`.
+ AssignedVariables<AstNode, VariableElement> _assignedVariables;
+
+ /// If we are visiting a subexpression, the context type used for type
+ /// inference. This is used to determine when `!` needs to be inserted.
+ DartType _contextType;
+
+ FixBuilder(this._decoratedClassHierarchy, TypeProvider typeProvider,
+ this._typeSystem, this._variables)
+ : _typeProvider = (typeProvider as TypeProviderImpl)
+ .withNullability(NullabilitySuffix.none);
+
+ /// Called whenever an expression is found for which a `!` needs to be
+ /// inserted.
+ void addNullCheck(Expression subexpression);
+
+ /// Initializes flow analysis for a function node.
+ void createFlowAnalysis(AstNode node) {
+ assert(_flowAnalysis == null);
+ assert(_assignedVariables == null);
+ _flowAnalysis =
+ FlowAnalysis<Statement, Expression, PromotableElement, DartType>(
+ const AnalyzerNodeOperations(),
+ TypeSystemTypeOperations(_typeSystem),
+ AnalyzerFunctionBodyAccess(node is FunctionBody ? node : null));
+ _assignedVariables = FlowAnalysisHelper.computeAssignedVariables(node);
+ }
+
+ @override
+ DartType visitBinaryExpression(BinaryExpression node) {
+ var leftOperand = node.leftOperand;
+ var rightOperand = node.rightOperand;
+ var operatorType = node.operator.type;
+ var staticElement = node.staticElement;
+ switch (operatorType) {
+ case TokenType.BANG_EQ:
+ case TokenType.EQ_EQ:
+ visitSubexpression(leftOperand, _typeProvider.dynamicType);
+ visitSubexpression(rightOperand, _typeProvider.dynamicType);
+ if (leftOperand is SimpleIdentifier && rightOperand is NullLiteral) {
+ var leftElement = leftOperand.staticElement;
+ if (leftElement is PromotableElement) {
+ _flowAnalysis.conditionEqNull(node, leftElement,
+ notEqual: operatorType == TokenType.BANG_EQ);
+ }
+ }
+ return _typeProvider.boolType;
+ case TokenType.AMPERSAND_AMPERSAND:
+ case TokenType.BAR_BAR:
+ var isAnd = operatorType == TokenType.AMPERSAND_AMPERSAND;
+ visitSubexpression(leftOperand, _typeProvider.boolType);
+ _flowAnalysis.logicalBinaryOp_rightBegin(leftOperand, isAnd: isAnd);
+ visitSubexpression(rightOperand, _typeProvider.boolType);
+ _flowAnalysis.logicalBinaryOp_end(node, rightOperand, isAnd: isAnd);
+ return _typeProvider.boolType;
+ case TokenType.QUESTION_QUESTION:
+ // If `a ?? b` is used in a non-nullable context, we don't want to
+ // migrate it to `(a ?? b)!`. We want to migrate it to `a ?? b!`.
+ // TODO(paulberry): once flow analysis supports `??`, integrate it here.
+ var leftType = visitSubexpression(node.leftOperand,
+ _typeSystem.makeNullable(_contextType as TypeImpl));
+ var rightType = visitSubexpression(node.rightOperand, _contextType);
+ return _typeSystem.leastUpperBound(
+ _typeSystem.promoteToNonNull(leftType as TypeImpl), rightType);
+ default:
+ var targetType =
+ visitSubexpression(leftOperand, _typeProvider.objectType);
+ DartType contextType;
+ DartType returnType;
+ if (staticElement == null) {
+ contextType = _typeProvider.dynamicType;
+ returnType = _typeProvider.dynamicType;
+ } else {
+ var methodType =
+ _computeMigratedType(staticElement, targetType: targetType)
+ as FunctionType;
+ contextType = methodType.parameters[0].type;
+ returnType = methodType.returnType;
+ }
+ visitSubexpression(rightOperand, contextType);
+ return _fixNumericTypes(returnType, node.staticType);
+ }
+ }
+
+ @override
+ DartType visitExpression(Expression node) {
+ // Every expression type needs its own visit method.
+ throw UnimplementedError('No visit method for ${node.runtimeType}');
+ }
+
+ @override
+ DartType visitLiteral(Literal node) {
+ if (node is AdjacentStrings) {
+ // TODO(paulberry): need to visit interpolations
+ throw UnimplementedError('TODO(paulberry)');
+ }
+ if (node is TypedLiteral) {
+ throw UnimplementedError('TODO(paulberry)');
+ }
+ return (node.staticType as TypeImpl)
+ .withNullability(NullabilitySuffix.none);
+ }
+
+ @override
+ DartType visitParenthesizedExpression(ParenthesizedExpression node) {
+ return node.expression.accept(this);
+ }
+
+ @override
+ DartType visitSimpleIdentifier(SimpleIdentifier node) {
+ var element = node.staticElement;
+ if (element == null) return _typeProvider.dynamicType;
+ if (element is PromotableElement) {
+ var promotedType = _flowAnalysis.promotedType(element);
+ if (promotedType != null) return promotedType;
+ }
+ return _computeMigratedType(element);
+ }
+
+ /// Recursively visits a subexpression, providing a context type.
+ DartType visitSubexpression(Expression subexpression, DartType contextType) {
+ var oldContextType = _contextType;
+ try {
+ _contextType = contextType;
+ var type = subexpression.accept(this);
+ if (_doesAssignmentNeedCheck(from: type, to: contextType)) {
+ addNullCheck(subexpression);
+ return _typeSystem.promoteToNonNull(type as TypeImpl);
+ } else {
+ return type;
+ }
+ } finally {
+ _contextType = oldContextType;
+ }
+ }
+
+ /// Computes the type that [element] will have after migration.
+ ///
+ /// If [targetType] is present, and [element] is a class member, it is the
+ /// type of the class within which [element] is being accessed; this is used
+ /// to perform the correct substitutions.
+ DartType _computeMigratedType(Element element, {DartType targetType}) {
+ Element baseElement;
+ if (element is Member) {
+ assert(targetType != null);
+ baseElement = element.baseElement;
+ } else {
+ baseElement = element;
+ }
+ DartType type;
+ if (baseElement is ClassElement || baseElement is TypeParameterElement) {
+ return _typeProvider.typeType;
+ } else if (baseElement is PropertyAccessorElement) {
+ if (baseElement.isSynthetic) {
+ type = _variables
+ .decoratedElementType(baseElement.variable)
+ .toFinalType(_typeProvider);
+ } else {
+ var functionType = _variables.decoratedElementType(baseElement);
+ var decoratedType = baseElement.isGetter
+ ? functionType.returnType
+ : throw UnimplementedError('TODO(paulberry)');
+ type = decoratedType.toFinalType(_typeProvider);
+ }
+ } else {
+ type = _variables
+ .decoratedElementType(baseElement)
+ .toFinalType(_typeProvider);
+ }
+ if (targetType is InterfaceType && targetType.typeArguments.isNotEmpty) {
+ var superclass = baseElement.enclosingElement as ClassElement;
+ var class_ = targetType.element;
+ if (class_ != superclass) {
+ var supertype = _decoratedClassHierarchy
+ .getDecoratedSupertype(class_, superclass)
+ .toFinalType(_typeProvider) as InterfaceType;
+ type = Substitution.fromInterfaceType(supertype).substituteType(type);
+ }
+ return substitute(type, {
+ for (int i = 0; i < targetType.typeArguments.length; i++)
+ class_.typeParameters[i]: targetType.typeArguments[i]
+ });
+ } else {
+ return type;
+ }
+ }
+
+ /// Determines whether a null check is needed when assigning a value of type
+ /// [from] to a context of type [to].
+ bool _doesAssignmentNeedCheck(
+ {@required DartType from, @required DartType to}) {
+ return !from.isDynamic &&
+ _typeSystem.isNullable(from) &&
+ !_typeSystem.isNullable(to);
+ }
+
+ /// Determines whether a `num` type originating from a call to a
+ /// user-definable operator needs to be changed to `int`. [type] is the type
+ /// determined by naive operator lookup; [originalType] is the type that was
+ /// determined by the analyzer's full resolution algorithm when analyzing the
+ /// pre-migrated code.
+ DartType _fixNumericTypes(DartType type, DartType originalType) {
+ if (type.isDartCoreNum && originalType.isDartCoreInt) {
+ return (originalType as TypeImpl)
+ .withNullability((type as TypeImpl).nullabilitySuffix);
+ } else {
+ return type;
+ }
+ }
+}
diff --git a/pkg/nnbd_migration/lib/src/nullability_node.dart b/pkg/nnbd_migration/lib/src/nullability_node.dart
index 3c057df..0711d42 100644
--- a/pkg/nnbd_migration/lib/src/nullability_node.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_node.dart
@@ -34,26 +34,24 @@
@override
bool get isSatisfied {
- if (!_isTriggered) return true;
+ if (!isTriggered) return true;
return destinationNode.isNullable;
}
@override
+ bool get isTriggered {
+ for (var upstreamNode in upstreamNodes) {
+ if (!upstreamNode.isNullable) return false;
+ }
+ return true;
+ }
+
+ @override
bool get isUnion => _kind == _NullabilityEdgeKind.union;
@override
NullabilityNode get sourceNode => upstreamNodes.first;
- /// Indicates whether all the upstream nodes of this edge are nullable (and
- /// thus downstream nullability propagation should try to make the destination
- /// node nullable, if possible).
- bool get _isTriggered {
- for (var upstreamNode in upstreamNodes) {
- if (!upstreamNode.isNullable) return false;
- }
- return true;
- }
-
@override
String toString() {
var edgeDecorations = <Object>[];
@@ -249,7 +247,7 @@
while (true) {
while (_pendingEdges.isNotEmpty) {
var edge = _pendingEdges.removeLast();
- if (!edge._isTriggered) continue;
+ if (!edge.isTriggered) continue;
var node = edge.destinationNode;
if (node._state == NullabilityState.nonNullable) {
// The node has already been marked as non-nullable, so the edge can't
diff --git a/pkg/nnbd_migration/test/fix_builder_test.dart b/pkg/nnbd_migration/test/fix_builder_test.dart
new file mode 100644
index 0000000..820f271
--- /dev/null
+++ b/pkg/nnbd_migration/test/fix_builder_test.dart
@@ -0,0 +1,369 @@
+// Copyright (c) 2019, 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:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/nullability_suffix.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_provider.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/type_system.dart';
+import 'package:nnbd_migration/src/decorated_class_hierarchy.dart';
+import 'package:nnbd_migration/src/fix_builder.dart';
+import 'package:nnbd_migration/src/variables.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'migration_visitor_test_base.dart';
+
+main() {
+ defineReflectiveSuite(() {
+ defineReflectiveTests(FixBuilderTest);
+ });
+}
+
+@reflectiveTest
+class FixBuilderTest extends EdgeBuilderTestBase {
+ DartType get dynamicType => postMigrationTypeProvider.dynamicType;
+
+ DartType get objectType => postMigrationTypeProvider.objectType;
+
+ TypeProvider get postMigrationTypeProvider =>
+ (typeProvider as TypeProviderImpl)
+ .withNullability(NullabilitySuffix.none);
+
+ @override
+ Future<CompilationUnit> analyze(String code) async {
+ var unit = await super.analyze(code);
+ graph.propagate();
+ return unit;
+ }
+
+ test_binaryExpression_ampersand_ampersand() async {
+ await analyze('''
+_f(bool x, bool y) => x && y;
+''');
+ visitSubexpression(findNode.binary('&&'), 'bool');
+ }
+
+ test_binaryExpression_ampersand_ampersand_flow() async {
+ await analyze('''
+_f(bool/*?*/ x) => x != null && x;
+''');
+ visitSubexpression(findNode.binary('&&'), 'bool');
+ }
+
+ test_binaryExpression_ampersand_ampersand_nullChecked() async {
+ await analyze('''
+_f(bool/*?*/ x, bool/*?*/ y) => x && y;
+''');
+ var xRef = findNode.simple('x &&');
+ var yRef = findNode.simple('y;');
+ visitSubexpression(findNode.binary('&&'), 'bool',
+ nullChecked: {xRef, yRef});
+ }
+
+ test_binaryExpression_bang_eq() async {
+ await analyze('''
+_f(Object/*?*/ x, Object/*?*/ y) => x != y;
+''');
+ visitSubexpression(findNode.binary('!='), 'bool');
+ }
+
+ test_binaryExpression_bar_bar() async {
+ await analyze('''
+_f(bool x, bool y) {
+ return x || y;
+}
+''');
+ visitSubexpression(findNode.binary('||'), 'bool');
+ }
+
+ test_binaryExpression_bar_bar_flow() async {
+ await analyze('''
+_f(bool/*?*/ x) {
+ return x == null || x;
+}
+''');
+ visitSubexpression(findNode.binary('||'), 'bool');
+ }
+
+ test_binaryExpression_bar_bar_nullChecked() async {
+ await analyze('''
+_f(Object/*?*/ x, Object/*?*/ y) {
+ return x || y;
+}
+''');
+ var xRef = findNode.simple('x ||');
+ var yRef = findNode.simple('y;');
+ visitSubexpression(findNode.binary('||'), 'bool',
+ nullChecked: {xRef, yRef});
+ }
+
+ test_binaryExpression_eq_eq() async {
+ await analyze('''
+_f(Object/*?*/ x, Object/*?*/ y) {
+ return x == y;
+}
+''');
+ visitSubexpression(findNode.binary('=='), 'bool');
+ }
+
+ test_binaryExpression_question_question() async {
+ await analyze('''
+_f(int/*?*/ x, double/*?*/ y) {
+ return x ?? y;
+}
+''');
+ visitSubexpression(findNode.binary('??'), 'num?');
+ }
+
+ test_binaryExpression_question_question_nullChecked() async {
+ await analyze('''
+Object/*!*/ _f(int/*?*/ x, double/*?*/ y) {
+ return x ?? y;
+}
+''');
+ var yRef = findNode.simple('y;');
+ visitSubexpression(findNode.binary('??'), 'num',
+ contextType: objectType, nullChecked: {yRef});
+ }
+
+ test_binaryExpression_userDefinable_dynamic() async {
+ await analyze('''
+Object/*!*/ _f(dynamic d, int/*?*/ i) => d + i;
+''');
+ visitSubexpression(findNode.binary('+'), 'dynamic',
+ contextType: objectType);
+ }
+
+ test_binaryExpression_userDefinable_intRules() async {
+ await analyze('''
+_f(int i, int j) => i + j;
+''');
+ visitSubexpression(findNode.binary('+'), 'int');
+ }
+
+ test_binaryExpression_userDefinable_simple() async {
+ await analyze('''
+class _C {
+ int operator+(String s) => 1;
+}
+_f(_C c) => c + 'foo';
+''');
+ visitSubexpression(findNode.binary('c +'), 'int');
+ }
+
+ test_binaryExpression_userDefinable_simple_check_lhs() async {
+ await analyze('''
+class _C {
+ int operator+(String s) => 1;
+}
+_f(_C/*?*/ c) => c + 'foo';
+''');
+ visitSubexpression(findNode.binary('c +'), 'int',
+ nullChecked: {findNode.simple('c +')});
+ }
+
+ test_binaryExpression_userDefinable_simple_check_rhs() async {
+ await analyze('''
+class _C {
+ int operator+(String/*!*/ s) => 1;
+}
+_f(_C c, String/*?*/ s) => c + s;
+''');
+ visitSubexpression(findNode.binary('c +'), 'int',
+ nullChecked: {findNode.simple('s;')});
+ }
+
+ test_binaryExpression_userDefinable_substituted() async {
+ await analyze('''
+class _C<T, U> {
+ T operator+(U u) => throw 'foo';
+}
+_f(_C<int, String> c) => c + 'foo';
+''');
+ visitSubexpression(findNode.binary('c +'), 'int');
+ }
+
+ test_binaryExpression_userDefinable_substituted_check_rhs() async {
+ await analyze('''
+class _C<T, U> {
+ T operator+(U u) => throw 'foo';
+}
+_f(_C<int, String/*!*/> c, String/*?*/ s) => c + s;
+''');
+ visitSubexpression(findNode.binary('c +'), 'int',
+ nullChecked: {findNode.simple('s;')});
+ }
+
+ test_binaryExpression_userDefinable_substituted_no_check_rhs() async {
+ await analyze('''
+class _C<T, U> {
+ T operator+(U u) => throw 'foo';
+}
+_f(_C<int, String/*?*/> c, String/*?*/ s) => c + s;
+''');
+ visitSubexpression(findNode.binary('c +'), 'int');
+ }
+
+ test_booleanLiteral() async {
+ await analyze('''
+f() => true;
+''');
+ visitSubexpression(findNode.booleanLiteral('true'), 'bool');
+ }
+
+ test_doubleLiteral() async {
+ await analyze('''
+f() => 1.0;
+''');
+ visitSubexpression(findNode.doubleLiteral('1.0'), 'double');
+ }
+
+ test_integerLiteral() async {
+ await analyze('''
+f() => 1;
+''');
+ visitSubexpression(findNode.integerLiteral('1'), 'int');
+ }
+
+ test_nullLiteral() async {
+ await analyze('''
+f() => null;
+''');
+ visitSubexpression(findNode.nullLiteral('null'), 'Null');
+ }
+
+ test_parenthesizedExpression() async {
+ await analyze('''
+f() => (1);
+''');
+ visitSubexpression(findNode.integerLiteral('1'), 'int');
+ }
+
+ test_simpleIdentifier_className() async {
+ await analyze('''
+_f() => int;
+''');
+ visitSubexpression(findNode.simple('int'), 'Type');
+ }
+
+ test_simpleIdentifier_field() async {
+ await analyze('''
+class _C {
+ int i = 1;
+ f() => i;
+}
+''');
+ visitSubexpression(findNode.simple('i;'), 'int');
+ }
+
+ test_simpleIdentifier_field_generic() async {
+ await analyze('''
+class _C<T> {
+ List<T> x = null;
+ f() => x;
+}
+''');
+ visitSubexpression(findNode.simple('x;'), 'List<T>?');
+ }
+
+ test_simpleIdentifier_field_nullable() async {
+ await analyze('''
+class _C {
+ int/*?*/ i = 1;
+ f() => i;
+}
+''');
+ visitSubexpression(findNode.simple('i;'), 'int?');
+ }
+
+ test_simpleIdentifier_getter() async {
+ await analyze('''
+class _C {
+ int get i => 1;
+ f() => i;
+}
+''');
+ visitSubexpression(findNode.simple('i;'), 'int');
+ }
+
+ test_simpleIdentifier_getter_nullable() async {
+ await analyze('''
+class _C {
+ int/*?*/ get i => 1;
+ f() => i;
+}
+''');
+ visitSubexpression(findNode.simple('i;'), 'int?');
+ }
+
+ test_simpleIdentifier_localVariable_nonNullable() async {
+ await analyze('''
+_f(int x) {
+ return x;
+}
+''');
+ visitSubexpression(findNode.simple('x;'), 'int');
+ }
+
+ test_simpleIdentifier_localVariable_nullable() async {
+ await analyze('''
+_f(int/*?*/ x) {
+ return x;
+}
+''');
+ visitSubexpression(findNode.simple('x;'), 'int?');
+ }
+
+ test_stringLiteral() async {
+ await analyze('''
+f() => 'foo';
+''');
+ visitSubexpression(findNode.stringLiteral("'foo'"), 'String');
+ }
+
+ test_symbolLiteral() async {
+ await analyze('''
+f() => #foo;
+''');
+ visitSubexpression(findNode.symbolLiteral('#foo'), 'Symbol');
+ }
+
+ test_use_of_dynamic() async {
+ // Use of `dynamic` in a context requiring non-null is not explicitly null
+ // checked.
+ await analyze('''
+bool _f(dynamic d, bool b) => d && b;
+''');
+ visitSubexpression(findNode.binary('&&'), 'bool');
+ }
+
+ void visitSubexpression(Expression node, String expectedType,
+ {DartType contextType,
+ Set<Expression> nullChecked = const <Expression>{}}) {
+ contextType ??= dynamicType;
+ var fixBuilder = _FixBuilder(
+ decoratedClassHierarchy, typeProvider, typeSystem, variables);
+ fixBuilder.createFlowAnalysis(node.thisOrAncestorOfType<FunctionBody>());
+ var type = fixBuilder.visitSubexpression(node, contextType);
+ expect((type as TypeImpl).toString(withNullability: true), expectedType);
+ expect(fixBuilder.nullCheckedExpressions, nullChecked);
+ }
+}
+
+class _FixBuilder extends FixBuilder {
+ final Set<Expression> nullCheckedExpressions = {};
+
+ _FixBuilder(DecoratedClassHierarchy decoratedClassHierarchy,
+ TypeProvider typeProvider, TypeSystem typeSystem, Variables variables)
+ : super(decoratedClassHierarchy, typeProvider, typeSystem, variables);
+
+ @override
+ void addNullCheck(Expression subexpression) {
+ var newlyAdded = nullCheckedExpressions.add(subexpression);
+ expect(newlyAdded, true);
+ }
+}
diff --git a/pkg/nnbd_migration/test/test_all.dart b/pkg/nnbd_migration/test/test_all.dart
index fed8c12..672ee30 100644
--- a/pkg/nnbd_migration/test/test_all.dart
+++ b/pkg/nnbd_migration/test/test_all.dart
@@ -12,6 +12,7 @@
import 'edge_builder_flow_analysis_test.dart'
as edge_builder_flow_analysis_test;
import 'edge_builder_test.dart' as edge_builder_test;
+import 'fix_builder_test.dart' as fix_builder_test;
import 'instrumentation_test.dart' as instrumentation_test;
import 'node_builder_test.dart' as node_builder_test;
import 'nullability_migration_impl_test.dart'
@@ -27,6 +28,7 @@
decorated_type_test.main();
edge_builder_flow_analysis_test.main();
edge_builder_test.main();
+ fix_builder_test.main();
instrumentation_test.main();
node_builder_test.main();
nullability_migration_impl_test.main();
diff --git a/pkg/vm/bin/gen_kernel.dart b/pkg/vm/bin/gen_kernel.dart
index eefe915..ed2ab26 100644
--- a/pkg/vm/bin/gen_kernel.dart
+++ b/pkg/vm/bin/gen_kernel.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
-import 'dart:io' show exit;
+import 'dart:io' as io;
import 'package:args/args.dart' show ArgParser;
import 'package:kernel/text/ast_to_text.dart'
@@ -31,7 +31,7 @@
if (arguments.isNotEmpty && arguments.last == '--batch') {
await runBatchModeCompiler();
} else {
- exit(await compile(arguments));
+ io.exitCode = await compile(arguments);
}
}
diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart
index 5926c77..f4969eb 100644
--- a/pkg/vm/lib/bytecode/assembler.dart
+++ b/pkg/vm/lib/bytecode/assembler.dart
@@ -394,6 +394,11 @@
_emitInstructionDF(Opcode.kDirectCall, rd, rf);
}
+ void emitUncheckedDirectCall(int rd, int rf) {
+ emitSourcePositionForCall();
+ _emitInstructionDF(Opcode.kUncheckedDirectCall, rd, rf);
+ }
+
void emitInterfaceCall(int rd, int rf) {
emitSourcePositionForCall();
_emitInstructionDF(Opcode.kInterfaceCall, rd, rf);
@@ -565,4 +570,9 @@
emitSourcePosition();
_emitInstructionD(Opcode.kAllocateClosure, rd);
}
+
+ void emitCheckReceiverForNull(int rd) {
+ emitSourcePosition();
+ _emitInstructionD(Opcode.kCheckReceiverForNull, rd);
+ }
}
diff --git a/pkg/vm/lib/bytecode/constant_pool.dart b/pkg/vm/lib/bytecode/constant_pool.dart
index eeee7fc..481e0c2 100644
--- a/pkg/vm/lib/bytecode/constant_pool.dart
+++ b/pkg/vm/lib/bytecode/constant_pool.dart
@@ -113,6 +113,13 @@
PackedObject argDesc;
}
+// Occupies 2 entries in the constant pool.
+type ConstantDirectCallViaDynamicForwarder extends ConstantPoolEntry {
+ Byte tag = 32;
+ PackedObject target;
+ PackedObject argDesc;
+}
+
*/
enum ConstantTag {
@@ -148,6 +155,7 @@
kInterfaceCall,
kInstantiatedInterfaceCall,
kDynamicCall,
+ kDirectCallViaDynamicForwarder,
}
String constantTagToString(ConstantTag tag) =>
@@ -204,6 +212,8 @@
return new ConstantInstantiatedInterfaceCall.read(reader);
case ConstantTag.kDynamicCall:
return new ConstantDynamicCall.read(reader);
+ case ConstantTag.kDirectCallViaDynamicForwarder:
+ return new ConstantDirectCallViaDynamicForwarder.read(reader);
// Make analyzer happy.
case ConstantTag.kUnused1:
case ConstantTag.kUnused2:
@@ -553,6 +563,41 @@
this.argDesc == other.argDesc;
}
+class ConstantDirectCallViaDynamicForwarder extends ConstantPoolEntry {
+ final ObjectHandle target;
+ final ObjectHandle argDesc;
+
+ ConstantDirectCallViaDynamicForwarder(this.target, this.argDesc);
+
+ // Reserve 1 extra slot for arguments descriptor, following target slot.
+ int get numReservedEntries => 1;
+
+ @override
+ ConstantTag get tag => ConstantTag.kDirectCallViaDynamicForwarder;
+
+ @override
+ void writeValue(BufferedWriter writer) {
+ writer.writePackedObject(target);
+ writer.writePackedObject(argDesc);
+ }
+
+ ConstantDirectCallViaDynamicForwarder.read(BufferedReader reader)
+ : target = reader.readPackedObject(),
+ argDesc = reader.readPackedObject();
+
+ @override
+ String toString() => "DirectCallViaDynamicForwarder '$target', $argDesc";
+
+ @override
+ int get hashCode => _combineHashes(target.hashCode, argDesc.hashCode);
+
+ @override
+ bool operator ==(other) =>
+ other is ConstantDirectCallViaDynamicForwarder &&
+ this.target == other.target &&
+ this.argDesc == other.argDesc;
+}
+
class ConstantInterfaceCall extends ConstantPoolEntry {
final ObjectHandle target;
final ObjectHandle argDesc;
@@ -700,12 +745,15 @@
hasReceiver: hasReceiver, isFactory: isFactory)));
int addDirectCall(
- InvocationKind invocationKind, Member target, ObjectHandle argDesc) =>
- _add(new ConstantDirectCall(
- objectTable.getMemberHandle(target,
- isGetter: invocationKind == InvocationKind.getter,
- isSetter: invocationKind == InvocationKind.setter),
- argDesc));
+ InvocationKind invocationKind, Member target, ObjectHandle argDesc,
+ [bool isDynamicForwarder = false]) {
+ final targetHandle = objectTable.getMemberHandle(target,
+ isGetter: invocationKind == InvocationKind.getter,
+ isSetter: invocationKind == InvocationKind.setter);
+ return _add(isDynamicForwarder
+ ? new ConstantDirectCallViaDynamicForwarder(targetHandle, argDesc)
+ : new ConstantDirectCall(targetHandle, argDesc));
+ }
int addInterfaceCall(
InvocationKind invocationKind, Member target, ObjectHandle argDesc) =>
@@ -772,6 +820,11 @@
int addObjectRef(Node node) =>
_add(new ConstantObjectRef(objectTable.getHandle(node)));
+ int addSelectorName(Name name, InvocationKind invocationKind) =>
+ _add(new ConstantObjectRef(objectTable.getSelectorNameHandle(name,
+ isGetter: invocationKind == InvocationKind.getter,
+ isSetter: invocationKind == InvocationKind.setter)));
+
int _add(ConstantPoolEntry entry) {
return _canonicalizationCache.putIfAbsent(entry, () {
int index = entries.length;
diff --git a/pkg/vm/lib/bytecode/dbc.dart b/pkg/vm/lib/bytecode/dbc.dart
index 790b10b6..6005219 100644
--- a/pkg/vm/lib/bytecode/dbc.dart
+++ b/pkg/vm/lib/bytecode/dbc.dart
@@ -10,7 +10,7 @@
/// Before bumping current bytecode version format, make sure that
/// all users have switched to a VM which is able to consume new
/// version of bytecode.
-const int currentBytecodeFormatVersion = 20;
+const int currentBytecodeFormatVersion = 21;
enum Opcode {
kUnusedOpcode000,
@@ -210,8 +210,8 @@
// Calls.
kDirectCall,
kDirectCall_Wide,
- kUnused21, // Reserved for DirectCall1
- kUnused22, // Reserved for DirectCall1_Wide
+ kUncheckedDirectCall,
+ kUncheckedDirectCall_Wide,
kInterfaceCall,
kInterfaceCall_Wide,
kUnused23, // Reserved for InterfaceCall1
@@ -258,8 +258,8 @@
// Null operations.
kEqualsNull,
- kUnused36, // Reserved for CheckNull
- kUnused37, // Reserved for CheckNull_Wide
+ kCheckReceiverForNull,
+ kCheckReceiverForNull_Wide,
// Int operations.
kNegateInt,
@@ -468,6 +468,8 @@
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kEqualsNull: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
+ Opcode.kCheckReceiverForNull: const Format(
+ Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
Opcode.kNegateInt: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kAddInt: const Format(
@@ -502,6 +504,8 @@
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kDirectCall: const Format(
Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
+ Opcode.kUncheckedDirectCall: const Format(
+ Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
Opcode.kAllocateClosure: const Format(
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
Opcode.kUncheckedClosureCall: const Format(
@@ -608,6 +612,7 @@
bool isCall(Opcode opcode) {
switch (opcode) {
case Opcode.kDirectCall:
+ case Opcode.kUncheckedDirectCall:
case Opcode.kInterfaceCall:
case Opcode.kInstantiatedInterfaceCall:
case Opcode.kUncheckedClosureCall:
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 5303161..9f80ff9 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -23,7 +23,8 @@
show globalDebuggingNames, NameSystem;
import 'package:kernel/type_algebra.dart'
show Substitution, containsTypeVariable;
-import 'package:kernel/type_environment.dart' show TypeEnvironment;
+import 'package:kernel/type_environment.dart'
+ show SubtypeCheckMode, TypeEnvironment;
import 'assembler.dart';
import 'bytecode_serialization.dart' show StringTable;
import 'constant_pool.dart';
@@ -53,8 +54,11 @@
import 'recursive_types_validator.dart' show IllegalRecursiveTypeException;
import 'source_positions.dart' show LineStarts, SourcePositions;
import '../metadata/bytecode.dart';
+import '../metadata/direct_call.dart'
+ show DirectCallMetadata, DirectCallMetadataRepository;
import 'dart:convert' show utf8;
+import 'dart:developer';
import 'dart:math' as math;
// This symbol is used as the name in assert assignable's to indicate it comes
@@ -69,37 +73,39 @@
CoreTypes coreTypes,
ClassHierarchy hierarchy,
}) {
- options ??= new BytecodeOptions();
- verifyBytecodeInstructionDeclarations();
- coreTypes ??= new CoreTypes(component);
- void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {}
- hierarchy ??= new ClassHierarchy(component,
- onAmbiguousSupertypes: ignoreAmbiguousSupertypes);
- final typeEnvironment = new TypeEnvironment(coreTypes, hierarchy);
- libraries ??= component.libraries;
+ Timeline.timeSync("generateBytecode", () {
+ options ??= new BytecodeOptions();
+ verifyBytecodeInstructionDeclarations();
+ coreTypes ??= new CoreTypes(component);
+ void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {}
+ hierarchy ??= new ClassHierarchy(component,
+ onAmbiguousSupertypes: ignoreAmbiguousSupertypes);
+ final typeEnvironment = new TypeEnvironment(coreTypes, hierarchy);
+ libraries ??= component.libraries;
- // Save/restore global NameSystem to avoid accumulating garbage.
- // NameSystem holds the whole AST as it is strongly connected due to
- // parent pointers. Objects are added to NameSystem when toString()
- // is called from AST nodes. Bytecode generator widely uses
- // Expression.getStaticType, which calls Expression.getStaticTypeAsInstanceOf,
- // which uses toString() when it crashes due to http://dartbug.com/34496.
- final savedGlobalDebuggingNames = globalDebuggingNames;
- globalDebuggingNames = new NameSystem();
+ // Save/restore global NameSystem to avoid accumulating garbage.
+ // NameSystem holds the whole AST as it is strongly connected due to
+ // parent pointers. Objects are added to NameSystem when toString()
+ // is called from AST nodes. Bytecode generator widely uses
+ // Expression.getStaticType, which calls Expression.getStaticTypeAsInstanceOf,
+ // which uses toString() when it crashes due to http://dartbug.com/34496.
+ final savedGlobalDebuggingNames = globalDebuggingNames;
+ globalDebuggingNames = new NameSystem();
- try {
- final bytecodeGenerator = new BytecodeGenerator(
- component, coreTypes, hierarchy, typeEnvironment, options);
- for (var library in libraries) {
- bytecodeGenerator.visitLibrary(library);
+ try {
+ final bytecodeGenerator = new BytecodeGenerator(
+ component, coreTypes, hierarchy, typeEnvironment, options);
+ for (var library in libraries) {
+ bytecodeGenerator.visitLibrary(library);
+ }
+ } on IllegalRecursiveTypeException catch (e) {
+ CompilerContext.current.options.report(
+ templateIllegalRecursiveType.withArguments(e.type).withoutLocation(),
+ Severity.error);
+ } finally {
+ globalDebuggingNames = savedGlobalDebuggingNames;
}
- } on IllegalRecursiveTypeException catch (e) {
- CompilerContext.current.options.report(
- templateIllegalRecursiveType.withArguments(e.type).withoutLocation(),
- Severity.error);
- } finally {
- globalDebuggingNames = savedGlobalDebuggingNames;
- }
+ });
}
class BytecodeGenerator extends RecursiveVisitor<Null> {
@@ -115,6 +121,7 @@
ObjectTable objectTable;
Component bytecodeComponent;
NullabilityDetector nullabilityDetector;
+ Map<TreeNode, DirectCallMetadata> directCallMetadata;
List<ClassDeclaration> classDeclarations;
List<FieldDeclaration> fieldDeclarations;
@@ -165,6 +172,9 @@
bytecodeComponent.mainLibrary =
objectTable.getHandle(component.mainMethod.enclosingLibrary);
}
+
+ directCallMetadata =
+ component.metadata[DirectCallMetadataRepository.repositoryTag]?.mapping;
}
@override
@@ -1132,21 +1142,32 @@
}
void _genDirectCall(Member target, ObjectHandle argDesc, int totalArgCount,
- {bool isGet: false, bool isSet: false, TreeNode context}) {
+ {bool isGet: false,
+ bool isSet: false,
+ bool isDynamicForwarder: false,
+ bool isUnchecked: false,
+ TreeNode context}) {
assert(!isGet || !isSet);
final kind = isGet
? InvocationKind.getter
: (isSet ? InvocationKind.setter : InvocationKind.method);
- final cpIndex = cp.addDirectCall(kind, target, argDesc);
+ final cpIndex = cp.addDirectCall(kind, target, argDesc, isDynamicForwarder);
if (totalArgCount >= argumentsLimit) {
throw new TooManyArgumentsException(context.fileOffset);
}
- asm.emitDirectCall(cpIndex, totalArgCount);
+ if (isUnchecked) {
+ asm.emitUncheckedDirectCall(cpIndex, totalArgCount);
+ } else {
+ asm.emitDirectCall(cpIndex, totalArgCount);
+ }
}
void _genDirectCallWithArgs(Member target, Arguments args,
- {bool hasReceiver: false, bool isFactory: false, TreeNode context}) {
+ {bool hasReceiver: false,
+ bool isFactory: false,
+ bool isUnchecked: false,
+ TreeNode context}) {
final argDesc = objectTable.getArgDescHandleByArguments(args,
hasReceiver: hasReceiver, isFactory: isFactory);
@@ -1160,7 +1181,8 @@
totalArgCount++;
}
- _genDirectCall(target, argDesc, totalArgCount, context: context);
+ _genDirectCall(target, argDesc, totalArgCount,
+ isUnchecked: isUnchecked, context: context);
}
void _genTypeArguments(List<DartType> typeArgs, {Class instantiatingClass}) {
@@ -1514,7 +1536,8 @@
savedMaxSourcePositions = <int>[];
maxSourcePosition = node.fileOffset;
- locals = new LocalVariables(node, options, typeEnvironment);
+ locals =
+ new LocalVariables(node, options, typeEnvironment, directCallMetadata);
locals.enterScope(node);
assert(!locals.isSyncYieldingFrame);
@@ -2140,7 +2163,9 @@
_genPushInstantiatorAndFunctionTypeArguments([type]);
asm.emitPushConstant(cp.addString(name));
bool isIntOk = typeEnvironment.isSubtypeOf(
- typeEnvironment.coreTypes.intLegacyRawType, type);
+ typeEnvironment.coreTypes.intLegacyRawType,
+ type,
+ SubtypeCheckMode.ignoringNullabilities);
int subtypeTestCacheCpIndex = cp.addSubtypeTestCache();
asm.emitAssertAssignable(isIntOk ? 1 : 0, subtypeTestCacheCpIndex);
}
@@ -3020,27 +3045,62 @@
return;
}
- _genArguments(node.receiver, args);
+ final directCall =
+ directCallMetadata != null ? directCallMetadata[node] : null;
+ if (directCall != null && directCall.checkReceiverForNull) {
+ final int receiverTemp = locals.tempIndexInFrame(node);
+ _genArguments(node.receiver, args, storeReceiverToLocal: receiverTemp);
+ asm.emitPush(receiverTemp);
+ asm.emitCheckReceiverForNull(
+ cp.addSelectorName(node.name, InvocationKind.method));
+ } else {
+ _genArguments(node.receiver, args);
+ }
Member interfaceTarget = node.interfaceTarget;
if (interfaceTarget is Field ||
interfaceTarget is Procedure && interfaceTarget.isGetter) {
// Call via field or getter. Treat it as a dynamic call because
// interface target doesn't fully represent what is being called.
+ assert(directCall == null);
interfaceTarget = null;
}
+
final argDesc =
objectTable.getArgDescHandleByArguments(args, hasReceiver: true);
- _genInstanceCall(InvocationKind.method, interfaceTarget, node.name,
- node.receiver, totalArgCount, argDesc);
+
+ if (directCall != null) {
+ final isDynamicForwarder = (interfaceTarget == null);
+ final isUnchecked =
+ isUncheckedCall(interfaceTarget, node.receiver, typeEnvironment);
+ _genDirectCall(directCall.target, argDesc, totalArgCount,
+ isDynamicForwarder: isDynamicForwarder, isUnchecked: isUnchecked);
+ } else {
+ _genInstanceCall(InvocationKind.method, interfaceTarget, node.name,
+ node.receiver, totalArgCount, argDesc);
+ }
}
@override
visitPropertyGet(PropertyGet node) {
_generateNode(node.receiver);
final argDesc = objectTable.getArgDescHandle(1);
- _genInstanceCall(InvocationKind.getter, node.interfaceTarget, node.name,
- node.receiver, 1, argDesc);
+
+ final directCall =
+ directCallMetadata != null ? directCallMetadata[node] : null;
+ if (directCall != null) {
+ if (directCall.checkReceiverForNull) {
+ final int receiverTemp = locals.tempIndexInFrame(node);
+ asm.emitStoreLocal(receiverTemp);
+ asm.emitPush(receiverTemp);
+ asm.emitCheckReceiverForNull(
+ cp.addSelectorName(node.name, InvocationKind.getter));
+ }
+ _genDirectCall(directCall.target, argDesc, 1, isGet: true);
+ } else {
+ _genInstanceCall(InvocationKind.getter, node.interfaceTarget, node.name,
+ node.receiver, 1, argDesc);
+ }
}
@override
@@ -3049,15 +3109,38 @@
final bool hasResult = !isExpressionWithoutResult(node);
_generateNode(node.receiver);
- _generateNode(node.value);
+
+ final directCall =
+ directCallMetadata != null ? directCallMetadata[node] : null;
+ if (directCall != null && directCall.checkReceiverForNull) {
+ asm.emitStoreLocal(temp);
+ _generateNode(node.value);
+ asm.emitPush(temp);
+ asm.emitCheckReceiverForNull(
+ cp.addSelectorName(node.name, InvocationKind.setter));
+ } else {
+ _generateNode(node.value);
+ }
if (hasResult) {
asm.emitStoreLocal(temp);
}
- final argDesc = objectTable.getArgDescHandle(2);
- _genInstanceCall(InvocationKind.setter, node.interfaceTarget, node.name,
- node.receiver, 2, argDesc);
+ const int numArguments = 2;
+ final argDesc = objectTable.getArgDescHandle(numArguments);
+
+ if (directCall != null) {
+ final isDynamicForwarder = (node.interfaceTarget == null);
+ final isUnchecked =
+ isUncheckedCall(node.interfaceTarget, node.receiver, typeEnvironment);
+ _genDirectCall(directCall.target, argDesc, numArguments,
+ isSet: true,
+ isDynamicForwarder: isDynamicForwarder,
+ isUnchecked: isUnchecked);
+ } else {
+ _genInstanceCall(InvocationKind.setter, node.interfaceTarget, node.name,
+ node.receiver, numArguments, argDesc);
+ }
asm.emitDrop1();
@@ -3084,7 +3167,8 @@
return;
}
_genArguments(new ThisExpression(), args);
- _genDirectCallWithArgs(target, args, hasReceiver: true, context: node);
+ _genDirectCallWithArgs(target, args,
+ hasReceiver: true, isUnchecked: true, context: node);
}
@override
@@ -3121,7 +3205,8 @@
}
assert(target is Field || (target is Procedure && target.isSetter));
- _genDirectCall(target, objectTable.getArgDescHandle(2), 2, isSet: true);
+ _genDirectCall(target, objectTable.getArgDescHandle(2), 2,
+ isSet: true, isUnchecked: true);
}
asm.emitDrop1();
@@ -3955,6 +4040,7 @@
}
final TryBlock tryBlock = _startTryBlock(node);
+ tryBlock.isSynthetic = true;
finallyBlocks[node] = <FinallyBlock>[];
_generateNode(node.body);
diff --git a/pkg/vm/lib/bytecode/local_vars.dart b/pkg/vm/lib/bytecode/local_vars.dart
index 4176254..6421694 100644
--- a/pkg/vm/lib/bytecode/local_vars.dart
+++ b/pkg/vm/lib/bytecode/local_vars.dart
@@ -14,6 +14,7 @@
import 'dbc.dart';
import 'options.dart' show BytecodeOptions;
+import '../metadata/direct_call.dart' show DirectCallMetadata;
class LocalVariables {
final Map<TreeNode, Scope> _scopes = <TreeNode, Scope>{};
@@ -30,6 +31,7 @@
<ForInStatement, VariableDeclaration>{};
final BytecodeOptions options;
final TypeEnvironment typeEnvironment;
+ final Map<TreeNode, DirectCallMetadata> directCallMetadata;
Scope _currentScope;
Frame _currentFrame;
@@ -191,7 +193,8 @@
List<VariableDeclaration> get sortedNamedParameters =>
_currentFrame.sortedNamedParameters;
- LocalVariables(Member node, this.options, this.typeEnvironment) {
+ LocalVariables(Member node, this.options, this.typeEnvironment,
+ this.directCallMetadata) {
final scopeBuilder = new _ScopeBuilder(this);
node.accept(scopeBuilder);
@@ -1210,6 +1213,11 @@
int numTemps = 0;
if (isUncheckedClosureCall(node, locals.typeEnvironment, locals.options)) {
numTemps = 1;
+ } else if (locals.directCallMetadata != null) {
+ final directCall = locals.directCallMetadata[node];
+ if (directCall != null && directCall.checkReceiverForNull) {
+ numTemps = 1;
+ }
}
_visit(node, temps: numTemps);
}
@@ -1220,6 +1228,18 @@
}
@override
+ visitPropertyGet(PropertyGet node) {
+ int numTemps = 0;
+ if (locals.directCallMetadata != null) {
+ final directCall = locals.directCallMetadata[node];
+ if (directCall != null && directCall.checkReceiverForNull) {
+ numTemps = 1;
+ }
+ }
+ _visit(node, temps: numTemps);
+ }
+
+ @override
visitDirectPropertySet(DirectPropertySet node) {
_visit(node, temps: 1);
}
diff --git a/pkg/vm/lib/bytecode/object_table.dart b/pkg/vm/lib/bytecode/object_table.dart
index 57452d0..4170bbb 100644
--- a/pkg/vm/lib/bytecode/object_table.dart
+++ b/pkg/vm/lib/bytecode/object_table.dart
@@ -1705,7 +1705,6 @@
} else {
throw "Unexpected Member's parent ${parent.runtimeType} $parent";
}
- if (member is Constructor || member is Procedure && member.isFactory) {}
final nameHandle = getNameHandle(
member.name.library, mangleMemberName(member, isGetter, isSetter));
bool isField = member is Field && !isGetter && !isSetter;
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index f215187..4329c60 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -25,6 +25,9 @@
import 'package:path/path.dart' as path;
import 'package:usage/uuid/uuid.dart';
+import 'package:vm/metadata/binary_cache.dart'
+ show BinaryCacheMetadataRepository;
+
import 'package:vm/bytecode/gen_bytecode.dart'
show generateBytecode, createFreshComponentWithBytecode;
import 'package:vm/bytecode/options.dart' show BytecodeOptions;
@@ -41,6 +44,7 @@
parseCommandLineDefines,
runWithFrontEndCompilerContext,
setVMEnvironmentDefines,
+ sortComponent,
writeDepfile;
ArgParser argParser = new ArgParser(allowTrailingOptions: true)
@@ -363,22 +367,29 @@
];
}
+ if (compilerOptions.bytecode && _initializeFromDill != null) {
+ // If we are generating bytecode, put bytecode only (not AST) in
+ // [_kernelBinaryFilename], which the user of this tool will eventually
+ // feed to Flutter engine or flutter_tester. Use a separate file to cache
+ // the AST result to initialize the incremental compiler for the next
+ // invocation of this tool.
+ _initializeFromDill += ".ast";
+ }
+
+ _compilerOptions = compilerOptions;
+ _bytecodeOptions = bytecodeOptions;
+
Component component;
Iterable<Uri> compiledSources;
if (options['incremental']) {
- _compilerOptions = compilerOptions;
- _bytecodeOptions = bytecodeOptions;
setVMEnvironmentDefines(environmentDefines, _compilerOptions);
_compilerOptions.omitPlatform = false;
_generator =
generator ?? _createGenerator(new Uri.file(_initializeFromDill));
await invalidateIfInitializingFromDill();
- component = await _runWithPrintRedirection(() async {
- final c = await _generator.compile();
- compiledSources = c.uriToSource.keys;
- return await _generateBytecodeIfNeeded(c);
- });
+ component = await _runWithPrintRedirection(() => _generator.compile());
+ compiledSources = component.uriToSource.keys;
} else {
if (options['link-platform']) {
// TODO(aam): Remove linkedDependencies once platform is directly embedded
@@ -471,28 +482,67 @@
writeDillFile(Component component, String filename,
{bool filterExternal: false}) async {
- final IOSink sink = new File(filename).openWrite();
- final BinaryPrinter printer = filterExternal
- ? new LimitedBinaryPrinter(
- sink, (lib) => !lib.isExternal, true /* excludeUriToSource */)
- : printerFactory.newBinaryPrinter(sink);
+ // Remove the cache that came either from this function or from
+ // initializing from a kernel file.
+ component.metadata.remove(BinaryCacheMetadataRepository.repositoryTag);
- component.libraries.sort((Library l1, Library l2) {
- return "${l1.fileUri}".compareTo("${l2.fileUri}");
- });
+ if (_compilerOptions.bytecode) {
+ {
+ // Generate bytecode as the output proper.
+ final IOSink sink = new File(filename).openWrite();
+ await runWithFrontEndCompilerContext(
+ _mainSource, _compilerOptions, component, () async {
+ if (_options['incremental']) {
+ await forEachPackage(component,
+ (String package, List<Library> libraries) async {
+ _writePackage(component, package, libraries, sink);
+ });
+ } else {
+ _writePackage(component, 'main', component.libraries, sink);
+ }
+ });
+ await sink.close();
+ }
- component.computeCanonicalNames();
- for (Library library in component.libraries) {
- library.additionalExports.sort((Reference r1, Reference r2) {
- return "${r1.canonicalName}".compareTo("${r2.canonicalName}");
- });
+ {
+ // Generate AST as a cache.
+ final repository = new BinaryCacheMetadataRepository();
+ component.addMetadataRepository(repository);
+ for (var lib in component.libraries) {
+ var bytes = BinaryCacheMetadataRepository.lookup(lib);
+ if (bytes != null) {
+ repository.mapping[lib] = bytes;
+ }
+ }
+
+ final IOSink sink = new File(filename + ".ast").openWrite();
+ final BinaryPrinter printer = filterExternal
+ ? new LimitedBinaryPrinter(
+ sink, (lib) => !lib.isExternal, true /* excludeUriToSource */)
+ : printerFactory.newBinaryPrinter(sink);
+
+ sortComponent(component);
+
+ printer.writeComponentFile(component);
+ await sink.close();
+ }
+ } else {
+ // Generate AST as the output proper.
+ final IOSink sink = new File(filename).openWrite();
+ final BinaryPrinter printer = filterExternal
+ ? new LimitedBinaryPrinter(
+ sink, (lib) => !lib.isExternal, true /* excludeUriToSource */)
+ : printerFactory.newBinaryPrinter(sink);
+
+ sortComponent(component);
+
+ if (unsafePackageSerialization == true) {
+ writePackagesToSinkAndTrimComponent(component, sink);
+ }
+
+ printer.writeComponentFile(component);
+ await sink.close();
}
- if (unsafePackageSerialization == true) {
- writePackagesToSinkAndTrimComponent(component, sink);
- }
-
- printer.writeComponentFile(component);
- await sink.close();
}
Future<Null> invalidateIfInitializingFromDill() async {
@@ -552,17 +602,6 @@
}
}
- bool _elementsIdentical(List a, List b) {
- if (a.length != b.length) return false;
- for (int i = 0; i < a.length; i++) {
- if (!identical(a[i], b[i])) return false;
- }
- return true;
- }
-
- final _packageLibraries = new Expando();
- final _packageBytes = new Expando();
-
void _writePackage(Component component, String package,
List<Library> libraries, IOSink sink) {
final canCache = libraries.isNotEmpty &&
@@ -571,10 +610,9 @@
package != "main";
if (canCache) {
- var cachedLibraries = _packageLibraries[libraries.first];
- if ((cachedLibraries != null) &&
- _elementsIdentical(cachedLibraries, libraries)) {
- sink.add(_packageBytes[libraries.first]);
+ var cachedBytes = BinaryCacheMetadataRepository.lookup(libraries.first);
+ if (cachedBytes != null) {
+ sink.add(cachedBytes);
return;
}
}
@@ -600,8 +638,7 @@
final bytes = byteSink.builder.takeBytes();
sink.add(bytes);
if (canCache) {
- _packageLibraries[libraries.first] = libraries;
- _packageBytes[libraries.first] = bytes;
+ BinaryCacheMetadataRepository.insert(libraries.first, bytes);
}
}
@@ -621,19 +658,7 @@
}
final compiledSources = deltaProgram.uriToSource.keys;
- if (_compilerOptions.bytecode) {
- final IOSink sink = new File(_kernelBinaryFilename).openWrite();
- await runWithFrontEndCompilerContext(
- _mainSource, _compilerOptions, deltaProgram, () async {
- await forEachPackage(deltaProgram,
- (String package, List<Library> libraries) async {
- _writePackage(deltaProgram, package, libraries, sink);
- });
- });
- await sink.close();
- } else {
- await writeDillFile(deltaProgram, _kernelBinaryFilename);
- }
+ await writeDillFile(deltaProgram, _kernelBinaryFilename);
_outputStream.writeln(boundaryKey);
await _outputDependenciesDelta(compiledSources);
diff --git a/pkg/vm/lib/incremental_compiler.dart b/pkg/vm/lib/incremental_compiler.dart
index d66c022..765991b 100644
--- a/pkg/vm/lib/incremental_compiler.dart
+++ b/pkg/vm/lib/incremental_compiler.dart
@@ -5,6 +5,7 @@
/// Defines wrapper class around incremental compiler to support
/// the flow, where incremental deltas can be rejected by VM.
import 'dart:async';
+import 'dart:developer';
import 'package:front_end/src/api_unstable/vm.dart';
import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
@@ -44,15 +45,21 @@
/// If [entryPoint] is specified, that points to new entry point for the
/// compilation. Otherwise, previously set entryPoint is used.
Future<Component> compile({Uri entryPoint}) async {
- _entryPoint = entryPoint ?? _entryPoint;
- List<Uri> entryPoints;
- if (entryPoint != null) entryPoints = [entryPoint];
- Component component = await _generator.computeDelta(
- entryPoints: entryPoints, fullComponent: fullComponent);
- initialized = true;
- fullComponent = false;
- _pendingDeltas.add(component);
- return _combinePendingDeltas(false);
+ final task = new TimelineTask();
+ try {
+ task.start("IncrementalCompiler.compile");
+ _entryPoint = entryPoint ?? _entryPoint;
+ List<Uri> entryPoints;
+ if (entryPoint != null) entryPoints = [entryPoint];
+ Component component = await _generator.computeDelta(
+ entryPoints: entryPoints, fullComponent: fullComponent);
+ initialized = true;
+ fullComponent = false;
+ _pendingDeltas.add(component);
+ return _combinePendingDeltas(false);
+ } finally {
+ task.finish();
+ }
}
_combinePendingDeltas(bool includePlatform) {
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 1a633c6..3e2bd46 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -660,10 +660,10 @@
return 'main';
}
-Future<Null> forEachPackage<T>(Component component,
- T action(String package, List<Library> libraries)) async {
- // Package sharing: make the encoding not depend on the order in which parts
- // of a package are loaded.
+/// Sort the libraries etc in the component. Helps packages to produce identical
+/// output when their parts are imported in different orders in different
+/// contexts.
+void sortComponent(Component component) {
component.libraries.sort((Library a, Library b) {
return a.importUri.toString().compareTo(b.importUri.toString());
});
@@ -673,6 +673,11 @@
return a.canonicalName.toString().compareTo(b.canonicalName.toString());
});
}
+}
+
+Future<Null> forEachPackage<T>(Component component,
+ T action(String package, List<Library> libraries)) async {
+ sortComponent(component);
final packages = new Map<String, List<Library>>();
for (Library lib in component.libraries) {
diff --git a/pkg/vm/lib/metadata/binary_cache.dart b/pkg/vm/lib/metadata/binary_cache.dart
new file mode 100644
index 0000000..e2151ef
--- /dev/null
+++ b/pkg/vm/lib/metadata/binary_cache.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2019, 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 vm.metadata.binary_cache;
+
+import 'package:kernel/ast.dart'
+ show BinarySink, BinarySource, MetadataRepository, Node, TreeNode;
+
+class BinaryCacheMetadataRepository extends MetadataRepository<List<int>> {
+ static const repositoryTag = 'vm.binary_cache';
+
+ @override
+ String get tag => repositoryTag;
+
+ @override
+ final Map<TreeNode, List<int>> mapping = <TreeNode, List<int>>{};
+
+ @override
+ void writeToBinary(List<int> metadata, Node node, BinarySink sink) {
+ sink.writeByteList(metadata);
+ }
+
+ @override
+ List<int> readFromBinary(Node node, BinarySource source) {
+ List<int> result = source.readByteList();
+ _weakMap[node] = result;
+ return result;
+ }
+
+ static List<int> lookup(Node node) => _weakMap[node];
+ static void insert(Node node, List<int> metadata) {
+ _weakMap[node] = metadata;
+ }
+
+ static final _weakMap = new Expando<List<int>>();
+}
diff --git a/pkg/vm/lib/metadata/bytecode.dart b/pkg/vm/lib/metadata/bytecode.dart
index 97e250c..15781bd 100644
--- a/pkg/vm/lib/metadata/bytecode.dart
+++ b/pkg/vm/lib/metadata/bytecode.dart
@@ -10,17 +10,23 @@
show BufferedWriter, BufferedReader, LinkWriter, LinkReader;
import '../bytecode/declarations.dart' show Component;
+import 'dart:developer';
+
class BytecodeMetadata {
final Component component;
BytecodeMetadata(this.component);
void write(BufferedWriter writer) {
- component.write(writer);
+ Timeline.timeSync("BytecodeMetadata.write", () {
+ component.write(writer);
+ });
}
factory BytecodeMetadata.read(BufferedReader reader) {
- return new BytecodeMetadata(new Component.read(reader));
+ return Timeline.timeSync("BytecodeMetadata.read", () {
+ return new BytecodeMetadata(new Component.read(reader));
+ });
}
@override
@@ -62,3 +68,32 @@
return new BytecodeMetadata(bytecodeComponent);
}
}
+
+class BinaryCacheMetadataRepository extends MetadataRepository<List<int>> {
+ static const repositoryTag = 'vm.bytecode.cache';
+
+ @override
+ String get tag => repositoryTag;
+
+ @override
+ final Map<TreeNode, List<int>> mapping = <TreeNode, List<int>>{};
+
+ @override
+ void writeToBinary(List<int> metadata, Node node, BinarySink sink) {
+ sink.writeByteList(metadata);
+ }
+
+ @override
+ List<int> readFromBinary(Node node, BinarySource source) {
+ List<int> result = source.readByteList();
+ _weakMap[node] = result;
+ return result;
+ }
+
+ static List<int> lookup(Node node) => _weakMap[node];
+ static void insert(Node node, List<int> metadata) {
+ _weakMap[node] = metadata;
+ }
+
+ static final _weakMap = new Expando<List<int>>();
+}
diff --git a/pkg/vm/lib/metadata/direct_call.dart b/pkg/vm/lib/metadata/direct_call.dart
index 9c2594e..fcb9f32 100644
--- a/pkg/vm/lib/metadata/direct_call.dart
+++ b/pkg/vm/lib/metadata/direct_call.dart
@@ -26,8 +26,10 @@
/// Repository for [DirectCallMetadata].
class DirectCallMetadataRepository
extends MetadataRepository<DirectCallMetadata> {
+ static const repositoryTag = 'vm.direct-call.metadata';
+
@override
- final String tag = 'vm.direct-call.metadata';
+ String get tag => repositoryTag;
@override
final Map<TreeNode, DirectCallMetadata> mapping =
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index eefc73c..a647eb8 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -17,6 +17,7 @@
import 'package:kernel/vm/constants_native_effects.dart'
show VmConstantsBackend;
+import '../metadata/binary_cache.dart' show BinaryCacheMetadataRepository;
import '../transformations/call_site_annotator.dart' as callSiteAnnotator;
import '../transformations/list_factory_specializer.dart'
as listFactorySpecializer;
@@ -114,6 +115,8 @@
// need to index dart:collection, as it is only needed for desugaring of
// const sets. We can remove it from this list at that time.
"dart:collection",
+ // The bytecode pipeline uses the index to check if dart:ffi is used.
+ "dart:ffi",
// TODO(askesc): This is for the VM host endian optimization, which
// could possibly be done more cleanly after the VM no longer supports
// doing constant evaluation on its own. See http://dartbug.com/32836
@@ -367,6 +370,7 @@
@override
Component configureComponent(Component component) {
callSiteAnnotator.addRepositoryTo(component);
+ component.addMetadataRepository(new BinaryCacheMetadataRepository());
return super.configureComponent(component);
}
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 0765dd5..412b135 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -20,6 +20,7 @@
import 'package:kernel/core_types.dart';
import 'package:kernel/library_index.dart' show LibraryIndex;
import 'package:kernel/target/targets.dart' show DiagnosticReporter;
+import 'package:kernel/type_environment.dart' show SubtypeCheckMode;
import 'ffi.dart';
@@ -142,7 +143,8 @@
return env.isSubtypeOf(
field.type,
InterfaceType(pointerClass,
- [InterfaceType(nativeTypesClasses[NativeType.kNativeType.index])]));
+ [InterfaceType(nativeTypesClasses[NativeType.kNativeType.index])]),
+ SubtypeCheckMode.ignoringNullabilities);
}
bool _checkFieldAnnotations(Class node) {
@@ -178,7 +180,8 @@
final DartType shouldBeDartType =
convertNativeTypeToDartType(nativeType, /*allowStructs=*/ false);
if (shouldBeDartType == null ||
- !env.isSubtypeOf(dartType, shouldBeDartType)) {
+ !env.isSubtypeOf(dartType, shouldBeDartType,
+ SubtypeCheckMode.ignoringNullabilities)) {
diagnosticReporter.report(
templateFfiTypeMismatch.withArguments(
dartType, shouldBeDartType, nativeType),
@@ -426,20 +429,13 @@
}
Iterable<NativeType> _getNativeTypeAnnotations(Field node) {
- final Iterable<NativeType> preConstant2018 = node.annotations
- .whereType<ConstructorInvocation>()
- .map((expr) => expr.target.parent)
- .map((klass) => _getFieldType(klass))
- .where((type) => type != null);
- final Iterable<NativeType> postConstant2018 = node.annotations
+ return node.annotations
.whereType<ConstantExpression>()
.map((expr) => expr.constant)
.whereType<InstanceConstant>()
.map((constant) => constant.classNode)
.map((klass) => _getFieldType(klass))
.where((type) => type != null);
- // TODO(dacoharkes): Remove preConstant2018 after constants change landed.
- return postConstant2018.followedBy(preConstant2018);
}
}
diff --git a/pkg/vm/lib/transformations/ffi_use_sites.dart b/pkg/vm/lib/transformations/ffi_use_sites.dart
index 0083c57..d3fd73b 100644
--- a/pkg/vm/lib/transformations/ffi_use_sites.dart
+++ b/pkg/vm/lib/transformations/ffi_use_sites.dart
@@ -22,6 +22,7 @@
import 'package:kernel/core_types.dart';
import 'package:kernel/library_index.dart' show LibraryIndex;
import 'package:kernel/target/targets.dart' show DiagnosticReporter;
+import 'package:kernel/type_environment.dart';
import 'ffi.dart'
show
@@ -196,7 +197,8 @@
final DartType returnType = exceptionalReturn.getStaticType(env);
- if (!env.isSubtypeOf(returnType, funcType.returnType)) {
+ if (!env.isSubtypeOf(returnType, funcType.returnType,
+ SubtypeCheckMode.ignoringNullabilities)) {
diagnosticReporter.report(
templateFfiDartTypeMismatch.withArguments(
returnType, funcType.returnType),
@@ -360,8 +362,10 @@
convertNativeTypeToDartType(containerTypeArg, allowStructs);
if (elementType == shouldBeElementType) return;
// Both subtypes and implicit downcasts are allowed statically.
- if (env.isSubtypeOf(shouldBeElementType, elementType)) return;
- if (env.isSubtypeOf(elementType, shouldBeElementType)) return;
+ if (env.isSubtypeOf(shouldBeElementType, elementType,
+ SubtypeCheckMode.ignoringNullabilities)) return;
+ if (env.isSubtypeOf(elementType, shouldBeElementType,
+ SubtypeCheckMode.ignoringNullabilities)) return;
diagnosticReporter.report(
templateFfiTypeMismatch.withArguments(
elementType, shouldBeElementType, containerTypeArg),
@@ -409,8 +413,8 @@
return false;
}
final Class nativeClass = (nativeType as InterfaceType).classNode;
- if (env.isSubtypeOf(
- InterfaceType(nativeClass), InterfaceType(pointerClass))) {
+ if (env.isSubtypeOf(InterfaceType(nativeClass), InterfaceType(pointerClass),
+ SubtypeCheckMode.ignoringNullabilities)) {
return true;
}
if (hierarchy.isSubclassOf(nativeClass, structClass)) {
diff --git a/pkg/vm/testcases/bytecode/super_calls.dart.expect b/pkg/vm/testcases/bytecode/super_calls.dart.expect
index 32781bb..7d346c0 100644
--- a/pkg/vm/testcases/bytecode/super_calls.dart.expect
+++ b/pkg/vm/testcases/bytecode/super_calls.dart.expect
@@ -123,7 +123,7 @@
Push FP[-6]
PushConstant CP#1
PushInt 2
- DirectCall CP#2, 4
+ UncheckedDirectCall CP#2, 4
ReturnTOS
}
ConstantPool {
@@ -201,7 +201,7 @@
CheckStack 0
Push FP[-5]
PushInt 3
- DirectCall CP#0, 2
+ UncheckedDirectCall CP#0, 2
Drop1
PushNull
ReturnTOS
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index 47fd310..da56542 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -579,7 +579,7 @@
ReturnTOS
}
ExceptionsTable {
- try-index 0, outer -1, start 19, end 36, handler 36, needs-stack-trace, types [CP#0]
+ try-index 0, outer -1, start 19, end 36, handler 36, needs-stack-trace, synthetic, types [CP#0]
}
ConstantPool {
[0] = Type dynamic
@@ -702,8 +702,8 @@
ReturnTOS
}
ExceptionsTable {
- try-index 0, outer -1, start 53, end 162, handler 162, needs-stack-trace, types [CP#20]
- try-index 1, outer 0, start 70, end 124, handler 124, needs-stack-trace, types [CP#20]
+ try-index 0, outer -1, start 53, end 162, handler 162, needs-stack-trace, synthetic, types [CP#20]
+ try-index 1, outer 0, start 70, end 124, handler 124, needs-stack-trace, synthetic, types [CP#20]
}
ConstantPool {
[0] = InterfaceCall 'dart:core::Object::==', ArgDesc num-args 2, num-type-args 0, names []
@@ -822,7 +822,7 @@
ReturnTOS
}
ExceptionsTable {
- try-index 0, outer -1, start 23, end 61, handler 61, needs-stack-trace, types [CP#6]
+ try-index 0, outer -1, start 23, end 61, handler 61, needs-stack-trace, synthetic, types [CP#6]
}
ConstantPool {
[0] = ClosureFunction 0
@@ -982,7 +982,7 @@
ReturnTOS
}
ExceptionsTable {
- try-index 0, outer -1, start 4, end 40, handler 40, needs-stack-trace, types [CP#3]
+ try-index 0, outer -1, start 4, end 40, handler 40, needs-stack-trace, synthetic, types [CP#3]
try-index 1, outer 0, start 4, end 14, handler 14, types [CP#3]
}
ConstantPool {
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index de2ecc3..4ab42ff 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -645,7 +645,7 @@
Push FP[-7]
Push FP[-6]
Push FP[-5]
- DirectCall CP#9, 5
+ UncheckedDirectCall CP#9, 5
ReturnTOS
}
Parameter flags: [0, 1, 2]
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index a5de560..98241e7 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,4 +1,7 @@
# Changelog
+## 2.1.1
+- Added `getLineNumberFromTokenPos` and `getColumnNumberFromTokenPos` methods
+ to `Script`.
## 2.1.0
- Added `HeapSnapshotGraph` class which parses the binary events posted to the
diff --git a/pkg/vm_service/lib/vm_service.dart b/pkg/vm_service/lib/vm_service.dart
index 5133141..0eeea9b 100644
--- a/pkg/vm_service/lib/vm_service.dart
+++ b/pkg/vm_service/lib/vm_service.dart
@@ -5456,6 +5456,9 @@
static Script parse(Map<String, dynamic> json) =>
json == null ? null : Script._fromJson(json);
+ final _tokenToLine = <int, int>{};
+ final _tokenToColumn = <int, int>{};
+
/// The uri from which this script was loaded.
String uri;
@@ -5496,6 +5499,34 @@
? null
: List<List<int>>.from(
json['tokenPosTable'].map((dynamic list) => List<int>.from(list)));
+ _parseTokenPosTable();
+ }
+
+ /// This function maps a token position to a line number.
+ /// The VM considers the first line to be line 1.
+ int getLineNumberFromTokenPos(int tokenPos) => _tokenToLine[tokenPos];
+
+ /// This function maps a token position to a column number.
+ /// The VM considers the first column to be column 1.
+ int getColumnNumberFromTokenPos(int tokenPos) => _tokenToColumn[tokenPos];
+
+ void _parseTokenPosTable() {
+ if (tokenPosTable == null) {
+ return;
+ }
+ final lineSet = Set<int>();
+ for (List line in tokenPosTable) {
+ // Each entry begins with a line number...
+ int lineNumber = line[0];
+ lineSet.add(lineNumber);
+ for (var pos = 1; pos < line.length; pos += 2) {
+ // ...and is followed by (token offset, col number) pairs.
+ final int tokenOffset = line[pos];
+ final int colNumber = line[pos + 1];
+ _tokenToLine[tokenOffset] = lineNumber;
+ _tokenToColumn[tokenOffset] = colNumber;
+ }
+ }
}
@override
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index c26a959..e570276 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -2,7 +2,7 @@
description: >-
A library to communicate with a service implementing the Dart VM
service protocol.
-version: 2.1.0
+version: 2.1.1
author: Dart Team <misc@dartlang.org>
homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
diff --git a/pkg/vm_service/test/common/service_test_common.dart b/pkg/vm_service/test/common/service_test_common.dart
index b6f32cb..e5dea67 100644
--- a/pkg/vm_service/test/common/service_test_common.dart
+++ b/pkg/vm_service/test/common/service_test_common.dart
@@ -73,7 +73,8 @@
}
}
});
- await service.streamListen(EventStreams.kDebug);
+
+ await _subscribeDebugStream(service);
// Pause may have happened before we subscribed.
final isolate = await service.getIsolate(isolateRef.id);
@@ -124,22 +125,6 @@
};
}
-int _tokenToLine(Script script, int tokenPos) {
- final table = script.tokenPosTable;
- for (List line in table) {
- // Each entry begins with a line number...
- int lineNumber = line[0];
- for (var pos = 1; pos < line.length; pos += 2) {
- // ...and is followed by (token offset, col number) pairs.
- int tokenOffset = line[pos];
- if (tokenOffset == tokenPos) {
- return lineNumber;
- }
- }
- }
- throw ArgumentError('Invalid tokenPos: $tokenPos');
-}
-
IsolateTest stoppedAtLine(int line) {
return (VmService service, IsolateRef isolateRef) async {
print("Checking we are at line $line");
@@ -155,14 +140,15 @@
final top = frames[0];
final script = await service.getObject(isolate.id, top.location.script.id);
- int actualLine = _tokenToLine(script, top.location.tokenPos);
+ int actualLine = script.getLineNumberFromTokenPos(top.location.tokenPos);
if (actualLine != line) {
print("Actual: $actualLine Line: $line");
final sb = StringBuffer();
sb.write("Expected to be at line $line but actually at line $actualLine");
sb.write("\nFull stack trace:\n");
for (Frame f in stack.frames) {
- sb.write(" $f [${_tokenToLine(script, f.location.tokenPos)}]\n");
+ sb.write(
+ " $f [${script.getLineNumberFromTokenPos(f.location.tokenPos)}]\n");
}
throw sb.toString();
} else {
@@ -189,17 +175,40 @@
return completer.future;
}
+Future<void> _subscribeDebugStream(VmService service) async {
+ try {
+ await service.streamListen(EventStreams.kDebug);
+ } catch (_) {
+ /* swallow exception */
+ }
+}
+
+Future<void> _unsubscribeDebugStream(VmService service) async {
+ try {
+ await service.streamCancel(EventStreams.kDebug);
+ } catch (_) {
+ /* swallow exception */
+ }
+}
+
Future<void> stepOver(VmService service, IsolateRef isolateRef) async {
+ await service.streamListen(EventStreams.kDebug);
+ await _subscribeDebugStream(service);
await service.resume(isolateRef.id, step: 'Over');
- return hasStoppedAtBreakpoint(service, isolateRef);
+ await hasStoppedAtBreakpoint(service, isolateRef);
+ await _unsubscribeDebugStream(service);
}
Future<void> stepInto(VmService service, IsolateRef isolateRef) async {
+ await _subscribeDebugStream(service);
await service.resume(isolateRef.id, step: 'Into');
- return hasStoppedAtBreakpoint(service, isolateRef);
+ await hasStoppedAtBreakpoint(service, isolateRef);
+ await _unsubscribeDebugStream(service);
}
Future<void> stepOut(VmService service, IsolateRef isolateRef) async {
+ await _subscribeDebugStream(service);
await service.resume(isolateRef.id, step: 'Out');
- return hasStoppedAtBreakpoint(service, isolateRef);
+ await hasStoppedAtBreakpoint(service, isolateRef);
+ await _unsubscribeDebugStream(service);
}
diff --git a/pkg/vm_service/test/common/test_helper.dart b/pkg/vm_service/test/common/test_helper.dart
index f57f3ee..f1725ba 100644
--- a/pkg/vm_service/test/common/test_helper.dart
+++ b/pkg/vm_service/test/common/test_helper.dart
@@ -255,7 +255,7 @@
var process = _ServiceTesteeLauncher();
VmService vm;
IsolateRef isolate;
- setUpAll(() async {
+ setUp(() async {
await process
.launch(pause_on_start, pause_on_exit, pause_on_unhandled_exceptions,
testeeControlsServer, useAuthToken, extraArgs)
@@ -297,9 +297,9 @@
testIndex++;
}
}
- });
+ }, retry: 3);
- tearDownAll(() {
+ tearDown(() {
print('All service tests completed successfully.');
process.requestExit();
});
diff --git a/pkg/vm_service/test/debugging_test.dart b/pkg/vm_service/test/debugging_test.dart
new file mode 100644
index 0000000..8bfefd6
--- /dev/null
+++ b/pkg/vm_service/test/debugging_test.dart
@@ -0,0 +1,231 @@
+// Copyright (c) 2019, 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:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+int counter = 0;
+
+void periodicTask(_) {
+ counter++;
+ counter++; // Line 16. We set our breakpoint here.
+ counter++;
+ if (counter % 300 == 0) {
+ print('counter = $counter');
+ }
+}
+
+void startTimer() {
+ new Timer.periodic(const Duration(milliseconds: 10), periodicTask);
+}
+
+int getLineNumberFromTokenPos(Script s, int token) =>
+ s.tokenPosTable[token].first;
+
+var tests = <IsolateTest>[
+// Pause
+ (VmService service, IsolateRef isolateRef) async {
+ Completer completer = new Completer();
+ var stream = service.onDebugEvent;
+ var subscription;
+ subscription = stream.listen((Event event) {
+ if (event.kind == EventKind.kPauseInterrupted) {
+ subscription.cancel();
+ completer.complete();
+ }
+ });
+ await service.streamListen(EventStreams.kDebug);
+ await service.pause(isolateRef.id);
+ await completer.future;
+ await service.streamCancel(EventStreams.kDebug);
+ },
+
+// Resume
+ (VmService service, IsolateRef isolate) async {
+ Completer completer = Completer();
+ var stream = service.onDebugEvent;
+ var subscription;
+ subscription = stream.listen((Event event) {
+ if (event.kind == EventKind.kResume) {
+ subscription.cancel();
+ completer.complete();
+ }
+ });
+ await service.streamListen(EventStreams.kDebug);
+ await service.resume(isolate.id);
+ await completer.future;
+ await service.streamCancel(EventStreams.kDebug);
+ },
+
+// Add breakpoint
+ (VmService service, IsolateRef isolateRef) async {
+ Isolate isolate = await service.getIsolate(isolateRef.id);
+ final Library rootLib =
+ await service.getObject(isolate.id, isolate.rootLib.id);
+
+ // Set up a listener to wait for breakpoint events.
+ Completer completer = Completer();
+ var stream = service.onDebugEvent;
+ var subscription;
+ subscription = stream.listen((Event event) {
+ if (event.kind == EventKind.kPauseBreakpoint) {
+ print('Breakpoint reached');
+ subscription.cancel();
+ completer.complete();
+ }
+ });
+ await service.streamListen(EventStreams.kDebug);
+ final script =
+ await service.getObject(isolate.id, rootLib.scripts.first.id);
+ // Add the breakpoint.
+ final Breakpoint result =
+ await service.addBreakpoint(isolate.id, script.id, 16);
+ print(result);
+ expect(result is Breakpoint, isTrue);
+ Breakpoint bpt = result;
+ expect(bpt.location.script.id, script.id);
+ expect(script.getLineNumberFromTokenPos(bpt.location.tokenPos), 16);
+
+ isolate = await service.getIsolate(isolate.id);
+ expect(isolate.breakpoints.length, 1);
+
+ await completer.future; // Wait for breakpoint events.
+ await service.streamCancel(EventStreams.kDebug);
+ },
+// We are at the breakpoint on line 16.
+ (VmService service, IsolateRef isolateRef) async {
+ final stack = await service.getStack(isolateRef.id);
+ expect(stack.frames.length, greaterThanOrEqualTo(1));
+
+ Script script = await service.getObject(
+ isolateRef.id, stack.frames[0].location.script.id);
+ expect(script.uri, endsWith('debugging_test.dart'));
+ expect(script.getLineNumberFromTokenPos(stack.frames[0].location.tokenPos),
+ 16);
+ },
+
+// Stepping
+ (VmService service, IsolateRef isolate) async {
+ // Set up a listener to wait for breakpoint events.
+ final completer = Completer();
+ var stream = service.onDebugEvent;
+ var subscription;
+ subscription = stream.listen((Event event) {
+ if (event.kind == EventKind.kPauseBreakpoint) {
+ print('Breakpoint reached');
+ subscription.cancel();
+ completer.complete();
+ }
+ });
+ print('performing step over');
+ await stepOver(service, isolate);
+ print('step over done');
+ await completer.future; // Wait for breakpoint events.
+ print('breakpoint completed');
+ },
+// We are now at line 17.
+ (VmService service, IsolateRef isolateRef) async {
+ final stack = await service.getStack(isolateRef.id);
+ expect(stack.frames.length, greaterThanOrEqualTo(1));
+
+ final Script script = await service.getObject(
+ isolateRef.id, stack.frames[0].location.script.id);
+ expect(script.uri, endsWith('debugging_test.dart'));
+ expect(script.getLineNumberFromTokenPos(stack.frames[0].location.tokenPos),
+ 17);
+ },
+// Remove breakpoint
+ (VmService service, IsolateRef isolateRef) async {
+ // Set up a listener to wait for breakpoint events.
+ final completer = Completer();
+ var stream = service.onDebugEvent;
+ var subscription;
+ subscription = stream.listen((Event event) async {
+ if (event.kind == EventKind.kBreakpointRemoved) {
+ print('Breakpoint removed');
+ final isolate = await service.getIsolate(isolateRef.id);
+ expect(isolate.breakpoints.length, 0);
+ subscription.cancel();
+ completer.complete();
+ }
+ });
+
+ final Isolate isolate = await service.getIsolate(isolateRef.id);
+ expect(isolate.breakpoints.length, 1);
+ final bpt = isolate.breakpoints.first;
+ await service.streamListen(EventStreams.kDebug);
+ await service.removeBreakpoint(isolate.id, bpt.id);
+ await completer.future;
+ await service.streamCancel(EventStreams.kDebug);
+ },
+// Resume
+ (VmService service, IsolateRef isolate) async {
+ final completer = Completer();
+ var stream = service.onDebugEvent;
+ var subscription;
+ subscription = stream.listen((Event event) {
+ if (event.kind == EventKind.kResume) {
+ subscription.cancel();
+ completer.complete();
+ }
+ });
+ await resumeIsolate(service, isolate);
+ await completer.future;
+ },
+// Add breakpoint at function entry
+ (VmService service, IsolateRef isolateRef) async {
+ Isolate isolate = await service.getIsolate(isolateRef.id);
+ // Set up a listener to wait for breakpoint events.
+ final completer = Completer();
+ var stream = service.onDebugEvent;
+ var subscription;
+ subscription = stream.listen((Event event) {
+ if (event.kind == EventKind.kPauseBreakpoint) {
+ print('Breakpoint reached');
+ subscription.cancel();
+ completer.complete();
+ }
+ });
+
+ await service.streamListen(EventStreams.kDebug);
+ final Library rootLib =
+ await service.getObject(isolate.id, isolate.rootLib.id);
+
+ // Find a specific function.
+ final FuncRef function =
+ rootLib.functions.firstWhere((f) => f.name == 'periodicTask');
+ expect(function, isNotNull);
+
+ // Add the breakpoint at function entry
+ final bpt = await service.addBreakpointAtEntry(isolate.id, function.id);
+ final Script script =
+ await service.getObject(isolate.id, bpt.location.script.id);
+ expect(script.uri, endsWith('debugging_test.dart'));
+ expect(script.getLineNumberFromTokenPos(bpt.location.tokenPos), 14);
+
+ // Refresh isolate state.
+ isolate = await service.getIsolate(isolate.id);
+ expect(isolate.breakpoints.length, 1);
+
+ await completer.future; // Wait for breakpoint events.
+ },
+// We are now at line 14.
+ (VmService service, IsolateRef isolateRef) async {
+ final stack = await service.getStack(isolateRef.id);
+ expect(stack.frames.length, greaterThanOrEqualTo(1));
+
+ final Script script = await service.getObject(
+ isolateRef.id, stack.frames[0].location.script.id);
+ expect(script.uri, endsWith('debugging_test.dart'));
+ expect(script.getLineNumberFromTokenPos(stack.frames[0].location.tokenPos),
+ 14);
+ },
+];
+
+main([args = const <String>[]]) =>
+ runIsolateTests(args, tests, testeeBefore: startTimer);
diff --git a/pkg/vm_service/test/eval_test.dart b/pkg/vm_service/test/eval_test.dart
new file mode 100644
index 0000000..b751001
--- /dev/null
+++ b/pkg/vm_service/test/eval_test.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2019, 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:developer';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+int globalVar = 100;
+
+class MyClass {
+ static int staticVar = 1000;
+
+ static void method(int value) {
+ debugger();
+ }
+}
+
+class _MyClass {
+ void foo() {
+ debugger();
+ }
+}
+
+void testFunction() {
+ int i = 0;
+ while (true) {
+ if (++i % 100000000 == 0) {
+ MyClass.method(10000);
+ (new _MyClass()).foo();
+ }
+ }
+}
+
+var tests = <IsolateTest>[
+ hasStoppedAtBreakpoint,
+
+// Evaluate against library, class, and instance.
+ (VmService service, IsolateRef isolateRef) async {
+ final isolate = await service.getIsolate(isolateRef.id);
+ final stack = await service.getStack(isolateRef.id);
+
+ // Make sure we are in the right place.
+ expect(stack.frames.length, greaterThanOrEqualTo(2));
+ expect(stack.frames[0].function.name, 'method');
+ expect(stack.frames[0].function.owner.name, 'MyClass');
+
+ final LibraryRef lib = isolate.rootLib;
+ final ClassRef cls = stack.frames[0].function.owner;
+ final InstanceRef instance = stack.frames[0].vars[0].value;
+
+ dynamic result =
+ await service.evaluate(isolate.id, lib.id, 'globalVar + 5');
+ print(result);
+ expect(result.valueAsString, '105');
+
+ await expectError(() =>
+ service.evaluate(isolate.id, lib.id, 'globalVar + staticVar + 5'));
+
+ result =
+ await service.evaluate(isolate.id, cls.id, 'globalVar + staticVar + 5');
+ print(result);
+ expect(result.valueAsString, '1105');
+
+ await expectError(() => service.evaluate(isolate.id, cls.id, 'this + 5'));
+
+ result = await service.evaluate(isolate.id, instance.id, 'this + 5');
+ print(result);
+ expect(result.valueAsString, '10005');
+
+ await expectError(
+ () => service.evaluate(isolate.id, instance.id, 'this + frog'));
+ },
+ resumeIsolate,
+ hasStoppedAtBreakpoint,
+ (VmService service, IsolateRef isolate) async {
+ final stack = await service.getStack(isolate.id);
+
+ // Make sure we are in the right place.
+ expect(stack.frames.length, greaterThanOrEqualTo(2));
+ expect(stack.frames[0].function.name, 'foo');
+ expect(stack.frames[0].function.owner.name, '_MyClass');
+
+ final ClassRef cls = stack.frames[0].function.owner;
+
+ final result = await service.evaluate(isolate.id, cls.id, "1+1");
+ print(result);
+ expect(result.valueAsString, "2");
+ }
+];
+
+expectError(func) async {
+ bool gotException = false;
+ dynamic result;
+ try {
+ result = await func();
+ fail('Failed to throw');
+ } on RPCError catch (e) {
+ expect(e.code, 113); // Compile time error.
+ gotException = true;
+ }
+ if (result?.type != 'Error') {
+ expect(gotException, true); // dart2 semantics
+ }
+}
+
+main([args = const <String>[]]) =>
+ runIsolateTests(args, tests, testeeConcurrent: testFunction);
diff --git a/pkg/vm_service/test/get_allocation_profile_rpc_test.dart b/pkg/vm_service/test/get_allocation_profile_rpc_test.dart
index 4366092..0a35d093 100644
--- a/pkg/vm_service/test/get_allocation_profile_rpc_test.dart
+++ b/pkg/vm_service/test/get_allocation_profile_rpc_test.dart
@@ -64,4 +64,4 @@
},
];
-main(args) async => runIsolateTests(args, tests);
+main([args = const <String>[]]) async => runIsolateTests(args, tests);
diff --git a/pkg/vm_service/test/get_cpu_samples_rpc_test.dart b/pkg/vm_service/test/get_cpu_samples_rpc_test.dart
index 70f640e..dcc8d9b 100644
--- a/pkg/vm_service/test/get_cpu_samples_rpc_test.dart
+++ b/pkg/vm_service/test/get_cpu_samples_rpc_test.dart
@@ -57,5 +57,5 @@
'--profile-vm=false', // So this also works with DBC and KBC.
];
-main(args) async =>
+main([args = const <String>[]]) async =>
runIsolateTests(args, tests, testeeBefore: testeeDo, extraArgs: vmArgs);
diff --git a/pkg/vm_service/test/get_flag_list_rpc_test.dart b/pkg/vm_service/test/get_flag_list_rpc_test.dart
index ada2cfa..f7a8b70 100644
--- a/pkg/vm_service/test/get_flag_list_rpc_test.dart
+++ b/pkg/vm_service/test/get_flag_list_rpc_test.dart
@@ -74,4 +74,4 @@
}
];
-main(args) async => runVMTests(args, tests);
+main([args = const <String>[]]) async => runVMTests(args, tests);
diff --git a/pkg/vm_service/test/heap_snapshot_graph_test.dart b/pkg/vm_service/test/heap_snapshot_graph_test.dart
index 6fb85dd..c0db2ec 100644
--- a/pkg/vm_service/test/heap_snapshot_graph_test.dart
+++ b/pkg/vm_service/test/heap_snapshot_graph_test.dart
@@ -79,4 +79,5 @@
},
];
-main(args) async => runIsolateTests(args, tests, testeeBefore: script);
+main([args = const <String>[]]) async =>
+ runIsolateTests(args, tests, testeeBefore: script);
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
index 6c01c9c..7a5fbbf 100644
--- a/pkg/vm_service/tool/dart/generate_dart.dart
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -1333,6 +1333,10 @@
if (name == 'Response') {
gen.writeln('Map<String, dynamic> json;');
}
+ if (name == 'Script') {
+ gen.writeln('final _tokenToLine = <int, int>{};');
+ gen.writeln('final _tokenToColumn = <int, int>{};');
+ }
// fields
fields.forEach((TypeField field) => field.generate(gen));
@@ -1425,6 +1429,7 @@
}
gen.writeln("List<List<int>>.from(json['tokenPosTable'].map"
"((dynamic list) => List<int>.from(list)));");
+ gen.writeln('_parseTokenPosTable();');
} else if (field.type.isArray) {
TypeRef fieldType = field.type.types.first;
String typesList = _typeRefListToString(field.type.types);
@@ -1471,6 +1476,10 @@
}
gen.writeln();
+ if (name == 'Script') {
+ generateScriptTypeMethods(gen);
+ }
+
// toJson support, the base Response type is not supported
if (name == 'Response') {
gen.writeln('''
@@ -1555,6 +1564,39 @@
gen.writeln('}');
}
+ // Special methods for Script objects.
+ void generateScriptTypeMethods(DartGenerator gen) {
+ gen.writeDocs('''This function maps a token position to a line number.
+The VM considers the first line to be line 1.''');
+ gen.writeln(
+ 'int getLineNumberFromTokenPos(int tokenPos) => _tokenToLine[tokenPos];');
+ gen.writeln();
+ gen.writeDocs('''This function maps a token position to a column number.
+The VM considers the first column to be column 1.''');
+ gen.writeln(
+ 'int getColumnNumberFromTokenPos(int tokenPos) => _tokenToColumn[tokenPos];');
+ gen.writeln();
+ gen.writeln('''
+void _parseTokenPosTable() {
+ if (tokenPosTable == null) {
+ return;
+ }
+ final lineSet = Set<int>();
+ for (List line in tokenPosTable) {
+ // Each entry begins with a line number...
+ int lineNumber = line[0];
+ lineSet.add(lineNumber);
+ for (var pos = 1; pos < line.length; pos += 2) {
+ // ...and is followed by (token offset, col number) pairs.
+ final int tokenOffset = line[pos];
+ final int colNumber = line[pos + 1];
+ _tokenToLine[tokenOffset] = lineNumber;
+ _tokenToColumn[tokenOffset] = colNumber;
+ }
+ }
+}''');
+ }
+
// Writes the code to retrieve the serialized value of a field.
void generateSerializedFieldAccess(TypeField field, DartGenerator gen) {
var nullAware = field.optional ? '?' : '';
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 87e6415..e22d8af 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -37,10 +37,7 @@
extra_configs += invoker.extra_configs
}
source_set(target_name) {
- configs += [
- "..:dart_arch_config",
- "..:dart_config",
- ] + extra_configs
+ configs += [ "..:dart_config" ] + extra_configs
public_configs = [ ":libdart_builtin_config" ]
deps = []
if (is_fuchsia) {
@@ -67,6 +64,7 @@
extra_configs = [
"..:dart_maybe_product_config",
"..:dart_os_config",
+ "..:dart_arch_config",
]
}
@@ -91,6 +89,14 @@
]
}
+build_libdart_builtin("libdart_builtin_host_targeting_host") {
+ extra_configs = [ "..:dart_maybe_product_config" ]
+}
+
+build_libdart_builtin("libdart_builtin_product_host_targeting_host") {
+ extra_configs = [ "..:dart_product_config" ]
+}
+
static_library("crashpad") {
configs += [
"..:dart_arch_config",
@@ -145,7 +151,6 @@
}
executable(target_name) {
configs += [
- "..:dart_arch_config",
"..:dart_config",
"..:dart_precompiler_config",
] + extra_configs
@@ -217,6 +222,7 @@
build_gen_snapshot("gen_snapshot") {
extra_configs = [
"..:dart_maybe_product_config",
+ "..:dart_arch_config",
"..:dart_os_config",
]
extra_deps = [
@@ -230,6 +236,7 @@
build_gen_snapshot("gen_snapshot_product") {
extra_configs = [
"..:dart_product_config",
+ "..:dart_arch_config",
"..:dart_os_config",
]
extra_deps = [
@@ -243,6 +250,7 @@
build_gen_snapshot("gen_snapshot_fuchsia") {
extra_configs = [
"..:dart_maybe_product_config",
+ "..:dart_arch_config",
"..:dart_os_fuchsia_config",
]
extra_deps = [
@@ -256,6 +264,7 @@
build_gen_snapshot("gen_snapshot_product_fuchsia") {
extra_configs = [
"..:dart_product_config",
+ "..:dart_arch_config",
"..:dart_os_fuchsia_config",
]
extra_deps = [
@@ -266,6 +275,26 @@
]
}
+build_gen_snapshot("gen_snapshot_host_targeting_host") {
+ extra_configs = [ "..:dart_maybe_product_config" ]
+ extra_deps = [
+ ":gen_snapshot_dart_io_host_targeting_host",
+ ":libdart_builtin_host_targeting_host",
+ "../platform:libdart_platform_nosnapshot_with_precompiler_host_targeting_host",
+ "..:libdart_nosnapshot_with_precompiler_host_targeting_host",
+ ]
+}
+
+build_gen_snapshot("gen_snapshot_product_host_targeting_host") {
+ extra_configs = [ "..:dart_product_config" ]
+ extra_deps = [
+ ":gen_snapshot_dart_io_host_targeting_host",
+ ":libdart_builtin_host_targeting_host",
+ "../platform:libdart_platform_nosnapshot_with_precompiler_host_targeting_host",
+ "..:libdart_nosnapshot_with_precompiler_host_targeting_host",
+ ]
+}
+
# A source set for the implementation of 'dart:io' library
# (without secure sockets) suitable for linking with gen_snapshot.
template("build_gen_snapshot_dart_io") {
@@ -275,7 +304,6 @@
}
source_set(target_name) {
configs += [
- "..:dart_arch_config",
"..:dart_config",
"..:dart_precompiler_config",
] + extra_configs
@@ -334,6 +362,7 @@
build_gen_snapshot_dart_io("gen_snapshot_dart_io") {
extra_configs = [
"..:dart_maybe_product_config",
+ "..:dart_arch_config",
"..:dart_os_config",
]
}
@@ -341,13 +370,23 @@
build_gen_snapshot_dart_io("gen_snapshot_dart_io_product") {
extra_configs = [
"..:dart_product_config",
+ "..:dart_arch_config",
"..:dart_os_config",
]
}
+build_gen_snapshot_dart_io("gen_snapshot_dart_io_host_targeting_host") {
+ extra_configs = [ "..:dart_maybe_product_config" ]
+}
+
+build_gen_snapshot_dart_io("gen_snapshot_dart_io_product_host_targeting_host") {
+ extra_configs = [ "..:dart_product_config" ]
+}
+
build_gen_snapshot_dart_io("gen_snapshot_dart_io_fuchsia") {
extra_configs = [
"..:dart_maybe_product_config",
+ "..:dart_arch_config",
"..:dart_os_fuchsia_config",
]
}
@@ -355,6 +394,7 @@
build_gen_snapshot_dart_io("gen_snapshot_dart_io_product_fuchsia") {
extra_configs = [
"..:dart_product_config",
+ "..:dart_arch_config",
"..:dart_os_fuchsia_config",
]
}
diff --git a/runtime/bin/elf_loader.h b/runtime/bin/elf_loader.h
index b604ee6..e8243cd 100644
--- a/runtime/bin/elf_loader.h
+++ b/runtime/bin/elf_loader.h
@@ -5,7 +5,7 @@
#ifndef RUNTIME_BIN_ELF_LOADER_H_
#define RUNTIME_BIN_ELF_LOADER_H_
-#include <include/dart_api.h>
+#include "../include/dart_api.h"
typedef void* LoadedElfLibrary;
@@ -16,7 +16,7 @@
/// string should not be 'free'-d.
///
/// Looks up the Dart snapshot symbols "_kVmSnapshotData",
-/// "_kVmSnapshotInstructions", "_kVmIsoalteData" and "_kVmIsolateInstructions"
+/// "_kVmSnapshotInstructions", "_kVmIsolateData" and "_kVmIsolateInstructions"
/// into the respectively named out-parameters.
DART_EXPORT LoadedElfLibrary Dart_LoadELF(const char* filename,
const char** error,
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index 8bae36d..f4cfc6a 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -374,7 +374,7 @@
final serviceInfo = <String, dynamic>{
'uri': serverAddress.toString(),
};
- final file = File(_serviceInfoFilename);
+ final file = File.fromUri(Uri.parse(_serviceInfoFilename));
file.writeAsString(json.encode(serviceInfo));
}
diff --git a/runtime/configs.gni b/runtime/configs.gni
index a638887..843fe71 100644
--- a/runtime/configs.gni
+++ b/runtime/configs.gni
@@ -16,6 +16,8 @@
"$_dart_runtime:dart_os_fuchsia_config",
]
+_base_host_targeting_host_config = [ "$_dart_runtime:dart_config" ]
+
_maybe_product = [ "$_dart_runtime:dart_maybe_product_config" ]
_product = [ "$_dart_runtime:dart_product_config" ]
@@ -57,6 +59,13 @@
_nosnapshot_with_precompiler_product_fuchsia_config =
_base_fuchsia_config + _nosnapshot_precompiler_base + _product
+_nosnapshot_with_precompiler_host_targeting_host_config =
+ _base_host_targeting_host_config + _nosnapshot_precompiler_base +
+ _maybe_product
+
+_nosnapshot_with_precompiler_product_host_targeting_host_config =
+ _base_host_targeting_host_config + _nosnapshot_precompiler_base + _product
+
_all_configs = [
{
suffix = "_jit"
@@ -99,6 +108,16 @@
snapshot = false
},
{
+ suffix = "_nosnapshot_with_precompiler_host_targeting_host"
+ configs = _nosnapshot_with_precompiler_host_targeting_host_config
+ snapshot = false
+ },
+ {
+ suffix = "_nosnapshot_with_precompiler_product_host_targeting_host"
+ configs = _nosnapshot_with_precompiler_product_host_targeting_host_config
+ snapshot = false
+ },
+ {
suffix = "_libfuzzer"
configs = _libfuzzer_config
snapshot = true
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index 201fe2c..947ba4f 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -287,8 +287,17 @@
}
DEFINE_NATIVE_ENTRY(OneByteString_allocate, 0, 1) {
- GET_NON_NULL_NATIVE_ARGUMENT(Smi, length_obj, arguments->NativeArgAt(0));
- return OneByteString::New(length_obj.Value(), Heap::kNew);
+ GET_NON_NULL_NATIVE_ARGUMENT(Integer, length_obj, arguments->NativeArgAt(0));
+ const int64_t length = length_obj.AsInt64Value();
+ if ((length < 0) || (length > OneByteString::kMaxElements)) {
+ // Assume that negative lengths are the result of wrapping in code in
+ // string_patch.dart.
+ const Instance& exception =
+ Instance::Handle(thread->isolate()->object_store()->out_of_memory());
+ Exceptions::Throw(thread, exception);
+ UNREACHABLE();
+ }
+ return OneByteString::New(static_cast<intptr_t>(length), Heap::kNew);
}
DEFINE_NATIVE_ENTRY(OneByteString_allocateFromOneByteList, 0, 3) {
diff --git a/runtime/lib/typed_data.cc b/runtime/lib/typed_data.cc
index af97a0f..4980516 100644
--- a/runtime/lib/typed_data.cc
+++ b/runtime/lib/typed_data.cc
@@ -9,6 +9,7 @@
#include "vm/exceptions.h"
#include "vm/native_entry.h"
#include "vm/object.h"
+#include "vm/object_store.h"
namespace dart {
@@ -189,12 +190,18 @@
// Argument 0 is type arguments and is ignored.
#define TYPED_DATA_NEW(name) \
DEFINE_NATIVE_ENTRY(TypedData_##name##_new, 0, 2) { \
- GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(1)); \
+ GET_NON_NULL_NATIVE_ARGUMENT(Integer, length, arguments->NativeArgAt(1)); \
const intptr_t cid = kTypedData##name##Cid; \
- const intptr_t len = length.Value(); \
const intptr_t max = TypedData::MaxElements(cid); \
- LengthCheck(len, max); \
- return TypedData::New(cid, len); \
+ const int64_t len = length.AsInt64Value(); \
+ if (len < 0) { \
+ Exceptions::ThrowRangeError("length", length, 0, max); \
+ } else if (len > max) { \
+ const Instance& exception = Instance::Handle( \
+ zone, thread->isolate()->object_store()->out_of_memory()); \
+ Exceptions::Throw(thread, exception); \
+ } \
+ return TypedData::New(cid, static_cast<intptr_t>(len)); \
}
#define TYPED_DATA_NEW_NATIVE(name) TYPED_DATA_NEW(name)
diff --git a/runtime/lib/wasm.cc b/runtime/lib/wasm.cc
index 0094e6b..eca0ff7 100644
--- a/runtime/lib/wasm.cc
+++ b/runtime/lib/wasm.cc
@@ -471,9 +471,11 @@
class WasmInstance {
public:
- WasmInstance() : _instance(nullptr), _exports(nullptr) {}
+ WasmInstance() : _instance(nullptr), _exports(nullptr), _memory(nullptr) {}
bool Instantiate(wasmer_module_t* module, WasmImports* imports) {
+ ASSERT(_instance == nullptr);
+
// Instantiate module.
if (wasmer_module_instantiate(module, &_instance, imports->RawImports(),
imports->NumImports()) !=
@@ -481,15 +483,22 @@
return false;
}
- // Load all functions.
+ // Load all exports.
wasmer_instance_exports(_instance, &_exports);
intptr_t num_exports = wasmer_exports_len(_exports);
for (intptr_t i = 0; i < num_exports; ++i) {
wasmer_export_t* exp = wasmer_exports_get(_exports, i);
- if (wasmer_export_kind(exp) == wasmer_import_export_kind::WASM_FUNCTION) {
+ wasmer_import_export_kind kind = wasmer_export_kind(exp);
+ if (kind == wasmer_import_export_kind::WASM_FUNCTION) {
if (!AddFunction(exp)) {
return false;
}
+ } else if (kind == wasmer_import_export_kind::WASM_MEMORY) {
+ ASSERT(_memory == nullptr);
+ if (wasmer_export_to_memory(exp, &_memory) !=
+ wasmer_result_t::WASMER_OK) {
+ return false;
+ }
}
}
@@ -541,10 +550,13 @@
o << '}' << std::endl;
}
+ wasmer_memory_t* memory() { return _memory; }
+
private:
wasmer_instance_t* _instance;
wasmer_exports_t* _exports;
MallocDirectChainedHashMap<CStringKeyValueTrait<WasmFunction*>> _functions;
+ wasmer_memory_t* _memory;
static classid_t ToDartType(wasmer_value_tag wasm_type) {
switch (wasm_type) {
@@ -840,6 +852,36 @@
return Object::null();
}
+DEFINE_NATIVE_ENTRY(Wasm_initMemoryFromInstance, 0, 2) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Instance, mem_wrap, arguments->NativeArgAt(0));
+ GET_NON_NULL_NATIVE_ARGUMENT(Instance, inst_wrap, arguments->NativeArgAt(1));
+
+ ASSERT(mem_wrap.NumNativeFields() == 1);
+ ASSERT(inst_wrap.NumNativeFields() == 1);
+
+ WasmInstance* inst =
+ reinterpret_cast<WasmInstance*>(inst_wrap.GetNativeField(0));
+
+ wasmer_memory_t* memory = inst->memory();
+
+ mem_wrap.SetNativeField(0, reinterpret_cast<intptr_t>(memory));
+ FinalizablePersistentHandle::New(thread->isolate(), mem_wrap, memory,
+ FinalizeWasmMemory,
+ wasmer_memory_length(memory));
+ return WasmMemoryToExternalTypedData(memory);
+}
+
+DEFINE_NATIVE_ENTRY(Wasm_getMemoryPages, 0, 1) {
+ GET_NON_NULL_NATIVE_ARGUMENT(Instance, mem_wrap, arguments->NativeArgAt(0));
+
+ ASSERT(mem_wrap.NumNativeFields() == 1);
+
+ wasmer_memory_t* memory =
+ reinterpret_cast<wasmer_memory_t*>(mem_wrap.GetNativeField(0));
+
+ return Integer::New(wasmer_memory_length(memory));
+}
+
DEFINE_NATIVE_ENTRY(Wasm_initFunction, 0, 4) {
GET_NON_NULL_NATIVE_ARGUMENT(Instance, fn_wrap, arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Instance, inst_wrap, arguments->NativeArgAt(1));
@@ -978,6 +1020,16 @@
return nullptr;
}
+DEFINE_NATIVE_ENTRY(Wasm_initMemoryFromInstance, 0, 2) {
+ Exceptions::ThrowUnsupportedError("WASM is disabled");
+ return nullptr;
+}
+
+DEFINE_NATIVE_ENTRY(Wasm_getMemoryPages, 0, 1) {
+ Exceptions::ThrowUnsupportedError("WASM is disabled");
+ return nullptr;
+}
+
DEFINE_NATIVE_ENTRY(Wasm_initFunction, 0, 4) {
Exceptions::ThrowUnsupportedError("WASM is disabled");
return nullptr;
diff --git a/runtime/observatory/tests/service/auth_token1_test.dart b/runtime/observatory/tests/service/auth_token1_test.dart
deleted file mode 100644
index 4d4fa9a..0000000
--- a/runtime/observatory/tests/service/auth_token1_test.dart
+++ /dev/null
@@ -1,47 +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.
-
-import 'dart:async';
-import 'dart:developer';
-import 'dart:io' as io;
-import 'package:observatory/service_io.dart' as S;
-import 'package:unittest/unittest.dart';
-import 'test_helper.dart';
-
-Future<Null> testeeBefore() async {
- print('testee before');
- print(await Service.getInfo());
- // Start the web server.
- ServiceProtocolInfo info = await Service.controlWebServer(enable: true);
- expect(info.serverUri, isNotNull);
- // Ensure that we have no auth token in the path segments.
- expect(info.serverUri.pathSegments.length, equals(0));
-
- // Try connecting to the server without the auth token, it should succeed.
- var port = info.serverUri.port;
- var url = Uri.parse('http://localhost:$port');
- var httpClient = new io.HttpClient();
- try {
- await httpClient.getUrl(url);
- expect(true, true);
- } catch (e) {
- expect(true, false);
- }
-}
-
-var tests = <IsolateTest>[
- (S.Isolate isolate) async {
- await isolate.reload();
- // Just getting here means that the testee enabled the service protocol
- // web server.
- expect(true, true);
- }
-];
-
-main(args) => runIsolateTests(args, tests,
- testeeBefore: testeeBefore,
- // the testee is responsible for starting the
- // web server.
- testeeControlsServer: true,
- useAuthToken: false);
diff --git a/runtime/observatory/tests/service/auth_token_test.dart b/runtime/observatory/tests/service/auth_token_test.dart
index 470b330..8c6ae7f 100644
--- a/runtime/observatory/tests/service/auth_token_test.dart
+++ b/runtime/observatory/tests/service/auth_token_test.dart
@@ -54,5 +54,4 @@
testeeBefore: testeeBefore,
// the testee is responsible for starting the
// web server.
- testeeControlsServer: true,
- useAuthToken: true);
+ testeeControlsServer: true);
diff --git a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
index 637790f..3884a9b 100644
--- a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
@@ -119,7 +119,7 @@
expect(result['traceEvents'], new isInstanceOf<List>());
final int numEvents = result['traceEvents'].length;
List dartEvents = filterForDartEvents(result['traceEvents']);
- expect(dartEvents.length, equals(11));
+ expect(dartEvents.length, greaterThanOrEqualTo(11));
allEventsHaveIsolateNumber(dartEvents);
allEventsHaveIsolateNumber(result['traceEvents']);
expect(
diff --git a/runtime/observatory/tests/service/http_auth_get_isolate_rpc_test.dart b/runtime/observatory/tests/service/http_auth_get_isolate_rpc_test.dart
index 5b0b5f6..261fa26 100644
--- a/runtime/observatory/tests/service/http_auth_get_isolate_rpc_test.dart
+++ b/runtime/observatory/tests/service/http_auth_get_isolate_rpc_test.dart
@@ -10,6 +10,5 @@
testeeBefore: testeeBefore,
// the testee is responsible for starting the
// web server.
- testeeControlsServer: true,
- useAuthToken: true);
+ testeeControlsServer: true);
}
diff --git a/runtime/observatory/tests/service/http_auth_get_vm_rpc_test.dart b/runtime/observatory/tests/service/http_auth_get_vm_rpc_test.dart
index 8eff61f..5484c5e 100644
--- a/runtime/observatory/tests/service/http_auth_get_vm_rpc_test.dart
+++ b/runtime/observatory/tests/service/http_auth_get_vm_rpc_test.dart
@@ -10,6 +10,5 @@
testeeBefore: testeeBefore,
// the testee is responsible for starting the
// web server.
- testeeControlsServer: true,
- useAuthToken: true);
+ testeeControlsServer: true);
}
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions3_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions3_test.dart
new file mode 100644
index 0000000..454c1c2
--- /dev/null
+++ b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions3_test.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2019, 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.
+
+// Verify that debugger can stop on an unhandled exception thrown from async
+// function. Regression test for https://dartbug.com/38697.
+
+import 'package:observatory/service_io.dart';
+import 'package:unittest/unittest.dart';
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+const LINE_A = 16;
+
+throwException() async {
+ throw 'exception'; // LINE_A
+}
+
+testeeMain() async {
+ try {
+ await throwException();
+ } finally {}
+}
+
+var tests = <IsolateTest>[
+ hasStoppedWithUnhandledException,
+ stoppedAtLine(LINE_A),
+ (Isolate isolate) async {
+ print("Stopped!");
+ var stack = await isolate.getStack();
+ expect(stack['frames'][0].function.toString(), contains('throwException'));
+ }
+];
+
+main(args) => runIsolateTests(args, tests,
+ pause_on_unhandled_exceptions: true, testeeConcurrent: testeeMain);
diff --git a/runtime/observatory/tests/service/test_helper.dart b/runtime/observatory/tests/service/test_helper.dart
index 05c37a1..10ae2e3 100644
--- a/runtime/observatory/tests/service/test_helper.dart
+++ b/runtime/observatory/tests/service/test_helper.dart
@@ -92,13 +92,12 @@
bool pause_on_exit,
bool pause_on_unhandled_exceptions,
bool testeeControlsServer,
- bool useAuthToken,
+ Uri serviceInfoUri,
List<String> extraArgs) {
assert(pause_on_start != null);
assert(pause_on_exit != null);
assert(pause_on_unhandled_exceptions != null);
assert(testeeControlsServer != null);
- assert(useAuthToken != null);
if (_shouldLaunchSkyShell()) {
return _spawnSkyProcess(pause_on_start, pause_on_exit,
@@ -109,7 +108,7 @@
pause_on_exit,
pause_on_unhandled_exceptions,
testeeControlsServer,
- useAuthToken,
+ serviceInfoUri,
extraArgs);
}
}
@@ -119,7 +118,7 @@
bool pause_on_exit,
bool pause_on_unhandled_exceptions,
bool testeeControlsServer,
- bool useAuthToken,
+ Uri serviceInfoUri,
List<String> extraArgs) {
assert(!_shouldLaunchSkyShell());
@@ -132,9 +131,8 @@
if (pause_on_exit) {
fullArgs.add('--pause-isolates-on-exit');
}
- if (!useAuthToken) {
- fullArgs.add('--disable-service-auth-codes');
- }
+ fullArgs.add('--write-service-info=$serviceInfoUri');
+
if (pause_on_unhandled_exceptions) {
fullArgs.add('--pause-isolates-on-unhandled-exceptions');
}
@@ -149,8 +147,7 @@
}
fullArgs.addAll(args);
- return _spawnCommon(dartExecutable, fullArgs,
- <String, String>{});
+ return _spawnCommon(dartExecutable, fullArgs, <String, String>{});
}
Future<Process> _spawnSkyProcess(
@@ -211,37 +208,27 @@
bool pause_on_exit,
bool pause_on_unhandled_exceptions,
bool testeeControlsServer,
- bool useAuthToken,
- List<String> extraArgs) {
- return _spawnProcess(
- pause_on_start,
- pause_on_exit,
- pause_on_unhandled_exceptions,
- testeeControlsServer,
- useAuthToken,
- extraArgs).then((p) {
- Completer<Uri> completer = new Completer<Uri>();
+ List<String> extraArgs) async {
+ final completer = new Completer<Uri>();
+ final serviceInfoDir =
+ await Directory.systemTemp.createTemp('dart_service');
+ final serviceInfoUri = serviceInfoDir.uri.resolve('service_info.json');
+ final serviceInfoFile = await File.fromUri(serviceInfoUri).create();
+ _spawnProcess(pause_on_start, pause_on_exit, pause_on_unhandled_exceptions,
+ testeeControlsServer, serviceInfoUri, extraArgs)
+ .then((p) async {
process = p;
Uri uri;
- var blank;
- var first = true;
+ final blankCompleter = Completer();
+ bool blankLineReceived = false;
process.stdout
.transform(utf8.decoder)
.transform(new LineSplitter())
.listen((line) {
- const kObservatoryListening = 'Observatory listening on ';
- if (line.startsWith(kObservatoryListening)) {
- uri = Uri.parse(line.substring(kObservatoryListening.length));
- }
- if (pause_on_start || line == '') {
+ if (!blankLineReceived && (pause_on_start || line == '')) {
// Received blank line.
- blank = true;
- }
- if ((uri != null) && (blank == true) && (first == true)) {
- completer.complete(uri);
- // Stop repeat completions.
- first = false;
- print('** Signaled to run test queries on $uri');
+ blankLineReceived = true;
+ blankCompleter.complete();
}
print('>testee>out> $line');
});
@@ -257,8 +244,20 @@
}
print("** Process exited");
});
- return completer.future;
+
+ // Wait for the blank line which signals that we're ready to run.
+ await blankCompleter.future;
+ while ((await serviceInfoFile.length()) <= 5) {
+ await Future.delayed(Duration(milliseconds: 50));
+ }
+ final content = await serviceInfoFile.readAsString();
+ final infoJson = json.decode(content);
+ uri = Uri.parse(infoJson['uri']);
+ completer.complete(uri);
+ print('** Signaled to run test queries on $uri');
+ await serviceInfoDir.delete(recursive: true);
});
+ return completer.future;
}
void requestExit() {
@@ -287,14 +286,13 @@
bool pause_on_exit: false,
bool verbose_vm: false,
bool pause_on_unhandled_exceptions: false,
- bool testeeControlsServer: false,
- bool useAuthToken: false}) {
+ bool testeeControlsServer: false}) {
var process = new _ServiceTesteeLauncher();
bool testsDone = false;
runZoned(() {
process
.launch(pause_on_start, pause_on_exit, pause_on_unhandled_exceptions,
- testeeControlsServer, useAuthToken, extraArgs)
+ testeeControlsServer, extraArgs)
.then((Uri serverAddress) async {
if (mainArgs.contains("--gdb")) {
var pid = process.process.pid;
@@ -406,7 +404,6 @@
bool verbose_vm: false,
bool pause_on_unhandled_exceptions: false,
bool testeeControlsServer: false,
- bool useAuthToken: false,
List<String> extraArgs}) async {
assert(!pause_on_start || testeeBefore == null);
if (_isTestee()) {
@@ -424,8 +421,7 @@
pause_on_exit: pause_on_exit,
verbose_vm: verbose_vm,
pause_on_unhandled_exceptions: pause_on_unhandled_exceptions,
- testeeControlsServer: testeeControlsServer,
- useAuthToken: useAuthToken);
+ testeeControlsServer: testeeControlsServer);
}
}
diff --git a/runtime/platform/safe_stack.h b/runtime/platform/safe_stack.h
index 3c68059..5a9bbeb 100644
--- a/runtime/platform/safe_stack.h
+++ b/runtime/platform/safe_stack.h
@@ -19,4 +19,16 @@
#define NO_SANITIZE_SAFE_STACK
#endif
+#if defined(__has_feature)
+#if __has_feature(shadow_call_stack)
+#define USING_SHADOW_CALL_STACK
+#endif
+#endif
+
+#if defined(USING_SHADOW_CALL_STACK)
+#define NO_SANITIZE_SHADOW_CALL_STACK __attribute__((no_sanitize("shadow-call-stack")))
+#else
+#define NO_SANITIZE_SHADOW_CALL_STACK
+#endif
+
#endif // RUNTIME_PLATFORM_SAFE_STACK_H_
diff --git a/runtime/platform/utils.cc b/runtime/platform/utils.cc
index 2cfa649..3f5091c 100644
--- a/runtime/platform/utils.cc
+++ b/runtime/platform/utils.cc
@@ -50,6 +50,26 @@
return r;
}
+uint64_t Utils::ReverseBits64(uint64_t x) {
+ const uint64_t one = static_cast<uint64_t>(1);
+ uint64_t result = 0;
+ for (uint64_t rbit = one << 63; x != 0; x >>= 1) {
+ if ((x & one) != 0) result |= rbit;
+ rbit >>= 1;
+ }
+ return result;
+}
+
+uint32_t Utils::ReverseBits32(uint32_t x) {
+ const uint32_t one = static_cast<uint32_t>(1);
+ uint32_t result = 0;
+ for (uint32_t rbit = one << 31; x != 0; x >>= 1) {
+ if ((x & one) != 0) result |= rbit;
+ rbit >>= 1;
+ }
+ return result;
+}
+
// Implementation according to H.S.Warren's "Hacker's Delight"
// (Addison Wesley, 2002) Chapter 10 and T.Grablund, P.L.Montogomery's
// "Division by Invariant Integers Using Multiplication" (PLDI 1994).
diff --git a/runtime/platform/utils.h b/runtime/platform/utils.h
index e0d145b..860c00b 100644
--- a/runtime/platform/utils.h
+++ b/runtime/platform/utils.h
@@ -150,6 +150,17 @@
static int CountLeadingZeros(uword x);
static int CountTrailingZeros(uword x);
+ static uint64_t ReverseBits64(uint64_t x);
+ static uint32_t ReverseBits32(uint32_t x);
+
+ static uword ReverseBitsWord(uword x) {
+#ifdef ARCH_IS_64_BIT
+ return ReverseBits64(x);
+#else
+ return ReverseBits32(x);
+#endif
+ }
+
// Computes magic numbers to implement DIV or MOD operator.
static void CalculateMagicAndShiftForDivRem(int64_t divisor,
int64_t* magic,
diff --git a/runtime/tests/vm/dart/regress_38661_test.dart b/runtime/tests/vm/dart/regress_38661_test.dart
new file mode 100644
index 0000000..2e1ba13
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_38661_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2019, 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=--serialize_flow_graphs_to=il_tmp.txt
+// VMOptions=--serialize_flow_graphs_to=il_tmp.txt --populate_llvm_constant_pool
+// VMOptions=--serialize_flow_graphs_to=il_tmp.txt --no_serialize_flow_graph_types
+// VMOptions=--serialize_flow_graphs_to=il_tmp.txt --verbose_flow_graph_serialization
+// VMOptions=--serialize_flow_graphs_to=il_tmp.txt --no_serialize_flow_graph_types --verbose_flow_graph_serialization
+
+class A {
+ const A();
+}
+
+class B {
+ Object a = const A();
+}
+
+foo(int i) {
+ if (i == 3) {
+ new B();
+ }
+}
+
+main(args) {
+ foo(4);
+}
diff --git a/runtime/tools/layering_check.py b/runtime/tools/compiler_layering_check.py
similarity index 100%
rename from runtime/tools/layering_check.py
rename to runtime/tools/compiler_layering_check.py
diff --git a/runtime/tools/dartfuzz/README.md b/runtime/tools/dartfuzz/README.md
index 162c2e0..94989a2 100644
--- a/runtime/tools/dartfuzz/README.md
+++ b/runtime/tools/dartfuzz/README.md
@@ -20,6 +20,7 @@
--seed : defines random seed (system-set by default)
--[no-]fp : enables/disables floating-point operations (default: on)
--[no-]ffi : enables/disables FFI method calls (default: off)
+ --[no-]flat : enables/disables flat types (default: off)
--[no-]mini : enables minimization mode (default: off)
--smask : bitmask indicating which statements to omit (Bit=1 omits, defaults to "0")
--emask : bitmask indicating which expressions to omit (Bit=1 omits, defaults to "0")
diff --git a/runtime/tools/dartfuzz/dartfuzz.dart b/runtime/tools/dartfuzz/dartfuzz.dart
index 21f0a79..d09a711 100644
--- a/runtime/tools/dartfuzz/dartfuzz.dart
+++ b/runtime/tools/dartfuzz/dartfuzz.dart
@@ -7,14 +7,14 @@
import 'package:args/args.dart';
-import 'dartfuzz_values.dart';
import 'dartfuzz_api_table.dart';
import 'dartfuzz_ffi_api.dart';
+import 'dartfuzz_type_table.dart';
// Version of DartFuzz. Increase this each time changes are made
// to preserve the property that a given version of DartFuzz yields
// the same fuzzed program for a deterministic random seed.
-const String version = '1.53';
+const String version = '1.57';
// Restriction on statements and expressions.
const int stmtDepth = 1;
@@ -39,10 +39,7 @@
class RhsFilter {
RhsFilter(this._remaining, this.lhsVar);
factory RhsFilter.fromDartType(DartType tp, String lhsVar) {
- if (tp == DartType.STRING ||
- tp == DartType.INT_LIST ||
- tp == DartType.INT_SET ||
- tp == DartType.INT_STRING_MAP) {
+ if (DartType.isGrowableType(tp)) {
return RhsFilter(1, lhsVar);
}
return null;
@@ -114,7 +111,7 @@
/// Class that generates a random, but runnable Dart program for fuzz testing.
class DartFuzz {
- DartFuzz(this.seed, this.fp, this.ffi, this.file,
+ DartFuzz(this.seed, this.fp, this.ffi, this.flatTp, this.file,
{this.minimize = false, this.smask, this.emask});
void run() {
@@ -124,6 +121,8 @@
nest = 0;
currentClass = null;
currentMethod = null;
+ // Setup Dart types.
+ dartType = DartType.fromDartConfig(enableFp: fp, disableNesting: flatTp);
// Setup minimization parameters.
initMinimization();
// Setup the library and ffi api.
@@ -131,16 +130,14 @@
// Setup the types.
localVars = <DartType>[];
iterVars = <String>[];
-
globalVars = fillTypes1(limit: numGlobalVars);
- globalVars.addAll(DartType.allTypes); // always one each
+ globalVars.addAll(dartType.allTypes);
globalMethods =
fillTypes2(limit2: numGlobalMethods, limit1: numMethodParams);
classFields = fillTypes2(limit2: numClasses, limit1: numLocalVars);
final int numClassMethods = 1 + numClasses - classFields.length;
classMethods = fillTypes3(classFields.length,
limit2: numClassMethods, limit1: numMethodParams);
-
virtualClassMethods = <Map<int, List<int>>>[];
classParents = <int>[];
// Setup optional ffi methods and types.
@@ -167,6 +164,13 @@
assert(localVars.isEmpty);
}
+ // Randomly specialize interface if possible. E.g. num to int.
+ DartType maybeSpecializeInterface(DartType tp) {
+ if (!dartType.isSpecializable(tp)) return tp;
+ DartType resolvedTp = oneOfSet(dartType.interfaces(tp));
+ return resolvedTp;
+ }
+
//
// Minimization components.
//
@@ -192,13 +196,13 @@
case DartType.STRING:
emit('"a"');
break;
- case DartType.INT_LIST:
+ case DartType.LIST_INT:
emit('[1]');
break;
- case DartType.INT_SET:
+ case DartType.SET_INT:
emit('{1}');
break;
- case DartType.INT_STRING_MAP:
+ case DartType.MAP_INT_STRING:
emit('{1: "a"}');
break;
default:
@@ -304,7 +308,7 @@
emitLn('// The Dart Project Fuzz Tester ($version).');
emitLn('// Program generated as:');
emitLn('// dart dartfuzz.dart --seed $seed --${fp ? "" : "no-"}fp ' +
- '--${ffi ? "" : "no-"}ffi');
+ '--${ffi ? "" : "no-"}ffi --${flatTp ? "" : "no-"}flat');
emitLn('');
emitLn("import 'dart:async';");
emitLn("import 'dart:cli';");
@@ -567,7 +571,7 @@
for (int i = 0; i < vars.length; i++) {
DartType tp = vars[i];
emitLn('${tp.name} $name$i = ', newline: false);
- emitLiteral(0, tp);
+ emitConstructorOrLiteral(0, tp);
emit(';', newline: true);
}
emit('', newline: true);
@@ -616,22 +620,42 @@
// Emit an assignment statement.
bool emitAssign() {
- DartType tp = getType();
+ // Select a type at random.
+ final tp = oneOfSet(dartType.allTypes);
+ // Select one of the assign operations for the given type.
+ final assignOp = oneOfSet(dartType.assignOps(tp));
+ if (assignOp == null) {
+ throw 'No assign operation for ${tp.name}';
+ }
emitLn('', newline: false);
+ // Emit a variable of the lhs type.
final emittedVar = emitVar(0, tp, isLhs: true);
RhsFilter rhsFilter = RhsFilter.fromDartType(tp, emittedVar);
- final assignOp = emitAssignOp(tp);
if ({'*=', '+='}.contains(assignOp)) {
rhsFilter?.consume();
}
- emitExpr(0, tp, rhsFilter: rhsFilter);
+ emit(" $assignOp ");
+ // Select one of the possible rhs types for the given lhs type and assign
+ // operation.
+ DartType rhsType = oneOfSet(dartType.assignOpRhs(tp, assignOp));
+ if (rhsType == null) {
+ throw 'No rhs type for assign ${tp.name} $assignOp';
+ }
+
+ // We need to avoid cases of "abcde" *= large number in loops.
+ if (assignOp == "*=" && tp == DartType.STRING && rhsType == DartType.INT) {
+ emitSmallPositiveInt();
+ } else {
+ // Emit an expression for the right hand side.
+ emitExpr(0, rhsType, rhsFilter: rhsFilter);
+ }
emit(';', newline: true);
return true;
}
// Emit a print statement.
bool emitPrint() {
- DartType tp = getType();
+ DartType tp = oneOfSet(dartType.allTypes);
emitLn('print(', newline: false);
emitExpr(0, tp);
emit(');', newline: true);
@@ -653,7 +677,7 @@
// Emit a throw statement.
bool emitThrow() {
- DartType tp = getType();
+ DartType tp = oneOfSet(dartType.allTypes);
emitLn('throw ', newline: false);
emitExpr(0, tp);
emit(';', newline: true);
@@ -710,14 +734,21 @@
// Emit a simple membership for-in-loop.
bool emitForIn(int depth) {
final int i = localVars.length;
- emitLn('for (int $localName$i in ', newline: false);
+ // Select one iterable type to be used in 'for in' statement.
+ final iterType = oneOfSet(dartType.iterableTypes1);
+ // Get the element type contained within the iterable type.
+ final elementType = dartType.elementType(iterType);
+ if (elementType == null) {
+ throw 'No element type for iteration type ${iterType.name}';
+ }
+ emitLn('for (${elementType.name} $localName$i in ', newline: false);
localVars.add(null); // declared, but don't use
- emitExpr(0, rand.nextBool() ? DartType.INT_LIST : DartType.INT_SET);
+ emitExpr(0, iterType);
localVars.removeLast(); // will get type
emit(') {', newline: true);
indent += 2;
nest++;
- localVars.add(DartType.INT);
+ localVars.add(elementType);
emitStatements(depth + 1);
localVars.removeLast();
nest--;
@@ -731,15 +762,19 @@
final int i = localVars.length;
final int j = i + 1;
emitLn("", newline: false);
- final emittedVar = emitScalarVar(DartType.INT_STRING_MAP, isLhs: false);
+ // Select one map type to be used in forEach loop.
+ final mapType = oneOfSet(dartType.mapTypes);
+ final emittedVar = emitScalarVar(mapType, isLhs: false);
iterVars.add(emittedVar);
emit('.forEach(($localName$i, $localName$j) {\n');
indent += 2;
final int nestTmp = nest;
// Reset, since forEach cannot break out of own or enclosing context.
nest = 0;
- localVars.add(DartType.INT);
- localVars.add(DartType.STRING);
+ // Get the type of the map key and add it to the local variables.
+ localVars.add(dartType.indexType(mapType));
+ // Get the type of the map values and add it to the local variables.
+ localVars.add(dartType.elementType(mapType));
emitStatements(depth + 1);
localVars.removeLast();
localVars.removeLast();
@@ -837,7 +872,7 @@
// Emit a new program scope that introduces a new local variable.
bool emitScope(int depth) {
- DartType tp = getType();
+ DartType tp = oneOfSet(dartType.allTypes);
final int i = localVars.length;
emitLn('{ ${tp.name} $localName$i = ', newline: false);
localVars.add(null); // declared, but don't use
@@ -970,7 +1005,7 @@
emitSmallNegativeInt();
break;
default:
- emit('${oneOf(DartFuzzValues.interestingIntegers)}');
+ emit('${oneOf(interestingIntegers)}');
break;
}
}
@@ -979,15 +1014,26 @@
emit('${rand.nextDouble()}');
}
+ void emitNum({bool smallPositiveValue = false}) {
+ if (!fp || rand.nextInt(2) == 0) {
+ if (smallPositiveValue) {
+ emitSmallPositiveInt();
+ } else {
+ emitInt();
+ }
+ } else {
+ emitDouble();
+ }
+ }
+
void emitChar() {
switch (rand.nextInt(10)) {
// Favors regular char.
case 0:
- emit(oneOf(DartFuzzValues.interestingChars));
+ emit(oneOf(interestingChars));
break;
default:
- emit(DartFuzzValues
- .regularChars[rand.nextInt(DartFuzzValues.regularChars.length)]);
+ emit(regularChars[rand.nextInt(regularChars.length)]);
break;
}
}
@@ -1001,6 +1047,8 @@
}
void emitElementExpr(int depth, DartType tp, {RhsFilter rhsFilter}) {
+ // This check determines whether we are emitting a global variable.
+ // I.e. whenever we are not currently emitting part of a class.
if (currentMethod != null) {
emitExpr(depth, tp, rhsFilter: rhsFilter);
} else {
@@ -1009,18 +1057,39 @@
}
void emitElement(int depth, DartType tp, {RhsFilter rhsFilter}) {
- if (tp == DartType.INT_STRING_MAP) {
- emitSmallPositiveInt();
+ // Get the element type contained in type tp.
+ // E.g. element type of List<String> is String.
+ final elementType = dartType.elementType(tp);
+ // Decide whether we need to generate Map or List/Set type elements.
+ if (DartType.isMapType(tp)) {
+ // Emit construct for the map key type.
+ final indexType = dartType.indexType(tp);
+ // This check determines whether we are emitting a global variable.
+ // I.e. whenever we are not currently emitting part of a class.
+ if (currentMethod != null) {
+ emitExpr(depth, indexType, rhsFilter: rhsFilter);
+ } else {
+ emitLiteral(depth, indexType, rhsFilter: rhsFilter);
+ }
emit(' : ');
- emitElementExpr(depth, DartType.STRING, rhsFilter: rhsFilter);
+ // Emit construct for the map value type.
+ emitElementExpr(depth, elementType, rhsFilter: rhsFilter);
} else {
- emitElementExpr(depth, DartType.INT, rhsFilter: rhsFilter);
+ // List and Set types.
+ emitElementExpr(depth, elementType, rhsFilter: rhsFilter);
}
}
void emitCollectionElement(int depth, DartType tp, {RhsFilter rhsFilter}) {
int r = depth <= exprDepth ? rand.nextInt(10) : 10;
- switch (r + 3) {
+ // TODO (felih): disable complex collection constructs for new types for
+ // now.
+ if (!{DartType.MAP_INT_STRING, DartType.LIST_INT, DartType.SET_INT}
+ .contains(tp)) {
+ emitElement(depth, tp, rhsFilter: rhsFilter);
+ return;
+ }
+ switch (r) {
// Favors elements over control-flow collections.
case 0:
// TODO (ajcbik): Remove restriction once compiler is fixed.
@@ -1044,6 +1113,8 @@
case 2:
{
final int i = localVars.length;
+ // TODO (felih): update to use new type system. Add types like
+ // LIST_STRING etc.
emit('for (int $localName$i ');
// For-loop (induction, list, set).
localVars.add(null); // declared, but don't use
@@ -1055,13 +1126,13 @@
break;
case 1:
emit('in ');
- emitCollection(depth + 1, DartType.INT_LIST,
+ emitCollection(depth + 1, DartType.LIST_INT,
rhsFilter: rhsFilter);
emit(') ');
break;
default:
emit('in ');
- emitCollection(depth + 1, DartType.INT_SET, rhsFilter: rhsFilter);
+ emitCollection(depth + 1, DartType.SET_INT, rhsFilter: rhsFilter);
emit(') ');
break;
}
@@ -1082,18 +1153,22 @@
}
void emitCollection(int depth, DartType tp, {RhsFilter rhsFilter}) {
- emit(tp == DartType.INT_LIST ? '[ ' : '{ ');
- for (int i = 0, n = 1 + rand.nextInt(8); i < n; i++) {
+ // Collection length decreases as depth increases.
+ int collectionLength = max(1, 8 - depth);
+ emit(DartType.isListType(tp) ? '[ ' : '{ ');
+ for (int i = 0, n = 1 + rand.nextInt(collectionLength); i < n; i++) {
emitCollectionElement(depth, tp, rhsFilter: rhsFilter);
if (i != (n - 1)) {
emit(', ');
}
}
- emit(tp == DartType.INT_LIST ? ' ]' : ' }');
+ emit(DartType.isListType(tp) ? ' ]' : ' }');
}
void emitLiteral(int depth, DartType tp,
{bool smallPositiveValue = false, RhsFilter rhsFilter}) {
+ // Randomly specialize interface if possible. E.g. num to int.
+ tp = maybeSpecializeInterface(tp);
if (tp == DartType.BOOL) {
emitBool();
} else if (tp == DartType.INT) {
@@ -1104,20 +1179,70 @@
}
} else if (tp == DartType.DOUBLE) {
emitDouble();
+ } else if (tp == DartType.NUM) {
+ emitNum(smallPositiveValue: smallPositiveValue);
} else if (tp == DartType.STRING) {
emitString();
- } else if (tp == DartType.INT_LIST ||
- tp == DartType.INT_SET ||
- tp == DartType.INT_STRING_MAP) {
+ } else if (dartType.constructors(tp).isNotEmpty) {
+ // Constructors serve as literals for non trivially constructable types.
+ // Important note: We have to test for existence of a non trivial
+ // constructor before testing for list type assiciation, since some types
+ // like ListInt32 are of list type but can not be constructed
+ // from a literal.
+ emitConstructorOrLiteral(depth + 1, tp, rhsFilter: rhsFilter);
+ } else if (DartType.isCollectionType(tp)) {
final resetExprStmt = processExprOpen(tp);
- emitCollection(depth, tp, rhsFilter: RhsFilter.cloneEmpty(rhsFilter));
+ emitCollection(depth + 1, tp, rhsFilter: rhsFilter);
processExprClose(resetExprStmt);
} else {
- assert(false);
+ throw 'Can not emit literal for type ${tp.name}';
+ }
+ }
+
+ // Emit a constructor for a type, this can either be a trivial constructor
+ // (i.e. parsed from a literal) or an actual function invocation.
+ void emitConstructorOrLiteral(int depth, DartType tp, {RhsFilter rhsFilter}) {
+ // If there is at least one non trivial constructor for the type tp
+ // select one of these constructors.
+ if (dartType.hasConstructor(tp)) {
+ String constructor = oneOfSet(dartType.constructors(tp));
+ // There are two types of constructors, named constructors and 'empty'
+ // constructors (e.g. X.fromList(...) and new X(...) respectively).
+ // Empty constructors are invoked with new + type name, non-empty
+ // constructors are static functions of the type.
+ if (!constructor.isEmpty) {
+ emit('${tp.name}');
+ emit('.${constructor}');
+ } else {
+ emit('new ${tp.name}');
+ }
+ emit('(');
+ // Iterate over constructor parameters.
+ List<DartType> constructorParameters =
+ dartType.constructorParameters(tp, constructor);
+ if (constructorParameters == null) {
+ throw 'No constructor parameters for ${tp.name}.$constructor';
+ }
+ for (int i = 0, n = constructorParameters.length; i < n; ++i) {
+ // If we are emitting a constructor parameter, we want to use small
+ // values to avoid programs that run out of memory.
+ // TODO (felih): maybe allow occasionally?
+ emitLiteral(depth + 1, constructorParameters[i],
+ smallPositiveValue: true, rhsFilter: rhsFilter);
+ if (i != n - 1) {
+ emit(", ");
+ }
+ }
+ emit(')');
+ } else {
+ // Otherwise type can be constructed from a literal.
+ emitLiteral(depth + 1, tp, rhsFilter: rhsFilter);
}
}
String emitScalarVar(DartType tp, {bool isLhs = false, RhsFilter rhsFilter}) {
+ // Randomly specialize interface type, unless emitting left hand side.
+ if (!isLhs) tp = maybeSpecializeInterface(tp);
// Collect all choices from globals, fields, locals, and parameters.
Set<String> choices = <String>{};
for (int i = 0; i < globalVars.length; i++) {
@@ -1156,7 +1281,7 @@
if (cleanChoices.isNotEmpty) {
choices = cleanChoices;
} else if (!isLhs) {
- // If we are emitting an RHS variable, we can emit a terminal.
+ // If we are emitting an rhs variable, we can emit a terminal.
// note that if the variable type is a collection, this might
// still result in a recursion.
emitLiteral(0, tp);
@@ -1179,17 +1304,17 @@
String emitSubscriptedVar(int depth, DartType tp,
{bool isLhs = false, RhsFilter rhsFilter}) {
String ret;
- if (tp == DartType.INT) {
- ret =
- emitScalarVar(DartType.INT_LIST, isLhs: isLhs, rhsFilter: rhsFilter);
+ // Check if type tp is an indexable element of some other type.
+ if (dartType.isIndexableElementType(tp)) {
+ // Select a list or map type that contains elements of type tp.
+ final iterType = oneOfSet(dartType.indexableElementTypes(tp));
+ // Get the index type for the respective list or map type.
+ final indexType = dartType.indexType(iterType);
+ // Emit a variable of the selected list or map type.
+ ret = emitScalarVar(iterType, isLhs: isLhs, rhsFilter: rhsFilter);
emit('[');
- emitExpr(depth + 1, DartType.INT);
- emit(']');
- } else if (tp == DartType.STRING) {
- ret = emitScalarVar(DartType.INT_STRING_MAP,
- isLhs: isLhs, rhsFilter: rhsFilter);
- emit('[');
- emitExpr(depth + 1, DartType.INT);
+ // Emit an expression resolving into the index type.
+ emitExpr(depth + 1, indexType);
emit(']');
} else {
ret = emitScalarVar(tp,
@@ -1235,36 +1360,55 @@
// Emit expression with unary operator: (~(x))
void emitUnaryExpr(int depth, DartType tp, {RhsFilter rhsFilter}) {
- if (tp == DartType.BOOL || tp == DartType.INT || tp == DartType.DOUBLE) {
- emit('(');
- emitUnaryOp(tp);
- emit('(');
- emitExpr(depth + 1, tp, rhsFilter: rhsFilter);
- emit('))');
- } else {
- emitTerminal(depth, tp, rhsFilter: rhsFilter); // resort to terminal
+ if (dartType.uniOps(tp).isEmpty) {
+ return emitTerminal(depth, tp, rhsFilter: rhsFilter);
}
+ emit('(');
+ emit(oneOfSet(dartType.uniOps(tp)));
+ emit('(');
+ emitExpr(depth + 1, tp, rhsFilter: rhsFilter);
+ emit('))');
}
// Emit expression with binary operator: (x + y)
void emitBinaryExpr(int depth, DartType tp, {RhsFilter rhsFilter}) {
- if (tp == DartType.BOOL) {
- // For boolean, allow type switch with relational op.
- if (rand.nextInt(2) == 0) {
- DartType deeper_tp = getType();
- emit('(');
- emitExpr(depth + 1, deeper_tp, rhsFilter: rhsFilter);
- emitRelOp(deeper_tp);
- emitExpr(depth + 1, deeper_tp, rhsFilter: rhsFilter);
- emit(')');
- return;
- }
+ if (dartType.binOps(tp).isEmpty) {
+ return emitLiteral(depth, tp);
}
- emit('(');
- emitExpr(depth + 1, tp, rhsFilter: rhsFilter);
- emitBinaryOp(tp);
- emitExpr(depth + 1, tp, rhsFilter: rhsFilter);
- emit(')');
+
+ String binop = oneOfSet(dartType.binOps(tp));
+ List<DartType> binOpParams = oneOfSet(dartType.binOpParameters(tp, binop));
+
+ // Avoid recursive assignments of the form a = a * 100.
+ if (binop == "*") {
+ rhsFilter?.consume();
+ }
+
+ // Reduce the number of operations of type growable * large value
+ // as these might lead to timeouts and/or oom errors.
+ if (binop == "*" &&
+ DartType.isGrowableType(binOpParams[0]) &&
+ dartType.isInterfaceOfType(binOpParams[1], DartType.NUM)) {
+ emit('(');
+ emitExpr(depth + 1, binOpParams[0], rhsFilter: rhsFilter);
+ emit(' $binop ');
+ emitLiteral(depth + 1, binOpParams[1], smallPositiveValue: true);
+ emit(')');
+ } else if (binop == "*" &&
+ DartType.isGrowableType(binOpParams[1]) &&
+ dartType.isInterfaceOfType(binOpParams[0], DartType.NUM)) {
+ emit('(');
+ emitLiteral(depth + 1, binOpParams[0], smallPositiveValue: true);
+ emit(' $binop ');
+ emitExpr(depth + 1, binOpParams[1], rhsFilter: rhsFilter);
+ emit(')');
+ } else {
+ emit('(');
+ emitExpr(depth + 1, binOpParams[0], rhsFilter: rhsFilter);
+ emit(' $binop ');
+ emitExpr(depth + 1, binOpParams[1], rhsFilter: rhsFilter);
+ emit(')');
+ }
}
// Emit expression with ternary operator: (b ? x : y)
@@ -1295,7 +1439,13 @@
// Emit library call.
void emitLibraryCall(int depth, DartType tp, {RhsFilter rhsFilter}) {
DartLib lib = getLibraryMethod(tp);
- final String proto = lib.proto;
+ if (lib == null) {
+ // no matching lib: resort to literal.
+ emitLiteral(depth + 1, tp, rhsFilter: rhsFilter);
+ return;
+ }
+ emit('(');
+ String proto = lib.proto;
// Receiver.
if (proto[0] != 'V') {
emit('(');
@@ -1317,6 +1467,11 @@
}
emit(')');
}
+ // Add cast to avoid error of double or int being interpreted as num.
+ if (dartType.isInterfaceOfType(tp, DartType.NUM)) {
+ emit(' as ${tp.name}');
+ }
+ emit(')');
}
// Emit call to a specific method.
@@ -1422,77 +1577,6 @@
// Operators.
//
- // Emit same type in-out assignment operator.
- String emitAssignOp(DartType tp) {
- if (tp == DartType.INT) {
- final assignOp = oneOf(const <String>[
- ' += ',
- ' -= ',
- ' *= ',
- ' ~/= ',
- ' %= ',
- ' &= ',
- ' |= ',
- ' ^= ',
- ' >>= ',
- ' <<= ',
- ' ??= ',
- ' = '
- ]);
- emit(assignOp);
- return assignOp;
- } else if (tp == DartType.DOUBLE) {
- final assignOp =
- oneOf(const <String>[' += ', ' -= ', ' *= ', ' /= ', ' ??= ', ' = ']);
- emit(assignOp);
- return assignOp;
- } else {
- final assignOp = oneOf(const <String>[' ??= ', ' = ']);
- emit(assignOp);
- return assignOp;
- }
- }
-
- // Emit same type in-out unary operator.
- void emitUnaryOp(DartType tp) {
- if (tp == DartType.BOOL) {
- emit('!');
- } else if (tp == DartType.INT) {
- emit(oneOf(const <String>['-', '~']));
- } else if (tp == DartType.DOUBLE) {
- emit('-');
- } else {
- assert(false);
- }
- }
-
- // Emit same type in-out binary operator.
- void emitBinaryOp(DartType tp) {
- if (tp == DartType.BOOL) {
- emit(oneOf(const <String>[' && ', ' || ']));
- } else if (tp == DartType.INT) {
- emit(oneOf(const <String>[
- ' + ',
- ' - ',
- ' * ',
- ' ~/ ',
- ' % ',
- ' & ',
- ' | ',
- ' ^ ',
- ' >> ',
- ' << ',
- ' ?? '
- ]));
- } else if (tp == DartType.DOUBLE) {
- emit(oneOf(const <String>[' + ', ' - ', ' * ', ' / ', ' ?? ']));
- } else if (tp == DartType.STRING || tp == DartType.INT_LIST) {
- emit(oneOf(const <String>[' + ', ' ?? ']));
- } else {
- emit(' ?? ');
- }
- }
-
// Emit same type in-out increment operator.
void emitPreOrPostOp(DartType tp) {
if (tp == DartType.INT) {
@@ -1524,15 +1608,16 @@
} else if (tp == DartType.DOUBLE) {
return oneOf(api.doubleLibs);
} else if (tp == DartType.STRING) {
- return oneOf(api.stringLibs);
- } else if (tp == DartType.INT_LIST) {
- return oneOf(api.listLibs);
- } else if (tp == DartType.INT_SET) {
- return oneOf(api.setLibs);
- } else if (tp == DartType.INT_STRING_MAP) {
- return oneOf(api.mapLibs);
+ return oneOf(DartLib.stringLibs);
+ } else if (tp == DartType.LIST_INT) {
+ return oneOf(DartLib.listLibs);
+ } else if (tp == DartType.SET_INT) {
+ return oneOf(DartLib.setLibs);
+ } else if (tp == DartType.MAP_INT_STRING) {
+ return oneOf(DartLib.mapLibs);
}
- throw ArgumentError('Invalid DartType: $tp');
+ // No library method available that returns this type.
+ return null;
}
// Emit a library argument, possibly subject to restrictions.
@@ -1557,13 +1642,13 @@
emitString(length: 2);
break;
case 'L':
- emitExpr(depth, DartType.INT_LIST, rhsFilter: rhsFilter);
+ emitExpr(depth, DartType.LIST_INT, rhsFilter: rhsFilter);
break;
case 'X':
- emitExpr(depth, DartType.INT_SET, rhsFilter: rhsFilter);
+ emitExpr(depth, DartType.SET_INT, rhsFilter: rhsFilter);
break;
case 'M':
- emitExpr(depth, DartType.INT_STRING_MAP, rhsFilter: rhsFilter);
+ emitExpr(depth, DartType.MAP_INT_STRING, rhsFilter: rhsFilter);
break;
default:
throw ArgumentError('Invalid p value: $p');
@@ -1573,34 +1658,13 @@
//
// Types.
//
-
- // Get a random value type.
- DartType getType() {
- switch (rand.nextInt(7)) {
- case 0:
- return DartType.BOOL;
- case 1:
- return DartType.INT;
- case 2:
- return fp ? DartType.DOUBLE : DartType.INT;
- case 3:
- return DartType.STRING;
- case 4:
- return DartType.INT_LIST;
- case 5:
- return DartType.INT_SET;
- default:
- return DartType.INT_STRING_MAP;
- }
- }
-
List<DartType> fillTypes1({int limit = 4, bool isFfi = false}) {
final list = <DartType>[];
for (int i = 0, n = 1 + rand.nextInt(limit); i < n; i++) {
if (isFfi) {
list.add(fp ? oneOf([DartType.INT, DartType.DOUBLE]) : DartType.INT);
} else {
- list.add(getType());
+ list.add(oneOfSet(dartType.allTypes));
}
}
return list;
@@ -1692,6 +1756,10 @@
return choices[rand.nextInt(choices.length)];
}
+ T oneOfSet<T>(Set<T> choices) {
+ return choices.elementAt(rand.nextInt(choices.length));
+ }
+
// Special return code to handle oom errors.
static const oomExitCode = 254;
@@ -1704,6 +1772,9 @@
// Enables FFI method calls.
final bool ffi;
+ // Disables nested types.
+ final bool flatTp;
+
// File used for output.
final RandomAccessFile file;
@@ -1717,6 +1788,9 @@
int currentClass;
int currentMethod;
+ // DartType instance.
+ DartType dartType;
+
// Types of local variables currently in scope.
List<DartType> localVars;
@@ -1753,6 +1827,56 @@
bool skipExprCntr;
int stmtCntr;
int exprCntr;
+
+ // Interesting characters.
+ static const List<String> interestingChars = [
+ '\\u2665',
+ '\\u{1f600}', // rune
+ ];
+
+ // Regular characters.
+ static const regularChars =
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#&()+- ';
+
+ // Interesting integer values.
+ static const List<int> interestingIntegers = [
+ 0x0000000000000000,
+ 0x0000000000000001,
+ 0x000000007fffffff,
+ 0x0000000080000000,
+ 0x0000000080000001,
+ 0x00000000ffffffff,
+ 0x0000000100000000,
+ 0x0000000100000001,
+ 0x000000017fffffff,
+ 0x0000000180000000,
+ 0x0000000180000001,
+ 0x00000001ffffffff,
+ 0x7fffffff00000000,
+ 0x7fffffff00000001,
+ 0x7fffffff7fffffff,
+ 0x7fffffff80000000,
+ 0x7fffffff80000001,
+ 0x7fffffffffffffff,
+ 0x8000000000000000,
+ 0x8000000000000001,
+ 0x800000007fffffff,
+ 0x8000000080000000,
+ 0x8000000080000001,
+ 0x80000000ffffffff,
+ 0x8000000100000000,
+ 0x8000000100000001,
+ 0x800000017fffffff,
+ 0x8000000180000000,
+ 0x8000000180000001,
+ 0x80000001ffffffff,
+ 0xffffffff00000000,
+ 0xffffffff00000001,
+ 0xffffffff7fffffff,
+ 0xffffffff80000000,
+ 0xffffffff80000001,
+ 0xffffffffffffffff
+ ];
}
// Generate seed. By default (no user-defined nonzero seed given),
@@ -1777,6 +1901,8 @@
..addFlag('fp', help: 'enables floating-point operations', defaultsTo: true)
..addFlag('ffi',
help: 'enables FFI method calls (default: off)', defaultsTo: false)
+ ..addFlag('flat',
+ help: 'enables flat types (default: off)', defaultsTo: false)
// Minimization mode extensions.
..addFlag('mini',
help: 'enables minimization mode (default: off)', defaultsTo: false)
@@ -1793,11 +1919,12 @@
final seed = getSeed(results['seed']);
final fp = results['fp'];
final ffi = results['ffi'];
+ final flatTp = results['flat'];
final file = File(results.rest.single).openSync(mode: FileMode.write);
final minimize = results['mini'];
final smask = BigInt.parse(results['smask']);
final emask = BigInt.parse(results['emask']);
- final dartFuzz = DartFuzz(seed, fp, ffi, file,
+ final dartFuzz = DartFuzz(seed, fp, ffi, flatTp, file,
minimize: minimize, smask: smask, emask: emask);
dartFuzz.run();
file.closeSync();
diff --git a/runtime/tools/dartfuzz/dartfuzz_api_table.dart b/runtime/tools/dartfuzz/dartfuzz_api_table.dart
index d516218..26e4852 100644
--- a/runtime/tools/dartfuzz/dartfuzz_api_table.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_api_table.dart
@@ -33,761 +33,761 @@
const DartLib(this.name, this.proto);
static const boolLibs = [
+ DartLib('NetworkInterface.listSupported', 'Vv'),
+ DartLib('SecurityContext.alpnSupported', 'Vv'),
+ DartLib('add', 'XI'),
DartLib('bool.fromEnvironment', 'VS'),
- DartLib('isEven', 'Iv'),
- DartLib('isOdd', 'Iv'),
+ DartLib('endsWith', 'SS'),
DartLib('isEmpty', 'Mv'),
- DartLib('isNotEmpty', 'Mv'),
+ DartLib('isEmpty', 'Sv'),
+ DartLib('isEven', 'Iv'),
+ DartLib('isFinite', 'Dv'),
+ DartLib('isInfinite', 'Dv'),
DartLib('isNaN', 'Dv'),
DartLib('isNegative', 'Dv'),
- DartLib('isInfinite', 'Dv'),
- DartLib('isFinite', 'Dv'),
- DartLib('add', 'XI'),
- DartLib('endsWith', 'SS'),
- DartLib('isEmpty', 'Sv'),
+ DartLib('isNotEmpty', 'Mv'),
DartLib('isNotEmpty', 'Sv'),
- DartLib('SecurityContext.alpnSupported', 'Vv'),
- DartLib('NetworkInterface.listSupported', 'Vv'),
+ DartLib('isOdd', 'Iv'),
];
static const intLibs = [
- DartLib('JsonUtf8Encoder.DEFAULT_BUFFER_SIZE', 'Vv'),
- DartLib('unicodeReplacementCharacterRune', 'Vv'),
- DartLib('unicodeBomCharacterRune', 'Vv'),
+ DartLib('DateTime.april', 'Vv'),
+ DartLib('DateTime.august', 'Vv'),
+ DartLib('DateTime.daysPerWeek', 'Vv'),
+ DartLib('DateTime.december', 'Vv'),
+ DartLib('DateTime.february', 'Vv'),
+ DartLib('DateTime.friday', 'Vv'),
+ DartLib('DateTime.january', 'Vv'),
+ DartLib('DateTime.july', 'Vv'),
+ DartLib('DateTime.june', 'Vv'),
+ DartLib('DateTime.march', 'Vv'),
+ DartLib('DateTime.may', 'Vv'),
DartLib('DateTime.monday', 'Vv'),
+ DartLib('DateTime.monthsPerYear', 'Vv'),
+ DartLib('DateTime.november', 'Vv'),
+ DartLib('DateTime.october', 'Vv'),
+ DartLib('DateTime.saturday', 'Vv'),
+ DartLib('DateTime.september', 'Vv'),
+ DartLib('DateTime.sunday', 'Vv'),
+ DartLib('DateTime.thursday', 'Vv'),
DartLib('DateTime.tuesday', 'Vv'),
DartLib('DateTime.wednesday', 'Vv'),
- DartLib('DateTime.thursday', 'Vv'),
- DartLib('DateTime.friday', 'Vv'),
- DartLib('DateTime.saturday', 'Vv'),
- DartLib('DateTime.sunday', 'Vv'),
- DartLib('DateTime.daysPerWeek', 'Vv'),
- DartLib('DateTime.january', 'Vv'),
- DartLib('DateTime.february', 'Vv'),
- DartLib('DateTime.march', 'Vv'),
- DartLib('DateTime.april', 'Vv'),
- DartLib('DateTime.may', 'Vv'),
- DartLib('DateTime.june', 'Vv'),
- DartLib('DateTime.july', 'Vv'),
- DartLib('DateTime.august', 'Vv'),
- DartLib('DateTime.september', 'Vv'),
- DartLib('DateTime.october', 'Vv'),
- DartLib('DateTime.november', 'Vv'),
- DartLib('DateTime.december', 'Vv'),
- DartLib('DateTime.monthsPerYear', 'Vv'),
- DartLib('round', 'DV'),
- DartLib('floor', 'DV'),
- DartLib('ceil', 'DV'),
- DartLib('truncate', 'DV'),
- DartLib('Duration.microsecondsPerMillisecond', 'Vv'),
- DartLib('Duration.millisecondsPerSecond', 'Vv'),
- DartLib('Duration.secondsPerMinute', 'Vv'),
- DartLib('Duration.minutesPerHour', 'Vv'),
DartLib('Duration.hoursPerDay', 'Vv'),
- DartLib('Duration.microsecondsPerSecond', 'Vv'),
- DartLib('Duration.microsecondsPerMinute', 'Vv'),
- DartLib('Duration.microsecondsPerHour', 'Vv'),
DartLib('Duration.microsecondsPerDay', 'Vv'),
- DartLib('Duration.millisecondsPerMinute', 'Vv'),
- DartLib('Duration.millisecondsPerHour', 'Vv'),
+ DartLib('Duration.microsecondsPerHour', 'Vv'),
+ DartLib('Duration.microsecondsPerMillisecond', 'Vv'),
+ DartLib('Duration.microsecondsPerMinute', 'Vv'),
+ DartLib('Duration.microsecondsPerSecond', 'Vv'),
DartLib('Duration.millisecondsPerDay', 'Vv'),
- DartLib('Duration.secondsPerHour', 'Vv'),
- DartLib('Duration.secondsPerDay', 'Vv'),
+ DartLib('Duration.millisecondsPerHour', 'Vv'),
+ DartLib('Duration.millisecondsPerMinute', 'Vv'),
+ DartLib('Duration.millisecondsPerSecond', 'Vv'),
DartLib('Duration.minutesPerDay', 'Vv'),
- DartLib('RangeError.checkValidRange', 'VIIISSS'),
- DartLib('int.fromEnvironment', 'VS'),
- DartLib('modPow', 'III'),
- DartLib('modInverse', 'II'),
- DartLib('gcd', 'II'),
- DartLib('toUnsigned', 'II'),
- DartLib('toSigned', 'II'),
- DartLib('abs', 'IV'),
- DartLib('round', 'IV'),
- DartLib('floor', 'IV'),
- DartLib('ceil', 'IV'),
- DartLib('truncate', 'IV'),
- DartLib('int.parse', 'VS'),
- DartLib('int.tryParse', 'VS'),
- DartLib('bitLength', 'Iv'),
- DartLib('sign', 'Iv'),
- DartLib('indexOf', 'LII'),
- DartLib('lastIndexOf', 'LII'),
- DartLib('removeAt', 'LI'),
- DartLib('removeLast', 'LV'),
- DartLib('length', 'Lv'),
- DartLib('length', 'Mv'),
- DartLib('compareTo', 'DD'),
- DartLib('round', 'DV'),
- DartLib('floor', 'DV'),
- DartLib('ceil', 'DV'),
- DartLib('truncate', 'DV'),
- DartLib('toInt', 'DV'),
- DartLib('codeUnitAt', 'SI'),
- DartLib('compareTo', 'SS'),
- DartLib('length', 'Sv'),
- DartLib('OSError.noErrorCode', 'Vv'),
- DartLib('ZLibOption.minWindowBits', 'Vv'),
- DartLib('ZLibOption.MIN_WINDOW_BITS', 'Vv'),
- DartLib('ZLibOption.maxWindowBits', 'Vv'),
- DartLib('ZLibOption.MAX_WINDOW_BITS', 'Vv'),
- DartLib('ZLibOption.defaultWindowBits', 'Vv'),
- DartLib('ZLibOption.DEFAULT_WINDOW_BITS', 'Vv'),
- DartLib('ZLibOption.minLevel', 'Vv'),
- DartLib('ZLibOption.MIN_LEVEL', 'Vv'),
- DartLib('ZLibOption.maxLevel', 'Vv'),
- DartLib('ZLibOption.MAX_LEVEL', 'Vv'),
- DartLib('ZLibOption.defaultLevel', 'Vv'),
- DartLib('ZLibOption.DEFAULT_LEVEL', 'Vv'),
- DartLib('ZLibOption.minMemLevel', 'Vv'),
- DartLib('ZLibOption.MIN_MEM_LEVEL', 'Vv'),
- DartLib('ZLibOption.maxMemLevel', 'Vv'),
- DartLib('ZLibOption.MAX_MEM_LEVEL', 'Vv'),
- DartLib('ZLibOption.defaultMemLevel', 'Vv'),
- DartLib('ZLibOption.DEFAULT_MEM_LEVEL', 'Vv'),
- DartLib('ZLibOption.strategyFiltered', 'Vv'),
- DartLib('ZLibOption.STRATEGY_FILTERED', 'Vv'),
- DartLib('ZLibOption.strategyHuffmanOnly', 'Vv'),
- DartLib('ZLibOption.STRATEGY_HUFFMAN_ONLY', 'Vv'),
- DartLib('ZLibOption.strategyRle', 'Vv'),
- DartLib('ZLibOption.STRATEGY_RLE', 'Vv'),
- DartLib('ZLibOption.strategyFixed', 'Vv'),
- DartLib('ZLibOption.STRATEGY_FIXED', 'Vv'),
- DartLib('ZLibOption.strategyDefault', 'Vv'),
- DartLib('ZLibOption.STRATEGY_DEFAULT', 'Vv'),
- DartLib('RawSocketOption.levelSocket', 'Vv'),
- DartLib('RawSocketOption.levelIPv4', 'Vv'),
- DartLib('RawSocketOption.IPv4MulticastInterface', 'Vv'),
- DartLib('RawSocketOption.levelIPv6', 'Vv'),
- DartLib('RawSocketOption.IPv6MulticastInterface', 'Vv'),
- DartLib('RawSocketOption.levelTcp', 'Vv'),
- DartLib('RawSocketOption.levelUdp', 'Vv'),
- DartLib('Isolate.immediate', 'Vv'),
- DartLib('Isolate.beforeNextEvent', 'Vv'),
- DartLib('Int8List.bytesPerElement', 'Vv'),
- DartLib('Uint8List.bytesPerElement', 'Vv'),
- DartLib('Uint8ClampedList.bytesPerElement', 'Vv'),
- DartLib('Int16List.bytesPerElement', 'Vv'),
- DartLib('Uint16List.bytesPerElement', 'Vv'),
- DartLib('Int32List.bytesPerElement', 'Vv'),
- DartLib('Uint32List.bytesPerElement', 'Vv'),
- DartLib('Int64List.bytesPerElement', 'Vv'),
- DartLib('Uint64List.bytesPerElement', 'Vv'),
+ DartLib('Duration.minutesPerHour', 'Vv'),
+ DartLib('Duration.secondsPerDay', 'Vv'),
+ DartLib('Duration.secondsPerHour', 'Vv'),
+ DartLib('Duration.secondsPerMinute', 'Vv'),
DartLib('Float32List.bytesPerElement', 'Vv'),
- DartLib('Float64List.bytesPerElement', 'Vv'),
- DartLib('Float32x4List.bytesPerElement', 'Vv'),
- DartLib('Int32x4List.bytesPerElement', 'Vv'),
- DartLib('Float64x2List.bytesPerElement', 'Vv'),
- DartLib('Float32x4.xxxx', 'Vv'),
- DartLib('Float32x4.xxxy', 'Vv'),
- DartLib('Float32x4.xxxz', 'Vv'),
- DartLib('Float32x4.xxxw', 'Vv'),
- DartLib('Float32x4.xxyx', 'Vv'),
- DartLib('Float32x4.xxyy', 'Vv'),
- DartLib('Float32x4.xxyz', 'Vv'),
- DartLib('Float32x4.xxyw', 'Vv'),
- DartLib('Float32x4.xxzx', 'Vv'),
- DartLib('Float32x4.xxzy', 'Vv'),
- DartLib('Float32x4.xxzz', 'Vv'),
- DartLib('Float32x4.xxzw', 'Vv'),
- DartLib('Float32x4.xxwx', 'Vv'),
- DartLib('Float32x4.xxwy', 'Vv'),
- DartLib('Float32x4.xxwz', 'Vv'),
- DartLib('Float32x4.xxww', 'Vv'),
- DartLib('Float32x4.xyxx', 'Vv'),
- DartLib('Float32x4.xyxy', 'Vv'),
- DartLib('Float32x4.xyxz', 'Vv'),
- DartLib('Float32x4.xyxw', 'Vv'),
- DartLib('Float32x4.xyyx', 'Vv'),
- DartLib('Float32x4.xyyy', 'Vv'),
- DartLib('Float32x4.xyyz', 'Vv'),
- DartLib('Float32x4.xyyw', 'Vv'),
- DartLib('Float32x4.xyzx', 'Vv'),
- DartLib('Float32x4.xyzy', 'Vv'),
- DartLib('Float32x4.xyzz', 'Vv'),
- DartLib('Float32x4.xyzw', 'Vv'),
- DartLib('Float32x4.xywx', 'Vv'),
- DartLib('Float32x4.xywy', 'Vv'),
- DartLib('Float32x4.xywz', 'Vv'),
- DartLib('Float32x4.xyww', 'Vv'),
- DartLib('Float32x4.xzxx', 'Vv'),
- DartLib('Float32x4.xzxy', 'Vv'),
- DartLib('Float32x4.xzxz', 'Vv'),
- DartLib('Float32x4.xzxw', 'Vv'),
- DartLib('Float32x4.xzyx', 'Vv'),
- DartLib('Float32x4.xzyy', 'Vv'),
- DartLib('Float32x4.xzyz', 'Vv'),
- DartLib('Float32x4.xzyw', 'Vv'),
- DartLib('Float32x4.xzzx', 'Vv'),
- DartLib('Float32x4.xzzy', 'Vv'),
- DartLib('Float32x4.xzzz', 'Vv'),
- DartLib('Float32x4.xzzw', 'Vv'),
- DartLib('Float32x4.xzwx', 'Vv'),
- DartLib('Float32x4.xzwy', 'Vv'),
- DartLib('Float32x4.xzwz', 'Vv'),
- DartLib('Float32x4.xzww', 'Vv'),
- DartLib('Float32x4.xwxx', 'Vv'),
- DartLib('Float32x4.xwxy', 'Vv'),
- DartLib('Float32x4.xwxz', 'Vv'),
- DartLib('Float32x4.xwxw', 'Vv'),
- DartLib('Float32x4.xwyx', 'Vv'),
- DartLib('Float32x4.xwyy', 'Vv'),
- DartLib('Float32x4.xwyz', 'Vv'),
- DartLib('Float32x4.xwyw', 'Vv'),
- DartLib('Float32x4.xwzx', 'Vv'),
- DartLib('Float32x4.xwzy', 'Vv'),
- DartLib('Float32x4.xwzz', 'Vv'),
- DartLib('Float32x4.xwzw', 'Vv'),
- DartLib('Float32x4.xwwx', 'Vv'),
- DartLib('Float32x4.xwwy', 'Vv'),
- DartLib('Float32x4.xwwz', 'Vv'),
- DartLib('Float32x4.xwww', 'Vv'),
- DartLib('Float32x4.yxxx', 'Vv'),
- DartLib('Float32x4.yxxy', 'Vv'),
- DartLib('Float32x4.yxxz', 'Vv'),
- DartLib('Float32x4.yxxw', 'Vv'),
- DartLib('Float32x4.yxyx', 'Vv'),
- DartLib('Float32x4.yxyy', 'Vv'),
- DartLib('Float32x4.yxyz', 'Vv'),
- DartLib('Float32x4.yxyw', 'Vv'),
- DartLib('Float32x4.yxzx', 'Vv'),
- DartLib('Float32x4.yxzy', 'Vv'),
- DartLib('Float32x4.yxzz', 'Vv'),
- DartLib('Float32x4.yxzw', 'Vv'),
- DartLib('Float32x4.yxwx', 'Vv'),
- DartLib('Float32x4.yxwy', 'Vv'),
- DartLib('Float32x4.yxwz', 'Vv'),
- DartLib('Float32x4.yxww', 'Vv'),
- DartLib('Float32x4.yyxx', 'Vv'),
- DartLib('Float32x4.yyxy', 'Vv'),
- DartLib('Float32x4.yyxz', 'Vv'),
- DartLib('Float32x4.yyxw', 'Vv'),
- DartLib('Float32x4.yyyx', 'Vv'),
- DartLib('Float32x4.yyyy', 'Vv'),
- DartLib('Float32x4.yyyz', 'Vv'),
- DartLib('Float32x4.yyyw', 'Vv'),
- DartLib('Float32x4.yyzx', 'Vv'),
- DartLib('Float32x4.yyzy', 'Vv'),
- DartLib('Float32x4.yyzz', 'Vv'),
- DartLib('Float32x4.yyzw', 'Vv'),
- DartLib('Float32x4.yywx', 'Vv'),
- DartLib('Float32x4.yywy', 'Vv'),
- DartLib('Float32x4.yywz', 'Vv'),
- DartLib('Float32x4.yyww', 'Vv'),
- DartLib('Float32x4.yzxx', 'Vv'),
- DartLib('Float32x4.yzxy', 'Vv'),
- DartLib('Float32x4.yzxz', 'Vv'),
- DartLib('Float32x4.yzxw', 'Vv'),
- DartLib('Float32x4.yzyx', 'Vv'),
- DartLib('Float32x4.yzyy', 'Vv'),
- DartLib('Float32x4.yzyz', 'Vv'),
- DartLib('Float32x4.yzyw', 'Vv'),
- DartLib('Float32x4.yzzx', 'Vv'),
- DartLib('Float32x4.yzzy', 'Vv'),
- DartLib('Float32x4.yzzz', 'Vv'),
- DartLib('Float32x4.yzzw', 'Vv'),
- DartLib('Float32x4.yzwx', 'Vv'),
- DartLib('Float32x4.yzwy', 'Vv'),
- DartLib('Float32x4.yzwz', 'Vv'),
- DartLib('Float32x4.yzww', 'Vv'),
- DartLib('Float32x4.ywxx', 'Vv'),
- DartLib('Float32x4.ywxy', 'Vv'),
- DartLib('Float32x4.ywxz', 'Vv'),
- DartLib('Float32x4.ywxw', 'Vv'),
- DartLib('Float32x4.ywyx', 'Vv'),
- DartLib('Float32x4.ywyy', 'Vv'),
- DartLib('Float32x4.ywyz', 'Vv'),
- DartLib('Float32x4.ywyw', 'Vv'),
- DartLib('Float32x4.ywzx', 'Vv'),
- DartLib('Float32x4.ywzy', 'Vv'),
- DartLib('Float32x4.ywzz', 'Vv'),
- DartLib('Float32x4.ywzw', 'Vv'),
- DartLib('Float32x4.ywwx', 'Vv'),
- DartLib('Float32x4.ywwy', 'Vv'),
- DartLib('Float32x4.ywwz', 'Vv'),
- DartLib('Float32x4.ywww', 'Vv'),
- DartLib('Float32x4.zxxx', 'Vv'),
- DartLib('Float32x4.zxxy', 'Vv'),
- DartLib('Float32x4.zxxz', 'Vv'),
- DartLib('Float32x4.zxxw', 'Vv'),
- DartLib('Float32x4.zxyx', 'Vv'),
- DartLib('Float32x4.zxyy', 'Vv'),
- DartLib('Float32x4.zxyz', 'Vv'),
- DartLib('Float32x4.zxyw', 'Vv'),
- DartLib('Float32x4.zxzx', 'Vv'),
- DartLib('Float32x4.zxzy', 'Vv'),
- DartLib('Float32x4.zxzz', 'Vv'),
- DartLib('Float32x4.zxzw', 'Vv'),
- DartLib('Float32x4.zxwx', 'Vv'),
- DartLib('Float32x4.zxwy', 'Vv'),
- DartLib('Float32x4.zxwz', 'Vv'),
- DartLib('Float32x4.zxww', 'Vv'),
- DartLib('Float32x4.zyxx', 'Vv'),
- DartLib('Float32x4.zyxy', 'Vv'),
- DartLib('Float32x4.zyxz', 'Vv'),
- DartLib('Float32x4.zyxw', 'Vv'),
- DartLib('Float32x4.zyyx', 'Vv'),
- DartLib('Float32x4.zyyy', 'Vv'),
- DartLib('Float32x4.zyyz', 'Vv'),
- DartLib('Float32x4.zyyw', 'Vv'),
- DartLib('Float32x4.zyzx', 'Vv'),
- DartLib('Float32x4.zyzy', 'Vv'),
- DartLib('Float32x4.zyzz', 'Vv'),
- DartLib('Float32x4.zyzw', 'Vv'),
- DartLib('Float32x4.zywx', 'Vv'),
- DartLib('Float32x4.zywy', 'Vv'),
- DartLib('Float32x4.zywz', 'Vv'),
- DartLib('Float32x4.zyww', 'Vv'),
- DartLib('Float32x4.zzxx', 'Vv'),
- DartLib('Float32x4.zzxy', 'Vv'),
- DartLib('Float32x4.zzxz', 'Vv'),
- DartLib('Float32x4.zzxw', 'Vv'),
- DartLib('Float32x4.zzyx', 'Vv'),
- DartLib('Float32x4.zzyy', 'Vv'),
- DartLib('Float32x4.zzyz', 'Vv'),
- DartLib('Float32x4.zzyw', 'Vv'),
- DartLib('Float32x4.zzzx', 'Vv'),
- DartLib('Float32x4.zzzy', 'Vv'),
- DartLib('Float32x4.zzzz', 'Vv'),
- DartLib('Float32x4.zzzw', 'Vv'),
- DartLib('Float32x4.zzwx', 'Vv'),
- DartLib('Float32x4.zzwy', 'Vv'),
- DartLib('Float32x4.zzwz', 'Vv'),
- DartLib('Float32x4.zzww', 'Vv'),
- DartLib('Float32x4.zwxx', 'Vv'),
- DartLib('Float32x4.zwxy', 'Vv'),
- DartLib('Float32x4.zwxz', 'Vv'),
- DartLib('Float32x4.zwxw', 'Vv'),
- DartLib('Float32x4.zwyx', 'Vv'),
- DartLib('Float32x4.zwyy', 'Vv'),
- DartLib('Float32x4.zwyz', 'Vv'),
- DartLib('Float32x4.zwyw', 'Vv'),
- DartLib('Float32x4.zwzx', 'Vv'),
- DartLib('Float32x4.zwzy', 'Vv'),
- DartLib('Float32x4.zwzz', 'Vv'),
- DartLib('Float32x4.zwzw', 'Vv'),
- DartLib('Float32x4.zwwx', 'Vv'),
- DartLib('Float32x4.zwwy', 'Vv'),
- DartLib('Float32x4.zwwz', 'Vv'),
- DartLib('Float32x4.zwww', 'Vv'),
- DartLib('Float32x4.wxxx', 'Vv'),
- DartLib('Float32x4.wxxy', 'Vv'),
- DartLib('Float32x4.wxxz', 'Vv'),
- DartLib('Float32x4.wxxw', 'Vv'),
- DartLib('Float32x4.wxyx', 'Vv'),
- DartLib('Float32x4.wxyy', 'Vv'),
- DartLib('Float32x4.wxyz', 'Vv'),
- DartLib('Float32x4.wxyw', 'Vv'),
- DartLib('Float32x4.wxzx', 'Vv'),
- DartLib('Float32x4.wxzy', 'Vv'),
- DartLib('Float32x4.wxzz', 'Vv'),
- DartLib('Float32x4.wxzw', 'Vv'),
- DartLib('Float32x4.wxwx', 'Vv'),
- DartLib('Float32x4.wxwy', 'Vv'),
- DartLib('Float32x4.wxwz', 'Vv'),
- DartLib('Float32x4.wxww', 'Vv'),
- DartLib('Float32x4.wyxx', 'Vv'),
- DartLib('Float32x4.wyxy', 'Vv'),
- DartLib('Float32x4.wyxz', 'Vv'),
- DartLib('Float32x4.wyxw', 'Vv'),
- DartLib('Float32x4.wyyx', 'Vv'),
- DartLib('Float32x4.wyyy', 'Vv'),
- DartLib('Float32x4.wyyz', 'Vv'),
- DartLib('Float32x4.wyyw', 'Vv'),
- DartLib('Float32x4.wyzx', 'Vv'),
- DartLib('Float32x4.wyzy', 'Vv'),
- DartLib('Float32x4.wyzz', 'Vv'),
- DartLib('Float32x4.wyzw', 'Vv'),
- DartLib('Float32x4.wywx', 'Vv'),
- DartLib('Float32x4.wywy', 'Vv'),
- DartLib('Float32x4.wywz', 'Vv'),
- DartLib('Float32x4.wyww', 'Vv'),
- DartLib('Float32x4.wzxx', 'Vv'),
- DartLib('Float32x4.wzxy', 'Vv'),
- DartLib('Float32x4.wzxz', 'Vv'),
- DartLib('Float32x4.wzxw', 'Vv'),
- DartLib('Float32x4.wzyx', 'Vv'),
- DartLib('Float32x4.wzyy', 'Vv'),
- DartLib('Float32x4.wzyz', 'Vv'),
- DartLib('Float32x4.wzyw', 'Vv'),
- DartLib('Float32x4.wzzx', 'Vv'),
- DartLib('Float32x4.wzzy', 'Vv'),
- DartLib('Float32x4.wzzz', 'Vv'),
- DartLib('Float32x4.wzzw', 'Vv'),
- DartLib('Float32x4.wzwx', 'Vv'),
- DartLib('Float32x4.wzwy', 'Vv'),
- DartLib('Float32x4.wzwz', 'Vv'),
- DartLib('Float32x4.wzww', 'Vv'),
- DartLib('Float32x4.wwxx', 'Vv'),
- DartLib('Float32x4.wwxy', 'Vv'),
- DartLib('Float32x4.wwxz', 'Vv'),
- DartLib('Float32x4.wwxw', 'Vv'),
- DartLib('Float32x4.wwyx', 'Vv'),
- DartLib('Float32x4.wwyy', 'Vv'),
- DartLib('Float32x4.wwyz', 'Vv'),
- DartLib('Float32x4.wwyw', 'Vv'),
- DartLib('Float32x4.wwzx', 'Vv'),
- DartLib('Float32x4.wwzy', 'Vv'),
- DartLib('Float32x4.wwzz', 'Vv'),
- DartLib('Float32x4.wwzw', 'Vv'),
+ DartLib('Float32x4.wwww', 'Vv'),
DartLib('Float32x4.wwwx', 'Vv'),
DartLib('Float32x4.wwwy', 'Vv'),
DartLib('Float32x4.wwwz', 'Vv'),
- DartLib('Float32x4.wwww', 'Vv'),
- DartLib('Int32x4.xxxx', 'Vv'),
- DartLib('Int32x4.xxxy', 'Vv'),
- DartLib('Int32x4.xxxz', 'Vv'),
- DartLib('Int32x4.xxxw', 'Vv'),
- DartLib('Int32x4.xxyx', 'Vv'),
- DartLib('Int32x4.xxyy', 'Vv'),
- DartLib('Int32x4.xxyz', 'Vv'),
- DartLib('Int32x4.xxyw', 'Vv'),
- DartLib('Int32x4.xxzx', 'Vv'),
- DartLib('Int32x4.xxzy', 'Vv'),
- DartLib('Int32x4.xxzz', 'Vv'),
- DartLib('Int32x4.xxzw', 'Vv'),
- DartLib('Int32x4.xxwx', 'Vv'),
- DartLib('Int32x4.xxwy', 'Vv'),
- DartLib('Int32x4.xxwz', 'Vv'),
- DartLib('Int32x4.xxww', 'Vv'),
- DartLib('Int32x4.xyxx', 'Vv'),
- DartLib('Int32x4.xyxy', 'Vv'),
- DartLib('Int32x4.xyxz', 'Vv'),
- DartLib('Int32x4.xyxw', 'Vv'),
- DartLib('Int32x4.xyyx', 'Vv'),
- DartLib('Int32x4.xyyy', 'Vv'),
- DartLib('Int32x4.xyyz', 'Vv'),
- DartLib('Int32x4.xyyw', 'Vv'),
- DartLib('Int32x4.xyzx', 'Vv'),
- DartLib('Int32x4.xyzy', 'Vv'),
- DartLib('Int32x4.xyzz', 'Vv'),
- DartLib('Int32x4.xyzw', 'Vv'),
- DartLib('Int32x4.xywx', 'Vv'),
- DartLib('Int32x4.xywy', 'Vv'),
- DartLib('Int32x4.xywz', 'Vv'),
- DartLib('Int32x4.xyww', 'Vv'),
- DartLib('Int32x4.xzxx', 'Vv'),
- DartLib('Int32x4.xzxy', 'Vv'),
- DartLib('Int32x4.xzxz', 'Vv'),
- DartLib('Int32x4.xzxw', 'Vv'),
- DartLib('Int32x4.xzyx', 'Vv'),
- DartLib('Int32x4.xzyy', 'Vv'),
- DartLib('Int32x4.xzyz', 'Vv'),
- DartLib('Int32x4.xzyw', 'Vv'),
- DartLib('Int32x4.xzzx', 'Vv'),
- DartLib('Int32x4.xzzy', 'Vv'),
- DartLib('Int32x4.xzzz', 'Vv'),
- DartLib('Int32x4.xzzw', 'Vv'),
- DartLib('Int32x4.xzwx', 'Vv'),
- DartLib('Int32x4.xzwy', 'Vv'),
- DartLib('Int32x4.xzwz', 'Vv'),
- DartLib('Int32x4.xzww', 'Vv'),
- DartLib('Int32x4.xwxx', 'Vv'),
- DartLib('Int32x4.xwxy', 'Vv'),
- DartLib('Int32x4.xwxz', 'Vv'),
- DartLib('Int32x4.xwxw', 'Vv'),
- DartLib('Int32x4.xwyx', 'Vv'),
- DartLib('Int32x4.xwyy', 'Vv'),
- DartLib('Int32x4.xwyz', 'Vv'),
- DartLib('Int32x4.xwyw', 'Vv'),
- DartLib('Int32x4.xwzx', 'Vv'),
- DartLib('Int32x4.xwzy', 'Vv'),
- DartLib('Int32x4.xwzz', 'Vv'),
- DartLib('Int32x4.xwzw', 'Vv'),
- DartLib('Int32x4.xwwx', 'Vv'),
- DartLib('Int32x4.xwwy', 'Vv'),
- DartLib('Int32x4.xwwz', 'Vv'),
- DartLib('Int32x4.xwww', 'Vv'),
- DartLib('Int32x4.yxxx', 'Vv'),
- DartLib('Int32x4.yxxy', 'Vv'),
- DartLib('Int32x4.yxxz', 'Vv'),
- DartLib('Int32x4.yxxw', 'Vv'),
- DartLib('Int32x4.yxyx', 'Vv'),
- DartLib('Int32x4.yxyy', 'Vv'),
- DartLib('Int32x4.yxyz', 'Vv'),
- DartLib('Int32x4.yxyw', 'Vv'),
- DartLib('Int32x4.yxzx', 'Vv'),
- DartLib('Int32x4.yxzy', 'Vv'),
- DartLib('Int32x4.yxzz', 'Vv'),
- DartLib('Int32x4.yxzw', 'Vv'),
- DartLib('Int32x4.yxwx', 'Vv'),
- DartLib('Int32x4.yxwy', 'Vv'),
- DartLib('Int32x4.yxwz', 'Vv'),
- DartLib('Int32x4.yxww', 'Vv'),
- DartLib('Int32x4.yyxx', 'Vv'),
- DartLib('Int32x4.yyxy', 'Vv'),
- DartLib('Int32x4.yyxz', 'Vv'),
- DartLib('Int32x4.yyxw', 'Vv'),
- DartLib('Int32x4.yyyx', 'Vv'),
- DartLib('Int32x4.yyyy', 'Vv'),
- DartLib('Int32x4.yyyz', 'Vv'),
- DartLib('Int32x4.yyyw', 'Vv'),
- DartLib('Int32x4.yyzx', 'Vv'),
- DartLib('Int32x4.yyzy', 'Vv'),
- DartLib('Int32x4.yyzz', 'Vv'),
- DartLib('Int32x4.yyzw', 'Vv'),
- DartLib('Int32x4.yywx', 'Vv'),
- DartLib('Int32x4.yywy', 'Vv'),
- DartLib('Int32x4.yywz', 'Vv'),
- DartLib('Int32x4.yyww', 'Vv'),
- DartLib('Int32x4.yzxx', 'Vv'),
- DartLib('Int32x4.yzxy', 'Vv'),
- DartLib('Int32x4.yzxz', 'Vv'),
- DartLib('Int32x4.yzxw', 'Vv'),
- DartLib('Int32x4.yzyx', 'Vv'),
- DartLib('Int32x4.yzyy', 'Vv'),
- DartLib('Int32x4.yzyz', 'Vv'),
- DartLib('Int32x4.yzyw', 'Vv'),
- DartLib('Int32x4.yzzx', 'Vv'),
- DartLib('Int32x4.yzzy', 'Vv'),
- DartLib('Int32x4.yzzz', 'Vv'),
- DartLib('Int32x4.yzzw', 'Vv'),
- DartLib('Int32x4.yzwx', 'Vv'),
- DartLib('Int32x4.yzwy', 'Vv'),
- DartLib('Int32x4.yzwz', 'Vv'),
- DartLib('Int32x4.yzww', 'Vv'),
- DartLib('Int32x4.ywxx', 'Vv'),
- DartLib('Int32x4.ywxy', 'Vv'),
- DartLib('Int32x4.ywxz', 'Vv'),
- DartLib('Int32x4.ywxw', 'Vv'),
- DartLib('Int32x4.ywyx', 'Vv'),
- DartLib('Int32x4.ywyy', 'Vv'),
- DartLib('Int32x4.ywyz', 'Vv'),
- DartLib('Int32x4.ywyw', 'Vv'),
- DartLib('Int32x4.ywzx', 'Vv'),
- DartLib('Int32x4.ywzy', 'Vv'),
- DartLib('Int32x4.ywzz', 'Vv'),
- DartLib('Int32x4.ywzw', 'Vv'),
- DartLib('Int32x4.ywwx', 'Vv'),
- DartLib('Int32x4.ywwy', 'Vv'),
- DartLib('Int32x4.ywwz', 'Vv'),
- DartLib('Int32x4.ywww', 'Vv'),
- DartLib('Int32x4.zxxx', 'Vv'),
- DartLib('Int32x4.zxxy', 'Vv'),
- DartLib('Int32x4.zxxz', 'Vv'),
- DartLib('Int32x4.zxxw', 'Vv'),
- DartLib('Int32x4.zxyx', 'Vv'),
- DartLib('Int32x4.zxyy', 'Vv'),
- DartLib('Int32x4.zxyz', 'Vv'),
- DartLib('Int32x4.zxyw', 'Vv'),
- DartLib('Int32x4.zxzx', 'Vv'),
- DartLib('Int32x4.zxzy', 'Vv'),
- DartLib('Int32x4.zxzz', 'Vv'),
- DartLib('Int32x4.zxzw', 'Vv'),
- DartLib('Int32x4.zxwx', 'Vv'),
- DartLib('Int32x4.zxwy', 'Vv'),
- DartLib('Int32x4.zxwz', 'Vv'),
- DartLib('Int32x4.zxww', 'Vv'),
- DartLib('Int32x4.zyxx', 'Vv'),
- DartLib('Int32x4.zyxy', 'Vv'),
- DartLib('Int32x4.zyxz', 'Vv'),
- DartLib('Int32x4.zyxw', 'Vv'),
- DartLib('Int32x4.zyyx', 'Vv'),
- DartLib('Int32x4.zyyy', 'Vv'),
- DartLib('Int32x4.zyyz', 'Vv'),
- DartLib('Int32x4.zyyw', 'Vv'),
- DartLib('Int32x4.zyzx', 'Vv'),
- DartLib('Int32x4.zyzy', 'Vv'),
- DartLib('Int32x4.zyzz', 'Vv'),
- DartLib('Int32x4.zyzw', 'Vv'),
- DartLib('Int32x4.zywx', 'Vv'),
- DartLib('Int32x4.zywy', 'Vv'),
- DartLib('Int32x4.zywz', 'Vv'),
- DartLib('Int32x4.zyww', 'Vv'),
- DartLib('Int32x4.zzxx', 'Vv'),
- DartLib('Int32x4.zzxy', 'Vv'),
- DartLib('Int32x4.zzxz', 'Vv'),
- DartLib('Int32x4.zzxw', 'Vv'),
- DartLib('Int32x4.zzyx', 'Vv'),
- DartLib('Int32x4.zzyy', 'Vv'),
- DartLib('Int32x4.zzyz', 'Vv'),
- DartLib('Int32x4.zzyw', 'Vv'),
- DartLib('Int32x4.zzzx', 'Vv'),
- DartLib('Int32x4.zzzy', 'Vv'),
- DartLib('Int32x4.zzzz', 'Vv'),
- DartLib('Int32x4.zzzw', 'Vv'),
- DartLib('Int32x4.zzwx', 'Vv'),
- DartLib('Int32x4.zzwy', 'Vv'),
- DartLib('Int32x4.zzwz', 'Vv'),
- DartLib('Int32x4.zzww', 'Vv'),
- DartLib('Int32x4.zwxx', 'Vv'),
- DartLib('Int32x4.zwxy', 'Vv'),
- DartLib('Int32x4.zwxz', 'Vv'),
- DartLib('Int32x4.zwxw', 'Vv'),
- DartLib('Int32x4.zwyx', 'Vv'),
- DartLib('Int32x4.zwyy', 'Vv'),
- DartLib('Int32x4.zwyz', 'Vv'),
- DartLib('Int32x4.zwyw', 'Vv'),
- DartLib('Int32x4.zwzx', 'Vv'),
- DartLib('Int32x4.zwzy', 'Vv'),
- DartLib('Int32x4.zwzz', 'Vv'),
- DartLib('Int32x4.zwzw', 'Vv'),
- DartLib('Int32x4.zwwx', 'Vv'),
- DartLib('Int32x4.zwwy', 'Vv'),
- DartLib('Int32x4.zwwz', 'Vv'),
- DartLib('Int32x4.zwww', 'Vv'),
- DartLib('Int32x4.wxxx', 'Vv'),
- DartLib('Int32x4.wxxy', 'Vv'),
- DartLib('Int32x4.wxxz', 'Vv'),
- DartLib('Int32x4.wxxw', 'Vv'),
- DartLib('Int32x4.wxyx', 'Vv'),
- DartLib('Int32x4.wxyy', 'Vv'),
- DartLib('Int32x4.wxyz', 'Vv'),
- DartLib('Int32x4.wxyw', 'Vv'),
- DartLib('Int32x4.wxzx', 'Vv'),
- DartLib('Int32x4.wxzy', 'Vv'),
- DartLib('Int32x4.wxzz', 'Vv'),
- DartLib('Int32x4.wxzw', 'Vv'),
- DartLib('Int32x4.wxwx', 'Vv'),
- DartLib('Int32x4.wxwy', 'Vv'),
- DartLib('Int32x4.wxwz', 'Vv'),
- DartLib('Int32x4.wxww', 'Vv'),
- DartLib('Int32x4.wyxx', 'Vv'),
- DartLib('Int32x4.wyxy', 'Vv'),
- DartLib('Int32x4.wyxz', 'Vv'),
- DartLib('Int32x4.wyxw', 'Vv'),
- DartLib('Int32x4.wyyx', 'Vv'),
- DartLib('Int32x4.wyyy', 'Vv'),
- DartLib('Int32x4.wyyz', 'Vv'),
- DartLib('Int32x4.wyyw', 'Vv'),
- DartLib('Int32x4.wyzx', 'Vv'),
- DartLib('Int32x4.wyzy', 'Vv'),
- DartLib('Int32x4.wyzz', 'Vv'),
- DartLib('Int32x4.wyzw', 'Vv'),
- DartLib('Int32x4.wywx', 'Vv'),
- DartLib('Int32x4.wywy', 'Vv'),
- DartLib('Int32x4.wywz', 'Vv'),
- DartLib('Int32x4.wyww', 'Vv'),
- DartLib('Int32x4.wzxx', 'Vv'),
- DartLib('Int32x4.wzxy', 'Vv'),
- DartLib('Int32x4.wzxz', 'Vv'),
- DartLib('Int32x4.wzxw', 'Vv'),
- DartLib('Int32x4.wzyx', 'Vv'),
- DartLib('Int32x4.wzyy', 'Vv'),
- DartLib('Int32x4.wzyz', 'Vv'),
- DartLib('Int32x4.wzyw', 'Vv'),
- DartLib('Int32x4.wzzx', 'Vv'),
- DartLib('Int32x4.wzzy', 'Vv'),
- DartLib('Int32x4.wzzz', 'Vv'),
- DartLib('Int32x4.wzzw', 'Vv'),
- DartLib('Int32x4.wzwx', 'Vv'),
- DartLib('Int32x4.wzwy', 'Vv'),
- DartLib('Int32x4.wzwz', 'Vv'),
- DartLib('Int32x4.wzww', 'Vv'),
- DartLib('Int32x4.wwxx', 'Vv'),
- DartLib('Int32x4.wwxy', 'Vv'),
- DartLib('Int32x4.wwxz', 'Vv'),
- DartLib('Int32x4.wwxw', 'Vv'),
- DartLib('Int32x4.wwyx', 'Vv'),
- DartLib('Int32x4.wwyy', 'Vv'),
- DartLib('Int32x4.wwyz', 'Vv'),
- DartLib('Int32x4.wwyw', 'Vv'),
- DartLib('Int32x4.wwzx', 'Vv'),
- DartLib('Int32x4.wwzy', 'Vv'),
- DartLib('Int32x4.wwzz', 'Vv'),
- DartLib('Int32x4.wwzw', 'Vv'),
+ DartLib('Float32x4.wwxw', 'Vv'),
+ DartLib('Float32x4.wwxx', 'Vv'),
+ DartLib('Float32x4.wwxy', 'Vv'),
+ DartLib('Float32x4.wwxz', 'Vv'),
+ DartLib('Float32x4.wwyw', 'Vv'),
+ DartLib('Float32x4.wwyx', 'Vv'),
+ DartLib('Float32x4.wwyy', 'Vv'),
+ DartLib('Float32x4.wwyz', 'Vv'),
+ DartLib('Float32x4.wwzw', 'Vv'),
+ DartLib('Float32x4.wwzx', 'Vv'),
+ DartLib('Float32x4.wwzy', 'Vv'),
+ DartLib('Float32x4.wwzz', 'Vv'),
+ DartLib('Float32x4.wxww', 'Vv'),
+ DartLib('Float32x4.wxwx', 'Vv'),
+ DartLib('Float32x4.wxwy', 'Vv'),
+ DartLib('Float32x4.wxwz', 'Vv'),
+ DartLib('Float32x4.wxxw', 'Vv'),
+ DartLib('Float32x4.wxxx', 'Vv'),
+ DartLib('Float32x4.wxxy', 'Vv'),
+ DartLib('Float32x4.wxxz', 'Vv'),
+ DartLib('Float32x4.wxyw', 'Vv'),
+ DartLib('Float32x4.wxyx', 'Vv'),
+ DartLib('Float32x4.wxyy', 'Vv'),
+ DartLib('Float32x4.wxyz', 'Vv'),
+ DartLib('Float32x4.wxzw', 'Vv'),
+ DartLib('Float32x4.wxzx', 'Vv'),
+ DartLib('Float32x4.wxzy', 'Vv'),
+ DartLib('Float32x4.wxzz', 'Vv'),
+ DartLib('Float32x4.wyww', 'Vv'),
+ DartLib('Float32x4.wywx', 'Vv'),
+ DartLib('Float32x4.wywy', 'Vv'),
+ DartLib('Float32x4.wywz', 'Vv'),
+ DartLib('Float32x4.wyxw', 'Vv'),
+ DartLib('Float32x4.wyxx', 'Vv'),
+ DartLib('Float32x4.wyxy', 'Vv'),
+ DartLib('Float32x4.wyxz', 'Vv'),
+ DartLib('Float32x4.wyyw', 'Vv'),
+ DartLib('Float32x4.wyyx', 'Vv'),
+ DartLib('Float32x4.wyyy', 'Vv'),
+ DartLib('Float32x4.wyyz', 'Vv'),
+ DartLib('Float32x4.wyzw', 'Vv'),
+ DartLib('Float32x4.wyzx', 'Vv'),
+ DartLib('Float32x4.wyzy', 'Vv'),
+ DartLib('Float32x4.wyzz', 'Vv'),
+ DartLib('Float32x4.wzww', 'Vv'),
+ DartLib('Float32x4.wzwx', 'Vv'),
+ DartLib('Float32x4.wzwy', 'Vv'),
+ DartLib('Float32x4.wzwz', 'Vv'),
+ DartLib('Float32x4.wzxw', 'Vv'),
+ DartLib('Float32x4.wzxx', 'Vv'),
+ DartLib('Float32x4.wzxy', 'Vv'),
+ DartLib('Float32x4.wzxz', 'Vv'),
+ DartLib('Float32x4.wzyw', 'Vv'),
+ DartLib('Float32x4.wzyx', 'Vv'),
+ DartLib('Float32x4.wzyy', 'Vv'),
+ DartLib('Float32x4.wzyz', 'Vv'),
+ DartLib('Float32x4.wzzw', 'Vv'),
+ DartLib('Float32x4.wzzx', 'Vv'),
+ DartLib('Float32x4.wzzy', 'Vv'),
+ DartLib('Float32x4.wzzz', 'Vv'),
+ DartLib('Float32x4.xwww', 'Vv'),
+ DartLib('Float32x4.xwwx', 'Vv'),
+ DartLib('Float32x4.xwwy', 'Vv'),
+ DartLib('Float32x4.xwwz', 'Vv'),
+ DartLib('Float32x4.xwxw', 'Vv'),
+ DartLib('Float32x4.xwxx', 'Vv'),
+ DartLib('Float32x4.xwxy', 'Vv'),
+ DartLib('Float32x4.xwxz', 'Vv'),
+ DartLib('Float32x4.xwyw', 'Vv'),
+ DartLib('Float32x4.xwyx', 'Vv'),
+ DartLib('Float32x4.xwyy', 'Vv'),
+ DartLib('Float32x4.xwyz', 'Vv'),
+ DartLib('Float32x4.xwzw', 'Vv'),
+ DartLib('Float32x4.xwzx', 'Vv'),
+ DartLib('Float32x4.xwzy', 'Vv'),
+ DartLib('Float32x4.xwzz', 'Vv'),
+ DartLib('Float32x4.xxww', 'Vv'),
+ DartLib('Float32x4.xxwx', 'Vv'),
+ DartLib('Float32x4.xxwy', 'Vv'),
+ DartLib('Float32x4.xxwz', 'Vv'),
+ DartLib('Float32x4.xxxw', 'Vv'),
+ DartLib('Float32x4.xxxx', 'Vv'),
+ DartLib('Float32x4.xxxy', 'Vv'),
+ DartLib('Float32x4.xxxz', 'Vv'),
+ DartLib('Float32x4.xxyw', 'Vv'),
+ DartLib('Float32x4.xxyx', 'Vv'),
+ DartLib('Float32x4.xxyy', 'Vv'),
+ DartLib('Float32x4.xxyz', 'Vv'),
+ DartLib('Float32x4.xxzw', 'Vv'),
+ DartLib('Float32x4.xxzx', 'Vv'),
+ DartLib('Float32x4.xxzy', 'Vv'),
+ DartLib('Float32x4.xxzz', 'Vv'),
+ DartLib('Float32x4.xyww', 'Vv'),
+ DartLib('Float32x4.xywx', 'Vv'),
+ DartLib('Float32x4.xywy', 'Vv'),
+ DartLib('Float32x4.xywz', 'Vv'),
+ DartLib('Float32x4.xyxw', 'Vv'),
+ DartLib('Float32x4.xyxx', 'Vv'),
+ DartLib('Float32x4.xyxy', 'Vv'),
+ DartLib('Float32x4.xyxz', 'Vv'),
+ DartLib('Float32x4.xyyw', 'Vv'),
+ DartLib('Float32x4.xyyx', 'Vv'),
+ DartLib('Float32x4.xyyy', 'Vv'),
+ DartLib('Float32x4.xyyz', 'Vv'),
+ DartLib('Float32x4.xyzw', 'Vv'),
+ DartLib('Float32x4.xyzx', 'Vv'),
+ DartLib('Float32x4.xyzy', 'Vv'),
+ DartLib('Float32x4.xyzz', 'Vv'),
+ DartLib('Float32x4.xzww', 'Vv'),
+ DartLib('Float32x4.xzwx', 'Vv'),
+ DartLib('Float32x4.xzwy', 'Vv'),
+ DartLib('Float32x4.xzwz', 'Vv'),
+ DartLib('Float32x4.xzxw', 'Vv'),
+ DartLib('Float32x4.xzxx', 'Vv'),
+ DartLib('Float32x4.xzxy', 'Vv'),
+ DartLib('Float32x4.xzxz', 'Vv'),
+ DartLib('Float32x4.xzyw', 'Vv'),
+ DartLib('Float32x4.xzyx', 'Vv'),
+ DartLib('Float32x4.xzyy', 'Vv'),
+ DartLib('Float32x4.xzyz', 'Vv'),
+ DartLib('Float32x4.xzzw', 'Vv'),
+ DartLib('Float32x4.xzzx', 'Vv'),
+ DartLib('Float32x4.xzzy', 'Vv'),
+ DartLib('Float32x4.xzzz', 'Vv'),
+ DartLib('Float32x4.ywww', 'Vv'),
+ DartLib('Float32x4.ywwx', 'Vv'),
+ DartLib('Float32x4.ywwy', 'Vv'),
+ DartLib('Float32x4.ywwz', 'Vv'),
+ DartLib('Float32x4.ywxw', 'Vv'),
+ DartLib('Float32x4.ywxx', 'Vv'),
+ DartLib('Float32x4.ywxy', 'Vv'),
+ DartLib('Float32x4.ywxz', 'Vv'),
+ DartLib('Float32x4.ywyw', 'Vv'),
+ DartLib('Float32x4.ywyx', 'Vv'),
+ DartLib('Float32x4.ywyy', 'Vv'),
+ DartLib('Float32x4.ywyz', 'Vv'),
+ DartLib('Float32x4.ywzw', 'Vv'),
+ DartLib('Float32x4.ywzx', 'Vv'),
+ DartLib('Float32x4.ywzy', 'Vv'),
+ DartLib('Float32x4.ywzz', 'Vv'),
+ DartLib('Float32x4.yxww', 'Vv'),
+ DartLib('Float32x4.yxwx', 'Vv'),
+ DartLib('Float32x4.yxwy', 'Vv'),
+ DartLib('Float32x4.yxwz', 'Vv'),
+ DartLib('Float32x4.yxxw', 'Vv'),
+ DartLib('Float32x4.yxxx', 'Vv'),
+ DartLib('Float32x4.yxxy', 'Vv'),
+ DartLib('Float32x4.yxxz', 'Vv'),
+ DartLib('Float32x4.yxyw', 'Vv'),
+ DartLib('Float32x4.yxyx', 'Vv'),
+ DartLib('Float32x4.yxyy', 'Vv'),
+ DartLib('Float32x4.yxyz', 'Vv'),
+ DartLib('Float32x4.yxzw', 'Vv'),
+ DartLib('Float32x4.yxzx', 'Vv'),
+ DartLib('Float32x4.yxzy', 'Vv'),
+ DartLib('Float32x4.yxzz', 'Vv'),
+ DartLib('Float32x4.yyww', 'Vv'),
+ DartLib('Float32x4.yywx', 'Vv'),
+ DartLib('Float32x4.yywy', 'Vv'),
+ DartLib('Float32x4.yywz', 'Vv'),
+ DartLib('Float32x4.yyxw', 'Vv'),
+ DartLib('Float32x4.yyxx', 'Vv'),
+ DartLib('Float32x4.yyxy', 'Vv'),
+ DartLib('Float32x4.yyxz', 'Vv'),
+ DartLib('Float32x4.yyyw', 'Vv'),
+ DartLib('Float32x4.yyyx', 'Vv'),
+ DartLib('Float32x4.yyyy', 'Vv'),
+ DartLib('Float32x4.yyyz', 'Vv'),
+ DartLib('Float32x4.yyzw', 'Vv'),
+ DartLib('Float32x4.yyzx', 'Vv'),
+ DartLib('Float32x4.yyzy', 'Vv'),
+ DartLib('Float32x4.yyzz', 'Vv'),
+ DartLib('Float32x4.yzww', 'Vv'),
+ DartLib('Float32x4.yzwx', 'Vv'),
+ DartLib('Float32x4.yzwy', 'Vv'),
+ DartLib('Float32x4.yzwz', 'Vv'),
+ DartLib('Float32x4.yzxw', 'Vv'),
+ DartLib('Float32x4.yzxx', 'Vv'),
+ DartLib('Float32x4.yzxy', 'Vv'),
+ DartLib('Float32x4.yzxz', 'Vv'),
+ DartLib('Float32x4.yzyw', 'Vv'),
+ DartLib('Float32x4.yzyx', 'Vv'),
+ DartLib('Float32x4.yzyy', 'Vv'),
+ DartLib('Float32x4.yzyz', 'Vv'),
+ DartLib('Float32x4.yzzw', 'Vv'),
+ DartLib('Float32x4.yzzx', 'Vv'),
+ DartLib('Float32x4.yzzy', 'Vv'),
+ DartLib('Float32x4.yzzz', 'Vv'),
+ DartLib('Float32x4.zwww', 'Vv'),
+ DartLib('Float32x4.zwwx', 'Vv'),
+ DartLib('Float32x4.zwwy', 'Vv'),
+ DartLib('Float32x4.zwwz', 'Vv'),
+ DartLib('Float32x4.zwxw', 'Vv'),
+ DartLib('Float32x4.zwxx', 'Vv'),
+ DartLib('Float32x4.zwxy', 'Vv'),
+ DartLib('Float32x4.zwxz', 'Vv'),
+ DartLib('Float32x4.zwyw', 'Vv'),
+ DartLib('Float32x4.zwyx', 'Vv'),
+ DartLib('Float32x4.zwyy', 'Vv'),
+ DartLib('Float32x4.zwyz', 'Vv'),
+ DartLib('Float32x4.zwzw', 'Vv'),
+ DartLib('Float32x4.zwzx', 'Vv'),
+ DartLib('Float32x4.zwzy', 'Vv'),
+ DartLib('Float32x4.zwzz', 'Vv'),
+ DartLib('Float32x4.zxww', 'Vv'),
+ DartLib('Float32x4.zxwx', 'Vv'),
+ DartLib('Float32x4.zxwy', 'Vv'),
+ DartLib('Float32x4.zxwz', 'Vv'),
+ DartLib('Float32x4.zxxw', 'Vv'),
+ DartLib('Float32x4.zxxx', 'Vv'),
+ DartLib('Float32x4.zxxy', 'Vv'),
+ DartLib('Float32x4.zxxz', 'Vv'),
+ DartLib('Float32x4.zxyw', 'Vv'),
+ DartLib('Float32x4.zxyx', 'Vv'),
+ DartLib('Float32x4.zxyy', 'Vv'),
+ DartLib('Float32x4.zxyz', 'Vv'),
+ DartLib('Float32x4.zxzw', 'Vv'),
+ DartLib('Float32x4.zxzx', 'Vv'),
+ DartLib('Float32x4.zxzy', 'Vv'),
+ DartLib('Float32x4.zxzz', 'Vv'),
+ DartLib('Float32x4.zyww', 'Vv'),
+ DartLib('Float32x4.zywx', 'Vv'),
+ DartLib('Float32x4.zywy', 'Vv'),
+ DartLib('Float32x4.zywz', 'Vv'),
+ DartLib('Float32x4.zyxw', 'Vv'),
+ DartLib('Float32x4.zyxx', 'Vv'),
+ DartLib('Float32x4.zyxy', 'Vv'),
+ DartLib('Float32x4.zyxz', 'Vv'),
+ DartLib('Float32x4.zyyw', 'Vv'),
+ DartLib('Float32x4.zyyx', 'Vv'),
+ DartLib('Float32x4.zyyy', 'Vv'),
+ DartLib('Float32x4.zyyz', 'Vv'),
+ DartLib('Float32x4.zyzw', 'Vv'),
+ DartLib('Float32x4.zyzx', 'Vv'),
+ DartLib('Float32x4.zyzy', 'Vv'),
+ DartLib('Float32x4.zyzz', 'Vv'),
+ DartLib('Float32x4.zzww', 'Vv'),
+ DartLib('Float32x4.zzwx', 'Vv'),
+ DartLib('Float32x4.zzwy', 'Vv'),
+ DartLib('Float32x4.zzwz', 'Vv'),
+ DartLib('Float32x4.zzxw', 'Vv'),
+ DartLib('Float32x4.zzxx', 'Vv'),
+ DartLib('Float32x4.zzxy', 'Vv'),
+ DartLib('Float32x4.zzxz', 'Vv'),
+ DartLib('Float32x4.zzyw', 'Vv'),
+ DartLib('Float32x4.zzyx', 'Vv'),
+ DartLib('Float32x4.zzyy', 'Vv'),
+ DartLib('Float32x4.zzyz', 'Vv'),
+ DartLib('Float32x4.zzzw', 'Vv'),
+ DartLib('Float32x4.zzzx', 'Vv'),
+ DartLib('Float32x4.zzzy', 'Vv'),
+ DartLib('Float32x4.zzzz', 'Vv'),
+ DartLib('Float32x4List.bytesPerElement', 'Vv'),
+ DartLib('Float64List.bytesPerElement', 'Vv'),
+ DartLib('Float64x2List.bytesPerElement', 'Vv'),
+ DartLib('Int16List.bytesPerElement', 'Vv'),
+ DartLib('Int32List.bytesPerElement', 'Vv'),
+ DartLib('Int32x4.wwww', 'Vv'),
DartLib('Int32x4.wwwx', 'Vv'),
DartLib('Int32x4.wwwy', 'Vv'),
DartLib('Int32x4.wwwz', 'Vv'),
- DartLib('Int32x4.wwww', 'Vv'),
+ DartLib('Int32x4.wwxw', 'Vv'),
+ DartLib('Int32x4.wwxx', 'Vv'),
+ DartLib('Int32x4.wwxy', 'Vv'),
+ DartLib('Int32x4.wwxz', 'Vv'),
+ DartLib('Int32x4.wwyw', 'Vv'),
+ DartLib('Int32x4.wwyx', 'Vv'),
+ DartLib('Int32x4.wwyy', 'Vv'),
+ DartLib('Int32x4.wwyz', 'Vv'),
+ DartLib('Int32x4.wwzw', 'Vv'),
+ DartLib('Int32x4.wwzx', 'Vv'),
+ DartLib('Int32x4.wwzy', 'Vv'),
+ DartLib('Int32x4.wwzz', 'Vv'),
+ DartLib('Int32x4.wxww', 'Vv'),
+ DartLib('Int32x4.wxwx', 'Vv'),
+ DartLib('Int32x4.wxwy', 'Vv'),
+ DartLib('Int32x4.wxwz', 'Vv'),
+ DartLib('Int32x4.wxxw', 'Vv'),
+ DartLib('Int32x4.wxxx', 'Vv'),
+ DartLib('Int32x4.wxxy', 'Vv'),
+ DartLib('Int32x4.wxxz', 'Vv'),
+ DartLib('Int32x4.wxyw', 'Vv'),
+ DartLib('Int32x4.wxyx', 'Vv'),
+ DartLib('Int32x4.wxyy', 'Vv'),
+ DartLib('Int32x4.wxyz', 'Vv'),
+ DartLib('Int32x4.wxzw', 'Vv'),
+ DartLib('Int32x4.wxzx', 'Vv'),
+ DartLib('Int32x4.wxzy', 'Vv'),
+ DartLib('Int32x4.wxzz', 'Vv'),
+ DartLib('Int32x4.wyww', 'Vv'),
+ DartLib('Int32x4.wywx', 'Vv'),
+ DartLib('Int32x4.wywy', 'Vv'),
+ DartLib('Int32x4.wywz', 'Vv'),
+ DartLib('Int32x4.wyxw', 'Vv'),
+ DartLib('Int32x4.wyxx', 'Vv'),
+ DartLib('Int32x4.wyxy', 'Vv'),
+ DartLib('Int32x4.wyxz', 'Vv'),
+ DartLib('Int32x4.wyyw', 'Vv'),
+ DartLib('Int32x4.wyyx', 'Vv'),
+ DartLib('Int32x4.wyyy', 'Vv'),
+ DartLib('Int32x4.wyyz', 'Vv'),
+ DartLib('Int32x4.wyzw', 'Vv'),
+ DartLib('Int32x4.wyzx', 'Vv'),
+ DartLib('Int32x4.wyzy', 'Vv'),
+ DartLib('Int32x4.wyzz', 'Vv'),
+ DartLib('Int32x4.wzww', 'Vv'),
+ DartLib('Int32x4.wzwx', 'Vv'),
+ DartLib('Int32x4.wzwy', 'Vv'),
+ DartLib('Int32x4.wzwz', 'Vv'),
+ DartLib('Int32x4.wzxw', 'Vv'),
+ DartLib('Int32x4.wzxx', 'Vv'),
+ DartLib('Int32x4.wzxy', 'Vv'),
+ DartLib('Int32x4.wzxz', 'Vv'),
+ DartLib('Int32x4.wzyw', 'Vv'),
+ DartLib('Int32x4.wzyx', 'Vv'),
+ DartLib('Int32x4.wzyy', 'Vv'),
+ DartLib('Int32x4.wzyz', 'Vv'),
+ DartLib('Int32x4.wzzw', 'Vv'),
+ DartLib('Int32x4.wzzx', 'Vv'),
+ DartLib('Int32x4.wzzy', 'Vv'),
+ DartLib('Int32x4.wzzz', 'Vv'),
+ DartLib('Int32x4.xwww', 'Vv'),
+ DartLib('Int32x4.xwwx', 'Vv'),
+ DartLib('Int32x4.xwwy', 'Vv'),
+ DartLib('Int32x4.xwwz', 'Vv'),
+ DartLib('Int32x4.xwxw', 'Vv'),
+ DartLib('Int32x4.xwxx', 'Vv'),
+ DartLib('Int32x4.xwxy', 'Vv'),
+ DartLib('Int32x4.xwxz', 'Vv'),
+ DartLib('Int32x4.xwyw', 'Vv'),
+ DartLib('Int32x4.xwyx', 'Vv'),
+ DartLib('Int32x4.xwyy', 'Vv'),
+ DartLib('Int32x4.xwyz', 'Vv'),
+ DartLib('Int32x4.xwzw', 'Vv'),
+ DartLib('Int32x4.xwzx', 'Vv'),
+ DartLib('Int32x4.xwzy', 'Vv'),
+ DartLib('Int32x4.xwzz', 'Vv'),
+ DartLib('Int32x4.xxww', 'Vv'),
+ DartLib('Int32x4.xxwx', 'Vv'),
+ DartLib('Int32x4.xxwy', 'Vv'),
+ DartLib('Int32x4.xxwz', 'Vv'),
+ DartLib('Int32x4.xxxw', 'Vv'),
+ DartLib('Int32x4.xxxx', 'Vv'),
+ DartLib('Int32x4.xxxy', 'Vv'),
+ DartLib('Int32x4.xxxz', 'Vv'),
+ DartLib('Int32x4.xxyw', 'Vv'),
+ DartLib('Int32x4.xxyx', 'Vv'),
+ DartLib('Int32x4.xxyy', 'Vv'),
+ DartLib('Int32x4.xxyz', 'Vv'),
+ DartLib('Int32x4.xxzw', 'Vv'),
+ DartLib('Int32x4.xxzx', 'Vv'),
+ DartLib('Int32x4.xxzy', 'Vv'),
+ DartLib('Int32x4.xxzz', 'Vv'),
+ DartLib('Int32x4.xyww', 'Vv'),
+ DartLib('Int32x4.xywx', 'Vv'),
+ DartLib('Int32x4.xywy', 'Vv'),
+ DartLib('Int32x4.xywz', 'Vv'),
+ DartLib('Int32x4.xyxw', 'Vv'),
+ DartLib('Int32x4.xyxx', 'Vv'),
+ DartLib('Int32x4.xyxy', 'Vv'),
+ DartLib('Int32x4.xyxz', 'Vv'),
+ DartLib('Int32x4.xyyw', 'Vv'),
+ DartLib('Int32x4.xyyx', 'Vv'),
+ DartLib('Int32x4.xyyy', 'Vv'),
+ DartLib('Int32x4.xyyz', 'Vv'),
+ DartLib('Int32x4.xyzw', 'Vv'),
+ DartLib('Int32x4.xyzx', 'Vv'),
+ DartLib('Int32x4.xyzy', 'Vv'),
+ DartLib('Int32x4.xyzz', 'Vv'),
+ DartLib('Int32x4.xzww', 'Vv'),
+ DartLib('Int32x4.xzwx', 'Vv'),
+ DartLib('Int32x4.xzwy', 'Vv'),
+ DartLib('Int32x4.xzwz', 'Vv'),
+ DartLib('Int32x4.xzxw', 'Vv'),
+ DartLib('Int32x4.xzxx', 'Vv'),
+ DartLib('Int32x4.xzxy', 'Vv'),
+ DartLib('Int32x4.xzxz', 'Vv'),
+ DartLib('Int32x4.xzyw', 'Vv'),
+ DartLib('Int32x4.xzyx', 'Vv'),
+ DartLib('Int32x4.xzyy', 'Vv'),
+ DartLib('Int32x4.xzyz', 'Vv'),
+ DartLib('Int32x4.xzzw', 'Vv'),
+ DartLib('Int32x4.xzzx', 'Vv'),
+ DartLib('Int32x4.xzzy', 'Vv'),
+ DartLib('Int32x4.xzzz', 'Vv'),
+ DartLib('Int32x4.ywww', 'Vv'),
+ DartLib('Int32x4.ywwx', 'Vv'),
+ DartLib('Int32x4.ywwy', 'Vv'),
+ DartLib('Int32x4.ywwz', 'Vv'),
+ DartLib('Int32x4.ywxw', 'Vv'),
+ DartLib('Int32x4.ywxx', 'Vv'),
+ DartLib('Int32x4.ywxy', 'Vv'),
+ DartLib('Int32x4.ywxz', 'Vv'),
+ DartLib('Int32x4.ywyw', 'Vv'),
+ DartLib('Int32x4.ywyx', 'Vv'),
+ DartLib('Int32x4.ywyy', 'Vv'),
+ DartLib('Int32x4.ywyz', 'Vv'),
+ DartLib('Int32x4.ywzw', 'Vv'),
+ DartLib('Int32x4.ywzx', 'Vv'),
+ DartLib('Int32x4.ywzy', 'Vv'),
+ DartLib('Int32x4.ywzz', 'Vv'),
+ DartLib('Int32x4.yxww', 'Vv'),
+ DartLib('Int32x4.yxwx', 'Vv'),
+ DartLib('Int32x4.yxwy', 'Vv'),
+ DartLib('Int32x4.yxwz', 'Vv'),
+ DartLib('Int32x4.yxxw', 'Vv'),
+ DartLib('Int32x4.yxxx', 'Vv'),
+ DartLib('Int32x4.yxxy', 'Vv'),
+ DartLib('Int32x4.yxxz', 'Vv'),
+ DartLib('Int32x4.yxyw', 'Vv'),
+ DartLib('Int32x4.yxyx', 'Vv'),
+ DartLib('Int32x4.yxyy', 'Vv'),
+ DartLib('Int32x4.yxyz', 'Vv'),
+ DartLib('Int32x4.yxzw', 'Vv'),
+ DartLib('Int32x4.yxzx', 'Vv'),
+ DartLib('Int32x4.yxzy', 'Vv'),
+ DartLib('Int32x4.yxzz', 'Vv'),
+ DartLib('Int32x4.yyww', 'Vv'),
+ DartLib('Int32x4.yywx', 'Vv'),
+ DartLib('Int32x4.yywy', 'Vv'),
+ DartLib('Int32x4.yywz', 'Vv'),
+ DartLib('Int32x4.yyxw', 'Vv'),
+ DartLib('Int32x4.yyxx', 'Vv'),
+ DartLib('Int32x4.yyxy', 'Vv'),
+ DartLib('Int32x4.yyxz', 'Vv'),
+ DartLib('Int32x4.yyyw', 'Vv'),
+ DartLib('Int32x4.yyyx', 'Vv'),
+ DartLib('Int32x4.yyyy', 'Vv'),
+ DartLib('Int32x4.yyyz', 'Vv'),
+ DartLib('Int32x4.yyzw', 'Vv'),
+ DartLib('Int32x4.yyzx', 'Vv'),
+ DartLib('Int32x4.yyzy', 'Vv'),
+ DartLib('Int32x4.yyzz', 'Vv'),
+ DartLib('Int32x4.yzww', 'Vv'),
+ DartLib('Int32x4.yzwx', 'Vv'),
+ DartLib('Int32x4.yzwy', 'Vv'),
+ DartLib('Int32x4.yzwz', 'Vv'),
+ DartLib('Int32x4.yzxw', 'Vv'),
+ DartLib('Int32x4.yzxx', 'Vv'),
+ DartLib('Int32x4.yzxy', 'Vv'),
+ DartLib('Int32x4.yzxz', 'Vv'),
+ DartLib('Int32x4.yzyw', 'Vv'),
+ DartLib('Int32x4.yzyx', 'Vv'),
+ DartLib('Int32x4.yzyy', 'Vv'),
+ DartLib('Int32x4.yzyz', 'Vv'),
+ DartLib('Int32x4.yzzw', 'Vv'),
+ DartLib('Int32x4.yzzx', 'Vv'),
+ DartLib('Int32x4.yzzy', 'Vv'),
+ DartLib('Int32x4.yzzz', 'Vv'),
+ DartLib('Int32x4.zwww', 'Vv'),
+ DartLib('Int32x4.zwwx', 'Vv'),
+ DartLib('Int32x4.zwwy', 'Vv'),
+ DartLib('Int32x4.zwwz', 'Vv'),
+ DartLib('Int32x4.zwxw', 'Vv'),
+ DartLib('Int32x4.zwxx', 'Vv'),
+ DartLib('Int32x4.zwxy', 'Vv'),
+ DartLib('Int32x4.zwxz', 'Vv'),
+ DartLib('Int32x4.zwyw', 'Vv'),
+ DartLib('Int32x4.zwyx', 'Vv'),
+ DartLib('Int32x4.zwyy', 'Vv'),
+ DartLib('Int32x4.zwyz', 'Vv'),
+ DartLib('Int32x4.zwzw', 'Vv'),
+ DartLib('Int32x4.zwzx', 'Vv'),
+ DartLib('Int32x4.zwzy', 'Vv'),
+ DartLib('Int32x4.zwzz', 'Vv'),
+ DartLib('Int32x4.zxww', 'Vv'),
+ DartLib('Int32x4.zxwx', 'Vv'),
+ DartLib('Int32x4.zxwy', 'Vv'),
+ DartLib('Int32x4.zxwz', 'Vv'),
+ DartLib('Int32x4.zxxw', 'Vv'),
+ DartLib('Int32x4.zxxx', 'Vv'),
+ DartLib('Int32x4.zxxy', 'Vv'),
+ DartLib('Int32x4.zxxz', 'Vv'),
+ DartLib('Int32x4.zxyw', 'Vv'),
+ DartLib('Int32x4.zxyx', 'Vv'),
+ DartLib('Int32x4.zxyy', 'Vv'),
+ DartLib('Int32x4.zxyz', 'Vv'),
+ DartLib('Int32x4.zxzw', 'Vv'),
+ DartLib('Int32x4.zxzx', 'Vv'),
+ DartLib('Int32x4.zxzy', 'Vv'),
+ DartLib('Int32x4.zxzz', 'Vv'),
+ DartLib('Int32x4.zyww', 'Vv'),
+ DartLib('Int32x4.zywx', 'Vv'),
+ DartLib('Int32x4.zywy', 'Vv'),
+ DartLib('Int32x4.zywz', 'Vv'),
+ DartLib('Int32x4.zyxw', 'Vv'),
+ DartLib('Int32x4.zyxx', 'Vv'),
+ DartLib('Int32x4.zyxy', 'Vv'),
+ DartLib('Int32x4.zyxz', 'Vv'),
+ DartLib('Int32x4.zyyw', 'Vv'),
+ DartLib('Int32x4.zyyx', 'Vv'),
+ DartLib('Int32x4.zyyy', 'Vv'),
+ DartLib('Int32x4.zyyz', 'Vv'),
+ DartLib('Int32x4.zyzw', 'Vv'),
+ DartLib('Int32x4.zyzx', 'Vv'),
+ DartLib('Int32x4.zyzy', 'Vv'),
+ DartLib('Int32x4.zyzz', 'Vv'),
+ DartLib('Int32x4.zzww', 'Vv'),
+ DartLib('Int32x4.zzwx', 'Vv'),
+ DartLib('Int32x4.zzwy', 'Vv'),
+ DartLib('Int32x4.zzwz', 'Vv'),
+ DartLib('Int32x4.zzxw', 'Vv'),
+ DartLib('Int32x4.zzxx', 'Vv'),
+ DartLib('Int32x4.zzxy', 'Vv'),
+ DartLib('Int32x4.zzxz', 'Vv'),
+ DartLib('Int32x4.zzyw', 'Vv'),
+ DartLib('Int32x4.zzyx', 'Vv'),
+ DartLib('Int32x4.zzyy', 'Vv'),
+ DartLib('Int32x4.zzyz', 'Vv'),
+ DartLib('Int32x4.zzzw', 'Vv'),
+ DartLib('Int32x4.zzzx', 'Vv'),
+ DartLib('Int32x4.zzzy', 'Vv'),
+ DartLib('Int32x4.zzzz', 'Vv'),
+ DartLib('Int32x4List.bytesPerElement', 'Vv'),
+ DartLib('Int64List.bytesPerElement', 'Vv'),
+ DartLib('Int8List.bytesPerElement', 'Vv'),
+ DartLib('Isolate.beforeNextEvent', 'Vv'),
+ DartLib('Isolate.immediate', 'Vv'),
+ DartLib('JsonUtf8Encoder.DEFAULT_BUFFER_SIZE', 'Vv'),
+ DartLib('OSError.noErrorCode', 'Vv'),
+ DartLib('RangeError.checkValidRange', 'VIIISSS'),
+ DartLib('RawSocketOption.IPv4MulticastInterface', 'Vv'),
+ DartLib('RawSocketOption.IPv6MulticastInterface', 'Vv'),
+ DartLib('RawSocketOption.levelIPv4', 'Vv'),
+ DartLib('RawSocketOption.levelIPv6', 'Vv'),
+ DartLib('RawSocketOption.levelSocket', 'Vv'),
+ DartLib('RawSocketOption.levelTcp', 'Vv'),
+ DartLib('RawSocketOption.levelUdp', 'Vv'),
+ DartLib('Uint16List.bytesPerElement', 'Vv'),
+ DartLib('Uint32List.bytesPerElement', 'Vv'),
+ DartLib('Uint64List.bytesPerElement', 'Vv'),
+ DartLib('Uint8ClampedList.bytesPerElement', 'Vv'),
+ DartLib('Uint8List.bytesPerElement', 'Vv'),
+ DartLib('ZLibOption.DEFAULT_LEVEL', 'Vv'),
+ DartLib('ZLibOption.DEFAULT_MEM_LEVEL', 'Vv'),
+ DartLib('ZLibOption.DEFAULT_WINDOW_BITS', 'Vv'),
+ DartLib('ZLibOption.MAX_LEVEL', 'Vv'),
+ DartLib('ZLibOption.MAX_MEM_LEVEL', 'Vv'),
+ DartLib('ZLibOption.MAX_WINDOW_BITS', 'Vv'),
+ DartLib('ZLibOption.MIN_LEVEL', 'Vv'),
+ DartLib('ZLibOption.MIN_MEM_LEVEL', 'Vv'),
+ DartLib('ZLibOption.MIN_WINDOW_BITS', 'Vv'),
+ DartLib('ZLibOption.STRATEGY_DEFAULT', 'Vv'),
+ DartLib('ZLibOption.STRATEGY_FILTERED', 'Vv'),
+ DartLib('ZLibOption.STRATEGY_FIXED', 'Vv'),
+ DartLib('ZLibOption.STRATEGY_HUFFMAN_ONLY', 'Vv'),
+ DartLib('ZLibOption.STRATEGY_RLE', 'Vv'),
+ DartLib('ZLibOption.defaultLevel', 'Vv'),
+ DartLib('ZLibOption.defaultMemLevel', 'Vv'),
+ DartLib('ZLibOption.defaultWindowBits', 'Vv'),
+ DartLib('ZLibOption.maxLevel', 'Vv'),
+ DartLib('ZLibOption.maxMemLevel', 'Vv'),
+ DartLib('ZLibOption.maxWindowBits', 'Vv'),
+ DartLib('ZLibOption.minLevel', 'Vv'),
+ DartLib('ZLibOption.minMemLevel', 'Vv'),
+ DartLib('ZLibOption.minWindowBits', 'Vv'),
+ DartLib('ZLibOption.strategyDefault', 'Vv'),
+ DartLib('ZLibOption.strategyFiltered', 'Vv'),
+ DartLib('ZLibOption.strategyFixed', 'Vv'),
+ DartLib('ZLibOption.strategyHuffmanOnly', 'Vv'),
+ DartLib('ZLibOption.strategyRle', 'Vv'),
+ DartLib('abs', 'IV'),
+ DartLib('bitLength', 'Iv'),
+ DartLib('ceil', 'DV'),
+ DartLib('ceil', 'DV'),
+ DartLib('ceil', 'IV'),
+ DartLib('codeUnitAt', 'SI'),
+ DartLib('compareTo', 'DD'),
+ DartLib('compareTo', 'SS'),
+ DartLib('floor', 'IV'),
+ DartLib('floor', 'DV'),
+ DartLib('floor', 'DV'),
+ DartLib('gcd', 'II'),
+ DartLib('indexOf', 'LII'),
+ DartLib('int.fromEnvironment', 'VS'),
+ DartLib('int.parse', 'VS'),
+ DartLib('int.tryParse', 'VS'),
+ DartLib('lastIndexOf', 'LII'),
+ DartLib('length', 'Mv'),
+ DartLib('length', 'Lv'),
+ DartLib('length', 'Sv'),
+ DartLib('modInverse', 'II'),
+ DartLib('modPow', 'III'),
+ DartLib('removeAt', 'LI'),
+ DartLib('removeLast', 'LV'),
+ DartLib('round', 'DV'),
+ DartLib('round', 'IV'),
+ DartLib('round', 'DV'),
+ DartLib('sign', 'Iv'),
+ DartLib('toInt', 'DV'),
+ DartLib('toSigned', 'II'),
+ DartLib('toUnsigned', 'II'),
+ DartLib('truncate', 'DV'),
+ DartLib('truncate', 'IV'),
+ DartLib('truncate', 'DV'),
+ DartLib('unicodeBomCharacterRune', 'Vv'),
+ DartLib('unicodeReplacementCharacterRune', 'Vv'),
];
static const doubleLibs = [
- DartLib('remainder', 'DD'),
DartLib('abs', 'DV'),
- DartLib('roundToDouble', 'DV'),
- DartLib('floorToDouble', 'DV'),
- DartLib('ceilToDouble', 'DV'),
- DartLib('truncateToDouble', 'DV'),
- DartLib('double.tryParse', 'VS'),
- DartLib('sign', 'Dv'),
- DartLib('double.nan', 'Vv'),
- DartLib('double.infinity', 'Vv'),
- DartLib('double.negativeInfinity', 'Vv'),
- DartLib('double.minPositive', 'Vv'),
- DartLib('double.maxFinite', 'Vv'),
- DartLib('roundToDouble', 'IV'),
- DartLib('floorToDouble', 'IV'),
- DartLib('ceilToDouble', 'IV'),
- DartLib('truncateToDouble', 'IV'),
- DartLib('remainder', 'DD'),
DartLib('abs', 'DV'),
- DartLib('roundToDouble', 'DV'),
- DartLib('floorToDouble', 'DV'),
- DartLib('ceilToDouble', 'DV'),
- DartLib('truncateToDouble', 'DV'),
- DartLib('clamp', 'DDD'),
- DartLib('toDouble', 'DV'),
- DartLib('num.tryParse', 'VS'),
- DartLib('sign', 'Dv'),
- DartLib('e', 'Vv'),
- DartLib('ln10', 'Vv'),
- DartLib('ln2', 'Vv'),
- DartLib('log2e', 'Vv'),
- DartLib('log10e', 'Vv'),
- DartLib('pi', 'Vv'),
- DartLib('sqrt1_2', 'Vv'),
- DartLib('sqrt2', 'Vv'),
- DartLib('atan2', 'VDD'),
- DartLib('pow', 'VDD'),
- DartLib('sin', 'VD'),
- DartLib('cos', 'VD'),
- DartLib('tan', 'VD'),
DartLib('acos', 'VD'),
DartLib('asin', 'VD'),
DartLib('atan', 'VD'),
- DartLib('sqrt', 'VD'),
+ DartLib('atan2', 'VDD'),
+ DartLib('ceilToDouble', 'DV'),
+ DartLib('ceilToDouble', 'DV'),
+ DartLib('ceilToDouble', 'IV'),
+ DartLib('clamp', 'DDD'),
+ DartLib('cos', 'VD'),
+ DartLib('double.infinity', 'Vv'),
+ DartLib('double.maxFinite', 'Vv'),
+ DartLib('double.minPositive', 'Vv'),
+ DartLib('double.nan', 'Vv'),
+ DartLib('double.negativeInfinity', 'Vv'),
+ DartLib('double.tryParse', 'VS'),
+ DartLib('e', 'Vv'),
DartLib('exp', 'VD'),
+ DartLib('floorToDouble', 'DV'),
+ DartLib('floorToDouble', 'IV'),
+ DartLib('floorToDouble', 'DV'),
+ DartLib('ln10', 'Vv'),
+ DartLib('ln2', 'Vv'),
DartLib('log', 'VD'),
+ DartLib('log10e', 'Vv'),
+ DartLib('log2e', 'Vv'),
+ DartLib('num.tryParse', 'VS'),
+ DartLib('pi', 'Vv'),
+ DartLib('pow', 'VDD'),
+ DartLib('remainder', 'DD'),
+ DartLib('remainder', 'DD'),
+ DartLib('roundToDouble', 'IV'),
+ DartLib('roundToDouble', 'DV'),
+ DartLib('roundToDouble', 'DV'),
+ DartLib('sign', 'Dv'),
+ DartLib('sign', 'Dv'),
+ DartLib('sin', 'VD'),
+ DartLib('sqrt', 'VD'),
+ DartLib('sqrt1_2', 'Vv'),
+ DartLib('sqrt2', 'Vv'),
+ DartLib('tan', 'VD'),
+ DartLib('toDouble', 'DV'),
+ DartLib('truncateToDouble', 'IV'),
+ DartLib('truncateToDouble', 'DV'),
+ DartLib('truncateToDouble', 'DV'),
];
static const stringLibs = [
DartLib('ListBase.listToString', 'VL'),
DartLib('MapBase.mapToString', 'VM'),
- DartLib('SetBase.setToString', 'VX'),
- DartLib('base64Encode', 'VL'),
- DartLib('base64UrlEncode', 'VL'),
- DartLib('toString', 'BV'),
- DartLib('toString', 'DV'),
- DartLib('toString', 'IV'),
- DartLib('toRadixString', 'II'),
- DartLib('toStringAsFixed', 'DI'),
- DartLib('toStringAsExponential', 'DI'),
- DartLib('toStringAsPrecision', 'DI'),
- DartLib('toString', 'DV'),
DartLib('RegExp.escape', 'VS'),
+ DartLib('SetBase.setToString', 'VX'),
DartLib('String.fromCharCode', 'VI'),
DartLib('String.fromEnvironment', 'VS'),
- DartLib('substring', 'SII'),
- DartLib('trim', 'SV'),
- DartLib('trimLeft', 'SV'),
- DartLib('trimRight', 'SV'),
+ DartLib('Uri.decodeComponent', 'VS'),
+ DartLib('Uri.decodeFull', 'VS'),
+ DartLib('Uri.decodeQueryComponent', 'VS'),
+ DartLib('Uri.encodeComponent', 'VS'),
+ DartLib('Uri.encodeFull', 'VS'),
+ DartLib('Uri.encodeQueryComponent', 'VS'),
+ DartLib('base64Encode', 'VL'),
+ DartLib('base64UrlEncode', 'VL'),
DartLib('padLeft', 'Sis'),
DartLib('padRight', 'Sis'),
DartLib('replaceRange', 'SIIS'),
+ DartLib('substring', 'SII'),
DartLib('toLowerCase', 'SV'),
+ DartLib('toRadixString', 'II'),
+ DartLib('toString', 'BV'),
+ DartLib('toString', 'DV'),
+ DartLib('toString', 'IV'),
+ DartLib('toString', 'DV'),
+ DartLib('toStringAsExponential', 'DI'),
+ DartLib('toStringAsFixed', 'DI'),
+ DartLib('toStringAsPrecision', 'DI'),
DartLib('toUpperCase', 'SV'),
- DartLib('Uri.encodeComponent', 'VS'),
- DartLib('Uri.encodeQueryComponent', 'VS'),
- DartLib('Uri.decodeComponent', 'VS'),
- DartLib('Uri.decodeQueryComponent', 'VS'),
- DartLib('Uri.encodeFull', 'VS'),
- DartLib('Uri.decodeFull', 'VS'),
+ DartLib('trim', 'SV'),
+ DartLib('trimLeft', 'SV'),
+ DartLib('trimRight', 'SV'),
];
static const listLibs = [
DartLib('List.filled', 'ViI'),
- DartLib('sublist', 'LII'),
- DartLib('codeUnits', 'Sv'),
DartLib('Uri.parseIPv4Address', 'VS'),
DartLib('Uri.parseIPv6Address', 'VSII'),
+ DartLib('codeUnits', 'Sv'),
+ DartLib('sublist', 'LII'),
];
static const setLibs = [
DartLib('Set.identity', 'VV'),
- DartLib('intersection', 'XX'),
- DartLib('union', 'XX'),
DartLib('difference', 'XX'),
+ DartLib('intersection', 'XX'),
DartLib('toSet', 'XV'),
+ DartLib('union', 'XX'),
];
static const mapLibs = [
DartLib('Map.from', 'VM'),
+ DartLib('Map.identity', 'VV'),
DartLib('Map.of', 'VM'),
DartLib('Map.unmodifiable', 'VM'),
- DartLib('Map.identity', 'VV'),
];
}
diff --git a/runtime/tools/dartfuzz/dartfuzz_test.dart b/runtime/tools/dartfuzz/dartfuzz_test.dart
index dc61138..1510b3f 100644
--- a/runtime/tools/dartfuzz/dartfuzz_test.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_test.dart
@@ -345,12 +345,13 @@
fp = samePrecision(mode1, mode2);
// Occasionally test FFI.
ffi = ffiCapable(mode1, mode2) && (rand.nextInt(5) == 0);
+ flatTp = !nestedTypesAllowed(mode1, mode2) || (rand.nextInt(5) == 0);
runner1 =
TestRunner.getTestRunner(mode1, top, tmpDir.path, env, fileName, rand);
runner2 =
TestRunner.getTestRunner(mode2, top, tmpDir.path, env, fileName, rand);
isolate =
- 'Isolate (${tmpDir.path}) ${ffi ? "" : "NO-"}FFI ${fp ? "" : "NO-"}FP : '
+ 'Isolate (${tmpDir.path}) ${fp ? "" : "NO-"}FP ${ffi ? "" : "NO-"}FFI ${flatTp ? "" : "NO-"}FLAT : '
'${runner1.description} - ${runner2.description}';
start_time = DateTime.now().millisecondsSinceEpoch;
@@ -376,6 +377,9 @@
(mode2.startsWith('jit') || mode2.startsWith('kbc')) &&
(!mode1.contains('arm') && !mode2.contains('arm'));
+ bool nestedTypesAllowed(String mode1, String mode2) =>
+ (!mode1.contains('arm') && !mode2.contains('arm'));
+
bool timeIsUp() {
if (time > 0) {
current_time = DateTime.now().millisecondsSinceEpoch;
@@ -404,7 +408,7 @@
void generateTest() {
final file = File(fileName).openSync(mode: FileMode.write);
- DartFuzz(seed, fp, ffi, file).run();
+ DartFuzz(seed, fp, ffi, flatTp, file).run();
file.closeSync();
}
@@ -514,7 +518,8 @@
void showReproduce() {
print("\n-- BEGIN REPRODUCE --\n");
- print("dartfuzz.dart --${ffi ? "" : "no-"}ffi --${fp ? "" : "no-"}fp "
+ print("dartfuzz.dart --${fp ? "" : "no-"}fp --${ffi ? "" : "no-"}ffi "
+ "--${flatTp ? "" : "no-"}flat "
"--seed ${seed} $fileName");
print("\n-- RUN 1 --\n");
runner1.printReproductionCommand();
@@ -542,6 +547,7 @@
TestRunner runner2;
bool fp;
bool ffi;
+ bool flatTp;
String isolate;
int seed;
diff --git a/runtime/tools/dartfuzz/dartfuzz_type_table.dart b/runtime/tools/dartfuzz/dartfuzz_type_table.dart
new file mode 100644
index 0000000..bcd16d2
--- /dev/null
+++ b/runtime/tools/dartfuzz/dartfuzz_type_table.dart
@@ -0,0 +1,7825 @@
+// Copyright (c) 2019, 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.
+
+/// Class that represents some common Dart types.
+///
+/// NOTE: this code has been generated automatically.
+///
+class DartType {
+ final String name;
+ const DartType._withName(this.name);
+ factory DartType.fromDartConfig(
+ {bool enableFp = false, bool disableNesting = false}) {
+ if (enableFp && !disableNesting) {
+ return DartType();
+ } else if (!enableFp && !disableNesting) {
+ return DartTypeNoFp();
+ } else if (enableFp && disableNesting) {
+ return DartTypeFlatTp();
+ } else {
+ return DartTypeNoFpFlatTp();
+ }
+ }
+ const DartType() : name = null;
+ static bool isListType(DartType tp) {
+ return DartType._listTypes.contains(tp);
+ }
+
+ static bool isMapType(DartType tp) {
+ return DartType._mapTypes.contains(tp);
+ }
+
+ static bool isCollectionType(DartType tp) {
+ return DartType._collectionTypes.contains(tp);
+ }
+
+ static bool isGrowableType(DartType tp) {
+ return DartType._growableTypes.contains(tp);
+ }
+
+ static bool isComplexType(DartType tp) {
+ return DartType._complexTypes.contains(tp);
+ }
+
+ bool isInterfaceOfType(DartType tp, DartType iTp) {
+ return _interfaceRels.containsKey(iTp) && _interfaceRels[iTp].contains(tp);
+ }
+
+ Set<DartType> get mapTypes {
+ return _mapTypes;
+ }
+
+ bool isSpecializable(DartType tp) {
+ return _interfaceRels.containsKey(tp);
+ }
+
+ Set<DartType> interfaces(DartType tp) {
+ if (_interfaceRels.containsKey(tp)) {
+ return _interfaceRels[tp];
+ }
+ return null;
+ }
+
+ DartType indexType(DartType tp) {
+ if (_indexedBy.containsKey(tp)) {
+ return _indexedBy[tp];
+ }
+ return null;
+ }
+
+ Set<DartType> indexableElementTypes(DartType tp) {
+ if (_indexableElementOf.containsKey(tp)) {
+ return _indexableElementOf[tp];
+ }
+ return null;
+ }
+
+ bool isIndexableElementType(DartType tp) {
+ return _indexableElementOf.containsKey(tp);
+ }
+
+ DartType elementType(DartType tp) {
+ if (_subscriptsTo.containsKey(tp)) {
+ return _subscriptsTo[tp];
+ }
+ return null;
+ }
+
+ Set<DartType> get iterableTypes1 {
+ return _iterableTypes1;
+ }
+
+ Set<String> uniOps(DartType tp) {
+ if (_uniOps.containsKey(tp)) {
+ return _uniOps[tp];
+ }
+ return <String>{};
+ }
+
+ Set<String> binOps(DartType tp) {
+ if (_binOps.containsKey(tp)) {
+ return _binOps[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ Set<List<DartType>> binOpParameters(DartType tp, String op) {
+ if (_binOps.containsKey(tp) && _binOps[tp].containsKey(op)) {
+ return _binOps[tp][op];
+ }
+ return null;
+ }
+
+ Set<String> assignOps(DartType tp) {
+ if (_assignOps.containsKey(tp)) {
+ return _assignOps[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ Set<DartType> assignOpRhs(DartType tp, String op) {
+ if (_assignOps.containsKey(tp) && _assignOps[tp].containsKey(op)) {
+ return _assignOps[tp][op];
+ }
+ return <DartType>{};
+ }
+
+ bool hasConstructor(DartType tp) {
+ return _constructors.containsKey(tp);
+ }
+
+ Set<String> constructors(DartType tp) {
+ if (_constructors.containsKey(tp)) {
+ return _constructors[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ List<DartType> constructorParameters(DartType tp, String constructor) {
+ if (_constructors.containsKey(tp) &&
+ _constructors[tp].containsKey(constructor)) {
+ return _constructors[tp][constructor];
+ }
+ return null;
+ }
+
+ Set<DartType> get allTypes {
+ return _allTypes;
+ }
+
+ static const INT8LIST = const DartType._withName("Int8List");
+ static const UINT8LIST = const DartType._withName("Uint8List");
+ static const UINT8CLAMPEDLIST = const DartType._withName("Uint8ClampedList");
+ static const INT16LIST = const DartType._withName("Int16List");
+ static const UINT16LIST = const DartType._withName("Uint16List");
+ static const INT32LIST = const DartType._withName("Int32List");
+ static const UINT32LIST = const DartType._withName("Uint32List");
+ static const INT64LIST = const DartType._withName("Int64List");
+ static const UINT64LIST = const DartType._withName("Uint64List");
+ static const FLOAT32LIST = const DartType._withName("Float32List");
+ static const FLOAT64LIST = const DartType._withName("Float64List");
+ static const FLOAT32X4LIST = const DartType._withName("Float32x4List");
+ static const INT32X4LIST = const DartType._withName("Int32x4List");
+ static const FLOAT64X2LIST = const DartType._withName("Float64x2List");
+ static const FLOAT32X4 = const DartType._withName("Float32x4");
+ static const INT32X4 = const DartType._withName("Int32x4");
+ static const FLOAT64X2 = const DartType._withName("Float64x2");
+ static const BOOL = const DartType._withName("bool");
+ static const DOUBLE = const DartType._withName("double");
+ static const DURATION = const DartType._withName("Duration");
+ static const INT = const DartType._withName("int");
+ static const NUM = const DartType._withName("num");
+ static const STRING = const DartType._withName("String");
+ static const LIST_BOOL = const DartType._withName("List<bool>");
+ static const LIST_DOUBLE = const DartType._withName("List<double>");
+ static const LIST_INT = const DartType._withName("List<int>");
+ static const LIST_STRING = const DartType._withName("List<String>");
+ static const SET_BOOL = const DartType._withName("Set<bool>");
+ static const SET_DOUBLE = const DartType._withName("Set<double>");
+ static const SET_INT = const DartType._withName("Set<int>");
+ static const SET_STRING = const DartType._withName("Set<String>");
+ static const MAP_BOOL_BOOL = const DartType._withName("Map<bool, bool>");
+ static const MAP_BOOL_DOUBLE = const DartType._withName("Map<bool, double>");
+ static const MAP_BOOL_INT = const DartType._withName("Map<bool, int>");
+ static const MAP_BOOL_STRING = const DartType._withName("Map<bool, String>");
+ static const MAP_DOUBLE_BOOL = const DartType._withName("Map<double, bool>");
+ static const MAP_DOUBLE_DOUBLE =
+ const DartType._withName("Map<double, double>");
+ static const MAP_DOUBLE_INT = const DartType._withName("Map<double, int>");
+ static const MAP_DOUBLE_STRING =
+ const DartType._withName("Map<double, String>");
+ static const MAP_INT_BOOL = const DartType._withName("Map<int, bool>");
+ static const MAP_INT_DOUBLE = const DartType._withName("Map<int, double>");
+ static const MAP_INT_INT = const DartType._withName("Map<int, int>");
+ static const MAP_INT_STRING = const DartType._withName("Map<int, String>");
+ static const MAP_STRING_BOOL = const DartType._withName("Map<String, bool>");
+ static const MAP_STRING_DOUBLE =
+ const DartType._withName("Map<String, double>");
+ static const MAP_STRING_INT = const DartType._withName("Map<String, int>");
+ static const MAP_STRING_STRING =
+ const DartType._withName("Map<String, String>");
+ static const LIST_MAP_STRING_INT =
+ const DartType._withName("List<Map<String, int>>");
+ static const SET_MAP_STRING_BOOL =
+ const DartType._withName("Set<Map<String, bool>>");
+ static const MAP_BOOL_MAP_INT_INT =
+ const DartType._withName("Map<bool, Map<int, int>>");
+ static const MAP_DOUBLE_MAP_INT_DOUBLE =
+ const DartType._withName("Map<double, Map<int, double>>");
+ static const MAP_INT_MAP_DOUBLE_STRING =
+ const DartType._withName("Map<int, Map<double, String>>");
+ static const MAP_STRING_MAP_DOUBLE_DOUBLE =
+ const DartType._withName("Map<String, Map<double, double>>");
+ static const MAP_LIST_BOOL_MAP_BOOL_STRING =
+ const DartType._withName("Map<List<bool>, Map<bool, String>>");
+ static const MAP_LIST_DOUBLE_MAP_BOOL_INT =
+ const DartType._withName("Map<List<double>, Map<bool, int>>");
+ static const MAP_LIST_INT_MAP_BOOL_BOOL =
+ const DartType._withName("Map<List<int>, Map<bool, bool>>");
+ static const MAP_LIST_STRING_SET_INT =
+ const DartType._withName("Map<List<String>, Set<int>>");
+ static const MAP_SET_BOOL_SET_BOOL =
+ const DartType._withName("Map<Set<bool>, Set<bool>>");
+ static const MAP_SET_DOUBLE_LIST_STRING =
+ const DartType._withName("Map<Set<double>, List<String>>");
+ static const MAP_SET_INT_LIST_DOUBLE =
+ const DartType._withName("Map<Set<int>, List<double>>");
+ static const MAP_SET_STRING_STRING =
+ const DartType._withName("Map<Set<String>, String>");
+ static const MAP_MAP_BOOL_BOOL_DOUBLE =
+ const DartType._withName("Map<Map<bool, bool>, double>");
+ static const MAP_MAP_BOOL_DOUBLE_BOOL =
+ const DartType._withName("Map<Map<bool, double>, bool>");
+ static const MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT =
+ const DartType._withName("Map<Map<bool, double>, Map<String, int>>");
+ static const MAP_MAP_BOOL_INT_MAP_STRING_BOOL =
+ const DartType._withName("Map<Map<bool, int>, Map<String, bool>>");
+ static const MAP_MAP_BOOL_STRING_MAP_INT_INT =
+ const DartType._withName("Map<Map<bool, String>, Map<int, int>>");
+ static const MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE =
+ const DartType._withName("Map<Map<double, bool>, Map<int, double>>");
+ static const MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING =
+ const DartType._withName("Map<Map<double, double>, Map<double, String>>");
+ static const MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE =
+ const DartType._withName("Map<Map<double, int>, Map<double, double>>");
+ static const MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING =
+ const DartType._withName("Map<Map<double, String>, Map<bool, String>>");
+ static const MAP_MAP_INT_BOOL_MAP_BOOL_INT =
+ const DartType._withName("Map<Map<int, bool>, Map<bool, int>>");
+ static const MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL =
+ const DartType._withName("Map<Map<int, double>, Map<bool, bool>>");
+ static const MAP_MAP_INT_INT_SET_INT =
+ const DartType._withName("Map<Map<int, int>, Set<int>>");
+ static const MAP_MAP_INT_STRING_SET_BOOL =
+ const DartType._withName("Map<Map<int, String>, Set<bool>>");
+ static const MAP_MAP_STRING_BOOL_LIST_STRING =
+ const DartType._withName("Map<Map<String, bool>, List<String>>");
+ static const MAP_MAP_STRING_DOUBLE_LIST_DOUBLE =
+ const DartType._withName("Map<Map<String, double>, List<double>>");
+ static const MAP_MAP_STRING_INT_STRING =
+ const DartType._withName("Map<Map<String, int>, String>");
+ static const MAP_MAP_STRING_STRING_DOUBLE =
+ const DartType._withName("Map<Map<String, String>, double>");
+
+ // NON INSTANTIABLE
+ static const EFFICIENTLENGTHITERABLE_INT =
+ const DartType._withName("__EFFICIENTLENGTHITERABLE_INT");
+ static const _TYPEDINTLIST = const DartType._withName("___TYPEDINTLIST");
+ static const OBJECT = const DartType._withName("__OBJECT");
+ static const TYPEDDATA = const DartType._withName("__TYPEDDATA");
+ static const ITERABLE_INT = const DartType._withName("__ITERABLE_INT");
+ static const EFFICIENTLENGTHITERABLE_DOUBLE =
+ const DartType._withName("__EFFICIENTLENGTHITERABLE_DOUBLE");
+ static const _TYPEDFLOATLIST = const DartType._withName("___TYPEDFLOATLIST");
+ static const ITERABLE_DOUBLE = const DartType._withName("__ITERABLE_DOUBLE");
+ static const LIST_FLOAT32X4 = const DartType._withName("__LIST_FLOAT32X4");
+ static const EFFICIENTLENGTHITERABLE_FLOAT32X4 =
+ const DartType._withName("__EFFICIENTLENGTHITERABLE_FLOAT32X4");
+ static const ITERABLE_FLOAT32X4 =
+ const DartType._withName("__ITERABLE_FLOAT32X4");
+ static const LIST_INT32X4 = const DartType._withName("__LIST_INT32X4");
+ static const EFFICIENTLENGTHITERABLE_INT32X4 =
+ const DartType._withName("__EFFICIENTLENGTHITERABLE_INT32X4");
+ static const ITERABLE_INT32X4 =
+ const DartType._withName("__ITERABLE_INT32X4");
+ static const LIST_FLOAT64X2 = const DartType._withName("__LIST_FLOAT64X2");
+ static const EFFICIENTLENGTHITERABLE_FLOAT64X2 =
+ const DartType._withName("__EFFICIENTLENGTHITERABLE_FLOAT64X2");
+ static const ITERABLE_FLOAT64X2 =
+ const DartType._withName("__ITERABLE_FLOAT64X2");
+ static const COMPARABLE_NUM = const DartType._withName("__COMPARABLE_NUM");
+ static const COMPARABLE_DURATION =
+ const DartType._withName("__COMPARABLE_DURATION");
+ static const COMPARABLE_STRING =
+ const DartType._withName("__COMPARABLE_STRING");
+ static const PATTERN = const DartType._withName("__PATTERN");
+ static const EFFICIENTLENGTHITERABLE_BOOL =
+ const DartType._withName("__EFFICIENTLENGTHITERABLE_BOOL");
+ static const EFFICIENTLENGTHITERABLE_E =
+ const DartType._withName("__EFFICIENTLENGTHITERABLE_E");
+ static const ITERABLE_E = const DartType._withName("__ITERABLE_E");
+ static const EFFICIENTLENGTHITERABLE_STRING =
+ const DartType._withName("__EFFICIENTLENGTHITERABLE_STRING");
+ static const EFFICIENTLENGTHITERABLE_MAP_STRING_INT =
+ const DartType._withName("__EFFICIENTLENGTHITERABLE_MAP_STRING_INT");
+
+ // All types extracted from analyzer.
+ static const _allTypes = {
+ INT8LIST,
+ UINT8LIST,
+ UINT8CLAMPEDLIST,
+ INT16LIST,
+ UINT16LIST,
+ INT32LIST,
+ UINT32LIST,
+ INT64LIST,
+ UINT64LIST,
+ FLOAT32LIST,
+ FLOAT64LIST,
+ FLOAT32X4LIST,
+ INT32X4LIST,
+ FLOAT64X2LIST,
+ FLOAT32X4,
+ INT32X4,
+ FLOAT64X2,
+ BOOL,
+ DOUBLE,
+ DURATION,
+ INT,
+ NUM,
+ STRING,
+ LIST_BOOL,
+ LIST_DOUBLE,
+ LIST_INT,
+ LIST_STRING,
+ SET_BOOL,
+ SET_DOUBLE,
+ SET_INT,
+ SET_STRING,
+ MAP_BOOL_BOOL,
+ MAP_BOOL_DOUBLE,
+ MAP_BOOL_INT,
+ MAP_BOOL_STRING,
+ MAP_DOUBLE_BOOL,
+ MAP_DOUBLE_DOUBLE,
+ MAP_DOUBLE_INT,
+ MAP_DOUBLE_STRING,
+ MAP_INT_BOOL,
+ MAP_INT_DOUBLE,
+ MAP_INT_INT,
+ MAP_INT_STRING,
+ MAP_STRING_BOOL,
+ MAP_STRING_DOUBLE,
+ MAP_STRING_INT,
+ MAP_STRING_STRING,
+ LIST_MAP_STRING_INT,
+ SET_MAP_STRING_BOOL,
+ MAP_BOOL_MAP_INT_INT,
+ MAP_DOUBLE_MAP_INT_DOUBLE,
+ MAP_INT_MAP_DOUBLE_STRING,
+ MAP_STRING_MAP_DOUBLE_DOUBLE,
+ MAP_LIST_BOOL_MAP_BOOL_STRING,
+ MAP_LIST_DOUBLE_MAP_BOOL_INT,
+ MAP_LIST_INT_MAP_BOOL_BOOL,
+ MAP_LIST_STRING_SET_INT,
+ MAP_SET_BOOL_SET_BOOL,
+ MAP_SET_DOUBLE_LIST_STRING,
+ MAP_SET_INT_LIST_DOUBLE,
+ MAP_SET_STRING_STRING,
+ MAP_MAP_BOOL_BOOL_DOUBLE,
+ MAP_MAP_BOOL_DOUBLE_BOOL,
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT,
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE,
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING,
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE,
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING,
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL,
+ MAP_MAP_INT_INT_SET_INT,
+ MAP_MAP_INT_STRING_SET_BOOL,
+ MAP_MAP_STRING_BOOL_LIST_STRING,
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE,
+ MAP_MAP_STRING_INT_STRING,
+ MAP_MAP_STRING_STRING_DOUBLE,
+ };
+
+ // All List<E> types: LIST_INT, LIST_STRING, etc.
+ static const Set<DartType> _listTypes = {
+ FLOAT32LIST,
+ FLOAT32X4LIST,
+ FLOAT64LIST,
+ FLOAT64X2LIST,
+ INT16LIST,
+ INT32LIST,
+ INT32X4LIST,
+ INT64LIST,
+ INT8LIST,
+ LIST_BOOL,
+ LIST_DOUBLE,
+ LIST_INT,
+ LIST_MAP_STRING_INT,
+ LIST_STRING,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ };
+
+ // All Set types: SET_INT, SET_STRING, etc.
+ static const Set<DartType> _setTypes = {
+ SET_BOOL,
+ SET_DOUBLE,
+ SET_INT,
+ SET_MAP_STRING_BOOL,
+ SET_STRING,
+ };
+
+ // All Map<K, V> types: MAP_INT_STRING, MAP_DOUBLE_BOOL, etc.
+ static const Set<DartType> _mapTypes = {
+ MAP_BOOL_BOOL,
+ MAP_BOOL_DOUBLE,
+ MAP_BOOL_INT,
+ MAP_BOOL_MAP_INT_INT,
+ MAP_BOOL_STRING,
+ MAP_DOUBLE_BOOL,
+ MAP_DOUBLE_DOUBLE,
+ MAP_DOUBLE_INT,
+ MAP_DOUBLE_MAP_INT_DOUBLE,
+ MAP_DOUBLE_STRING,
+ MAP_INT_BOOL,
+ MAP_INT_DOUBLE,
+ MAP_INT_INT,
+ MAP_INT_MAP_DOUBLE_STRING,
+ MAP_INT_STRING,
+ MAP_LIST_BOOL_MAP_BOOL_STRING,
+ MAP_LIST_DOUBLE_MAP_BOOL_INT,
+ MAP_LIST_INT_MAP_BOOL_BOOL,
+ MAP_LIST_STRING_SET_INT,
+ MAP_MAP_BOOL_BOOL_DOUBLE,
+ MAP_MAP_BOOL_DOUBLE_BOOL,
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT,
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE,
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING,
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE,
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING,
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL,
+ MAP_MAP_INT_INT_SET_INT,
+ MAP_MAP_INT_STRING_SET_BOOL,
+ MAP_MAP_STRING_BOOL_LIST_STRING,
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE,
+ MAP_MAP_STRING_INT_STRING,
+ MAP_MAP_STRING_STRING_DOUBLE,
+ MAP_SET_BOOL_SET_BOOL,
+ MAP_SET_DOUBLE_LIST_STRING,
+ MAP_SET_INT_LIST_DOUBLE,
+ MAP_SET_STRING_STRING,
+ MAP_STRING_BOOL,
+ MAP_STRING_DOUBLE,
+ MAP_STRING_INT,
+ MAP_STRING_MAP_DOUBLE_DOUBLE,
+ MAP_STRING_STRING,
+ };
+
+ // All collection types: list, map and set types.
+ static const Set<DartType> _collectionTypes = {
+ FLOAT32LIST,
+ FLOAT32X4LIST,
+ FLOAT64LIST,
+ FLOAT64X2LIST,
+ INT16LIST,
+ INT32LIST,
+ INT32X4LIST,
+ INT64LIST,
+ INT8LIST,
+ LIST_BOOL,
+ LIST_DOUBLE,
+ LIST_INT,
+ LIST_MAP_STRING_INT,
+ LIST_STRING,
+ MAP_BOOL_BOOL,
+ MAP_BOOL_DOUBLE,
+ MAP_BOOL_INT,
+ MAP_BOOL_MAP_INT_INT,
+ MAP_BOOL_STRING,
+ MAP_DOUBLE_BOOL,
+ MAP_DOUBLE_DOUBLE,
+ MAP_DOUBLE_INT,
+ MAP_DOUBLE_MAP_INT_DOUBLE,
+ MAP_DOUBLE_STRING,
+ MAP_INT_BOOL,
+ MAP_INT_DOUBLE,
+ MAP_INT_INT,
+ MAP_INT_MAP_DOUBLE_STRING,
+ MAP_INT_STRING,
+ MAP_LIST_BOOL_MAP_BOOL_STRING,
+ MAP_LIST_DOUBLE_MAP_BOOL_INT,
+ MAP_LIST_INT_MAP_BOOL_BOOL,
+ MAP_LIST_STRING_SET_INT,
+ MAP_MAP_BOOL_BOOL_DOUBLE,
+ MAP_MAP_BOOL_DOUBLE_BOOL,
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT,
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE,
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING,
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE,
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING,
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL,
+ MAP_MAP_INT_INT_SET_INT,
+ MAP_MAP_INT_STRING_SET_BOOL,
+ MAP_MAP_STRING_BOOL_LIST_STRING,
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE,
+ MAP_MAP_STRING_INT_STRING,
+ MAP_MAP_STRING_STRING_DOUBLE,
+ MAP_SET_BOOL_SET_BOOL,
+ MAP_SET_DOUBLE_LIST_STRING,
+ MAP_SET_INT_LIST_DOUBLE,
+ MAP_SET_STRING_STRING,
+ MAP_STRING_BOOL,
+ MAP_STRING_DOUBLE,
+ MAP_STRING_INT,
+ MAP_STRING_MAP_DOUBLE_DOUBLE,
+ MAP_STRING_STRING,
+ SET_BOOL,
+ SET_DOUBLE,
+ SET_INT,
+ SET_MAP_STRING_BOOL,
+ SET_STRING,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ };
+
+ // All growable types: list, map, set and string types.
+ static const Set<DartType> _growableTypes = {
+ FLOAT32LIST,
+ FLOAT32X4LIST,
+ FLOAT64LIST,
+ FLOAT64X2LIST,
+ INT16LIST,
+ INT32LIST,
+ INT32X4LIST,
+ INT64LIST,
+ INT8LIST,
+ LIST_BOOL,
+ LIST_DOUBLE,
+ LIST_INT,
+ LIST_MAP_STRING_INT,
+ LIST_STRING,
+ MAP_BOOL_BOOL,
+ MAP_BOOL_DOUBLE,
+ MAP_BOOL_INT,
+ MAP_BOOL_MAP_INT_INT,
+ MAP_BOOL_STRING,
+ MAP_DOUBLE_BOOL,
+ MAP_DOUBLE_DOUBLE,
+ MAP_DOUBLE_INT,
+ MAP_DOUBLE_MAP_INT_DOUBLE,
+ MAP_DOUBLE_STRING,
+ MAP_INT_BOOL,
+ MAP_INT_DOUBLE,
+ MAP_INT_INT,
+ MAP_INT_MAP_DOUBLE_STRING,
+ MAP_INT_STRING,
+ MAP_LIST_BOOL_MAP_BOOL_STRING,
+ MAP_LIST_DOUBLE_MAP_BOOL_INT,
+ MAP_LIST_INT_MAP_BOOL_BOOL,
+ MAP_LIST_STRING_SET_INT,
+ MAP_MAP_BOOL_BOOL_DOUBLE,
+ MAP_MAP_BOOL_DOUBLE_BOOL,
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT,
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE,
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING,
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE,
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING,
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL,
+ MAP_MAP_INT_INT_SET_INT,
+ MAP_MAP_INT_STRING_SET_BOOL,
+ MAP_MAP_STRING_BOOL_LIST_STRING,
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE,
+ MAP_MAP_STRING_INT_STRING,
+ MAP_MAP_STRING_STRING_DOUBLE,
+ MAP_SET_BOOL_SET_BOOL,
+ MAP_SET_DOUBLE_LIST_STRING,
+ MAP_SET_INT_LIST_DOUBLE,
+ MAP_SET_STRING_STRING,
+ MAP_STRING_BOOL,
+ MAP_STRING_DOUBLE,
+ MAP_STRING_INT,
+ MAP_STRING_MAP_DOUBLE_DOUBLE,
+ MAP_STRING_STRING,
+ SET_BOOL,
+ SET_DOUBLE,
+ SET_INT,
+ SET_MAP_STRING_BOOL,
+ SET_STRING,
+ STRING,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ };
+
+ // All floating point types: DOUBLE, SET_DOUBLE, MAP_X_DOUBLE, etc.
+ static const Set<DartType> _fpTypes = {
+ DOUBLE,
+ FLOAT32LIST,
+ FLOAT32X4,
+ FLOAT32X4LIST,
+ FLOAT64LIST,
+ FLOAT64X2,
+ FLOAT64X2LIST,
+ LIST_DOUBLE,
+ MAP_BOOL_DOUBLE,
+ MAP_DOUBLE_BOOL,
+ MAP_DOUBLE_DOUBLE,
+ MAP_DOUBLE_INT,
+ MAP_DOUBLE_MAP_INT_DOUBLE,
+ MAP_DOUBLE_STRING,
+ MAP_INT_DOUBLE,
+ MAP_INT_MAP_DOUBLE_STRING,
+ MAP_LIST_DOUBLE_MAP_BOOL_INT,
+ MAP_MAP_BOOL_BOOL_DOUBLE,
+ MAP_MAP_BOOL_DOUBLE_BOOL,
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT,
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE,
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING,
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE,
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING,
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL,
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE,
+ MAP_MAP_STRING_STRING_DOUBLE,
+ MAP_SET_DOUBLE_LIST_STRING,
+ MAP_SET_INT_LIST_DOUBLE,
+ MAP_STRING_DOUBLE,
+ MAP_STRING_MAP_DOUBLE_DOUBLE,
+ SET_DOUBLE,
+ };
+
+ // All trivially indexable types: Map types and List types.
+ // Elements of these can be written and read by [], unlike Set
+ // which uses getElementAt to access individual elements.
+ static const Set<DartType> _indexableTypes = {
+ FLOAT32LIST,
+ FLOAT32X4LIST,
+ FLOAT64LIST,
+ FLOAT64X2LIST,
+ INT16LIST,
+ INT32LIST,
+ INT32X4LIST,
+ INT64LIST,
+ INT8LIST,
+ LIST_BOOL,
+ LIST_DOUBLE,
+ LIST_INT,
+ LIST_MAP_STRING_INT,
+ LIST_STRING,
+ MAP_BOOL_BOOL,
+ MAP_BOOL_DOUBLE,
+ MAP_BOOL_INT,
+ MAP_BOOL_MAP_INT_INT,
+ MAP_BOOL_STRING,
+ MAP_DOUBLE_BOOL,
+ MAP_DOUBLE_DOUBLE,
+ MAP_DOUBLE_INT,
+ MAP_DOUBLE_MAP_INT_DOUBLE,
+ MAP_DOUBLE_STRING,
+ MAP_INT_BOOL,
+ MAP_INT_DOUBLE,
+ MAP_INT_INT,
+ MAP_INT_MAP_DOUBLE_STRING,
+ MAP_INT_STRING,
+ MAP_LIST_BOOL_MAP_BOOL_STRING,
+ MAP_LIST_DOUBLE_MAP_BOOL_INT,
+ MAP_LIST_INT_MAP_BOOL_BOOL,
+ MAP_LIST_STRING_SET_INT,
+ MAP_MAP_BOOL_BOOL_DOUBLE,
+ MAP_MAP_BOOL_DOUBLE_BOOL,
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT,
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE,
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING,
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE,
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING,
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL,
+ MAP_MAP_INT_INT_SET_INT,
+ MAP_MAP_INT_STRING_SET_BOOL,
+ MAP_MAP_STRING_BOOL_LIST_STRING,
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE,
+ MAP_MAP_STRING_INT_STRING,
+ MAP_MAP_STRING_STRING_DOUBLE,
+ MAP_SET_BOOL_SET_BOOL,
+ MAP_SET_DOUBLE_LIST_STRING,
+ MAP_SET_INT_LIST_DOUBLE,
+ MAP_SET_STRING_STRING,
+ MAP_STRING_BOOL,
+ MAP_STRING_DOUBLE,
+ MAP_STRING_INT,
+ MAP_STRING_MAP_DOUBLE_DOUBLE,
+ MAP_STRING_STRING,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ };
+
+ // Map type to the resulting type when subscripted.
+ // Example: List<String> subscripts to String.
+ static const Map<DartType, DartType> _subscriptsTo = {
+ DURATION: DURATION,
+ FLOAT32LIST: DOUBLE,
+ FLOAT32X4LIST: FLOAT32X4,
+ FLOAT64LIST: DOUBLE,
+ FLOAT64X2LIST: FLOAT64X2,
+ INT16LIST: INT,
+ INT32LIST: INT,
+ INT32X4LIST: INT32X4,
+ INT64LIST: INT,
+ INT8LIST: INT,
+ LIST_BOOL: BOOL,
+ LIST_DOUBLE: DOUBLE,
+ LIST_INT: INT,
+ LIST_MAP_STRING_INT: MAP_STRING_INT,
+ LIST_STRING: STRING,
+ MAP_BOOL_BOOL: BOOL,
+ MAP_BOOL_DOUBLE: DOUBLE,
+ MAP_BOOL_INT: INT,
+ MAP_BOOL_MAP_INT_INT: MAP_INT_INT,
+ MAP_BOOL_STRING: STRING,
+ MAP_DOUBLE_BOOL: BOOL,
+ MAP_DOUBLE_DOUBLE: DOUBLE,
+ MAP_DOUBLE_INT: INT,
+ MAP_DOUBLE_MAP_INT_DOUBLE: MAP_INT_DOUBLE,
+ MAP_DOUBLE_STRING: STRING,
+ MAP_INT_BOOL: BOOL,
+ MAP_INT_DOUBLE: DOUBLE,
+ MAP_INT_INT: INT,
+ MAP_INT_MAP_DOUBLE_STRING: MAP_DOUBLE_STRING,
+ MAP_INT_STRING: STRING,
+ MAP_LIST_BOOL_MAP_BOOL_STRING: MAP_BOOL_STRING,
+ MAP_LIST_DOUBLE_MAP_BOOL_INT: MAP_BOOL_INT,
+ MAP_LIST_INT_MAP_BOOL_BOOL: MAP_BOOL_BOOL,
+ MAP_LIST_STRING_SET_INT: SET_INT,
+ MAP_MAP_BOOL_BOOL_DOUBLE: DOUBLE,
+ MAP_MAP_BOOL_DOUBLE_BOOL: BOOL,
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT: MAP_STRING_INT,
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL: MAP_STRING_BOOL,
+ MAP_MAP_BOOL_STRING_MAP_INT_INT: MAP_INT_INT,
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE: MAP_INT_DOUBLE,
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING: MAP_DOUBLE_STRING,
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE: MAP_DOUBLE_DOUBLE,
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING: MAP_BOOL_STRING,
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT: MAP_BOOL_INT,
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL: MAP_BOOL_BOOL,
+ MAP_MAP_INT_INT_SET_INT: SET_INT,
+ MAP_MAP_INT_STRING_SET_BOOL: SET_BOOL,
+ MAP_MAP_STRING_BOOL_LIST_STRING: LIST_STRING,
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE: LIST_DOUBLE,
+ MAP_MAP_STRING_INT_STRING: STRING,
+ MAP_MAP_STRING_STRING_DOUBLE: DOUBLE,
+ MAP_SET_BOOL_SET_BOOL: SET_BOOL,
+ MAP_SET_DOUBLE_LIST_STRING: LIST_STRING,
+ MAP_SET_INT_LIST_DOUBLE: LIST_DOUBLE,
+ MAP_SET_STRING_STRING: STRING,
+ MAP_STRING_BOOL: BOOL,
+ MAP_STRING_DOUBLE: DOUBLE,
+ MAP_STRING_INT: INT,
+ MAP_STRING_MAP_DOUBLE_DOUBLE: MAP_DOUBLE_DOUBLE,
+ MAP_STRING_STRING: STRING,
+ NUM: NUM,
+ SET_BOOL: BOOL,
+ SET_DOUBLE: DOUBLE,
+ SET_INT: INT,
+ SET_MAP_STRING_BOOL: MAP_STRING_BOOL,
+ SET_STRING: STRING,
+ STRING: STRING,
+ UINT16LIST: INT,
+ UINT32LIST: INT,
+ UINT64LIST: INT,
+ UINT8CLAMPEDLIST: INT,
+ UINT8LIST: INT,
+ };
+
+ // Map type to type required as index.
+ // Example: List<String> is indexed by int,
+ // Map<String, double> indexed by String.
+ static const Map<DartType, DartType> _indexedBy = {
+ FLOAT32LIST: INT,
+ FLOAT32X4LIST: INT,
+ FLOAT64LIST: INT,
+ FLOAT64X2LIST: INT,
+ INT16LIST: INT,
+ INT32LIST: INT,
+ INT32X4LIST: INT,
+ INT64LIST: INT,
+ INT8LIST: INT,
+ LIST_BOOL: INT,
+ LIST_DOUBLE: INT,
+ LIST_INT: INT,
+ LIST_MAP_STRING_INT: INT,
+ LIST_STRING: INT,
+ MAP_BOOL_BOOL: BOOL,
+ MAP_BOOL_DOUBLE: BOOL,
+ MAP_BOOL_INT: BOOL,
+ MAP_BOOL_MAP_INT_INT: BOOL,
+ MAP_BOOL_STRING: BOOL,
+ MAP_DOUBLE_BOOL: DOUBLE,
+ MAP_DOUBLE_DOUBLE: DOUBLE,
+ MAP_DOUBLE_INT: DOUBLE,
+ MAP_DOUBLE_MAP_INT_DOUBLE: DOUBLE,
+ MAP_DOUBLE_STRING: DOUBLE,
+ MAP_INT_BOOL: INT,
+ MAP_INT_DOUBLE: INT,
+ MAP_INT_INT: INT,
+ MAP_INT_MAP_DOUBLE_STRING: INT,
+ MAP_INT_STRING: INT,
+ MAP_LIST_BOOL_MAP_BOOL_STRING: LIST_BOOL,
+ MAP_LIST_DOUBLE_MAP_BOOL_INT: LIST_DOUBLE,
+ MAP_LIST_INT_MAP_BOOL_BOOL: LIST_INT,
+ MAP_LIST_STRING_SET_INT: LIST_STRING,
+ MAP_MAP_BOOL_BOOL_DOUBLE: MAP_BOOL_BOOL,
+ MAP_MAP_BOOL_DOUBLE_BOOL: MAP_BOOL_DOUBLE,
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT: MAP_BOOL_DOUBLE,
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL: MAP_BOOL_INT,
+ MAP_MAP_BOOL_STRING_MAP_INT_INT: MAP_BOOL_STRING,
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE: MAP_DOUBLE_BOOL,
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING: MAP_DOUBLE_DOUBLE,
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE: MAP_DOUBLE_INT,
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING: MAP_DOUBLE_STRING,
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT: MAP_INT_BOOL,
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL: MAP_INT_DOUBLE,
+ MAP_MAP_INT_INT_SET_INT: MAP_INT_INT,
+ MAP_MAP_INT_STRING_SET_BOOL: MAP_INT_STRING,
+ MAP_MAP_STRING_BOOL_LIST_STRING: MAP_STRING_BOOL,
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE: MAP_STRING_DOUBLE,
+ MAP_MAP_STRING_INT_STRING: MAP_STRING_INT,
+ MAP_MAP_STRING_STRING_DOUBLE: MAP_STRING_STRING,
+ MAP_SET_BOOL_SET_BOOL: SET_BOOL,
+ MAP_SET_DOUBLE_LIST_STRING: SET_DOUBLE,
+ MAP_SET_INT_LIST_DOUBLE: SET_INT,
+ MAP_SET_STRING_STRING: SET_STRING,
+ MAP_STRING_BOOL: STRING,
+ MAP_STRING_DOUBLE: STRING,
+ MAP_STRING_INT: STRING,
+ MAP_STRING_MAP_DOUBLE_DOUBLE: STRING,
+ MAP_STRING_STRING: STRING,
+ UINT16LIST: INT,
+ UINT32LIST: INT,
+ UINT64LIST: INT,
+ UINT8CLAMPEDLIST: INT,
+ UINT8LIST: INT,
+ };
+
+ // Map type to a Set of types that contain it as an element.
+ // Example: String is element of List<String> and Map<int, String>
+ static const Map<DartType, Set<DartType>> _elementOf = {
+ BOOL: {
+ LIST_BOOL,
+ MAP_BOOL_BOOL,
+ MAP_DOUBLE_BOOL,
+ MAP_INT_BOOL,
+ MAP_MAP_BOOL_DOUBLE_BOOL,
+ MAP_STRING_BOOL,
+ SET_BOOL,
+ },
+ DOUBLE: {
+ FLOAT32LIST,
+ FLOAT64LIST,
+ LIST_DOUBLE,
+ MAP_BOOL_DOUBLE,
+ MAP_DOUBLE_DOUBLE,
+ MAP_INT_DOUBLE,
+ MAP_MAP_BOOL_BOOL_DOUBLE,
+ MAP_MAP_STRING_STRING_DOUBLE,
+ MAP_STRING_DOUBLE,
+ SET_DOUBLE,
+ },
+ DURATION: {
+ DURATION,
+ },
+ FLOAT32X4: {
+ FLOAT32X4LIST,
+ },
+ FLOAT64X2: {
+ FLOAT64X2LIST,
+ },
+ INT: {
+ INT16LIST,
+ INT32LIST,
+ INT64LIST,
+ INT8LIST,
+ LIST_INT,
+ MAP_BOOL_INT,
+ MAP_DOUBLE_INT,
+ MAP_INT_INT,
+ MAP_STRING_INT,
+ SET_INT,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ },
+ INT32X4: {
+ INT32X4LIST,
+ },
+ LIST_DOUBLE: {
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE,
+ MAP_SET_INT_LIST_DOUBLE,
+ },
+ LIST_STRING: {
+ MAP_MAP_STRING_BOOL_LIST_STRING,
+ MAP_SET_DOUBLE_LIST_STRING,
+ },
+ MAP_BOOL_BOOL: {
+ MAP_LIST_INT_MAP_BOOL_BOOL,
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL,
+ },
+ MAP_BOOL_INT: {
+ MAP_LIST_DOUBLE_MAP_BOOL_INT,
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ },
+ MAP_BOOL_STRING: {
+ MAP_LIST_BOOL_MAP_BOOL_STRING,
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING,
+ },
+ MAP_DOUBLE_DOUBLE: {
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE,
+ MAP_STRING_MAP_DOUBLE_DOUBLE,
+ },
+ MAP_DOUBLE_STRING: {
+ MAP_INT_MAP_DOUBLE_STRING,
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING,
+ },
+ MAP_INT_DOUBLE: {
+ MAP_DOUBLE_MAP_INT_DOUBLE,
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE,
+ },
+ MAP_INT_INT: {
+ MAP_BOOL_MAP_INT_INT,
+ MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ },
+ MAP_STRING_BOOL: {
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ SET_MAP_STRING_BOOL,
+ },
+ MAP_STRING_INT: {
+ LIST_MAP_STRING_INT,
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT,
+ },
+ NUM: {
+ NUM,
+ },
+ SET_BOOL: {
+ MAP_MAP_INT_STRING_SET_BOOL,
+ MAP_SET_BOOL_SET_BOOL,
+ },
+ SET_INT: {
+ MAP_LIST_STRING_SET_INT,
+ MAP_MAP_INT_INT_SET_INT,
+ },
+ STRING: {
+ LIST_STRING,
+ MAP_BOOL_STRING,
+ MAP_DOUBLE_STRING,
+ MAP_INT_STRING,
+ MAP_MAP_STRING_INT_STRING,
+ MAP_SET_STRING_STRING,
+ MAP_STRING_STRING,
+ SET_STRING,
+ STRING,
+ },
+ };
+
+ // Map type to a Set of types that contain it as an indexable element.
+ // Same as element of, but without Set types.
+ static const Map<DartType, Set<DartType>> _indexableElementOf = {
+ BOOL: {
+ LIST_BOOL,
+ MAP_BOOL_BOOL,
+ MAP_DOUBLE_BOOL,
+ MAP_INT_BOOL,
+ MAP_MAP_BOOL_DOUBLE_BOOL,
+ MAP_STRING_BOOL,
+ },
+ DOUBLE: {
+ FLOAT32LIST,
+ FLOAT64LIST,
+ LIST_DOUBLE,
+ MAP_BOOL_DOUBLE,
+ MAP_DOUBLE_DOUBLE,
+ MAP_INT_DOUBLE,
+ MAP_MAP_BOOL_BOOL_DOUBLE,
+ MAP_MAP_STRING_STRING_DOUBLE,
+ MAP_STRING_DOUBLE,
+ },
+ FLOAT32X4: {
+ FLOAT32X4LIST,
+ },
+ FLOAT64X2: {
+ FLOAT64X2LIST,
+ },
+ INT: {
+ INT16LIST,
+ INT32LIST,
+ INT64LIST,
+ INT8LIST,
+ LIST_INT,
+ MAP_BOOL_INT,
+ MAP_DOUBLE_INT,
+ MAP_INT_INT,
+ MAP_STRING_INT,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ },
+ INT32X4: {
+ INT32X4LIST,
+ },
+ LIST_DOUBLE: {
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE,
+ MAP_SET_INT_LIST_DOUBLE,
+ },
+ LIST_STRING: {
+ MAP_MAP_STRING_BOOL_LIST_STRING,
+ MAP_SET_DOUBLE_LIST_STRING,
+ },
+ MAP_BOOL_BOOL: {
+ MAP_LIST_INT_MAP_BOOL_BOOL,
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL,
+ },
+ MAP_BOOL_INT: {
+ MAP_LIST_DOUBLE_MAP_BOOL_INT,
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ },
+ MAP_BOOL_STRING: {
+ MAP_LIST_BOOL_MAP_BOOL_STRING,
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING,
+ },
+ MAP_DOUBLE_DOUBLE: {
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE,
+ MAP_STRING_MAP_DOUBLE_DOUBLE,
+ },
+ MAP_DOUBLE_STRING: {
+ MAP_INT_MAP_DOUBLE_STRING,
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING,
+ },
+ MAP_INT_DOUBLE: {
+ MAP_DOUBLE_MAP_INT_DOUBLE,
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE,
+ },
+ MAP_INT_INT: {
+ MAP_BOOL_MAP_INT_INT,
+ MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ },
+ MAP_STRING_BOOL: {
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ },
+ MAP_STRING_INT: {
+ LIST_MAP_STRING_INT,
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT,
+ },
+ SET_BOOL: {
+ MAP_MAP_INT_STRING_SET_BOOL,
+ MAP_SET_BOOL_SET_BOOL,
+ },
+ SET_INT: {
+ MAP_LIST_STRING_SET_INT,
+ MAP_MAP_INT_INT_SET_INT,
+ },
+ STRING: {
+ LIST_STRING,
+ MAP_BOOL_STRING,
+ MAP_DOUBLE_STRING,
+ MAP_INT_STRING,
+ MAP_MAP_STRING_INT_STRING,
+ MAP_SET_STRING_STRING,
+ MAP_STRING_STRING,
+ },
+ };
+
+ // All iterable types: Set types + List types.
+ // These can be used in for(x in <iterable type>),
+ // therefore Map is not included.
+ static const Set<DartType> _iterableTypes1 = {
+ FLOAT32LIST,
+ FLOAT32X4LIST,
+ FLOAT64LIST,
+ FLOAT64X2LIST,
+ INT16LIST,
+ INT32LIST,
+ INT32X4LIST,
+ INT64LIST,
+ INT8LIST,
+ LIST_BOOL,
+ LIST_DOUBLE,
+ LIST_INT,
+ LIST_MAP_STRING_INT,
+ LIST_STRING,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ };
+
+ // Complex types: Collection types instantiated with nested argument
+ // e.g Map<List<>, >.
+ static const Set<DartType> _complexTypes = {
+ LIST_MAP_STRING_INT,
+ MAP_BOOL_MAP_INT_INT,
+ MAP_DOUBLE_MAP_INT_DOUBLE,
+ MAP_INT_MAP_DOUBLE_STRING,
+ MAP_LIST_BOOL_MAP_BOOL_STRING,
+ MAP_LIST_DOUBLE_MAP_BOOL_INT,
+ MAP_LIST_INT_MAP_BOOL_BOOL,
+ MAP_LIST_STRING_SET_INT,
+ MAP_MAP_BOOL_BOOL_DOUBLE,
+ MAP_MAP_BOOL_DOUBLE_BOOL,
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT,
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE,
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING,
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE,
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING,
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL,
+ MAP_MAP_INT_INT_SET_INT,
+ MAP_MAP_INT_STRING_SET_BOOL,
+ MAP_MAP_STRING_BOOL_LIST_STRING,
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE,
+ MAP_MAP_STRING_INT_STRING,
+ MAP_MAP_STRING_STRING_DOUBLE,
+ MAP_SET_BOOL_SET_BOOL,
+ MAP_SET_DOUBLE_LIST_STRING,
+ MAP_SET_INT_LIST_DOUBLE,
+ MAP_SET_STRING_STRING,
+ MAP_STRING_MAP_DOUBLE_DOUBLE,
+ SET_MAP_STRING_BOOL,
+ };
+
+ // Map Interface type to Set of types that implement it.
+ // Example: interface num is implemented by int and double.
+ static const Map<DartType, Set<DartType>> _interfaceRels = {
+ COMPARABLE_DURATION: {
+ DURATION,
+ },
+ COMPARABLE_NUM: {
+ DOUBLE,
+ INT,
+ NUM,
+ },
+ COMPARABLE_STRING: {
+ STRING,
+ },
+ EFFICIENTLENGTHITERABLE_BOOL: {
+ LIST_BOOL,
+ },
+ EFFICIENTLENGTHITERABLE_DOUBLE: {
+ FLOAT32LIST,
+ FLOAT64LIST,
+ LIST_DOUBLE,
+ },
+ EFFICIENTLENGTHITERABLE_E: {
+ LIST_BOOL,
+ LIST_DOUBLE,
+ LIST_INT,
+ LIST_MAP_STRING_INT,
+ LIST_STRING,
+ SET_BOOL,
+ SET_DOUBLE,
+ SET_INT,
+ SET_MAP_STRING_BOOL,
+ SET_STRING,
+ },
+ EFFICIENTLENGTHITERABLE_FLOAT32X4: {
+ FLOAT32X4LIST,
+ },
+ EFFICIENTLENGTHITERABLE_FLOAT64X2: {
+ FLOAT64X2LIST,
+ },
+ EFFICIENTLENGTHITERABLE_INT: {
+ INT16LIST,
+ INT32LIST,
+ INT64LIST,
+ INT8LIST,
+ LIST_INT,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ },
+ EFFICIENTLENGTHITERABLE_INT32X4: {
+ INT32X4LIST,
+ },
+ EFFICIENTLENGTHITERABLE_MAP_STRING_INT: {
+ LIST_MAP_STRING_INT,
+ },
+ EFFICIENTLENGTHITERABLE_STRING: {
+ LIST_STRING,
+ },
+ ITERABLE_DOUBLE: {
+ FLOAT32LIST,
+ FLOAT64LIST,
+ },
+ ITERABLE_E: {
+ LIST_BOOL,
+ LIST_DOUBLE,
+ LIST_INT,
+ LIST_MAP_STRING_INT,
+ LIST_STRING,
+ SET_BOOL,
+ SET_DOUBLE,
+ SET_INT,
+ SET_MAP_STRING_BOOL,
+ SET_STRING,
+ },
+ ITERABLE_FLOAT32X4: {
+ FLOAT32X4LIST,
+ },
+ ITERABLE_FLOAT64X2: {
+ FLOAT64X2LIST,
+ },
+ ITERABLE_INT: {
+ INT16LIST,
+ INT32LIST,
+ INT64LIST,
+ INT8LIST,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ },
+ ITERABLE_INT32X4: {
+ INT32X4LIST,
+ },
+ LIST_DOUBLE: {
+ FLOAT32LIST,
+ FLOAT64LIST,
+ LIST_DOUBLE,
+ },
+ LIST_FLOAT32X4: {
+ FLOAT32X4LIST,
+ },
+ LIST_FLOAT64X2: {
+ FLOAT64X2LIST,
+ },
+ LIST_INT: {
+ INT16LIST,
+ INT32LIST,
+ INT64LIST,
+ INT8LIST,
+ LIST_INT,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ },
+ LIST_INT32X4: {
+ INT32X4LIST,
+ },
+ NUM: {
+ DOUBLE,
+ INT,
+ NUM,
+ },
+ OBJECT: {
+ BOOL,
+ DOUBLE,
+ DURATION,
+ FLOAT32LIST,
+ FLOAT32X4,
+ FLOAT32X4LIST,
+ FLOAT64LIST,
+ FLOAT64X2,
+ FLOAT64X2LIST,
+ INT,
+ INT16LIST,
+ INT32LIST,
+ INT32X4,
+ INT32X4LIST,
+ INT64LIST,
+ INT8LIST,
+ LIST_BOOL,
+ LIST_DOUBLE,
+ LIST_INT,
+ LIST_MAP_STRING_INT,
+ LIST_STRING,
+ MAP_BOOL_BOOL,
+ MAP_BOOL_DOUBLE,
+ MAP_BOOL_INT,
+ MAP_BOOL_MAP_INT_INT,
+ MAP_BOOL_STRING,
+ MAP_DOUBLE_BOOL,
+ MAP_DOUBLE_DOUBLE,
+ MAP_DOUBLE_INT,
+ MAP_DOUBLE_MAP_INT_DOUBLE,
+ MAP_DOUBLE_STRING,
+ MAP_INT_BOOL,
+ MAP_INT_DOUBLE,
+ MAP_INT_INT,
+ MAP_INT_MAP_DOUBLE_STRING,
+ MAP_INT_STRING,
+ MAP_LIST_BOOL_MAP_BOOL_STRING,
+ MAP_LIST_DOUBLE_MAP_BOOL_INT,
+ MAP_LIST_INT_MAP_BOOL_BOOL,
+ MAP_LIST_STRING_SET_INT,
+ MAP_MAP_BOOL_BOOL_DOUBLE,
+ MAP_MAP_BOOL_DOUBLE_BOOL,
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT,
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE,
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING,
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE,
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING,
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL,
+ MAP_MAP_INT_INT_SET_INT,
+ MAP_MAP_INT_STRING_SET_BOOL,
+ MAP_MAP_STRING_BOOL_LIST_STRING,
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE,
+ MAP_MAP_STRING_INT_STRING,
+ MAP_MAP_STRING_STRING_DOUBLE,
+ MAP_SET_BOOL_SET_BOOL,
+ MAP_SET_DOUBLE_LIST_STRING,
+ MAP_SET_INT_LIST_DOUBLE,
+ MAP_SET_STRING_STRING,
+ MAP_STRING_BOOL,
+ MAP_STRING_DOUBLE,
+ MAP_STRING_INT,
+ MAP_STRING_MAP_DOUBLE_DOUBLE,
+ MAP_STRING_STRING,
+ NUM,
+ SET_BOOL,
+ SET_DOUBLE,
+ SET_INT,
+ SET_MAP_STRING_BOOL,
+ SET_STRING,
+ STRING,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ },
+ PATTERN: {
+ STRING,
+ },
+ TYPEDDATA: {
+ FLOAT32LIST,
+ FLOAT32X4LIST,
+ FLOAT64LIST,
+ FLOAT64X2LIST,
+ INT16LIST,
+ INT32LIST,
+ INT32X4LIST,
+ INT64LIST,
+ INT8LIST,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ },
+ _TYPEDFLOATLIST: {
+ FLOAT32LIST,
+ FLOAT64LIST,
+ },
+ _TYPEDINTLIST: {
+ INT16LIST,
+ INT32LIST,
+ INT64LIST,
+ INT8LIST,
+ UINT16LIST,
+ UINT32LIST,
+ UINT64LIST,
+ UINT8CLAMPEDLIST,
+ UINT8LIST,
+ },
+ };
+
+ // Map type to a list of constructors names with a list of constructor
+ // parameter types.
+ static const Map<DartType, Map<String, List<DartType>>> _constructors = {
+ DURATION: {
+ '': [],
+ },
+ FLOAT32LIST: {
+ '': [
+ INT,
+ ],
+ 'fromList': [
+ LIST_DOUBLE,
+ ],
+ },
+ FLOAT32X4: {
+ '': [
+ DOUBLE,
+ DOUBLE,
+ DOUBLE,
+ DOUBLE,
+ ],
+ 'splat': [
+ DOUBLE,
+ ],
+ 'zero': [],
+ },
+ FLOAT32X4LIST: {
+ '': [
+ INT,
+ ],
+ },
+ FLOAT64LIST: {
+ '': [
+ INT,
+ ],
+ 'fromList': [
+ LIST_DOUBLE,
+ ],
+ },
+ FLOAT64X2: {
+ '': [
+ DOUBLE,
+ DOUBLE,
+ ],
+ 'splat': [
+ DOUBLE,
+ ],
+ 'zero': [],
+ },
+ FLOAT64X2LIST: {
+ '': [
+ INT,
+ ],
+ },
+ INT16LIST: {
+ '': [
+ INT,
+ ],
+ 'fromList': [
+ LIST_INT,
+ ],
+ },
+ INT32LIST: {
+ '': [
+ INT,
+ ],
+ 'fromList': [
+ LIST_INT,
+ ],
+ },
+ INT32X4: {
+ '': [
+ INT,
+ INT,
+ INT,
+ INT,
+ ],
+ },
+ INT32X4LIST: {
+ '': [
+ INT,
+ ],
+ },
+ INT64LIST: {
+ '': [
+ INT,
+ ],
+ 'fromList': [
+ LIST_INT,
+ ],
+ },
+ INT8LIST: {
+ '': [
+ INT,
+ ],
+ 'fromList': [
+ LIST_INT,
+ ],
+ },
+ UINT16LIST: {
+ '': [
+ INT,
+ ],
+ 'fromList': [
+ LIST_INT,
+ ],
+ },
+ UINT32LIST: {
+ '': [
+ INT,
+ ],
+ 'fromList': [
+ LIST_INT,
+ ],
+ },
+ UINT64LIST: {
+ '': [
+ INT,
+ ],
+ 'fromList': [
+ LIST_INT,
+ ],
+ },
+ UINT8CLAMPEDLIST: {
+ '': [
+ INT,
+ ],
+ 'fromList': [
+ LIST_INT,
+ ],
+ },
+ UINT8LIST: {
+ '': [
+ INT,
+ ],
+ 'fromList': [
+ LIST_INT,
+ ],
+ },
+ };
+
+ // Map type to a list of binary operators with set of the respective
+ // types for the first and second operand.
+ static const Map<DartType, Map<String, Set<List<DartType>>>> _binOps = {
+ BOOL: {
+ '&': {
+ [
+ BOOL,
+ BOOL,
+ ],
+ },
+ '&&': {
+ [
+ BOOL,
+ BOOL,
+ ],
+ },
+ '<': {
+ [
+ DURATION,
+ DURATION,
+ ],
+ [
+ NUM,
+ NUM,
+ ],
+ },
+ '<=': {
+ [
+ DURATION,
+ DURATION,
+ ],
+ [
+ NUM,
+ NUM,
+ ],
+ },
+ '==': {
+ [
+ NUM,
+ OBJECT,
+ ],
+ [
+ STRING,
+ OBJECT,
+ ],
+ [
+ LIST_BOOL,
+ OBJECT,
+ ],
+ [
+ LIST_DOUBLE,
+ OBJECT,
+ ],
+ [
+ LIST_INT,
+ OBJECT,
+ ],
+ [
+ LIST_STRING,
+ OBJECT,
+ ],
+ [
+ LIST_MAP_STRING_INT,
+ OBJECT,
+ ],
+ },
+ '>': {
+ [
+ DURATION,
+ DURATION,
+ ],
+ [
+ NUM,
+ NUM,
+ ],
+ },
+ '>=': {
+ [
+ DURATION,
+ DURATION,
+ ],
+ [
+ NUM,
+ NUM,
+ ],
+ },
+ '??': {
+ [
+ BOOL,
+ BOOL,
+ ],
+ },
+ '^': {
+ [
+ BOOL,
+ BOOL,
+ ],
+ },
+ '|': {
+ [
+ BOOL,
+ BOOL,
+ ],
+ },
+ '||': {
+ [
+ BOOL,
+ BOOL,
+ ],
+ },
+ },
+ DOUBLE: {
+ '%': {
+ [
+ DOUBLE,
+ NUM,
+ ],
+ },
+ '*': {
+ [
+ DOUBLE,
+ NUM,
+ ],
+ },
+ '+': {
+ [
+ DOUBLE,
+ NUM,
+ ],
+ },
+ '-': {
+ [
+ DOUBLE,
+ NUM,
+ ],
+ },
+ '/': {
+ [
+ NUM,
+ NUM,
+ ],
+ },
+ '??': {
+ [
+ DOUBLE,
+ DOUBLE,
+ ],
+ },
+ },
+ DURATION: {
+ '*': {
+ [
+ DURATION,
+ NUM,
+ ],
+ },
+ '+': {
+ [
+ DURATION,
+ DURATION,
+ ],
+ },
+ '-': {
+ [
+ DURATION,
+ DURATION,
+ ],
+ },
+ '??': {
+ [
+ DURATION,
+ DURATION,
+ ],
+ },
+ '~/': {
+ [
+ DURATION,
+ INT,
+ ],
+ },
+ },
+ FLOAT32X4: {
+ '*': {
+ [
+ FLOAT32X4,
+ FLOAT32X4,
+ ],
+ },
+ '+': {
+ [
+ FLOAT32X4,
+ FLOAT32X4,
+ ],
+ },
+ '-': {
+ [
+ FLOAT32X4,
+ FLOAT32X4,
+ ],
+ },
+ '/': {
+ [
+ FLOAT32X4,
+ FLOAT32X4,
+ ],
+ },
+ '??': {
+ [
+ FLOAT32X4,
+ FLOAT32X4,
+ ],
+ },
+ },
+ FLOAT64X2: {
+ '*': {
+ [
+ FLOAT64X2,
+ FLOAT64X2,
+ ],
+ },
+ '+': {
+ [
+ FLOAT64X2,
+ FLOAT64X2,
+ ],
+ },
+ '-': {
+ [
+ FLOAT64X2,
+ FLOAT64X2,
+ ],
+ },
+ '/': {
+ [
+ FLOAT64X2,
+ FLOAT64X2,
+ ],
+ },
+ '??': {
+ [
+ FLOAT64X2,
+ FLOAT64X2,
+ ],
+ },
+ },
+ INT: {
+ '&': {
+ [
+ INT,
+ INT,
+ ],
+ },
+ '<<': {
+ [
+ INT,
+ INT,
+ ],
+ },
+ '>>': {
+ [
+ INT,
+ INT,
+ ],
+ },
+ '??': {
+ [
+ INT,
+ INT,
+ ],
+ },
+ '^': {
+ [
+ INT,
+ INT,
+ ],
+ },
+ '|': {
+ [
+ INT,
+ INT,
+ ],
+ },
+ '~/': {
+ [
+ NUM,
+ NUM,
+ ],
+ },
+ },
+ INT32X4: {
+ '&': {
+ [
+ INT32X4,
+ INT32X4,
+ ],
+ },
+ '+': {
+ [
+ INT32X4,
+ INT32X4,
+ ],
+ },
+ '-': {
+ [
+ INT32X4,
+ INT32X4,
+ ],
+ },
+ '??': {
+ [
+ INT32X4,
+ INT32X4,
+ ],
+ },
+ '^': {
+ [
+ INT32X4,
+ INT32X4,
+ ],
+ },
+ '|': {
+ [
+ INT32X4,
+ INT32X4,
+ ],
+ },
+ },
+ LIST_BOOL: {
+ '+': {
+ [
+ LIST_BOOL,
+ LIST_BOOL,
+ ],
+ },
+ '??': {
+ [
+ LIST_BOOL,
+ LIST_BOOL,
+ ],
+ },
+ },
+ LIST_DOUBLE: {
+ '+': {
+ [
+ LIST_DOUBLE,
+ LIST_DOUBLE,
+ ],
+ },
+ '??': {
+ [
+ LIST_DOUBLE,
+ LIST_DOUBLE,
+ ],
+ },
+ },
+ LIST_FLOAT32X4: {
+ '+': {
+ [
+ FLOAT32X4LIST,
+ LIST_FLOAT32X4,
+ ],
+ },
+ '??': {
+ [
+ LIST_FLOAT32X4,
+ LIST_FLOAT32X4,
+ ],
+ },
+ },
+ LIST_FLOAT64X2: {
+ '+': {
+ [
+ FLOAT64X2LIST,
+ LIST_FLOAT64X2,
+ ],
+ },
+ '??': {
+ [
+ LIST_FLOAT64X2,
+ LIST_FLOAT64X2,
+ ],
+ },
+ },
+ LIST_INT: {
+ '+': {
+ [
+ LIST_INT,
+ LIST_INT,
+ ],
+ },
+ '??': {
+ [
+ LIST_INT,
+ LIST_INT,
+ ],
+ },
+ },
+ LIST_INT32X4: {
+ '+': {
+ [
+ INT32X4LIST,
+ LIST_INT32X4,
+ ],
+ },
+ '??': {
+ [
+ LIST_INT32X4,
+ LIST_INT32X4,
+ ],
+ },
+ },
+ LIST_MAP_STRING_INT: {
+ '+': {
+ [
+ LIST_MAP_STRING_INT,
+ LIST_MAP_STRING_INT,
+ ],
+ },
+ '??': {
+ [
+ LIST_MAP_STRING_INT,
+ LIST_MAP_STRING_INT,
+ ],
+ },
+ },
+ LIST_STRING: {
+ '+': {
+ [
+ LIST_STRING,
+ LIST_STRING,
+ ],
+ },
+ '??': {
+ [
+ LIST_STRING,
+ LIST_STRING,
+ ],
+ },
+ },
+ NUM: {
+ '%': {
+ [
+ NUM,
+ NUM,
+ ],
+ },
+ '*': {
+ [
+ NUM,
+ NUM,
+ ],
+ },
+ '+': {
+ [
+ NUM,
+ NUM,
+ ],
+ },
+ '-': {
+ [
+ NUM,
+ NUM,
+ ],
+ },
+ '??': {
+ [
+ NUM,
+ NUM,
+ ],
+ },
+ },
+ STRING: {
+ '*': {
+ [
+ STRING,
+ INT,
+ ],
+ },
+ '+': {
+ [
+ STRING,
+ STRING,
+ ],
+ },
+ '??': {
+ [
+ STRING,
+ STRING,
+ ],
+ },
+ },
+ };
+
+ // Map type to a list of available unary operators.
+ static const Map<DartType, Set<String>> _uniOps = {
+ BOOL: {'!'},
+ DOUBLE: {'-'},
+ DURATION: {'-'},
+ FLOAT32X4: {'-'},
+ FLOAT64X2: {'-'},
+ INT: {'-', '~'},
+ NUM: {'-'},
+ };
+
+ // Map type to a list of assignment operators with a set of the
+ // assignable right hand side types.
+ static const Map<DartType, Map<String, Set<DartType>>> _assignOps = {
+ BOOL: {
+ '=': {
+ BOOL,
+ },
+ '??=': {
+ BOOL,
+ },
+ },
+ DOUBLE: {
+ '=': {
+ DOUBLE,
+ },
+ '??=': {
+ DOUBLE,
+ },
+ '+=': {
+ NUM,
+ },
+ '-=': {
+ NUM,
+ },
+ '*=': {
+ NUM,
+ },
+ '%=': {
+ NUM,
+ },
+ '/=': {
+ NUM,
+ },
+ },
+ DURATION: {
+ '=': {
+ DURATION,
+ },
+ '??=': {
+ DURATION,
+ },
+ '+=': {
+ DURATION,
+ },
+ '-=': {
+ DURATION,
+ },
+ '*=': {
+ NUM,
+ },
+ '~/=': {
+ INT,
+ },
+ },
+ FLOAT32LIST: {
+ '=': {
+ FLOAT32LIST,
+ },
+ '??=': {
+ FLOAT32LIST,
+ },
+ },
+ FLOAT32X4: {
+ '=': {
+ FLOAT32X4,
+ },
+ '??=': {
+ FLOAT32X4,
+ },
+ '+=': {
+ FLOAT32X4,
+ },
+ '-=': {
+ FLOAT32X4,
+ },
+ '*=': {
+ FLOAT32X4,
+ },
+ '/=': {
+ FLOAT32X4,
+ },
+ },
+ FLOAT32X4LIST: {
+ '=': {
+ FLOAT32X4LIST,
+ },
+ '??=': {
+ FLOAT32X4LIST,
+ },
+ },
+ FLOAT64LIST: {
+ '=': {
+ FLOAT64LIST,
+ },
+ '??=': {
+ FLOAT64LIST,
+ },
+ },
+ FLOAT64X2: {
+ '=': {
+ FLOAT64X2,
+ },
+ '??=': {
+ FLOAT64X2,
+ },
+ '+=': {
+ FLOAT64X2,
+ },
+ '-=': {
+ FLOAT64X2,
+ },
+ '*=': {
+ FLOAT64X2,
+ },
+ '/=': {
+ FLOAT64X2,
+ },
+ },
+ FLOAT64X2LIST: {
+ '=': {
+ FLOAT64X2LIST,
+ },
+ '??=': {
+ FLOAT64X2LIST,
+ },
+ },
+ INT: {
+ '~/=': {
+ NUM,
+ },
+ '=': {
+ INT,
+ },
+ '??=': {
+ INT,
+ },
+ '&=': {
+ INT,
+ },
+ '|=': {
+ INT,
+ },
+ '^=': {
+ INT,
+ },
+ '<<=': {
+ INT,
+ },
+ '>>=': {
+ INT,
+ },
+ },
+ INT16LIST: {
+ '=': {
+ INT16LIST,
+ },
+ '??=': {
+ INT16LIST,
+ },
+ },
+ INT32LIST: {
+ '=': {
+ INT32LIST,
+ },
+ '??=': {
+ INT32LIST,
+ },
+ },
+ INT32X4: {
+ '=': {
+ INT32X4,
+ },
+ '??=': {
+ INT32X4,
+ },
+ '|=': {
+ INT32X4,
+ },
+ '&=': {
+ INT32X4,
+ },
+ '^=': {
+ INT32X4,
+ },
+ '+=': {
+ INT32X4,
+ },
+ '-=': {
+ INT32X4,
+ },
+ },
+ INT32X4LIST: {
+ '=': {
+ INT32X4LIST,
+ },
+ '??=': {
+ INT32X4LIST,
+ },
+ },
+ INT64LIST: {
+ '=': {
+ INT64LIST,
+ },
+ '??=': {
+ INT64LIST,
+ },
+ },
+ INT8LIST: {
+ '=': {
+ INT8LIST,
+ },
+ '??=': {
+ INT8LIST,
+ },
+ },
+ LIST_BOOL: {
+ '=': {
+ LIST_BOOL,
+ },
+ '??=': {
+ LIST_BOOL,
+ },
+ '+=': {
+ LIST_BOOL,
+ },
+ },
+ LIST_DOUBLE: {
+ '=': {
+ LIST_DOUBLE,
+ },
+ '??=': {
+ LIST_DOUBLE,
+ },
+ '+=': {
+ LIST_DOUBLE,
+ },
+ },
+ LIST_FLOAT32X4: {
+ '+=': {
+ LIST_FLOAT32X4,
+ },
+ },
+ LIST_FLOAT64X2: {
+ '+=': {
+ LIST_FLOAT64X2,
+ },
+ },
+ LIST_INT: {
+ '+=': {
+ LIST_INT,
+ },
+ '=': {
+ LIST_INT,
+ },
+ '??=': {
+ LIST_INT,
+ },
+ },
+ LIST_INT32X4: {
+ '+=': {
+ LIST_INT32X4,
+ },
+ },
+ LIST_MAP_STRING_INT: {
+ '=': {
+ LIST_MAP_STRING_INT,
+ },
+ '??=': {
+ LIST_MAP_STRING_INT,
+ },
+ '+=': {
+ LIST_MAP_STRING_INT,
+ },
+ },
+ LIST_STRING: {
+ '=': {
+ LIST_STRING,
+ },
+ '??=': {
+ LIST_STRING,
+ },
+ '+=': {
+ LIST_STRING,
+ },
+ },
+ MAP_BOOL_BOOL: {
+ '=': {
+ MAP_BOOL_BOOL,
+ },
+ '??=': {
+ MAP_BOOL_BOOL,
+ },
+ },
+ MAP_BOOL_DOUBLE: {
+ '=': {
+ MAP_BOOL_DOUBLE,
+ },
+ '??=': {
+ MAP_BOOL_DOUBLE,
+ },
+ },
+ MAP_BOOL_INT: {
+ '=': {
+ MAP_BOOL_INT,
+ },
+ '??=': {
+ MAP_BOOL_INT,
+ },
+ },
+ MAP_BOOL_MAP_INT_INT: {
+ '=': {
+ MAP_BOOL_MAP_INT_INT,
+ },
+ '??=': {
+ MAP_BOOL_MAP_INT_INT,
+ },
+ },
+ MAP_BOOL_STRING: {
+ '=': {
+ MAP_BOOL_STRING,
+ },
+ '??=': {
+ MAP_BOOL_STRING,
+ },
+ },
+ MAP_DOUBLE_BOOL: {
+ '=': {
+ MAP_DOUBLE_BOOL,
+ },
+ '??=': {
+ MAP_DOUBLE_BOOL,
+ },
+ },
+ MAP_DOUBLE_DOUBLE: {
+ '=': {
+ MAP_DOUBLE_DOUBLE,
+ },
+ '??=': {
+ MAP_DOUBLE_DOUBLE,
+ },
+ },
+ MAP_DOUBLE_INT: {
+ '=': {
+ MAP_DOUBLE_INT,
+ },
+ '??=': {
+ MAP_DOUBLE_INT,
+ },
+ },
+ MAP_DOUBLE_MAP_INT_DOUBLE: {
+ '=': {
+ MAP_DOUBLE_MAP_INT_DOUBLE,
+ },
+ '??=': {
+ MAP_DOUBLE_MAP_INT_DOUBLE,
+ },
+ },
+ MAP_DOUBLE_STRING: {
+ '=': {
+ MAP_DOUBLE_STRING,
+ },
+ '??=': {
+ MAP_DOUBLE_STRING,
+ },
+ },
+ MAP_INT_BOOL: {
+ '=': {
+ MAP_INT_BOOL,
+ },
+ '??=': {
+ MAP_INT_BOOL,
+ },
+ },
+ MAP_INT_DOUBLE: {
+ '=': {
+ MAP_INT_DOUBLE,
+ },
+ '??=': {
+ MAP_INT_DOUBLE,
+ },
+ },
+ MAP_INT_INT: {
+ '=': {
+ MAP_INT_INT,
+ },
+ '??=': {
+ MAP_INT_INT,
+ },
+ },
+ MAP_INT_MAP_DOUBLE_STRING: {
+ '=': {
+ MAP_INT_MAP_DOUBLE_STRING,
+ },
+ '??=': {
+ MAP_INT_MAP_DOUBLE_STRING,
+ },
+ },
+ MAP_INT_STRING: {
+ '=': {
+ MAP_INT_STRING,
+ },
+ '??=': {
+ MAP_INT_STRING,
+ },
+ },
+ MAP_LIST_BOOL_MAP_BOOL_STRING: {
+ '=': {
+ MAP_LIST_BOOL_MAP_BOOL_STRING,
+ },
+ '??=': {
+ MAP_LIST_BOOL_MAP_BOOL_STRING,
+ },
+ },
+ MAP_LIST_DOUBLE_MAP_BOOL_INT: {
+ '=': {
+ MAP_LIST_DOUBLE_MAP_BOOL_INT,
+ },
+ '??=': {
+ MAP_LIST_DOUBLE_MAP_BOOL_INT,
+ },
+ },
+ MAP_LIST_INT_MAP_BOOL_BOOL: {
+ '=': {
+ MAP_LIST_INT_MAP_BOOL_BOOL,
+ },
+ '??=': {
+ MAP_LIST_INT_MAP_BOOL_BOOL,
+ },
+ },
+ MAP_LIST_STRING_SET_INT: {
+ '=': {
+ MAP_LIST_STRING_SET_INT,
+ },
+ '??=': {
+ MAP_LIST_STRING_SET_INT,
+ },
+ },
+ MAP_MAP_BOOL_BOOL_DOUBLE: {
+ '=': {
+ MAP_MAP_BOOL_BOOL_DOUBLE,
+ },
+ '??=': {
+ MAP_MAP_BOOL_BOOL_DOUBLE,
+ },
+ },
+ MAP_MAP_BOOL_DOUBLE_BOOL: {
+ '=': {
+ MAP_MAP_BOOL_DOUBLE_BOOL,
+ },
+ '??=': {
+ MAP_MAP_BOOL_DOUBLE_BOOL,
+ },
+ },
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT: {
+ '=': {
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT,
+ },
+ '??=': {
+ MAP_MAP_BOOL_DOUBLE_MAP_STRING_INT,
+ },
+ },
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL: {
+ '=': {
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ },
+ '??=': {
+ MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ },
+ },
+ MAP_MAP_BOOL_STRING_MAP_INT_INT: {
+ '=': {
+ MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ },
+ '??=': {
+ MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ },
+ },
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE: {
+ '=': {
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE,
+ },
+ '??=': {
+ MAP_MAP_DOUBLE_BOOL_MAP_INT_DOUBLE,
+ },
+ },
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING: {
+ '=': {
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING,
+ },
+ '??=': {
+ MAP_MAP_DOUBLE_DOUBLE_MAP_DOUBLE_STRING,
+ },
+ },
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE: {
+ '=': {
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE,
+ },
+ '??=': {
+ MAP_MAP_DOUBLE_INT_MAP_DOUBLE_DOUBLE,
+ },
+ },
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING: {
+ '=': {
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING,
+ },
+ '??=': {
+ MAP_MAP_DOUBLE_STRING_MAP_BOOL_STRING,
+ },
+ },
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT: {
+ '=': {
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ },
+ '??=': {
+ MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ },
+ },
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL: {
+ '=': {
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL,
+ },
+ '??=': {
+ MAP_MAP_INT_DOUBLE_MAP_BOOL_BOOL,
+ },
+ },
+ MAP_MAP_INT_INT_SET_INT: {
+ '=': {
+ MAP_MAP_INT_INT_SET_INT,
+ },
+ '??=': {
+ MAP_MAP_INT_INT_SET_INT,
+ },
+ },
+ MAP_MAP_INT_STRING_SET_BOOL: {
+ '=': {
+ MAP_MAP_INT_STRING_SET_BOOL,
+ },
+ '??=': {
+ MAP_MAP_INT_STRING_SET_BOOL,
+ },
+ },
+ MAP_MAP_STRING_BOOL_LIST_STRING: {
+ '=': {
+ MAP_MAP_STRING_BOOL_LIST_STRING,
+ },
+ '??=': {
+ MAP_MAP_STRING_BOOL_LIST_STRING,
+ },
+ },
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE: {
+ '=': {
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE,
+ },
+ '??=': {
+ MAP_MAP_STRING_DOUBLE_LIST_DOUBLE,
+ },
+ },
+ MAP_MAP_STRING_INT_STRING: {
+ '=': {
+ MAP_MAP_STRING_INT_STRING,
+ },
+ '??=': {
+ MAP_MAP_STRING_INT_STRING,
+ },
+ },
+ MAP_MAP_STRING_STRING_DOUBLE: {
+ '=': {
+ MAP_MAP_STRING_STRING_DOUBLE,
+ },
+ '??=': {
+ MAP_MAP_STRING_STRING_DOUBLE,
+ },
+ },
+ MAP_SET_BOOL_SET_BOOL: {
+ '=': {
+ MAP_SET_BOOL_SET_BOOL,
+ },
+ '??=': {
+ MAP_SET_BOOL_SET_BOOL,
+ },
+ },
+ MAP_SET_DOUBLE_LIST_STRING: {
+ '=': {
+ MAP_SET_DOUBLE_LIST_STRING,
+ },
+ '??=': {
+ MAP_SET_DOUBLE_LIST_STRING,
+ },
+ },
+ MAP_SET_INT_LIST_DOUBLE: {
+ '=': {
+ MAP_SET_INT_LIST_DOUBLE,
+ },
+ '??=': {
+ MAP_SET_INT_LIST_DOUBLE,
+ },
+ },
+ MAP_SET_STRING_STRING: {
+ '=': {
+ MAP_SET_STRING_STRING,
+ },
+ '??=': {
+ MAP_SET_STRING_STRING,
+ },
+ },
+ MAP_STRING_BOOL: {
+ '=': {
+ MAP_STRING_BOOL,
+ },
+ '??=': {
+ MAP_STRING_BOOL,
+ },
+ },
+ MAP_STRING_DOUBLE: {
+ '=': {
+ MAP_STRING_DOUBLE,
+ },
+ '??=': {
+ MAP_STRING_DOUBLE,
+ },
+ },
+ MAP_STRING_INT: {
+ '=': {
+ MAP_STRING_INT,
+ },
+ '??=': {
+ MAP_STRING_INT,
+ },
+ },
+ MAP_STRING_MAP_DOUBLE_DOUBLE: {
+ '=': {
+ MAP_STRING_MAP_DOUBLE_DOUBLE,
+ },
+ '??=': {
+ MAP_STRING_MAP_DOUBLE_DOUBLE,
+ },
+ },
+ MAP_STRING_STRING: {
+ '=': {
+ MAP_STRING_STRING,
+ },
+ '??=': {
+ MAP_STRING_STRING,
+ },
+ },
+ NUM: {
+ '=': {
+ NUM,
+ },
+ '??=': {
+ NUM,
+ },
+ '+=': {
+ NUM,
+ },
+ '-=': {
+ NUM,
+ },
+ '*=': {
+ NUM,
+ },
+ '%=': {
+ NUM,
+ },
+ },
+ SET_BOOL: {
+ '=': {
+ SET_BOOL,
+ },
+ '??=': {
+ SET_BOOL,
+ },
+ },
+ SET_DOUBLE: {
+ '=': {
+ SET_DOUBLE,
+ },
+ '??=': {
+ SET_DOUBLE,
+ },
+ },
+ SET_INT: {
+ '=': {
+ SET_INT,
+ },
+ '??=': {
+ SET_INT,
+ },
+ },
+ SET_MAP_STRING_BOOL: {
+ '=': {
+ SET_MAP_STRING_BOOL,
+ },
+ '??=': {
+ SET_MAP_STRING_BOOL,
+ },
+ },
+ SET_STRING: {
+ '=': {
+ SET_STRING,
+ },
+ '??=': {
+ SET_STRING,
+ },
+ },
+ STRING: {
+ '=': {
+ STRING,
+ },
+ '??=': {
+ STRING,
+ },
+ '+=': {
+ STRING,
+ },
+ '*=': {
+ INT,
+ },
+ },
+ UINT16LIST: {
+ '=': {
+ UINT16LIST,
+ },
+ '??=': {
+ UINT16LIST,
+ },
+ },
+ UINT32LIST: {
+ '=': {
+ UINT32LIST,
+ },
+ '??=': {
+ UINT32LIST,
+ },
+ },
+ UINT64LIST: {
+ '=': {
+ UINT64LIST,
+ },
+ '??=': {
+ UINT64LIST,
+ },
+ },
+ UINT8CLAMPEDLIST: {
+ '=': {
+ UINT8CLAMPEDLIST,
+ },
+ '??=': {
+ UINT8CLAMPEDLIST,
+ },
+ },
+ UINT8LIST: {
+ '=': {
+ UINT8LIST,
+ },
+ '??=': {
+ UINT8LIST,
+ },
+ },
+ };
+}
+
+class DartTypeNoFp extends DartType {
+ final String name;
+ const DartTypeNoFp._withName(this.name) : super._withName(name);
+ const DartTypeNoFp() : name = null;
+ static bool isListType(DartType tp) {
+ return DartType._listTypes.contains(tp);
+ }
+
+ static bool isMapType(DartType tp) {
+ return DartType._mapTypes.contains(tp);
+ }
+
+ static bool isCollectionType(DartType tp) {
+ return DartType._collectionTypes.contains(tp);
+ }
+
+ static bool isGrowableType(DartType tp) {
+ return DartType._growableTypes.contains(tp);
+ }
+
+ static bool isComplexType(DartType tp) {
+ return DartType._complexTypes.contains(tp);
+ }
+
+ bool isInterfaceOfType(DartType tp, DartType iTp) {
+ return _interfaceRels.containsKey(iTp) && _interfaceRels[iTp].contains(tp);
+ }
+
+ Set<DartType> get mapTypes {
+ return _mapTypes;
+ }
+
+ bool isSpecializable(DartType tp) {
+ return _interfaceRels.containsKey(tp);
+ }
+
+ Set<DartType> interfaces(DartType tp) {
+ if (_interfaceRels.containsKey(tp)) {
+ return _interfaceRels[tp];
+ }
+ return null;
+ }
+
+ DartType indexType(DartType tp) {
+ if (_indexedBy.containsKey(tp)) {
+ return _indexedBy[tp];
+ }
+ return null;
+ }
+
+ Set<DartType> indexableElementTypes(DartType tp) {
+ if (_indexableElementOf.containsKey(tp)) {
+ return _indexableElementOf[tp];
+ }
+ return null;
+ }
+
+ bool isIndexableElementType(DartType tp) {
+ return _indexableElementOf.containsKey(tp);
+ }
+
+ DartType elementType(DartType tp) {
+ if (_subscriptsTo.containsKey(tp)) {
+ return _subscriptsTo[tp];
+ }
+ return null;
+ }
+
+ Set<DartType> get iterableTypes1 {
+ return _iterableTypes1;
+ }
+
+ Set<String> uniOps(DartType tp) {
+ if (_uniOps.containsKey(tp)) {
+ return _uniOps[tp];
+ }
+ return <String>{};
+ }
+
+ Set<String> binOps(DartType tp) {
+ if (_binOps.containsKey(tp)) {
+ return _binOps[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ Set<List<DartType>> binOpParameters(DartType tp, String op) {
+ if (_binOps.containsKey(tp) && _binOps[tp].containsKey(op)) {
+ return _binOps[tp][op];
+ }
+ return null;
+ }
+
+ Set<String> assignOps(DartType tp) {
+ if (_assignOps.containsKey(tp)) {
+ return _assignOps[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ Set<DartType> assignOpRhs(DartType tp, String op) {
+ if (_assignOps.containsKey(tp) && _assignOps[tp].containsKey(op)) {
+ return _assignOps[tp][op];
+ }
+ return <DartType>{};
+ }
+
+ bool hasConstructor(DartType tp) {
+ return _constructors.containsKey(tp);
+ }
+
+ Set<String> constructors(DartType tp) {
+ if (_constructors.containsKey(tp)) {
+ return _constructors[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ List<DartType> constructorParameters(DartType tp, String constructor) {
+ if (_constructors.containsKey(tp) &&
+ _constructors[tp].containsKey(constructor)) {
+ return _constructors[tp][constructor];
+ }
+ return null;
+ }
+
+ Set<DartType> get allTypes {
+ return _allTypes;
+ }
+
+ // All types extracted from analyzer.
+ static const _allTypes = {
+ DartType.INT8LIST,
+ DartType.UINT8LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.INT16LIST,
+ DartType.UINT16LIST,
+ DartType.INT32LIST,
+ DartType.UINT32LIST,
+ DartType.INT64LIST,
+ DartType.UINT64LIST,
+ DartType.INT32X4LIST,
+ DartType.INT32X4,
+ DartType.BOOL,
+ DartType.DURATION,
+ DartType.INT,
+ DartType.NUM,
+ DartType.STRING,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.LIST_MAP_STRING_INT,
+ DartType.SET_MAP_STRING_BOOL,
+ DartType.MAP_BOOL_MAP_INT_INT,
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING,
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL,
+ DartType.MAP_LIST_STRING_SET_INT,
+ DartType.MAP_SET_BOOL_SET_BOOL,
+ DartType.MAP_SET_STRING_STRING,
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ DartType.MAP_MAP_INT_INT_SET_INT,
+ DartType.MAP_MAP_INT_STRING_SET_BOOL,
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING,
+ DartType.MAP_MAP_STRING_INT_STRING,
+ };
+
+ // All List<E> types: LIST_INT, LIST_STRING, etc.
+ static const Set<DartType> _listTypes = {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_MAP_STRING_INT,
+ DartType.LIST_STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // All Set types: SET_INT, SET_STRING, etc.
+ static const Set<DartType> _setTypes = {
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_MAP_STRING_BOOL,
+ DartType.SET_STRING,
+ };
+
+ // All Map<K, V> types: MAP_INT_STRING, MAP_DOUBLE_BOOL, etc.
+ static const Set<DartType> _mapTypes = {
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_MAP_INT_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING,
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL,
+ DartType.MAP_LIST_STRING_SET_INT,
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ DartType.MAP_MAP_INT_INT_SET_INT,
+ DartType.MAP_MAP_INT_STRING_SET_BOOL,
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING,
+ DartType.MAP_MAP_STRING_INT_STRING,
+ DartType.MAP_SET_BOOL_SET_BOOL,
+ DartType.MAP_SET_STRING_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ };
+
+ // All collection types: list, map and set types.
+ static const Set<DartType> _collectionTypes = {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_MAP_STRING_INT,
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_MAP_INT_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING,
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL,
+ DartType.MAP_LIST_STRING_SET_INT,
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ DartType.MAP_MAP_INT_INT_SET_INT,
+ DartType.MAP_MAP_INT_STRING_SET_BOOL,
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING,
+ DartType.MAP_MAP_STRING_INT_STRING,
+ DartType.MAP_SET_BOOL_SET_BOOL,
+ DartType.MAP_SET_STRING_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_MAP_STRING_BOOL,
+ DartType.SET_STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // All growable types: list, map, set and string types.
+ static const Set<DartType> _growableTypes = {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_MAP_STRING_INT,
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_MAP_INT_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING,
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL,
+ DartType.MAP_LIST_STRING_SET_INT,
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ DartType.MAP_MAP_INT_INT_SET_INT,
+ DartType.MAP_MAP_INT_STRING_SET_BOOL,
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING,
+ DartType.MAP_MAP_STRING_INT_STRING,
+ DartType.MAP_SET_BOOL_SET_BOOL,
+ DartType.MAP_SET_STRING_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_MAP_STRING_BOOL,
+ DartType.SET_STRING,
+ DartType.STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // All trivially indexable types: Map types and List types.
+ // Elements of these can be written and read by [], unlike Set
+ // which uses getElementAt to access individual elements.
+ static const Set<DartType> _indexableTypes = {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_MAP_STRING_INT,
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_MAP_INT_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING,
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL,
+ DartType.MAP_LIST_STRING_SET_INT,
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ DartType.MAP_MAP_INT_INT_SET_INT,
+ DartType.MAP_MAP_INT_STRING_SET_BOOL,
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING,
+ DartType.MAP_MAP_STRING_INT_STRING,
+ DartType.MAP_SET_BOOL_SET_BOOL,
+ DartType.MAP_SET_STRING_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // Map type to the resulting type when subscripted.
+ // Example: List<String> subscripts to String.
+ static const Map<DartType, DartType> _subscriptsTo = {
+ DartType.DURATION: DartType.DURATION,
+ DartType.INT16LIST: DartType.INT,
+ DartType.INT32LIST: DartType.INT,
+ DartType.INT32X4LIST: DartType.INT32X4,
+ DartType.INT64LIST: DartType.INT,
+ DartType.INT8LIST: DartType.INT,
+ DartType.LIST_BOOL: DartType.BOOL,
+ DartType.LIST_INT: DartType.INT,
+ DartType.LIST_MAP_STRING_INT: DartType.MAP_STRING_INT,
+ DartType.LIST_STRING: DartType.STRING,
+ DartType.MAP_BOOL_BOOL: DartType.BOOL,
+ DartType.MAP_BOOL_INT: DartType.INT,
+ DartType.MAP_BOOL_MAP_INT_INT: DartType.MAP_INT_INT,
+ DartType.MAP_BOOL_STRING: DartType.STRING,
+ DartType.MAP_INT_BOOL: DartType.BOOL,
+ DartType.MAP_INT_INT: DartType.INT,
+ DartType.MAP_INT_STRING: DartType.STRING,
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING: DartType.MAP_BOOL_STRING,
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL: DartType.MAP_BOOL_BOOL,
+ DartType.MAP_LIST_STRING_SET_INT: DartType.SET_INT,
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL: DartType.MAP_STRING_BOOL,
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT: DartType.MAP_INT_INT,
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT: DartType.MAP_BOOL_INT,
+ DartType.MAP_MAP_INT_INT_SET_INT: DartType.SET_INT,
+ DartType.MAP_MAP_INT_STRING_SET_BOOL: DartType.SET_BOOL,
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING: DartType.LIST_STRING,
+ DartType.MAP_MAP_STRING_INT_STRING: DartType.STRING,
+ DartType.MAP_SET_BOOL_SET_BOOL: DartType.SET_BOOL,
+ DartType.MAP_SET_STRING_STRING: DartType.STRING,
+ DartType.MAP_STRING_BOOL: DartType.BOOL,
+ DartType.MAP_STRING_INT: DartType.INT,
+ DartType.MAP_STRING_STRING: DartType.STRING,
+ DartType.NUM: DartType.NUM,
+ DartType.SET_BOOL: DartType.BOOL,
+ DartType.SET_INT: DartType.INT,
+ DartType.SET_MAP_STRING_BOOL: DartType.MAP_STRING_BOOL,
+ DartType.SET_STRING: DartType.STRING,
+ DartType.STRING: DartType.STRING,
+ DartType.UINT16LIST: DartType.INT,
+ DartType.UINT32LIST: DartType.INT,
+ DartType.UINT64LIST: DartType.INT,
+ DartType.UINT8CLAMPEDLIST: DartType.INT,
+ DartType.UINT8LIST: DartType.INT,
+ };
+
+ // Map type to type required as index.
+ // Example: List<String> is indexed by int,
+ // Map<String, double> indexed by String.
+ static const Map<DartType, DartType> _indexedBy = {
+ DartType.INT16LIST: DartType.INT,
+ DartType.INT32LIST: DartType.INT,
+ DartType.INT32X4LIST: DartType.INT,
+ DartType.INT64LIST: DartType.INT,
+ DartType.INT8LIST: DartType.INT,
+ DartType.LIST_BOOL: DartType.INT,
+ DartType.LIST_INT: DartType.INT,
+ DartType.LIST_MAP_STRING_INT: DartType.INT,
+ DartType.LIST_STRING: DartType.INT,
+ DartType.MAP_BOOL_BOOL: DartType.BOOL,
+ DartType.MAP_BOOL_INT: DartType.BOOL,
+ DartType.MAP_BOOL_MAP_INT_INT: DartType.BOOL,
+ DartType.MAP_BOOL_STRING: DartType.BOOL,
+ DartType.MAP_INT_BOOL: DartType.INT,
+ DartType.MAP_INT_INT: DartType.INT,
+ DartType.MAP_INT_STRING: DartType.INT,
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING: DartType.LIST_BOOL,
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL: DartType.LIST_INT,
+ DartType.MAP_LIST_STRING_SET_INT: DartType.LIST_STRING,
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL: DartType.MAP_BOOL_INT,
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT: DartType.MAP_BOOL_STRING,
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT: DartType.MAP_INT_BOOL,
+ DartType.MAP_MAP_INT_INT_SET_INT: DartType.MAP_INT_INT,
+ DartType.MAP_MAP_INT_STRING_SET_BOOL: DartType.MAP_INT_STRING,
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING: DartType.MAP_STRING_BOOL,
+ DartType.MAP_MAP_STRING_INT_STRING: DartType.MAP_STRING_INT,
+ DartType.MAP_SET_BOOL_SET_BOOL: DartType.SET_BOOL,
+ DartType.MAP_SET_STRING_STRING: DartType.SET_STRING,
+ DartType.MAP_STRING_BOOL: DartType.STRING,
+ DartType.MAP_STRING_INT: DartType.STRING,
+ DartType.MAP_STRING_STRING: DartType.STRING,
+ DartType.UINT16LIST: DartType.INT,
+ DartType.UINT32LIST: DartType.INT,
+ DartType.UINT64LIST: DartType.INT,
+ DartType.UINT8CLAMPEDLIST: DartType.INT,
+ DartType.UINT8LIST: DartType.INT,
+ };
+
+ // Map type to a Set of types that contain it as an element.
+ // Example: String is element of List<String> and Map<int, String>
+ static const Map<DartType, Set<DartType>> _elementOf = {
+ DartType.BOOL: {
+ DartType.LIST_BOOL,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_STRING_BOOL,
+ DartType.SET_BOOL,
+ },
+ DartType.DURATION: {
+ DartType.DURATION,
+ },
+ DartType.INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_INT,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_INT_INT,
+ DartType.MAP_STRING_INT,
+ DartType.SET_INT,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.LIST_STRING: {
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING,
+ },
+ DartType.MAP_BOOL_BOOL: {
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL,
+ },
+ DartType.MAP_BOOL_INT: {
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ },
+ DartType.MAP_BOOL_STRING: {
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING,
+ },
+ DartType.MAP_INT_INT: {
+ DartType.MAP_BOOL_MAP_INT_INT,
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ },
+ DartType.MAP_STRING_BOOL: {
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ DartType.SET_MAP_STRING_BOOL,
+ },
+ DartType.MAP_STRING_INT: {
+ DartType.LIST_MAP_STRING_INT,
+ },
+ DartType.NUM: {
+ DartType.NUM,
+ },
+ DartType.SET_BOOL: {
+ DartType.MAP_MAP_INT_STRING_SET_BOOL,
+ DartType.MAP_SET_BOOL_SET_BOOL,
+ },
+ DartType.SET_INT: {
+ DartType.MAP_LIST_STRING_SET_INT,
+ DartType.MAP_MAP_INT_INT_SET_INT,
+ },
+ DartType.STRING: {
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_MAP_STRING_INT_STRING,
+ DartType.MAP_SET_STRING_STRING,
+ DartType.MAP_STRING_STRING,
+ DartType.SET_STRING,
+ DartType.STRING,
+ },
+ };
+
+ // Map type to a Set of types that contain it as an indexable element.
+ // Same as element of, but without Set types.
+ static const Map<DartType, Set<DartType>> _indexableElementOf = {
+ DartType.BOOL: {
+ DartType.LIST_BOOL,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_STRING_BOOL,
+ },
+ DartType.INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_INT,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_INT_INT,
+ DartType.MAP_STRING_INT,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.LIST_STRING: {
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING,
+ },
+ DartType.MAP_BOOL_BOOL: {
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL,
+ },
+ DartType.MAP_BOOL_INT: {
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ },
+ DartType.MAP_BOOL_STRING: {
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING,
+ },
+ DartType.MAP_INT_INT: {
+ DartType.MAP_BOOL_MAP_INT_INT,
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ },
+ DartType.MAP_STRING_BOOL: {
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ },
+ DartType.MAP_STRING_INT: {
+ DartType.LIST_MAP_STRING_INT,
+ },
+ DartType.SET_BOOL: {
+ DartType.MAP_MAP_INT_STRING_SET_BOOL,
+ DartType.MAP_SET_BOOL_SET_BOOL,
+ },
+ DartType.SET_INT: {
+ DartType.MAP_LIST_STRING_SET_INT,
+ DartType.MAP_MAP_INT_INT_SET_INT,
+ },
+ DartType.STRING: {
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_MAP_STRING_INT_STRING,
+ DartType.MAP_SET_STRING_STRING,
+ DartType.MAP_STRING_STRING,
+ },
+ };
+
+ // All iterable types: Set types + List types.
+ // These can be used in for(x in <iterable type>),
+ // therefore Map is not included.
+ static const Set<DartType> _iterableTypes1 = {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_MAP_STRING_INT,
+ DartType.LIST_STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // Map Interface type to Set of types that implement it.
+ // Example: interface num is implemented by int and double.
+ static const Map<DartType, Set<DartType>> _interfaceRels = {
+ DartType.COMPARABLE_DURATION: {
+ DartType.DURATION,
+ },
+ DartType.COMPARABLE_NUM: {
+ DartType.INT,
+ DartType.NUM,
+ },
+ DartType.COMPARABLE_STRING: {
+ DartType.STRING,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_BOOL: {
+ DartType.LIST_BOOL,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_E: {
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_MAP_STRING_INT,
+ DartType.LIST_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_MAP_STRING_BOOL,
+ DartType.SET_STRING,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_INT,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_MAP_STRING_INT: {
+ DartType.LIST_MAP_STRING_INT,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_STRING: {
+ DartType.LIST_STRING,
+ },
+ DartType.ITERABLE_E: {
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_MAP_STRING_INT,
+ DartType.LIST_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_MAP_STRING_BOOL,
+ DartType.SET_STRING,
+ },
+ DartType.ITERABLE_INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.ITERABLE_INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.LIST_INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_INT,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.LIST_INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.NUM: {
+ DartType.INT,
+ DartType.NUM,
+ },
+ DartType.OBJECT: {
+ DartType.BOOL,
+ DartType.DURATION,
+ DartType.INT,
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_MAP_STRING_INT,
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_MAP_INT_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING,
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL,
+ DartType.MAP_LIST_STRING_SET_INT,
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ DartType.MAP_MAP_INT_INT_SET_INT,
+ DartType.MAP_MAP_INT_STRING_SET_BOOL,
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING,
+ DartType.MAP_MAP_STRING_INT_STRING,
+ DartType.MAP_SET_BOOL_SET_BOOL,
+ DartType.MAP_SET_STRING_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.NUM,
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_MAP_STRING_BOOL,
+ DartType.SET_STRING,
+ DartType.STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.PATTERN: {
+ DartType.STRING,
+ },
+ DartType.TYPEDDATA: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType._TYPEDINTLIST: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ };
+
+ // Map type to a list of constructors names with a list of constructor
+ // parameter types.
+ static const Map<DartType, Map<String, List<DartType>>> _constructors = {
+ DartType.DURATION: {
+ '': [],
+ },
+ DartType.INT16LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.INT32LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.INT32X4: {
+ '': [
+ DartType.INT,
+ DartType.INT,
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ DartType.INT32X4LIST: {
+ '': [
+ DartType.INT,
+ ],
+ },
+ DartType.INT64LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.INT8LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT16LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT32LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT64LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT8CLAMPEDLIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT8LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ };
+
+ // Map type to a list of binary operators with set of the respective
+ // types for the first and second operand.
+ static const Map<DartType, Map<String, Set<List<DartType>>>> _binOps = {
+ DartType.BOOL: {
+ '&': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '&&': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '<': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '<=': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '==': {
+ [
+ DartType.NUM,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.STRING,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.LIST_BOOL,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.LIST_INT,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.LIST_STRING,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.LIST_MAP_STRING_INT,
+ DartType.OBJECT,
+ ],
+ },
+ '>': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '>=': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '??': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '^': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '|': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '||': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ },
+ DartType.DURATION: {
+ '*': {
+ [
+ DartType.DURATION,
+ DartType.NUM,
+ ],
+ },
+ '+': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ },
+ '-': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ },
+ '??': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ },
+ '~/': {
+ [
+ DartType.DURATION,
+ DartType.INT,
+ ],
+ },
+ },
+ DartType.INT: {
+ '&': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '<<': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '>>': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '??': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '^': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '|': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '~/': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ },
+ DartType.INT32X4: {
+ '&': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '+': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '-': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '??': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '^': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '|': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ },
+ DartType.LIST_BOOL: {
+ '+': {
+ [
+ DartType.LIST_BOOL,
+ DartType.LIST_BOOL,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_BOOL,
+ DartType.LIST_BOOL,
+ ],
+ },
+ },
+ DartType.LIST_FLOAT32X4: {
+ '??': {
+ [
+ DartType.LIST_FLOAT32X4,
+ DartType.LIST_FLOAT32X4,
+ ],
+ },
+ },
+ DartType.LIST_FLOAT64X2: {
+ '??': {
+ [
+ DartType.LIST_FLOAT64X2,
+ DartType.LIST_FLOAT64X2,
+ ],
+ },
+ },
+ DartType.LIST_INT: {
+ '+': {
+ [
+ DartType.LIST_INT,
+ DartType.LIST_INT,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_INT,
+ DartType.LIST_INT,
+ ],
+ },
+ },
+ DartType.LIST_INT32X4: {
+ '+': {
+ [
+ DartType.INT32X4LIST,
+ DartType.LIST_INT32X4,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_INT32X4,
+ DartType.LIST_INT32X4,
+ ],
+ },
+ },
+ DartType.LIST_MAP_STRING_INT: {
+ '+': {
+ [
+ DartType.LIST_MAP_STRING_INT,
+ DartType.LIST_MAP_STRING_INT,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_MAP_STRING_INT,
+ DartType.LIST_MAP_STRING_INT,
+ ],
+ },
+ },
+ DartType.LIST_STRING: {
+ '+': {
+ [
+ DartType.LIST_STRING,
+ DartType.LIST_STRING,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_STRING,
+ DartType.LIST_STRING,
+ ],
+ },
+ },
+ DartType.NUM: {
+ '%': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '*': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '+': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '-': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '??': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ },
+ DartType.STRING: {
+ '*': {
+ [
+ DartType.STRING,
+ DartType.INT,
+ ],
+ },
+ '+': {
+ [
+ DartType.STRING,
+ DartType.STRING,
+ ],
+ },
+ '??': {
+ [
+ DartType.STRING,
+ DartType.STRING,
+ ],
+ },
+ },
+ };
+
+ // Map type to a list of available unary operators.
+ static const Map<DartType, Set<String>> _uniOps = {
+ DartType.BOOL: {'!'},
+ DartType.DURATION: {'-'},
+ DartType.INT: {'-', '~'},
+ DartType.NUM: {'-'},
+ };
+
+ // Map type to a list of assignment operators with a set of the
+ // assignable right hand side types.
+ static const Map<DartType, Map<String, Set<DartType>>> _assignOps = {
+ DartType.BOOL: {
+ '=': {
+ DartType.BOOL,
+ },
+ '??=': {
+ DartType.BOOL,
+ },
+ },
+ DartType.DURATION: {
+ '=': {
+ DartType.DURATION,
+ },
+ '??=': {
+ DartType.DURATION,
+ },
+ '+=': {
+ DartType.DURATION,
+ },
+ '-=': {
+ DartType.DURATION,
+ },
+ '*=': {
+ DartType.NUM,
+ },
+ '~/=': {
+ DartType.INT,
+ },
+ },
+ DartType.INT: {
+ '~/=': {
+ DartType.NUM,
+ },
+ '=': {
+ DartType.INT,
+ },
+ '??=': {
+ DartType.INT,
+ },
+ '&=': {
+ DartType.INT,
+ },
+ '|=': {
+ DartType.INT,
+ },
+ '^=': {
+ DartType.INT,
+ },
+ '<<=': {
+ DartType.INT,
+ },
+ '>>=': {
+ DartType.INT,
+ },
+ },
+ DartType.INT16LIST: {
+ '=': {
+ DartType.INT16LIST,
+ },
+ '??=': {
+ DartType.INT16LIST,
+ },
+ },
+ DartType.INT32LIST: {
+ '=': {
+ DartType.INT32LIST,
+ },
+ '??=': {
+ DartType.INT32LIST,
+ },
+ },
+ DartType.INT32X4: {
+ '=': {
+ DartType.INT32X4,
+ },
+ '??=': {
+ DartType.INT32X4,
+ },
+ '|=': {
+ DartType.INT32X4,
+ },
+ '&=': {
+ DartType.INT32X4,
+ },
+ '^=': {
+ DartType.INT32X4,
+ },
+ '+=': {
+ DartType.INT32X4,
+ },
+ '-=': {
+ DartType.INT32X4,
+ },
+ },
+ DartType.INT32X4LIST: {
+ '=': {
+ DartType.INT32X4LIST,
+ },
+ '??=': {
+ DartType.INT32X4LIST,
+ },
+ },
+ DartType.INT64LIST: {
+ '=': {
+ DartType.INT64LIST,
+ },
+ '??=': {
+ DartType.INT64LIST,
+ },
+ },
+ DartType.INT8LIST: {
+ '=': {
+ DartType.INT8LIST,
+ },
+ '??=': {
+ DartType.INT8LIST,
+ },
+ },
+ DartType.LIST_BOOL: {
+ '=': {
+ DartType.LIST_BOOL,
+ },
+ '??=': {
+ DartType.LIST_BOOL,
+ },
+ '+=': {
+ DartType.LIST_BOOL,
+ },
+ },
+ DartType.LIST_FLOAT32X4: {
+ '+=': {
+ DartType.LIST_FLOAT32X4,
+ },
+ },
+ DartType.LIST_FLOAT64X2: {
+ '+=': {
+ DartType.LIST_FLOAT64X2,
+ },
+ },
+ DartType.LIST_INT: {
+ '+=': {
+ DartType.LIST_INT,
+ },
+ '=': {
+ DartType.LIST_INT,
+ },
+ '??=': {
+ DartType.LIST_INT,
+ },
+ },
+ DartType.LIST_INT32X4: {
+ '+=': {
+ DartType.LIST_INT32X4,
+ },
+ },
+ DartType.LIST_MAP_STRING_INT: {
+ '=': {
+ DartType.LIST_MAP_STRING_INT,
+ },
+ '??=': {
+ DartType.LIST_MAP_STRING_INT,
+ },
+ '+=': {
+ DartType.LIST_MAP_STRING_INT,
+ },
+ },
+ DartType.LIST_STRING: {
+ '=': {
+ DartType.LIST_STRING,
+ },
+ '??=': {
+ DartType.LIST_STRING,
+ },
+ '+=': {
+ DartType.LIST_STRING,
+ },
+ },
+ DartType.MAP_BOOL_BOOL: {
+ '=': {
+ DartType.MAP_BOOL_BOOL,
+ },
+ '??=': {
+ DartType.MAP_BOOL_BOOL,
+ },
+ },
+ DartType.MAP_BOOL_INT: {
+ '=': {
+ DartType.MAP_BOOL_INT,
+ },
+ '??=': {
+ DartType.MAP_BOOL_INT,
+ },
+ },
+ DartType.MAP_BOOL_MAP_INT_INT: {
+ '=': {
+ DartType.MAP_BOOL_MAP_INT_INT,
+ },
+ '??=': {
+ DartType.MAP_BOOL_MAP_INT_INT,
+ },
+ },
+ DartType.MAP_BOOL_STRING: {
+ '=': {
+ DartType.MAP_BOOL_STRING,
+ },
+ '??=': {
+ DartType.MAP_BOOL_STRING,
+ },
+ },
+ DartType.MAP_INT_BOOL: {
+ '=': {
+ DartType.MAP_INT_BOOL,
+ },
+ '??=': {
+ DartType.MAP_INT_BOOL,
+ },
+ },
+ DartType.MAP_INT_INT: {
+ '=': {
+ DartType.MAP_INT_INT,
+ },
+ '??=': {
+ DartType.MAP_INT_INT,
+ },
+ },
+ DartType.MAP_INT_STRING: {
+ '=': {
+ DartType.MAP_INT_STRING,
+ },
+ '??=': {
+ DartType.MAP_INT_STRING,
+ },
+ },
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING: {
+ '=': {
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING,
+ },
+ '??=': {
+ DartType.MAP_LIST_BOOL_MAP_BOOL_STRING,
+ },
+ },
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL: {
+ '=': {
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL,
+ },
+ '??=': {
+ DartType.MAP_LIST_INT_MAP_BOOL_BOOL,
+ },
+ },
+ DartType.MAP_LIST_STRING_SET_INT: {
+ '=': {
+ DartType.MAP_LIST_STRING_SET_INT,
+ },
+ '??=': {
+ DartType.MAP_LIST_STRING_SET_INT,
+ },
+ },
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL: {
+ '=': {
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ },
+ '??=': {
+ DartType.MAP_MAP_BOOL_INT_MAP_STRING_BOOL,
+ },
+ },
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT: {
+ '=': {
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ },
+ '??=': {
+ DartType.MAP_MAP_BOOL_STRING_MAP_INT_INT,
+ },
+ },
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT: {
+ '=': {
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ },
+ '??=': {
+ DartType.MAP_MAP_INT_BOOL_MAP_BOOL_INT,
+ },
+ },
+ DartType.MAP_MAP_INT_INT_SET_INT: {
+ '=': {
+ DartType.MAP_MAP_INT_INT_SET_INT,
+ },
+ '??=': {
+ DartType.MAP_MAP_INT_INT_SET_INT,
+ },
+ },
+ DartType.MAP_MAP_INT_STRING_SET_BOOL: {
+ '=': {
+ DartType.MAP_MAP_INT_STRING_SET_BOOL,
+ },
+ '??=': {
+ DartType.MAP_MAP_INT_STRING_SET_BOOL,
+ },
+ },
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING: {
+ '=': {
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING,
+ },
+ '??=': {
+ DartType.MAP_MAP_STRING_BOOL_LIST_STRING,
+ },
+ },
+ DartType.MAP_MAP_STRING_INT_STRING: {
+ '=': {
+ DartType.MAP_MAP_STRING_INT_STRING,
+ },
+ '??=': {
+ DartType.MAP_MAP_STRING_INT_STRING,
+ },
+ },
+ DartType.MAP_SET_BOOL_SET_BOOL: {
+ '=': {
+ DartType.MAP_SET_BOOL_SET_BOOL,
+ },
+ '??=': {
+ DartType.MAP_SET_BOOL_SET_BOOL,
+ },
+ },
+ DartType.MAP_SET_STRING_STRING: {
+ '=': {
+ DartType.MAP_SET_STRING_STRING,
+ },
+ '??=': {
+ DartType.MAP_SET_STRING_STRING,
+ },
+ },
+ DartType.MAP_STRING_BOOL: {
+ '=': {
+ DartType.MAP_STRING_BOOL,
+ },
+ '??=': {
+ DartType.MAP_STRING_BOOL,
+ },
+ },
+ DartType.MAP_STRING_INT: {
+ '=': {
+ DartType.MAP_STRING_INT,
+ },
+ '??=': {
+ DartType.MAP_STRING_INT,
+ },
+ },
+ DartType.MAP_STRING_STRING: {
+ '=': {
+ DartType.MAP_STRING_STRING,
+ },
+ '??=': {
+ DartType.MAP_STRING_STRING,
+ },
+ },
+ DartType.NUM: {
+ '=': {
+ DartType.NUM,
+ },
+ '??=': {
+ DartType.NUM,
+ },
+ '+=': {
+ DartType.NUM,
+ },
+ '-=': {
+ DartType.NUM,
+ },
+ '*=': {
+ DartType.NUM,
+ },
+ '%=': {
+ DartType.NUM,
+ },
+ },
+ DartType.SET_BOOL: {
+ '=': {
+ DartType.SET_BOOL,
+ },
+ '??=': {
+ DartType.SET_BOOL,
+ },
+ },
+ DartType.SET_INT: {
+ '=': {
+ DartType.SET_INT,
+ },
+ '??=': {
+ DartType.SET_INT,
+ },
+ },
+ DartType.SET_MAP_STRING_BOOL: {
+ '=': {
+ DartType.SET_MAP_STRING_BOOL,
+ },
+ '??=': {
+ DartType.SET_MAP_STRING_BOOL,
+ },
+ },
+ DartType.SET_STRING: {
+ '=': {
+ DartType.SET_STRING,
+ },
+ '??=': {
+ DartType.SET_STRING,
+ },
+ },
+ DartType.STRING: {
+ '=': {
+ DartType.STRING,
+ },
+ '??=': {
+ DartType.STRING,
+ },
+ '+=': {
+ DartType.STRING,
+ },
+ '*=': {
+ DartType.INT,
+ },
+ },
+ DartType.UINT16LIST: {
+ '=': {
+ DartType.UINT16LIST,
+ },
+ '??=': {
+ DartType.UINT16LIST,
+ },
+ },
+ DartType.UINT32LIST: {
+ '=': {
+ DartType.UINT32LIST,
+ },
+ '??=': {
+ DartType.UINT32LIST,
+ },
+ },
+ DartType.UINT64LIST: {
+ '=': {
+ DartType.UINT64LIST,
+ },
+ '??=': {
+ DartType.UINT64LIST,
+ },
+ },
+ DartType.UINT8CLAMPEDLIST: {
+ '=': {
+ DartType.UINT8CLAMPEDLIST,
+ },
+ '??=': {
+ DartType.UINT8CLAMPEDLIST,
+ },
+ },
+ DartType.UINT8LIST: {
+ '=': {
+ DartType.UINT8LIST,
+ },
+ '??=': {
+ DartType.UINT8LIST,
+ },
+ },
+ };
+}
+
+class DartTypeFlatTp extends DartType {
+ final String name;
+ const DartTypeFlatTp._withName(this.name) : super._withName(name);
+ const DartTypeFlatTp() : name = null;
+ static bool isListType(DartType tp) {
+ return DartType._listTypes.contains(tp);
+ }
+
+ static bool isMapType(DartType tp) {
+ return DartType._mapTypes.contains(tp);
+ }
+
+ static bool isCollectionType(DartType tp) {
+ return DartType._collectionTypes.contains(tp);
+ }
+
+ static bool isGrowableType(DartType tp) {
+ return DartType._growableTypes.contains(tp);
+ }
+
+ static bool isComplexType(DartType tp) {
+ return DartType._complexTypes.contains(tp);
+ }
+
+ bool isInterfaceOfType(DartType tp, DartType iTp) {
+ return _interfaceRels.containsKey(iTp) && _interfaceRels[iTp].contains(tp);
+ }
+
+ Set<DartType> get mapTypes {
+ return _mapTypes;
+ }
+
+ bool isSpecializable(DartType tp) {
+ return _interfaceRels.containsKey(tp);
+ }
+
+ Set<DartType> interfaces(DartType tp) {
+ if (_interfaceRels.containsKey(tp)) {
+ return _interfaceRels[tp];
+ }
+ return null;
+ }
+
+ DartType indexType(DartType tp) {
+ if (_indexedBy.containsKey(tp)) {
+ return _indexedBy[tp];
+ }
+ return null;
+ }
+
+ Set<DartType> indexableElementTypes(DartType tp) {
+ if (_indexableElementOf.containsKey(tp)) {
+ return _indexableElementOf[tp];
+ }
+ return null;
+ }
+
+ bool isIndexableElementType(DartType tp) {
+ return _indexableElementOf.containsKey(tp);
+ }
+
+ DartType elementType(DartType tp) {
+ if (_subscriptsTo.containsKey(tp)) {
+ return _subscriptsTo[tp];
+ }
+ return null;
+ }
+
+ Set<DartType> get iterableTypes1 {
+ return _iterableTypes1;
+ }
+
+ Set<String> uniOps(DartType tp) {
+ if (_uniOps.containsKey(tp)) {
+ return _uniOps[tp];
+ }
+ return <String>{};
+ }
+
+ Set<String> binOps(DartType tp) {
+ if (_binOps.containsKey(tp)) {
+ return _binOps[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ Set<List<DartType>> binOpParameters(DartType tp, String op) {
+ if (_binOps.containsKey(tp) && _binOps[tp].containsKey(op)) {
+ return _binOps[tp][op];
+ }
+ return null;
+ }
+
+ Set<String> assignOps(DartType tp) {
+ if (_assignOps.containsKey(tp)) {
+ return _assignOps[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ Set<DartType> assignOpRhs(DartType tp, String op) {
+ if (_assignOps.containsKey(tp) && _assignOps[tp].containsKey(op)) {
+ return _assignOps[tp][op];
+ }
+ return <DartType>{};
+ }
+
+ bool hasConstructor(DartType tp) {
+ return _constructors.containsKey(tp);
+ }
+
+ Set<String> constructors(DartType tp) {
+ if (_constructors.containsKey(tp)) {
+ return _constructors[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ List<DartType> constructorParameters(DartType tp, String constructor) {
+ if (_constructors.containsKey(tp) &&
+ _constructors[tp].containsKey(constructor)) {
+ return _constructors[tp][constructor];
+ }
+ return null;
+ }
+
+ Set<DartType> get allTypes {
+ return _allTypes;
+ }
+
+ // All types extracted from analyzer.
+ static const _allTypes = {
+ DartType.INT8LIST,
+ DartType.UINT8LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.INT16LIST,
+ DartType.UINT16LIST,
+ DartType.INT32LIST,
+ DartType.UINT32LIST,
+ DartType.INT64LIST,
+ DartType.UINT64LIST,
+ DartType.FLOAT32LIST,
+ DartType.FLOAT64LIST,
+ DartType.FLOAT32X4LIST,
+ DartType.INT32X4LIST,
+ DartType.FLOAT64X2LIST,
+ DartType.FLOAT32X4,
+ DartType.INT32X4,
+ DartType.FLOAT64X2,
+ DartType.BOOL,
+ DartType.DOUBLE,
+ DartType.DURATION,
+ DartType.INT,
+ DartType.NUM,
+ DartType.STRING,
+ DartType.LIST_BOOL,
+ DartType.LIST_DOUBLE,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_DOUBLE,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_DOUBLE,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_DOUBLE_BOOL,
+ DartType.MAP_DOUBLE_DOUBLE,
+ DartType.MAP_DOUBLE_INT,
+ DartType.MAP_DOUBLE_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_DOUBLE,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_DOUBLE,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ };
+
+ // All List<E> types: LIST_INT, LIST_STRING, etc.
+ static const Set<DartType> _listTypes = {
+ DartType.FLOAT32LIST,
+ DartType.FLOAT32X4LIST,
+ DartType.FLOAT64LIST,
+ DartType.FLOAT64X2LIST,
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_DOUBLE,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // All Set types: SET_INT, SET_STRING, etc.
+ static const Set<DartType> _setTypes = {
+ DartType.SET_BOOL,
+ DartType.SET_DOUBLE,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ };
+
+ // All Map<K, V> types: MAP_INT_STRING, MAP_DOUBLE_BOOL, etc.
+ static const Set<DartType> _mapTypes = {
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_DOUBLE,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_DOUBLE_BOOL,
+ DartType.MAP_DOUBLE_DOUBLE,
+ DartType.MAP_DOUBLE_INT,
+ DartType.MAP_DOUBLE_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_DOUBLE,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_DOUBLE,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ };
+
+ // All collection types: list, map and set types.
+ static const Set<DartType> _collectionTypes = {
+ DartType.FLOAT32LIST,
+ DartType.FLOAT32X4LIST,
+ DartType.FLOAT64LIST,
+ DartType.FLOAT64X2LIST,
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_DOUBLE,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_DOUBLE,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_DOUBLE_BOOL,
+ DartType.MAP_DOUBLE_DOUBLE,
+ DartType.MAP_DOUBLE_INT,
+ DartType.MAP_DOUBLE_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_DOUBLE,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_DOUBLE,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_DOUBLE,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // All growable types: list, map, set and string types.
+ static const Set<DartType> _growableTypes = {
+ DartType.FLOAT32LIST,
+ DartType.FLOAT32X4LIST,
+ DartType.FLOAT64LIST,
+ DartType.FLOAT64X2LIST,
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_DOUBLE,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_DOUBLE,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_DOUBLE_BOOL,
+ DartType.MAP_DOUBLE_DOUBLE,
+ DartType.MAP_DOUBLE_INT,
+ DartType.MAP_DOUBLE_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_DOUBLE,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_DOUBLE,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_DOUBLE,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ DartType.STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // All trivially indexable types: Map types and List types.
+ // Elements of these can be written and read by [], unlike Set
+ // which uses getElementAt to access individual elements.
+ static const Set<DartType> _indexableTypes = {
+ DartType.FLOAT32LIST,
+ DartType.FLOAT32X4LIST,
+ DartType.FLOAT64LIST,
+ DartType.FLOAT64X2LIST,
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_DOUBLE,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_DOUBLE,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_DOUBLE_BOOL,
+ DartType.MAP_DOUBLE_DOUBLE,
+ DartType.MAP_DOUBLE_INT,
+ DartType.MAP_DOUBLE_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_DOUBLE,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_DOUBLE,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // Map type to the resulting type when subscripted.
+ // Example: List<String> subscripts to String.
+ static const Map<DartType, DartType> _subscriptsTo = {
+ DartType.DURATION: DartType.DURATION,
+ DartType.FLOAT32LIST: DartType.DOUBLE,
+ DartType.FLOAT32X4LIST: DartType.FLOAT32X4,
+ DartType.FLOAT64LIST: DartType.DOUBLE,
+ DartType.FLOAT64X2LIST: DartType.FLOAT64X2,
+ DartType.INT16LIST: DartType.INT,
+ DartType.INT32LIST: DartType.INT,
+ DartType.INT32X4LIST: DartType.INT32X4,
+ DartType.INT64LIST: DartType.INT,
+ DartType.INT8LIST: DartType.INT,
+ DartType.LIST_BOOL: DartType.BOOL,
+ DartType.LIST_DOUBLE: DartType.DOUBLE,
+ DartType.LIST_INT: DartType.INT,
+ DartType.LIST_STRING: DartType.STRING,
+ DartType.MAP_BOOL_BOOL: DartType.BOOL,
+ DartType.MAP_BOOL_DOUBLE: DartType.DOUBLE,
+ DartType.MAP_BOOL_INT: DartType.INT,
+ DartType.MAP_BOOL_STRING: DartType.STRING,
+ DartType.MAP_DOUBLE_BOOL: DartType.BOOL,
+ DartType.MAP_DOUBLE_DOUBLE: DartType.DOUBLE,
+ DartType.MAP_DOUBLE_INT: DartType.INT,
+ DartType.MAP_DOUBLE_STRING: DartType.STRING,
+ DartType.MAP_INT_BOOL: DartType.BOOL,
+ DartType.MAP_INT_DOUBLE: DartType.DOUBLE,
+ DartType.MAP_INT_INT: DartType.INT,
+ DartType.MAP_INT_STRING: DartType.STRING,
+ DartType.MAP_STRING_BOOL: DartType.BOOL,
+ DartType.MAP_STRING_DOUBLE: DartType.DOUBLE,
+ DartType.MAP_STRING_INT: DartType.INT,
+ DartType.MAP_STRING_STRING: DartType.STRING,
+ DartType.NUM: DartType.NUM,
+ DartType.SET_BOOL: DartType.BOOL,
+ DartType.SET_DOUBLE: DartType.DOUBLE,
+ DartType.SET_INT: DartType.INT,
+ DartType.SET_STRING: DartType.STRING,
+ DartType.STRING: DartType.STRING,
+ DartType.UINT16LIST: DartType.INT,
+ DartType.UINT32LIST: DartType.INT,
+ DartType.UINT64LIST: DartType.INT,
+ DartType.UINT8CLAMPEDLIST: DartType.INT,
+ DartType.UINT8LIST: DartType.INT,
+ };
+
+ // Map type to type required as index.
+ // Example: List<String> is indexed by int,
+ // Map<String, double> indexed by String.
+ static const Map<DartType, DartType> _indexedBy = {
+ DartType.FLOAT32LIST: DartType.INT,
+ DartType.FLOAT32X4LIST: DartType.INT,
+ DartType.FLOAT64LIST: DartType.INT,
+ DartType.FLOAT64X2LIST: DartType.INT,
+ DartType.INT16LIST: DartType.INT,
+ DartType.INT32LIST: DartType.INT,
+ DartType.INT32X4LIST: DartType.INT,
+ DartType.INT64LIST: DartType.INT,
+ DartType.INT8LIST: DartType.INT,
+ DartType.LIST_BOOL: DartType.INT,
+ DartType.LIST_DOUBLE: DartType.INT,
+ DartType.LIST_INT: DartType.INT,
+ DartType.LIST_STRING: DartType.INT,
+ DartType.MAP_BOOL_BOOL: DartType.BOOL,
+ DartType.MAP_BOOL_DOUBLE: DartType.BOOL,
+ DartType.MAP_BOOL_INT: DartType.BOOL,
+ DartType.MAP_BOOL_STRING: DartType.BOOL,
+ DartType.MAP_DOUBLE_BOOL: DartType.DOUBLE,
+ DartType.MAP_DOUBLE_DOUBLE: DartType.DOUBLE,
+ DartType.MAP_DOUBLE_INT: DartType.DOUBLE,
+ DartType.MAP_DOUBLE_STRING: DartType.DOUBLE,
+ DartType.MAP_INT_BOOL: DartType.INT,
+ DartType.MAP_INT_DOUBLE: DartType.INT,
+ DartType.MAP_INT_INT: DartType.INT,
+ DartType.MAP_INT_STRING: DartType.INT,
+ DartType.MAP_STRING_BOOL: DartType.STRING,
+ DartType.MAP_STRING_DOUBLE: DartType.STRING,
+ DartType.MAP_STRING_INT: DartType.STRING,
+ DartType.MAP_STRING_STRING: DartType.STRING,
+ DartType.UINT16LIST: DartType.INT,
+ DartType.UINT32LIST: DartType.INT,
+ DartType.UINT64LIST: DartType.INT,
+ DartType.UINT8CLAMPEDLIST: DartType.INT,
+ DartType.UINT8LIST: DartType.INT,
+ };
+
+ // Map type to a Set of types that contain it as an element.
+ // Example: String is element of List<String> and Map<int, String>
+ static const Map<DartType, Set<DartType>> _elementOf = {
+ DartType.BOOL: {
+ DartType.LIST_BOOL,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_DOUBLE_BOOL,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_STRING_BOOL,
+ DartType.SET_BOOL,
+ },
+ DartType.DOUBLE: {
+ DartType.FLOAT32LIST,
+ DartType.FLOAT64LIST,
+ DartType.LIST_DOUBLE,
+ DartType.MAP_BOOL_DOUBLE,
+ DartType.MAP_DOUBLE_DOUBLE,
+ DartType.MAP_INT_DOUBLE,
+ DartType.MAP_STRING_DOUBLE,
+ DartType.SET_DOUBLE,
+ },
+ DartType.DURATION: {
+ DartType.DURATION,
+ },
+ DartType.FLOAT32X4: {
+ DartType.FLOAT32X4LIST,
+ },
+ DartType.FLOAT64X2: {
+ DartType.FLOAT64X2LIST,
+ },
+ DartType.INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_INT,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_DOUBLE_INT,
+ DartType.MAP_INT_INT,
+ DartType.MAP_STRING_INT,
+ DartType.SET_INT,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.NUM: {
+ DartType.NUM,
+ },
+ DartType.STRING: {
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_DOUBLE_STRING,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_STRING,
+ DartType.SET_STRING,
+ DartType.STRING,
+ },
+ };
+
+ // Map type to a Set of types that contain it as an indexable element.
+ // Same as element of, but without Set types.
+ static const Map<DartType, Set<DartType>> _indexableElementOf = {
+ DartType.BOOL: {
+ DartType.LIST_BOOL,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_DOUBLE_BOOL,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_STRING_BOOL,
+ },
+ DartType.DOUBLE: {
+ DartType.FLOAT32LIST,
+ DartType.FLOAT64LIST,
+ DartType.LIST_DOUBLE,
+ DartType.MAP_BOOL_DOUBLE,
+ DartType.MAP_DOUBLE_DOUBLE,
+ DartType.MAP_INT_DOUBLE,
+ DartType.MAP_STRING_DOUBLE,
+ },
+ DartType.FLOAT32X4: {
+ DartType.FLOAT32X4LIST,
+ },
+ DartType.FLOAT64X2: {
+ DartType.FLOAT64X2LIST,
+ },
+ DartType.INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_INT,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_DOUBLE_INT,
+ DartType.MAP_INT_INT,
+ DartType.MAP_STRING_INT,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.STRING: {
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_DOUBLE_STRING,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_STRING,
+ },
+ };
+
+ // All iterable types: Set types + List types.
+ // These can be used in for(x in <iterable type>),
+ // therefore Map is not included.
+ static const Set<DartType> _iterableTypes1 = {
+ DartType.FLOAT32LIST,
+ DartType.FLOAT32X4LIST,
+ DartType.FLOAT64LIST,
+ DartType.FLOAT64X2LIST,
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_DOUBLE,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // Map Interface type to Set of types that implement it.
+ // Example: interface num is implemented by int and double.
+ static const Map<DartType, Set<DartType>> _interfaceRels = {
+ DartType.COMPARABLE_DURATION: {
+ DartType.DURATION,
+ },
+ DartType.COMPARABLE_NUM: {
+ DartType.DOUBLE,
+ DartType.INT,
+ DartType.NUM,
+ },
+ DartType.COMPARABLE_STRING: {
+ DartType.STRING,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_BOOL: {
+ DartType.LIST_BOOL,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_DOUBLE: {
+ DartType.FLOAT32LIST,
+ DartType.FLOAT64LIST,
+ DartType.LIST_DOUBLE,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_E: {
+ DartType.LIST_BOOL,
+ DartType.LIST_DOUBLE,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_DOUBLE,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_FLOAT32X4: {
+ DartType.FLOAT32X4LIST,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_FLOAT64X2: {
+ DartType.FLOAT64X2LIST,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_INT,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_STRING: {
+ DartType.LIST_STRING,
+ },
+ DartType.ITERABLE_DOUBLE: {
+ DartType.FLOAT32LIST,
+ DartType.FLOAT64LIST,
+ },
+ DartType.ITERABLE_E: {
+ DartType.LIST_BOOL,
+ DartType.LIST_DOUBLE,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_DOUBLE,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ },
+ DartType.ITERABLE_FLOAT32X4: {
+ DartType.FLOAT32X4LIST,
+ },
+ DartType.ITERABLE_FLOAT64X2: {
+ DartType.FLOAT64X2LIST,
+ },
+ DartType.ITERABLE_INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.ITERABLE_INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.LIST_DOUBLE: {
+ DartType.FLOAT32LIST,
+ DartType.FLOAT64LIST,
+ DartType.LIST_DOUBLE,
+ },
+ DartType.LIST_FLOAT32X4: {
+ DartType.FLOAT32X4LIST,
+ },
+ DartType.LIST_FLOAT64X2: {
+ DartType.FLOAT64X2LIST,
+ },
+ DartType.LIST_INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_INT,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.LIST_INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.NUM: {
+ DartType.DOUBLE,
+ DartType.INT,
+ DartType.NUM,
+ },
+ DartType.OBJECT: {
+ DartType.BOOL,
+ DartType.DOUBLE,
+ DartType.DURATION,
+ DartType.FLOAT32LIST,
+ DartType.FLOAT32X4,
+ DartType.FLOAT32X4LIST,
+ DartType.FLOAT64LIST,
+ DartType.FLOAT64X2,
+ DartType.FLOAT64X2LIST,
+ DartType.INT,
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_DOUBLE,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_DOUBLE,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_DOUBLE_BOOL,
+ DartType.MAP_DOUBLE_DOUBLE,
+ DartType.MAP_DOUBLE_INT,
+ DartType.MAP_DOUBLE_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_DOUBLE,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_DOUBLE,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.NUM,
+ DartType.SET_BOOL,
+ DartType.SET_DOUBLE,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ DartType.STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.PATTERN: {
+ DartType.STRING,
+ },
+ DartType.TYPEDDATA: {
+ DartType.FLOAT32LIST,
+ DartType.FLOAT32X4LIST,
+ DartType.FLOAT64LIST,
+ DartType.FLOAT64X2LIST,
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType._TYPEDFLOATLIST: {
+ DartType.FLOAT32LIST,
+ DartType.FLOAT64LIST,
+ },
+ DartType._TYPEDINTLIST: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ };
+
+ // Map type to a list of constructors names with a list of constructor
+ // parameter types.
+ static const Map<DartType, Map<String, List<DartType>>> _constructors = {
+ DartType.DURATION: {
+ '': [],
+ },
+ DartType.FLOAT32LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_DOUBLE,
+ ],
+ },
+ DartType.FLOAT32X4: {
+ '': [
+ DartType.DOUBLE,
+ DartType.DOUBLE,
+ DartType.DOUBLE,
+ DartType.DOUBLE,
+ ],
+ 'splat': [
+ DartType.DOUBLE,
+ ],
+ 'zero': [],
+ },
+ DartType.FLOAT32X4LIST: {
+ '': [
+ DartType.INT,
+ ],
+ },
+ DartType.FLOAT64LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_DOUBLE,
+ ],
+ },
+ DartType.FLOAT64X2: {
+ '': [
+ DartType.DOUBLE,
+ DartType.DOUBLE,
+ ],
+ 'splat': [
+ DartType.DOUBLE,
+ ],
+ 'zero': [],
+ },
+ DartType.FLOAT64X2LIST: {
+ '': [
+ DartType.INT,
+ ],
+ },
+ DartType.INT16LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.INT32LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.INT32X4: {
+ '': [
+ DartType.INT,
+ DartType.INT,
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ DartType.INT32X4LIST: {
+ '': [
+ DartType.INT,
+ ],
+ },
+ DartType.INT64LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.INT8LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT16LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT32LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT64LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT8CLAMPEDLIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT8LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ };
+
+ // Map type to a list of binary operators with set of the respective
+ // types for the first and second operand.
+ static const Map<DartType, Map<String, Set<List<DartType>>>> _binOps = {
+ DartType.BOOL: {
+ '&': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '&&': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '<': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '<=': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '==': {
+ [
+ DartType.NUM,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.STRING,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.LIST_BOOL,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.LIST_DOUBLE,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.LIST_INT,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.LIST_STRING,
+ DartType.OBJECT,
+ ],
+ },
+ '>': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '>=': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '??': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '^': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '|': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '||': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ },
+ DartType.DOUBLE: {
+ '%': {
+ [
+ DartType.DOUBLE,
+ DartType.NUM,
+ ],
+ },
+ '*': {
+ [
+ DartType.DOUBLE,
+ DartType.NUM,
+ ],
+ },
+ '+': {
+ [
+ DartType.DOUBLE,
+ DartType.NUM,
+ ],
+ },
+ '-': {
+ [
+ DartType.DOUBLE,
+ DartType.NUM,
+ ],
+ },
+ '/': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '??': {
+ [
+ DartType.DOUBLE,
+ DartType.DOUBLE,
+ ],
+ },
+ },
+ DartType.DURATION: {
+ '*': {
+ [
+ DartType.DURATION,
+ DartType.NUM,
+ ],
+ },
+ '+': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ },
+ '-': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ },
+ '??': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ },
+ '~/': {
+ [
+ DartType.DURATION,
+ DartType.INT,
+ ],
+ },
+ },
+ DartType.FLOAT32X4: {
+ '*': {
+ [
+ DartType.FLOAT32X4,
+ DartType.FLOAT32X4,
+ ],
+ },
+ '+': {
+ [
+ DartType.FLOAT32X4,
+ DartType.FLOAT32X4,
+ ],
+ },
+ '-': {
+ [
+ DartType.FLOAT32X4,
+ DartType.FLOAT32X4,
+ ],
+ },
+ '/': {
+ [
+ DartType.FLOAT32X4,
+ DartType.FLOAT32X4,
+ ],
+ },
+ '??': {
+ [
+ DartType.FLOAT32X4,
+ DartType.FLOAT32X4,
+ ],
+ },
+ },
+ DartType.FLOAT64X2: {
+ '*': {
+ [
+ DartType.FLOAT64X2,
+ DartType.FLOAT64X2,
+ ],
+ },
+ '+': {
+ [
+ DartType.FLOAT64X2,
+ DartType.FLOAT64X2,
+ ],
+ },
+ '-': {
+ [
+ DartType.FLOAT64X2,
+ DartType.FLOAT64X2,
+ ],
+ },
+ '/': {
+ [
+ DartType.FLOAT64X2,
+ DartType.FLOAT64X2,
+ ],
+ },
+ '??': {
+ [
+ DartType.FLOAT64X2,
+ DartType.FLOAT64X2,
+ ],
+ },
+ },
+ DartType.INT: {
+ '&': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '<<': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '>>': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '??': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '^': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '|': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '~/': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ },
+ DartType.INT32X4: {
+ '&': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '+': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '-': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '??': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '^': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '|': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ },
+ DartType.LIST_BOOL: {
+ '+': {
+ [
+ DartType.LIST_BOOL,
+ DartType.LIST_BOOL,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_BOOL,
+ DartType.LIST_BOOL,
+ ],
+ },
+ },
+ DartType.LIST_DOUBLE: {
+ '+': {
+ [
+ DartType.LIST_DOUBLE,
+ DartType.LIST_DOUBLE,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_DOUBLE,
+ DartType.LIST_DOUBLE,
+ ],
+ },
+ },
+ DartType.LIST_FLOAT32X4: {
+ '+': {
+ [
+ DartType.FLOAT32X4LIST,
+ DartType.LIST_FLOAT32X4,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_FLOAT32X4,
+ DartType.LIST_FLOAT32X4,
+ ],
+ },
+ },
+ DartType.LIST_FLOAT64X2: {
+ '+': {
+ [
+ DartType.FLOAT64X2LIST,
+ DartType.LIST_FLOAT64X2,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_FLOAT64X2,
+ DartType.LIST_FLOAT64X2,
+ ],
+ },
+ },
+ DartType.LIST_INT: {
+ '+': {
+ [
+ DartType.LIST_INT,
+ DartType.LIST_INT,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_INT,
+ DartType.LIST_INT,
+ ],
+ },
+ },
+ DartType.LIST_INT32X4: {
+ '+': {
+ [
+ DartType.INT32X4LIST,
+ DartType.LIST_INT32X4,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_INT32X4,
+ DartType.LIST_INT32X4,
+ ],
+ },
+ },
+ DartType.LIST_STRING: {
+ '+': {
+ [
+ DartType.LIST_STRING,
+ DartType.LIST_STRING,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_STRING,
+ DartType.LIST_STRING,
+ ],
+ },
+ },
+ DartType.NUM: {
+ '%': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '*': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '+': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '-': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '??': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ },
+ DartType.STRING: {
+ '*': {
+ [
+ DartType.STRING,
+ DartType.INT,
+ ],
+ },
+ '+': {
+ [
+ DartType.STRING,
+ DartType.STRING,
+ ],
+ },
+ '??': {
+ [
+ DartType.STRING,
+ DartType.STRING,
+ ],
+ },
+ },
+ };
+
+ // Map type to a list of available unary operators.
+ static const Map<DartType, Set<String>> _uniOps = {
+ DartType.BOOL: {'!'},
+ DartType.DOUBLE: {'-'},
+ DartType.DURATION: {'-'},
+ DartType.FLOAT32X4: {'-'},
+ DartType.FLOAT64X2: {'-'},
+ DartType.INT: {'-', '~'},
+ DartType.NUM: {'-'},
+ };
+
+ // Map type to a list of assignment operators with a set of the
+ // assignable right hand side types.
+ static const Map<DartType, Map<String, Set<DartType>>> _assignOps = {
+ DartType.BOOL: {
+ '=': {
+ DartType.BOOL,
+ },
+ '??=': {
+ DartType.BOOL,
+ },
+ },
+ DartType.DOUBLE: {
+ '=': {
+ DartType.DOUBLE,
+ },
+ '??=': {
+ DartType.DOUBLE,
+ },
+ '+=': {
+ DartType.NUM,
+ },
+ '-=': {
+ DartType.NUM,
+ },
+ '*=': {
+ DartType.NUM,
+ },
+ '%=': {
+ DartType.NUM,
+ },
+ '/=': {
+ DartType.NUM,
+ },
+ },
+ DartType.DURATION: {
+ '=': {
+ DartType.DURATION,
+ },
+ '??=': {
+ DartType.DURATION,
+ },
+ '+=': {
+ DartType.DURATION,
+ },
+ '-=': {
+ DartType.DURATION,
+ },
+ '*=': {
+ DartType.NUM,
+ },
+ '~/=': {
+ DartType.INT,
+ },
+ },
+ DartType.FLOAT32LIST: {
+ '=': {
+ DartType.FLOAT32LIST,
+ },
+ '??=': {
+ DartType.FLOAT32LIST,
+ },
+ },
+ DartType.FLOAT32X4: {
+ '=': {
+ DartType.FLOAT32X4,
+ },
+ '??=': {
+ DartType.FLOAT32X4,
+ },
+ '+=': {
+ DartType.FLOAT32X4,
+ },
+ '-=': {
+ DartType.FLOAT32X4,
+ },
+ '*=': {
+ DartType.FLOAT32X4,
+ },
+ '/=': {
+ DartType.FLOAT32X4,
+ },
+ },
+ DartType.FLOAT32X4LIST: {
+ '=': {
+ DartType.FLOAT32X4LIST,
+ },
+ '??=': {
+ DartType.FLOAT32X4LIST,
+ },
+ },
+ DartType.FLOAT64LIST: {
+ '=': {
+ DartType.FLOAT64LIST,
+ },
+ '??=': {
+ DartType.FLOAT64LIST,
+ },
+ },
+ DartType.FLOAT64X2: {
+ '=': {
+ DartType.FLOAT64X2,
+ },
+ '??=': {
+ DartType.FLOAT64X2,
+ },
+ '+=': {
+ DartType.FLOAT64X2,
+ },
+ '-=': {
+ DartType.FLOAT64X2,
+ },
+ '*=': {
+ DartType.FLOAT64X2,
+ },
+ '/=': {
+ DartType.FLOAT64X2,
+ },
+ },
+ DartType.FLOAT64X2LIST: {
+ '=': {
+ DartType.FLOAT64X2LIST,
+ },
+ '??=': {
+ DartType.FLOAT64X2LIST,
+ },
+ },
+ DartType.INT: {
+ '~/=': {
+ DartType.NUM,
+ },
+ '=': {
+ DartType.INT,
+ },
+ '??=': {
+ DartType.INT,
+ },
+ '&=': {
+ DartType.INT,
+ },
+ '|=': {
+ DartType.INT,
+ },
+ '^=': {
+ DartType.INT,
+ },
+ '<<=': {
+ DartType.INT,
+ },
+ '>>=': {
+ DartType.INT,
+ },
+ },
+ DartType.INT16LIST: {
+ '=': {
+ DartType.INT16LIST,
+ },
+ '??=': {
+ DartType.INT16LIST,
+ },
+ },
+ DartType.INT32LIST: {
+ '=': {
+ DartType.INT32LIST,
+ },
+ '??=': {
+ DartType.INT32LIST,
+ },
+ },
+ DartType.INT32X4: {
+ '=': {
+ DartType.INT32X4,
+ },
+ '??=': {
+ DartType.INT32X4,
+ },
+ '|=': {
+ DartType.INT32X4,
+ },
+ '&=': {
+ DartType.INT32X4,
+ },
+ '^=': {
+ DartType.INT32X4,
+ },
+ '+=': {
+ DartType.INT32X4,
+ },
+ '-=': {
+ DartType.INT32X4,
+ },
+ },
+ DartType.INT32X4LIST: {
+ '=': {
+ DartType.INT32X4LIST,
+ },
+ '??=': {
+ DartType.INT32X4LIST,
+ },
+ },
+ DartType.INT64LIST: {
+ '=': {
+ DartType.INT64LIST,
+ },
+ '??=': {
+ DartType.INT64LIST,
+ },
+ },
+ DartType.INT8LIST: {
+ '=': {
+ DartType.INT8LIST,
+ },
+ '??=': {
+ DartType.INT8LIST,
+ },
+ },
+ DartType.LIST_BOOL: {
+ '=': {
+ DartType.LIST_BOOL,
+ },
+ '??=': {
+ DartType.LIST_BOOL,
+ },
+ '+=': {
+ DartType.LIST_BOOL,
+ },
+ },
+ DartType.LIST_DOUBLE: {
+ '=': {
+ DartType.LIST_DOUBLE,
+ },
+ '??=': {
+ DartType.LIST_DOUBLE,
+ },
+ '+=': {
+ DartType.LIST_DOUBLE,
+ },
+ },
+ DartType.LIST_FLOAT32X4: {
+ '+=': {
+ DartType.LIST_FLOAT32X4,
+ },
+ },
+ DartType.LIST_FLOAT64X2: {
+ '+=': {
+ DartType.LIST_FLOAT64X2,
+ },
+ },
+ DartType.LIST_INT: {
+ '+=': {
+ DartType.LIST_INT,
+ },
+ '=': {
+ DartType.LIST_INT,
+ },
+ '??=': {
+ DartType.LIST_INT,
+ },
+ },
+ DartType.LIST_INT32X4: {
+ '+=': {
+ DartType.LIST_INT32X4,
+ },
+ },
+ DartType.LIST_STRING: {
+ '=': {
+ DartType.LIST_STRING,
+ },
+ '??=': {
+ DartType.LIST_STRING,
+ },
+ '+=': {
+ DartType.LIST_STRING,
+ },
+ },
+ DartType.MAP_BOOL_BOOL: {
+ '=': {
+ DartType.MAP_BOOL_BOOL,
+ },
+ '??=': {
+ DartType.MAP_BOOL_BOOL,
+ },
+ },
+ DartType.MAP_BOOL_DOUBLE: {
+ '=': {
+ DartType.MAP_BOOL_DOUBLE,
+ },
+ '??=': {
+ DartType.MAP_BOOL_DOUBLE,
+ },
+ },
+ DartType.MAP_BOOL_INT: {
+ '=': {
+ DartType.MAP_BOOL_INT,
+ },
+ '??=': {
+ DartType.MAP_BOOL_INT,
+ },
+ },
+ DartType.MAP_BOOL_STRING: {
+ '=': {
+ DartType.MAP_BOOL_STRING,
+ },
+ '??=': {
+ DartType.MAP_BOOL_STRING,
+ },
+ },
+ DartType.MAP_DOUBLE_BOOL: {
+ '=': {
+ DartType.MAP_DOUBLE_BOOL,
+ },
+ '??=': {
+ DartType.MAP_DOUBLE_BOOL,
+ },
+ },
+ DartType.MAP_DOUBLE_DOUBLE: {
+ '=': {
+ DartType.MAP_DOUBLE_DOUBLE,
+ },
+ '??=': {
+ DartType.MAP_DOUBLE_DOUBLE,
+ },
+ },
+ DartType.MAP_DOUBLE_INT: {
+ '=': {
+ DartType.MAP_DOUBLE_INT,
+ },
+ '??=': {
+ DartType.MAP_DOUBLE_INT,
+ },
+ },
+ DartType.MAP_DOUBLE_STRING: {
+ '=': {
+ DartType.MAP_DOUBLE_STRING,
+ },
+ '??=': {
+ DartType.MAP_DOUBLE_STRING,
+ },
+ },
+ DartType.MAP_INT_BOOL: {
+ '=': {
+ DartType.MAP_INT_BOOL,
+ },
+ '??=': {
+ DartType.MAP_INT_BOOL,
+ },
+ },
+ DartType.MAP_INT_DOUBLE: {
+ '=': {
+ DartType.MAP_INT_DOUBLE,
+ },
+ '??=': {
+ DartType.MAP_INT_DOUBLE,
+ },
+ },
+ DartType.MAP_INT_INT: {
+ '=': {
+ DartType.MAP_INT_INT,
+ },
+ '??=': {
+ DartType.MAP_INT_INT,
+ },
+ },
+ DartType.MAP_INT_STRING: {
+ '=': {
+ DartType.MAP_INT_STRING,
+ },
+ '??=': {
+ DartType.MAP_INT_STRING,
+ },
+ },
+ DartType.MAP_STRING_BOOL: {
+ '=': {
+ DartType.MAP_STRING_BOOL,
+ },
+ '??=': {
+ DartType.MAP_STRING_BOOL,
+ },
+ },
+ DartType.MAP_STRING_DOUBLE: {
+ '=': {
+ DartType.MAP_STRING_DOUBLE,
+ },
+ '??=': {
+ DartType.MAP_STRING_DOUBLE,
+ },
+ },
+ DartType.MAP_STRING_INT: {
+ '=': {
+ DartType.MAP_STRING_INT,
+ },
+ '??=': {
+ DartType.MAP_STRING_INT,
+ },
+ },
+ DartType.MAP_STRING_STRING: {
+ '=': {
+ DartType.MAP_STRING_STRING,
+ },
+ '??=': {
+ DartType.MAP_STRING_STRING,
+ },
+ },
+ DartType.NUM: {
+ '=': {
+ DartType.NUM,
+ },
+ '??=': {
+ DartType.NUM,
+ },
+ '+=': {
+ DartType.NUM,
+ },
+ '-=': {
+ DartType.NUM,
+ },
+ '*=': {
+ DartType.NUM,
+ },
+ '%=': {
+ DartType.NUM,
+ },
+ },
+ DartType.SET_BOOL: {
+ '=': {
+ DartType.SET_BOOL,
+ },
+ '??=': {
+ DartType.SET_BOOL,
+ },
+ },
+ DartType.SET_DOUBLE: {
+ '=': {
+ DartType.SET_DOUBLE,
+ },
+ '??=': {
+ DartType.SET_DOUBLE,
+ },
+ },
+ DartType.SET_INT: {
+ '=': {
+ DartType.SET_INT,
+ },
+ '??=': {
+ DartType.SET_INT,
+ },
+ },
+ DartType.SET_STRING: {
+ '=': {
+ DartType.SET_STRING,
+ },
+ '??=': {
+ DartType.SET_STRING,
+ },
+ },
+ DartType.STRING: {
+ '=': {
+ DartType.STRING,
+ },
+ '??=': {
+ DartType.STRING,
+ },
+ '+=': {
+ DartType.STRING,
+ },
+ '*=': {
+ DartType.INT,
+ },
+ },
+ DartType.UINT16LIST: {
+ '=': {
+ DartType.UINT16LIST,
+ },
+ '??=': {
+ DartType.UINT16LIST,
+ },
+ },
+ DartType.UINT32LIST: {
+ '=': {
+ DartType.UINT32LIST,
+ },
+ '??=': {
+ DartType.UINT32LIST,
+ },
+ },
+ DartType.UINT64LIST: {
+ '=': {
+ DartType.UINT64LIST,
+ },
+ '??=': {
+ DartType.UINT64LIST,
+ },
+ },
+ DartType.UINT8CLAMPEDLIST: {
+ '=': {
+ DartType.UINT8CLAMPEDLIST,
+ },
+ '??=': {
+ DartType.UINT8CLAMPEDLIST,
+ },
+ },
+ DartType.UINT8LIST: {
+ '=': {
+ DartType.UINT8LIST,
+ },
+ '??=': {
+ DartType.UINT8LIST,
+ },
+ },
+ };
+}
+
+class DartTypeNoFpFlatTp extends DartType {
+ final String name;
+ const DartTypeNoFpFlatTp._withName(this.name) : super._withName(name);
+ const DartTypeNoFpFlatTp() : name = null;
+ static bool isListType(DartType tp) {
+ return DartType._listTypes.contains(tp);
+ }
+
+ static bool isMapType(DartType tp) {
+ return DartType._mapTypes.contains(tp);
+ }
+
+ static bool isCollectionType(DartType tp) {
+ return DartType._collectionTypes.contains(tp);
+ }
+
+ static bool isGrowableType(DartType tp) {
+ return DartType._growableTypes.contains(tp);
+ }
+
+ static bool isComplexType(DartType tp) {
+ return DartType._complexTypes.contains(tp);
+ }
+
+ bool isInterfaceOfType(DartType tp, DartType iTp) {
+ return _interfaceRels.containsKey(iTp) && _interfaceRels[iTp].contains(tp);
+ }
+
+ Set<DartType> get mapTypes {
+ return _mapTypes;
+ }
+
+ bool isSpecializable(DartType tp) {
+ return _interfaceRels.containsKey(tp);
+ }
+
+ Set<DartType> interfaces(DartType tp) {
+ if (_interfaceRels.containsKey(tp)) {
+ return _interfaceRels[tp];
+ }
+ return null;
+ }
+
+ DartType indexType(DartType tp) {
+ if (_indexedBy.containsKey(tp)) {
+ return _indexedBy[tp];
+ }
+ return null;
+ }
+
+ Set<DartType> indexableElementTypes(DartType tp) {
+ if (_indexableElementOf.containsKey(tp)) {
+ return _indexableElementOf[tp];
+ }
+ return null;
+ }
+
+ bool isIndexableElementType(DartType tp) {
+ return _indexableElementOf.containsKey(tp);
+ }
+
+ DartType elementType(DartType tp) {
+ if (_subscriptsTo.containsKey(tp)) {
+ return _subscriptsTo[tp];
+ }
+ return null;
+ }
+
+ Set<DartType> get iterableTypes1 {
+ return _iterableTypes1;
+ }
+
+ Set<String> uniOps(DartType tp) {
+ if (_uniOps.containsKey(tp)) {
+ return _uniOps[tp];
+ }
+ return <String>{};
+ }
+
+ Set<String> binOps(DartType tp) {
+ if (_binOps.containsKey(tp)) {
+ return _binOps[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ Set<List<DartType>> binOpParameters(DartType tp, String op) {
+ if (_binOps.containsKey(tp) && _binOps[tp].containsKey(op)) {
+ return _binOps[tp][op];
+ }
+ return null;
+ }
+
+ Set<String> assignOps(DartType tp) {
+ if (_assignOps.containsKey(tp)) {
+ return _assignOps[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ Set<DartType> assignOpRhs(DartType tp, String op) {
+ if (_assignOps.containsKey(tp) && _assignOps[tp].containsKey(op)) {
+ return _assignOps[tp][op];
+ }
+ return <DartType>{};
+ }
+
+ bool hasConstructor(DartType tp) {
+ return _constructors.containsKey(tp);
+ }
+
+ Set<String> constructors(DartType tp) {
+ if (_constructors.containsKey(tp)) {
+ return _constructors[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ List<DartType> constructorParameters(DartType tp, String constructor) {
+ if (_constructors.containsKey(tp) &&
+ _constructors[tp].containsKey(constructor)) {
+ return _constructors[tp][constructor];
+ }
+ return null;
+ }
+
+ Set<DartType> get allTypes {
+ return _allTypes;
+ }
+
+ // All types extracted from analyzer.
+ static const _allTypes = {
+ DartType.INT8LIST,
+ DartType.UINT8LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.INT16LIST,
+ DartType.UINT16LIST,
+ DartType.INT32LIST,
+ DartType.UINT32LIST,
+ DartType.INT64LIST,
+ DartType.UINT64LIST,
+ DartType.INT32X4LIST,
+ DartType.INT32X4,
+ DartType.BOOL,
+ DartType.DURATION,
+ DartType.INT,
+ DartType.NUM,
+ DartType.STRING,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ };
+
+ // All List<E> types: LIST_INT, LIST_STRING, etc.
+ static const Set<DartType> _listTypes = {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // All Set types: SET_INT, SET_STRING, etc.
+ static const Set<DartType> _setTypes = {
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ };
+
+ // All Map<K, V> types: MAP_INT_STRING, MAP_DOUBLE_BOOL, etc.
+ static const Set<DartType> _mapTypes = {
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ };
+
+ // All collection types: list, map and set types.
+ static const Set<DartType> _collectionTypes = {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // All growable types: list, map, set and string types.
+ static const Set<DartType> _growableTypes = {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ DartType.STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // All trivially indexable types: Map types and List types.
+ // Elements of these can be written and read by [], unlike Set
+ // which uses getElementAt to access individual elements.
+ static const Set<DartType> _indexableTypes = {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // Map type to the resulting type when subscripted.
+ // Example: List<String> subscripts to String.
+ static const Map<DartType, DartType> _subscriptsTo = {
+ DartType.DURATION: DartType.DURATION,
+ DartType.INT16LIST: DartType.INT,
+ DartType.INT32LIST: DartType.INT,
+ DartType.INT32X4LIST: DartType.INT32X4,
+ DartType.INT64LIST: DartType.INT,
+ DartType.INT8LIST: DartType.INT,
+ DartType.LIST_BOOL: DartType.BOOL,
+ DartType.LIST_INT: DartType.INT,
+ DartType.LIST_STRING: DartType.STRING,
+ DartType.MAP_BOOL_BOOL: DartType.BOOL,
+ DartType.MAP_BOOL_INT: DartType.INT,
+ DartType.MAP_BOOL_STRING: DartType.STRING,
+ DartType.MAP_INT_BOOL: DartType.BOOL,
+ DartType.MAP_INT_INT: DartType.INT,
+ DartType.MAP_INT_STRING: DartType.STRING,
+ DartType.MAP_STRING_BOOL: DartType.BOOL,
+ DartType.MAP_STRING_INT: DartType.INT,
+ DartType.MAP_STRING_STRING: DartType.STRING,
+ DartType.NUM: DartType.NUM,
+ DartType.SET_BOOL: DartType.BOOL,
+ DartType.SET_INT: DartType.INT,
+ DartType.SET_STRING: DartType.STRING,
+ DartType.STRING: DartType.STRING,
+ DartType.UINT16LIST: DartType.INT,
+ DartType.UINT32LIST: DartType.INT,
+ DartType.UINT64LIST: DartType.INT,
+ DartType.UINT8CLAMPEDLIST: DartType.INT,
+ DartType.UINT8LIST: DartType.INT,
+ };
+
+ // Map type to type required as index.
+ // Example: List<String> is indexed by int,
+ // Map<String, double> indexed by String.
+ static const Map<DartType, DartType> _indexedBy = {
+ DartType.INT16LIST: DartType.INT,
+ DartType.INT32LIST: DartType.INT,
+ DartType.INT32X4LIST: DartType.INT,
+ DartType.INT64LIST: DartType.INT,
+ DartType.INT8LIST: DartType.INT,
+ DartType.LIST_BOOL: DartType.INT,
+ DartType.LIST_INT: DartType.INT,
+ DartType.LIST_STRING: DartType.INT,
+ DartType.MAP_BOOL_BOOL: DartType.BOOL,
+ DartType.MAP_BOOL_INT: DartType.BOOL,
+ DartType.MAP_BOOL_STRING: DartType.BOOL,
+ DartType.MAP_INT_BOOL: DartType.INT,
+ DartType.MAP_INT_INT: DartType.INT,
+ DartType.MAP_INT_STRING: DartType.INT,
+ DartType.MAP_STRING_BOOL: DartType.STRING,
+ DartType.MAP_STRING_INT: DartType.STRING,
+ DartType.MAP_STRING_STRING: DartType.STRING,
+ DartType.UINT16LIST: DartType.INT,
+ DartType.UINT32LIST: DartType.INT,
+ DartType.UINT64LIST: DartType.INT,
+ DartType.UINT8CLAMPEDLIST: DartType.INT,
+ DartType.UINT8LIST: DartType.INT,
+ };
+
+ // Map type to a Set of types that contain it as an element.
+ // Example: String is element of List<String> and Map<int, String>
+ static const Map<DartType, Set<DartType>> _elementOf = {
+ DartType.BOOL: {
+ DartType.LIST_BOOL,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_STRING_BOOL,
+ DartType.SET_BOOL,
+ },
+ DartType.DURATION: {
+ DartType.DURATION,
+ },
+ DartType.INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_INT,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_INT_INT,
+ DartType.MAP_STRING_INT,
+ DartType.SET_INT,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.NUM: {
+ DartType.NUM,
+ },
+ DartType.STRING: {
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_STRING,
+ DartType.SET_STRING,
+ DartType.STRING,
+ },
+ };
+
+ // Map type to a Set of types that contain it as an indexable element.
+ // Same as element of, but without Set types.
+ static const Map<DartType, Set<DartType>> _indexableElementOf = {
+ DartType.BOOL: {
+ DartType.LIST_BOOL,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_STRING_BOOL,
+ },
+ DartType.INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_INT,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_INT_INT,
+ DartType.MAP_STRING_INT,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.STRING: {
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_STRING,
+ },
+ };
+
+ // All iterable types: Set types + List types.
+ // These can be used in for(x in <iterable type>),
+ // therefore Map is not included.
+ static const Set<DartType> _iterableTypes1 = {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ };
+
+ // Map Interface type to Set of types that implement it.
+ // Example: interface num is implemented by int and double.
+ static const Map<DartType, Set<DartType>> _interfaceRels = {
+ DartType.COMPARABLE_DURATION: {
+ DartType.DURATION,
+ },
+ DartType.COMPARABLE_NUM: {
+ DartType.INT,
+ DartType.NUM,
+ },
+ DartType.COMPARABLE_STRING: {
+ DartType.STRING,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_BOOL: {
+ DartType.LIST_BOOL,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_E: {
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_INT,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.EFFICIENTLENGTHITERABLE_STRING: {
+ DartType.LIST_STRING,
+ },
+ DartType.ITERABLE_E: {
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ },
+ DartType.ITERABLE_INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.ITERABLE_INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.LIST_INT: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_INT,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.LIST_INT32X4: {
+ DartType.INT32X4LIST,
+ },
+ DartType.NUM: {
+ DartType.INT,
+ DartType.NUM,
+ },
+ DartType.OBJECT: {
+ DartType.BOOL,
+ DartType.DURATION,
+ DartType.INT,
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.LIST_BOOL,
+ DartType.LIST_INT,
+ DartType.LIST_STRING,
+ DartType.MAP_BOOL_BOOL,
+ DartType.MAP_BOOL_INT,
+ DartType.MAP_BOOL_STRING,
+ DartType.MAP_INT_BOOL,
+ DartType.MAP_INT_INT,
+ DartType.MAP_INT_STRING,
+ DartType.MAP_STRING_BOOL,
+ DartType.MAP_STRING_INT,
+ DartType.MAP_STRING_STRING,
+ DartType.NUM,
+ DartType.SET_BOOL,
+ DartType.SET_INT,
+ DartType.SET_STRING,
+ DartType.STRING,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType.PATTERN: {
+ DartType.STRING,
+ },
+ DartType.TYPEDDATA: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT32X4LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ DartType._TYPEDINTLIST: {
+ DartType.INT16LIST,
+ DartType.INT32LIST,
+ DartType.INT64LIST,
+ DartType.INT8LIST,
+ DartType.UINT16LIST,
+ DartType.UINT32LIST,
+ DartType.UINT64LIST,
+ DartType.UINT8CLAMPEDLIST,
+ DartType.UINT8LIST,
+ },
+ };
+
+ // Map type to a list of constructors names with a list of constructor
+ // parameter types.
+ static const Map<DartType, Map<String, List<DartType>>> _constructors = {
+ DartType.DURATION: {
+ '': [],
+ },
+ DartType.INT16LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.INT32LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.INT32X4: {
+ '': [
+ DartType.INT,
+ DartType.INT,
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ DartType.INT32X4LIST: {
+ '': [
+ DartType.INT,
+ ],
+ },
+ DartType.INT64LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.INT8LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT16LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT32LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT64LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT8CLAMPEDLIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ DartType.UINT8LIST: {
+ '': [
+ DartType.INT,
+ ],
+ 'fromList': [
+ DartType.LIST_INT,
+ ],
+ },
+ };
+
+ // Map type to a list of binary operators with set of the respective
+ // types for the first and second operand.
+ static const Map<DartType, Map<String, Set<List<DartType>>>> _binOps = {
+ DartType.BOOL: {
+ '&': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '&&': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '<': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '<=': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '==': {
+ [
+ DartType.NUM,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.STRING,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.LIST_BOOL,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.LIST_INT,
+ DartType.OBJECT,
+ ],
+ [
+ DartType.LIST_STRING,
+ DartType.OBJECT,
+ ],
+ },
+ '>': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '>=': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '??': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '^': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '|': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ '||': {
+ [
+ DartType.BOOL,
+ DartType.BOOL,
+ ],
+ },
+ },
+ DartType.DURATION: {
+ '*': {
+ [
+ DartType.DURATION,
+ DartType.NUM,
+ ],
+ },
+ '+': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ },
+ '-': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ },
+ '??': {
+ [
+ DartType.DURATION,
+ DartType.DURATION,
+ ],
+ },
+ '~/': {
+ [
+ DartType.DURATION,
+ DartType.INT,
+ ],
+ },
+ },
+ DartType.INT: {
+ '&': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '<<': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '>>': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '??': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '^': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '|': {
+ [
+ DartType.INT,
+ DartType.INT,
+ ],
+ },
+ '~/': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ },
+ DartType.INT32X4: {
+ '&': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '+': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '-': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '??': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '^': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ '|': {
+ [
+ DartType.INT32X4,
+ DartType.INT32X4,
+ ],
+ },
+ },
+ DartType.LIST_BOOL: {
+ '+': {
+ [
+ DartType.LIST_BOOL,
+ DartType.LIST_BOOL,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_BOOL,
+ DartType.LIST_BOOL,
+ ],
+ },
+ },
+ DartType.LIST_FLOAT32X4: {
+ '??': {
+ [
+ DartType.LIST_FLOAT32X4,
+ DartType.LIST_FLOAT32X4,
+ ],
+ },
+ },
+ DartType.LIST_FLOAT64X2: {
+ '??': {
+ [
+ DartType.LIST_FLOAT64X2,
+ DartType.LIST_FLOAT64X2,
+ ],
+ },
+ },
+ DartType.LIST_INT: {
+ '+': {
+ [
+ DartType.LIST_INT,
+ DartType.LIST_INT,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_INT,
+ DartType.LIST_INT,
+ ],
+ },
+ },
+ DartType.LIST_INT32X4: {
+ '+': {
+ [
+ DartType.INT32X4LIST,
+ DartType.LIST_INT32X4,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_INT32X4,
+ DartType.LIST_INT32X4,
+ ],
+ },
+ },
+ DartType.LIST_STRING: {
+ '+': {
+ [
+ DartType.LIST_STRING,
+ DartType.LIST_STRING,
+ ],
+ },
+ '??': {
+ [
+ DartType.LIST_STRING,
+ DartType.LIST_STRING,
+ ],
+ },
+ },
+ DartType.NUM: {
+ '%': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '*': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '+': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '-': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ '??': {
+ [
+ DartType.NUM,
+ DartType.NUM,
+ ],
+ },
+ },
+ DartType.STRING: {
+ '*': {
+ [
+ DartType.STRING,
+ DartType.INT,
+ ],
+ },
+ '+': {
+ [
+ DartType.STRING,
+ DartType.STRING,
+ ],
+ },
+ '??': {
+ [
+ DartType.STRING,
+ DartType.STRING,
+ ],
+ },
+ },
+ };
+
+ // Map type to a list of available unary operators.
+ static const Map<DartType, Set<String>> _uniOps = {
+ DartType.BOOL: {'!'},
+ DartType.DURATION: {'-'},
+ DartType.INT: {'-', '~'},
+ DartType.NUM: {'-'},
+ };
+
+ // Map type to a list of assignment operators with a set of the
+ // assignable right hand side types.
+ static const Map<DartType, Map<String, Set<DartType>>> _assignOps = {
+ DartType.BOOL: {
+ '=': {
+ DartType.BOOL,
+ },
+ '??=': {
+ DartType.BOOL,
+ },
+ },
+ DartType.DURATION: {
+ '=': {
+ DartType.DURATION,
+ },
+ '??=': {
+ DartType.DURATION,
+ },
+ '+=': {
+ DartType.DURATION,
+ },
+ '-=': {
+ DartType.DURATION,
+ },
+ '*=': {
+ DartType.NUM,
+ },
+ '~/=': {
+ DartType.INT,
+ },
+ },
+ DartType.INT: {
+ '~/=': {
+ DartType.NUM,
+ },
+ '=': {
+ DartType.INT,
+ },
+ '??=': {
+ DartType.INT,
+ },
+ '&=': {
+ DartType.INT,
+ },
+ '|=': {
+ DartType.INT,
+ },
+ '^=': {
+ DartType.INT,
+ },
+ '<<=': {
+ DartType.INT,
+ },
+ '>>=': {
+ DartType.INT,
+ },
+ },
+ DartType.INT16LIST: {
+ '=': {
+ DartType.INT16LIST,
+ },
+ '??=': {
+ DartType.INT16LIST,
+ },
+ },
+ DartType.INT32LIST: {
+ '=': {
+ DartType.INT32LIST,
+ },
+ '??=': {
+ DartType.INT32LIST,
+ },
+ },
+ DartType.INT32X4: {
+ '=': {
+ DartType.INT32X4,
+ },
+ '??=': {
+ DartType.INT32X4,
+ },
+ '|=': {
+ DartType.INT32X4,
+ },
+ '&=': {
+ DartType.INT32X4,
+ },
+ '^=': {
+ DartType.INT32X4,
+ },
+ '+=': {
+ DartType.INT32X4,
+ },
+ '-=': {
+ DartType.INT32X4,
+ },
+ },
+ DartType.INT32X4LIST: {
+ '=': {
+ DartType.INT32X4LIST,
+ },
+ '??=': {
+ DartType.INT32X4LIST,
+ },
+ },
+ DartType.INT64LIST: {
+ '=': {
+ DartType.INT64LIST,
+ },
+ '??=': {
+ DartType.INT64LIST,
+ },
+ },
+ DartType.INT8LIST: {
+ '=': {
+ DartType.INT8LIST,
+ },
+ '??=': {
+ DartType.INT8LIST,
+ },
+ },
+ DartType.LIST_BOOL: {
+ '=': {
+ DartType.LIST_BOOL,
+ },
+ '??=': {
+ DartType.LIST_BOOL,
+ },
+ '+=': {
+ DartType.LIST_BOOL,
+ },
+ },
+ DartType.LIST_FLOAT32X4: {
+ '+=': {
+ DartType.LIST_FLOAT32X4,
+ },
+ },
+ DartType.LIST_FLOAT64X2: {
+ '+=': {
+ DartType.LIST_FLOAT64X2,
+ },
+ },
+ DartType.LIST_INT: {
+ '+=': {
+ DartType.LIST_INT,
+ },
+ '=': {
+ DartType.LIST_INT,
+ },
+ '??=': {
+ DartType.LIST_INT,
+ },
+ },
+ DartType.LIST_INT32X4: {
+ '+=': {
+ DartType.LIST_INT32X4,
+ },
+ },
+ DartType.LIST_STRING: {
+ '=': {
+ DartType.LIST_STRING,
+ },
+ '??=': {
+ DartType.LIST_STRING,
+ },
+ '+=': {
+ DartType.LIST_STRING,
+ },
+ },
+ DartType.MAP_BOOL_BOOL: {
+ '=': {
+ DartType.MAP_BOOL_BOOL,
+ },
+ '??=': {
+ DartType.MAP_BOOL_BOOL,
+ },
+ },
+ DartType.MAP_BOOL_INT: {
+ '=': {
+ DartType.MAP_BOOL_INT,
+ },
+ '??=': {
+ DartType.MAP_BOOL_INT,
+ },
+ },
+ DartType.MAP_BOOL_STRING: {
+ '=': {
+ DartType.MAP_BOOL_STRING,
+ },
+ '??=': {
+ DartType.MAP_BOOL_STRING,
+ },
+ },
+ DartType.MAP_INT_BOOL: {
+ '=': {
+ DartType.MAP_INT_BOOL,
+ },
+ '??=': {
+ DartType.MAP_INT_BOOL,
+ },
+ },
+ DartType.MAP_INT_INT: {
+ '=': {
+ DartType.MAP_INT_INT,
+ },
+ '??=': {
+ DartType.MAP_INT_INT,
+ },
+ },
+ DartType.MAP_INT_STRING: {
+ '=': {
+ DartType.MAP_INT_STRING,
+ },
+ '??=': {
+ DartType.MAP_INT_STRING,
+ },
+ },
+ DartType.MAP_STRING_BOOL: {
+ '=': {
+ DartType.MAP_STRING_BOOL,
+ },
+ '??=': {
+ DartType.MAP_STRING_BOOL,
+ },
+ },
+ DartType.MAP_STRING_INT: {
+ '=': {
+ DartType.MAP_STRING_INT,
+ },
+ '??=': {
+ DartType.MAP_STRING_INT,
+ },
+ },
+ DartType.MAP_STRING_STRING: {
+ '=': {
+ DartType.MAP_STRING_STRING,
+ },
+ '??=': {
+ DartType.MAP_STRING_STRING,
+ },
+ },
+ DartType.NUM: {
+ '=': {
+ DartType.NUM,
+ },
+ '??=': {
+ DartType.NUM,
+ },
+ '+=': {
+ DartType.NUM,
+ },
+ '-=': {
+ DartType.NUM,
+ },
+ '*=': {
+ DartType.NUM,
+ },
+ '%=': {
+ DartType.NUM,
+ },
+ },
+ DartType.SET_BOOL: {
+ '=': {
+ DartType.SET_BOOL,
+ },
+ '??=': {
+ DartType.SET_BOOL,
+ },
+ },
+ DartType.SET_INT: {
+ '=': {
+ DartType.SET_INT,
+ },
+ '??=': {
+ DartType.SET_INT,
+ },
+ },
+ DartType.SET_STRING: {
+ '=': {
+ DartType.SET_STRING,
+ },
+ '??=': {
+ DartType.SET_STRING,
+ },
+ },
+ DartType.STRING: {
+ '=': {
+ DartType.STRING,
+ },
+ '??=': {
+ DartType.STRING,
+ },
+ '+=': {
+ DartType.STRING,
+ },
+ '*=': {
+ DartType.INT,
+ },
+ },
+ DartType.UINT16LIST: {
+ '=': {
+ DartType.UINT16LIST,
+ },
+ '??=': {
+ DartType.UINT16LIST,
+ },
+ },
+ DartType.UINT32LIST: {
+ '=': {
+ DartType.UINT32LIST,
+ },
+ '??=': {
+ DartType.UINT32LIST,
+ },
+ },
+ DartType.UINT64LIST: {
+ '=': {
+ DartType.UINT64LIST,
+ },
+ '??=': {
+ DartType.UINT64LIST,
+ },
+ },
+ DartType.UINT8CLAMPEDLIST: {
+ '=': {
+ DartType.UINT8CLAMPEDLIST,
+ },
+ '??=': {
+ DartType.UINT8CLAMPEDLIST,
+ },
+ },
+ DartType.UINT8LIST: {
+ '=': {
+ DartType.UINT8LIST,
+ },
+ '??=': {
+ DartType.UINT8LIST,
+ },
+ },
+ };
+}
diff --git a/runtime/tools/dartfuzz/dartfuzz_values.dart b/runtime/tools/dartfuzz/dartfuzz_values.dart
deleted file mode 100644
index 7886ae6..0000000
--- a/runtime/tools/dartfuzz/dartfuzz_values.dart
+++ /dev/null
@@ -1,207 +0,0 @@
-// 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.
-
-/// Class that represents some common Dart types.
-///
-/// TODO(ajcbik): generalize Dart types
-///
-class DartType {
- final String name;
-
- const DartType._withName(this.name);
-
- static const VOID = DartType._withName('void');
- static const BOOL = DartType._withName('bool');
- static const INT = DartType._withName('int');
- static const DOUBLE = DartType._withName('double');
- static const STRING = DartType._withName('String');
- static const INT_LIST = DartType._withName('List<int>');
- static const INT_SET = DartType._withName('Set<int>');
- static const INT_STRING_MAP = DartType._withName('Map<int, String>');
-
- // All value types.
- static const allTypes = [
- BOOL,
- INT,
- DOUBLE,
- STRING,
- INT_LIST,
- INT_SET,
- INT_STRING_MAP
- ];
-}
-
-/// Class with interesting values for fuzzing.
-class DartFuzzValues {
- // Interesting characters.
- static const List<String> interestingChars = [
- '\\u2665',
- '\\u{1f600}', // rune
- ];
-
- // Regular characters.
- static const regularChars =
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#&()+- ';
-
- // Interesting integer values.
- static const List<int> interestingIntegers = [
- 0x0000000000000000,
- 0x0000000000000001,
- 0x0000000000000010,
- 0x0000000000000020,
- 0x0000000000000040,
- 0x0000000000000064,
- 0x000000000000007f,
- 0x0000000000000080,
- 0x0000000000000081,
- 0x00000000000000ff,
- 0x0000000000000100,
- 0x0000000000000200,
- 0x00000000000003e8,
- 0x0000000000000400,
- 0x0000000000001000,
- 0x0000000000007fff,
- 0x0000000000008000,
- 0x0000000000008001,
- 0x000000000000ffff,
- 0x0000000000010000,
- 0x0000000005ffff05,
- 0x000000007fffffff,
- 0x0000000080000000,
- 0x0000000080000001,
- 0x00000000ffffffff,
- 0x0000000100000000,
- 0x0000000100000001,
- 0x0000000100000010,
- 0x0000000100000020,
- 0x0000000100000040,
- 0x0000000100000064,
- 0x000000010000007f,
- 0x0000000100000080,
- 0x0000000100000081,
- 0x00000001000000ff,
- 0x0000000100000100,
- 0x0000000100000200,
- 0x00000001000003e8,
- 0x0000000100000400,
- 0x0000000100001000,
- 0x0000000100007fff,
- 0x0000000100008000,
- 0x0000000100008001,
- 0x000000010000ffff,
- 0x0000000100010000,
- 0x0000000105ffff05,
- 0x000000017fffffff,
- 0x0000000180000000,
- 0x0000000180000001,
- 0x00000001ffffffff,
- 0x7fffffff00000000,
- 0x7fffffff00000001,
- 0x7fffffff00000010,
- 0x7fffffff00000020,
- 0x7fffffff00000040,
- 0x7fffffff00000064,
- 0x7fffffff0000007f,
- 0x7fffffff00000080,
- 0x7fffffff00000081,
- 0x7fffffff000000ff,
- 0x7fffffff00000100,
- 0x7fffffff00000200,
- 0x7fffffff000003e8,
- 0x7fffffff00000400,
- 0x7fffffff00001000,
- 0x7fffffff00007fff,
- 0x7fffffff00008000,
- 0x7fffffff00008001,
- 0x7fffffff0000ffff,
- 0x7fffffff00010000,
- 0x7fffffff05ffff05,
- 0x7fffffff7fffffff,
- 0x7fffffff80000000,
- 0x7fffffff80000001,
- 0x7fffffffffffffff,
- 0x8000000000000000,
- 0x8000000000000001,
- 0x8000000000000010,
- 0x8000000000000020,
- 0x8000000000000040,
- 0x8000000000000064,
- 0x800000000000007f,
- 0x8000000000000080,
- 0x8000000000000081,
- 0x80000000000000ff,
- 0x8000000000000100,
- 0x8000000000000200,
- 0x80000000000003e8,
- 0x8000000000000400,
- 0x8000000000001000,
- 0x8000000000007fff,
- 0x8000000000008000,
- 0x8000000000008001,
- 0x800000000000ffff,
- 0x8000000000010000,
- 0x8000000005ffff05,
- 0x800000007fffffff,
- 0x8000000080000000,
- 0x8000000080000001,
- 0x80000000ffffffff,
- 0x8000000100000000,
- 0x8000000100000001,
- 0x8000000100000010,
- 0x8000000100000020,
- 0x8000000100000040,
- 0x8000000100000064,
- 0x800000010000007f,
- 0x8000000100000080,
- 0x8000000100000081,
- 0x80000001000000ff,
- 0x8000000100000100,
- 0x8000000100000200,
- 0x80000001000003e8,
- 0x8000000100000400,
- 0x8000000100001000,
- 0x8000000100007fff,
- 0x8000000100008000,
- 0x8000000100008001,
- 0x800000010000ffff,
- 0x8000000100010000,
- 0x8000000105ffff05,
- 0x800000017fffffff,
- 0x8000000180000000,
- 0x8000000180000001,
- 0x80000001ffffffff,
- 0xffffffff00000000,
- 0xffffffff00000001,
- 0xffffffff00000010,
- 0xffffffff00000020,
- 0xffffffff00000040,
- 0xffffffff00000064,
- 0xffffffff0000007f,
- 0xffffffff00000080,
- 0xffffffff00000081,
- 0xffffffff000000ff,
- 0xffffffff00000100,
- 0xffffffff00000200,
- 0xffffffff000003e8,
- 0xffffffff00000400,
- 0xffffffff00001000,
- 0xffffffff00007fff,
- 0xffffffff00008000,
- 0xffffffff00008001,
- 0xffffffff0000ffff,
- 0xffffffff00010000,
- 0xffffffff05ffff05,
- 0xffffffff7fffffff,
- 0xffffffff80000000,
- 0xffffffff80000001,
- 0xfffffffffa0000fa,
- 0xffffffffffff7fff,
- 0xffffffffffff8000,
- 0xffffffffffff8001,
- 0xffffffffffffff7f,
- 0xffffffffffffff80,
- 0xffffffffffffff81,
- 0xffffffffffffffff,
- ];
-}
diff --git a/runtime/tools/dartfuzz/gen_api_table.dart b/runtime/tools/dartfuzz/gen_api_table.dart
index e4a55d6..39593aa 100644
--- a/runtime/tools/dartfuzz/gen_api_table.dart
+++ b/runtime/tools/dartfuzz/gen_api_table.dart
@@ -18,9 +18,8 @@
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/file_system/physical_file_system.dart';
-import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+import 'gen_util.dart';
// Class to represent a library method by name and prototype representation.
class DartLib {
@@ -39,27 +38,7 @@
var mapTable = <DartLib>[];
main() async {
- // Set paths. Note that for this particular use case, packageRoot can be
- // any directory. Here, we set it to the top of the SDK development, and
- // derive the required sdkPath from there.
- final String packageRoot = Platform.environment['DART_TOP'];
- if (packageRoot == null) {
- throw StateError('No environment variable DART_TOP');
- }
- final sdkPath = '$packageRoot/tools/sdks/dart-sdk';
-
- // This does most of the hard work of getting the analyzer configured
- // correctly. Typically the included paths are the files and directories
- // that need to be analyzed, but the SDK is always available, so it isn't
- // really important for this particular use case. We use the implementation
- // class in order to pass in the sdkPath directly.
- final provider = PhysicalResourceProvider.INSTANCE;
- final collection = AnalysisContextCollectionImpl(
- includedPaths: <String>[packageRoot],
- excludedPaths: <String>[packageRoot + "/pkg/front_end/test"],
- resourceProvider: provider,
- sdkPath: sdkPath);
- final AnalysisSession session = collection.contexts[0].currentSession;
+ final AnalysisSession session = GenUtil.createAnalysisSession();
// Visit libraries for table generation.
await visitLibraryAtUri(session, 'dart:async');
@@ -312,6 +291,7 @@
void dumpTable(String identifier, List<DartLib> table) {
print(' static const $identifier = [');
+ table.sort((a, b) => a.name.compareTo(b.name));
table.forEach((t) => print(' DartLib(\'${t.name}\', \'${t.proto}\'),'));
print(' ];');
}
diff --git a/runtime/tools/dartfuzz/gen_type_table.dart b/runtime/tools/dartfuzz/gen_type_table.dart
new file mode 100644
index 0000000..d6cbd3d
--- /dev/null
+++ b/runtime/tools/dartfuzz/gen_type_table.dart
@@ -0,0 +1,1349 @@
+// Copyright (c) 2019, 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.
+
+// Generates the type tables used by DartFuzz.
+//
+// Usage:
+// dart gen_type_table.dart > dartfuzz_type_table.dart
+//
+// Reformat:
+// tools/sdks/dart-sdk/bin/dartfmt -w \
+// runtime/tools/dartfuzz/dartfuzz_type_table.dart
+//
+// Then send out modified dartfuzz_type_table.dart for review together
+// with a modified dartfuzz.dart that increases the version.
+
+import 'dart:io';
+import 'dart:math';
+
+import 'package:args/args.dart';
+
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/element/element.dart';
+
+import 'gen_util.dart';
+
+// Minimum number of operators that are required for a type to be included in
+// the type table.
+final int operatorCountThreshold = 2;
+
+//
+// Operators and functions.
+//
+
+// Map type to a list of constructors names with a list of constructor
+// parameter types.
+Map<String, Map<String, List<String>>> constructors =
+ new Map<String, Map<String, List<String>>>();
+
+// Map type to a list of assignment operators with a set of the
+// assignable right hand side types.
+Map<String, Map<String, Set<String>>> assignOps =
+ new Map<String, Map<String, Set<String>>>();
+
+// Map type to a list of binary operators with set of the respective
+// types for the first and second operand.
+Map<String, Map<String, Set<List<String>>>> binOps =
+ new Map<String, Map<String, Set<List<String>>>>();
+
+// Map type to a list of available unary operators.
+Map<String, Set<String>> uniOps = new Map<String, Set<String>>();
+
+//
+// Type grouping.
+//
+
+// All Set<E> types: SET_INT, SET_STRING, etc.
+Set<String> setTypes = new Set<String>();
+
+// All Map<K, V> types: MAP_INT_STRING, MAP_DOUBLE_BOOL, etc.
+Set<String> mapTypes = new Set<String>();
+
+// All List<E> types: LIST_INT, LIST_STRING, etc.
+Set<String> listTypes = new Set<String>();
+
+// All floating point types: DOUBLE, SET_DOUBLE, MAP_X_DOUBLE, etc.
+Set<String> fpTypes = new Set<String>();
+
+// All iterable types: Set types + List types.
+// These can be used in for(x in <iterable type>),
+// therefore Map is not included.
+Set<String> iterableTypes1 = new Set<String>();
+
+// All trivially indexable types: Map types and List types.
+// Elements of these can be written and read by [], unlike Set
+// which uses getElementAt to access individual elements
+Set<String> indexableTypes = new Set<String>();
+
+// Complex types: Collection types instantiated with nested argument
+// e.g Map<List<>, >.
+Set<String> complexTypes = new Set<String>();
+
+//
+// Type relations.
+//
+
+// Map type to the resulting type when subscripted.
+// Example: List<String> subscripts to String.
+Map<String, String> subscriptsTo = new Map<String, String>();
+
+// Map type to a Set of types that contain it as an element.
+// Example: String is element of List<String> and Map<int, String>
+Map<String, Set<String>> elementOf = new Map<String, Set<String>>();
+
+// Map type to a Set of types that contain it as an indexable element.
+// Same as element of, but without Set types.
+Map<String, Set<String>> indexableElementOf = new Map<String, Set<String>>();
+
+// Map type to type required as index.
+// Example: List<String> is indexed by int,
+// Map<String, double> indexed by String.
+Map<String, String> indexedBy = new Map<String, String>();
+
+//
+// Interface relationships.
+//
+
+// Map Interface type to Set of types that implement it.
+// Example: interface num is implemented by int and double.
+Map<String, Set<String>> interfaceRels = new Map<String, Set<String>>();
+
+// Convert analyzer's displayName to constant name used by dartfuzz.
+// Example: Set<int, String> -> SET_INT_STRING
+String getConstName(String displayName) {
+ String constName = displayName;
+ constName = constName.replaceAll('<', '_');
+ constName = constName.replaceAll('>', '');
+ constName = constName.replaceAll(', ', '_');
+ constName = constName.toUpperCase();
+ return constName;
+}
+
+// Returns true if the given type fails the filter criteria.
+bool shouldFilterType(String typName, {bool fp = true, bool flatTp = false}) {
+ if (!fp && fpTypes.contains(typName)) {
+ return true;
+ }
+ if (flatTp && complexTypes.contains(typName)) {
+ return true;
+ }
+ return false;
+}
+
+// Returns true if any of the paramters in the list fails the
+// filter criteria.
+bool shouldFilterParameterList(List<String> parameters,
+ {bool fp = true, bool flatTp = false}) {
+ for (String parameter in parameters) {
+ if (shouldFilterType(parameter, fp: fp, flatTp: flatTp)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+// Filter a set of a list of parameters according to their type.
+// A paramter list is only retained if all of the contained paramters
+// pass the filter criteria.
+Set<List<String>> filterParameterList(Set<List<String>> parameterList,
+ {bool fp = true, bool flatTp = false}) {
+ Set<List<String>> filteredParams = <List<String>>{};
+ for (List<String> parameters in parameterList) {
+ if (!shouldFilterParameterList(parameters, fp: fp, flatTp: flatTp)) {
+ filteredParams.add(parameters);
+ }
+ }
+ return filteredParams;
+}
+
+// Filter a set of parameters according to their type.
+Set<String> filterParameterSet(Set<String> parameterSet,
+ {bool fp = true, bool flatTp = false}) {
+ Set<String> filteredParams = <String>{};
+ for (String parameter in parameterSet) {
+ if (!shouldFilterType(parameter, fp: fp, flatTp: flatTp)) {
+ filteredParams.add(parameter);
+ }
+ }
+ return filteredParams;
+}
+
+// Filter map of operators to a set of a list of parameter types
+// as used for binary operators.
+Map<String, Set<List<String>>> filterOperatorMapSetList(
+ Map<String, Set<List<String>>> operators,
+ {bool fp = true,
+ bool flatTp = false}) {
+ Map<String, Set<List<String>>> filteredOps = <String, Set<List<String>>>{};
+ operators.forEach((op, parameterList) {
+ Set<List<String>> filteredParams =
+ filterParameterList(parameterList, fp: fp, flatTp: flatTp);
+ if (filteredParams.isNotEmpty) {
+ filteredOps[op] = filteredParams;
+ }
+ });
+ return filteredOps;
+}
+
+// Filter map of operators to a List of parameter types as used for
+// constructors.
+Map<String, List<String>> filterOperatorMapList(
+ Map<String, List<String>> operators,
+ {bool fp = true,
+ bool flatTp = false}) {
+ Map<String, List<String>> filteredOps = <String, List<String>>{};
+ operators.forEach((op, parameterList) {
+ if (!shouldFilterParameterList(parameterList, fp: fp, flatTp: flatTp)) {
+ filteredOps[op] = parameterList;
+ }
+ });
+ return filteredOps;
+}
+
+// Filter map of operators to a set of rhs types as used for assignment
+// operators.
+Map<String, Set<String>> filterOperatorMapSet(
+ Map<String, Set<String>> operators,
+ {bool fp = true,
+ bool flatTp = false}) {
+ Map<String, Set<String>> filteredOps = <String, Set<String>>{};
+ operators.forEach((op, parameterSet) {
+ Set<String> filteredParams =
+ filterParameterSet(parameterSet, fp: fp, flatTp: flatTp);
+ if (filteredParams.isNotEmpty) {
+ filteredOps[op] = filteredParams;
+ }
+ });
+ return filteredOps;
+}
+
+// Filter map of type to map of operators as used for binary operators.
+Map<String, Map<String, Set<List<String>>>> filterTypesMap4(
+ Map<String, Map<String, Set<List<String>>>> types,
+ {bool fp = true,
+ bool flatTp = false}) {
+ Map<String, Map<String, Set<List<String>>>> filteredTypes =
+ <String, Map<String, Set<List<String>>>>{};
+ types.forEach((baseType, ops) {
+ if (shouldFilterType(baseType, fp: fp, flatTp: flatTp)) {
+ return true;
+ }
+ Map<String, Set<List<String>>> filteredOps =
+ filterOperatorMapSetList(ops, fp: fp, flatTp: flatTp);
+ if (filteredOps.isNotEmpty) {
+ filteredTypes[baseType] = filteredOps;
+ }
+ });
+ return filteredTypes;
+}
+
+// Print map of type to map of operators as used for binary operators.
+void printTypeMap4(
+ String name, Map<String, Map<String, Set<List<String>>>> types,
+ {bool fp = true, bool flatTp = false}) {
+ final bool subclass = !fp || flatTp;
+ final String prefix = "${subclass ? "DartType." : ""}";
+ print(" static const Map<DartType, Map<String, " +
+ "Set<List<DartType>>>> ${name} = {");
+ Map<String, Map<String, Set<List<String>>>> filteredTypes =
+ filterTypesMap4(types, fp: fp, flatTp: flatTp);
+ for (var baseType in filteredTypes.keys.toList()..sort()) {
+ var ops = filteredTypes[baseType];
+ print(" ${prefix}${baseType}: {");
+ for (var op in ops.keys.toList()..sort()) {
+ var paramTypeL = ops[op];
+ print(" '${op}': {");
+ for (var paramTypes in paramTypeL) {
+ stdout.write(" [");
+ for (String paramType in paramTypes) {
+ stdout.write("${prefix}${paramType}, ");
+ }
+ print("],");
+ }
+ print(" },");
+ }
+ print(" },");
+ }
+ print(" };");
+}
+
+// Filter map of type to map of operators as used for assignment operators.
+Map<String, Map<String, Set<String>>> filterTypesMap3Set(
+ Map<String, Map<String, Set<String>>> types,
+ {bool fp = true,
+ bool flatTp = false}) {
+ Map<String, Map<String, Set<String>>> filteredTypes =
+ <String, Map<String, Set<String>>>{};
+ types.forEach((baseType, ops) {
+ if (shouldFilterType(baseType, fp: fp, flatTp: flatTp)) {
+ return true;
+ }
+ Map<String, Set<String>> filteredOps =
+ filterOperatorMapSet(ops, fp: fp, flatTp: flatTp);
+ if (filteredOps.isNotEmpty) {
+ filteredTypes[baseType] = filteredOps;
+ }
+ });
+ return filteredTypes;
+}
+
+// Print map of type to map of operators as used for assignment operators.
+void printTypeMap3Set(String name, Map<String, Map<String, Set<String>>> types,
+ {bool fp = true, bool flatTp = false}) {
+ final bool subclass = !fp || flatTp;
+ final String prefix = "${subclass ? "DartType." : ""}";
+ print(" static const Map<DartType, " +
+ "Map<String, Set<DartType>>> ${name} = {");
+
+ Map<String, Map<String, Set<String>>> filteredTypes =
+ filterTypesMap3Set(types, fp: fp, flatTp: flatTp);
+ for (var baseType in filteredTypes.keys.toList()..sort()) {
+ var ops = filteredTypes[baseType];
+ print(" ${prefix}${baseType}: {");
+ for (var op in ops.keys.toList()) {
+ var paramTypes = ops[op];
+ stdout.write(" '${op}': {");
+ for (String paramType in paramTypes.toList()..sort()) {
+ stdout.write("${prefix}${paramType}, ");
+ }
+ print("}, ");
+ }
+ print(" },");
+ }
+ print(" };");
+}
+
+// Filter map of type to map of operators as used for constructors.
+Map<String, Map<String, List<String>>> filterTypesMap3(
+ Map<String, Map<String, List<String>>> types,
+ {bool fp = true,
+ bool flatTp = false}) {
+ Map<String, Map<String, List<String>>> filteredTypes =
+ <String, Map<String, List<String>>>{};
+ types.forEach((baseType, ops) {
+ if (shouldFilterType(baseType, fp: fp, flatTp: flatTp)) {
+ return true;
+ }
+ Map<String, List<String>> filteredOps =
+ filterOperatorMapList(ops, fp: fp, flatTp: flatTp);
+ if (filteredOps.isNotEmpty) {
+ filteredTypes[baseType] = filteredOps;
+ }
+ });
+ return filteredTypes;
+}
+
+// Print map of type to map of operators as used for constructors.
+void printTypeMap3(String name, Map<String, Map<String, List<String>>> types,
+ {bool fp = true, bool flatTp = false}) {
+ final bool subclass = !fp || flatTp;
+ final String prefix = "${subclass ? "DartType." : ""}";
+ print(" static const Map<DartType, Map<String, " +
+ "List<DartType>>> ${name} = {");
+ var filteredTypes = filterTypesMap3(types, fp: fp, flatTp: flatTp);
+ for (var baseType in filteredTypes.keys.toList()..sort()) {
+ var ops = filteredTypes[baseType];
+ print(" ${prefix}${baseType}: {");
+ for (var op in ops.keys.toList()..sort()) {
+ var paramTypes = ops[op];
+ stdout.write(" '${op}': [");
+ for (String paramType in paramTypes.toList()..sort()) {
+ stdout.write("${prefix}${paramType}, ");
+ }
+ print("], ");
+ }
+ print(" },");
+ }
+ print(" };");
+}
+
+// Filter map of type collection name to set of types.
+Map<String, Set<String>> filterTypesMap2(Map<String, Set<String>> types,
+ {bool fp = true, bool flatTp = false}) {
+ Map<String, Set<String>> filteredTypes = <String, Set<String>>{};
+ types.forEach((baseType, parameterSet) {
+ if (shouldFilterType(baseType, fp: fp, flatTp: flatTp)) {
+ return true;
+ }
+ Set<String> filteredParams =
+ filterParameterSet(parameterSet, fp: fp, flatTp: flatTp);
+ if (filteredParams.isNotEmpty) {
+ filteredTypes[baseType] = filteredParams;
+ }
+ });
+ return filteredTypes;
+}
+
+// Print map of type collection name to set of types.
+void printTypeMap2(String name, Map<String, Set<String>> types,
+ {bool fp = true, bool flatTp = false}) {
+ final bool subclass = !fp || flatTp;
+ final String prefix = "${subclass ? "DartType." : ""}";
+ print(" static const Map<DartType, Set<DartType>> ${name} = {");
+ var filteredTypes = filterTypesMap2(types, fp: fp, flatTp: flatTp);
+ for (var baseType in filteredTypes.keys.toList()..sort()) {
+ var paramTypes = filteredTypes[baseType];
+ stdout.write(" ${prefix}${baseType}: { ");
+ for (String paramType in paramTypes.toList()..sort()) {
+ stdout.write("${prefix}${paramType}, ");
+ }
+ print("},");
+ }
+ print(" };");
+}
+
+// Filter map of type to type.
+Map<String, String> filterTypesMap1(Map<String, String> types,
+ {bool fp = true, bool flatTp = false}) {
+ Map<String, String> filteredTypes = <String, String>{};
+ types.forEach((baseType, paramType) {
+ if (shouldFilterType(baseType, fp: fp, flatTp: flatTp)) {
+ return true;
+ }
+ if (shouldFilterType(paramType, fp: fp, flatTp: flatTp)) {
+ return true;
+ }
+ filteredTypes[baseType] = paramType;
+ });
+ return filteredTypes;
+}
+
+// Print map of type to type.
+void printTypeMap1(String name, Map<String, String> types,
+ {bool fp = true, bool flatTp = false}) {
+ final bool subclass = !fp || flatTp;
+ final String prefix = "${subclass ? "DartType." : ""}";
+ print(" static const Map<DartType, DartType> ${name} = {");
+ var filteredTypes = filterTypesMap1(types, fp: fp, flatTp: flatTp);
+ for (var baseType in filteredTypes.keys.toList()..sort()) {
+ var paramType = filteredTypes[baseType];
+ print(" ${prefix}"
+ "${baseType}: ${prefix}${paramType}, ");
+ }
+ print(" };");
+}
+
+// Filter set of types.
+Set<String> filterTypesSet(Set<String> choices,
+ {bool fp = true, bool flatTp = false}) {
+ Set<String> filteredTypes = {};
+ filteredTypes.addAll(choices);
+ if (!fp) {
+ filteredTypes = filteredTypes.difference(fpTypes);
+ }
+ if (flatTp) {
+ filteredTypes = filteredTypes.difference(complexTypes);
+ }
+ return filteredTypes;
+}
+
+// Print set of types.
+void printTypeSet(String name, Set<String> types,
+ {bool fp = true, bool flatTp = false}) {
+ final bool subclass = !fp || flatTp;
+ final String prefix = "${subclass ? "DartType." : ""}";
+ stdout.write(" static const Set<DartType> ${name} = {");
+ for (String typName in filterTypesSet(types, fp: fp, flatTp: flatTp).toList()
+ ..sort()) {
+ stdout.write("${prefix}$typName, ");
+ }
+ print("};");
+}
+
+// Filter map to type to set of operators as used for unitary operators.
+Map<String, Set<String>> filterTypeMapSet(Map<String, Set<String>> types,
+ {bool fp = true, bool flatTp = false}) {
+ Map<String, Set<String>> filteredTypes = <String, Set<String>>{};
+ types.forEach((baseType, params) {
+ if (shouldFilterType(baseType, fp: fp, flatTp: flatTp)) {
+ return true;
+ }
+ filteredTypes[baseType] = params;
+ });
+ return filteredTypes;
+}
+
+// Print map to type to set of operators as used for unitary operators.
+void printTypeMapSet(String name, Map<String, Set<String>> types,
+ {bool fp = true, bool flatTp = false}) {
+ final bool subclass = !fp || flatTp;
+ final String prefix = "${subclass ? "DartType." : ""}";
+ print(" static const Map<DartType, Set<String>> $name = {");
+ var filteredTypes = filterTypeMapSet(types, fp: fp, flatTp: flatTp);
+ for (var baseType in filteredTypes.keys.toList()..sort()) {
+ var paramTypes = filteredTypes[baseType].toList()..sort();
+ print(" ${prefix}${baseType}: {" + paramTypes.join(", ") + "},");
+ }
+ print(" };");
+}
+
+// Print all generated and collected types, operators and type collections.
+void printTypeTable(Set<InterfaceType> allTypes,
+ {bool fp = true, bool flatTp = false}) {
+ final bool subclass = !fp || flatTp;
+ if (!subclass) {
+ print("""
+// Copyright (c) 2019, 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.
+
+/// Class that represents some common Dart types.
+///
+/// NOTE: this code has been generated automatically.
+///""");
+ }
+
+ String className = 'DartType${fp ? "" : "NoFp"}${flatTp ? "FlatTp" : ""}';
+
+ print('class $className'
+ '${subclass ? " extends DartType" : ""} {');
+ print(" final String name;");
+ if (!subclass) {
+ print(" const DartType._withName(this.name);");
+ print("""
+ factory $className.fromDartConfig(
+ {bool enableFp = false, bool disableNesting =
+ false}) {
+ if (enableFp && !disableNesting) {
+ return DartType();
+ } else if (!enableFp && !disableNesting) {
+ return DartTypeNoFp();
+ } else if (enableFp && disableNesting) {
+ return DartTypeFlatTp();
+ } else {
+ return DartTypeNoFpFlatTp();
+ }
+ }""");
+ } else {
+ print(' const $className'
+ '._withName(this.name) : super._withName(name);');
+ }
+
+ print("""
+ const $className() : name = null;
+ static bool isListType(DartType tp) {
+ return DartType._listTypes.contains(tp);
+ }
+
+ static bool isMapType(DartType tp) {
+ return DartType._mapTypes.contains(tp);
+ }
+
+ static bool isCollectionType(DartType tp) {
+ return DartType._collectionTypes.contains(tp);
+ }
+
+ static bool isGrowableType(DartType tp) {
+ return DartType._growableTypes.contains(tp);
+ }
+
+ static bool isComplexType(DartType tp) {
+ return DartType._complexTypes.contains(tp);
+ }
+
+ bool isInterfaceOfType(DartType tp, DartType iTp) {
+ return _interfaceRels.containsKey(iTp) && _interfaceRels[iTp].contains(tp);
+ }
+
+ Set<DartType> get mapTypes {
+ return _mapTypes;
+ }
+
+ bool isSpecializable(DartType tp) {
+ return _interfaceRels.containsKey(tp);
+ }
+
+ Set<DartType> interfaces(DartType tp) {
+ if (_interfaceRels.containsKey(tp)) {
+ return _interfaceRels[tp];
+ }
+ return null;
+ }
+
+ DartType indexType(DartType tp) {
+ if (_indexedBy.containsKey(tp)) {
+ return _indexedBy[tp];
+ }
+ return null;
+ }
+
+ Set<DartType> indexableElementTypes(DartType tp) {
+ if (_indexableElementOf.containsKey(tp)) {
+ return _indexableElementOf[tp];
+ }
+ return null;
+ }
+
+ bool isIndexableElementType(DartType tp) {
+ return _indexableElementOf.containsKey(tp);
+ }
+
+ DartType elementType(DartType tp) {
+ if (_subscriptsTo.containsKey(tp)) {
+ return _subscriptsTo[tp];
+ }
+ return null;
+ }
+
+ Set<DartType> get iterableTypes1 {
+ return _iterableTypes1;
+ }
+
+ Set<String> uniOps(DartType tp) {
+ if (_uniOps.containsKey(tp)) {
+ return _uniOps[tp];
+ }
+ return <String>{};
+ }
+
+ Set<String> binOps(DartType tp) {
+ if (_binOps.containsKey(tp)) {
+ return _binOps[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ Set<List<DartType>> binOpParameters(DartType tp, String op) {
+ if (_binOps.containsKey(tp) &&
+ _binOps[tp].containsKey(op)) {
+ return _binOps[tp][op];
+ }
+ return null;
+ }
+
+ Set<String> assignOps(DartType tp) {
+ if (_assignOps.containsKey(tp)) {
+ return _assignOps[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ Set<DartType> assignOpRhs(DartType tp, String op) {
+ if (_assignOps.containsKey(tp) &&
+ _assignOps[tp].containsKey(op)) {
+ return _assignOps[tp][op];
+ }
+ return <DartType>{};
+ }
+
+ bool hasConstructor(DartType tp) {
+ return _constructors.containsKey(tp);
+ }
+
+ Set<String> constructors(DartType tp) {
+ if (_constructors.containsKey(tp)) {
+ return _constructors[tp].keys.toSet();
+ }
+ return <String>{};
+ }
+
+ List<DartType> constructorParameters(DartType tp, String constructor) {
+ if (_constructors.containsKey(tp) &&
+ _constructors[tp].containsKey(constructor)) {
+ return _constructors[tp][constructor];
+ }
+ return null;
+ }
+
+ Set<DartType> get allTypes {
+ return _allTypes;
+ }
+
+""");
+
+ Set<String> instTypes = {};
+
+ // Generate one static DartType instance for all instantiable types.
+ // TODO (felih): maybe add void type?
+ allTypes.forEach((baseType) {
+ String constName = getConstName(baseType.displayName);
+ instTypes.add(constName);
+ if (!subclass) {
+ print(" static const ${constName} = const " +
+ "DartType._withName(\"${baseType.displayName}\");");
+ }
+ });
+
+ if (!subclass) {
+ // Generate one static DartType instance for all non instantiable types.
+ // These are required to resolve interface relations, but should not be
+ // used directly to generate dart programs.
+ print("");
+ print(" // NON INSTANTIABLE" "");
+ interfaceRels.keys.forEach((constName) {
+ if (instTypes.contains(constName)) return true;
+ print(" static const ${constName} = const " +
+ "DartType._withName(\"__${constName}\");");
+ });
+ }
+
+ // Generate a list of all instantiable types.
+ print("");
+ print("""
+ // All types extracted from analyzer.
+ static const _allTypes = {""");
+ filterTypesSet(instTypes, fp: fp, flatTp: flatTp).forEach((constName) {
+ print(" ${subclass ? "DartType." : ""}${constName},");
+ });
+ print(" };");
+
+ print("");
+ print("""
+ // All List<E> types: LIST_INT, LIST_STRING, etc.""");
+ printTypeSet("_listTypes", listTypes, fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // All Set types: SET_INT, SET_STRING, etc.""");
+ printTypeSet("_setTypes", setTypes, fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // All Map<K, V> types: MAP_INT_STRING, MAP_DOUBLE_BOOL, etc.""");
+ printTypeSet("_mapTypes", mapTypes, fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // All collection types: list, map and set types.""");
+ printTypeSet("_collectionTypes", {...listTypes, ...setTypes, ...mapTypes},
+ fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // All growable types: list, map, set and string types.""");
+ printTypeSet(
+ "_growableTypes", {...listTypes, ...setTypes, ...mapTypes, 'STRING'},
+ fp: fp, flatTp: flatTp);
+
+ if (!subclass) {
+ print("");
+ print(
+ " // All floating point types: DOUBLE, SET_DOUBLE, MAP_X_DOUBLE, etc.");
+ printTypeSet("_fpTypes", fpTypes);
+ }
+
+ print("");
+ print("""
+ // All trivially indexable types: Map types and List types.
+ // Elements of these can be written and read by [], unlike Set
+ // which uses getElementAt to access individual elements.""");
+ printTypeSet("_indexableTypes", indexableTypes, fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // Map type to the resulting type when subscripted.
+ // Example: List<String> subscripts to String.""");
+ printTypeMap1("_subscriptsTo", subscriptsTo, fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // Map type to type required as index.
+ // Example: List<String> is indexed by int,
+ // Map<String, double> indexed by String.""");
+ printTypeMap1("_indexedBy", indexedBy, fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // Map type to a Set of types that contain it as an element.
+ // Example: String is element of List<String> and Map<int, String>""");
+ printTypeMap2("_elementOf", elementOf, fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // Map type to a Set of types that contain it as an indexable element.
+ // Same as element of, but without Set types.""");
+ printTypeMap2("_indexableElementOf", indexableElementOf,
+ fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // All iterable types: Set types + List types.
+ // These can be used in for(x in <iterable type>),
+ // therefore Map is not included.""");
+ printTypeSet("_iterableTypes1", iterableTypes1, fp: fp, flatTp: flatTp);
+
+ if (!subclass) {
+ print("");
+ print("""
+ // Complex types: Collection types instantiated with nested argument
+ // e.g Map<List<>, >.""");
+ printTypeSet("_complexTypes", complexTypes);
+ }
+
+ print("");
+ print("""
+ // Map Interface type to Set of types that implement it.
+ // Example: interface num is implemented by int and double.""");
+ printTypeMap2("_interfaceRels", interfaceRels, fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // Map type to a list of constructors names with a list of constructor
+ // parameter types.""");
+ printTypeMap3("_constructors", constructors, fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // Map type to a list of binary operators with set of the respective
+ // types for the first and second operand.""");
+ printTypeMap4("_binOps", binOps, fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // Map type to a list of available unary operators.""");
+ printTypeMapSet("_uniOps", uniOps, fp: fp, flatTp: flatTp);
+
+ print("");
+ print("""
+ // Map type to a list of assignment operators with a set of the
+ // assignable right hand side types.""");
+ printTypeMap3Set("_assignOps", assignOps, fp: fp, flatTp: flatTp);
+
+ print("}");
+ print("");
+}
+
+// Returns true if type can be set and get via [].
+bool isIndexable(InterfaceType tp) {
+ bool isIndexable = false;
+ for (var method in tp.methods) {
+ if (method.name == "[]") {
+ isIndexable = true;
+ break;
+ }
+ }
+ return isIndexable;
+}
+
+// Returns true if iTypeName == typeName or if
+// iTypeName is an interface type that is implemented by typeName.
+// List<int> is interface of Int8List
+bool isInterfaceOf(String iTypName, String typName) {
+ return iTypName == typName ||
+ (interfaceRels.containsKey(iTypName) &&
+ interfaceRels[iTypName].contains(typName));
+}
+
+// Filter operator parameters so that the more specific types are discarded if
+// the respective interface type is already in the list.
+// This is required not only to give each parameter type equal probability but
+// also so that dartfuzz can efficiently filter floating point types from the
+// interface relations.
+Set<List<String>> filterOperator(Set<List<String>> op) {
+ Set<List<String>> newOp = new Set<List<String>>();
+ if (op.length < 2) return op;
+ for (List<String> params1 in op) {
+ bool keep = false;
+ for (List<String> params2 in op) {
+ for (int k = 0; k < params1.length; ++k) {
+ if (!isInterfaceOf(params2[k], params1[k])) {
+ keep = true;
+ break;
+ }
+ }
+ if (keep) break;
+ }
+ if (keep) {
+ newOp.add(params1);
+ }
+ }
+ return newOp;
+}
+
+// See comment on filterOpterator.
+void filterOperators(Set<InterfaceType> allTypes) {
+ for (InterfaceType tp in allTypes) {
+ String typName = getConstName(tp.displayName);
+ if (!binOps.containsKey(typName)) continue;
+ for (String op in binOps[typName].keys) {
+ binOps[typName][op] = filterOperator(binOps[typName][op]);
+ }
+ }
+}
+
+// Extract all binary and unary operators for tp.
+// Operators are stored by return type in the following way:
+// return type: { operator: { parameter types } }
+// Example: bool: { == : { [int, int], [double, double] }}
+// int: {'~', '-'},
+// Does not recurse into interfaces and superclasses of tp.
+void getOperatorsForTyp(String typName, InterfaceType tp, fromLiteral) {
+ for (MethodElement method in tp.methods) {
+ // Detect whether tp can be parsed from a literal (dartfuzz.dart can
+ // already handle that).
+ // This is usually indicated by the presence of the static constructor
+ // 'castFrom' or 'parse'.
+ if (method.isStatic &&
+ (method.name == 'castFrom' || method.name == 'parse')) {
+ fromLiteral.add(getConstName(tp.displayName));
+ }
+ // Hack: dartfuzz.dart already handles subscripts, therefore we exclude
+ // them from the generated type table.
+ if (method.name.startsWith('[]')) continue;
+ if (method.isOperator) {
+ // TODO (felih): Include support for type 'dynamic'.
+ bool skip = false;
+ for (var p in method.parameters) {
+ if (getConstName(p.type.displayName) == 'DYNAMIC') {
+ skip = true;
+ break;
+ }
+ }
+ if (skip) continue;
+ if (method.parameters.length == 1) {
+ // Get binary operators.
+
+ String retTypName = getConstName(method.returnType.displayName);
+ binOps[retTypName] ??= new Map<String, Set<List<String>>>();
+ binOps[retTypName][method.name] ??= new Set<List<String>>();
+
+ String rhsTypName = getConstName(method.parameters[0].type.displayName);
+
+ // TODO (felih): no hashing for List<String> ?
+ // if i remove this test i will get duplicates even though it is a Set.
+ bool present = false;
+ for (List<String> o in binOps[retTypName][method.name]) {
+ if (o[0] == typName && o[1] == rhsTypName) {
+ present = true;
+ break;
+ }
+ }
+ if (!present)
+ binOps[retTypName][method.name].add([typName, rhsTypName]);
+
+ // Add some assignment operators corresponding to the binary operators.
+ // Example: for '+' add '+='.
+ // Bool types have to be filtered because boolean binary operators
+ // can not be used to derive assignment operators in this way, e.g.
+ // <= is not a valid assignment operator for bool types.
+ if (retTypName != 'BOOL') {
+ assignOps[retTypName] ??= new Map<String, Set<String>>();
+ String ao = method.name + '=';
+ assignOps[retTypName][ao] ??= new Set<String>();
+ assignOps[retTypName][ao].add(rhsTypName);
+ }
+ } else {
+ // Get unary operators.
+ uniOps[typName] ??= new Set<String>();
+ String uo = method.name;
+ // Hack: remove unary from operator so that the operator name can be
+ // used directly for source code generation.
+ if (uo.startsWith('unary')) uo = '-';
+ uniOps[typName].add('\'$uo\'');
+ }
+ }
+ }
+}
+
+// Extract all binary and unary operators for all types.
+void getOperators(Set<InterfaceType> allTypes) {
+ // Set of types that can be constructed directly from literals and do
+ // not need special constructors (e.g. List<int> = [1, 2] as opposed to
+ // Int8List int8list = Int8List.fromList([1, 2]) ).
+ Set<String> fromLiteral = new Set<String>();
+
+ // getOperatorsForTyp uses a heuristic to detect which types can be
+ // constructed from a literal, but the heuristic misses the String type
+ // so we have to add it manually.
+ fromLiteral.add('STRING');
+ // Get binary, unary and assignment operators.
+ for (InterfaceType tp in allTypes) {
+ String typName = getConstName(tp.displayName);
+ // Manually add basic assignment operators which each type supports.
+ assignOps[typName] ??= new Map<String, Set<String>>();
+ assignOps[typName]['='] = {typName};
+ assignOps[typName]['??='] = {typName};
+ getOperatorsForTyp(typName, tp, fromLiteral);
+ }
+
+ // Add some static ops not extractable from dart:core/typed_data.
+ for (String typName in binOps.keys) {
+ binOps[typName] ??= new Map<String, Set<List<String>>>();
+ binOps[typName]['??'] = {
+ [typName, typName],
+ };
+ }
+ binOps['BOOL'] ??= new Map<String, Set<List<String>>>();
+ binOps['BOOL']['&&'] = {
+ ['BOOL', 'BOOL'],
+ };
+ binOps['BOOL']['||'] = {
+ ['BOOL', 'BOOL'],
+ };
+ uniOps['BOOL'] ??= new Set<String>();
+ uniOps['BOOL'].add('\'!\'');
+
+ // Get constructors.
+ for (InterfaceType tp in allTypes) {
+ String typName = getConstName(tp.displayName);
+ // Skip types that are constructable from a literal.
+ if (fromLiteral.contains(typName)) {
+ continue;
+ }
+ for (ConstructorElement constructor in tp.constructors) {
+ if (constructor.name.startsWith('_')) continue;
+ List<String> params = new List<String>();
+ bool canConstruct = true;
+ for (var p in constructor.parameters) {
+ String tstr = getConstName(p.type.displayName);
+ // Only allow trivially constructable parameters. If a constructor
+ // parameter is not constructable from a literal, skip the constructor.
+ if (!fromLiteral.contains(tstr)) {
+ canConstruct = false;
+ break;
+ }
+ // Only add positional required parameters.
+ // TODO (felih): include named and optional parameters.
+ if (!p.isNamed) params.add(tstr);
+ }
+ if (!canConstruct) continue;
+
+ constructors[typName] ??= new Map<String, List<String>>();
+ constructors[typName][constructor.name] = params;
+ }
+ }
+ // Removed redundant specialized parameter types.
+ // E.g. if num is already contained remove bool and int.
+ filterOperators(allTypes);
+}
+
+// Analyze types to extract element and subscript relations
+// as well as precision type attributes.
+void analyzeTypes(Set<InterfaceType> allTypes) {
+ // Extract basic floating point types.
+ for (InterfaceType tp in allTypes) {
+ if (tp.displayName.contains('Float') ||
+ tp.displayName.contains('float') ||
+ tp.displayName.contains('double') ||
+ tp.displayName.contains('Double'))
+ fpTypes.add(getConstName(tp.displayName));
+ }
+
+ // Analyze all types to extract information useful for dart code generation.
+ for (InterfaceType tp in allTypes) {
+ final typName = getConstName(tp.displayName);
+
+ // Find topmost interface type, e.g. List<int> is interface for Int8List.
+ InterfaceType iTyp = tp;
+ while (iTyp.typeArguments.isEmpty && !iTyp.interfaces.isEmpty) {
+ iTyp = tp.interfaces[0];
+ }
+
+ // Group current type with their respective type group.
+ if (iTyp.name == "Set") setTypes.add(typName);
+ if (iTyp.name == "List") listTypes.add(typName);
+ if (iTyp.name == "Map") mapTypes.add(typName);
+
+ if (iTyp.typeArguments.length == 1) {
+ // Analyze Array, List and Set types.
+ String argName = getConstName(iTyp.typeArguments[0].displayName);
+ subscriptsTo[typName] = argName;
+ elementOf[argName] ??= new Set<String>();
+ elementOf[argName].add(typName);
+ if (isIndexable(iTyp)) {
+ indexableElementOf[argName] ??= new Set<String>();
+ indexableElementOf[argName].add(typName);
+ indexedBy[typName] = 'INT';
+ indexableTypes.add(typName);
+ }
+ // Check if type is floating point precision.
+ if (fpTypes.contains(typName) || fpTypes.contains(argName)) {
+ fpTypes.add(typName);
+ }
+ } else if (iTyp.typeArguments.length == 2) {
+ // Analyze Map types.
+ String argName0 = getConstName(iTyp.typeArguments[0].displayName);
+ String argName1 = getConstName(iTyp.typeArguments[1].displayName);
+ subscriptsTo[typName] = argName1;
+ elementOf[argName1] ??= new Set<String>();
+ elementOf[argName1].add(typName);
+ indexableElementOf[argName1] ??= new Set<String>();
+ indexableElementOf[argName1].add(typName);
+ indexedBy[typName] = argName0;
+ indexableTypes.add(typName);
+ // Check if type is floating point precision.
+ if (fpTypes.contains(typName) ||
+ fpTypes.contains(argName0) ||
+ fpTypes.contains(argName1)) {
+ fpTypes.add(typName);
+ }
+ }
+ }
+}
+
+// Split types into sets of types with none, one and two parameters
+// respectively.
+void getParameterizedTypes(
+ Set<InterfaceType> allTypes, // Set of all types.
+ Set<InterfaceType> pTypes1, // Out: types with one parameter e.g. List.
+ Set<InterfaceType> pTypes2, // Out: types with two parameters e.g. Map.
+ Set<InterfaceType> iTypes) {
+ // Out: types with no parameters.
+ for (var tp in allTypes) {
+ if (tp.typeArguments.length == 1 && tp.typeArguments[0].name == 'E')
+ pTypes1.add(tp);
+ else if (tp.typeArguments.length == 2 &&
+ tp.typeArguments[0].name == 'K' &&
+ tp.typeArguments[1].name == 'V')
+ pTypes2.add(tp);
+ else
+ iTypes.add(tp);
+ }
+}
+
+// Generate new types by instantiating types with one and two parameters
+// with the types having no parameters (or the parameters of which have
+// already been instantiated).
+// There will be no more then maxNew types generated.
+Set<InterfaceType> instantiatePTypes(
+ Set<InterfaceType> pTypes1, // Types with one parameter.
+ Set<InterfaceType> pTypes2, // Types with two parameters.
+ Set<InterfaceType> iTypes, // Types with no parameters.
+ {double maxNew = 64.0}) {
+ // Maximum number of newly generated types.
+ Set<InterfaceType> newITypes = new Set<InterfaceType>();
+
+ // Calculate the total number of new types if all combinations were used.
+ int nNew = pTypes1.length * iTypes.length +
+ pTypes2.length * iTypes.length * iTypes.length;
+ // Calculate how many generated types have to be skipped in order to stay
+ // under the maximum number set for generating new types (maxNew).
+ double step = maxNew / nNew;
+ double cntr = 0.0;
+
+ // Instantiate List and Set types.
+ pTypes1.forEach((pType) {
+ iTypes.forEach((iType) {
+ cntr += step;
+ if (cntr >= 1.0) {
+ cntr -= 1.0;
+ } else {
+ return true;
+ }
+ ParameterizedType ptx = pType.instantiate([iType]);
+ newITypes.add(ptx);
+ if (iType.typeArguments.length >= 1) {
+ complexTypes.add(getConstName(ptx.displayName));
+ }
+ });
+ });
+
+ // Instantiate Map types.
+ pTypes2.forEach((pType) {
+ iTypes.forEach((iType1) {
+ iTypes.forEach((iType2) {
+ cntr += step;
+ if (cntr >= 1.0) {
+ cntr -= 1.0;
+ } else {
+ return true;
+ }
+ ParameterizedType ptx = pType.instantiate([iType1, iType2]);
+ newITypes.add(ptx);
+ if (iType1.typeArguments.length >= 1 ||
+ iType2.typeArguments.length >= 1) {
+ complexTypes.add(getConstName(ptx.displayName));
+ }
+ });
+ });
+ });
+
+ // Add instantiated types to the set of types with no free parameters.
+ return iTypes.union(newITypes);
+}
+
+Set<InterfaceType> instantiateAllTypes(
+ Set<InterfaceType> allTypes, Set<String> iTypeFilter, int depth,
+ {double maxNew = 64.0}) {
+ // Types with one parameter (List, Set).
+ Set<InterfaceType> pTypes1 = new Set<InterfaceType>();
+ // Types with two parameters (Map).
+ Set<InterfaceType> pTypes2 = new Set<InterfaceType>();
+ // Types with no parameters or parameters of which have already been
+ // instantiated.
+ Set<InterfaceType> iTypes = new Set<InterfaceType>();
+ // Fill type sets with respective parameter types.
+ getParameterizedTypes(allTypes, pTypes1, pTypes2, iTypes);
+
+ // Filter the list of zero parameter types to exclude
+ // complex types like Int8List.
+ Set<InterfaceType> filteredITypes = {};
+ for (var iType in iTypes) {
+ if (iTypeFilter.contains(iType.displayName)) {
+ filteredITypes.add(iType);
+ }
+ }
+
+ // Instantiate types with one or two free parameters.
+ // Concatenate the newly instantiated types with the previous set of
+ // instantiated or zero parameter types to be used as input for the next
+ // round or instantiation.
+ // Each iteration constructs more nested types like
+ // Map<Map<int, int>, List<int>>.
+ for (int i = 0; i < depth + 1; ++i) {
+ double mn = max(1, maxNew / (depth + 1));
+ filteredITypes = filteredITypes
+ .union(instantiatePTypes(pTypes1, pTypes2, filteredITypes, maxNew: mn));
+ }
+ // Return list of instantiated types.
+ return iTypes.union(filteredITypes);
+}
+
+// Heuristic of which types to include:
+// count the number of operators and
+// check if the type can be constructed from a literal.
+int countOperators(ClassElement ce) {
+ int no = 0;
+ ce.methods.forEach((method) {
+ if (method.isOperator) {
+ no++;
+ }
+ // Detect whether type can be parsed from a literal (dartfuzz.dart can
+ // already handle that).
+ // This is usually indicated by the presence of the static constructor
+ // 'castFrom' or 'parse'.
+ if (method.isStatic &&
+ (method.name == 'castFrom' || method.name == 'parse')) {
+ no += 100;
+ }
+ for (InterfaceType ci in ce.interfaces) {
+ no += countOperators(ci.element);
+ }
+ });
+ return no;
+}
+
+// Analyze typed_data and core libraries to extract data types.
+void getDataTypes(Set<InterfaceType> allTypes, String dartTop) async {
+ final AnalysisSession session = GenUtil.createAnalysisSession(dartTop);
+
+ // Visit libraries for type table generation.
+ await visitLibraryAtUri(session, 'dart:typed_data', allTypes);
+ await visitLibraryAtUri(session, 'dart:core', allTypes);
+}
+
+visitLibraryAtUri(
+ AnalysisSession session, String uri, Set<InterfaceType> allTypes) async {
+ String libPath = session.uriConverter.uriToPath(Uri.parse(uri));
+ ResolvedLibraryResult result = await session.getResolvedLibrary(libPath);
+ if (result.state != ResultState.VALID) {
+ throw new StateError('Unable to resolve "$uri"');
+ }
+ visitLibrary(result.element, allTypes);
+}
+
+visitLibrary(LibraryElement library, Set<InterfaceType> allTypes) async {
+ // This uses the element model to traverse the code. The element model
+ // represents the semantic structure of the code. A library consists of
+ // one or more compilation units.
+ for (CompilationUnitElement unit in library.units) {
+ visitCompilationUnit(unit, allTypes);
+ }
+}
+
+visitCompilationUnit(CompilationUnitElement unit, Set<InterfaceType> allTypes) {
+ // Each compilation unit contains elements for all of the top-level
+ // declarations in a single file, such as variables, functions, and
+ // classes. Note that `types` only returns classes. You can use
+ // `mixins` to visit mixins, `enums` to visit enum, `functionTypeAliases`
+ // to visit typedefs, etc.
+ for (ClassElement classElement in unit.types) {
+ if (classElement.isPublic) {
+ // Hack: Filter out some difficult types.
+ // TODO (felih): include filtered types.
+ if (classElement.name.startsWith('Unmodifiable')) continue;
+ if (classElement.name.startsWith('Iterable')) continue;
+ if (classElement.name.startsWith('BigInt')) continue;
+ if (classElement.name.startsWith('DateTime')) continue;
+ if (classElement.name.startsWith('Uri')) continue;
+ // Compute heuristic to decide whether to include the type.
+ int no = countOperators(classElement);
+ if (no > operatorCountThreshold) {
+ allTypes.add(classElement.type);
+ }
+ }
+ }
+}
+
+// Get all interface implemented by type.
+Set<String> getInterfaces(InterfaceType tp) {
+ Set<String> iTypes = new Set<String>();
+ for (InterfaceType iTyp in tp.interfaces) {
+ String ifTypName = getConstName(iTyp.displayName);
+ iTypes.add(ifTypName);
+ iTypes = iTypes.union(getInterfaces(iTyp));
+ }
+ return iTypes;
+}
+
+// Get interface and inheritance relationships for all types.
+void getInterfaceRels(Set<InterfaceType> allTypes) {
+ for (InterfaceType tp in allTypes) {
+ String typName = getConstName(tp.displayName);
+ for (String ifTypName in getInterfaces(tp)) {
+ interfaceRels[ifTypName] ??= new Set<String>();
+ interfaceRels[ifTypName].add(typName);
+ if (ifTypName.contains('ITERABLE')) {
+ iterableTypes1.add(typName);
+ }
+ }
+ for (InterfaceType it in tp.element.allSupertypes) {
+ String ifTypName = getConstName(it.displayName);
+ interfaceRels[ifTypName] ??= new Set<String>();
+ interfaceRels[ifTypName].add(typName);
+ }
+ }
+ // If interface can be instantiated,
+ // add it to the relation list so that we can
+ // do tp1 = oneof(interfaceRels[tp2]) in dartfuzz with a chance of
+ // tp1 == tp1.
+ for (InterfaceType tp in allTypes) {
+ String typName = getConstName(tp.displayName);
+ if (interfaceRels.containsKey(typName)) {
+ interfaceRels[typName].add(typName);
+ }
+ }
+}
+
+main(List<String> arguments) async {
+ final parser = new ArgParser()
+ ..addOption('dart-top', help: 'explicit value for \$DART_TOP')
+ ..addOption('depth',
+ help: 'Nesting depth, e.g. List<String> is depth 0, ' +
+ 'List<List<String>>' +
+ 'is depth 1. Remark: dart type tables grow ' +
+ 'exponentially with this, ' +
+ 'therefore types with higher nesting ' +
+ 'depth are partially filtered.',
+ defaultsTo: '1');
+ try {
+ final results = parser.parse(arguments);
+ int depth = int.parse(results['depth']);
+ Set<InterfaceType> allTypes = new Set<InterfaceType>();
+ // Filter types to instantiate parameterized types with, this excludes
+ // complex types like Int8List (might be added later).
+ Set<String> iTypeFilter = {'int', 'bool', 'double', 'String'};
+ // Extract basic types from dart::core and dart::typed_data.
+ await getDataTypes(allTypes, results['dart-top']);
+ // Instantiate parameterized types like List<E>.
+ allTypes = instantiateAllTypes(allTypes, iTypeFilter, depth, maxNew: 64);
+ // Extract interface Relations between types.
+ getInterfaceRels(allTypes);
+ // Extract operators from instantiated types.
+ getOperators(allTypes);
+ // Analyze instantiated types to get elementof/subscript and floating point
+ // information.
+ analyzeTypes(allTypes);
+ // Print everything.
+ printTypeTable(allTypes);
+ printTypeTable(allTypes, fp: false);
+ printTypeTable(allTypes, flatTp: true);
+ printTypeTable(allTypes, fp: false, flatTp: true);
+ } catch (e) {
+ print('Usage: dart gen_type_table.dart [OPTIONS]\n${parser.usage}\n$e');
+ exitCode = 255;
+ }
+}
diff --git a/runtime/tools/dartfuzz/gen_util.dart b/runtime/tools/dartfuzz/gen_util.dart
new file mode 100644
index 0000000..3ab635c
--- /dev/null
+++ b/runtime/tools/dartfuzz/gen_util.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2019, 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:io';
+
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
+
+/// Wrapper class for some static utilities.
+class GenUtil {
+ // Picks a top directory (command line, environment, or current).
+ static String getTop(String top) {
+ if (top == null || top == '') {
+ top = Platform.environment['DART_TOP'];
+ }
+ if (top == null || top == '') {
+ top = Directory.current.path;
+ }
+ return top;
+ }
+
+ // Create an analyzer session.
+ static AnalysisSession createAnalysisSession([String dart_top]) {
+ // Set paths. Note that for this particular use case, packageRoot can be
+ // any directory. Here, we set it to the top of the SDK development, and
+ // derive the required sdkPath from there.
+ final String packageRoot = getTop(dart_top);
+ if (packageRoot == null) {
+ throw StateError('No environment variable DART_TOP');
+ }
+ final sdkPath = '$packageRoot/tools/sdks/dart-sdk';
+
+ // This does most of the hard work of getting the analyzer configured
+ // correctly. Typically the included paths are the files and directories
+ // that need to be analyzed, but the SDK is always available, so it isn't
+ // really important for this particular use case. We use the implementation
+ // class in order to pass in the sdkPath directly.
+ final provider = PhysicalResourceProvider.INSTANCE;
+ final collection = AnalysisContextCollectionImpl(
+ includedPaths: <String>[packageRoot],
+ excludedPaths: <String>[packageRoot + "/pkg/front_end/test"],
+ resourceProvider: provider,
+ sdkPath: sdkPath);
+ return collection.contexts[0].currentSession;
+ }
+}
diff --git a/runtime/tools/embedder_layering_check.py b/runtime/tools/embedder_layering_check.py
new file mode 100644
index 0000000..d49b705
--- /dev/null
+++ b/runtime/tools/embedder_layering_check.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2019, 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.
+
+# Simple tool for verifying that sources from the standalone embedder do not
+# directly include sources from the VM or vice versa.
+
+import glob
+import os
+import re
+import sys
+
+INCLUDE_DIRECTIVE_RE = re.compile(r'^#include "(.*)"')
+
+PLATFORM_LAYER_RE = re.compile(r'^runtime/platform/')
+VM_LAYER_RE = re.compile(r'^runtime/(vm|lib)/')
+BIN_LAYER_RE = re.compile(r'^runtime/bin/')
+
+# Tests that don't match the simple case of *_test.cc.
+EXTRA_TEST_FILES = [
+ 'runtime/bin/run_vm_tests.cc', 'runtime/vm/libfuzzer/dart_libfuzzer.cc'
+]
+
+
+def CheckFile(sdk_root, path):
+ includes = set()
+ with open(os.path.join(sdk_root, path)) as file:
+ for line in file:
+ m = INCLUDE_DIRECTIVE_RE.match(line)
+ if m is not None:
+ header = os.path.join('runtime', m.group(1))
+ if os.path.isfile(os.path.join(sdk_root, header)):
+ includes.add(header)
+
+ errors = []
+ for include in includes:
+ if PLATFORM_LAYER_RE.match(path):
+ if VM_LAYER_RE.match(include):
+ errors.append(
+ 'LAYERING ERROR: %s must not include %s' % (path, include))
+ elif BIN_LAYER_RE.match(include):
+ errors.append(
+ 'LAYERING ERROR: %s must not include %s' % (path, include))
+ elif VM_LAYER_RE.match(path):
+ if BIN_LAYER_RE.match(include):
+ errors.append(
+ 'LAYERING ERROR: %s must not include %s' % (path, include))
+ elif BIN_LAYER_RE.match(path):
+ if VM_LAYER_RE.match(include):
+ errors.append(
+ 'LAYERING ERROR: %s must not include %s' % (path, include))
+ return errors
+
+
+def CheckDir(sdk_root, dir):
+ errors = []
+ for file in os.listdir(dir):
+ path = os.path.join(dir, file)
+ if os.path.isdir(path):
+ errors += CheckDir(sdk_root, path)
+ elif path.endswith('test.cc') or path in EXTRA_TEST_FILES:
+ None # Tests may violate layering.
+ elif path.endswith('.cc') or path.endswith('.h'):
+ errors += CheckFile(sdk_root, os.path.relpath(path, sdk_root))
+ return errors
+
+
+def DoCheck(sdk_root):
+ return CheckDir(sdk_root, 'runtime')
+
+
+if __name__ == '__main__':
+ errors = DoCheck('.')
+ print '\n'.join(errors)
+ if errors:
+ sys.exit(-1)
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 9223327..d5867a4 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -68,7 +68,10 @@
extra_deps = [ "//third_party/icu" ]
if (is_fuchsia) {
if (using_fuchsia_sdk) {
- extra_deps += [ "$fuchsia_sdk_root/pkg:sys_cpp" ]
+ extra_deps += [
+ "$fuchsia_sdk_root/fidl:fuchsia.deprecatedtimezone",
+ "$fuchsia_sdk_root/pkg:sys_cpp",
+ ]
} else {
extra_deps += [
# TODO(US-399): Remove time_service specific code when it is no longer
diff --git a/runtime/vm/bitmap_test.cc b/runtime/vm/bitmap_test.cc
index b48a204..a9a1add 100644
--- a/runtime/vm/bitmap_test.cc
+++ b/runtime/vm/bitmap_test.cc
@@ -37,7 +37,7 @@
value = !value;
}
// Create a StackMap object from the builder and verify its contents.
- const StackMap& stackmap1 = StackMap::Handle(StackMap::New(0, builder1, 0));
+ const StackMap& stackmap1 = StackMap::Handle(StackMap::New(builder1, 0));
EXPECT_EQ(1024, stackmap1.Length());
OS::PrintErr("%s\n", stackmap1.ToCString());
value = true;
@@ -62,7 +62,7 @@
for (int32_t i = 1025; i <= 2048; i++) {
EXPECT(!builder1->Get(i));
}
- const StackMap& stackmap2 = StackMap::Handle(StackMap::New(0, builder1, 0));
+ const StackMap& stackmap2 = StackMap::Handle(StackMap::New(builder1, 0));
EXPECT_EQ(2049, stackmap2.Length());
for (int32_t i = 0; i <= 256; i++) {
EXPECT(!stackmap2.IsObject(i));
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index f3ae235..37dcfdf 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -400,6 +400,8 @@
V(Wasm_initMemory, 3) \
V(Wasm_growMemory, 2) \
V(Wasm_initInstance, 3) \
+ V(Wasm_initMemoryFromInstance, 2) \
+ V(Wasm_getMemoryPages, 1) \
V(Wasm_initFunction, 4) \
V(Wasm_callFunction, 2)
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index 0d4bd00..fd5fd33 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -49,21 +49,22 @@
void StackMapTableBuilder::AddEntry(intptr_t pc_offset,
BitmapBuilder* bitmap,
intptr_t register_bit_count) {
- stack_map_ = StackMap::New(pc_offset, bitmap, register_bit_count);
+ ASSERT(Smi::IsValid(pc_offset));
+ pc_offset_ = Smi::New(pc_offset);
+ stack_map_ = StackMap::New(bitmap, register_bit_count);
+ list_.Add(pc_offset_, Heap::kOld);
list_.Add(stack_map_, Heap::kOld);
}
bool StackMapTableBuilder::Verify() {
intptr_t num_entries = Length();
- StackMap& map1 = StackMap::Handle();
- StackMap& map2 = StackMap::Handle();
for (intptr_t i = 1; i < num_entries; i++) {
- map1 = MapAt(i - 1);
- map2 = MapAt(i);
+ pc_offset_ = OffsetAt(i - 1);
+ auto const offset1 = pc_offset_.Value();
+ pc_offset_ = OffsetAt(i);
+ auto const offset2 = pc_offset_.Value();
// Ensure there are no duplicates and the entries are sorted.
- if (map1.PcOffset() >= map2.PcOffset()) {
- return false;
- }
+ if (offset1 >= offset2) return false;
}
return true;
}
@@ -77,10 +78,14 @@
return Array::MakeFixedLength(list_);
}
+RawSmi* StackMapTableBuilder::OffsetAt(intptr_t index) const {
+ pc_offset_ ^= list_.At(2 * index);
+ return pc_offset_.raw();
+}
+
RawStackMap* StackMapTableBuilder::MapAt(intptr_t index) const {
- StackMap& map = StackMap::Handle();
- map ^= list_.At(index);
- return map.raw();
+ stack_map_ ^= list_.At(2 * index + 1);
+ return stack_map_.raw();
}
RawExceptionHandlers* ExceptionHandlerList::FinalizeExceptionHandlers(
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index 5e2a52f..e77a651 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -47,7 +47,8 @@
class StackMapTableBuilder : public ZoneAllocated {
public:
StackMapTableBuilder()
- : stack_map_(StackMap::ZoneHandle()),
+ : pc_offset_(Smi::ZoneHandle()),
+ stack_map_(StackMap::ZoneHandle()),
list_(GrowableObjectArray::ZoneHandle(
GrowableObjectArray::New(Heap::kOld))) {}
~StackMapTableBuilder() {}
@@ -61,9 +62,11 @@
RawArray* FinalizeStackMaps(const Code& code);
private:
- intptr_t Length() const { return list_.Length(); }
+ intptr_t Length() const { return list_.Length() / 2; }
+ RawSmi* OffsetAt(intptr_t index) const;
RawStackMap* MapAt(intptr_t index) const;
+ Smi& pc_offset_;
StackMap& stack_map_;
GrowableObjectArray& list_;
DISALLOW_COPY_AND_ASSIGN(StackMapTableBuilder);
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 6be5427..fb472d3 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -200,26 +200,6 @@
StackZone stack_zone(T);
zone_ = stack_zone.GetZone();
- // Check that both the file open and write callbacks are available, though
- // we only use the latter during IL processing.
- if (FLAG_serialize_flow_graphs_to != nullptr &&
- Dart::file_write_callback() != nullptr) {
- if (auto file_open = Dart::file_open_callback()) {
- auto file = file_open(FLAG_serialize_flow_graphs_to, /*write=*/true);
- set_il_serialization_stream(file);
- }
- if (FLAG_populate_llvm_constant_pool) {
- auto const object_store = I->object_store();
- auto& llvm_constants = GrowableObjectArray::Handle(
- zone_, GrowableObjectArray::New(16, Heap::kOld));
- auto& llvm_constants_hash_table = Array::Handle(
- zone_, HashTables::New<FlowGraphSerializer::LLVMConstantsMap>(
- 16, Heap::kOld));
- object_store->set_llvm_constant_pool(llvm_constants);
- object_store->set_llvm_constant_hash_table(llvm_constants_hash_table);
- }
- }
-
if (FLAG_use_bare_instructions) {
// Since we keep the object pool until the end of AOT compilation, it
// will hang on to its entries until the very end. Therefore we have
@@ -255,6 +235,32 @@
ClassFinalizer::ClearAllCode(
/*including_nonchanging_cids=*/FLAG_use_bare_instructions);
+ // After this point, it should be safe to serialize flow graphs produced
+ // during compilation and add constants to the LLVM constant pool.
+ //
+ // Check that both the file open and write callbacks are available, though
+ // we only use the latter during IL processing.
+ if (FLAG_serialize_flow_graphs_to != nullptr &&
+ Dart::file_write_callback() != nullptr) {
+ if (auto file_open = Dart::file_open_callback()) {
+ auto file = file_open(FLAG_serialize_flow_graphs_to, /*write=*/true);
+ set_il_serialization_stream(file);
+ }
+ if (FLAG_populate_llvm_constant_pool) {
+ auto const object_store = I->object_store();
+ auto& llvm_constants = GrowableObjectArray::Handle(
+ Z, GrowableObjectArray::New(16, Heap::kOld));
+ auto& llvm_functions = GrowableObjectArray::Handle(
+ Z, GrowableObjectArray::New(16, Heap::kOld));
+ auto& llvm_constant_hash_table = Array::Handle(
+ Z, HashTables::New<FlowGraphSerializer::LLVMPoolMap>(16,
+ Heap::kOld));
+ object_store->set_llvm_constant_pool(llvm_constants);
+ object_store->set_llvm_function_pool(llvm_functions);
+ object_store->set_llvm_constant_hash_table(llvm_constant_hash_table);
+ }
+ }
+
// All stubs have already been generated, all of them share the same pool.
// We use that pool to initialize our global object pool, to guarantee
// stubs as well as code compiled from here on will have the same pool.
@@ -346,11 +352,11 @@
Dart::file_write_callback() != nullptr) {
if (auto file_close = Dart::file_close_callback()) {
file_close(il_serialization_stream());
- set_il_serialization_stream(nullptr);
}
+ set_il_serialization_stream(nullptr);
if (FLAG_populate_llvm_constant_pool) {
- // We don't want the Array backing for the map from constants to
- // indices in the snapshot, only the constant pool itself.
+ // We don't want the Array backing for any mappings in the snapshot,
+ // only the pools themselves.
I->object_store()->set_llvm_constant_hash_table(Array::null_array());
}
}
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm.cc b/runtime/vm/compiler/asm_intrinsifier_arm.cc
index ae216fa..b83a772 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm.cc
@@ -1936,19 +1936,22 @@
__ Ret();
}
-// Allocates one-byte string of length 'end - start'. The content is not
-// initialized.
-// 'length-reg' (R2) contains tagged length.
+// Allocates a _OneByteString. The content is not initialized.
+// 'length-reg' (R2) contains the desired length as a _Smi or _Mint.
// Returns new string as tagged pointer in R0.
-static void TryAllocateOnebyteString(Assembler* assembler,
+static void TryAllocateOneByteString(Assembler* assembler,
Label* ok,
Label* failure) {
const Register length_reg = R2;
- Label fail;
+ // _Mint length: call to runtime to produce error.
+ __ BranchIfNotSmi(length_reg, failure);
+ // Negative length: call to runtime to produce error.
+ __ cmp(length_reg, Operand(0));
+ __ b(failure, LT);
+
NOT_IN_PRODUCT(__ LoadAllocationStatsAddress(R0, kOneByteStringCid));
NOT_IN_PRODUCT(__ MaybeTraceAllocation(R0, failure));
__ mov(R8, Operand(length_reg)); // Save the length register.
- // TODO(koda): Protect against negative length and overflow here.
__ SmiUntag(length_reg);
const intptr_t fixed_size_plus_alignment_padding =
target::String::InstanceSize() +
@@ -1962,7 +1965,7 @@
// length_reg: allocation size.
__ adds(R1, R0, Operand(length_reg));
- __ b(&fail, CS); // Fail on unsigned overflow.
+ __ b(failure, CS); // Fail on unsigned overflow.
// Check if the allocation fits into the remaining space.
// R0: potential new object start.
@@ -1970,7 +1973,7 @@
// R2: allocation size.
__ ldr(NOTFP, Address(THR, target::Thread::end_offset()));
__ cmp(R1, Operand(NOTFP));
- __ b(&fail, CS);
+ __ b(failure, CS);
// Successfully allocated the object(s), now update top to point to
// next object start and initialize the object.
@@ -2010,9 +2013,6 @@
NOT_IN_PRODUCT(__ IncrementAllocationStatsWithSize(R4, R2));
__ b(ok);
-
- __ Bind(&fail);
- __ b(failure);
}
// Arg0: OneByteString (receiver).
@@ -2033,7 +2033,7 @@
__ b(normal_ir_body, NE); // 'start', 'end' not Smi.
__ sub(R2, R2, Operand(TMP));
- TryAllocateOnebyteString(assembler, &ok, normal_ir_body);
+ TryAllocateOneByteString(assembler, &ok, normal_ir_body);
__ Bind(&ok);
// R0: new string as tagged pointer.
// Copy string.
@@ -2092,7 +2092,7 @@
Label* normal_ir_body) {
__ ldr(R2, Address(SP, 0 * target::kWordSize)); // Length.
Label ok;
- TryAllocateOnebyteString(assembler, &ok, normal_ir_body);
+ TryAllocateOneByteString(assembler, &ok, normal_ir_body);
__ Bind(&ok);
__ Ret();
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm64.cc b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
index d96d9fc..2ae8fb3 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
@@ -1999,15 +1999,18 @@
__ ret();
}
-// Allocates one-byte string of length 'end - start'. The content is not
-// initialized.
-// 'length-reg' (R2) contains tagged length.
+// Allocates a _OneByteString. The content is not initialized.
+// 'length-reg' (R2) contains the desired length as a _Smi or _Mint.
// Returns new string as tagged pointer in R0.
-static void TryAllocateOnebyteString(Assembler* assembler,
+static void TryAllocateOneByteString(Assembler* assembler,
Label* ok,
Label* failure) {
const Register length_reg = R2;
- Label fail;
+ // _Mint length: call to runtime to produce error.
+ __ BranchIfNotSmi(length_reg, failure);
+ // negative length: call to runtime to produce error.
+ __ tbnz(failure, length_reg, compiler::target::kBitsPerWord - 1);
+
NOT_IN_PRODUCT(__ MaybeTraceAllocation(kOneByteStringCid, R0, failure));
__ mov(R6, length_reg); // Save the length register.
// TODO(koda): Protect against negative length and overflow here.
@@ -2030,7 +2033,7 @@
// length_reg: allocation size.
__ adds(R1, R0, Operand(length_reg));
- __ b(&fail, CS); // Fail on unsigned overflow.
+ __ b(failure, CS); // Fail on unsigned overflow.
// Check if the allocation fits into the remaining space.
// R0: potential new object start.
@@ -2038,7 +2041,7 @@
// R2: allocation size.
__ ldr(R7, Address(THR, target::Thread::end_offset()));
__ cmp(R1, Operand(R7));
- __ b(&fail, CS);
+ __ b(failure, CS);
// Successfully allocated the object(s), now update top to point to
// next object start and initialize the object.
@@ -2072,9 +2075,6 @@
__ StoreIntoObjectNoBarrier(
R0, FieldAddress(R0, target::String::length_offset()), R6);
__ b(ok);
-
- __ Bind(&fail);
- __ b(failure);
}
// Arg0: OneByteString (receiver).
@@ -2094,7 +2094,7 @@
__ BranchIfNotSmi(R3, normal_ir_body); // 'start', 'end' not Smi.
__ sub(R2, R2, Operand(TMP));
- TryAllocateOnebyteString(assembler, &ok, normal_ir_body);
+ TryAllocateOneByteString(assembler, &ok, normal_ir_body);
__ Bind(&ok);
// R0: new string as tagged pointer.
// Copy string.
@@ -2155,7 +2155,7 @@
Label ok;
__ ldr(R2, Address(SP, 0 * target::kWordSize)); // Length.
- TryAllocateOnebyteString(assembler, &ok, normal_ir_body);
+ TryAllocateOneByteString(assembler, &ok, normal_ir_body);
__ Bind(&ok);
__ ret();
diff --git a/runtime/vm/compiler/asm_intrinsifier_ia32.cc b/runtime/vm/compiler/asm_intrinsifier_ia32.cc
index 690df69..d53462a 100644
--- a/runtime/vm/compiler/asm_intrinsifier_ia32.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_ia32.cc
@@ -1951,13 +1951,19 @@
__ ret();
}
-// Allocates one-byte string of length 'end - start'. The content is not
-// initialized. 'length-reg' contains tagged length.
+// Allocates a _OneByteString. The content is not initialized.
+// 'length-reg' contains the desired length as a _Smi or _Mint.
// Returns new string as tagged pointer in EAX.
-static void TryAllocateOnebyteString(Assembler* assembler,
+static void TryAllocateOneByteString(Assembler* assembler,
Label* ok,
Label* failure,
Register length_reg) {
+ // _Mint length: call to runtime to produce error.
+ __ BranchIfNotSmi(length_reg, failure);
+ // negative length: call to runtime to produce error.
+ __ cmpl(length_reg, Immediate(0));
+ __ j(LESS, failure);
+
NOT_IN_PRODUCT(
__ MaybeTraceAllocation(kOneByteStringCid, EAX, failure, false));
if (length_reg != EDI) {
@@ -2048,7 +2054,7 @@
__ j(NOT_ZERO, normal_ir_body); // 'start', 'end' not Smi.
__ subl(EDI, Address(ESP, +kStartIndexOffset));
- TryAllocateOnebyteString(assembler, &ok, normal_ir_body, EDI);
+ TryAllocateOneByteString(assembler, &ok, normal_ir_body, EDI);
__ Bind(&ok);
// EAX: new string as tagged pointer.
// Copy string.
@@ -2098,7 +2104,7 @@
Label* normal_ir_body) {
__ movl(EDI, Address(ESP, +1 * target::kWordSize)); // Length.
Label ok;
- TryAllocateOnebyteString(assembler, &ok, normal_ir_body, EDI);
+ TryAllocateOneByteString(assembler, &ok, normal_ir_body, EDI);
// EDI: Start address to copy from (untagged).
__ Bind(&ok);
diff --git a/runtime/vm/compiler/asm_intrinsifier_x64.cc b/runtime/vm/compiler/asm_intrinsifier_x64.cc
index d210d67..02ec2c2 100644
--- a/runtime/vm/compiler/asm_intrinsifier_x64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_x64.cc
@@ -1977,13 +1977,19 @@
__ ret();
}
-// Allocates one-byte string of length 'end - start'. The content is not
-// initialized. 'length-reg' contains tagged length.
+// Allocates a _OneByteString. The content is not initialized.
+// 'length-reg' contains the desired length as a _Smi or _Mint.
// Returns new string as tagged pointer in RAX.
-static void TryAllocateOnebyteString(Assembler* assembler,
+static void TryAllocateOneByteString(Assembler* assembler,
Label* ok,
Label* failure,
Register length_reg) {
+ // _Mint length: call to runtime to produce error.
+ __ BranchIfNotSmi(length_reg, failure);
+ // negative length: call to runtime to produce error.
+ __ cmpq(length_reg, Immediate(0));
+ __ j(LESS, failure);
+
NOT_IN_PRODUCT(__ MaybeTraceAllocation(kOneByteStringCid, failure, false));
if (length_reg != RDI) {
__ movq(RDI, length_reg);
@@ -2076,7 +2082,7 @@
__ j(NOT_ZERO, normal_ir_body); // 'start', 'end' not Smi.
__ subq(RDI, Address(RSP, +kStartIndexOffset));
- TryAllocateOnebyteString(assembler, &ok, normal_ir_body, RDI);
+ TryAllocateOneByteString(assembler, &ok, normal_ir_body, RDI);
__ Bind(&ok);
// RAX: new string as tagged pointer.
// Copy string.
@@ -2126,7 +2132,7 @@
Label* normal_ir_body) {
__ movq(RDI, Address(RSP, +1 * target::kWordSize)); // Length.v=
Label ok;
- TryAllocateOnebyteString(assembler, &ok, normal_ir_body, RDI);
+ TryAllocateOneByteString(assembler, &ok, normal_ir_body, RDI);
// RDI: Start address to copy from (untagged).
__ Bind(&ok);
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index 0902183..8ce6936 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -302,6 +302,19 @@
Emit(encoding);
}
+void Assembler::rbit(Register rd, Register rm, Condition cond) {
+ ASSERT(rd != kNoRegister);
+ ASSERT(rm != kNoRegister);
+ ASSERT(cond != kNoCondition);
+ ASSERT(rd != PC);
+ ASSERT(rm != PC);
+ int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | B26 |
+ B25 | B23 | B22 | B21 | B20 | (0xf << 16) |
+ ArmEncode::Rd(rd) | (0xf << 8) | B5 | B4 |
+ static_cast<int32_t>(rm);
+ Emit(encoding);
+}
+
void Assembler::movw(Register rd, uint16_t imm16, Condition cond) {
ASSERT(cond != kNoCondition);
int32_t encoding = static_cast<int32_t>(cond) << kConditionShift | B25 | B24 |
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 904890d..1180d8b 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -445,6 +445,7 @@
// Miscellaneous data-processing instructions.
void clz(Register rd, Register rm, Condition cond = AL);
+ void rbit(Register rd, Register rm, Condition cond = AL);
// Multiply instructions.
void mul(Register rd, Register rn, Register rm, Condition cond = AL);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 972b1dc..6053347 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -777,6 +777,11 @@
EmitMiscDP1Source(CLZ, rd, rn, kDoubleWord);
}
+ // Reverse bits.
+ void rbit(Register rd, Register rn) {
+ EmitMiscDP1Source(RBIT, rd, rn, kDoubleWord);
+ }
+
// Misc. arithmetic.
void udiv(Register rd, Register rn, Register rm) {
EmitMiscDP2Source(UDIV, rd, rn, rm, kDoubleWord);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64_test.cc b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
index 2817361..fc38188 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
@@ -796,6 +796,19 @@
EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
}
+ASSEMBLER_TEST_GENERATE(Rbit, assembler) {
+ const int64_t immediate = 0x0000000000000015;
+ __ LoadImmediate(R0, immediate);
+ __ rbit(R0, R0);
+ __ ret();
+}
+
+ASSEMBLER_TEST_RUN(Rbit, test) {
+ typedef int64_t (*Int64Return)() DART_UNUSED;
+ const int64_t expected = 0xa800000000000000;
+ EXPECT_EQ(expected, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
+}
+
// Comparisons, branching.
ASSEMBLER_TEST_GENERATE(BranchALForward, assembler) {
Label l;
diff --git a/runtime/vm/compiler/assembler/assembler_arm_test.cc b/runtime/vm/compiler/assembler/assembler_arm_test.cc
index 4e69f74..ca70de7 100644
--- a/runtime/vm/compiler/assembler/assembler_arm_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm_test.cc
@@ -986,6 +986,19 @@
EXPECT_EQ(0, EXECUTE_TEST_CODE_INT32(Clz, test->entry()));
}
+ASSEMBLER_TEST_GENERATE(Rbit, assembler) {
+ __ mov(R0, Operand(0x15));
+ __ rbit(R0, R0);
+ __ bx(LR);
+}
+
+ASSEMBLER_TEST_RUN(Rbit, test) {
+ EXPECT(test != NULL);
+ typedef int (*Rbit)() DART_UNUSED;
+ const int32_t expected = 0xa8000000;
+ EXPECT_EQ(expected, EXECUTE_TEST_CODE_INT32(Rbit, test->entry()));
+}
+
ASSEMBLER_TEST_GENERATE(Tst, assembler) {
Label skip;
diff --git a/runtime/vm/compiler/assembler/disassembler.cc b/runtime/vm/compiler/assembler/disassembler.cc
index b7aa53d..64cd1af 100644
--- a/runtime/vm/compiler/assembler/disassembler.cc
+++ b/runtime/vm/compiler/assembler/disassembler.cc
@@ -281,10 +281,12 @@
THR_Print("StackMaps for function '%s' {\n", function_fullname);
if (code.stackmaps() != Array::null()) {
const Array& stackmap_table = Array::Handle(zone, code.stackmaps());
+ auto& offset = Smi::Handle(zone);
StackMap& map = StackMap::Handle(zone);
- for (intptr_t i = 0; i < stackmap_table.Length(); ++i) {
- map ^= stackmap_table.At(i);
- THR_Print("%s\n", map.ToCString());
+ for (intptr_t i = 0; i < stackmap_table.Length(); i += 2) {
+ offset ^= stackmap_table.At(i);
+ map ^= stackmap_table.At(i + 1);
+ THR_Print("0x%08" Px ": %s\n", offset.Value(), map.ToCString());
}
}
THR_Print("}\n");
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.cc b/runtime/vm/compiler/assembler/disassembler_kbc.cc
index 1cf9e00..8552753 100644
--- a/runtime/vm/compiler/assembler/disassembler_kbc.cc
+++ b/runtime/vm/compiler/assembler/disassembler_kbc.cc
@@ -259,6 +259,8 @@
case KernelBytecode::kInstantiateType_Wide:
case KernelBytecode::kDirectCall:
case KernelBytecode::kDirectCall_Wide:
+ case KernelBytecode::kUncheckedDirectCall:
+ case KernelBytecode::kUncheckedDirectCall_Wide:
case KernelBytecode::kInterfaceCall:
case KernelBytecode::kInterfaceCall_Wide:
case KernelBytecode::kInstantiatedInterfaceCall:
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index afef14c..39e8dc5 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -1256,6 +1256,12 @@
Definition* reaching_defn = env->RemoveLast();
Definition* input_defn = v->definition();
if (input_defn != reaching_defn) {
+ // Under OSR, constants can reside on the expression stack. Just
+ // generate the constant rather than going through a synthetic phi.
+ if (input_defn->IsConstant() && reaching_defn->IsPhi()) {
+ ASSERT(IsCompiledForOsr() && env->length() < osr_variable_count());
+ reaching_defn = GetConstant(input_defn->AsConstant()->value());
+ }
// Note: constants can only be replaced with other constants.
ASSERT(input_defn->IsLoadLocal() || input_defn->IsStoreLocal() ||
input_defn->IsDropTemps() || input_defn->IsMakeTemp() ||
@@ -1286,7 +1292,6 @@
// with the incoming parameter that mimics the stack slot.
ASSERT(IsCompiledForOsr());
PushArgumentInstr* push_arg = current->PushArgumentAt(i);
- ASSERT(push_arg->IsPushArgument());
ASSERT(reaching_defn->ssa_temp_index() != -1);
ASSERT(reaching_defn->IsPhi() || reaching_defn == constant_dead());
push_arg->ReplaceUsesWith(push_arg->InputAt(0)->definition());
@@ -1297,6 +1302,18 @@
push_arg->value()->set_definition(reaching_defn);
InsertBefore(insert_at, push_arg, nullptr, FlowGraph::kEffect);
insert_at = push_arg;
+ // Since reaching_defn was not the expected PushArgument, we must
+ // change all its environment uses from the insertion point onward
+ // to the newly created PushArgument. This ensures that the stack
+ // depth computations (based on environment presence of PushArguments)
+ // is done correctly.
+ for (Value::Iterator it(reaching_defn->env_use_list()); !it.Done();
+ it.Advance()) {
+ Instruction* instruction = it.Current()->instruction();
+ if (instruction->IsDominatedBy(push_arg)) {
+ instruction->ReplaceInEnvironment(reaching_defn, push_arg);
+ }
+ }
}
}
diff --git a/runtime/vm/compiler/backend/flow_graph_checker.cc b/runtime/vm/compiler/backend/flow_graph_checker.cc
index 54a3630..0bbb995 100644
--- a/runtime/vm/compiler/backend/flow_graph_checker.cc
+++ b/runtime/vm/compiler/backend/flow_graph_checker.cc
@@ -394,14 +394,14 @@
ASSERT(def->value()->definition() != def);
}
-void FlowGraphChecker::VisitInstanceCall(InstanceCallInstr* instr) {
+void FlowGraphChecker::VisitInstanceCall(InstanceCallInstr* call) {
// Force-optimized functions may not have instance calls inside them because
// we do not reset ICData for these.
ASSERT(!flow_graph_->function().ForceOptimize());
}
void FlowGraphChecker::VisitPolymorphicInstanceCall(
- PolymorphicInstanceCallInstr* instr) {
+ PolymorphicInstanceCallInstr* call) {
// Force-optimized functions may not have instance calls inside them because
// we do not reset ICData for these.
ASSERT(!flow_graph_->function().ForceOptimize());
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 6ed9d5b..16371b3 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -1100,6 +1100,12 @@
__ PopNativeCalleeSavedRegisters();
+#if defined(TARGET_OS_FUCHSIA)
+ UNREACHABLE(); // Fuchsia does not allow dart:ffi.
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Leave the entry frame.
__ LeaveFrame(1 << LR | 1 << FP);
@@ -1157,6 +1163,12 @@
// Save a space for the code object.
__ PushImmediate(0);
+#if defined(TARGET_OS_FUCHSIA)
+ UNREACHABLE(); // Fuchsia does not allow dart:ffi.
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
__ PushNativeCalleeSavedRegisters();
// Load the thread object. If we were called by a trampoline, the thread is
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 3f7f28f..2f8a4db 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -989,6 +989,12 @@
__ PopNativeCalleeSavedRegisters();
+#if defined(TARGET_OS_FUCHSIA)
+ UNREACHABLE(); // Fuchsia does not allow dart:ffi.
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Leave the entry frame.
__ LeaveFrame();
@@ -1044,6 +1050,12 @@
// Save a space for the code object.
__ PushImmediate(0);
+#if defined(TARGET_OS_FUCHSIA)
+ UNREACHABLE(); // Fuchsia does not allow dart:ffi.
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
__ PushNativeCalleeSavedRegisters();
// Load the thread object. If we were called by a trampoline, the thread is
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index ff3df26..a05e810 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -197,6 +197,12 @@
__ popl(ESI);
__ popl(EBX);
+#if defined(TARGET_OS_FUCHSIA)
+ UNREACHABLE(); // Fuchsia does not allow dart:ffi.
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Leave the entry frame.
__ LeaveFrame();
@@ -1030,6 +1036,12 @@
__ xorl(EAX, EAX);
__ pushl(EAX);
+#if defined(TARGET_OS_FUCHSIA)
+ UNREACHABLE(); // Fuchsia does not allow dart:ffi.
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Save ABI callee-saved registers.
__ pushl(EBX);
__ pushl(ESI);
diff --git a/runtime/vm/compiler/backend/il_serializer.cc b/runtime/vm/compiler/backend/il_serializer.cc
index 486973b..71844b7 100644
--- a/runtime/vm/compiler/backend/il_serializer.cc
+++ b/runtime/vm/compiler/backend/il_serializer.cc
@@ -39,10 +39,13 @@
zone_(zone),
object_store_(flow_graph->thread()->isolate()->object_store()),
open_recursive_types_(zone_),
- llvm_pool_(
+ llvm_constants_(
GrowableObjectArray::Handle(zone_,
object_store_->llvm_constant_pool())),
- llvm_map_(zone_, object_store_->llvm_constant_hash_table()),
+ llvm_functions_(
+ GrowableObjectArray::Handle(zone_,
+ object_store_->llvm_function_pool())),
+ llvm_constant_map_(zone_, object_store_->llvm_constant_hash_table()),
llvm_index_(Smi::Handle(zone_)),
tmp_string_(String::Handle(zone_)),
array_type_args_((TypeArguments::Handle(zone_))),
@@ -70,7 +73,7 @@
}
FlowGraphSerializer::~FlowGraphSerializer() {
- object_store_->set_llvm_constant_hash_table(llvm_map_.Release());
+ object_store_->set_llvm_constant_hash_table(llvm_constant_map_.Release());
}
void FlowGraphSerializer::SerializeToBuffer(const FlowGraph* flow_graph,
@@ -326,6 +329,11 @@
for (intptr_t i = 1; i < block_order.length(); ++i) {
sexp->Add(block_order[i]->ToSExpression(this));
}
+ if (FLAG_populate_llvm_constant_pool) {
+ auto const new_index = llvm_functions_.Length();
+ llvm_functions_.Add(flow_graph_->function());
+ AddExtraInteger(sexp, "llvm_index", new_index);
+ }
return sexp;
}
@@ -745,13 +753,14 @@
elem->AddExtra("type", type->ToSExpression(this));
}
}
- if (FLAG_populate_llvm_constant_pool) {
- auto const pool_len = llvm_pool_.Length();
+ // Only add constants to the LLVM constant pool that are actually used in
+ // the flow graph.
+ if (FLAG_populate_llvm_constant_pool && definition->HasUses()) {
+ auto const pool_len = llvm_constants_.Length();
llvm_index_ = Smi::New(pool_len);
- llvm_index_ =
- Smi::RawCast(llvm_map_.InsertOrGetValue(value, llvm_index_));
+ llvm_index_ ^= llvm_constant_map_.InsertOrGetValue(value, llvm_index_);
if (llvm_index_.Value() == pool_len) {
- llvm_pool_.Add(value);
+ llvm_constants_.Add(value);
}
AddExtraInteger(elem, "llvm_index", llvm_index_.Value());
}
diff --git a/runtime/vm/compiler/backend/il_serializer.h b/runtime/vm/compiler/backend/il_serializer.h
index 7fb3088..3e6e6af 100644
--- a/runtime/vm/compiler/backend/il_serializer.h
+++ b/runtime/vm/compiler/backend/il_serializer.h
@@ -131,9 +131,9 @@
IntMap<const Type*> open_recursive_types_;
// Used for --populate-llvm-constant-pool in ConstantPoolToSExp.
- class LLVMConstantMapKeyEqualsTraits : public AllStatic {
+ class LLVMPoolMapKeyEqualsTraits : public AllStatic {
public:
- static const char* Name() { return "LLVMConstantMapKeyEqualsTraits"; }
+ static const char* Name() { return "LLVMPoolMapKeyEqualsTraits"; }
static bool ReportStats() { return false; }
static bool IsMatch(const Object& a, const Object& b) {
@@ -145,10 +145,11 @@
return obj.GetClassId();
}
};
- typedef UnorderedHashMap<LLVMConstantMapKeyEqualsTraits> LLVMConstantsMap;
+ typedef UnorderedHashMap<LLVMPoolMapKeyEqualsTraits> LLVMPoolMap;
- GrowableObjectArray& llvm_pool_;
- LLVMConstantsMap llvm_map_;
+ GrowableObjectArray& llvm_constants_;
+ GrowableObjectArray& llvm_functions_;
+ LLVMPoolMap llvm_constant_map_;
Smi& llvm_index_;
// Handles used across functions, where the contained value is used
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 10face2..0e3b73e 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -170,6 +170,12 @@
__ PopRegisters(CallingConventions::kCalleeSaveCpuRegisters,
CallingConventions::kCalleeSaveXmmRegisters);
+#if defined(TARGET_OS_FUCHSIA)
+ UNREACHABLE(); // Fuchsia does not allow dart:ffi.
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Leave the entry frame.
__ LeaveFrame();
@@ -1030,6 +1036,12 @@
// NativeReturnInstr::EmitNativeCode.
__ EnterFrame(0);
+#if defined(TARGET_OS_FUCHSIA)
+ UNREACHABLE(); // Fuchsia does not allow dart:ffi.
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Save the argument registers, in reverse order.
for (intptr_t i = argument_locations_->length(); i-- > 0;) {
SaveArgument(compiler, argument_locations_->At(i));
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
index 349db75..be09321 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
@@ -797,7 +797,7 @@
LoadLocal(local_index);
}
-void BytecodeFlowGraphBuilder::BuildDirectCall() {
+void BytecodeFlowGraphBuilder::BuildDirectCallCommon(bool is_unchecked_call) {
if (is_generating_interpreter()) {
UNIMPLEMENTED(); // TODO(alexmarkov): interpreter
}
@@ -857,7 +857,7 @@
*ic_data_array_, B->GetNextDeoptId(),
target.IsDynamicFunction() ? ICData::kSuper : ICData::kStatic);
- if (target.MayHaveUncheckedEntryPoint(isolate())) {
+ if (is_unchecked_call) {
call->set_entry_kind(Code::EntryKind::kUnchecked);
}
@@ -867,6 +867,14 @@
B->Push(call);
}
+void BytecodeFlowGraphBuilder::BuildDirectCall() {
+ BuildDirectCallCommon(/* is_unchecked_call = */ false);
+}
+
+void BytecodeFlowGraphBuilder::BuildUncheckedDirectCall() {
+ BuildDirectCallCommon(/* is_unchecked_call = */ true);
+}
+
static void ComputeTokenKindAndCheckedArguments(
const String& name,
const ArgumentsDescriptor& arg_desc,
@@ -1346,6 +1354,19 @@
code_ <<= instr;
}
+void BytecodeFlowGraphBuilder::BuildCheckReceiverForNull() {
+ if (is_generating_interpreter()) {
+ UNIMPLEMENTED(); // TODO(alexmarkov): interpreter
+ }
+
+ const String& selector = String::Cast(ConstantAt(DecodeOperandD()).value());
+
+ LocalVariable* receiver_temp = B->MakeTemporary();
+ code_ +=
+ B->CheckNull(position_, receiver_temp, selector, /*clear_temp=*/false);
+ code_ += B->Drop();
+}
+
void BytecodeFlowGraphBuilder::BuildJump() {
if (is_generating_interpreter()) {
UNIMPLEMENTED(); // TODO(alexmarkov): interpreter
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
index 1e84f92..814b8df 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
@@ -167,6 +167,7 @@
int num_args);
void BuildIntOp(const String& name, Token::Kind token_kind, int num_args);
void BuildDoubleOp(const String& name, Token::Kind token_kind, int num_args);
+ void BuildDirectCallCommon(bool is_unchecked_call);
void BuildInterfaceCallCommon(bool is_unchecked_call,
bool is_instantiated_call);
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index 6f2240a..0f3eb24 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -715,6 +715,7 @@
kInterfaceCall,
kInstantiatedInterfaceCall,
kDynamicCall,
+ kDirectCallViaDynamicForwarder,
};
enum InvocationKind {
@@ -915,6 +916,23 @@
ASSERT(i < obj_count);
obj = Object::null();
} break;
+ case ConstantPoolTag::kDirectCallViaDynamicForwarder: {
+ // DirectCallViaDynamicForwarder constant occupies 2 entries.
+ // The first entry is used for target function.
+ obj = ReadObject();
+ ASSERT(obj.IsFunction());
+ name = Function::Cast(obj).name();
+ name = Function::CreateDynamicInvocationForwarderName(name);
+ obj = Function::Cast(obj).GetDynamicInvocationForwarder(name);
+
+ pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
+ ObjectPool::Patchability::kNotPatchable);
+ pool.SetObjectAt(i, obj);
+ ++i;
+ ASSERT(i < obj_count);
+ // The second entry is used for arguments descriptor.
+ obj = ReadObject();
+ } break;
default:
UNREACHABLE();
}
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 0579418..8c36561 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -633,6 +633,7 @@
static word active_exception_offset();
static word active_stacktrace_offset();
static word resume_pc_offset();
+ static word saved_shadow_call_stack_offset();
static word marking_stack_block_offset();
static word top_exit_frame_info_offset();
static word top_resource_offset();
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index add5eab..0965a3c 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -212,7 +212,7 @@
Thread_call_to_runtime_entry_point_offset = 200;
static constexpr dart::compiler::target::word
Thread_call_to_runtime_stub_offset = 132;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 648;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 652;
static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
228;
static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 156;
@@ -228,7 +228,7 @@
static constexpr dart::compiler::target::word
Thread_enter_safepoint_stub_offset = 180;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 632;
+ 636;
static constexpr dart::compiler::target::word
Thread_exit_safepoint_stub_offset = 184;
static constexpr dart::compiler::target::word
@@ -284,8 +284,10 @@
static constexpr dart::compiler::target::word
Thread_predefined_symbols_address_offset = 252;
static constexpr dart::compiler::target::word Thread_resume_pc_offset = 628;
+static constexpr dart::compiler::target::word
+ Thread_saved_shadow_call_stack_offset = 632;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 636;
+ 640;
static constexpr dart::compiler::target::word
Thread_slow_type_test_stub_offset = 172;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
@@ -314,7 +316,7 @@
Thread_write_barrier_entry_point_offset = 192;
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
44;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 640;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 644;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -569,7 +571,7 @@
Thread_call_to_runtime_entry_point_offset = 392;
static constexpr dart::compiler::target::word
Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1304;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1312;
static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
448;
static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 304;
@@ -585,7 +587,7 @@
static constexpr dart::compiler::target::word
Thread_enter_safepoint_stub_offset = 352;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 1272;
+ 1280;
static constexpr dart::compiler::target::word
Thread_exit_safepoint_stub_offset = 360;
static constexpr dart::compiler::target::word
@@ -641,8 +643,10 @@
static constexpr dart::compiler::target::word
Thread_predefined_symbols_address_offset = 496;
static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1264;
+static constexpr dart::compiler::target::word
+ Thread_saved_shadow_call_stack_offset = 1272;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 1280;
+ 1288;
static constexpr dart::compiler::target::word
Thread_slow_type_test_stub_offset = 336;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
@@ -672,7 +676,7 @@
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
88;
static constexpr dart::compiler::target::word Thread_callback_code_offset =
- 1288;
+ 1296;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
16;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -926,7 +930,7 @@
Thread_call_to_runtime_entry_point_offset = 200;
static constexpr dart::compiler::target::word
Thread_call_to_runtime_stub_offset = 132;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 612;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 616;
static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
228;
static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 156;
@@ -942,7 +946,7 @@
static constexpr dart::compiler::target::word
Thread_enter_safepoint_stub_offset = 180;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 596;
+ 600;
static constexpr dart::compiler::target::word
Thread_exit_safepoint_stub_offset = 184;
static constexpr dart::compiler::target::word
@@ -998,8 +1002,10 @@
static constexpr dart::compiler::target::word
Thread_predefined_symbols_address_offset = 252;
static constexpr dart::compiler::target::word Thread_resume_pc_offset = 592;
+static constexpr dart::compiler::target::word
+ Thread_saved_shadow_call_stack_offset = 596;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 600;
+ 604;
static constexpr dart::compiler::target::word
Thread_slow_type_test_stub_offset = 172;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
@@ -1028,7 +1034,7 @@
Thread_write_barrier_entry_point_offset = 192;
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
44;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 604;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 608;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -1279,7 +1285,7 @@
Thread_call_to_runtime_entry_point_offset = 392;
static constexpr dart::compiler::target::word
Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1392;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1400;
static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
448;
static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 304;
@@ -1295,7 +1301,7 @@
static constexpr dart::compiler::target::word
Thread_enter_safepoint_stub_offset = 352;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 1360;
+ 1368;
static constexpr dart::compiler::target::word
Thread_exit_safepoint_stub_offset = 360;
static constexpr dart::compiler::target::word
@@ -1351,8 +1357,10 @@
static constexpr dart::compiler::target::word
Thread_predefined_symbols_address_offset = 496;
static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1352;
+static constexpr dart::compiler::target::word
+ Thread_saved_shadow_call_stack_offset = 1360;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 1368;
+ 1376;
static constexpr dart::compiler::target::word
Thread_slow_type_test_stub_offset = 336;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
@@ -1382,7 +1390,7 @@
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
88;
static constexpr dart::compiler::target::word Thread_callback_code_offset =
- 1376;
+ 1384;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
16;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -1631,14 +1639,14 @@
Thread_auto_scope_native_wrapper_entry_point_offset = 216;
static constexpr dart::compiler::target::word Thread_bool_false_offset = 200;
static constexpr dart::compiler::target::word Thread_bool_true_offset = 192;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 952;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 960;
static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
256;
static constexpr dart::compiler::target::word
Thread_double_negate_address_offset = 248;
static constexpr dart::compiler::target::word Thread_end_offset = 120;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 920;
+ 928;
static constexpr dart::compiler::target::word
Thread_float_absolute_address_offset = 280;
static constexpr dart::compiler::target::word
@@ -1658,8 +1666,10 @@
static constexpr dart::compiler::target::word
Thread_predefined_symbols_address_offset = 232;
static constexpr dart::compiler::target::word Thread_resume_pc_offset = 912;
+static constexpr dart::compiler::target::word
+ Thread_saved_shadow_call_stack_offset = 920;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 928;
+ 936;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
static constexpr dart::compiler::target::word
Thread_stack_overflow_flags_offset = 80;
@@ -1674,7 +1684,7 @@
static constexpr dart::compiler::target::word Thread_vm_tag_offset = 160;
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
88;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 936;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 944;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
16;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -1916,14 +1926,14 @@
Thread_auto_scope_native_wrapper_entry_point_offset = 112;
static constexpr dart::compiler::target::word Thread_bool_false_offset = 104;
static constexpr dart::compiler::target::word Thread_bool_true_offset = 100;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 480;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 484;
static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
132;
static constexpr dart::compiler::target::word
Thread_double_negate_address_offset = 128;
static constexpr dart::compiler::target::word Thread_end_offset = 60;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 464;
+ 468;
static constexpr dart::compiler::target::word
Thread_float_absolute_address_offset = 144;
static constexpr dart::compiler::target::word
@@ -1943,8 +1953,10 @@
static constexpr dart::compiler::target::word
Thread_predefined_symbols_address_offset = 120;
static constexpr dart::compiler::target::word Thread_resume_pc_offset = 460;
+static constexpr dart::compiler::target::word
+ Thread_saved_shadow_call_stack_offset = 464;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 468;
+ 472;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
static constexpr dart::compiler::target::word
Thread_stack_overflow_flags_offset = 40;
@@ -1959,7 +1971,7 @@
static constexpr dart::compiler::target::word Thread_vm_tag_offset = 80;
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
44;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 472;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 476;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
static constexpr dart::compiler::target::word Type_arguments_offset = 16;
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index eb574eb..de860a7 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -198,6 +198,7 @@
FIELD(Thread, object_null_offset) \
FIELD(Thread, predefined_symbols_address_offset) \
FIELD(Thread, resume_pc_offset) \
+ FIELD(Thread, saved_shadow_call_stack_offset) \
FIELD(Thread, safepoint_state_offset) \
NOT_IN_DBC(FIELD(Thread, slow_type_test_stub_offset)) \
FIELD(Thread, stack_limit_offset) \
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index 3e8a5a4..b8d0cb9 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -1221,6 +1221,10 @@
__ mov(THR, Operand(R3));
}
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Save the current VMTag on the stack.
__ LoadFromOffset(kWord, R9, THR, target::Thread::vm_tag_offset());
__ Push(R9);
@@ -1310,6 +1314,10 @@
__ Pop(R4);
__ StoreToOffset(kWord, R4, THR, target::Thread::vm_tag_offset());
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
__ PopNativeCalleeSavedRegisters();
__ set_constant_pool_allowed(false);
@@ -1358,6 +1366,10 @@
__ mov(THR, Operand(R3));
}
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Save the current VMTag on the stack.
__ LoadFromOffset(kWord, R9, THR, target::Thread::vm_tag_offset());
__ Push(R9);
@@ -1445,6 +1457,11 @@
} else {
__ AddImmediate(SP, kAbiPreservedFpuRegCount * kFpuRegisterSize);
}
+
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Restore CPU registers.
__ PopList(kAbiPreservedCpuRegs);
__ set_constant_pool_allowed(false);
@@ -3024,6 +3041,9 @@
__ mov(THR, Operand(R3)); // Thread.
__ mov(FP, Operand(R2)); // Frame_pointer.
__ mov(SP, Operand(IP)); // Set Stack pointer.
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
// Set the tag.
__ LoadImmediate(R2, VMTag::kDartCompiledTagId);
__ StoreToOffset(kWord, R2, THR, target::Thread::vm_tag_offset());
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 59674e3..326edcd 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -1323,12 +1323,19 @@
__ ldr(TMP, Address(R3, target::Thread::invoke_dart_code_stub_offset()));
__ Push(TMP);
+#if defined(TARGET_OS_FUCHSIA)
+ __ str(R18, Address(R3, target::Thread::saved_shadow_call_stack_offset()));
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
__ PushNativeCalleeSavedRegisters();
// Set up THR, which caches the current thread in Dart code.
if (THR != R3) {
__ mov(THR, R3);
}
+
// Refresh write barrier mask.
__ ldr(BARRIER_MASK,
Address(THR, target::Thread::write_barrier_mask_offset()));
@@ -1346,7 +1353,11 @@
__ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
// target::frame_layout.exit_link_slot_from_entry_fp must be kept in sync
// with the code below.
+#if defined(TARGET_OS_FUCHSIA)
+ ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -23);
+#else
ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -22);
+#endif
__ Push(R6);
// Mark that the thread is executing Dart code. Do this after initializing the
@@ -1417,7 +1428,18 @@
__ Pop(R4);
__ StoreToOffset(R4, THR, target::Thread::vm_tag_offset());
- __ PopNativeCalleeSavedRegisters();
+
+#if defined(TARGET_OS_FUCHSIA)
+ __ mov (R3, THR);
+#endif
+
+ __ PopNativeCalleeSavedRegisters(); // Clobbers THR
+
+#if defined(TARGET_OS_FUCHSIA)
+ __ str(R18, Address(R3, target::Thread::saved_shadow_call_stack_offset()));
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
// Restore the frame pointer and C stack pointer and return.
__ LeaveFrame();
@@ -1450,25 +1472,19 @@
target::Thread::invoke_dart_code_from_bytecode_stub_offset()));
__ Push(TMP);
- // Save the callee-saved registers.
- for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
- const Register r = static_cast<Register>(i);
- // We use str instead of the Push macro because we will be pushing the PP
- // register when it is not holding a pool-pointer since we are coming from
- // C++ code.
- __ str(r, Address(SP, -1 * target::kWordSize, Address::PreIndex));
- }
+#if defined(TARGET_OS_FUCHSIA)
+ __ str(R18, Address(R3, target::Thread::saved_shadow_call_stack_offset()));
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
- // Save the bottom 64-bits of callee-saved V registers.
- for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) {
- const VRegister r = static_cast<VRegister>(i);
- __ PushDouble(r);
- }
+ __ PushNativeCalleeSavedRegisters();
// Set up THR, which caches the current thread in Dart code.
if (THR != R3) {
__ mov(THR, R3);
}
+
// Refresh write barrier mask.
__ ldr(BARRIER_MASK,
Address(THR, target::Thread::write_barrier_mask_offset()));
@@ -1486,7 +1502,11 @@
__ StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
// target::frame_layout.exit_link_slot_from_entry_fp must be kept in sync
// with the code below.
+#if defined(TARGET_OS_FUCHSIA)
+ ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -23);
+#else
ASSERT(target::frame_layout.exit_link_slot_from_entry_fp == -22);
+#endif
__ Push(R6);
// Mark that the thread is executing Dart code. Do this after initializing the
@@ -1548,21 +1568,17 @@
__ Pop(R4);
__ StoreToOffset(R4, THR, target::Thread::vm_tag_offset());
- // Restore the bottom 64-bits of callee-saved V registers.
- for (int i = kAbiLastPreservedFpuReg; i >= kAbiFirstPreservedFpuReg; i--) {
- const VRegister r = static_cast<VRegister>(i);
- __ PopDouble(r);
- }
+#if defined(TARGET_OS_FUCHSIA)
+ __ mov (R3, THR);
+#endif
- // Restore C++ ABI callee-saved registers.
- for (int i = kAbiLastPreservedCpuReg; i >= kAbiFirstPreservedCpuReg; i--) {
- Register r = static_cast<Register>(i);
- // We use ldr instead of the Pop macro because we will be popping the PP
- // register when it is not holding a pool-pointer since we are returning to
- // C++ code. We also skip the dart stack pointer SP, since we are still
- // using it as the stack pointer.
- __ ldr(r, Address(SP, 1 * target::kWordSize, Address::PostIndex));
- }
+ __ PopNativeCalleeSavedRegisters(); // Clobbers THR
+
+#if defined(TARGET_OS_FUCHSIA)
+ __ str(R18, Address(R3, target::Thread::saved_shadow_call_stack_offset()));
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
// Restore the frame pointer and C stack pointer and return.
__ LeaveFrame();
@@ -3127,6 +3143,11 @@
__ mov(SP, R1); // Stack pointer.
__ mov(FP, R2); // Frame_pointer.
__ mov(THR, R3);
+#if defined(TARGET_OS_FUCHSIA)
+ __ ldr(R18, Address(THR, target::Thread::saved_shadow_call_stack_offset()));
+#elif defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
__ ldr(BARRIER_MASK,
Address(THR, target::Thread::write_barrier_mask_offset()));
// Set the tag.
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 202ee75..06817a0 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -988,6 +988,10 @@
// Set up THR, which caches the current thread in Dart code.
__ movl(THR, EAX);
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Save the current VMTag on the stack.
__ movl(ECX, Assembler::VMTagAddress());
__ pushl(ECX);
@@ -1068,6 +1072,10 @@
// Restore the current VMTag from the stack.
__ popl(Assembler::VMTagAddress());
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Restore C++ ABI callee-saved registers.
__ popl(EDI);
__ popl(ESI);
@@ -1109,6 +1117,10 @@
// Set up THR, which caches the current thread in Dart code.
__ movl(THR, EAX);
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Save the current VMTag on the stack.
__ movl(ECX, Assembler::VMTagAddress());
__ pushl(ECX);
@@ -1181,6 +1193,10 @@
// Restore the current VMTag from the stack.
__ popl(Assembler::VMTagAddress());
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Restore C++ ABI callee-saved registers.
__ popl(EDI);
__ popl(ESI);
@@ -2520,6 +2536,9 @@
Address(ESP, 1 * target::kWordSize)); // Load target PC into EBX.
__ movl(ESP,
Address(ESP, 2 * target::kWordSize)); // Load target stack_pointer.
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
// Set tag.
__ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
// Clear top exit frame.
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index b376b02..5bdc6d2 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -1244,6 +1244,10 @@
__ movq(THR, kThreadReg);
}
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Save the current VMTag on the stack.
__ movq(RAX, Assembler::VMTagAddress());
__ pushq(RAX);
@@ -1328,6 +1332,10 @@
// Restore the current VMTag from the stack.
__ popq(Assembler::VMTagAddress());
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Restore C++ ABI callee-saved registers.
__ PopRegisters(CallingConventions::kCalleeSaveCpuRegisters,
CallingConventions::kCalleeSaveXmmRegisters);
@@ -1387,6 +1395,10 @@
__ movq(THR, kThreadReg);
}
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Save the current VMTag on the stack.
__ movq(RAX, Assembler::VMTagAddress());
__ pushq(RAX);
@@ -1477,6 +1489,10 @@
// Restore the current VMTag from the stack.
__ popq(Assembler::VMTagAddress());
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
+
// Restore C++ ABI callee-saved registers.
__ PopRegisters(CallingConventions::kCalleeSaveCpuRegisters,
CallingConventions::kCalleeSaveXmmRegisters);
@@ -3100,6 +3116,9 @@
__ movq(THR, CallingConventions::kArg4Reg);
__ movq(RBP, CallingConventions::kArg3Reg);
__ movq(RSP, CallingConventions::kArg2Reg);
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
// Set the tag.
__ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
// Clear top exit frame.
@@ -3152,6 +3171,9 @@
// Push the deopt pc.
__ pushq(Address(THR, target::Thread::resume_pc_offset()));
+#if defined(USING_SHADOW_CALL_STACK)
+#error Unimplemented
+#endif
GenerateDeoptimizationSequence(assembler, kEagerDeopt);
// After we have deoptimized, jump to the correct frame.
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index a1f578c..b8fc2f1 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -753,6 +753,13 @@
(Bits(22, 3) == 4));
}
+ inline bool IsRbit() const {
+ ASSERT(ConditionField() != kSpecialCondition);
+ ASSERT(TypeField() == 3);
+ return ((Bits(4, 4) == 3) && (Bits(8, 4) == 15) && (Bits(16, 4) == 15) &&
+ (Bits(20, 8) == 111));
+ }
+
// Test for VFP data processing or single transfer instructions of type 7.
inline bool IsVFPDataProcessingOrSingleTransfer() const {
ASSERT(ConditionField() != kSpecialCondition);
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index dca40c3..cca7779 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -32,7 +32,7 @@
R15 = 15, // SP in Dart code.
R16 = 16, // IP0 aka TMP
R17 = 17, // IP1 aka TMP2
- R18 = 18, // "platform register" on iOS.
+ R18 = 18, // reserved on iOS, shadow call stack on Fuchsia.
R19 = 19,
R20 = 20,
R21 = 21,
@@ -151,12 +151,21 @@
const RegList kAbiArgumentCpuRegs = (1 << R0) | (1 << R1) | (1 << R2) |
(1 << R3) | (1 << R4) | (1 << R5) |
(1 << R6) | (1 << R7);
+#if defined(TARGET_OS_FUCHSIA)
+const RegList kAbiPreservedCpuRegs =
+ (1 << R18) | (1 << R19) | (1 << R20) | (1 << R21) | (1 << R22) |
+ (1 << R23) | (1 << R24) | (1 << R25) | (1 << R26) | (1 << R27) | (1 << R28);
+const Register kAbiFirstPreservedCpuReg = R18;
+const Register kAbiLastPreservedCpuReg = R28;
+const int kAbiPreservedCpuRegCount = 11;
+#else
const RegList kAbiPreservedCpuRegs =
(1 << R19) | (1 << R20) | (1 << R21) | (1 << R22) | (1 << R23) |
(1 << R24) | (1 << R25) | (1 << R26) | (1 << R27) | (1 << R28);
const Register kAbiFirstPreservedCpuReg = R19;
const Register kAbiLastPreservedCpuReg = R28;
const int kAbiPreservedCpuRegCount = 10;
+#endif
const VRegister kAbiFirstPreservedFpuReg = V8;
const VRegister kAbiLastPreservedFpuReg = V15;
const int kAbiPreservedFpuRegCount = 8;
@@ -165,8 +174,7 @@
(1 << SPREG) | // Dart SP
(1 << FPREG) | (1 << TMP) | (1 << TMP2) | (1 << PP) | (1 << THR) |
(1 << LR) | (1 << BARRIER_MASK) | (1 << R31) | // C++ SP
- (1 << R18); // iOS platform register.
-// TODO(rmacnak): Only reserve on Mac & iOS.
+ (1 << R18);
constexpr intptr_t kNumberOfReservedCpuRegisters = 10;
// CPU registers available to Dart allocator.
const RegList kDartAvailableCpuRegs =
@@ -555,6 +563,7 @@
MiscDP1SourceMask = 0x5fe00000,
MiscDP1SourceFixed = DPRegisterFixed | B30 | B28 | B23 | B22,
CLZ = MiscDP1SourceFixed | B12,
+ RBIT = MiscDP1SourceFixed, // opc = '00'
};
// C3.5.8
diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h
index f8d4489..a89756e 100644
--- a/runtime/vm/constants_kbc.h
+++ b/runtime/vm/constants_kbc.h
@@ -649,8 +649,8 @@
V(JumpIfNotNull_Wide, T, WIDE, tgt, ___, ___) \
V(DirectCall, D_F, ORDN, num, num, ___) \
V(DirectCall_Wide, D_F, WIDE, num, num, ___) \
- V(Unused21, 0, RESV, ___, ___, ___) \
- V(Unused22, 0, RESV, ___, ___, ___) \
+ V(UncheckedDirectCall, D_F, ORDN, num, num, ___) \
+ V(UncheckedDirectCall_Wide, D_F, WIDE, num, num, ___) \
V(InterfaceCall, D_F, ORDN, num, num, ___) \
V(InterfaceCall_Wide, D_F, WIDE, num, num, ___) \
V(Unused23, 0, RESV, ___, ___, ___) \
@@ -689,8 +689,8 @@
V(MoveSpecial_Wide, A_Y, WIDE, num, xeg, ___) \
V(BooleanNegateTOS, 0, ORDN, ___, ___, ___) \
V(EqualsNull, 0, ORDN, ___, ___, ___) \
- V(Unused36, 0, RESV, ___, ___, ___) \
- V(Unused37, 0, RESV, ___, ___, ___) \
+ V(CheckReceiverForNull, D, ORDN, lit, ___, ___) \
+ V(CheckReceiverForNull_Wide, D, WIDE, lit, ___, ___) \
V(NegateInt, 0, ORDN, ___, ___, ___) \
V(AddInt, 0, ORDN, ___, ___, ___) \
V(SubInt, 0, ORDN, ___, ___, ___) \
@@ -749,7 +749,7 @@
// Maximum bytecode format version supported by VM.
// The range of supported versions should include version produced by bytecode
// generator (currentBytecodeFormatVersion in pkg/vm/lib/bytecode/dbc.dart).
- static const intptr_t kMaxSupportedBytecodeFormatVersion = 20;
+ static const intptr_t kMaxSupportedBytecodeFormatVersion = 21;
enum Opcode {
#define DECLARE_BYTECODE(name, encoding, kind, op1, op2, op3) k##name,
@@ -981,6 +981,8 @@
case KernelBytecode::kDebugCheck:
case KernelBytecode::kDirectCall:
case KernelBytecode::kDirectCall_Wide:
+ case KernelBytecode::kUncheckedDirectCall:
+ case KernelBytecode::kUncheckedDirectCall_Wide:
case KernelBytecode::kInterfaceCall:
case KernelBytecode::kInterfaceCall_Wide:
case KernelBytecode::kInstantiatedInterfaceCall:
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index c771da7..4a89518 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -729,28 +729,45 @@
if (FLAG_print_llvm_constant_pool) {
StackZone printing_zone(T);
HandleScope printing_scope(T);
- const auto& arr =
+ TextBuffer b(1000);
+ const auto& constants =
GrowableObjectArray::Handle(I->object_store()->llvm_constant_pool());
- if (arr.IsNull()) {
- THR_Print("No constant pool information in snapshot.\n");
+ if (constants.IsNull()) {
+ b.AddString("No constant pool information in snapshot.\n\n");
} else {
- auto const len = arr.Length();
- THR_Print("Constant pool contents (length %" Pd "):\n", len);
+ auto const len = constants.Length();
+ b.Printf("Constant pool contents (length %" Pd "):\n", len);
auto& obj = Object::Handle();
for (intptr_t i = 0; i < len; i++) {
- obj = arr.At(i);
- THR_Print(" %5" Pd ": ", i);
+ obj = constants.At(i);
+ b.Printf(" %5" Pd ": ", i);
if (obj.IsString()) {
- auto& str = String::Cast(obj);
- TextBuffer b(100);
- b.AddEscapedString(str.ToCString());
- THR_Print("\"%s\"\n", b.buf());
+ b.AddChar('"');
+ b.AddEscapedString(obj.ToCString());
+ b.AddChar('"');
} else {
- THR_Print("%s\n", obj.ToCString());
+ b.AddString(obj.ToCString());
}
+ b.AddChar('\n');
}
- THR_Print("End of constant pool.\n\n");
+ b.AddString("End of constant pool.\n\n");
}
+ const auto& functions =
+ GrowableObjectArray::Handle(I->object_store()->llvm_function_pool());
+ if (functions.IsNull()) {
+ b.AddString("No function pool information in snapshot.\n\n");
+ } else {
+ auto const len = functions.Length();
+ b.Printf("Function pool contents (length %" Pd "):\n", len);
+ auto& obj = Function::Handle();
+ for (intptr_t i = 0; i < len; i++) {
+ obj ^= functions.At(i);
+ ASSERT(!obj.IsNull());
+ b.Printf(" %5" Pd ": %s\n", i, obj.ToFullyQualifiedCString());
+ }
+ b.AddString("End of function pool.\n\n");
+ }
+ THR_Print("%s", b.buf());
}
#else
// JIT: The megamorphic miss function and code come from the snapshot in JIT
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 749f567..2f26ce6 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -39,14 +39,7 @@
public:
NO_SANITIZE_SAFE_STACK
explicit ScopedIsolateStackLimits(Thread* thread, uword current_sp)
- : thread_(thread),
-#if defined(USING_SAFE_STACK)
- saved_stack_limit_(0),
- saved_safestack_limit_(0)
-#else
- saved_stack_limit_(0)
-#endif
- {
+ : thread_(thread) {
ASSERT(thread != NULL);
// Set the thread's stack_base based on the current
// stack pointer, we keep refining this value as we
@@ -85,10 +78,10 @@
private:
Thread* thread_;
- uword saved_stack_limit_;
#if defined(USING_SAFE_STACK)
- uword saved_safestack_limit_;
+ uword saved_safestack_limit_ = 0;
#endif
+ uword saved_stack_limit_ = 0;
};
// Clears/restores Thread::long_jump_base on construction/destruction.
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index aa3fd63..0f54abd 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -625,6 +625,10 @@
OSThread::SetCurrentSafestackPointer(saved_ssp);
#endif
+#if defined(USING_SHADOW_CALL_STACK)
+ // The shadow call stack register will be restored by the JumpToFrame stub.
+#endif
+
func(program_counter, stack_pointer, frame_pointer, thread);
#endif
UNREACHABLE();
@@ -1005,12 +1009,6 @@
Exceptions::ThrowByType(Exceptions::kUnsupported, args);
}
-void Exceptions::ThrowRangeErrorMsg(const char* msg) {
- const Array& args = Array::Handle(Array::New(1));
- args.SetAt(0, String::Handle(String::New(msg)));
- Exceptions::ThrowByType(Exceptions::kRangeMsg, args);
-}
-
void Exceptions::ThrowCompileTimeError(const LanguageError& error) {
const Array& args = Array::Handle(Array::New(1));
args.SetAt(0, String::Handle(error.FormatMessage()));
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index 50d1a8f..d0a44d7 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -83,7 +83,6 @@
const Integer& argument_value,
intptr_t expected_from,
intptr_t expected_to);
- DART_NORETURN static void ThrowRangeErrorMsg(const char* msg);
DART_NORETURN static void ThrowUnsupportedError(const char* msg);
DART_NORETURN static void ThrowCompileTimeError(const LanguageError& error);
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index a926493..2649ca0 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -189,7 +189,7 @@
const intptr_t len_in_bytes =
Utils::RoundUp(len_in_bits, kBitsPerByte) / kBitsPerByte;
const intptr_t unrounded_size_in_bytes =
- 3 * compiler::target::kWordSize + len_in_bytes;
+ 2 * compiler::target::kWordSize + len_in_bytes;
return Utils::RoundUp(unrounded_size_in_bytes,
compiler::target::ObjectAlignment::kObjectAlignment);
}
@@ -443,7 +443,6 @@
marked_tags = RawObject::SizeTag::update(size_in_bytes * 2, marked_tags);
stream->WriteTargetWord(marked_tags);
- stream->WriteFixed<uint32_t>(map.PcOffset());
stream->WriteFixed<uint16_t>(map.Length());
stream->WriteFixed<uint16_t>(map.SlowPathBitCount());
stream->WriteBytes(map.raw()->ptr()->data(), len_in_bytes);
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index a46aa0f..d0de7f3 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -262,6 +262,9 @@
intptr_t class_id,
intptr_t instance_size,
RawObject** result) {
+ ASSERT(instance_size > 0);
+ ASSERT(Utils::IsAligned(instance_size, kObjectAlignment));
+
const uword start = thread->top();
#ifndef PRODUCT
auto table = thread->isolate()->shared_class_table();
@@ -269,7 +272,8 @@
return false;
}
#endif
- if (LIKELY((start + instance_size) < thread->end())) {
+ const intptr_t remaining = thread->end() - start;
+ if (LIKELY(remaining >= instance_size)) {
thread->set_top(start + instance_size);
#ifndef PRODUCT
table->UpdateAllocatedNew(class_id, instance_size);
@@ -1848,6 +1852,27 @@
}
{
+ BYTECODE(UncheckedDirectCall, D_F);
+ DEBUG_CHECK;
+ // Invoke target function.
+ {
+ const uint32_t argc = rF;
+ const uint32_t kidx = rD;
+
+ InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
+ *++SP = LOAD_CONSTANT(kidx);
+ RawObject** call_base = SP - argc;
+ RawObject** call_top = SP;
+ argdesc_ = static_cast<RawArray*>(LOAD_CONSTANT(kidx + 1));
+ if (!Invoke(thread, call_base, call_top, &pc, &FP, &SP)) {
+ HANDLE_EXCEPTION;
+ }
+ }
+
+ DISPATCH();
+ }
+
+ {
BYTECODE(InterfaceCall, D_F);
DEBUG_CHECK;
{
@@ -2673,6 +2698,19 @@
}
{
+ BYTECODE(CheckReceiverForNull, D);
+ SP -= 1;
+
+ if (UNLIKELY(SP[0] == null_value)) {
+ // Load selector.
+ SP[0] = LOAD_CONSTANT(rD);
+ goto ThrowNullError;
+ }
+
+ DISPATCH();
+ }
+
+ {
BYTECODE(NegateInt, 0);
DEBUG_CHECK;
UNBOX_INT64(value, SP[0], Symbols::UnaryMinus());
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index 103ce15..abf3f55 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -4,7 +4,6 @@
#include "vm/kernel_isolate.h"
-#include "bin/dartutils.h"
#include "include/dart_native_api.h"
#include "vm/compiler/jit/compiler.h"
#include "vm/dart_api_impl.h"
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index e06b85a..e5cdec3 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -12831,9 +12831,7 @@
}
}
-RawStackMap* StackMap::New(intptr_t pc_offset,
- BitmapBuilder* bmap,
- intptr_t slow_path_bit_count) {
+RawStackMap* StackMap::New(BitmapBuilder* bmap, intptr_t slow_path_bit_count) {
ASSERT(Object::stackmap_class() != Class::null());
ASSERT(bmap != NULL);
StackMap& result = StackMap::Handle();
@@ -12860,8 +12858,6 @@
result ^= raw;
result.SetLength(length);
}
- ASSERT(pc_offset >= 0);
- result.SetPcOffset(pc_offset);
if (payload_size > 0) {
// Ensure leftover bits are deterministic.
result.raw()->ptr()->data()[payload_size - 1] = 0;
@@ -12873,64 +12869,23 @@
return result.raw();
}
-RawStackMap* StackMap::New(intptr_t length,
- intptr_t slow_path_bit_count,
- intptr_t pc_offset) {
- ASSERT(Object::stackmap_class() != Class::null());
- StackMap& result = StackMap::Handle();
- // Guard against integer overflow of the instance size computation.
- intptr_t payload_size = Utils::RoundUp(length, kBitsPerByte) / kBitsPerByte;
- if ((length < 0) || (length > kMaxUint16) ||
- (payload_size > kMaxLengthInBytes)) {
- // This should be caught before we reach here.
- FATAL1("Fatal error in StackMap::New: invalid length %" Pd "\n", length);
- }
- if ((slow_path_bit_count < 0) || (slow_path_bit_count > kMaxUint16)) {
- // This should be caught before we reach here.
- FATAL1("Fatal error in StackMap::New: invalid slow_path_bit_count %" Pd
- "\n",
- slow_path_bit_count);
- }
-
- {
- // StackMap data objects are associated with a code object, allocate them
- // in old generation.
- RawObject* raw = Object::Allocate(
- StackMap::kClassId, StackMap::InstanceSize(length), Heap::kOld);
- NoSafepointScope no_safepoint;
- result ^= raw;
- result.SetLength(length);
- }
- ASSERT(pc_offset >= 0);
- result.SetPcOffset(pc_offset);
- result.SetSlowPathBitCount(slow_path_bit_count);
- return result.raw();
-}
-
const char* StackMap::ToCString() const {
-#define FORMAT "%#05x: "
- if (IsNull()) {
- return "{null}";
- } else {
- intptr_t fixed_length = Utils::SNPrint(NULL, 0, FORMAT, PcOffset()) + 1;
- Thread* thread = Thread::Current();
- // Guard against integer overflow in the computation of alloc_size.
- //
- // TODO(kmillikin): We could just truncate the string if someone
- // tries to print a 2 billion plus entry stackmap.
- if (Length() > (kIntptrMax - fixed_length)) {
- FATAL1("Length() is unexpectedly large (%" Pd ")", Length());
- }
- intptr_t alloc_size = fixed_length + Length();
- char* chars = thread->zone()->Alloc<char>(alloc_size);
- intptr_t index = Utils::SNPrint(chars, alloc_size, FORMAT, PcOffset());
- for (intptr_t i = 0; i < Length(); i++) {
- chars[index++] = IsObject(i) ? '1' : '0';
- }
- chars[index] = '\0';
- return chars;
+ if (IsNull()) return "{null}";
+ // Guard against integer overflow in the computation of alloc_size.
+ //
+ // TODO(kmillikin): We could just truncate the string if someone
+ // tries to print a 2 billion plus entry stackmap.
+ if (Length() > kIntptrMax) {
+ FATAL1("Length() is unexpectedly large (%" Pd ")", Length());
}
-#undef FORMAT
+ Thread* thread = Thread::Current();
+ intptr_t alloc_size = Length() + 1;
+ char* chars = thread->zone()->Alloc<char>(alloc_size);
+ for (intptr_t i = 0; i < Length(); i++) {
+ chars[i] = IsObject(i) ? '1' : '0';
+ }
+ chars[alloc_size - 1] = '\0';
+ return chars;
}
RawString* LocalVarDescriptors::GetName(intptr_t var_index) const {
@@ -15178,12 +15133,15 @@
// frame slots which are marked as having objects.
*maps = stackmaps();
*map = StackMap::null();
- for (intptr_t i = 0; i < maps->Length(); i++) {
- *map ^= maps->At(i);
+ for (intptr_t i = 0; i < maps->Length(); i += 2) {
+ // The reinterpret_cast from Smi::RawCast is inlined here because in
+ // debug mode, it creates Handles due to the ASSERT.
+ const uint32_t offset =
+ ValueFromRawSmi(reinterpret_cast<RawSmi*>(maps->At(i)));
+ if (offset != pc_offset) continue;
+ *map ^= maps->At(i + 1);
ASSERT(!map->IsNull());
- if (map->PcOffset() == pc_offset) {
- return map->raw(); // We found a stack map for this frame.
- }
+ return map->raw();
}
// If we are missing a stack map, this must either be unoptimized code, or
// the entry to an osr function. (In which case all stack slots are
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 81bc595..c9daae0 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -5095,12 +5095,6 @@
intptr_t Length() const { return raw_ptr()->length_; }
- uint32_t PcOffset() const { return raw_ptr()->pc_offset_; }
- void SetPcOffset(uint32_t value) const {
- ASSERT(value <= kMaxUint32);
- StoreNonPointer(&raw_ptr()->pc_offset_, value);
- }
-
intptr_t SlowPathBitCount() const { return raw_ptr()->slow_path_bit_count_; }
void SetSlowPathBitCount(intptr_t bit_count) const {
ASSERT(bit_count <= kMaxUint16);
@@ -5132,13 +5126,7 @@
static intptr_t InstanceSize(intptr_t length) {
return RoundedAllocationSize(UnroundedSize(length));
}
- static RawStackMap* New(intptr_t pc_offset,
- BitmapBuilder* bmap,
- intptr_t register_bit_count);
-
- static RawStackMap* New(intptr_t length,
- intptr_t register_bit_count,
- intptr_t pc_offset);
+ static RawStackMap* New(BitmapBuilder* bmap, intptr_t slow_path_bit_count);
private:
void SetLength(intptr_t length) const {
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 221a326..3a6e3e5 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -125,6 +125,7 @@
RW(Function, complete_on_async_return) \
RW(Class, async_star_stream_controller) \
RW(GrowableObjectArray, llvm_constant_pool) \
+ RW(GrowableObjectArray, llvm_function_pool) \
RW(Array, llvm_constant_hash_table) \
RW(ObjectPool, global_object_pool) \
RW(Array, unique_dynamic_targets) \
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 8592a76..f748ed2 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -1835,10 +1835,22 @@
TEST_CASE(ArrayLengthSmiMin) {
TestIllegalArrayLength(kSmiMin);
}
+
TEST_CASE(ArrayLengthOneTooMany) {
const intptr_t kOneTooMany = Array::kMaxElements + 1;
ASSERT(kOneTooMany >= 0);
- TestIllegalArrayLength(kOneTooMany);
+
+ char buffer[1024];
+ Utils::SNPrint(buffer, sizeof(buffer),
+ "main() {\n"
+ " return new List(%" Pd
+ ");\n"
+ "}\n",
+ kOneTooMany);
+ Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
+ EXPECT_VALID(lib);
+ Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+ EXPECT_ERROR(result, "Out of Memory");
}
TEST_CASE(ArrayLengthMaxElements) {
@@ -1876,7 +1888,7 @@
EXPECT_VALID(lib);
Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
Utils::SNPrint(buffer, sizeof(buffer), "%" Pd, length);
- EXPECT_ERROR(result, "Invalid argument(s)");
+ EXPECT_ERROR(result, "RangeError (length): Invalid value");
EXPECT_ERROR(result, buffer);
}
@@ -1890,7 +1902,19 @@
const intptr_t kOneTooMany =
TypedData::MaxElements(kTypedDataInt8ArrayCid) + 1;
ASSERT(kOneTooMany >= 0);
- TestIllegalTypedDataLength("Int8List", kOneTooMany);
+
+ char buffer[1024];
+ Utils::SNPrint(buffer, sizeof(buffer),
+ "import 'dart:typed_data';\n"
+ "main() {\n"
+ " return new Int8List(%" Pd
+ ");\n"
+ "}\n",
+ kOneTooMany);
+ Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
+ EXPECT_VALID(lib);
+ Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+ EXPECT_ERROR(result, "Out of Memory");
}
TEST_CASE(Int8ListLengthMaxElements) {
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index 4eaae29..2641103 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -8,9 +8,14 @@
#include "vm/os.h"
#include <errno.h>
-#if !defined(FUCHSIA_SDK)
+#if defined(FUCHSIA_SDK)
+#include <fuchsia/deprecatedtimezone/cpp/fidl.h>
+namespace fuchsia {
+namespace timezone = deprecatedtimezone;
+}
+#else
#include <fuchsia/timezone/cpp/fidl.h>
-#endif // !defined(FUCHSIA_SDK)
+#endif // defined(FUCHSIA_SDK)
#include <lib/sys/cpp/service_directory.h>
#include <zircon/process.h>
#include <zircon/syscalls.h>
@@ -39,7 +44,6 @@
return static_cast<intptr_t>(getpid());
}
-#if !defined(FUCHSIA_SDK)
// TODO(FL-98): Change this to talk to fuchsia.dart to get timezone service to
// directly get timezone.
//
@@ -47,12 +51,10 @@
// component:ConnectToEnvironmentServices and this is the only thing that is
// blocking it and FL-98 will take time.
static fuchsia::timezone::TimezoneSyncPtr tz;
-#endif // !defined(FUCHSIA_SDK)
static zx_status_t GetLocalAndDstOffsetInSeconds(int64_t seconds_since_epoch,
int32_t* local_offset,
int32_t* dst_offset) {
-#if !defined(FUCHSIA_SDK)
zx_status_t status = tz->GetTimezoneOffsetMinutes(seconds_since_epoch * 1000,
local_offset, dst_offset);
if (status != ZX_OK) {
@@ -61,13 +63,9 @@
*local_offset *= 60;
*dst_offset *= 60;
return ZX_OK;
-#else
- return ZX_ERR_NOT_SUPPORTED;
-#endif // !defined(FUCHSIA_SDK)
}
const char* OS::GetTimeZoneName(int64_t seconds_since_epoch) {
-#if !defined(FUCHSIA_SDK)
// TODO(abarth): Handle time zone changes.
static const auto* tz_name = new std::string([] {
std::string result;
@@ -75,9 +73,6 @@
return result;
}());
return tz_name->c_str();
-#else
- return "";
-#endif // !defined(FUCHSIA_SDK)}
}
int OS::GetTimeZoneOffsetInSeconds(int64_t seconds_since_epoch) {
@@ -274,10 +269,8 @@
}
void OS::Init() {
-#if !defined(FUCHSIA_SDK)
auto services = sys::ServiceDirectory::CreateFromNamespace();
services->Connect(tz.NewRequest());
-#endif // !defined(FUCHSIA_SDK)
}
void OS::Cleanup() {}
diff --git a/runtime/vm/os_thread_fuchsia.cc b/runtime/vm/os_thread_fuchsia.cc
index 01b2fe7..bf2469a 100644
--- a/runtime/vm/os_thread_fuchsia.cc
+++ b/runtime/vm/os_thread_fuchsia.cc
@@ -13,6 +13,7 @@
#include <zircon/status.h>
#include <zircon/syscalls.h>
#include <zircon/threads.h>
+#include <zircon/tls.h>
#include <zircon/types.h>
#include "platform/address_sanitizer.h"
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index 91c0267..55d1d56 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -212,7 +212,11 @@
static Value ValueOf(Pair kv) { return kv; }
- static inline intptr_t Hashcode(Key key) { return key->PcOffset(); }
+ static inline intptr_t Hashcode(Key key) {
+ intptr_t hash = key->SlowPathBitCount();
+ hash = CombineHashes(hash, key->Length());
+ return FinalizeHash(hash, kBitsPerWord - 1);
+ }
static inline bool IsKeyEqual(Pair pair, Key key) {
return pair->Equals(*key);
@@ -242,7 +246,7 @@
code_ = function.CurrentCode();
stackmaps_ = code_.stackmaps();
if (stackmaps_.IsNull()) return;
- for (intptr_t i = 0; i < stackmaps_.Length(); i++) {
+ for (intptr_t i = 1; i < stackmaps_.Length(); i += 2) {
stackmap_ ^= stackmaps_.At(i);
stackmap_ = DedupStackMap(stackmap_);
stackmaps_.SetAt(i, stackmap_);
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 9a33d1b..a3a0594 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1367,6 +1367,8 @@
RawTypedData* catch_entry_moves_maps_;
RawSmi* variables_;
} catch_entry_;
+ // The stackmaps_ array contains alternating Smi and StackMap values, where
+ // each Smi value is the PC offset for the following StackMap value.
RawArray* stackmaps_;
RawArray* inlined_id_to_function_;
RawCodeSourceMap* code_source_map_;
@@ -1620,10 +1622,6 @@
RAW_HEAP_OBJECT_IMPLEMENTATION(StackMap);
VISIT_NOTHING();
- // Offset from code entry point corresponding to this stack map
- // representation.
- uint32_t pc_offset_;
-
uint16_t length_; // Length of payload, in bits.
uint16_t slow_path_bit_count_; // Slow path live values, included in length_.
// ARM64 requires register_bit_count_ to be as large as 96.
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 3641e8a..4a5d757 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -248,29 +248,29 @@
args.SetAt(2, String::Handle(zone, String::New("is not an integer")));
Exceptions::ThrowByType(Exceptions::kArgumentValue, args);
}
- if (length.IsSmi()) {
- const intptr_t len = Smi::Cast(length).Value();
- if (Array::IsValidLength(len)) {
- const Array& array = Array::Handle(zone, Array::New(len, Heap::kNew));
- arguments.SetReturn(array);
- TypeArguments& element_type =
- TypeArguments::CheckedHandle(zone, arguments.ArgAt(1));
- // An Array is raw or takes one type argument. However, its type argument
- // vector may be longer than 1 due to a type optimization reusing the type
- // argument vector of the instantiator.
- ASSERT(element_type.IsNull() ||
- (element_type.Length() >= 1 && element_type.IsInstantiated()));
- array.SetTypeArguments(element_type); // May be null.
- return;
- }
+ const int64_t len = Integer::Cast(length).AsInt64Value();
+ if (len < 0) {
+ // Throw: new RangeError.range(length, 0, Array::kMaxElements, "length");
+ Exceptions::ThrowRangeError("length", Integer::Cast(length), 0,
+ Array::kMaxElements);
}
- // Throw: new RangeError.range(length, 0, Array::kMaxElements, "length");
- const Array& args = Array::Handle(zone, Array::New(4));
- args.SetAt(0, length);
- args.SetAt(1, Integer::Handle(zone, Integer::New(0)));
- args.SetAt(2, Integer::Handle(zone, Integer::New(Array::kMaxElements)));
- args.SetAt(3, Symbols::Length());
- Exceptions::ThrowByType(Exceptions::kRange, args);
+ if (len > Array::kMaxElements) {
+ const Instance& exception = Instance::Handle(
+ zone, thread->isolate()->object_store()->out_of_memory());
+ Exceptions::Throw(thread, exception);
+ }
+
+ const Array& array =
+ Array::Handle(zone, Array::New(static_cast<intptr_t>(len), Heap::kNew));
+ arguments.SetReturn(array);
+ TypeArguments& element_type =
+ TypeArguments::CheckedHandle(zone, arguments.ArgAt(1));
+ // An Array is raw or takes one type argument. However, its type argument
+ // vector may be longer than 1 due to a type optimization reusing the type
+ // argument vector of the instantiator.
+ ASSERT(element_type.IsNull() ||
+ (element_type.Length() >= 1 && element_type.IsInstantiated()));
+ array.SetTypeArguments(element_type); // May be null.
}
// Helper returning the token position of the Dart caller.
@@ -630,6 +630,10 @@
}
const intptr_t len = new_cache.NumberOfChecks();
if (len >= FLAG_max_subtype_cache_entries) {
+ if (FLAG_trace_type_checks) {
+ OS::PrintErr("Not updating subtype test cache as its length reached %d\n",
+ FLAG_max_subtype_cache_entries);
+ }
return;
}
#if defined(DEBUG)
@@ -834,10 +838,37 @@
#if !defined(TARGET_ARCH_DBC) && !defined(TARGET_ARCH_IA32) && \
!defined(DART_PRECOMPILED_RUNTIME)
if (mode == kTypeCheckFromLazySpecializeStub) {
+ if (FLAG_trace_type_checks) {
+ OS::PrintErr(" Specializing type testing stub for %s\n",
+ dst_type.ToCString());
+ }
TypeTestingStubGenerator::SpecializeStubFor(thread, dst_type);
// Only create the cache when we come from a normal stub.
should_update_cache = false;
}
+
+ // Fast path of type testing stub wasn't able to handle given type, yet it
+ // passed the type check. It means that fast-path was using outdated cid
+ // ranges and new classes appeared since the stub was generated.
+ // Re-generate the stub.
+ if ((mode == kTypeCheckFromSlowStub) && dst_type.IsType() &&
+ (TypeTestingStubGenerator::DefaultCodeForType(dst_type, /*lazy=*/false) !=
+ dst_type.type_test_stub()) &&
+ dst_type.IsInstantiated()) {
+ if (FLAG_trace_type_checks) {
+ OS::PrintErr(" Rebuilding type testing stub for %s\n",
+ dst_type.ToCString());
+ }
+#if defined(DEBUG)
+ const auto& old_code = Code::Handle(dst_type.type_test_stub());
+#endif
+ TypeTestingStubGenerator::SpecializeStubFor(thread, dst_type);
+#if defined(DEBUG)
+ ASSERT(old_code.raw() != dst_type.type_test_stub());
+#endif
+ // Only create the cache when we come from a normal stub.
+ should_update_cache = false;
+ }
#endif
if (should_update_cache) {
diff --git a/runtime/vm/simulator_arm.cc b/runtime/vm/simulator_arm.cc
index 24197fe..ea0a4a4 100644
--- a/runtime/vm/simulator_arm.cc
+++ b/runtime/vm/simulator_arm.cc
@@ -2234,6 +2234,12 @@
if (instr->IsDivision()) {
DoDivision(instr);
return;
+ } else if (instr->IsRbit()) {
+ // Format(instr, "rbit'cond 'rd, 'rm");
+ Register rm = instr->RmField();
+ Register rd = instr->RdField();
+ set_register(rd, Utils::ReverseBits32(get_register(rm)));
+ return;
}
Register rd = instr->RdField();
Register rn = instr->RnField();
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 8eb8dd5..efc5e89 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -886,7 +886,10 @@
R31Type r31t) {
// Register is in range.
ASSERT((reg >= 0) && (reg < kNumberOfCpuRegisters));
+#if !defined(TARGET_OS_FUCHSIA)
ASSERT(instr == NULL || reg != R18); // R18 is globally reserved on iOS.
+#endif
+
if ((reg != R31) || (r31t != R31IsZR)) {
registers_[reg] = value;
// If we're setting CSP, make sure it is 16-byte aligned. In truth, CSP
@@ -2434,6 +2437,17 @@
}
break;
}
+ case 0: {
+ // Format(instr, "rbit'sf 'rd, 'rn");
+ if (instr->SFField() == 1) {
+ const uint64_t rd_val = Utils::ReverseBits64(rn_val64);
+ set_register(instr, rd, rd_val, R31IsZR);
+ } else {
+ const uint32_t rd_val = Utils::ReverseBits32(rn_val32);
+ set_wregister(rd, rd_val, R31IsZR);
+ }
+ break;
+ }
default:
UnimplementedInstruction(instr);
break;
diff --git a/runtime/vm/stack_frame_arm64.h b/runtime/vm/stack_frame_arm64.h
index 1558a22..7a5cfc5 100644
--- a/runtime/vm/stack_frame_arm64.h
+++ b/runtime/vm/stack_frame_arm64.h
@@ -49,8 +49,13 @@
static const int kLastParamSlotFromEntrySp = 0;
// Entry and exit frame layout.
+#if defined(TARGET_OS_FUCHSIA)
+static const int kExitLinkSlotFromEntryFp = -23;
+COMPILE_ASSERT(kAbiPreservedCpuRegCount == 11);
+#else
static const int kExitLinkSlotFromEntryFp = -22;
COMPILE_ASSERT(kAbiPreservedCpuRegCount == 10);
+#endif
COMPILE_ASSERT(kAbiPreservedFpuRegCount == 8);
// For FFI native -> Dart callbacks, this is the number of stack slots between
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index b1fa522..a982438 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -287,6 +287,9 @@
saved_safestack_limit_ = limit;
}
#endif
+ static uword saved_shadow_call_stack_offset() {
+ return OFFSET_OF(Thread, saved_shadow_call_stack_);
+ }
#if defined(TARGET_ARCH_DBC)
// Access to the current stack limit for DBC interpreter.
@@ -892,6 +895,7 @@
RawObject* active_stacktrace_;
RawObjectPool* global_object_pool_;
uword resume_pc_;
+ uword saved_shadow_call_stack_ = 0;
uword execution_state_;
uword safepoint_state_;
RawGrowableObjectArray* ffi_callback_code_;
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h
index 1bce4cc..5805581 100644
--- a/runtime/vm/timeline.h
+++ b/runtime/vm/timeline.h
@@ -53,7 +53,6 @@
V(Embedder, "dart:embedder") \
V(GC, "dart:gc") \
V(Isolate, "dart:isolate") \
- V(Developer, "dart:developer") \
V(VM, "dart:vm")
// A stream of timeline events. A stream has a name and can be enabled or
diff --git a/runtime/vm/utils_test.cc b/runtime/vm/utils_test.cc
index 59d4b24..03e18ef 100644
--- a/runtime/vm/utils_test.cc
+++ b/runtime/vm/utils_test.cc
@@ -160,6 +160,22 @@
EXPECT_EQ(0, Utils::CountLeadingZeros(kTopBit));
}
+VM_UNIT_TEST_CASE(ReverseBits32) {
+ EXPECT_EQ(0xffffffffU, Utils::ReverseBits32(0xffffffffU));
+ EXPECT_EQ(0xf0000000U, Utils::ReverseBits32(0x0000000fU));
+ EXPECT_EQ(0x00000001U, Utils::ReverseBits32(0x80000000U));
+ EXPECT_EQ(0x22222222U, Utils::ReverseBits32(0x44444444U));
+ EXPECT_EQ(0x1E6A2C48U, Utils::ReverseBits32(0x12345678U));
+}
+
+VM_UNIT_TEST_CASE(ReverseBits64) {
+ EXPECT_EQ(0xffffffffffffffffLLU, Utils::ReverseBits64(0xffffffffffffffffLLU));
+ EXPECT_EQ(0xf000000000000000LLU, Utils::ReverseBits64(0x000000000000000fLLU));
+ EXPECT_EQ(0x0000000000000001LLU, Utils::ReverseBits64(0x8000000000000000LLU));
+ EXPECT_EQ(0x2222222222222222LLU, Utils::ReverseBits64(0x4444444444444444LLU));
+ EXPECT_EQ(0x8f7b3d591e6a2c48LLU, Utils::ReverseBits64(0x123456789abcdef1LLU));
+}
+
VM_UNIT_TEST_CASE(IsInt) {
EXPECT(Utils::IsInt(8, 16));
EXPECT(Utils::IsInt(8, 127));
diff --git a/sdk/lib/_internal/vm/lib/wasm_patch.dart b/sdk/lib/_internal/vm/lib/wasm_patch.dart
index 5ae21c4..1372932 100644
--- a/sdk/lib/_internal/vm/lib/wasm_patch.dart
+++ b/sdk/lib/_internal/vm/lib/wasm_patch.dart
@@ -112,6 +112,11 @@
_buffer = _init(initialPages, maxPages);
}
+ _NativeWasmMemory.fromInstance(_NativeWasmInstance inst) {
+ _buffer = _initFromInstance(inst);
+ _pages = _getPages();
+ }
+
int get lengthInPages => _pages;
int get lengthInBytes => _buffer.lengthInBytes;
int operator [](int index) => _buffer[index];
@@ -128,6 +133,9 @@
Uint8List _init(int initialPages, int maxPages) native 'Wasm_initMemory';
Uint8List _grow(int deltaPages) native 'Wasm_growMemory';
+ Uint8List _initFromInstance(_NativeWasmInstance inst)
+ native 'Wasm_initMemoryFromInstance';
+ int _getPages() native 'Wasm_getMemoryPages';
}
class _NativeWasmInstance extends NativeFieldWrapperClass1
@@ -145,6 +153,10 @@
return _NativeWasmFunction<T>(this, name);
}
+ WasmMemory get memory {
+ return _NativeWasmMemory.fromInstance(this);
+ }
+
void _init(_NativeWasmModule module, _NativeWasmImports imports)
native 'Wasm_initInstance';
}
diff --git a/sdk/lib/core/exceptions.dart b/sdk/lib/core/exceptions.dart
index 2e137e5..27c11fa 100644
--- a/sdk/lib/core/exceptions.dart
+++ b/sdk/lib/core/exceptions.dart
@@ -13,9 +13,10 @@
* so that the error can be addressed programmatically. It is intended to be
* caught, and it should contain useful data fields.
*
- * Creating instances of [Exception] directly with [:new Exception("message"):]
- * is discouraged, and only included as a temporary measure during development,
- * until the actual exceptions used by a library are done.
+ * Creating instances of [Exception] directly with `Exception("message")`
+ * is discouraged in library code since it doesn't give users a precise
+ * type they can catch. It may be reasonable to use instances of this
+ * class in tests or during development.
*/
abstract class Exception {
factory Exception([var message]) => _Exception(message);
diff --git a/sdk/lib/wasm/wasm.dart b/sdk/lib/wasm/wasm.dart
index f5814ca..0d123c2 100644
--- a/sdk/lib/wasm/wasm.dart
+++ b/sdk/lib/wasm/wasm.dart
@@ -80,6 +80,9 @@
abstract class WasmInstance {
// Find an exported function with the given signature.
WasmFunction<T> lookupFunction<T extends Function>(String name);
+
+ // Returns this instances's memory.
+ WasmMemory get memory;
}
// WasmFunction is a callable function in a WasmInstance.
diff --git a/sdk_nnbd/lib/_internal/vm/lib/wasm_patch.dart b/sdk_nnbd/lib/_internal/vm/lib/wasm_patch.dart
index df3e33e..1e43d2c 100644
--- a/sdk_nnbd/lib/_internal/vm/lib/wasm_patch.dart
+++ b/sdk_nnbd/lib/_internal/vm/lib/wasm_patch.dart
@@ -114,6 +114,11 @@
_buffer = _init(initialPages, maxPages);
}
+ _NativeWasmMemory.fromInstance(_NativeWasmInstance inst) {
+ _buffer = _initFromInstance(inst);
+ _pages = _getPages();
+ }
+
int get lengthInPages => _pages;
int get lengthInBytes => _buffer.lengthInBytes;
int operator [](int index) => _buffer[index];
@@ -130,6 +135,9 @@
Uint8List _init(int initialPages, int maxPages) native 'Wasm_initMemory';
Uint8List _grow(int deltaPages) native 'Wasm_growMemory';
+ Uint8List _initFromInstance(_NativeWasmInstance inst)
+ native 'Wasm_initMemoryFromInstance';
+ int _getPages() native 'Wasm_getMemoryPages';
}
class _NativeWasmInstance extends NativeFieldWrapperClass1
@@ -147,6 +155,10 @@
return _NativeWasmFunction<T>(this, name);
}
+ WasmMemory get memory {
+ return _NativeWasmMemory.fromInstance(this);
+ }
+
void _init(_NativeWasmModule module, _NativeWasmImports imports)
native 'Wasm_initInstance';
}
diff --git a/sdk_nnbd/lib/core/exceptions.dart b/sdk_nnbd/lib/core/exceptions.dart
index 4ac5ace..38a5575 100644
--- a/sdk_nnbd/lib/core/exceptions.dart
+++ b/sdk_nnbd/lib/core/exceptions.dart
@@ -15,9 +15,10 @@
* so that the error can be addressed programmatically. It is intended to be
* caught, and it should contain useful data fields.
*
- * Creating instances of [Exception] directly with [:new Exception("message"):]
- * is discouraged, and only included as a temporary measure during development,
- * until the actual exceptions used by a library are done.
+ * Creating instances of [Exception] directly with `Exception("message")`
+ * is discouraged in library code since it doesn't give users a precise
+ * type they can catch. It may be reasonable to use instances of this
+ * class in tests or during development.
*/
abstract class Exception {
factory Exception([var message]) => _Exception(message);
diff --git a/sdk_nnbd/lib/wasm/wasm.dart b/sdk_nnbd/lib/wasm/wasm.dart
index 4394189..f1c05c7 100644
--- a/sdk_nnbd/lib/wasm/wasm.dart
+++ b/sdk_nnbd/lib/wasm/wasm.dart
@@ -82,6 +82,9 @@
abstract class WasmInstance {
// Find an exported function with the given signature.
WasmFunction<T> lookupFunction<T extends Function>(String name);
+
+ // Returns this instance's memory.
+ WasmMemory get memory;
}
// WasmFunction is a callable function in a WasmInstance.
diff --git a/tests/compiler/dart2js/analyses/analysis_helper.dart b/tests/compiler/dart2js/analyses/analysis_helper.dart
index 4b6234d..cea60ab 100644
--- a/tests/compiler/dart2js/analyses/analysis_helper.dart
+++ b/tests/compiler/dart2js/analyses/analysis_helper.dart
@@ -309,7 +309,9 @@
node is! ir.Expression ||
staticType == typeEnvironment.nullType ||
typeEnvironment.isSubtypeOf(
- staticType, _getStaticTypeFromExpression(node)),
+ staticType,
+ _getStaticTypeFromExpression(node),
+ ir.SubtypeCheckMode.ignoringNullabilities),
reportAssertionFailure(
node,
"Unexpected static type for $node (${node.runtimeType}): "
diff --git a/tests/compiler/dart2js/equivalence/id_testing_test.dart b/tests/compiler/dart2js/equivalence/id_testing_test.dart
index a24168a..c40ff6f 100644
--- a/tests/compiler/dart2js/equivalence/id_testing_test.dart
+++ b/tests/compiler/dart2js/equivalence/id_testing_test.dart
@@ -61,7 +61,7 @@
KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
ir.Library node = elementMap.getLibraryNode(library);
new IdTestingDataExtractor(compiler.reporter, actualMap, elementMap)
- .computeForLibrary(node, useFileUri: true);
+ .computeForLibrary(node);
}
@override
diff --git a/tests/compiler/dartdevc/modular/nnbd_subtype/main.dart b/tests/compiler/dartdevc/modular/nnbd_subtype/main.dart
new file mode 100644
index 0000000..fd89ae0
--- /dev/null
+++ b/tests/compiler/dartdevc/modular/nnbd_subtype/main.dart
@@ -0,0 +1,205 @@
+// Copyright (c) 2019, 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:_foreign_helper' show JS;
+import 'dart:_runtime' as dart;
+import 'dart:async';
+
+import 'package:expect/expect.dart';
+
+class A {}
+
+class B extends A {}
+
+class C extends B {}
+
+class D<T extends B> {}
+
+class E<T, S> {}
+
+class F extends E<B, B> {}
+
+// Returns sWrapped<tWrapped> as a wrapped type.
+Object generic1(Type sWrapped, Type tWrapped) {
+ var s = dart.unwrapType(sWrapped);
+ var t = dart.unwrapType(tWrapped);
+ var sGeneric = dart.getGenericClass(s);
+ return dart.wrapType(JS('', '#(#)', sGeneric, t));
+}
+
+// Returns sWrapped<tWrapped, rWrapped> as a wrapped type.
+Object generic2(Type sWrapped, Type tWrapped, Type rWrapped) {
+ var s = dart.unwrapType(sWrapped);
+ var t = dart.unwrapType(tWrapped);
+ var r = dart.unwrapType(rWrapped);
+ var sGeneric = dart.getGenericClass(s);
+ return dart.wrapType(JS('', '#(#, #)', sGeneric, t, r));
+}
+
+// Returns a function type of argWrapped -> returnWrapped as a wrapped type.
+Object function1(Type returnWrapped, Type argWrapped) {
+ var returnType = dart.unwrapType(returnWrapped);
+ var argType = dart.unwrapType(argWrapped);
+ var fun = dart.fnType(returnType, [argType]);
+ return dart.wrapType(fun);
+}
+
+// Returns a function type with a bounded type argument that takes no argument
+// and returns void as a wrapped type.
+Object genericFunction(Type boundWrapped) => dart.wrapType(dart.gFnType(
+ (T) => [dart.VoidType, []], (T) => [dart.unwrapType(boundWrapped)]));
+
+// Returns a function type with a bounded generic return type of
+// <T extends typeBoud> argWrapped -> T as a wrapped type.
+Object functionGenericReturn(Type boundWrapped, Type argWrapped) =>
+ dart.wrapType(dart.gFnType(
+ (T) => [
+ T,
+ [dart.unwrapType(argWrapped)]
+ ],
+ (T) => [dart.unwrapType(boundWrapped)]));
+
+// Returns a function with a bounded generic argument type of
+// <T extends typeBoud> T -> returnWrapped as a wrapped type.
+Object functionGenericArg(Type boundWrapped, Type returnWrapped) =>
+ dart.wrapType(dart.gFnType(
+ (T) => [
+ dart.unwrapType(returnWrapped),
+ [T]
+ ],
+ (T) => [dart.unwrapType(boundWrapped)]));
+
+void checkSubtype(Type sWrapped, Type tWrapped) {
+ var s = dart.unwrapType(sWrapped);
+ var t = dart.unwrapType(tWrapped);
+ Expect.isTrue(dart.isSubtypeOf(s, t), '$s should be subtype of $t.');
+}
+
+void checkProperSubtype(Type sWrapped, Type tWrapped) {
+ var s = dart.unwrapType(sWrapped);
+ var t = dart.unwrapType(tWrapped);
+ Expect.isTrue(dart.isSubtypeOf(s, t), '$s should be subtype of $t.');
+ Expect.isFalse(dart.isSubtypeOf(t, s), '$t should not be subtype of $s.');
+}
+
+void main() {
+ // A <: dynamic
+ checkProperSubtype(A, dynamic);
+ // A <: Object
+ checkProperSubtype(A, Object);
+ // TODO(nshahan) Test void as top? A <: void
+
+ // Null <: A
+ checkProperSubtype(Null, A);
+
+ // FutureOr<Null> <: Future<Null>
+ checkSubtype(generic1(FutureOr, Null), generic1(Future, Null));
+ // Future<B> <: FutureOr<A>
+ checkProperSubtype(generic1(Future, B), generic1(FutureOr, A));
+ // B <: <: FutureOr<A>
+ checkProperSubtype(B, generic1(FutureOr, A));
+ // Future<B> <: Future<A>
+ checkProperSubtype(generic1(Future, B), generic1(Future, A));
+ // B <: A
+ checkProperSubtype(B, A);
+
+ // A <: A
+ checkSubtype(A, A);
+ // C <: B
+ checkProperSubtype(C, B);
+ // C <: A
+ checkProperSubtype(C, A);
+
+ // A -> B <: Function
+ checkProperSubtype(function1(B, A), Function);
+
+ // A -> B <: A -> B
+ checkSubtype(function1(B, A), function1(B, A));
+
+ // A -> B <: B -> B
+ checkProperSubtype(function1(B, A), function1(B, B));
+ // TODO(nshahan) Subtype check with covariant keyword?
+
+ // A -> B <: A -> A
+ checkSubtype(function1(B, A), function1(A, A));
+
+ // Generic Function Subtypes.
+ // Bound is a built in type.
+ // <T extends int> void -> void <: <T extends int> void -> void
+ checkSubtype(genericFunction(int), genericFunction(int));
+
+ // <T extends String> A -> T <: <T extends String> B -> T
+ checkProperSubtype(
+ functionGenericReturn(String, A), functionGenericReturn(String, B));
+
+ // <T extends double> T -> B <: <T extends double> T -> A
+ checkProperSubtype(
+ functionGenericArg(double, B), functionGenericArg(double, A));
+
+ // Bound is a function type.
+ // <T extends A -> B> void -> void <: <T extends A -> B> void -> void
+ checkSubtype(
+ genericFunction(function1(B, A)), genericFunction(function1(B, A)));
+
+ // <T extends A -> B> A -> T <: <T extends A -> B> B -> T
+ checkProperSubtype(functionGenericReturn(function1(B, A), A),
+ functionGenericReturn(function1(B, A), B));
+
+ // <T extends A -> B> T -> B <: <T extends A -> B> T -> A
+ checkProperSubtype(functionGenericArg(function1(B, A), B),
+ functionGenericArg(function1(B, A), A));
+
+ // Bound is a user defined class.
+ // <T extends B> void -> void <: <T extends B> void -> void
+ checkSubtype(genericFunction(B), genericFunction(B));
+
+ // <T extends B> A -> T <: <T extends B> B -> T
+ checkProperSubtype(functionGenericReturn(B, A), functionGenericReturn(B, B));
+
+ // <T extends B> T -> B <: <T extends B> T -> A
+ checkProperSubtype(functionGenericArg(B, B), functionGenericArg(B, A));
+
+ // Bound is a Future.
+ // <T extends Future<B>> void -> void <: <T extends Future<B>> void -> void
+ checkSubtype(genericFunction(generic1(Future, B)),
+ genericFunction(generic1(Future, B)));
+
+ // <T extends Future<B>> A -> T <: <T extends Future<B>> B -> T
+ checkProperSubtype(functionGenericReturn(generic1(Future, B), A),
+ functionGenericReturn(generic1(Future, B), B));
+
+ // <T extends Future<B>> T -> B <: <T extends Future<B>> T -> A
+ checkProperSubtype(functionGenericArg(generic1(Future, B), B),
+ functionGenericArg(generic1(Future, B), A));
+
+ // Bound is a FutureOr.
+ // <T extends FutureOr<B>> void -> void <:
+ // <T extends FutureOr<B>> void -> void
+ checkSubtype(genericFunction(generic1(FutureOr, B)),
+ genericFunction(generic1(FutureOr, B)));
+
+ // <T extends FutureOr<B>> A -> T <: <T extends FutureOr<B>> B -> T
+ checkProperSubtype(functionGenericReturn(generic1(FutureOr, B), A),
+ functionGenericReturn(generic1(FutureOr, B), B));
+
+ // <T extends FutureOr<B>> T -> B <: <T extends FutureOr<B>> T -> A
+ checkProperSubtype(functionGenericArg(generic1(FutureOr, B), B),
+ functionGenericArg(generic1(FutureOr, B), A));
+
+ // D <: D<B>
+ checkSubtype(D, generic1(D, B));
+ // D<B> <: D
+ checkSubtype(generic1(D, B), D);
+ // D<C> <: D<B>
+ checkProperSubtype(generic1(D, C), generic1(D, B));
+
+ // F <: E
+ checkProperSubtype(F, E);
+ // F <: E<A, A>
+ checkProperSubtype(F, generic2(E, A, A));
+ // // E<B, B> <: E<A, A>
+ checkProperSubtype(generic2(E, B, B), E);
+ // // E<B, B> <: E<A, A>
+ checkProperSubtype(generic2(E, B, B), generic2(E, A, A));
+}
diff --git a/tests/compiler/dartdevc/modular/nnbd_subtype/modules.yaml b/tests/compiler/dartdevc/modular/nnbd_subtype/modules.yaml
new file mode 100644
index 0000000..4843548
--- /dev/null
+++ b/tests/compiler/dartdevc/modular/nnbd_subtype/modules.yaml
@@ -0,0 +1,11 @@
+# Copyright (c) 2019, 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.
+#
+# NNBD runtime subtype tests.
+# Temporarily here until the test/compiler/dartdevc_native suite is migrated for
+# nnbd.
+dependencies:
+ main: expect
+# flags:
+# - non-nullable
\ No newline at end of file
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index f11deb7..2d8824e 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -2,58 +2,11 @@
# 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.
-[ $compiler == dart2analyzer ]
-num_sign_test: Crash, Pass # Issue 31768
-
-[ $compiler == dart2js ]
-bigint_from_test: RuntimeError # Issue 32589
-bit_twiddling_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-compare_to2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-core_runtime_types_test: RuntimeError # Issue 34147
-date_time11_test: RuntimeError, Pass # Fails when US is on winter time, issue 31285.
-double_ceil_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-double_floor_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-double_round_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-double_truncate_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-error_stack_trace1_test: RuntimeError # Issue 12399
-int_from_environment_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_parse_radix_int64_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_parse_radix_int64_test/02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_parse_radix_int64_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-integer_arith_vm_test/modPow: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-integer_arith_vm_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-integer_to_string_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-iterable_return_type_test/02: RuntimeError # Dart2js does not support Uint64*.
-list_unmodifiable_test: Pass, RuntimeError # Issue 28712
-
[ $compiler == dartdevk ]
regexp/lookbehind_test/01: Skip # Flaky in uncatchable way. Issue 36280
-[ $compiler == none ]
-symbol_operator_test/03: Fail # Issue 11669
-symbol_reserved_word_test/02: CompileTimeError # Issue 20191
-symbol_reserved_word_test/04: MissingCompileTimeError # Issue 11669, 19972, With the exception of 'void', const Symbol() should not accept reserved words.
-symbol_reserved_word_test/06: RuntimeError # Issue 11669, With the exception of 'void', new Symbol() should not accept reserved words.
-symbol_reserved_word_test/07: MissingCompileTimeError # Issue 11669, 19972, With the exception of 'void', const Symbol() should not accept reserved words.
-symbol_reserved_word_test/09: RuntimeError # Issue 11669, With the exception of 'void', new Symbol() should not accept reserved words.
-symbol_reserved_word_test/10: MissingCompileTimeError # Issue 11669, 19972, With the exception of 'void', const Symbol() should not accept reserved words.
-symbol_reserved_word_test/12: RuntimeError # Issue 11669, With the exception of 'void', new Symbol() should not accept reserved words.
-symbol_test/01: Fail, Pass # Issue 11669
-symbol_test/02: MissingCompileTimeError # Issue 11669
-symbol_test/03: MissingCompileTimeError # Issue 11669
-symbol_test/none: Fail # Issue 11669
-unicode_test: Fail # Issue 6706
-
[ $mode == debug ]
-regexp/pcre_test: Pass, Slow # Issue 22008
-
-[ $runtime == jsshell ]
-string_case_test/01: Fail, OK # German double S.
-
-[ $runtime == safari ]
-double_round3_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
-double_round_to_double2_test: Fail, OK # Runtime rounds 0.49999999999999994 to 1.
-string_trimlr_test/unicode63: RuntimeError # Uses Unicode 6.2.0 or earlier.
+regexp/pcre_test: Slow # Issue 22008
[ $arch == simarmv5te && ($runtime == dart_precompiled || $runtime == vm) ]
int_parse_radix_test/*: Slow
@@ -62,9 +15,6 @@
[ $arch == x64 && $system == windows ]
stopwatch_test: Skip # Flaky test due to expected performance behaviour.
-[ $builder_tag == obfuscated && $compiler == dartkp ]
-nsm_invocation_test: RuntimeError # Issue 35066
-
[ $builder_tag == obfuscated && $runtime == dart_precompiled ]
apply_generic_function_test: SkipByDesign # Function.apply with named args
apply_test: Skip # Uses new Symbol via symbolMapToStringMap helper
@@ -72,60 +22,11 @@
error_stack_trace1_test: SkipByDesign # Expects unobfuscated stack trace
type_tostring_test: SkipByDesign # Expects names in Type.toString()
-[ $compiler != app_jitk && $compiler != dart2js && $compiler != dartdevc && $compiler != dartdevk && $compiler != dartk && $compiler != dartkb && $compiler != dartkp && $runtime != none ]
-map_keys2_test: RuntimeError # needs Dart 2 is checks
-
[ $compiler != dart2analyzer && $compiler != dart2js && $compiler != dartdevc && $compiler != dartdevk ]
bigint_js_test: SkipByDesign # JavaScript-specific test
-[ $compiler == dart2js && $runtime == chromeOnAndroid ]
-list_as_map_test: Pass, Slow # TODO(kasperl): Please triage.
-string_trimlr_test/unicode63: RuntimeError # Uses Unicode 6.2.0 or earlier.
-
-[ $compiler == dart2js && $runtime == d8 ]
-uri_base_test: RuntimeError # D8 uses a custom uri scheme for Uri.base
-
[ $compiler == dart2js && $runtime != none ]
-regexp/pcre_test: Pass, Slow # Issue 21593
-
-[ $compiler == dart2js && !$browser ]
-package_resource_test: RuntimeError # Issue 26842
-
-[ $compiler == dart2js && $checked ]
-error_stack_trace1_test: RuntimeError # Issue 12399
-iterable_return_type_test/01: RuntimeError # Issue 20085
-iterable_return_type_test/02: RuntimeError # Dart2js does not support Uint64*.
-iterable_to_list_test/01: Crash # Wrong number of template arguments, given 2, expected 1
-iterable_to_list_test/none: Crash # Wrong number of template arguments, given 2, expected 1
-list_replace_range_test: RuntimeError # Issue 32010
-list_test/01: Crash # Unsupported operation: Unsupported type parameter type node T.
-list_test/none: Crash # Unsupported operation: Unsupported type parameter type node T.
-map_test: Crash # tests/corelib_2/map_test.dart:903:7: Internal problem: Unhandled Null in installDefaultConstructor.
-symbol_reserved_word_test/03: RuntimeError # Issue 19972, new Symbol('void') should be allowed.
-
-[ $compiler == dart2js && $minified ]
-error_stack_trace1_test: RuntimeError # Issue 12399
-hash_set_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(_CustomHashSet.#x), local(_CustomHashSet.#)) for j:closure_call(_CustomHashSet__CustomHashSet_closure.call).
-iterable_return_type_test/02: RuntimeError # Dart2js does not support Uint64*.
-list_concurrent_modify_test: RuntimeError # dart2js does not fully implement these
-nsm_invocation_test: RuntimeError # Symbols don't match due to minifiaction.
-symbol_reserved_word_test/03: RuntimeError # Issue 19972, new Symbol('void') should be allowed.
-
-[ $compiler == dartdevc && $runtime != none ]
-compare_to2_test: CompileTimeError # invalid test
-symbol_operator_test: RuntimeError # Issue 29921
-
-[ $compiler == dartkp && $runtime == dart_precompiled ]
-iterable_reduce_test/01: CompileTimeError # Issue 31533
-symbol_operator_test/03: RuntimeError # Issues 11669 and 31936 - throwing const constructors.
-symbol_reserved_word_test/06: RuntimeError # Issues 11669 and 31936 - throwing const constructors.
-symbol_reserved_word_test/09: RuntimeError # Issues 11669 and 31936 - throwing const constructors.
-symbol_reserved_word_test/12: RuntimeError # Issues 11669 and 31936 - throwing const constructors.
-symbol_test/none: RuntimeError # Issues 11669 and 31936 - throwing const constructors.
-unicode_test: RuntimeError # Issue 18061: German double S.
-
-[ $compiler == none && $runtime == vm ]
-iterable_to_set_test: RuntimeError # is-checks do not implement strong mode type system
+regexp/pcre_test: Slow # Issue 21593
# We no longer expect Dart2 tests to run with the standalone VM without the new
# common front end, but for now we get better coverage by still running them in
@@ -134,32 +35,9 @@
*: SkipByDesign
[ $runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk) ]
-bit_twiddling_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
-compare_to2_test: RuntimeError, OK # Requires fixed-size int64 support.
-double_ceil_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
-double_floor_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
-double_round_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
-double_truncate_test/int64: RuntimeError, OK # Requires fixed-size int64 support.
-hash_set_test/01: RuntimeError # non JS number semantics - Issue 11551
-int_modulo_arith_test/modPow: RuntimeError # Issue 29921
int_parse_with_limited_ints_test: Skip # Requires fixed-size int64 support.
-integer_arith_vm_test/modPow: RuntimeError # Issues 10245, 30170
-integer_parsed_arith_vm_test: RuntimeError # Issues 10245, 29921
-integer_parsed_div_rem_vm_test: RuntimeError # Issue 29921
-integer_parsed_mul_div_vm_test: RuntimeError # Issue 29921
-regress_r21715_test: RuntimeError # Requires fixed-size int64 support.
typed_data_with_limited_ints_test: Skip # Requires fixed-size int64 support.
-# ===== dartk + vm status lines =====
-[ $runtime == vm && ($compiler == dartk || $compiler == dartkb) ]
-iterable_reduce_test/01: CompileTimeError # Issue 31533
-symbol_operator_test/03: RuntimeError # Issues 11669 and 31936 - throwing const constructors.
-symbol_reserved_word_test/06: RuntimeError # Issues 11669 and 31936 - throwing const constructors.
-symbol_reserved_word_test/09: RuntimeError # Issues 11669 and 31936 - throwing const constructors.
-symbol_reserved_word_test/12: RuntimeError # Issues 11669 and 31936 - throwing const constructors.
-symbol_test/none: RuntimeError # Issues 11669 and 31936 - throwing const constructors.
-unicode_test: RuntimeError # Issue 18061: German double S.
-
[ ($arch == simdbc || $arch == simdbc64) && ($hot_reload || $hot_reload_rollback) ]
uri_parse_test: SkipSlow
@@ -167,108 +45,24 @@
bigint_parse_radix_test: Skip # Issue 31659
bigint_test: Skip # Issue 31659
-[ $arch == simdbc || $arch == simdbc64 ]
-regexp/stack-overflow_test: RuntimeError, OK # Smaller limit with irregex interpreter
-
[ $compiler == dartdevc || $compiler == dartdevk ]
-bigint_from_test: RuntimeError # Issue 32589
bigint_test/03: SkipSlow # modPow is very slow
bigint_test/15: SkipSlow # modPow is very slow
-bit_twiddling_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-compare_to2_test: RuntimeError # Issue 30170
-compare_to2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-date_time10_test: RuntimeError # Issue 29921
-date_time_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-double_ceil_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-double_floor_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-double_round_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-double_truncate_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-error_stack_trace_test/nullThrown: RuntimeError # .stackTrace not present for exception caught from 'throw null;'
-hash_set_test/01: RuntimeError # Issue 29921
-int_from_environment_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_modulo_arith_test/none: RuntimeError # Issue 29921
-int_parse_radix_int64_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_parse_radix_int64_test/02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_parse_radix_int64_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-int_parse_radix_test/01: RuntimeError # Issue 29921
int_parse_with_limited_ints_test: Skip # Requires fixed-size int64 support.
-integer_arith_vm_test/modPow: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-integer_arith_vm_test/modPow: RuntimeError # Issue 30170
-integer_arith_vm_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-integer_parsed_arith_vm_test: RuntimeError # Issue 29921
-integer_to_radix_string_test: RuntimeError # Issue 29921
-integer_to_string_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-integer_to_string_test/01: RuntimeError # Issue 29921
-iterable_return_type_test/02: RuntimeError # Issue 29921
-list_concurrent_modify_test: RuntimeError # DDC uses ES6 array iterators so it does not issue this
-list_removeat_test: RuntimeError # Issue 29921
-main_test: RuntimeError # Issue 29921
-nan_infinity_test/01: RuntimeError # Issue 29921
-regexp/alternative-length-miscalculation_test: RuntimeError # Issue 29921
-regexp/ascii-regexp-subject_test: RuntimeError # Issue 29921
-regexp/bol-with-multiline_test: RuntimeError # Issue 29921
-regexp/capture-3_test: RuntimeError # Issue 29921
-regexp/char-insensitive_test: RuntimeError # Issue 29921
-regexp/character-match-out-of-order_test: RuntimeError # Issue 29921
-regexp/compile-crash_test: RuntimeError # Issue 29921
-regexp/default_arguments_test: RuntimeError # Issue 29921
-regexp/early-acid3-86_test: RuntimeError # Issue 29921
-regexp/ecma-regex-examples_test: RuntimeError # Issue 29921
-regexp/extended-characters-match_test: RuntimeError # Issue 29921
-regexp/extended-characters-more_test: RuntimeError # Issue 29921
-regexp/find-first-asserted_test: RuntimeError # Issue 29921
-regexp/invalid-range-in-class_test: RuntimeError # Issue 29921
-regexp/look-ahead_test: RuntimeError # Issue 29921
-regexp/loop-capture_test: RuntimeError # Issue 29921
-regexp/malformed-escapes_test: RuntimeError # Issue 29921
-regexp/many-brackets_test: RuntimeError # Issue 29921
-regexp/negative-special-characters_test: RuntimeError # Issue 29921
-regexp/no-extensions_test: RuntimeError # Issue 29921
-regexp/non-bmp_test: RuntimeError # Issue 29921
-regexp/non-capturing-backtracking_test: RuntimeError # Issue 29921
-regexp/non-capturing-groups_test: RuntimeError # Issue 29921
-regexp/non-character_test: RuntimeError # Issue 29921
-regexp/non-greedy-parentheses_test: RuntimeError # Issue 29921
-regexp/pcre-test-4_test: RuntimeError # Issue 29921
-regexp/quantified-assertions_test: RuntimeError # Issue 29921
-regexp/range-bound-ffff_test: RuntimeError # Issue 29921
-regexp/range-out-of-order_test: RuntimeError # Issue 29921
-regexp/ranges-and-escaped-hyphens_test: RuntimeError # Issue 29921
-regexp/regress-6-9-regexp_test: RuntimeError # Issue 29921
-regexp/regress-regexp-codeflush_test: RuntimeError # Issue 29921
-regexp/regress-regexp-construct-result_test: RuntimeError # Issue 29921
-regexp/repeat-match-waldemar_test: RuntimeError # Issue 29921
-regexp/results-cache_test: RuntimeError # Issue 29921
-regexp/stack-overflow2_test: RuntimeError # Issue 29921
-regexp/stack-overflow_test: RuntimeError # Issue 29921
-regexp/unicode-handling_test: RuntimeError # Issue 29921
-regexp/zero-length-alternatives_test: RuntimeError # Issue 29921
-regress_r21715_test: RuntimeError # Issue 29921
-string_operations_with_null_test: RuntimeError # Issue 29921
-symbol_operator_test/03: RuntimeError # Issue 29921
-symbol_reserved_word_test/06: RuntimeError # Issue 29921
-symbol_reserved_word_test/09: RuntimeError # Issue 29921
-symbol_reserved_word_test/12: RuntimeError # Issue 29921
-symbol_test/none: RuntimeError # Issue 29921
typed_data_with_limited_ints_test: Skip # Requires fixed-size int64 support.
uri_parse_test: Slow
uri_test: Slow
[ $compiler == dartkb || $compiler == dartkp ]
-bigint_parse_radix_test: Pass, Slow # --no_intrinsify
+bigint_parse_radix_test: Slow # --no_intrinsify
bigint_test/03: SkipSlow # --no_intrinsify
bigint_test/15: SkipSlow # --no_intrinsify
[ $runtime == dart_precompiled || $runtime == vm ]
regexp/global_test: Skip # Issue 21709
regexp/pcre_test: Slow
-string_case_test/01: RuntimeError # Issue 18061: German double S.
-
-[ $runtime == ff || $runtime == jsshell ]
-double_parse_test: Fail, OK # Issue 30468
-double_try_parse_test: Fail, OK # Issue 30468
[ $hot_reload || $hot_reload_rollback ]
bigint_parse_radix_test: Skip # Issue 31659. Issue 34361.
bigint_test: Skip # Issue 31659
-integer_parsed_mul_div_vm_test: Pass, Slow # Slow
+integer_parsed_mul_div_vm_test: Slow # Slow
diff --git a/tests/corelib_2/growable_list_test.dart b/tests/corelib_2/growable_list_test.dart
index 2172710..cea1446 100644
--- a/tests/corelib_2/growable_list_test.dart
+++ b/tests/corelib_2/growable_list_test.dart
@@ -91,7 +91,8 @@
testGrowable(new List<int>.filled(5, null, growable: true));
Expect.throwsArgumentError(() => new List<int>(-1), "-1");
// There must be limits. Fix this test if we ever allow 2^63 elements.
- Expect.throwsArgumentError(() => new List<int>(0x7ffffffffffff000), "bignum");
+ Expect.throws(() => new List<int>(0x7ffffffffffff000),
+ (e) => e is OutOfMemoryError || e is ArgumentError, "bignum");
Expect.throwsArgumentError(() => new List<int>(null), "null");
testThrowsOrTypeError(
() => new List([] as Object), // Cast to avoid warning.
diff --git a/tests/ffi/enable_ffi_test.dart b/tests/ffi/enable_ffi_test.dart
index 1ccb5ec..167c25c 100644
--- a/tests/ffi/enable_ffi_test.dart
+++ b/tests/ffi/enable_ffi_test.dart
@@ -4,17 +4,17 @@
//
// Dart test program for testing the --enable-ffi=false flag.
//
+// Note: In AoT and Android the flag is passed to Dart when executing the
+// precompiled executable, so the error shows up as a runtime error rather than
+// a compile time error.
+//
// VMOptions=--enable-ffi=false
-library FfiTest;
-
-import 'dart:ffi' as ffi; //# 01: compile-time error
-
-import "package:expect/expect.dart";
+import 'dart:ffi'; //# 01: compile-time error, runtime error
void main() {
- ffi.Pointer<ffi.Int64> p = ffi.allocate(); //# 01: compile-time error, runtime error
- p.store(42); //# 01: compile-time error, runtime error
- Expect.equals(42, p.load<int>()); //# 01: compile-time error, runtime error
+ Pointer<Int8> p = //# 01: compile-time error, runtime error
+ Pointer.allocate(); //# 01: compile-time error, runtime error
+ print(p.address); //# 01: compile-time error, runtime error
p.free(); //# 01: compile-time error, runtime error
}
diff --git a/tests/language_2/language_2.status b/tests/language_2/language_2.status
index 9e9b7a4..8902133 100644
--- a/tests/language_2/language_2.status
+++ b/tests/language_2/language_2.status
@@ -2,22 +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.
-[ $compiler == compare_analyzer_cfe ]
-const_native_factory_test: Fail # Issue 29763
-deferred_global_test: Fail # Issue 34503
-generic_field_mixin2_test: Fail # Issue 34489
-generic_local_functions_test: Fail # Issue 28515
-generic_methods_generic_function_parameter_test: Fail # Issue 28515
-issue34488_test/01: Fail # Issue 34488
-issue34488_test/02: Fail # Issue 34488
-issue34488_test/03: Fail # Issue 34488
-issue34488_test/04: Fail # Issue 34488
-issue34488_test/05: Fail # Issue 34488
-issue34488_test/06: Fail # Issue 34488
-issue34488_test/none: Fail # Issue 34488
-mixin_class_from_core_library_test: Fail # Issue 34488
-nested_generic_closure_test: Fail # Issue 28515
-
[ $compiler != dart2analyzer ]
switch_case_warn_test: Skip # Analyzer only, see language_analyzer2.status
@@ -48,11 +32,6 @@
stacktrace_demangle_ctors_test: SkipByDesign # Names are not scrubbed.
type_checks_in_factory_method_test: SkipByDesign # Requires checked mode.
-[ $fasta ]
-partial_instantiation_static_bounds_check_test/01: MissingCompileTimeError # Issue 34327
-partial_instantiation_static_bounds_check_test/02: MissingCompileTimeError # Issue 34327
-partial_instantiation_static_bounds_check_test/03: MissingCompileTimeError # Issue 34327
-
[ $compiler != dart2js && $compiler != dartdevc && !$checked ]
function_type/*: Skip # Needs checked mode.
@@ -60,6 +39,5 @@
built_in_identifier_type_annotation_test/set: Crash # Not supported by legacy VM front-end.
[ $hot_reload || $hot_reload_rollback ]
-issue_22780_test/01: Pass, Crash # Issue 29094
-static_closure_identical_test: Pass, Fail # Closure identity
+issue_22780_test/01: Crash # Issue 29094
vm/optimized_stacktrace_test: Slow
diff --git a/tests/language_2/vm/allocate_overflow_array_test.dart b/tests/language_2/vm/allocate_overflow_array_test.dart
new file mode 100644
index 0000000..39d00d3
--- /dev/null
+++ b/tests/language_2/vm/allocate_overflow_array_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+const interestingLengths = <int>[
+ 0x3FFFFFFF00000000,
+ 0x3FFFFFFFFFFFF000,
+ 0x3FFFFFFFFFFFFF00,
+ 0x3FFFFFFFFFFFFFF0,
+ 0x3FFFFFFFFFFFFFFE,
+ 0x3FFFFFFFFFFFFFFF,
+ 0x7FFFFFFF00000000,
+ 0x7FFFFFFFFFFFF000,
+ 0x7FFFFFFFFFFFFF00,
+ 0x7FFFFFFFFFFFFFF0,
+ 0x7FFFFFFFFFFFFFFE,
+ 0x7FFFFFFFFFFFFFFF,
+];
+
+main() {
+ for (int interestingLength in interestingLengths) {
+ for (int elementLength in <int>[1, 2, 3, 4, 5, 6, 7, 8, 9]) {
+ print(interestingLength ~/ elementLength);
+
+ Expect.throws(() {
+ var array = new List(interestingLength ~/ elementLength);
+ print(array.first);
+ }, (e) => e is OutOfMemoryError);
+ }
+ }
+}
diff --git a/tests/language_2/vm/allocate_overflow_bytearray_test.dart b/tests/language_2/vm/allocate_overflow_bytearray_test.dart
new file mode 100644
index 0000000..9242494
--- /dev/null
+++ b/tests/language_2/vm/allocate_overflow_bytearray_test.dart
@@ -0,0 +1,44 @@
+// Copyright (c) 2019, 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:typed_data';
+
+import 'package:expect/expect.dart';
+
+const interestingLengths = <int>[
+ 0x3FFFFFFF00000000,
+ 0x3FFFFFFFFFFFFFF0,
+ 0x3FFFFFFFFFFFFFFE,
+ 0x3FFFFFFFFFFFFFFF,
+ 0x7FFFFFFF00000000,
+ 0x7FFFFFFFFFFFFFF0,
+ 0x7FFFFFFFFFFFFFFE,
+ 0x7FFFFFFFFFFFFFFF,
+];
+
+main() {
+ for (int interestingLength in interestingLengths) {
+ print(interestingLength);
+
+ Expect.throws(() {
+ var bytearray = new Uint8List(interestingLength);
+ print(bytearray.first);
+ }, (e) => e is OutOfMemoryError);
+
+ Expect.throws(() {
+ var bytearray = new Uint8ClampedList(interestingLength);
+ print(bytearray.first);
+ }, (e) => e is OutOfMemoryError);
+
+ Expect.throws(() {
+ var bytearray = new Int8List(interestingLength);
+ print(bytearray.first);
+ }, (e) => e is OutOfMemoryError);
+
+ Expect.throws(() {
+ var bytearray = new ByteData(interestingLength);
+ print(bytearray.getUint8(0));
+ }, (e) => e is OutOfMemoryError);
+ }
+}
diff --git a/tests/language_2/vm/allocate_overflow_string_test.dart b/tests/language_2/vm/allocate_overflow_string_test.dart
new file mode 100644
index 0000000..f4488a1
--- /dev/null
+++ b/tests/language_2/vm/allocate_overflow_string_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+const interestingLengths = <int>[
+ 0x3FFFFFFF00000000,
+ 0x3FFFFFFFFFFFFFF0,
+ 0x3FFFFFFFFFFFFFFE,
+ 0x3FFFFFFFFFFFFFFF,
+ 0x7FFFFFFF00000000,
+ 0x7FFFFFFFFFFFFFF0,
+ 0x7FFFFFFFFFFFFFFE,
+ 0x7FFFFFFFFFFFFFFF,
+];
+
+main() {
+ for (int interestingLength in interestingLengths) {
+ print(interestingLength);
+
+ Expect.throws(() {
+ var oneByteString = "v";
+ oneByteString *= interestingLength;
+ }, (e) => e is OutOfMemoryError);
+
+ Expect.throws(() {
+ var oneByteString = "v";
+ oneByteString = oneByteString.padLeft(interestingLength);
+ }, (e) => e is OutOfMemoryError);
+
+ Expect.throws(() {
+ var oneByteString = "v";
+ oneByteString = oneByteString.padRight(interestingLength);
+ }, (e) => e is OutOfMemoryError);
+ }
+}
diff --git a/tests/language_2/vm/regression_38412.dart b/tests/language_2/vm/regression_38412.dart
new file mode 100644
index 0000000..b904f05
--- /dev/null
+++ b/tests/language_2/vm/regression_38412.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2019, 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=--optimization_counter_threshold=1
+
+// Found by DartFuzzing: would sometimes fail:
+// https://github.com/dart-lang/sdk/issues/38412
+
+import "package:expect/expect.dart";
+
+import 'dart:async';
+import 'dart:convert';
+
+int fuzzvar1 = -9223372028264841217;
+Map<int, String> fuzzvar8 = {1: "a"};
+
+class X1 {
+ List<int> foo1_0(List<int> par1, String par3) {
+ Expect.equals("not", par3);
+ Expect.equals(10, par1.length);
+ return [1];
+ }
+}
+
+String bar(Map<int, String> o1, int o2) {
+ Expect.equals(1, o1.length);
+ Expect.equals(-9223372028264841218, o2);
+ return "not";
+}
+
+main() {
+ for (int loc0 = 0; loc0 < 7500; loc0++) {
+ "a" == Uri.parse("\u2665");
+ }
+ print('fuzzvar8 runtime type: ${fuzzvar8.runtimeType}');
+ var x =
+ X1().foo1_0([for (int i = 0; i < 10; ++i) 0], bar(fuzzvar8, --fuzzvar1));
+ Expect.equals(1, x[0]);
+}
diff --git a/tests/legacy_status_dart2js.csv b/tests/legacy_status_dart2js.csv
index 5736318..903bfb6 100644
--- a/tests/legacy_status_dart2js.csv
+++ b/tests/legacy_status_dart2js.csv
@@ -409,3 +409,49 @@
$compiler == dart2js && $minified,html/webgl_1_test,Crash,NoSuchMethodError: Class 'JMethod' has no instance getter 'implementation'.,,
$compiler == dart2js && ($runtime == ff || $runtime == safari || $ie),html/custom/attribute_changed_callback_test/unsupported_on_polyfill,Fail,Polyfill does not support,,
$compiler == dart2js && ($runtime == ff || $runtime == safari || $ie),html/custom/entered_left_view_test/viewless_document,Fail,Polyfill does not handle this,,
+$compiler == dart2js,bigint_from_test,RuntimeError,Issue 32589,https://dartbug.com/32589,closed
+$compiler == dart2js,bit_twiddling_test/int64,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,compare_to2_test,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,core_runtime_types_test,RuntimeError,Issue 34147,https://dartbug.com/34147,open
+$compiler == dart2js,date_time11_test,"RuntimeError, Pass","Fails when US is on winter time, issue 31285.",https://dartbug.com/31285,closed
+$compiler == dart2js,double_ceil_test/int64,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,double_floor_test/int64,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,double_round_test/int64,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,double_truncate_test/int64,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,error_stack_trace1_test,RuntimeError,Issue 12399,https://dartbug.com/12399,closed
+$compiler == dart2js,int_from_environment_int64_test,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,int_parse_radix_int64_test/01,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,int_parse_radix_int64_test/02,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,int_parse_radix_int64_test/none,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,integer_arith_vm_test/modPow,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,integer_arith_vm_test/none,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,integer_to_string_test/01,"CompileTimeError, OK","Error if web int literal cannot be represented exactly, see http://dartbug.com/33351",https://dartbug.com/33351,closed
+$compiler == dart2js,iterable_return_type_test/02,RuntimeError,Dart2js does not support Uint64*.,,
+$compiler == dart2js,list_unmodifiable_test,"Pass, RuntimeError",Issue 28712,https://dartbug.com/28712,closed
+$compiler != app_jitk && $compiler != dart2js && $compiler != dartdevc && $compiler != dartdevk && $compiler != dartk && $compiler != dartkb && $compiler != dartkp && $runtime != none,map_keys2_test,RuntimeError,needs Dart 2 is checks,,
+$compiler == dart2js && $runtime == chromeOnAndroid,string_trimlr_test/unicode63,RuntimeError,Uses Unicode 6.2.0 or earlier.,,
+$compiler == dart2js && $runtime == d8,uri_base_test,RuntimeError,D8 uses a custom uri scheme for Uri.base,,
+$compiler == dart2js && !$browser,package_resource_test,RuntimeError,Issue 26842,https://dartbug.com/26842,closed
+$compiler == dart2js && $checked,error_stack_trace1_test,RuntimeError,Issue 12399,https://dartbug.com/12399,closed
+$compiler == dart2js && $checked,iterable_return_type_test/01,RuntimeError,Issue 20085,https://dartbug.com/20085,closed
+$compiler == dart2js && $checked,iterable_return_type_test/02,RuntimeError,Dart2js does not support Uint64*.,,
+$compiler == dart2js && $checked,list_replace_range_test,RuntimeError,Issue 32010,https://dartbug.com/32010,open
+$compiler == dart2js && $checked,symbol_reserved_word_test/03,RuntimeError,"Issue 19972, new Symbol('void') should be allowed.",https://dartbug.com/19972,closed
+$compiler == dart2js && $minified,error_stack_trace1_test,RuntimeError,Issue 12399,https://dartbug.com/12399,closed
+$compiler == dart2js && $minified,iterable_return_type_test/02,RuntimeError,Dart2js does not support Uint64*.,,
+$compiler == dart2js && $minified,list_concurrent_modify_test,RuntimeError,dart2js does not fully implement these,,
+$compiler == dart2js && $minified,nsm_invocation_test,RuntimeError,Symbols don't match due to minifiaction.,,
+$compiler == dart2js && $minified,symbol_reserved_word_test/03,RuntimeError,"Issue 19972, new Symbol('void') should be allowed.",https://dartbug.com/19972,closed
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),bit_twiddling_test/int64,"RuntimeError, OK",Requires fixed-size int64 support.,,
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),compare_to2_test,"RuntimeError, OK",Requires fixed-size int64 support.,,
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),double_ceil_test/int64,"RuntimeError, OK",Requires fixed-size int64 support.,,
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),double_floor_test/int64,"RuntimeError, OK",Requires fixed-size int64 support.,,
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),double_round_test/int64,"RuntimeError, OK",Requires fixed-size int64 support.,,
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),double_truncate_test/int64,"RuntimeError, OK",Requires fixed-size int64 support.,,
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),hash_set_test/01,RuntimeError,non JS number semantics - Issue 11551,https://dartbug.com/11551,open
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),int_modulo_arith_test/modPow,RuntimeError,Issue 29921,https://dartbug.com/29921,closed
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),integer_arith_vm_test/modPow,RuntimeError,"Issues 10245, 30170",,
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),integer_parsed_arith_vm_test,RuntimeError,"Issues 10245, 29921",,
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),integer_parsed_div_rem_vm_test,RuntimeError,Issue 29921,https://dartbug.com/29921,closed
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),integer_parsed_mul_div_vm_test,RuntimeError,Issue 29921,https://dartbug.com/29921,closed
+$runtime != none && ($compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk),regress_r21715_test,RuntimeError,Requires fixed-size int64 support.,,
diff --git a/tests/lib_2/lib_2.status b/tests/lib_2/lib_2.status
index 8aadd79..cde9329 100644
--- a/tests/lib_2/lib_2.status
+++ b/tests/lib_2/lib_2.status
@@ -14,104 +14,32 @@
developer/timeline_test: Skip # Not supported
isolate/issue_24243_parent_isolate_test: Skip # Requires checked mode
-[ $runtime == chrome ]
-html/element_animate_test/timing_dict: RuntimeError # Issue 26730
-
[ $runtime == ff ]
-convert/streamed_conversion_utf8_decode_test: Pass, Slow # Issue 12029
-mirrors/mirrors_reader_test: Timeout, Slow, RuntimeError # Issue 16589
+convert/streamed_conversion_utf8_decode_test: Slow # Issue 12029
+mirrors/mirrors_reader_test: Slow # Issue 16589
[ $runtime == ie11 ]
-html/canvasrenderingcontext2d_test/arc: Pass, Fail # Pixel unexpected value. Please triage this failure.
-html/canvasrenderingcontext2d_test/drawImage_video_element: Fail # IE does not support drawImage w/ video element
-html/canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # IE does not support drawImage w/ video element
-html/custom/document_register_type_extensions_test/single-parameter: Fail # Issue 13193.
-html/element_animate_test: Fail # Element.animate not supported on these browsers.
-html/element_test/click: Fail # IE does not support firing this event.
-html/event_test: RuntimeError # Issue 23437. Only three failures, but hard to break them out.
-html/gamepad_test: Fail # IE does not support Navigator.getGamepads()
-html/indexeddb_5_test: Fail # Issue 12893
-html/js_transferrables_test: RuntimeError # Issue 14246
-html/js_util_test/callConstructor: RuntimeError # Issue 26978
-html/localstorage_test: Pass, RuntimeError # Issue 22166
-html/mediasource_test: Pass, Fail # Windows 8: Supported: yes, functional: no
-html/notification_test: Fail # Notification not supported on IE
-html/postmessage_structured_test: Fail # Does not support the MessageEvent constructor.
html/request_animation_frame_test: Skip # Times out. Issue 22167
-html/storage_test: Pass, RuntimeError # Issue 22166
-html/text_event_test: RuntimeError # Issue 23437
-html/touchevent_test: Fail # IE does not support TouchEvents
-html/transferables_test: Pass, Fail # Issues 20659.
html/transition_event_test: Skip # Times out. Issue 22167
-html/websocket_test: Fail # Issue 7875. Closed with "working as intended".
-html/wheelevent_test: RuntimeError # Issue 23437
-html/worker_test/functional: Pass, Fail # Issues 20659.
-html/xhr_test/json: Fail # IE10 returns string, not JSON object
[ $runtime == safari ]
-html/canvasrenderingcontext2d_test/drawImage_video_element: Fail # Safari does not support drawImage w/ video element
-html/canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Fail # Safari does not support drawImage w/ video element
-html/element_animate_test: Fail # Element.animate not supported on these browsers.
-html/element_test: Pass, Fail # Issue 21434
-html/gamepad_test: Fail # Safari does not support Navigator.getGamepads()
html/indexeddb_1_test/functional: Skip # Times out. Issue 21433
-html/indexeddb_2_test: RuntimeError # Issue 21433
html/indexeddb_3_test: Skip # Times out 1 out of 10.
-html/indexeddb_4_test: RuntimeError # Issue 21433
-html/indexeddb_5_test: RuntimeError # Issue 21433
-html/mediasource_test: Pass, Fail # MediaSource only available on Safari 8 desktop, we can't express that.
-html/webgl_1_test: Pass, Fail # Issue 8219
html/worker_api_test: Skip # Issue 13221
-typed_data/float32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
-typed_data/int32x4_test: Fail, Pass # Safari has an optimization bug (nightlies are already fine).
[ $system == windows ]
html/xhr_test/xhr: Skip # Times out. Issue 21527
-[ $browser ]
-async/periodic_timer2_test: Pass, RuntimeError # Flaky. Issue 32094
-async/periodic_timer3_test: Pass, RuntimeError # Flaky. Issue 32094
-async/periodic_timer4_test: Pass, RuntimeError # Flaky. Issue 32094
-
[ $csp ]
isolate/deferred_in_isolate2_test: Skip # Issue 16898. Deferred loading does not work from an isolate in CSP-mode
-[ $hot_reload ]
-async/stream_periodic4_test: Pass, RuntimeError # Issue 30904
-mirrors/dynamic_load_test: RuntimeError # Issue 26869 - Reload fails to preserve library identity
-
-[ $jscl ]
-isolate/spawn_uri_multi_test/none: RuntimeError # Issue 13544
-
-[ $builder_tag == mac10_7 && $runtime == safari ]
-typed_data/setRange_2_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-typed_data/setRange_3_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-typed_data/setRange_4_test: Fail # Safari doesn't fully implement spec for TypedArray.set
-
-[ $compiler == dartk && $system == macos && $hot_reload && ($arch == simdbc || $arch == simdbc64) ]
-isolate/unresolved_ports_test: Pass, RuntimeError # Issue 35410
-
-[ $compiler == none && $mode == product ]
-mirrors/library_enumeration_deferred_loading_test: RuntimeError, OK # Deferred loaded eagerly
-mirrors/library_import_deferred_loading_test: RuntimeError, OK # Deferred loaded eagerly
-mirrors/load_library_test: RuntimeError, OK # Deferred loaded eagerly
-
-[ $compiler == none && !$checked ]
-mirrors/reflected_type_generics_test/02: Fail, OK # Type check for a bounded type argument.
-
[ $runtime == chrome && $system == linux ]
mirrors/native_class_test: Slow
[ $runtime == chrome && $system == macos ]
-async/catch_errors11_test: Pass, Timeout # Issue 22696
-async/slow_consumer_test: Pass, Timeout # Issue 22696
-async/timer_isActive_test: Fail, Pass, Timeout # Issue 22696
convert/streamed_conversion_utf8_encode_test: SkipSlow # Times out. Issue 22050
html/canvasrenderingcontext2d_test/drawImage_video_element: Skip # Times out. Please triage this failure.
html/canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Skip # Times out. Please triage this failure.
-html/custom_element_method_clash_test: Pass, Timeout # Issue 26789
-html/custom_element_name_clash_test: Pass, Timeout # Issue 26789
-html/custom_elements_test: Pass, Timeout # Issue 26789
html/request_animation_frame_test: Skip # Times out. Issue 22167
html/transition_event_test: Skip # Times out. Issue 22167
@@ -134,16 +62,12 @@
[ $mode == product || $runtime != vm ]
isolate/checked_test: Skip # Unsupported.
-[ $runtime == chrome || $runtime == chromeOnAndroid ]
-html/webgl_1_test: Pass, Fail # Issue 8219
-
[ $runtime == chrome || $runtime == ff ]
async/slow_consumer2_test: SkipSlow # Times out. Issue 22050
async/stream_timeout_test: SkipSlow # Times out. Issue 22050
[ $runtime == dart_precompiled || $runtime == vm ]
isolate/isolate_stress_test: Skip # Issue 12588: Uses dart:html. This should be able to pass when we have wrapper-less tests.
-isolate/stacktrace_message_test: RuntimeError # Fails to send stacktrace object.
# It makes no sense to run any test that uses spawnURI under the simulator
# as that would involve running CFE (the front end) in simulator mode
@@ -186,15 +110,12 @@
isolate/unresolved_ports_test: Skip # Isolate.spawnUri
[ $hot_reload || $hot_reload_rollback ]
-async/stream_transformer_test: Pass, Fail # Closure identity
convert/chunked_conversion_utf88_test: SkipSlow
convert/utf85_test: SkipSlow
isolate/deferred_in_isolate2_test: Crash # Requires deferred libraries
isolate/deferred_in_isolate_test: Crash # Requires deferred libraries
-isolate/function_send_test: Pass, Fail # Closure identity
isolate/issue_21398_parent_isolate2_test: Crash # Requires deferred libraries
-isolate/message3_test/fun: Pass, Fail # Closure identity
-isolate/spawn_uri_nested_vm_test: Pass, Crash # Issue 28192
+isolate/spawn_uri_nested_vm_test: Crash # Issue 28192
mirrors/closurization_equivalence_test: SkipByDesign # Method equality
mirrors/deferred_constraints_constants_test: Crash # Requires deferred libraries
mirrors/deferred_mirrors_metadata_test: Crash # Deferred loading
diff --git a/tests/lib_2/wasm/basic_test.dart b/tests/lib_2/wasm/basic_test.dart
index 4ab1e7c..b6dfaa9 100644
--- a/tests/lib_2/wasm/basic_test.dart
+++ b/tests/lib_2/wasm/basic_test.dart
@@ -20,9 +20,7 @@
0x7e, 0x0b,
]);
- var inst = WasmModule(data).instantiate(WasmImports()
- ..addMemory("env", "memory", WasmMemory(256, 1024))
- ..addGlobal<Int32>("env", "__memory_base", 1024, false));
+ var inst = WasmModule(data).instantiate(WasmImports());
var fn = inst.lookupFunction<Int64 Function(Int64)>("square");
int n = fn.call([1234]);
diff --git a/tests/lib_2/wasm/fn_call_error_test.dart b/tests/lib_2/wasm/fn_call_error_test.dart
index db696d7..932afa3 100644
--- a/tests/lib_2/wasm/fn_call_error_test.dart
+++ b/tests/lib_2/wasm/fn_call_error_test.dart
@@ -20,9 +20,7 @@
0x7e, 0x0b,
]);
- var inst = WasmModule(data).instantiate(WasmImports()
- ..addMemory("env", "memory", WasmMemory(256, 1024))
- ..addGlobal<Int32>("env", "__memory_base", 1024, false));
+ var inst = WasmModule(data).instantiate(WasmImports());
var fn = inst.lookupFunction<Int64 Function(Int64)>("square");
Expect.throwsArgumentError(() => fn.call([]));
diff --git a/tests/lib_2/wasm/fn_import_test.dart b/tests/lib_2/wasm/fn_import_test.dart
index 8172c20..a9f9bdb 100644
--- a/tests/lib_2/wasm/fn_import_test.dart
+++ b/tests/lib_2/wasm/fn_import_test.dart
@@ -26,8 +26,6 @@
int report_y = -1;
var inst = WasmModule(data).instantiate(WasmImports()
- ..addMemory("env", "memory", WasmMemory(256, 1024))
- ..addGlobal<Int32>("env", "__memory_base", 1024, false)
..addFunction<Void Function(Int64, Int64)>("env", "report", (int x, int y) {
report_x = x;
report_y = y;
diff --git a/tests/lib_2/wasm/fn_mismatch_error_test.dart b/tests/lib_2/wasm/fn_mismatch_error_test.dart
index 01e825b..413260e 100644
--- a/tests/lib_2/wasm/fn_mismatch_error_test.dart
+++ b/tests/lib_2/wasm/fn_mismatch_error_test.dart
@@ -20,9 +20,7 @@
0x7e, 0x0b,
]);
- var inst = WasmModule(data).instantiate(WasmImports()
- ..addMemory("env", "memory", WasmMemory(256, 1024))
- ..addGlobal<Int32>("env", "__memory_base", 1024, false));
+ var inst = WasmModule(data).instantiate(WasmImports());
Expect.isNotNull(inst.lookupFunction<Int64 Function(Int64)>("square"));
Expect.throwsArgumentError(
() => inst.lookupFunction<Int64 Function(Int64)>("blah"));
diff --git a/tests/lib_2/wasm/hello_world_test.dart b/tests/lib_2/wasm/hello_world_test.dart
new file mode 100644
index 0000000..c4441e3
--- /dev/null
+++ b/tests/lib_2/wasm/hello_world_test.dart
@@ -0,0 +1,205 @@
+// Copyright (c) 2019, 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.
+
+// Test for hello world built using emscripten with WASI.
+
+import "package:expect/expect.dart";
+import "dart:wasm";
+import "dart:typed_data";
+
+void main() {
+ // Hello world module generated by emscripten+WASI. Exports a function like
+ // `void _start()`, and prints using `int fd_write(int, int, int, int)`.
+ var data = Uint8List.fromList([
+ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x33, 0x09, 0x60,
+ 0x03, 0x7f, 0x7f, 0x7f, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f,
+ 0x01, 0x7f, 0x60, 0x00, 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x60,
+ 0x01, 0x7f, 0x01, 0x7f, 0x60, 0x03, 0x7f, 0x7e, 0x7f, 0x01, 0x7e, 0x60,
+ 0x00, 0x01, 0x7f, 0x60, 0x01, 0x7f, 0x00, 0x60, 0x03, 0x7f, 0x7f, 0x7f,
+ 0x00, 0x02, 0x1a, 0x01, 0x0d, 0x77, 0x61, 0x73, 0x69, 0x5f, 0x75, 0x6e,
+ 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x08, 0x66, 0x64, 0x5f, 0x77, 0x72,
+ 0x69, 0x74, 0x65, 0x00, 0x01, 0x03, 0x0f, 0x0e, 0x03, 0x04, 0x00, 0x03,
+ 0x02, 0x07, 0x05, 0x04, 0x03, 0x06, 0x02, 0x02, 0x08, 0x00, 0x04, 0x05,
+ 0x01, 0x70, 0x01, 0x04, 0x04, 0x05, 0x06, 0x01, 0x01, 0x80, 0x02, 0x80,
+ 0x02, 0x06, 0x09, 0x01, 0x7f, 0x01, 0x41, 0xc0, 0x95, 0xc0, 0x02, 0x0b,
+ 0x07, 0x2e, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00,
+ 0x11, 0x5f, 0x5f, 0x77, 0x61, 0x73, 0x6d, 0x5f, 0x63, 0x61, 0x6c, 0x6c,
+ 0x5f, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x00, 0x05, 0x04, 0x6d, 0x61, 0x69,
+ 0x6e, 0x00, 0x04, 0x06, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x00, 0x0b,
+ 0x09, 0x09, 0x01, 0x00, 0x41, 0x01, 0x0b, 0x03, 0x08, 0x0e, 0x07, 0x0a,
+ 0xae, 0x0c, 0x0e, 0xbf, 0x01, 0x01, 0x05, 0x7f, 0x41, 0x80, 0x08, 0x21,
+ 0x04, 0x02, 0x40, 0x20, 0x01, 0x28, 0x02, 0x10, 0x22, 0x02, 0x04, 0x7f,
+ 0x20, 0x02, 0x05, 0x20, 0x01, 0x10, 0x02, 0x0d, 0x01, 0x20, 0x01, 0x28,
+ 0x02, 0x10, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x14, 0x22, 0x05, 0x6b, 0x20,
+ 0x00, 0x49, 0x04, 0x40, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20, 0x00, 0x20,
+ 0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x0f, 0x0b, 0x02, 0x40, 0x20,
+ 0x01, 0x2c, 0x00, 0x4b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x20, 0x00, 0x21,
+ 0x03, 0x03, 0x40, 0x20, 0x03, 0x22, 0x02, 0x45, 0x0d, 0x01, 0x20, 0x02,
+ 0x41, 0x7f, 0x6a, 0x22, 0x03, 0x41, 0x80, 0x08, 0x6a, 0x2d, 0x00, 0x00,
+ 0x41, 0x0a, 0x47, 0x0d, 0x00, 0x0b, 0x20, 0x01, 0x41, 0x80, 0x08, 0x20,
+ 0x02, 0x20, 0x01, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x22, 0x03, 0x20,
+ 0x02, 0x49, 0x0d, 0x01, 0x20, 0x00, 0x20, 0x02, 0x6b, 0x21, 0x00, 0x20,
+ 0x02, 0x41, 0x80, 0x08, 0x6a, 0x21, 0x04, 0x20, 0x01, 0x28, 0x02, 0x14,
+ 0x21, 0x05, 0x20, 0x02, 0x21, 0x06, 0x0b, 0x20, 0x05, 0x20, 0x04, 0x20,
+ 0x00, 0x10, 0x03, 0x1a, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x14, 0x20,
+ 0x00, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x06, 0x6a, 0x21, 0x03,
+ 0x0b, 0x20, 0x03, 0x0b, 0x59, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x20, 0x00,
+ 0x2d, 0x00, 0x4a, 0x22, 0x01, 0x41, 0x7f, 0x6a, 0x20, 0x01, 0x72, 0x3a,
+ 0x00, 0x4a, 0x20, 0x00, 0x28, 0x02, 0x00, 0x22, 0x01, 0x41, 0x08, 0x71,
+ 0x04, 0x40, 0x20, 0x00, 0x20, 0x01, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
+ 0x41, 0x7f, 0x0f, 0x0b, 0x20, 0x00, 0x42, 0x00, 0x37, 0x02, 0x04, 0x20,
+ 0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02, 0x1c, 0x20,
+ 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01, 0x20, 0x00,
+ 0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x41, 0x00, 0x0b, 0x82, 0x04,
+ 0x01, 0x03, 0x7f, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x4f, 0x04, 0x40,
+ 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x10, 0x0d, 0x20, 0x00, 0x0f, 0x0b,
+ 0x20, 0x00, 0x20, 0x02, 0x6a, 0x21, 0x03, 0x02, 0x40, 0x20, 0x00, 0x20,
+ 0x01, 0x73, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x02, 0x40, 0x20, 0x02,
+ 0x41, 0x01, 0x48, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b,
+ 0x20, 0x00, 0x41, 0x03, 0x71, 0x45, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02,
+ 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02, 0x03, 0x40, 0x20, 0x02, 0x20,
+ 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a,
+ 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02, 0x20, 0x03, 0x4f,
+ 0x0d, 0x01, 0x20, 0x02, 0x41, 0x03, 0x71, 0x0d, 0x00, 0x0b, 0x0b, 0x02,
+ 0x40, 0x20, 0x03, 0x41, 0x7c, 0x71, 0x22, 0x04, 0x41, 0xc0, 0x00, 0x49,
+ 0x0d, 0x00, 0x20, 0x02, 0x20, 0x04, 0x41, 0x40, 0x6a, 0x22, 0x05, 0x4b,
+ 0x0d, 0x00, 0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36,
+ 0x02, 0x00, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x04, 0x36, 0x02, 0x04,
+ 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x08, 0x36, 0x02, 0x08, 0x20, 0x02,
+ 0x20, 0x01, 0x28, 0x02, 0x0c, 0x36, 0x02, 0x0c, 0x20, 0x02, 0x20, 0x01,
+ 0x28, 0x02, 0x10, 0x36, 0x02, 0x10, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
+ 0x14, 0x36, 0x02, 0x14, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x18, 0x36,
+ 0x02, 0x18, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x1c, 0x36, 0x02, 0x1c,
+ 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x20, 0x36, 0x02, 0x20, 0x20, 0x02,
+ 0x20, 0x01, 0x28, 0x02, 0x24, 0x36, 0x02, 0x24, 0x20, 0x02, 0x20, 0x01,
+ 0x28, 0x02, 0x28, 0x36, 0x02, 0x28, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02,
+ 0x2c, 0x36, 0x02, 0x2c, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x30, 0x36,
+ 0x02, 0x30, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x34, 0x36, 0x02, 0x34,
+ 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x38, 0x36, 0x02, 0x38, 0x20, 0x02,
+ 0x20, 0x01, 0x28, 0x02, 0x3c, 0x36, 0x02, 0x3c, 0x20, 0x01, 0x41, 0x40,
+ 0x6b, 0x21, 0x01, 0x20, 0x02, 0x41, 0x40, 0x6b, 0x22, 0x02, 0x20, 0x05,
+ 0x4d, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x04, 0x4f, 0x0d, 0x01,
+ 0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x28, 0x02, 0x00, 0x36, 0x02, 0x00,
+ 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x04, 0x6a,
+ 0x22, 0x02, 0x20, 0x04, 0x49, 0x0d, 0x00, 0x0b, 0x0c, 0x01, 0x0b, 0x20,
+ 0x03, 0x41, 0x04, 0x49, 0x04, 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01,
+ 0x0b, 0x20, 0x03, 0x41, 0x7c, 0x6a, 0x22, 0x04, 0x20, 0x00, 0x49, 0x04,
+ 0x40, 0x20, 0x00, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x21, 0x02,
+ 0x03, 0x40, 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00,
+ 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x3a, 0x00, 0x01, 0x20, 0x02,
+ 0x20, 0x01, 0x2d, 0x00, 0x02, 0x3a, 0x00, 0x02, 0x20, 0x02, 0x20, 0x01,
+ 0x2d, 0x00, 0x03, 0x3a, 0x00, 0x03, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21,
+ 0x01, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x22, 0x02, 0x20, 0x04, 0x4d, 0x0d,
+ 0x00, 0x0b, 0x0b, 0x20, 0x02, 0x20, 0x03, 0x49, 0x04, 0x40, 0x03, 0x40,
+ 0x20, 0x02, 0x20, 0x01, 0x2d, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x20, 0x01,
+ 0x41, 0x01, 0x6a, 0x21, 0x01, 0x20, 0x02, 0x41, 0x01, 0x6a, 0x22, 0x02,
+ 0x20, 0x03, 0x47, 0x0d, 0x00, 0x0b, 0x0b, 0x20, 0x00, 0x0b, 0x06, 0x00,
+ 0x10, 0x0c, 0x41, 0x00, 0x0b, 0x03, 0x00, 0x01, 0x0b, 0x7e, 0x01, 0x03,
+ 0x7f, 0x23, 0x00, 0x41, 0x10, 0x6b, 0x22, 0x01, 0x24, 0x00, 0x20, 0x01,
+ 0x41, 0x0a, 0x3a, 0x00, 0x0f, 0x02, 0x40, 0x20, 0x00, 0x28, 0x02, 0x10,
+ 0x22, 0x02, 0x45, 0x04, 0x40, 0x20, 0x00, 0x10, 0x02, 0x0d, 0x01, 0x20,
+ 0x00, 0x28, 0x02, 0x10, 0x21, 0x02, 0x0b, 0x02, 0x40, 0x20, 0x00, 0x28,
+ 0x02, 0x14, 0x22, 0x03, 0x20, 0x02, 0x4f, 0x0d, 0x00, 0x20, 0x00, 0x2c,
+ 0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00, 0x20, 0x03, 0x41,
+ 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20, 0x03, 0x41, 0x0a, 0x3a, 0x00, 0x00,
+ 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0f, 0x6a, 0x41, 0x01,
+ 0x20, 0x00, 0x28, 0x02, 0x24, 0x11, 0x00, 0x00, 0x41, 0x01, 0x47, 0x0d,
+ 0x00, 0x20, 0x01, 0x2d, 0x00, 0x0f, 0x1a, 0x0b, 0x20, 0x01, 0x41, 0x10,
+ 0x6a, 0x24, 0x00, 0x0b, 0x04, 0x00, 0x42, 0x00, 0x0b, 0x04, 0x00, 0x41,
+ 0x00, 0x0b, 0x31, 0x01, 0x01, 0x7f, 0x20, 0x00, 0x21, 0x02, 0x20, 0x02,
+ 0x02, 0x7f, 0x20, 0x01, 0x28, 0x02, 0x4c, 0x41, 0x7f, 0x4c, 0x04, 0x40,
+ 0x20, 0x02, 0x20, 0x01, 0x10, 0x01, 0x0c, 0x01, 0x0b, 0x20, 0x02, 0x20,
+ 0x01, 0x10, 0x01, 0x0b, 0x22, 0x01, 0x46, 0x04, 0x40, 0x20, 0x00, 0x0f,
+ 0x0b, 0x20, 0x01, 0x0b, 0x62, 0x01, 0x03, 0x7f, 0x41, 0x80, 0x08, 0x21,
+ 0x00, 0x03, 0x40, 0x20, 0x00, 0x22, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x00,
+ 0x20, 0x01, 0x28, 0x02, 0x00, 0x22, 0x02, 0x41, 0x7f, 0x73, 0x20, 0x02,
+ 0x41, 0xff, 0xfd, 0xfb, 0x77, 0x6a, 0x71, 0x41, 0x80, 0x81, 0x82, 0x84,
+ 0x78, 0x71, 0x45, 0x0d, 0x00, 0x0b, 0x02, 0x40, 0x20, 0x02, 0x41, 0xff,
+ 0x01, 0x71, 0x45, 0x04, 0x40, 0x20, 0x01, 0x21, 0x00, 0x0c, 0x01, 0x0b,
+ 0x03, 0x40, 0x20, 0x01, 0x2d, 0x00, 0x01, 0x21, 0x02, 0x20, 0x01, 0x41,
+ 0x01, 0x6a, 0x22, 0x00, 0x21, 0x01, 0x20, 0x02, 0x0d, 0x00, 0x0b, 0x0b,
+ 0x20, 0x00, 0x41, 0x80, 0x08, 0x6b, 0x0b, 0x0c, 0x00, 0x02, 0x7f, 0x41,
+ 0x00, 0x41, 0x00, 0x10, 0x04, 0x0b, 0x1a, 0x0b, 0x66, 0x01, 0x02, 0x7f,
+ 0x41, 0x90, 0x08, 0x28, 0x02, 0x00, 0x22, 0x00, 0x28, 0x02, 0x4c, 0x41,
+ 0x00, 0x4e, 0x04, 0x7f, 0x41, 0x01, 0x05, 0x20, 0x01, 0x0b, 0x1a, 0x02,
+ 0x40, 0x41, 0x7f, 0x41, 0x00, 0x10, 0x0a, 0x22, 0x01, 0x20, 0x01, 0x20,
+ 0x00, 0x10, 0x09, 0x47, 0x1b, 0x41, 0x00, 0x48, 0x0d, 0x00, 0x02, 0x40,
+ 0x20, 0x00, 0x2d, 0x00, 0x4b, 0x41, 0x0a, 0x46, 0x0d, 0x00, 0x20, 0x00,
+ 0x28, 0x02, 0x14, 0x22, 0x01, 0x20, 0x00, 0x28, 0x02, 0x10, 0x4f, 0x0d,
+ 0x00, 0x20, 0x00, 0x20, 0x01, 0x41, 0x01, 0x6a, 0x36, 0x02, 0x14, 0x20,
+ 0x01, 0x41, 0x0a, 0x3a, 0x00, 0x00, 0x0c, 0x01, 0x0b, 0x20, 0x00, 0x10,
+ 0x06, 0x0b, 0x0b, 0x3d, 0x01, 0x01, 0x7f, 0x20, 0x02, 0x04, 0x40, 0x03,
+ 0x40, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0x41, 0x80, 0xc0, 0x00, 0x20,
+ 0x02, 0x41, 0x80, 0xc0, 0x00, 0x49, 0x1b, 0x22, 0x03, 0x10, 0x03, 0x21,
+ 0x00, 0x20, 0x01, 0x41, 0x80, 0x40, 0x6b, 0x21, 0x01, 0x20, 0x00, 0x41,
+ 0x80, 0x40, 0x6b, 0x21, 0x00, 0x20, 0x02, 0x20, 0x03, 0x6b, 0x22, 0x02,
+ 0x0d, 0x00, 0x0b, 0x0b, 0x0b, 0xb1, 0x02, 0x01, 0x06, 0x7f, 0x23, 0x00,
+ 0x41, 0x20, 0x6b, 0x22, 0x03, 0x24, 0x00, 0x20, 0x03, 0x20, 0x00, 0x28,
+ 0x02, 0x1c, 0x22, 0x04, 0x36, 0x02, 0x10, 0x20, 0x00, 0x28, 0x02, 0x14,
+ 0x21, 0x05, 0x20, 0x03, 0x20, 0x02, 0x36, 0x02, 0x1c, 0x20, 0x03, 0x20,
+ 0x01, 0x36, 0x02, 0x18, 0x20, 0x03, 0x20, 0x05, 0x20, 0x04, 0x6b, 0x22,
+ 0x01, 0x36, 0x02, 0x14, 0x20, 0x01, 0x20, 0x02, 0x6a, 0x21, 0x06, 0x41,
+ 0x02, 0x21, 0x05, 0x20, 0x03, 0x41, 0x10, 0x6a, 0x21, 0x01, 0x03, 0x40,
+ 0x02, 0x40, 0x02, 0x7f, 0x20, 0x06, 0x02, 0x7f, 0x20, 0x00, 0x28, 0x02,
+ 0x3c, 0x20, 0x01, 0x20, 0x05, 0x20, 0x03, 0x41, 0x0c, 0x6a, 0x10, 0x00,
+ 0x04, 0x40, 0x20, 0x03, 0x41, 0x7f, 0x36, 0x02, 0x0c, 0x41, 0x7f, 0x0c,
+ 0x01, 0x0b, 0x20, 0x03, 0x28, 0x02, 0x0c, 0x0b, 0x22, 0x04, 0x46, 0x04,
+ 0x40, 0x20, 0x00, 0x20, 0x00, 0x28, 0x02, 0x2c, 0x22, 0x01, 0x36, 0x02,
+ 0x1c, 0x20, 0x00, 0x20, 0x01, 0x36, 0x02, 0x14, 0x20, 0x00, 0x20, 0x01,
+ 0x20, 0x00, 0x28, 0x02, 0x30, 0x6a, 0x36, 0x02, 0x10, 0x20, 0x02, 0x0c,
+ 0x01, 0x0b, 0x20, 0x04, 0x41, 0x7f, 0x4a, 0x0d, 0x01, 0x20, 0x00, 0x41,
+ 0x00, 0x36, 0x02, 0x1c, 0x20, 0x00, 0x42, 0x00, 0x37, 0x03, 0x10, 0x20,
+ 0x00, 0x20, 0x00, 0x28, 0x02, 0x00, 0x41, 0x20, 0x72, 0x36, 0x02, 0x00,
+ 0x41, 0x00, 0x20, 0x05, 0x41, 0x02, 0x46, 0x0d, 0x00, 0x1a, 0x20, 0x02,
+ 0x20, 0x01, 0x28, 0x02, 0x04, 0x6b, 0x0b, 0x21, 0x04, 0x20, 0x03, 0x41,
+ 0x20, 0x6a, 0x24, 0x00, 0x20, 0x04, 0x0f, 0x0b, 0x20, 0x01, 0x41, 0x08,
+ 0x6a, 0x20, 0x01, 0x20, 0x04, 0x20, 0x01, 0x28, 0x02, 0x04, 0x22, 0x07,
+ 0x4b, 0x22, 0x08, 0x1b, 0x22, 0x01, 0x20, 0x04, 0x20, 0x07, 0x41, 0x00,
+ 0x20, 0x08, 0x1b, 0x6b, 0x22, 0x07, 0x20, 0x01, 0x28, 0x02, 0x00, 0x6a,
+ 0x36, 0x02, 0x00, 0x20, 0x01, 0x20, 0x01, 0x28, 0x02, 0x04, 0x20, 0x07,
+ 0x6b, 0x36, 0x02, 0x04, 0x20, 0x06, 0x20, 0x04, 0x6b, 0x21, 0x06, 0x20,
+ 0x05, 0x20, 0x08, 0x6b, 0x21, 0x05, 0x0c, 0x00, 0x00, 0x0b, 0x00, 0x0b,
+ 0x0b, 0x4d, 0x06, 0x00, 0x41, 0x80, 0x08, 0x0b, 0x12, 0x68, 0x65, 0x6c,
+ 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x00, 0x00,
+ 0x00, 0x18, 0x04, 0x00, 0x41, 0x98, 0x08, 0x0b, 0x01, 0x05, 0x00, 0x41,
+ 0xa4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xbc, 0x08, 0x0b, 0x0e, 0x02,
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x41, 0xd4, 0x08, 0x0b, 0x01, 0x01, 0x00, 0x41, 0xe3, 0x08,
+ 0x0b, 0x05, 0x0a, 0xff, 0xff, 0xff, 0xff,
+ ]);
+
+ WasmMemory mem = null;
+ String out = "";
+ var getI32 = (int p) {
+ // Read a little-endian I32.
+ int n = 0;
+ for (var i = p + 3; i >= p; --i) {
+ n *= 256;
+ n += mem[i];
+ }
+ return n;
+ };
+ var inst = WasmModule(data).instantiate(WasmImports()
+ ..addFunction<Int32 Function(Int32, Int32, Int32, Int32)>(
+ "wasi_unstable", "fd_write",
+ (int fd, int iovs, int iovs_len, int unused) {
+ // iovs points to an array of length iovs_len. Each element is two I32s,
+ // a char* and a length.
+ String o = "";
+ for (var i = 0; i < iovs_len; ++i) {
+ var str = getI32(iovs + 8 * i);
+ var len = getI32(iovs + 4 + 8 * i);
+ for (var j = 0; j < len; ++j) {
+ o += String.fromCharCode(mem[str + j]);
+ }
+ }
+ out += o;
+ return o.length;
+ }));
+ mem = inst.memory;
+
+ var fn = inst.lookupFunction<Void Function()>("_start");
+ fn.call([]);
+ Expect.equals("hello, world!\n", out);
+}
diff --git a/tests/lib_2/wasm/import_error_test.dart b/tests/lib_2/wasm/import_error_test.dart
index 071dc4b..a06a3a9 100644
--- a/tests/lib_2/wasm/import_error_test.dart
+++ b/tests/lib_2/wasm/import_error_test.dart
@@ -10,6 +10,8 @@
void main() {
var imp = WasmImports();
+ imp.addGlobal<Int64>("env", "x", 123, false);
+ imp.addGlobal<Double>("env", "y", 4.56, true);
Expect.throwsArgumentError(() => imp.addGlobal<int>("env", "a", 1, true));
Expect.throwsArgumentError(() => imp.addGlobal<double>("env", "b", 2, true));
Expect.throwsArgumentError(() => imp.addGlobal<dynamic>("env", "c", 3, true));
diff --git a/tests/lib_2/wasm/numerics_test.dart b/tests/lib_2/wasm/numerics_test.dart
index 6255d20..8651caa 100644
--- a/tests/lib_2/wasm/numerics_test.dart
+++ b/tests/lib_2/wasm/numerics_test.dart
@@ -29,9 +29,7 @@
0x01, 0x92, 0x0b,
]);
- var inst = WasmModule(data).instantiate(WasmImports()
- ..addMemory("env", "memory", WasmMemory(256, 1024))
- ..addGlobal<Int32>("env", "__memory_base", 1024, false));
+ var inst = WasmModule(data).instantiate(WasmImports());
var addI64 = inst.lookupFunction<Int64 Function(Int64, Int64)>("addI64");
var addI32 = inst.lookupFunction<Int32 Function(Int32, Int32)>("addI32");
var addF64 = inst.lookupFunction<Double Function(Double, Double)>("addF64");
diff --git a/tests/lib_2/wasm/void_test.dart b/tests/lib_2/wasm/void_test.dart
index 210c9b0..fe3bd94 100644
--- a/tests/lib_2/wasm/void_test.dart
+++ b/tests/lib_2/wasm/void_test.dart
@@ -25,9 +25,7 @@
0x80, 0x08, 0x0b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
]);
- var inst = WasmModule(data).instantiate(WasmImports()
- ..addMemory("env", "memory", WasmMemory(256, 1024))
- ..addGlobal<Int32>("env", "__memory_base", 1024, false));
+ var inst = WasmModule(data).instantiate(WasmImports());
var setFn = inst.lookupFunction<Void Function(Int64, Int64)>("set");
var getFn = inst.lookupFunction<Int64 Function()>("get");
Expect.isNull(setFn.call([123, 456]));
diff --git a/tests/modular/diamond/a.dart b/tests/modular/diamond/a.dart
new file mode 100644
index 0000000..63956ec
--- /dev/null
+++ b/tests/modular/diamond/a.dart
@@ -0,0 +1,3 @@
+import 'b.dart';
+
+var item = b;
diff --git a/tests/modular/diamond/b.dart b/tests/modular/diamond/b.dart
new file mode 100644
index 0000000..07a55aa
--- /dev/null
+++ b/tests/modular/diamond/b.dart
@@ -0,0 +1,3 @@
+class B {}
+
+var b = new B();
diff --git a/tests/modular/diamond/main.dart b/tests/modular/diamond/main.dart
new file mode 100644
index 0000000..a112564
--- /dev/null
+++ b/tests/modular/diamond/main.dart
@@ -0,0 +1,6 @@
+import 'b.dart';
+import 'a.dart';
+
+main() {
+ print([item, b]);
+}
diff --git a/tests/modular/diamond/modules.yaml b/tests/modular/diamond/modules.yaml
new file mode 100644
index 0000000..2fd373c
--- /dev/null
+++ b/tests/modular/diamond/modules.yaml
@@ -0,0 +1,3 @@
+dependencies:
+ main: [a, b]
+ a: b
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index 7f28264..066fe56 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -9,17 +9,6 @@
io/non_utf8_directory_test: Skip # Issue 33519. Temp files causing bots to go purple.
io/non_utf8_file_test: Skip # Issue 33519. Temp files causing bots to go purple.
io/non_utf8_link_test: Skip # Issue 33519. Temp files causing bots to go purple.
-io/raw_socket_test: Pass, RuntimeError # Issue 28288
-issue14236_test: Pass # Do not remove this line. It serves as a marker for Issue 14516 comment #4.
-package/invalid_uri_test: Fail, OK # CompileTimeErrors intentionally
-package/package1_test: Fail # imports 'package:foo.dart' which is no longer valid
-package/package_test: Fail # imports 'package:foo.dart' which is no longer valid
-package/scenarios/empty_packages_file/empty_packages_file_discovery_test: Fail, OK # CompileTimeErrors intentionally
-package/scenarios/empty_packages_file/empty_packages_file_option_test: Fail, OK # CompileTimeErrors intentionally
-package/scenarios/invalid/invalid_package_name_test: RuntimeError, CompileTimeError # Errors intentionally
-package/scenarios/invalid/same_package_twice_test.dart: RuntimeError, CompileTimeError # Errors intentionally
-package/scenarios/packages_dir_only/packages_dir_only_test: Fail # Confirm this no longer works for now. TODO(mfairhurst): delete this test.
-package/scenarios/packages_file_strange_formatting/empty_package_dir_test: Fail, OK # CompileTimeErrors intentionally
packages_file_test: Skip # Issue 26715
packages_file_test/none: Skip # contains no tests.
@@ -75,23 +64,18 @@
[ $compiler != none && $runtime != dart_precompiled && $runtime != vm ]
env_test: Skip # This is testing a vm command line parsing scenario.
-no_assert_test: Fail, OK # This is testing a vm flag.
[ $mode == product && $runtime == dart_precompiled ]
dwarf_stack_trace_test: SkipByDesign # Due to instruction canonicalization we can end up having the wrong names in stack traces.
-[ $mode == release && $runtime == vm && $system == macos ]
-io/named_pipe_script_test: Pass, RuntimeError # Issue 28737
-
[ $runtime == vm && $system == linux ]
-io/http_basic_test: Pass, Slow, Timeout # Issue 28046, These tests might be slow on an opt counter threshold bot. They also time out on the bot occasionally => flaky test issue 28046
-io/http_launch_test: Pass, Slow, Timeout # Issue 28046, These tests might be slow on an opt counter threshold bot. They also time out on the bot occasionally => flaky test issue 28046
+io/http_basic_test: Slow # Issue 28046, These tests might be slow on an opt counter threshold bot. They also time out on the bot occasionally => flaky test issue 28046
+io/http_launch_test: Slow # Issue 28046, These tests might be slow on an opt counter threshold bot. They also time out on the bot occasionally => flaky test issue 28046
[ $system == macos && ($runtime == dart_precompiled || $runtime == vm) ]
-io/raw_secure_server_socket_test: Pass, Crash # Issue 29524
+io/raw_secure_server_socket_test: Crash
io/raw_server_socket_cancel_test: Skip # Issue 28182 # This test sometimes hangs on Mac.
io/secure_server_client_certificate_test: Skip # Re-enable once the bots have been updated. Issue #26057
-io/socket_connect_stream_data_close_cancel_test: Pass, Timeout # Issue 27453
io/socket_many_connections_test: Skip # This test fails with "Too many open files" on the Mac OS buildbot. This is expected as MacOS by default runs with a very low number of allowed open files ('ulimit -n' says something like 256).
[ $arch == arm || $arch == arm64 || $runtime != vm || $mode == debug && $system == windows ]
@@ -105,17 +89,11 @@
[ $runtime == dart_precompiled || $runtime == vm ]
deferred_transitive_import_error_test: Skip
-io/https_client_certificate_test: RuntimeError # Issue 24070 Failures in secure networking while NSS is replaced with BoringSSL
-io/non_utf8_output_test: NonUtf8Output, OK # This test checks that the test runner correctly detects and reports non-utf8 output from a test.
-io/secure_socket_bad_data_test: RuntimeError # An error in a secure connection just puts a READ_CLOSED on the stream, rather than signaling an error on the stream.
-package/package_isolate_test: Fail # Issue 12474
-package/scenarios/invalid/same_package_twice_test: Pass # Issue 24119
[ $hot_reload || $hot_reload_rollback ]
-fragmentation_test: Pass, Crash # Issue 31421
-io/addlatexhash_test: Pass, Crash # Issue 31252
+fragmentation_test: Crash # Issue 31421
+io/addlatexhash_test: Crash # Issue 31252
io/many_directory_operations_test: SkipSlow
io/many_file_operations_test: SkipSlow
-io/raw_datagram_read_all_test: Pass, Fail # Timing dependent.
package/*: SkipByDesign # Launches VMs in interesting ways.
typed_data_isolate_test: SkipSlow
diff --git a/tools/VERSION b/tools/VERSION
index f4e2a13..72b118c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -33,7 +33,7 @@
MAJOR 2
MINOR 6
PATCH 0
-PRERELEASE 4
+PRERELEASE 5
PRERELEASE_PATCH 0
ABI_VERSION 16
OLDEST_SUPPORTED_ABI_VERSION 16
diff --git a/tools/bots/aot_smoke_tests.dart b/tools/bots/aot_smoke_tests.dart
index a035361..fba0c9d 100755
--- a/tools/bots/aot_smoke_tests.dart
+++ b/tools/bots/aot_smoke_tests.dart
@@ -38,7 +38,7 @@
test("dart2aot: Can compile and run AOT", () async {
await withTempDir((String tmp) async {
final String testCode = path.join('tools', 'bots', 'dart_aot_test.dart');
- final String tmpAot = path.join(tmp, 'dart_aot_test.dart.aot');
+ final String tmpAot = path.join(tmp, 'dart_aot_test.aot');
{
final ProcessResult result =
@@ -62,7 +62,7 @@
test("dart2native: Can compile and run AOT", () async {
await withTempDir((String tmp) async {
final String testCode = path.join('tools', 'bots', 'dart_aot_test.dart');
- final String tmpAot = path.join(tmp, 'dart_aot_test.dart.aot');
+ final String tmpAot = path.join(tmp, 'dart_aot_test.aot');
{
final ProcessResult result = await Process.run(dart2native,
diff --git a/tools/bots/bot.py b/tools/bots/bot.py
index e371239..4f7b4c5 100644
--- a/tools/bots/bot.py
+++ b/tools/bots/bot.py
@@ -45,7 +45,9 @@
on several different runtimes.
- builder_tag: A tag indicating a special builder setup.
- cps_ir: Run the compiler with the cps based backend
+ - use_nnbd: Whether to use the NNBD fork of the SDK.
"""
+ # TODO: Remove use_nnbd when the fork is merged back in.
def __init__(self,
compiler,
@@ -64,7 +66,8 @@
dart2js_full=False,
builder_tag=None,
batch=False,
- cps_ir=False):
+ cps_ir=False,
+ use_nnbd=False):
self.compiler = compiler
self.runtime = runtime
self.mode = mode
@@ -81,6 +84,7 @@
self.builder_tag = builder_tag
self.batch = batch
self.cps_ir = cps_ir
+ self.use_nnbd = use_nnbd
if (arch == None):
self.arch = 'ia32'
else:
@@ -268,11 +272,20 @@
"""
Runs the test package's runner on the package at 'path'.
"""
+ # TODO(38701): Once bots are set up to run NNBD configurations, update
+ # the various name parsing functions to detect that and pass "use_nnbd" to
+ # the BuildInfo() constructor.
+
sdk_bin = os.path.join(
bot_utils.DART_DIR,
- utils.GetBuildSdkBin(BUILD_OS, build_info.mode, build_info.arch))
+ utils.GetBuildSdkBin(BUILD_OS, build_info.mode, build_info.arch,
+ build_info.use_nnbd))
- build_root = utils.GetBuildRoot(BUILD_OS, build_info.mode, build_info.arch)
+ build_root = utils.GetBuildRoot(
+ BUILD_OS,
+ build_info.mode,
+ build_info.arch,
+ use_nnbd=build_info.use_nnbd)
dart_name = 'dart.exe' if build_info.system == 'windows' else 'dart'
dart_bin = os.path.join(sdk_bin, dart_name)
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 201302b..1cc16e0 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -227,6 +227,7 @@
"pkg/async_helper/",
"pkg/build_integration/",
"pkg/dart_internal/",
+ "pkg/dart2native/",
"pkg/expect/",
"pkg/front_end/",
"pkg/js/",
diff --git a/tools/build.py b/tools/build.py
index 904c6560..6eef99c 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -63,6 +63,13 @@
help='Target OSs (comma-separated).',
metavar='[all,host,android]',
default='host')
+ # TODO(38701): Remove this and everything that references it once the
+ # forked NNBD SDK is merged back in.
+ result.add_option(
+ "--nnbd",
+ help='Use the NNBD fork of the SDK.',
+ default=False,
+ action='store_true')
result.add_option(
"-v",
"--verbose",
@@ -200,7 +207,7 @@
return True
-def RunGNIfNeeded(out_dir, target_os, mode, arch):
+def RunGNIfNeeded(out_dir, target_os, mode, arch, use_nnbd):
if os.path.isfile(os.path.join(out_dir, 'args.gn')):
return
gn_os = 'host' if target_os == HOST_OS else target_os
@@ -215,6 +222,9 @@
gn_os,
'-v',
]
+ if use_nnbd:
+ gn_command.append('--nnbd')
+
process = subprocess.Popen(gn_command)
process.wait()
if process.returncode != 0:
@@ -268,12 +278,12 @@
# Returns a tuple (build_config, command to run, whether goma is used)
def BuildOneConfig(options, targets, target_os, mode, arch):
- build_config = utils.GetBuildConf(mode, arch, target_os)
- out_dir = utils.GetBuildRoot(HOST_OS, mode, arch, target_os)
+ build_config = utils.GetBuildConf(mode, arch, target_os, options.nnbd)
+ out_dir = utils.GetBuildRoot(HOST_OS, mode, arch, target_os, options.nnbd)
using_goma = False
# TODO(zra): Remove auto-run of gn, replace with prompt for user to run
# gn.py manually.
- RunGNIfNeeded(out_dir, target_os, mode, arch)
+ RunGNIfNeeded(out_dir, target_os, mode, arch, options.nnbd)
command = ['ninja', '-C', out_dir]
if options.verbose:
command += ['-v']
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index dff4c0e..82358dc 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -72,6 +72,7 @@
extension-methods:
help: "Extension Methods"
+ enabledIn: '2.6.0'
non-nullable:
help: "Non Nullable by default"
diff --git a/tools/gn.py b/tools/gn.py
index 5cdcc3e..2b023a3 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -66,8 +66,9 @@
return args.split()
-def GetOutDir(mode, arch, target_os):
- return utils.GetBuildRoot(HOST_OS, mode, arch, target_os)
+# TODO(38701): Remove use_nnbd once the forked NNBD SDK is merged back in.
+def GetOutDir(mode, arch, target_os, use_nnbd):
+ return utils.GetBuildRoot(HOST_OS, mode, arch, target_os, use_nnbd)
def ToCommandLine(gn_args):
@@ -166,7 +167,8 @@
return True
-def ToGnArgs(args, mode, arch, target_os):
+# TODO(38701): Remove use_nnbd once the forked NNBD SDK is merged back in.
+def ToGnArgs(args, mode, arch, target_os, use_nnbd):
gn_args = {}
host_os = HostOsForGn(HOST_OS)
@@ -284,6 +286,8 @@
gn_args['dart_debug_optimization_level'] = args.debug_opt_level
gn_args['debug_optimization_level'] = args.debug_opt_level
+ gn_args['use_nnbd'] = use_nnbd
+
return gn_args
@@ -385,6 +389,12 @@
help='Target OSs (comma-separated).',
metavar='[all,host,android]',
default='host')
+ # TODO(38701): Remove this once the forked NNBD SDK is merged back in.
+ common_group.add_argument(
+ "--nnbd",
+ help='Use the NNBD fork of the SDK.',
+ default=False,
+ action='store_true')
common_group.add_argument(
"-v",
"--verbose",
@@ -533,12 +543,13 @@
for target_os in args.os:
for mode in args.mode:
for arch in args.arch:
- out_dir = GetOutDir(mode, arch, target_os)
+ out_dir = GetOutDir(mode, arch, target_os, args.nnbd)
# TODO(infra): Re-enable --check. Many targets fail to use
# public_deps to re-expose header files to their dependents.
# See dartbug.com/32364
command = [gn, 'gen', out_dir]
- gn_args = ToCommandLine(ToGnArgs(args, mode, arch, target_os))
+ gn_args = ToCommandLine(
+ ToGnArgs(args, mode, arch, target_os, args.nnbd))
gn_args += GetGNArgs(args)
if args.verbose:
print("gn gen --check in %s" % out_dir)
diff --git a/tools/utils.py b/tools/utils.py
index 2eb4289..085236a 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -308,32 +308,42 @@
(target_os != GuessOS()))
-def GetBuildConf(mode, arch, conf_os=None):
+# TODO(38701): Remove use_nnbd once the forked NNBD SDK is merged back in.
+def GetBuildConf(mode, arch, conf_os=None, use_nnbd=False):
+ nnbd = "NNBD" if use_nnbd else ""
if conf_os == 'android':
- return '%s%s%s' % (GetBuildMode(mode), conf_os.title(), arch.upper())
+ return '%s%s%s%s' % (GetBuildMode(mode), conf_os.title(), arch.upper(),
+ nnbd)
else:
# Ask for a cross build if the host and target architectures don't match.
host_arch = ARCH_GUESS
cross_build = ''
if GetArchFamily(host_arch) != GetArchFamily(arch):
cross_build = 'X'
- return '%s%s%s' % (GetBuildMode(mode), cross_build, arch.upper())
+ return '%s%s%s%s' % (GetBuildMode(mode), cross_build, arch.upper(),
+ nnbd)
def GetBuildDir(host_os):
return BUILD_ROOT[host_os]
-def GetBuildRoot(host_os, mode=None, arch=None, target_os=None):
+# TODO(38701): Remove use_nnbd once the forked NNBD SDK is merged back in.
+def GetBuildRoot(host_os, mode=None, arch=None, target_os=None, use_nnbd=False):
build_root = GetBuildDir(host_os)
if mode:
- build_root = os.path.join(build_root, GetBuildConf(
- mode, arch, target_os))
+ build_root = os.path.join(build_root,
+ GetBuildConf(mode, arch, target_os, use_nnbd))
return build_root
-def GetBuildSdkBin(host_os, mode=None, arch=None, target_os=None):
- build_root = GetBuildRoot(host_os, mode, arch, target_os)
+# TODO(38701): Remove use_nnbd once the forked NNBD SDK is merged back in.
+def GetBuildSdkBin(host_os,
+ mode=None,
+ arch=None,
+ target_os=None,
+ use_nnbd=False):
+ build_root = GetBuildRoot(host_os, mode, arch, target_os, use_nnbd)
return os.path.join(build_root, 'dart-sdk', 'bin')
diff --git a/utils/bazel/kernel_worker.dart b/utils/bazel/kernel_worker.dart
index 8662ed1..f80450c 100644
--- a/utils/bazel/kernel_worker.dart
+++ b/utils/bazel/kernel_worker.dart
@@ -269,7 +269,6 @@
}
}
- // TODO(sigmund): add support for experiments with the incremental compiler.
state = await fe.initializeIncrementalCompiler(
previousState,
{