Version 2.0.0-dev.65.0
Merge commit '12971f37a982f42c3e65e51dde4bfb9bc866f7aa' into dev
diff --git a/.packages b/.packages
index 5e2e043..e09d3e7 100644
--- a/.packages
+++ b/.packages
@@ -35,7 +35,6 @@
dartdoc:third_party/pkg/dartdoc/lib
dev_compiler:pkg/dev_compiler/lib
expect:pkg/expect/lib
-fasta:pkg/fasta/lib
fixnum:third_party/pkg/fixnum/lib
front_end:pkg/front_end/lib
func:third_party/pkg/func/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8c27cf3..723a2e4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,18 @@
+## 2.0.0-dev.65.0
+
+### Tool Changes
+
+#### dartfmt
+
+ * Add `--fix` to remove unneeded `new` and `const` keywords, and change `:`
+ to `=` before named parameter default values.
+ * Change formatting rules around static methods to uniformly format code with
+ and without `new` and `const`.
+
+#### Pub
+
+ * Pub no longer supports running with `DART_VM_OPTIONS=--no-preview-dart2`.
+
## 2.0.0-dev.64.1
### Language
diff --git a/DEPS b/DEPS
index c1107d7..e7712ec 100644
--- a/DEPS
+++ b/DEPS
@@ -61,7 +61,7 @@
"cli_util_tag" : "0.1.2+1",
"collection_tag": "1.14.10",
"convert_tag": "2.0.1",
- "crypto_tag" : "2.0.2+1",
+ "crypto_tag" : "2.0.5",
"csslib_tag" : "0.14.1",
"dart2js_info_tag" : "0.5.6+4",
@@ -77,9 +77,9 @@
# minutes later.
#
# For more details, see https://github.com/dart-lang/sdk/issues/30164
- "dart_style_tag": "1.0.14", # Please see the note above before updating.
+ "dart_style_tag": "1.1.0", # Please see the note above before updating.
- "dartdoc_tag" : "v0.20.0",
+ "dartdoc_tag" : "v0.20.1",
"fixnum_tag": "0.10.5",
"func_rev": "25eec48146a58967d75330075ab376b3838b18a8",
"glob_tag": "1.1.5",
@@ -102,7 +102,7 @@
"mockito_tag": "d39ac507483b9891165e422ec98d9fb480037c8b",
"mustache4dart_tag" : "v2.1.2",
"oauth2_tag": "1.1.0",
- "observatory_pub_packages_rev": "d3a3aebefbd35aa30fe7bbc2889b772b398f7d7f",
+ "observatory_pub_packages_rev": "caf0aecfb15077fc7a34d48e9df13606c793fddf",
"package_config_tag": "1.0.3",
"package_resolver_tag": "1.0.2+1",
"path_tag": "1.5.1",
@@ -110,9 +110,9 @@
"ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
"pool_tag": "1.3.4",
"protobuf_tag": "0.7.1",
- "pub_rev": "c84ffa0265fe746824aa6f382cb6c41abc406d42",
+ "pub_rev": "2258022cb7fd6ec43900d3b88012efb268020019",
"pub_semver_tag": "1.4.1",
- "quiver_tag": "5aaa3f58c48608af5b027444d561270b53f15dbf",
+ "quiver_tag": "0.29.0",
"resource_rev":"af5a5bf65511943398146cf146e466e5f0b95cb9",
"root_certificates_rev": "16ef64be64c7dfdff2b9f4b910726e635ccc519e",
"shelf_static_rev": "v0.2.7",
diff --git a/build/dart/dart_action.gni b/build/dart/dart_action.gni
index 77a0130..91f5e293 100644
--- a/build/dart/dart_action.gni
+++ b/build/dart/dart_action.gni
@@ -144,6 +144,11 @@
"--packages=" + rebase_path(invoker.packages),
]
}
+ if (defined(invoker.dfe)) {
+ args += [
+ "--dfe=" + rebase_path(invoker.dfe),
+ ]
+ }
if (defined(invoker.script)) {
args += [ rebase_path(invoker.script) ]
}
@@ -219,9 +224,12 @@
forward_variables_from(invoker, "*")
if (_is_fuchsia) {
binary = prebuilt_dart
+ dfe = "$prebuilt_dart_sdk/bin/snapshots/kernel-service.dart.snapshot"
} else {
binary =
"$_dart_root/tools/sdks/$host_os/dart-sdk/bin/dart$executable_suffix"
+ dfe =
+ "$_dart_root/tools/sdks/$host_os/dart-sdk/bin/snapshots/kernel-service.dart.snapshot"
}
target = "$_dart_root/runtime/bin:dart_bootstrap"
}
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index 9ab7861..bad2ba0 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -3989,10 +3989,12 @@
.
{\bf stringContentTDQ:}\~{}( `$\backslash$' $|$ `{\escapegrammar \texttt{"""}}' $|$ `\$');
+ `$\backslash$' \~{}( NEWLINE );
stringInterpolation
.
{\bf stringContentTSQ:}\~{}( `$\backslash$' $|$ `{\escapegrammar \code{'}\code{'}\code{'}}' $|$ `\$');
+ `$\backslash$' \~{}( NEWLINE );
stringInterpolation
.
@@ -5697,12 +5699,15 @@
\end{grammar}
\LMHash{}
-Evaluation of a cascaded method invocation expression $e$ of the form \code{$e$..\metavar{suffix}} proceeds as follows:
+Evaluation of a cascaded method invocation expression $c$ of the form \code{$e$..\metavar{suffix}} proceeds as follows:
Evaluate $e$ to an object $o$.
Let $t$ be a fresh variable bound to $o$.
Evaluate \code{$t$.\metavar{suffix}} to an object.
-Then $e$ evaluates to $o$.
+Then $c$ evaluates to $o$.
+
+\LMHash{}
+The static type of $c$ is the static type of $e$.
\rationale{
With the introduction of null-aware conditional assignable expressions (\ref{assignableExpressions}), it would make sense to extend cascades with a null-aware conditional form as well.
diff --git a/pkg/analysis_server/test/integration/analysis/error_test.dart b/pkg/analysis_server/test/integration/analysis/error_test.dart
index f7974b4..ad440e8 100644
--- a/pkg/analysis_server/test/integration/analysis/error_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/error_test.dart
@@ -107,19 +107,11 @@
@override
@failingTest
- test_detect_simple_error() {
- return super.test_detect_simple_error();
- }
-
- @override
- @failingTest
test_super_mixins_disabled() {
- // Disabling super mixins is not supported in the new FE.
return super.test_super_mixins_disabled();
}
@override
- @failingTest
test_super_mixins_enabled() {
return super.test_super_mixins_enabled();
}
diff --git a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
index 981e904..a4912ac 100644
--- a/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_errors_test.dart
@@ -40,10 +40,4 @@
class GetErrorsTest_UseCFE extends GetErrorsTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_getErrors() {
- return super.test_getErrors();
- }
}
diff --git a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
index 7a10b8a..655fa65 100644
--- a/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_imported_elements_test.dart
@@ -145,16 +145,4 @@
extends AnalysisGetImportedElementsIntegrationTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_getImportedElements_none() {
- return super.test_getImportedElements_none();
- }
-
- @failingTest
- @override
- test_getImportedElements_some() {
- return super.test_getImportedElements_some();
- }
}
diff --git a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
index 96995ae..667c92e 100644
--- a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
@@ -79,6 +79,6 @@
@override
@failingTest
test_navigation_no_result() {
- fail('This test crashes with CFE');
+ fail('Test fails with CFE');
}
}
diff --git a/pkg/analysis_server/test/integration/analysis/lint_test.dart b/pkg/analysis_server/test/integration/analysis/lint_test.dart
index ae9649d..d217042 100644
--- a/pkg/analysis_server/test/integration/analysis/lint_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/lint_test.dart
@@ -87,22 +87,4 @@
class LintIntegrationTest_UseCFE extends LintIntegrationTest {
@override
bool get useCFE => true;
-
- @override
- @failingTest
- test_no_lints_when_not_specified() {
- return super.test_no_lints_when_not_specified();
- }
-
- @override
- @failingTest
- test_simple_lint_newOptionsFile() {
- return super.test_simple_lint_newOptionsFile();
- }
-
- @override
- @failingTest
- test_simple_lint_oldOptionsFile() {
- return super.test_simple_lint_oldOptionsFile();
- }
}
diff --git a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
index eeda63a..5174ef4 100644
--- a/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/occurrences_test.dart
@@ -71,10 +71,4 @@
class OccurrencesTest_UseCFE extends OccurrencesTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_occurrences() {
- return super.test_occurrences();
- }
}
diff --git a/pkg/analysis_server/test/integration/analysis/outline_test.dart b/pkg/analysis_server/test/integration/analysis/outline_test.dart
index 6192813..5a4a07f 100644
--- a/pkg/analysis_server/test/integration/analysis/outline_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/outline_test.dart
@@ -75,10 +75,4 @@
class OutlineTest_UseCFE extends OutlineTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_outline() {
- return super.test_outline();
- }
}
diff --git a/pkg/analysis_server/test/integration/analysis/overrides_test.dart b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
index 2cfb696..eebfc59 100644
--- a/pkg/analysis_server/test/integration/analysis/overrides_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/overrides_test.dart
@@ -127,9 +127,6 @@
@override
bool get useCFE => true;
- @failingTest
@override
- test_overrides() {
- return super.test_overrides();
- }
+ test_overrides() => super.test_overrides();
}
diff --git a/pkg/analysis_server/test/integration/analysis/package_root_test.dart b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
index 08c2d8d..5cca2f0 100644
--- a/pkg/analysis_server/test/integration/analysis/package_root_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/package_root_test.dart
@@ -83,10 +83,4 @@
class SetAnalysisRootsTest_UseCFE extends SetAnalysisRootsTest {
@override
bool get useCFE => true;
-
- @override
- @failingTest
- test_package_root() {
- return super.test_package_root();
- }
}
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
index 0cb0424..ac80f32 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_concurrent_test.dart
@@ -59,6 +59,6 @@
@failingTest
@override
test_reanalyze_concurrent() {
- fail('This test crashes under the CFE');
+ fail('Test fails with CFE');
}
}
diff --git a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
index 27a4c81..44e1830 100644
--- a/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/reanalyze_test.dart
@@ -48,6 +48,6 @@
@failingTest
@override
test_reanalyze() {
- fail('This test crashes under the CFE');
+ fail('Test fails with CFE');
}
}
diff --git a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
index dfbbe69..f9ebcb0 100644
--- a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
@@ -36,10 +36,4 @@
class SetAnalysisRootsTest_UseCFE extends SetAnalysisRootsTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_options() {
- return super.test_options();
- }
}
diff --git a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
index bbd07a0..1a0920e 100644
--- a/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_general_subscriptions_test.dart
@@ -50,6 +50,6 @@
@failingTest
@override
test_options() {
- fail('This test crashes under the CFE');
+ fail('Test fails with CFE');
}
}
diff --git a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
index 64aeb6d..439f5aa 100644
--- a/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_priority_files_test.dart
@@ -38,6 +38,6 @@
@failingTest
@override
test_options() {
- fail('This test crashes under the CFE');
+ fail('Test fails with CFE');
}
}
diff --git a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
index c1fcead..02dcd05 100644
--- a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
@@ -36,10 +36,4 @@
class SetSubscriptionsTest_UseCFE extends SetSubscriptionsTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_subscriptions() {
- return super.test_subscriptions();
- }
}
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
index 42ef868..e1bf7d7 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_list_test.dart
@@ -60,7 +60,7 @@
@override
@failingTest
test_updateContent_list() {
- // TODO(devoncarew): Class '_CompileTimeError' not found in library 'dart:core'.
+ // TODO(devoncarew): at character offset 2550: Bad state: Data already stored for offset -1.
return super.test_updateContent_list();
}
}
diff --git a/pkg/analysis_server/test/integration/analysis/update_content_test.dart b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
index 2c084a5..8174832 100644
--- a/pkg/analysis_server/test/integration/analysis/update_content_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/update_content_test.dart
@@ -110,16 +110,4 @@
class UpdateContentTest_UseCFE extends UpdateContentTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_updateContent() {
- return super.test_updateContent();
- }
-
- @failingTest
- @override
- test_updateContent_multipleAdds() {
- return super.test_updateContent_multipleAdds();
- }
}
diff --git a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
index b5087a9..75dad25 100644
--- a/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
+++ b/pkg/analysis_server/test/integration/completion/get_suggestions_test.dart
@@ -121,22 +121,4 @@
class GetSuggestionsTest_UseCFE extends GetSuggestionsTest {
@override
bool get useCFE => true;
-
- @override
- @failingTest
- test_getSuggestions() {
- return super.test_getSuggestions();
- }
-
- @override
- @failingTest
- test_getSuggestions_onlyOverlay() {
- return super.test_getSuggestions_onlyOverlay();
- }
-
- @override
- @failingTest
- test_getSuggestions_onlyOverlay_noWait() {
- return super.test_getSuggestions_onlyOverlay_noWait();
- }
}
diff --git a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
index 260ab07..0d359f6 100644
--- a/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_available_refactorings_test.dart
@@ -41,10 +41,4 @@
class GetAvailableRefactoringsTest_UseCFE extends GetAvailableRefactoringsTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_has_refactorings() {
- return super.test_has_refactorings();
- }
}
diff --git a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
index 6fd7413..c0e52b7 100644
--- a/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_fixes_test.dart
@@ -70,10 +70,4 @@
@override
@failingTest
Future test_has_fixes() => super.test_has_fixes();
-
- @failingTest
- @override
- test_no_fixes() {
- fail('Test crashes with CFE');
- }
}
diff --git a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
index 7d7faba..8e34a3b 100644
--- a/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
+++ b/pkg/analysis_server/test/integration/edit/get_postfix_completion_test.dart
@@ -56,10 +56,4 @@
class GetPostfixCompletionTest_UseCFE extends GetPostfixCompletionTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_postfix_completion() {
- return super.test_postfix_completion();
- }
}
diff --git a/pkg/analysis_server/test/integration/edit/import_elements_test.dart b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
index e565a1e..da142fc 100644
--- a/pkg/analysis_server/test/integration/edit/import_elements_test.dart
+++ b/pkg/analysis_server/test/integration/edit/import_elements_test.dart
@@ -144,22 +144,4 @@
extends AnalysisGetImportElementsIntegrationTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_importElements_definingUnit() {
- return super.test_importElements_definingUnit();
- }
-
- @failingTest
- @override
- test_importElements_noEdits() {
- return super.test_importElements_noEdits();
- }
-
- @failingTest
- @override
- test_importElements_part() {
- return super.test_importElements_part();
- }
}
diff --git a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
index 4dbf569..32f59cb 100644
--- a/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
+++ b/pkg/analysis_server/test/integration/edit/is_postfix_completion_applicable_test.dart
@@ -46,10 +46,4 @@
extends IsPostfixCompletionApplicableTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_is_postfix_completion_applicable() {
- return super.test_is_postfix_completion_applicable();
- }
}
diff --git a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
index a9009c7..3caf5f80 100644
--- a/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
+++ b/pkg/analysis_server/test/integration/edit/list_postfix_completion_templates_test.dart
@@ -46,10 +46,4 @@
extends ListPostfixCompletionTemplatesTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_list_postfix_completion_templates() {
- fail('Test crashes with CFE');
- }
}
diff --git a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
index a30d913..4d519e9 100644
--- a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
+++ b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
@@ -80,22 +80,4 @@
class OrganizeDirectivesTest_UseCFE extends OrganizeDirectivesTest {
@override
bool get useCFE => true;
-
- @failingTest
- @override
- test_organize_directives() {
- return super.test_organize_directives();
- }
-
- @failingTest
- @override
- test_organize_directives_no_changes() {
- return super.test_organize_directives_no_changes();
- }
-
- @failingTest
- @override
- test_organize_directives_with_errors() {
- return super.test_organize_directives_with_errors();
- }
}
diff --git a/pkg/analysis_server/test/integration/execution/delete_context_test.dart b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
index 07904fd..3cf0e19 100644
--- a/pkg/analysis_server/test/integration/execution/delete_context_test.dart
+++ b/pkg/analysis_server/test/integration/execution/delete_context_test.dart
@@ -47,10 +47,4 @@
class DeleteContextTest_UseCFE extends DeleteContextTest {
@override
bool get useCFE => true;
-
- @override
- @failingTest
- test_delete() {
- fail('Test crashes with CFE');
- }
}
diff --git a/pkg/analysis_server/test/integration/execution/map_uri_test.dart b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
index d0c886c..9990a23 100644
--- a/pkg/analysis_server/test/integration/execution/map_uri_test.dart
+++ b/pkg/analysis_server/test/integration/execution/map_uri_test.dart
@@ -44,10 +44,4 @@
class MapUriTest_UseCFE extends MapUriTest {
@override
bool get useCFE => true;
-
- @override
- @failingTest
- test_mapUri() {
- fail('Test crashes with CFE');
- }
}
diff --git a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
index 234fd49..823ac4d 100644
--- a/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
+++ b/pkg/analysis_server/test/integration/kythe/get_kythe_entries_test.dart
@@ -43,10 +43,4 @@
class GetKytheEntriesTest_UseCFE extends GetKytheEntriesTest {
@override
bool get useCFE => true;
-
- @override
- @failingTest
- test_getKytheEntries() {
- return super.test_getKytheEntries();
- }
}
diff --git a/pkg/analysis_server/test/integration/search/find_element_references_test.dart b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
index 4f1cdd7..f5cf5a6 100644
--- a/pkg/analysis_server/test/integration/search/find_element_references_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_element_references_test.dart
@@ -79,12 +79,5 @@
@override
@failingTest
- test_badTarget() {
- fail('Test times out with CFE.');
- }
-
- @override
- @failingTest
- // TODO(devoncarew): 'NoSuchMethodError: The getter 'source' was called on null'
- Future test_findReferences() => new Future.error('failing test');
+ Future test_findReferences() => fail('Test fails with CFE');
}
diff --git a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
index bdab78a..38f0c67 100644
--- a/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
+++ b/pkg/analysis_server/test/integration/search/find_member_declarations_test.dart
@@ -55,10 +55,4 @@
class FindMemberDeclarationsTest_UseCFE extends FindMemberDeclarationsTest {
@override
bool get useCFE => true;
-
- @override
- @failingTest
- test_findMemberDeclarations() {
- fail('Test times out with CFE.');
- }
}
diff --git a/pkg/analysis_server/test/integration/server/status_test.dart b/pkg/analysis_server/test/integration/server/status_test.dart
index 231aa4f..dab8eaa 100644
--- a/pkg/analysis_server/test/integration/server/status_test.dart
+++ b/pkg/analysis_server/test/integration/server/status_test.dart
@@ -54,10 +54,4 @@
class StatusTest_UseCFE extends StatusTest {
@override
bool get useCFE => true;
-
- @override
- @failingTest
- test_status() {
- fail('This test crashes CFE');
- }
}
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index a34bf60..ac71287 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -6,7 +6,7 @@
* Defines the AST model. The AST (Abstract Syntax Tree) model describes the
* syntactic (as opposed to semantic) structure of Dart code. The semantic
* structure of the code is modeled by the
- * [element model](../element/element.dart).
+ * [element model](../dart_element_element/dart_element_element-library.html).
*
* An AST consists of nodes (instances of a subclass of [AstNode]). The nodes
* are organized in a tree structure in which the children of a node are the
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 8af9b7d..60afc67 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -5,11 +5,13 @@
/**
* Defines the element model. The element model describes the semantic (as
* opposed to syntactic) structure of Dart code. The syntactic structure of the
- * code is modeled by the [AST structure](../ast/ast.dart).
+ * code is modeled by the [AST
+ * structure](../analyzer.dart.ast.ast/analyzer.dart.ast.ast-library.html).
*
* The element model consists of two closely related kinds of objects: elements
* (instances of a subclass of [Element]) and types. This library defines the
- * elements, the types are defined in [type.dart](type.dart).
+ * elements, the types are defined in
+ * [type.dart](../dart_element_type/dart_element_type-library.html).
*
* Generally speaking, an element represents something that is declared in the
* code, such as a class, method, or variable. Elements are organized in a tree
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index 64c8606..7467480 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -4,9 +4,10 @@
/**
* Defines the type model. The type model is part of the
- * [element model](element.dart) in that most types are defined by Dart code
- * (the types `dynamic` and `void` being the notable exceptions). All types are
- * represented by an instance of a subclass of [DartType].
+ * [element model](../dart_element_element/dart_element_element-library.html)
+ * in that most types are defined by Dart code (the types `dynamic` and `void`
+ * being the notable exceptions). All types are represented by an instance of a
+ * subclass of [DartType].
*
* Other than `dynamic` and `void`, all of the types define either the interface
* defined by a class (an instance of [InterfaceType]) or the type of a function
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index a47d7a0..1557389 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -129,6 +129,8 @@
CompileTimeErrorCode.FIELD_INITIALIZER_REDIRECTING_CONSTRUCTOR,
CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES,
CompileTimeErrorCode.GENERIC_FUNCTION_TYPED_PARAM_UNSUPPORTED,
+ CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND,
+ CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT,
CompileTimeErrorCode.GETTER_AND_METHOD_WITH_SAME_NAME,
CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS,
CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
diff --git a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
index a1845c1..03f505c 100644
--- a/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/frontend_resolution.dart
@@ -61,13 +61,13 @@
/// The wrapper around FrontEnd compiler that can be used incrementally.
///
/// When the client needs the kernel, resolution information, and errors for
-/// a library, it should call [compile]. The compiler will compile the library
+/// a library, it should call [getResolution]. The compiler will compile the library
/// and the transitive closure of its dependencies. The results are cached,
/// so the next invocation for a dependency will be served from the cache.
///
/// If a file is changed, [invalidate] should be invoked. This will invalidate
/// the file, its library, and the transitive closure of dependencies. So, the
-/// next invocation of [compile] will recompile libraries required for the
+/// next invocation of [getResolution] will recompile libraries required for the
/// requested library.
class FrontEndCompiler {
static const MSG_PENDING_COMPILE =
@@ -88,10 +88,6 @@
/// The listener / recorder for compilation errors produced by the compiler.
final _ErrorListener _errorListener;
- /// Each key is the absolute URI of a library.
- /// Each value is the compilation result of the key library.
- final Map<Uri, LibraryCompilationResult> _results = {};
-
/// The [Component] with currently valid libraries. When a file is invalidated,
/// we remove the file, its library, and everything affected from [_component].
Component _component = new Component();
@@ -108,7 +104,7 @@
/// Each value is the file system URI of the library that sources the part.
final Map<Uri, Uri> _partToLibrary = {};
- /// Whether [compile] is executing.
+ /// Whether [getResolution] is executing.
bool _isCompileExecuting = false;
factory FrontEndCompiler(
@@ -179,38 +175,124 @@
: _logger = _options.logger,
_fileSystem = _options.fileSystem;
- /// Compile the library with the given absolute [uri], and everything it
- /// depends on. Return the result of the requested library compilation.
+ /// Return the outline of the library with the given absolute [uri], and
+ /// everything it depends on.
///
- /// If there is the cached result for the library (compiled directly, or as
- /// a result of compilation of another library), it will be returned quickly.
+ /// If there is the cached outline for the library (computed directly, or as
+ /// a result of computing the outline of another library), it will be
+ /// returned quickly.
///
/// Throw [StateError] if another compilation is pending.
- Future<LibraryCompilationResult> compile(Uri uri) {
+ Future<LibraryOutlineResult> getOutline(Uri uri) {
if (_isCompileExecuting) {
throw new StateError(MSG_PENDING_COMPILE);
}
_isCompileExecuting = true;
- {
- LibraryCompilationResult result = _results[uri];
- if (result != null) {
- _isCompileExecuting = false;
- return new Future.value(result);
- }
+ // TODO(scheglov) Do we need a map?
+ if (_component.root.hasChild('$uri')) {
+ _isCompileExecuting = false;
+ // TODO(scheglov) Can we keep the same instance?
+ var types = new TypeEnvironment(
+ new CoreTypes(_component), new ClassHierarchy(_component));
+ var result = new LibraryOutlineResult(_component, types);
+ return new Future.value(result);
}
- return _runWithFrontEndContext('Compile', () async {
- // TODO(brianwilkerson) Determine whether this await is necessary.
- await null;
+ return _runWithFrontEndContext('Compute outline', () async {
try {
var dillTarget =
new DillTarget(_options.ticker, uriTranslator, _options.target);
// Append all libraries what we still have in the current component.
await _logger.runAsync('Load dill libraries', () async {
- // TODO(brianwilkerson) Determine whether this await is necessary.
- await null;
+ dillTarget.loader.appendLibraries(_component);
+ await dillTarget.buildOutlines();
+ });
+
+ // Create the target for computing the outline of the library.
+ var kernelTarget = new KernelTarget(
+ _fileSystem, true, dillTarget, uriTranslator,
+ metadataCollector: new AnalyzerMetadataCollector());
+ kernelTarget.read(uri);
+
+ // Compute new outlines.
+ var newComponent = await _logger.runAsync('Compile', () async {
+ return await kernelTarget.buildOutlines(nameRoot: _component.root);
+ });
+
+ // Add new libraries to the current component.
+ if (newComponent != null) {
+ // When a file is used in a `part` directive of a library, but does
+ // not have a `part of` itself, we get this file both as a part,
+ // and as a library. This causes an exception later in resolution.
+ var partFileUris = new Set<Uri>();
+ for (var library in newComponent.libraries) {
+ var libraryFileUri = library.fileUri;
+ for (var part in library.parts) {
+ var partFileUri = libraryFileUri.resolve(part.partUri);
+ if (partFileUri != libraryFileUri) {
+ partFileUris.add(partFileUri);
+ }
+ }
+ }
+ // Do add new libraries.
+ for (var library in newComponent.libraries) {
+ if (!partFileUris.contains(library.fileUri)) {
+ Uri uri = library.importUri;
+ if (!_component.root.hasChild('$uri')) {
+ _component.root.getChildFromUri(uri).bindTo(library.reference);
+ library.computeCanonicalNames();
+ _component.libraries.add(library);
+ }
+ }
+ }
+ }
+
+ _logger.run('Compute dependencies', _computeDependencies);
+
+ // TODO(scheglov) Can we keep the same instance?
+ var types = new TypeEnvironment(
+ new CoreTypes(_component), new ClassHierarchy(_component));
+ return new LibraryOutlineResult(_component, types);
+ } finally {
+ _isCompileExecuting = false;
+ }
+ });
+ }
+
+ /// Compute resolution for the library with the given absolute [uri] and
+ /// all its parts.
+ ///
+ /// Throw [StateError] if another compilation is pending.
+ Future<LibraryCompilationResult> getResolution(Uri uri) {
+ if (_isCompileExecuting) {
+ throw new StateError(MSG_PENDING_COMPILE);
+ }
+ _isCompileExecuting = true;
+
+ return _runWithFrontEndContext('Compile', () async {
+ try {
+ // Remove the requested library outline from the component.
+ Library libraryOutline;
+ for (var library in _component.libraries) {
+ if (library.importUri == uri) {
+ libraryOutline = library;
+ _component.libraries.remove(library);
+ _component.root.removeChild('$uri');
+ break;
+ }
+ }
+ if (libraryOutline == null) {
+ throw new StateError('Expected to find $uri in the component.');
+ }
+ libraryOutline.canonicalName.getChild('IntWrapper');
+
+ var dillTarget =
+ new DillTarget(_options.ticker, uriTranslator, _options.target);
+
+ // Append all libraries what we still have in the current component.
+ await _logger.runAsync('Load dill libraries', () async {
dillTarget.loader.appendLibraries(_component);
await dillTarget.buildOutlines();
});
@@ -220,54 +302,54 @@
uriTranslator, new AnalyzerMetadataCollector());
kernelTarget.read(uri);
- // Compile the entry point into the new component.
- _component = await _logger.runAsync('Compile', () async {
- // TODO(brianwilkerson) Determine whether this await is necessary.
- await null;
+ // Resolve the requested library.
+ Component newComponent = await _logger.runAsync('Compile', () async {
await kernelTarget.buildOutlines(nameRoot: _component.root);
- return await kernelTarget.buildComponent() ?? _component;
+ return await kernelTarget.buildComponent();
});
- // TODO(scheglov) Only for new libraries?
- _component.computeCanonicalNames();
+ // Put the library outline back into the current component.
+ _component.root.adoptChild(libraryOutline.canonicalName);
+ _component.libraries.add(libraryOutline);
- _logger.run('Compute dependencies', _computeDependencies);
+ // Compute canonical names for the resolved library.
+ for (var library in newComponent.libraries) {
+ if (library.importUri == uri) {
+ library.reference.canonicalName = _component.root.getChild('$uri');
+ library.computeCanonicalNames();
+ break;
+ }
+ }
// TODO(scheglov) Can we keep the same instance?
var types = new TypeEnvironment(
new CoreTypes(_component), new ClassHierarchy(_component));
- // Add results for new libraries.
- for (var library in _component.libraries) {
- if (!_results.containsKey(library.importUri)) {
- Map<Uri, List<CollectedResolution>> libraryResolutions =
- kernelTarget.resolutions[library.fileUri];
+ Uri libraryFileUri = libraryOutline.fileUri;
+ var libraryResolutions = kernelTarget.resolutions[libraryFileUri];
+ if (libraryResolutions == null) {
+ throw new StateError('Expected to find $uri in resolutions.');
+ }
+ // TODO(scheglov) Check that we have exactly one resolution?
+ var files = <Uri, FileCompilationResult>{};
- var files = <Uri, FileCompilationResult>{};
-
- void addFileResult(Uri fileUri) {
- if (libraryResolutions != null) {
- files[fileUri] = new FileCompilationResult(
- fileUri,
- libraryResolutions[fileUri] ?? [],
- _errorListener.fileUriToErrors[fileUri] ?? []);
- }
- }
-
- addFileResult(library.fileUri);
- for (var part in library.parts) {
- addFileResult(library.fileUri.resolve(part.partUri));
- }
-
- var libraryResult = new LibraryCompilationResult(
- _component, types, library.importUri, library, files);
- _results[library.importUri] = libraryResult;
+ void addFileResult(Uri fileUri) {
+ if (libraryResolutions != null) {
+ files[fileUri] = new FileCompilationResult(
+ fileUri,
+ libraryResolutions[fileUri] ?? [],
+ _errorListener.fileUriToErrors[fileUri] ?? []);
}
}
+
+ addFileResult(libraryFileUri);
+ for (var part in libraryOutline.parts) {
+ addFileResult(libraryFileUri.resolve(part.partUri));
+ }
_errorListener.fileUriToErrors.clear();
- // The result must have been computed.
- return _results[uri];
+ return new LibraryCompilationResult(
+ _component, types, libraryOutline.importUri, libraryOutline, files);
} finally {
_isCompileExecuting = false;
}
@@ -276,7 +358,7 @@
/// Invalidate the file with the given file [uri], its library and the
/// transitive the of libraries that use it. The next time when any of these
- /// libraries is be requested in [compile], it will be recompiled again.
+ /// libraries is be requested in [getResolution], it will be recompiled again.
void invalidate(Uri uri) {
void invalidateLibrary(Uri libraryUri) {
Library library = _uriToLibrary.remove(libraryUri);
@@ -286,7 +368,6 @@
_component.libraries.remove(library);
_component.root.removeChild('${library.importUri}');
_component.uriToSource.remove(libraryUri);
- _results.remove(library.importUri);
// Recursively invalidate dependencies.
Set<Uri> directDependencies =
@@ -363,6 +444,20 @@
this.component, this.types, this.uri, this.kernel, this.files);
}
+/// The outline result for a single library.
+class LibraryOutlineResult {
+ /// The full current [Component]. It has all libraries that are required by
+ /// this library, but might also have other libraries, that are not required.
+ ///
+ /// The object is mutable, and is changed when files are invalidated.
+ final Component component;
+
+ /// The [TypeEnvironment] for the [component].
+ final TypeEnvironment types;
+
+ LibraryOutlineResult(this.component, this.types);
+}
+
/// The [DietListener] that record resolution information.
class _AnalyzerDietListener extends DietListener {
final Map<Uri, List<CollectedResolution>> _resolutions;
diff --git a/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart b/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
index 868599ed..4a9b2c5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/kernel_context.dart
@@ -84,15 +84,14 @@
// TODO(brianwilkerson) Determine whether this await is necessary.
await null;
Uri targetUri = targetLibrary.uri;
- LibraryCompilationResult compilationResult =
- await compiler.compile(targetUri);
+ LibraryOutlineResult outlineResult = await compiler.getOutline(targetUri);
// Remember Kernel libraries produced by the compiler.
// There might be more libraries than we actually need.
// This is probably OK, because we consume them lazily.
var libraryMap = <String, kernel.Library>{};
var libraryExistMap = <String, bool>{};
- for (var library in compilationResult.component.libraries) {
+ for (var library in outlineResult.component.libraries) {
String uriStr = library.importUri.toString();
libraryMap[uriStr] = library;
FileState file = fsState.getFileForUri(library.importUri);
@@ -116,8 +115,8 @@
analysisContext.contentCache = new _ContentCacheWrapper(fsState);
// Create the resynthesizer bound to the analysis context.
- var resynthesizer = new KernelResynthesizer(analysisContext,
- compilationResult.types, libraryMap, libraryExistMap);
+ var resynthesizer = new KernelResynthesizer(
+ analysisContext, outlineResult.types, libraryMap, libraryExistMap);
return new KernelContext._(analysisContext, resynthesizer);
});
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index c58b12b..709f366 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -182,11 +182,7 @@
}
Future<Map<FileState, UnitAnalysisResult>> _analyze2() async {
- // TODO(brianwilkerson) Determine whether this await is necessary.
- await null;
return await _logger.runAsync('Analyze', () async {
- // TODO(brianwilkerson) Determine whether this await is necessary.
- await null;
Map<FileState, CompilationUnit> units = {};
// Parse all files.
@@ -209,7 +205,7 @@
_resolveDirectives(units);
var libraryResult = await _logger.runAsync('Compile library', () {
- return _frontEndCompiler.compile(_library.uri);
+ return _frontEndCompiler.getResolution(_library.uri);
});
_logger.run('Apply resolution', () {
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index e017334..b5417e9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -387,7 +387,7 @@
if (index != null) {
for (AnalysisDriverSubtype subtype in index.subtypes) {
if (subtype.supertypes.contains(id)) {
- FileState library = file.isPart ? file.library : file;
+ FileState library = file.library ?? file;
results.add(new SubtypeResult(
library.uriStr,
library.uriStr + ';' + file.uriStr + ';' + subtype.name,
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 457bb8e..f643697 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -6747,13 +6747,12 @@
if (int.parse(lexeme.substring(index, index + 1)) < 9) {
return true;
}
- int bound;
+ int bound = 223372036854775808;
if (isNegative) {
- bound = 223372036854775808;
+ return int.parse(lexeme.substring(index + 1)) <= bound;
} else {
- bound = 223372036854775807;
+ return int.parse(lexeme.substring(index + 1)) < bound;
}
- return int.parse(lexeme.substring(index + 1)) <= bound;
}
/**
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 4be6d72..5d1bada 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -2400,6 +2400,28 @@
correction: "Try using a type that is or is a subclass of '{1}'.");
/**
+ * It is a compile-time error if a generic function type is used as a bound
+ * for a formal type parameter of a class or a function.
+ */
+ static const CompileTimeErrorCode GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND =
+ const CompileTimeErrorCode('GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND',
+ 'Generic function types may not be used as type parameter bounds',
+ correction: 'Try making the free variable in the function type part'
+ ' of the larger declaration signature');
+
+ /**
+ * It is a compile-time error if a generic function type is used as an actual
+ * type argument.
+ */
+ static const CompileTimeErrorCode GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT =
+ const CompileTimeErrorCode(
+ 'GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT',
+ "Generic function has type parameters '<{0}>', so it may not be used"
+ ' as a type argument',
+ correction: "Try removing the type parameters '<{0}>', or using"
+ " 'dynamic' as the type argument here instead of a function.");
+
+ /**
* 15.3.1 Typedef: Any self reference, either directly, or recursively via
* another typedef, is a compile time error.
*/
diff --git a/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart b/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
deleted file mode 100644
index c007f79..0000000
--- a/pkg/analyzer/lib/src/fasta/analyzer_expression_generator.dart
+++ /dev/null
@@ -1,580 +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.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/ast_factory.dart';
-import 'package:analyzer/src/fasta/ast_building_factory.dart';
-import 'package:front_end/src/fasta/kernel/expression_generator.dart' as fasta;
-import 'package:front_end/src/fasta/kernel/expression_generator_helper.dart';
-import 'package:front_end/src/fasta/kernel/forest.dart' as fasta;
-import 'package:front_end/src/scanner/token.dart';
-import 'package:kernel/ast.dart' as kernel
- show DartType, Initializer, Member, Name, Procedure;
-
-class AnalyzerDeferredAccessGenerator extends AnalyzerExpressionGenerator
- with fasta.DeferredAccessGenerator<Expression, Statement, Arguments> {
- final Token token;
- final fasta.PrefixBuilder builder;
- final fasta.Generator<Expression, Statement, Arguments> generator;
-
- AnalyzerDeferredAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.token,
- this.builder,
- this.generator)
- : super(helper, astFactory);
-
- @override
- Expression buildSimpleRead() => generator.buildSimpleRead();
-}
-
-class AnalyzerDelayedAssignmentGenerator extends AnalyzerExpressionGenerator
- with fasta.DelayedAssignment<Expression, Statement, Arguments> {
- final Token token;
- final fasta.Generator<Expression, Statement, Arguments> generator;
- final String assignmentOperator;
- final Expression value;
-
- AnalyzerDelayedAssignmentGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.token,
- this.generator,
- this.assignmentOperator,
- this.value)
- : super(helper, astFactory);
-
- @override
- Expression buildSimpleRead() => astFactory.assignmentExpression(
- generator.buildSimpleRead(), token, value);
-
- @override
- Expression doInvocation(int offset, Arguments arguments) => buildSimpleRead();
-}
-
-class AnalyzerDelayedPostfixIncrementGenerator
- extends AnalyzerExpressionGenerator
- with fasta.DelayedPostfixIncrement<Expression, Statement, Arguments> {
- final Token token;
- final fasta.Generator<Expression, Statement, Arguments> generator;
- final kernel.Name binaryOperator;
- final kernel.Procedure interfaceTarget;
-
- AnalyzerDelayedPostfixIncrementGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.token,
- this.generator,
- this.binaryOperator,
- this.interfaceTarget)
- : super(helper, astFactory);
-
- @override
- Expression buildSimpleRead() =>
- astFactory.postfixExpression(generator.buildSimpleRead(), token);
-
- @override
- Expression doInvocation(int offset, Arguments arguments) => buildSimpleRead();
-}
-
-abstract class AnalyzerExpressionGenerator
- implements fasta.Generator<Expression, Statement, Arguments> {
- final ExpressionGeneratorHelper<Expression, Statement, Arguments> helper;
-
- final AstFactory astFactory;
-
- AnalyzerExpressionGenerator(this.helper, this.astFactory);
-
- fasta.Forest<Expression, Statement, Token, Arguments> get forest =>
- helper.forest;
-
- @override
-// TODO: implement isInitializer
- bool get isInitializer => throw new UnimplementedError();
-
- @override
-// TODO: implement isThisPropertyAccess
- bool get isThisPropertyAccess => throw new UnimplementedError();
-
- @override
-// TODO: implement plainNameForRead
- String get plainNameForRead => throw new UnimplementedError();
-
- @override
-// TODO: implement plainNameForWrite
- String get plainNameForWrite => throw new UnimplementedError();
-
- @override
-// TODO: implement uri
- Uri get uri => throw new UnimplementedError();
-
- @override
- Expression buildAssignment(Expression value, {bool voidContext}) {
- // TODO(brianwilkerson) Figure out how to get the token for the operator.
- return astFactory.assignmentExpression(buildSimpleRead(), null, value);
- }
-
- @override
- Expression buildCompoundAssignment(
- kernel.Name binaryOperator, Expression value,
- {int offset,
- bool voidContext,
- kernel.Procedure interfaceTarget,
- bool isPreIncDec}) {
- // TODO(brianwilkerson) Figure out how to get the token for the operator.
- return astFactory.assignmentExpression(buildSimpleRead(), null, value);
- }
-
- @override
- kernel.Initializer buildFieldInitializer(Map<String, int> initializedFields) {
- // TODO: implement buildFieldInitializer
- throw new UnimplementedError();
- }
-
- /// For most accessors, the AST structure will be the same whether the result
- /// is being used for access or modification.
- Expression buildForEffect() => buildSimpleRead();
-
- @override
- Expression buildNullAwareAssignment(
- Expression value, kernel.DartType type, int offset,
- {bool voidContext}) {
- // TODO(brianwilkerson) Figure out how to get the token for the operator.
- // TODO(brianwilkerson) Capture the type information?
- return astFactory.assignmentExpression(buildSimpleRead(), null, value);
- }
-
- @override
- Expression buildPostfixIncrement(kernel.Name binaryOperator,
- {int offset, bool voidContext, kernel.Procedure interfaceTarget}) {
- // TODO(brianwilkerson) Figure out how to get the token for the operator.
- return astFactory.postfixExpression(buildSimpleRead(), null);
- }
-
- @override
- Expression buildPrefixIncrement(kernel.Name binaryOperator,
- {int offset, bool voidContext, kernel.Procedure interfaceTarget}) {
- // TODO(brianwilkerson) Figure out how to get the token for the operator.
- return astFactory.prefixExpression(null, buildSimpleRead());
- }
-
- @override
- buildPropertyAccess(fasta.IncompleteSendGenerator send, int operatorOffset,
- bool isNullAware) {
- // TODO: implement buildPropertyAccess
-// return astFactory.propertyAccess(buildSimpleRead(), null, null);
- throw new UnimplementedError();
- }
-
- @override
- buildThrowNoSuchMethodError(Expression receiver, Arguments arguments,
- {bool isSuper,
- bool isGetter,
- bool isSetter,
- bool isStatic,
- String name,
- int offset,
- /*LocatedMessage*/ argMessage}) {
- // TODO: implement buildThrowNoSuchMethodError
- throw new UnimplementedError();
- }
-
- @override
- kernel.DartType buildTypeWithBuiltArguments(List<kernel.DartType> arguments,
- {bool nonInstanceAccessIsError: false}) {
- // TODO: implement buildTypeWithBuiltArguments
- throw new UnimplementedError();
- }
-
- @override
- doInvocation(int offset, Arguments arguments) {
- // TODO: implement doInvocation
- throw new UnimplementedError();
- }
-
- @override
- Expression makeInvalidRead() {
- // TODO: implement makeInvalidRead
- throw new UnimplementedError();
- }
-
- @override
- Expression makeInvalidWrite(Expression value) {
- // TODO: implement makeInvalidWrite
- throw new UnimplementedError();
- }
-
- @override
- void printOn(StringSink sink) {
- // TODO: implement printOn
- throw new UnimplementedError();
- }
-
- @override
- T storeOffset<T>(T node, int offset) {
- // TODO: implement storeOffset
- throw new UnimplementedError();
- }
-}
-
-class AnalyzerIndexedAccessGenerator extends AnalyzerExpressionGenerator
- with fasta.IndexedAccessGenerator<Expression, Statement, Arguments> {
- /// The expression computing the object on which the index operation will be
- /// invoked.
- final Expression target;
-
- /// The left bracket.
- final Token leftBracket;
-
- /// The expression computing the argument for the index operation.
- final Expression index;
-
- /// The right bracket.
- final Token rightBracket;
-
- /// Initialize a newly created generator to have the given helper.
- AnalyzerIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.target,
- this.leftBracket,
- this.index,
- this.rightBracket)
- : super(helper, astFactory);
-
- @override
- Token get token => leftBracket;
-
- @override
- Expression buildSimpleRead() => astFactory.indexExpressionForTarget(
- target, leftBracket, index, rightBracket);
-}
-
-class AnalyzerLargeIntAccessGenerator extends AnalyzerExpressionGenerator
- with fasta.LargeIntAccessGenerator<Expression, Statement, Arguments> {
- final Token token;
-
- AnalyzerLargeIntAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.token)
- : super(helper, astFactory);
-
- @override
- Expression buildSimpleRead() => astFactory.integerLiteral(token, null);
-}
-
-class AnalyzerLoadLibraryGenerator extends AnalyzerExpressionGenerator
- with fasta.LoadLibraryGenerator<Expression, Statement, Arguments> {
- final Token token;
- final fasta.LoadLibraryBuilder builder;
-
- AnalyzerLoadLibraryGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.token,
- this.builder)
- : super(helper, astFactory);
-
- @override
- Expression buildSimpleRead() {
- // TODO: implement buildSimpleRead
- throw new UnimplementedError();
- }
-}
-
-class AnalyzerNullAwarePropertyAccessGenerator
- extends AnalyzerExpressionGenerator
- with
- fasta.NullAwarePropertyAccessGenerator<Expression, Statement,
- Arguments> {
- final Expression target;
- final Token operator;
- final SimpleIdentifier propertyName;
-
- AnalyzerNullAwarePropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.target,
- this.operator,
- this.propertyName)
- : super(helper, astFactory);
-
- @override
- Token get token => operator;
-
- @override
- Expression buildSimpleRead() =>
- astFactory.propertyAccess(target, operator, propertyName);
-}
-
-class AnalyzerPropertyAccessGenerator extends AnalyzerExpressionGenerator
- with fasta.PropertyAccessGenerator<Expression, Statement, Arguments> {
- final Token token;
- final Expression receiver;
- final kernel.Name name;
- final kernel.Member getter;
- final kernel.Member setter;
-
- AnalyzerPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.token,
- this.receiver,
- this.name,
- this.getter,
- this.setter)
- : super(helper, astFactory);
-
- @override
- // TODO(brianwilkerson) Figure out how to get the property name token (or node).
- Expression buildSimpleRead() =>
- astFactory.propertyAccess(receiver, token, null);
-}
-
-class AnalyzerReadOnlyAccessGenerator extends AnalyzerExpressionGenerator
- with fasta.ReadOnlyAccessGenerator<Expression, Statement, Arguments> {
- final Token token;
- final Expression expression;
- final String plainNameForRead;
-
- AnalyzerReadOnlyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.token,
- this.expression,
- this.plainNameForRead)
- : super(helper, astFactory);
-
- @override
- Expression buildSimpleRead() {
- // TODO: implement buildSimpleRead
- throw new UnimplementedError();
- }
-}
-
-class AnalyzerStaticAccessGenerator extends AnalyzerExpressionGenerator
- with fasta.StaticAccessGenerator<Expression, Statement, Arguments> {
- final Token token;
- final kernel.Member getter;
- final kernel.Member setter;
-
- AnalyzerStaticAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.token,
- this.getter,
- this.setter)
- : super(helper, astFactory);
-
- @override
- kernel.Member get readTarget {
- // TODO: implement readTarget
- throw new UnimplementedError();
- }
-
- @override
- Expression buildSimpleRead() {
- // TODO: implement buildSimpleRead
- throw new UnimplementedError();
- }
-}
-
-class AnalyzerSuperIndexedAccessGenerator extends AnalyzerExpressionGenerator
- with fasta.SuperIndexedAccessGenerator<Expression, Statement, Arguments> {
- /// The expression computing the object on which the index operation will be
- /// invoked.
- final Expression target;
-
- /// The left bracket.
- final Token leftBracket;
-
- /// The expression computing the argument for the index operation.
- final Expression index;
-
- /// The right bracket.
- final Token rightBracket;
-
- /// Initialize a newly created generator to have the given helper.
- AnalyzerSuperIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.target,
- this.leftBracket,
- this.index,
- this.rightBracket)
- : super(helper, astFactory);
-
- @override
- Token get token => leftBracket;
-
- @override
- Expression buildSimpleRead() => astFactory.indexExpressionForTarget(
- target, leftBracket, index, rightBracket);
-}
-
-class AnalyzerSuperPropertyAccessGenerator extends AnalyzerExpressionGenerator
- with fasta.SuperPropertyAccessGenerator<Expression, Statement, Arguments> {
- /// The `super` keyword.
- Token superKeyword;
-
- /// The `.` or `?.` operator.
- Token operator;
-
- /// The name of the property being accessed,
- SimpleIdentifier propertyName;
-
- AnalyzerSuperPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.superKeyword,
- this.operator,
- this.propertyName)
- : super(helper, astFactory);
-
- @override
- Token get token => operator;
-
- @override
- Expression buildSimpleRead() => astFactory.propertyAccess(
- astFactory.superExpression(superKeyword), operator, propertyName);
-}
-
-class AnalyzerThisIndexedAccessGenerator extends AnalyzerExpressionGenerator
- with fasta.ThisIndexedAccessGenerator<Expression, Statement, Arguments> {
- /// The expression computing the object on which the index operation will be
- /// invoked.
- final Expression target;
-
- /// The left bracket.
- final Token leftBracket;
-
- /// The expression computing the argument for the index operation.
- final Expression index;
-
- /// The right bracket.
- final Token rightBracket;
-
- /// Initialize a newly created generator to have the given helper.
- AnalyzerThisIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.target,
- this.leftBracket,
- this.index,
- this.rightBracket)
- : super(helper, astFactory);
-
- @override
- Token get token => leftBracket;
-
- @override
- Expression buildSimpleRead() => astFactory.indexExpressionForTarget(
- target, leftBracket, index, rightBracket);
-}
-
-class AnalyzerThisPropertyAccessGenerator extends AnalyzerExpressionGenerator
- with fasta.ThisPropertyAccessGenerator<Expression, Statement, Arguments> {
- final Token token;
- final kernel.Name name;
- final kernel.Member getter;
- final kernel.Member setter;
-
- AnalyzerThisPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.token,
- this.name,
- this.getter,
- this.setter)
- : super(helper, astFactory);
-
- @override
- // TODO(brianwilkerson) Figure out how to get the token (or node) for `this`.
- // TODO(brianwilkerson) Figure out how to get the property name token (or node).
- Expression buildSimpleRead() => astFactory.propertyAccess(null, token, null);
-}
-
-class AnalyzerTypeUseGenerator extends AnalyzerExpressionGenerator
- with fasta.TypeUseGenerator<Expression, Statement, Arguments> {
- final Token token;
- final fasta.PrefixBuilder prefix;
- final int declarationReferenceOffset;
- final fasta.TypeDeclarationBuilder declaration;
- final String plainNameForRead;
-
- AnalyzerTypeUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.token,
- this.prefix,
- this.declarationReferenceOffset,
- this.declaration,
- this.plainNameForRead)
- : super(helper, astFactory);
-
- @override
- Expression buildSimpleRead() {
- // TODO: implement buildSimpleRead
- throw new UnimplementedError();
- }
-}
-
-class AnalyzerUnlinkedNameGenerator extends AnalyzerExpressionGenerator
- with fasta.UnlinkedGenerator<Expression, Statement, Arguments> {
- @override
- final Token token;
-
- @override
- final fasta.UnlinkedDeclaration declaration;
-
- AnalyzerUnlinkedNameGenerator(
- ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
- AstFactory astFactory,
- this.token,
- this.declaration)
- : super(helper, astFactory);
-
- @override
- Expression buildSimpleRead() => astFactory.simpleIdentifier(token);
-}
-
-class AnalyzerUnresolvedNameGenerator extends AnalyzerExpressionGenerator
- with
- fasta.ErroneousExpressionGenerator<Expression, Statement, Arguments>,
- fasta.UnresolvedNameGenerator<Expression, Statement, Arguments> {
- @override
- final Token token;
-
- @override
- final kernel.Name name;
-
- AnalyzerUnresolvedNameGenerator(
- ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
- AstFactory astFactory,
- this.token,
- this.name)
- : super(helper, astFactory);
-
- @override
- Expression buildSimpleRead() => astFactory.simpleIdentifier(token);
-}
-
-class AnalyzerVariableUseGenerator extends AnalyzerExpressionGenerator
- with fasta.VariableUseGenerator<Expression, Statement, Arguments> {
- final Token nameToken;
-
- AnalyzerVariableUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- AstFactory astFactory,
- this.nameToken)
- : super(helper, astFactory);
-
- @override
- Token get token => nameToken;
-
- @override
- Expression buildSimpleRead() => astFactory.simpleIdentifier(nameToken);
-}
diff --git a/pkg/analyzer/lib/src/fasta/ast_body_builder.dart b/pkg/analyzer/lib/src/fasta/ast_body_builder.dart
deleted file mode 100644
index f79a164..0000000
--- a/pkg/analyzer/lib/src/fasta/ast_body_builder.dart
+++ /dev/null
@@ -1,49 +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.
-
-import 'package:analyzer/dart/ast/ast.dart' show Expression, Statement;
-import 'package:analyzer/src/fasta/ast_building_factory.dart'
- show Arguments, AstBuildingForest;
-import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
-import 'package:front_end/src/fasta/kernel/body_builder.dart' show BodyBuilder;
-import 'package:front_end/src/fasta/kernel/kernel_builder.dart'
- show KernelClassBuilder, KernelLibraryBuilder, ModifierBuilder, Scope;
-import 'package:front_end/src/fasta/type_inference/type_inferrer.dart'
- show TypeInferrer;
-import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
-import 'package:kernel/core_types.dart' show CoreTypes;
-
-export 'package:front_end/src/fasta/kernel/unlinked_scope.dart'
- show UnlinkedScope;
-
-class AstBodyBuilder extends BodyBuilder<Expression, Statement, Arguments> {
- @override
- final AstBuildingForest forest;
-
- AstBodyBuilder(
- KernelLibraryBuilder library,
- ModifierBuilder member,
- Scope scope,
- Scope formalParameterScope,
- ClassHierarchy hierarchy,
- CoreTypes coreTypes,
- KernelClassBuilder classBuilder,
- bool isInstanceMember,
- Uri uri,
- TypeInferrer typeInferrer,
- TypeProvider typeProvider)
- : forest = new AstBuildingForest(typeProvider),
- super(library, member, scope, formalParameterScope, hierarchy,
- coreTypes, classBuilder, isInstanceMember, uri, typeInferrer);
-
- @override
- void enterThenForTypePromotion(Expression condition) {
- // Do nothing.
- }
-
- @override
- void logEvent(String name) {
- throw "Parser event '$name' not implemented";
- }
-}
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 54f5982..097764a 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -2166,35 +2166,44 @@
}
@override
- void beginTypeVariable(Token name) {
+ void beginTypeVariable(Token token) {
debugEvent("beginTypeVariable");
+ SimpleIdentifier name = pop();
+ List<Annotation> metadata = pop();
+
+ Comment comment = _findComment(metadata, name.beginToken);
+ push(ast.typeParameter(comment, metadata, name, null, null));
}
@override
- void endTypeVariable(Token token, Token extendsOrSuper) {
- // TODO(paulberry): set up scopes properly to resolve parameters and type
- // variables. Note that this is tricky due to the handling of initializers
- // in constructors, so the logic should be shared with BodyBuilder as much
- // as possible.
+ void handleTypeVariablesDefined(Token token, int count) {
+ debugEvent("handleTypeVariablesDefined");
+ assert(count > 0);
+ push(popTypedList(count, new List<TypeParameter>(count)));
+ }
+
+ @override
+ void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+ debugEvent("TypeVariable");
assert(extendsOrSuper == null ||
optional('extends', extendsOrSuper) ||
optional('super', extendsOrSuper));
- debugEvent("TypeVariable");
-
TypeAnnotation bound = pop();
- SimpleIdentifier name = pop();
- List<Annotation> metadata = pop();
- Comment comment = _findComment(metadata, name.beginToken);
- push(ast.typeParameter(comment, metadata, name, extendsOrSuper, bound));
+
+ // Peek to leave type parameters on top of stack.
+ List<TypeParameter> typeParameters = peek();
+ typeParameters[index]
+ ..extendsKeyword = extendsOrSuper
+ ..bound = bound;
}
@override
- void endTypeVariables(int count, Token beginToken, Token endToken) {
+ void endTypeVariables(Token beginToken, Token endToken) {
assert(optional('<', beginToken));
assert(optional('>', endToken));
debugEvent("TypeVariables");
- List<TypeParameter> typeParameters = popTypedList(count);
+ List<TypeParameter> typeParameters = pop();
push(ast.typeParameterList(beginToken, typeParameters, endToken));
}
diff --git a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart b/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
deleted file mode 100644
index 436b733..0000000
--- a/pkg/analyzer/lib/src/fasta/ast_building_factory.dart
+++ /dev/null
@@ -1,690 +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.
-
-import 'package:analyzer/dart/ast/ast.dart' hide Identifier;
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/src/dart/ast/ast_factory.dart';
-import 'package:analyzer/src/fasta/analyzer_expression_generator.dart';
-import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
-import 'package:front_end/src/fasta/kernel/body_builder.dart' show LabelTarget;
-import 'package:front_end/src/fasta/kernel/forest.dart';
-import 'package:kernel/ast.dart' as kernel;
-
-/// A data holder used to conform to the [Forest] API.
-class Arguments {
- List<TypeAnnotation> typeArguments = <TypeAnnotation>[];
- List<Expression> positionalArguments = <Expression>[];
- List<Expression> namedArguments = <Expression>[];
-}
-
-/// An implementation of a [Forest] that can be used to build an AST structure.
-class AstBuildingForest
- implements Forest<Expression, Statement, Token, Arguments> {
- /// The type provider used to resolve the types of literal nodes, or `null` if
- /// type resolution is not being performed.
- final TypeProvider _typeProvider;
-
- /// The factory used to create AST nodes.
- AstFactoryImpl astFactory = new AstFactoryImpl();
-
- /// Initialize a newly created AST-building forest.
- AstBuildingForest(this._typeProvider);
-
- @override
- Arguments arguments(List<Expression> positional, Token location,
- {covariant List types, covariant List named}) {
- Arguments arguments = new Arguments();
- if (types != null) {
- arguments.typeArguments = types.cast<TypeAnnotation>();
- }
- arguments.positionalArguments = positional.cast<Expression>();
- if (named != null) {
- arguments.namedArguments = named.cast<Expression>();
- }
- return arguments;
- }
-
- @override
- Arguments argumentsEmpty(Token location) => new Arguments();
-
- @override
- List argumentsNamed(Arguments arguments) => arguments.namedArguments;
-
- @override
- List<Expression> argumentsPositional(Arguments arguments) =>
- arguments.positionalArguments;
-
- @override
- void argumentsSetTypeArguments(Arguments arguments, covariant List types) {
- arguments.typeArguments = types.cast<TypeAnnotation>();
- }
-
- @override
- List argumentsTypeArguments(Arguments arguments) => arguments.typeArguments;
-
- @override
- Expression asExpression(Expression expression, type, Token location) =>
- astFactory.asExpression(expression, location, type);
-
- @override
- Expression asLiteralString(Expression value) => value;
-
- @override
- ConstructorInitializer assertInitializer(
- Token assertKeyword,
- Token leftParenthesis,
- Expression condition,
- Token comma,
- Expression message) =>
- astFactory.assertInitializer(assertKeyword, leftParenthesis, condition,
- comma, message, leftParenthesis.endGroup);
-
- @override
- Statement assertStatement(
- Token assertKeyword,
- Token leftParenthesis,
- Expression condition,
- Token comma,
- Expression message,
- Token semicolon) =>
- astFactory.assertStatement(assertKeyword, leftParenthesis, condition,
- comma, message, leftParenthesis.endGroup, semicolon);
-
- @override
- Expression awaitExpression(Expression operand, Token awaitKeyword) =>
- astFactory.awaitExpression(awaitKeyword, operand);
-
- @override
- Block block(Token openBrace, List<Statement> statements, Token closeBrace) =>
- astFactory.block(openBrace, statements, closeBrace);
-
- @override
- Statement breakStatement(
- Token breakKeyword, Identifier label, Token semicolon) =>
- astFactory.breakStatement(
- breakKeyword,
- label == null ? null : astFactory.simpleIdentifier(label.token),
- semicolon);
-
- @override
- kernel.Arguments castArguments(Arguments arguments) {
- // TODO(brianwilkerson) Implement this or remove it from the API.
- throw new UnimplementedError();
- }
-
- @override
- CatchClause catchClause(
- Token onKeyword,
- TypeAnnotation exceptionType,
- Token catchKeyword,
- SimpleIdentifier exceptionParameter,
- SimpleIdentifier stackTraceParameter,
- TypeAnnotation stackTraceType,
- Statement body) {
- // TODO(brianwilkerson) The following is not reliable in the presence of
- // recovery. Consider passing the required tokens from the Parser to the
- // BodyBuilder to here.
- Token leftParenthesis;
- if (catchKeyword != null) {
- leftParenthesis = catchKeyword.next;
- }
- Token comma;
- if (stackTraceParameter != null) {
- comma = exceptionParameter.endToken.next;
- }
- Token rightParenthesis;
- if (catchKeyword != null) {
- if (stackTraceParameter != null) {
- rightParenthesis = stackTraceParameter.endToken.next;
- } else if (comma != null) {
- rightParenthesis = comma.next;
- } else {
- rightParenthesis = exceptionParameter.endToken.next;
- }
- }
- return astFactory.catchClause(
- onKeyword,
- exceptionType,
- catchKeyword,
- leftParenthesis,
- exceptionParameter,
- comma,
- stackTraceParameter,
- rightParenthesis,
- body);
- }
-
- @override
- Expression checkLibraryIsLoaded(dependency) {
- // TODO(brianwilkerson) Implement this.
- throw new UnimplementedError();
- }
-
- @override
- Expression conditionalExpression(Expression condition, Token question,
- Expression thenExpression, Token colon, Expression elseExpression) =>
- astFactory.conditionalExpression(
- condition, question, thenExpression, colon, elseExpression);
-
- @override
- Statement continueStatement(
- Token continueKeyword, Identifier label, Token semicolon) =>
- astFactory.continueStatement(
- continueKeyword,
- label == null ? null : astFactory.simpleIdentifier(label.token),
- semicolon);
-
- @override
- Generator<Expression, Statement, Arguments> deferredAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- PrefixBuilder builder,
- Generator<Expression, Statement, Arguments> generator) {
- return new AnalyzerDeferredAccessGenerator(
- helper, astFactory, token, builder, generator);
- }
-
- @override
- Generator<Expression, Statement, Arguments> delayedAssignment(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Generator<Expression, Statement, Arguments> generator,
- Expression value,
- String assignmentOperator) {
- return new AnalyzerDelayedAssignmentGenerator(
- helper, astFactory, token, generator, assignmentOperator, value);
- }
-
- @override
- Generator<Expression, Statement, Arguments> delayedPostfixIncrement(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Generator<Expression, Statement, Arguments> generator,
- kernel.Name binaryOperator,
- kernel.Procedure interfaceTarget) {
- return new AnalyzerDelayedPostfixIncrementGenerator(
- helper, astFactory, token, generator, binaryOperator, interfaceTarget);
- }
-
- @override
- Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
- ParenthesizedExpression condition, Token semicolon) =>
- astFactory.doStatement(
- doKeyword,
- body,
- whileKeyword,
- condition.leftParenthesis,
- condition.expression,
- condition.rightParenthesis,
- semicolon);
-
- @override
- Statement emptyStatement(Token semicolon) =>
- astFactory.emptyStatement(semicolon);
-
- @override
- Statement expressionStatement(Expression expression, Token semicolon) =>
- astFactory.expressionStatement(expression, semicolon);
-
- @override
- Statement forStatement(
- Token forKeyword,
- Token leftParenthesis,
- covariant variableList,
- covariant initialization,
- Token leftSeparator,
- Expression condition,
- Statement conditionStatement,
- List<Expression> updaters,
- Token rightParenthesis,
- Statement body) =>
- astFactory.forStatement(
- forKeyword,
- leftParenthesis,
- variableList,
- initialization,
- leftSeparator,
- condition,
- getSemicolon(conditionStatement),
- updaters,
- rightParenthesis,
- body);
-
- @override
- Expression getExpressionFromExpressionStatement(Statement statement) =>
- (statement as ExpressionStatement).expression;
-
- String getLabelName(Label label) => label.label.name;
-
- @override
- int getLabelOffset(Label label) => label.offset;
-
- /// Return the semicolon at the end of the given [statement], or `null` if the
- /// statement is not terminated by a semicolon.
- Token getSemicolon(Statement statement) {
- if (statement is ExpressionStatement) {
- return statement.semicolon;
- }
- if (statement is EmptyStatement) {
- return statement.semicolon;
- }
- return null;
- }
-
- @override
- kernel.DartType getTypeAt(TypeArgumentList typeArguments, int index) {
- return null; // typeArguments.arguments[index].type.kernelType;
- }
-
- @override
- int getTypeCount(TypeArgumentList typeArguments) =>
- typeArguments.arguments.length;
-
- @override
- String getVariableDeclarationName(VariableDeclaration declaration) {
- return declaration.name.name;
- }
-
- @override
- Statement ifStatement(
- Token ifKeyword,
- ParenthesizedExpression condition,
- Statement thenStatement,
- Token elseKeyword,
- Statement elseStatement) =>
- astFactory.ifStatement(
- ifKeyword,
- condition.leftParenthesis,
- condition.expression,
- condition.rightParenthesis,
- thenStatement,
- elseKeyword,
- elseStatement);
-
- @override
- Generator<Expression, Statement, Arguments> indexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Expression receiver,
- Expression index,
- kernel.Procedure getter,
- kernel.Procedure setter) {
- return new AnalyzerIndexedAccessGenerator(
- helper, astFactory, receiver, token, index, token.endGroup);
- }
-
- @override
- bool isBlock(Object node) => node is Block;
-
- @override
- bool isEmptyStatement(Statement statement) => statement is EmptyStatement;
-
- @override
- bool isErroneousNode(Object node) => false /* ??? */;
-
- @override
- Expression isExpression(Expression expression, Token isOperator,
- Token notOperator, Object type) =>
- astFactory.isExpression(expression, isOperator, notOperator, type);
-
- @override
- bool isExpressionStatement(Statement statement) =>
- statement is ExpressionStatement;
-
- @override
- bool isLabel(covariant node) => node is Label;
-
- @override
- bool isThisExpression(Object node) => node is ThisExpression;
-
- @override
- bool isVariablesDeclaration(Object node) =>
- node is VariableDeclarationStatement && node.variables != 1;
-
- @override
- Label label(Token identifier, Token colon) => astFactory.label(
- astFactory.simpleIdentifier(identifier, isDeclaration: true), colon);
-
- @override
- Statement labeledStatement(
- LabelTarget<Statement> target, Statement statement) =>
- astFactory.labeledStatement(target.labels.cast<Label>(), statement);
-
- @override
- Generator<Expression, Statement, Arguments> largeIntAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token) {
- return new AnalyzerLargeIntAccessGenerator(helper, astFactory, token);
- }
-
- @override
- Expression literalBool(bool value, Token location) =>
- astFactory.booleanLiteral(location, value)
- ..staticType = _typeProvider?.boolType;
-
- @override
- Expression literalDouble(double value, Token location) =>
- astFactory.doubleLiteral(location, value)
- ..staticType = _typeProvider?.doubleType;
-
- @override
- Expression literalInt(int value, Token location) =>
- astFactory.integerLiteral(location, value)
- ..staticType = _typeProvider?.intType;
-
- @override
- Expression literalList(
- Token constKeyword,
- bool isConst,
- Object typeArgument,
- Object typeArguments,
- Token leftBracket,
- List<Expression> expressions,
- Token rightBracket) =>
- astFactory.listLiteral(
- constKeyword, typeArguments, leftBracket, expressions, rightBracket);
-
- @override
- Expression literalMap(
- Token constKeyword,
- bool isConst,
- covariant keyType,
- covariant valueType,
- Object typeArguments,
- Token leftBracket,
- covariant List entries,
- Token rightBracket) =>
- astFactory.mapLiteral(
- constKeyword, typeArguments, leftBracket, entries, rightBracket);
-
- @override
- Expression literalNull(Token location) =>
- astFactory.nullLiteral(location)..staticType = _typeProvider?.nullType;
-
- @override
- Expression literalString(String value, Token location) =>
- astFactory.simpleStringLiteral(location, value)
- ..staticType = _typeProvider?.stringType;
-
- @override
- Expression literalSymbolMultiple(
- String value, Token hash, List<Identifier> components) =>
- astFactory.symbolLiteral(
- hash, components.map((identifier) => identifier.token).toList())
- ..staticType = _typeProvider?.symbolType;
-
- @override
- Expression literalSymbolSingluar(String value, Token hash, Object component) {
- Token token;
- if (component is Identifier) {
- token = component.token;
- } else if (component is Operator) {
- token = component.token;
- } else {
- throw new ArgumentError(
- 'Unexpected class of component: ${component.runtimeType}');
- }
- return astFactory.symbolLiteral(hash, <Token>[token])
- ..staticType = _typeProvider?.symbolType;
- }
-
- @override
- Expression literalType(covariant type, Token location) {
- // TODO(brianwilkerson) Capture the type information.
- return astFactory.simpleIdentifier(location)
- ..staticType = _typeProvider?.typeType;
- }
-
- @override
- Expression loadLibrary(dependency) {
- // TODO(brianwilkerson) Implement this.
- throw new UnimplementedError();
- }
-
- @override
- Generator<Expression, Statement, Arguments> loadLibraryGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- LoadLibraryBuilder builder) {
- return new AnalyzerLoadLibraryGenerator(helper, astFactory, token, builder);
- }
-
- @override
- Expression logicalExpression(
- Expression leftOperand, Token operator, Expression rightOperand) =>
- astFactory.binaryExpression(leftOperand, operator, rightOperand);
-
- @override
- Object mapEntry(Expression key, Token colon, Expression value) =>
- astFactory.mapLiteralEntry(key, colon, value);
-
- @override
- List mapEntryList(int length) => new List<MapLiteralEntry>(length);
-
- @override
- Expression notExpression(Expression operand, Token operator) =>
- astFactory.prefixExpression(operator, operand)
- ..staticType = _typeProvider?.boolType;
-
- @override
- Generator<Expression, Statement, Arguments> nullAwarePropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Expression receiverExpression,
- kernel.Name name,
- kernel.Member getter,
- kernel.Member setter,
- kernel.DartType type) {
- return new AnalyzerNullAwarePropertyAccessGenerator(
- helper, astFactory, receiverExpression, token, null /*name*/);
- }
-
- @override
- Object parenthesizedCondition(Token leftParenthesis, Expression expression,
- Token rightParenthesis) =>
- astFactory.parenthesizedExpression(
- leftParenthesis, expression, rightParenthesis);
-
- @override
- Generator<Expression, Statement, Arguments> propertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Expression receiver,
- kernel.Name name,
- kernel.Member getter,
- kernel.Member setter) {
- return new AnalyzerPropertyAccessGenerator(
- helper, astFactory, token, receiver, name, getter, setter);
- }
-
- @override
- int readOffset(AstNode node) => node.offset;
-
- @override
- Generator<Expression, Statement, Arguments> readOnlyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Expression expression,
- String plainNameForRead) {
- return new AnalyzerReadOnlyAccessGenerator(
- helper, astFactory, token, expression, plainNameForRead);
- }
-
- @override
- void resolveBreak(Statement target, BreakStatement user) {
- user.target = target;
- }
-
- @override
- void resolveContinue(Statement target, ContinueStatement user) {
- user.target = target;
- }
-
- @override
- void resolveContinueInSwitch(SwitchStatement target, ContinueStatement user) {
- user.target = target;
- }
-
- @override
- Statement rethrowStatement(Token rethrowKeyword, Token semicolon) =>
- astFactory.expressionStatement(
- astFactory.rethrowExpression(rethrowKeyword), semicolon);
-
- @override
- Statement returnStatement(
- Token returnKeyword, Expression expression, Token semicolon) =>
- astFactory.returnStatement(returnKeyword, expression, semicolon);
-
- @override
- void setParameterType(FormalParameter parameter, TypeAnnotation type) {
- parameter.identifier.staticType = type.type;
- }
-
- @override
- Generator<Expression, Statement, Arguments> staticAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- kernel.Member getter,
- kernel.Member setter) {
- return new AnalyzerStaticAccessGenerator(
- helper, astFactory, token, getter, setter);
- }
-
- @override
- Expression stringConcatenationExpression(
- List<Expression> strings, Token location) =>
- astFactory.adjacentStrings(strings.cast<StringLiteral>());
-
- @override
- Generator<Expression, Statement, Arguments> superIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Expression index,
- kernel.Member getter,
- kernel.Member setter) {
- // TODO(brianwilkerson) Figure out how to get the token for `super`.
- return new AnalyzerIndexedAccessGenerator(
- helper, astFactory, null, token, index, token.endGroup);
- }
-
- @override
- Generator<Expression, Statement, Arguments> superPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- kernel.Name name,
- kernel.Member getter,
- kernel.Member setter) {
- // TODO(brianwilkerson) Figure out how to get the token for the name.
- return new AnalyzerSuperPropertyAccessGenerator(
- helper, astFactory, null, null, null /*name*/);
- }
-
- @override
- Statement syntheticLabeledStatement(Statement statement) => statement;
-
- @override
- Expression thisExpression(Token thisKeyword) =>
- astFactory.thisExpression(thisKeyword);
-
- @override
- Generator<Expression, Statement, Arguments> thisIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Expression index,
- kernel.Procedure getter,
- kernel.Procedure setter) {
- // TODO(brianwilkerson) Figure out how to get the token for `this`.
- return new AnalyzerIndexedAccessGenerator(
- helper, astFactory, null, token, index, token.endGroup);
- }
-
- @override
- Generator<Expression, Statement, Arguments> thisPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token location,
- kernel.Name name,
- kernel.Member getter,
- kernel.Member setter) {
- // TODO(brianwilkerson) Figure out how to get the token for the name.
- return new AnalyzerThisPropertyAccessGenerator(
- helper, astFactory, location, name, getter, setter);
- }
-
- @override
- Expression throwExpression(Token throwKeyword, Expression expression) =>
- astFactory.throwExpression(throwKeyword, expression);
-
- @override
- Statement tryStatement(
- Token tryKeyword,
- Statement body,
- List<CatchClause> catchClauses,
- Token finallyKeyword,
- Statement finallyBlock) =>
- astFactory.tryStatement(
- tryKeyword, body, catchClauses, finallyKeyword, finallyBlock);
-
- @override
- Generator<Expression, Statement, Arguments> typeUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- PrefixBuilder prefix,
- int declarationReferenceOffset,
- TypeDeclarationBuilder declaration,
- String plainNameForRead) {
- return new AnalyzerTypeUseGenerator(helper, astFactory, token, prefix,
- declarationReferenceOffset, declaration, plainNameForRead);
- }
-
- @override
- Generator<Expression, Statement, Arguments> unlinkedGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- UnlinkedDeclaration declaration) {
- return new AnalyzerUnlinkedNameGenerator(
- helper, astFactory, token, declaration);
- }
-
- @override
- Generator<Expression, Statement, Arguments> unresolvedNameGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- kernel.Name name) {
- return new AnalyzerUnresolvedNameGenerator(helper, astFactory, token, name);
- }
-
- @override
- VariableDeclarationStatement variablesDeclaration(
- List<VariableDeclaration> declarations, Uri uri) {
- // TODO(brianwilkerson) Implement this.
- throw new UnimplementedError();
- }
-
- @override
- NodeList<VariableDeclaration> variablesDeclarationExtractDeclarations(
- VariableDeclarationStatement variablesDeclaration) =>
- variablesDeclaration.variables.variables;
-
- @override
- Generator<Expression, Statement, Arguments> variableUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- VariableDeclarationStatement variable,
- kernel.DartType promotedType) {
- return new AnalyzerVariableUseGenerator(helper, astFactory, token);
- }
-
- Statement whileStatement(Token whileKeyword,
- ParenthesizedExpression condition, Statement body) =>
- astFactory.whileStatement(whileKeyword, condition.leftParenthesis,
- condition.expression, condition.rightParenthesis, body);
-
- @override
- Statement wrapVariables(Statement statement) => statement;
-
- @override
- Statement yieldStatement(Token yieldKeyword, Token star,
- Expression expression, Token semicolon) =>
- astFactory.yieldStatement(yieldKeyword, star, expression, semicolon);
-}
diff --git a/pkg/analyzer/lib/src/fasta/resolution_applier.dart b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
index 5aa09cd..9d1b45c 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_applier.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_applier.dart
@@ -280,7 +280,7 @@
_typeContext.enterLocalFunction(element);
functionExpression.body?.accept(this);
- _storeFunctionType(_get(node).inferredType, element);
+ _storeFunctionType(_get(node.name).inferredType, element);
// Associate the elements with the nodes.
if (element != null) {
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index 3713e55..e0b2de8 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -3,8 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/src/fasta/resolution_applier.dart';
+import 'package:front_end/src/fasta/kernel/factory.dart';
import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart';
import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
+import 'package:front_end/src/scanner/token.dart';
import 'package:kernel/ast.dart';
import 'package:kernel/type_algebra.dart';
@@ -39,7 +41,10 @@
/// Type inference listener that records inferred types for later use by
/// [ResolutionApplier].
-class ResolutionStorer extends _ResolutionStorer<int, int, Node, int> {
+class ResolutionStorer extends _ResolutionStorer<int, int, Node, int>
+ implements
+ TypeInferenceListener<int, int, Node, int>,
+ Factory<void, void, void, void> {
ResolutionStorer(Map<int, ResolutionData<DartType, int, Node, int>> data)
: super(data);
}
@@ -48,9 +53,7 @@
/// accidentally peeking into kernel internals.
///
/// TODO(paulberry): when the time is right, fuse this with [ResolutionStorer].
-class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
- implements
- TypeInferenceListener<Location, Declaration, Reference, PrefixInfo> {
+class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo> {
final Map<Location,
ResolutionData<DartType, Declaration, Reference, PrefixInfo>> _data;
@@ -92,35 +95,56 @@
_data.remove(location) == null;
}
- @override
void asExpression(
- ExpressionJudgment judgment, Location location, DartType inferredType) {
+ ExpressionJudgment judgment,
+ Location location,
+ void expression,
+ Token asOperator,
+ void literalType,
+ DartType inferredType) {
_store(location, literalType: inferredType, inferredType: inferredType);
}
- @override
- void assertInitializer(InitializerJudgment judgment, Location location) {}
+ void assertInitializer(
+ InitializerJudgment judgment,
+ Location location,
+ Token assertKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token comma,
+ void message,
+ Token rightParenthesis) {}
- @override
- void assertStatement(StatementJudgment judgment, Location location) {}
+ void assertStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token assertKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token comma,
+ void message,
+ Token rightParenthesis,
+ Token semicolon) {}
- @override
void awaitExpression(ExpressionJudgment judgment, Location location,
- DartType inferredType) =>
+ Token awaitKeyword, void expression, DartType inferredType) =>
genericExpression("awaitExpression", location, inferredType);
- @override
- void block(StatementJudgment judgment, Location location) {}
+ void block(StatementJudgment judgment, Location location, Token leftBracket,
+ List<void> statements, Token rightBracket) {}
- @override
void boolLiteral(ExpressionJudgment judgment, Location location,
- DartType inferredType) =>
+ Token literal, bool value, DartType inferredType) =>
genericExpression("boolLiteral", location, inferredType);
- @override
- void breakStatement(StatementJudgment judgment, Location location) {}
+ void breakStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token breakKeyword,
+ void label,
+ Token semicolon,
+ covariant Object labelBinder) {}
- @override
void cascadeExpression(
ExpressionJudgment judgment, Location location, DartType inferredType) {
// Overridden so that the type of the expression will not be recorded. We
@@ -129,32 +153,47 @@
// correctly apply the type even if we recorded it.
}
- @override
void catchStatement(
Catch judgment,
Location location,
+ Token onKeyword,
+ void type,
+ Token catchKeyword,
+ Token leftParenthesis,
+ Token exceptionParameter,
+ Token comma,
+ Token stackTraceParameter,
+ Token rightParenthesis,
+ void body,
DartType guardType,
- Location exceptionLocation,
+ covariant VariableDeclarationBinder exceptionBinder,
DartType exceptionType,
- Location stackTraceLocation,
+ covariant VariableDeclarationBinder stackTraceBinder,
DartType stackTraceType) {
_store(location, literalType: guardType);
- if (exceptionLocation != null) {
- _store(exceptionLocation, literalType: exceptionType);
+ if (exceptionBinder != null) {
+ _store(exceptionBinder.fileOffset as Location,
+ literalType: exceptionType);
}
- if (stackTraceLocation != null) {
- _store(stackTraceLocation, literalType: stackTraceType);
+ if (stackTraceBinder != null) {
+ _store(stackTraceBinder.fileOffset as Location,
+ literalType: stackTraceType);
}
}
- @override
- void conditionalExpression(ExpressionJudgment judgment, Location location,
+ void conditionalExpression(
+ ExpressionJudgment judgment,
+ Location location,
+ void condition,
+ Token question,
+ void thenExpression,
+ Token colon,
+ void elseExpression,
DartType inferredType) =>
genericExpression("conditionalExpression", location, inferredType);
- @override
void constructorInvocation(ExpressionJudgment judgment, Location location,
Reference expressionTarget, DartType inferredType) {
// A class reference may have already been stored at this location by
@@ -164,43 +203,79 @@
_store(location, inferredType: inferredType, reference: expressionTarget);
}
- @override
- void continueSwitchStatement(StatementJudgment judgment, Location location) {}
+ void continueStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token continueKeyword,
+ void label,
+ Token semicolon,
+ covariant Object labelBinder) {}
- @override
+ void continueSwitchStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token continueKeyword,
+ void label,
+ Token semicolon,
+ covariant Object labelBinder) {}
+
void deferredCheck(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
genericExpression("deferredCheck", location, inferredType);
- @override
- void doStatement(StatementJudgment judgment, Location location) {}
+ void doStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token doKeyword,
+ void body,
+ Token whileKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token rightParenthesis,
+ Token semicolon) {}
- @override
void doubleLiteral(ExpressionJudgment judgment, Location location,
- DartType inferredType) =>
+ Token literal, double value, DartType inferredType) =>
genericExpression("doubleLiteral", location, inferredType);
- @override
- void expressionStatement(StatementJudgment judgment, Location location) {}
+ void emptyStatement(Token semicolon) {}
- @override
- void fieldInitializer(InitializerJudgment judgment, Location location,
+ void expressionStatement(StatementJudgment judgment, Location location,
+ void expression, Token semicolon) {}
+
+ void fieldInitializer(
+ InitializerJudgment judgment,
+ Location location,
+ Token thisKeyword,
+ Token period,
+ Token fieldName,
+ Token equals,
+ void expression,
Reference initializerField) {
_store(location, reference: initializerField);
}
- @override
void forInStatement(
StatementJudgment judgment,
Location location,
- Location variableLocation,
- DartType variableType,
+ Token awaitKeyword,
+ Token forKeyword,
+ Token leftParenthesis,
+ Object loopVariable,
+ Token identifier,
+ Token inKeyword,
+ void iterator,
+ Token rightParenthesis,
+ void body,
+ covariant VariableDeclarationBinder loopVariableBinder,
+ DartType loopVariableType,
Location writeLocation,
DartType writeType,
Declaration writeVariable,
Reference writeTarget) {
- if (variableLocation != null) {
- _store(variableLocation, inferredType: variableType);
+ if (loopVariableBinder != null) {
+ _store(loopVariableBinder.fileOffset as Location,
+ inferredType: loopVariableType);
} else {
if (writeVariable != null) {
_store(writeLocation,
@@ -214,16 +289,30 @@
}
}
- @override
- void forStatement(StatementJudgment judgment, Location location) {}
+ void forStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token forKeyword,
+ Token leftParenthesis,
+ void variableDeclarationList,
+ void initialization,
+ Token leftSeparator,
+ void condition,
+ Token rightSeparator,
+ void updaters,
+ Token rightParenthesis,
+ void body) {}
- @override
- void functionDeclaration(StatementJudgment judgment, Location location,
- FunctionType inferredType) {
- _store(location, inferredType: inferredType);
+ void functionDeclaration(
+ covariant VariableDeclarationBinder binder, FunctionType inferredType) {
+ _store(binder.fileOffset as Location, inferredType: inferredType);
}
- @override
+ Object binderForFunctionDeclaration(
+ StatementJudgment judgment, int fileOffset, String name) {
+ return new VariableDeclarationBinder(fileOffset);
+ }
+
void functionExpression(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
genericExpression("functionExpression", location, inferredType);
@@ -233,76 +322,114 @@
_store(location, inferredType: inferredType);
}
- @override
- void ifNull(ExpressionJudgment judgment, Location location,
- DartType inferredType) =>
+ void ifNull(ExpressionJudgment judgment, Location location, void leftOperand,
+ Token operator, void rightOperand, DartType inferredType) =>
genericExpression('ifNull', location, inferredType);
- @override
- void ifStatement(StatementJudgment judgment, Location location) {}
+ void ifStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token ifKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token rightParenthesis,
+ void thenStatement,
+ Token elseKeyword,
+ void elseStatement) {}
- @override
- void intLiteral(ExpressionJudgment judgment, Location location,
- DartType inferredType) =>
+ void intLiteral(ExpressionJudgment judgment, Location location, Token literal,
+ num value, DartType inferredType) =>
genericExpression("intLiteral", location, inferredType);
- @override
void invalidInitializer(InitializerJudgment judgment, Location location) {}
- @override
- void labeledStatement(StatementJudgment judgment, Location location) {}
+ void labeledStatement(List<Object> labels, void statement) {}
- @override
- void listLiteral(ExpressionJudgment judgment, Location location,
+ void statementLabel(covariant void binder, Token label, Token colon) {}
+
+ void binderForStatementLabel(
+ StatementJudgment judgment, int fileOffset, String name) {}
+
+ void listLiteral(
+ ExpressionJudgment judgment,
+ Location location,
+ Token constKeyword,
+ Object typeArguments,
+ Token leftBracket,
+ void elements,
+ Token rightBracket,
DartType inferredType) =>
genericExpression("listLiteral", location, inferredType);
- @override
- void logicalExpression(ExpressionJudgment judgment, Location location,
+ void logicalExpression(
+ ExpressionJudgment judgment,
+ Location location,
+ void leftOperand,
+ Token operator,
+ void rightOperand,
DartType inferredType) =>
genericExpression("logicalExpression", location, inferredType);
- @override
- void mapLiteral(ExpressionJudgment judgment, Location location,
- DartType typeContext) =>
- genericExpression("mapLiteral", location, typeContext);
-
- @override
- void namedFunctionExpression(ExpressionJudgment judgment, Location location,
+ void mapLiteral(
+ ExpressionJudgment judgment,
+ Location location,
+ Token constKeyword,
+ Object typeArguments,
+ Token leftBracket,
+ List<Object> entries,
+ Token rightBracket,
DartType inferredType) =>
- genericExpression("namedFunctionExpression", location, inferredType);
+ genericExpression("mapLiteral", location, inferredType);
- @override
- void not(ExpressionJudgment judgment, Location location,
- DartType inferredType) =>
+ void mapLiteralEntry(
+ Object judgment, int fileOffset, void key, Token separator, void value) {
+ // TODO(brianwilkerson) Implement this.
+ }
+
+ void namedFunctionExpression(ExpressionJudgment judgment,
+ covariant VariableDeclarationBinder binder, DartType inferredType) =>
+ genericExpression("namedFunctionExpression",
+ binder.fileOffset as Location, inferredType);
+
+ void not(ExpressionJudgment judgment, Location location, Token operator,
+ void operand, DartType inferredType) =>
genericExpression("not", location, inferredType);
- @override
void nullLiteral(ExpressionJudgment judgment, Location location,
- bool isSynthetic, DartType inferredType) {
+ Token literal, bool isSynthetic, DartType inferredType) {
if (isSynthetic) return null;
genericExpression("nullLiteral", location, inferredType);
}
- @override
void indexAssign(ExpressionJudgment judgment, Location location,
Reference writeMember, Reference combiner, DartType inferredType) {
_store(location,
reference: writeMember, inferredType: inferredType, combiner: combiner);
}
- @override
- void isExpression(ExpressionJudgment judgment, Location location,
- DartType testedType, DartType inferredType) {
+ void isExpression(
+ ExpressionJudgment judgment,
+ Location location,
+ void expression,
+ Token isOperator,
+ void literalType,
+ DartType testedType,
+ DartType inferredType) {
_store(location, literalType: testedType, inferredType: inferredType);
}
- void isNotExpression(ExpressionJudgment judgment, Location location,
- DartType type, DartType inferredType) {
+ void isNotExpression(
+ ExpressionJudgment judgment,
+ Location location,
+ void expression,
+ Token isOperator,
+ Token notOperator,
+ void literalType,
+ DartType type,
+ DartType inferredType) {
_store(location, literalType: type, inferredType: inferredType);
}
- @override
void methodInvocation(
ExpressionJudgment judgment,
Location resultOffset,
@@ -324,7 +451,6 @@
reference: interfaceMember);
}
- @override
void methodInvocationCall(
ExpressionJudgment judgment,
Location resultOffset,
@@ -344,7 +470,6 @@
isImplicitCall: isImplicitCall);
}
- @override
void propertyAssign(
ExpressionJudgment judgment,
Location location,
@@ -360,38 +485,38 @@
inferredType: inferredType);
}
- @override
void propertySet(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
genericExpression("propertySet", location, inferredType);
- @override
void propertyGet(ExpressionJudgment judgment, Location location,
Reference member, DartType inferredType) {
_store(location, reference: member, inferredType: inferredType);
}
- @override
void propertyGetCall(
ExpressionJudgment judgment, Location location, DartType inferredType) {
_store(location, isExplicitCall: true);
}
- @override
- void redirectingInitializer(InitializerJudgment judgment, Location location,
+ void redirectingInitializer(
+ InitializerJudgment judgment,
+ Location location,
+ Token thisKeyword,
+ Token period,
+ Token constructorName,
+ covariant Object argumentList,
Reference initializerTarget) {
_store(location, reference: initializerTarget);
}
- @override
void rethrow_(ExpressionJudgment judgment, Location location,
- DartType inferredType) =>
+ Token rethrowKeyword, DartType inferredType) =>
genericExpression('rethrow', location, inferredType);
- @override
- void returnStatement(StatementJudgment judgment, Location location) {}
+ void returnStatement(StatementJudgment judgment, Location location,
+ Token returnKeyword, void expression, Token semicolon) {}
- @override
void staticAssign(
ExpressionJudgment judgment,
Location location,
@@ -407,13 +532,11 @@
inferredType: inferredType);
}
- @override
void staticGet(ExpressionJudgment judgment, Location location,
Reference expressionTarget, DartType inferredType) {
_store(location, reference: expressionTarget, inferredType: inferredType);
}
- @override
void staticInvocation(
ExpressionJudgment judgment,
Location location,
@@ -432,50 +555,75 @@
inferredType: inferredType);
}
- @override
void stringConcatenation(
ExpressionJudgment judgment, Location location, DartType inferredType) {
// We don't need the type - we already know that it is String.
// Moreover, the file offset for StringConcatenation is `-1`.
}
- @override
void stringLiteral(ExpressionJudgment judgment, Location location,
- DartType inferredType) =>
+ Token literal, String value, DartType inferredType) =>
genericExpression("StringLiteral", location, inferredType);
- @override
- void superInitializer(InitializerJudgment judgment, Location location) {}
+ void superInitializer(
+ InitializerJudgment judgment,
+ Location location,
+ Token superKeyword,
+ Token period,
+ Token constructorName,
+ covariant Object argumentList) {}
- @override
- void switchStatement(StatementJudgment judgment, Location location) {}
+ void switchCase(SwitchCaseJudgment judgment, List<Object> labels,
+ Token keyword, void expression, Token colon, List<void> statements) {}
- @override
- void symbolLiteral(ExpressionJudgment judgment, Location location,
+ void switchLabel(covariant void binder, Token label, Token colon) {}
+
+ void binderForSwitchLabel(
+ SwitchCaseJudgment judgment, int fileOffset, String name) {}
+
+ void switchStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token switchKeyword,
+ Token leftParenthesis,
+ void expression,
+ Token rightParenthesis,
+ Token leftBracket,
+ void members,
+ Token rightBracket) {}
+
+ void symbolLiteral(
+ ExpressionJudgment judgment,
+ Location location,
+ Token poundSign,
+ List<Token> components,
+ String value,
DartType inferredType) =>
genericExpression("symbolLiteral", location, inferredType);
- @override
- void thisExpression(
- ExpressionJudgment judgment, Location location, DartType inferredType) {}
+ void thisExpression(ExpressionJudgment judgment, Location location,
+ Token thisKeyword, DartType inferredType) {}
- @override
void throw_(ExpressionJudgment judgment, Location location,
- DartType inferredType) =>
+ Token throwKeyword, void expression, DartType inferredType) =>
genericExpression('throw', location, inferredType);
- @override
void tryCatch(StatementJudgment judgment, Location location) {}
- @override
- void tryFinally(StatementJudgment judgment, Location location) {}
+ void tryFinally(
+ StatementJudgment judgment,
+ Location location,
+ Token tryKeyword,
+ void body,
+ void catchClauses,
+ Token finallyKeyword,
+ void finallyBlock) {}
void typeLiteral(ExpressionJudgment judgment, Location location,
Reference expressionType, DartType inferredType) {
_store(location, reference: expressionType, inferredType: inferredType);
}
- @override
void variableAssign(
ExpressionJudgment judgment,
Location location,
@@ -491,39 +639,47 @@
inferredType: inferredType);
}
- @override
- void variableDeclaration(StatementJudgment judgment, Location location,
+ void variableDeclaration(covariant VariableDeclarationBinder binder,
DartType statementType, DartType inferredType) {
- _store(location, literalType: statementType, inferredType: inferredType);
+ _store(binder.fileOffset as Location,
+ literalType: statementType, inferredType: inferredType);
}
- @override
- void variableGet(ExpressionJudgment judgment, Location location,
- bool isInCascade, Declaration expressionVariable, DartType inferredType) {
+ Object binderForVariableDeclaration(
+ StatementJudgment judgment, int fileOffset, String name) {
+ return new VariableDeclarationBinder(fileOffset);
+ }
+
+ void variableGet(
+ ExpressionJudgment judgment,
+ Location location,
+ bool isInCascade,
+ covariant VariableDeclarationBinder variableBinder,
+ DartType inferredType) {
if (isInCascade) {
return;
}
_store(location,
- declaration: expressionVariable, inferredType: inferredType);
+ declaration: variableBinder.fileOffset as Declaration,
+ inferredType: inferredType);
}
- @override
- void variableSet(ExpressionJudgment judgment, Location location,
- DartType inferredType) =>
- genericExpression("variableSet", location, inferredType);
+ void whileStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token whileKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token rightParenthesis,
+ void body) {}
- @override
- void whileStatement(StatementJudgment judgment, Location location) {}
+ void yieldStatement(StatementJudgment judgment, Location location,
+ Token yieldKeyword, Token star, void expression, Token semicolon) {}
- @override
- void yieldStatement(StatementJudgment judgment, Location location) {}
-
- @override
void storePrefixInfo(Location location, PrefixInfo prefixInfo) {
_store(location, prefixInfo: prefixInfo);
}
- @override
void storeClassReference(
Location location, Reference reference, DartType rawType) {
// TODO(paulberry): would it be better to use literalType?
@@ -531,6 +687,13 @@
}
}
+/// TODO(paulberry): eventually just use the element directly.
+class VariableDeclarationBinder {
+ final int fileOffset;
+
+ VariableDeclarationBinder(this.fileOffset);
+}
+
/// A [DartType] wrapper around invocation type arguments.
class TypeArgumentsDartType implements DartType {
final List<DartType> types;
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 204542e..b470ac2 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1239,6 +1239,7 @@
_checkForTypeParameterSupertypeOfItsBound(node);
_checkForTypeAnnotationDeferredClass(node.bound);
_checkForImplicitDynamicType(node.bound);
+ _checkForGenericFunctionType(node.bound);
if (_options.strongMode) node.bound?.accept(_uninstantiatedBoundChecker);
return super.visitTypeParameter(node);
}
@@ -4183,6 +4184,19 @@
}
}
+ void _checkForGenericFunctionType(TypeAnnotation node) {
+ if (node == null) {
+ return;
+ }
+ DartType type = node.type;
+ if (type is FunctionType && type.typeFormals.isNotEmpty) {
+ _errorReporter.reportErrorForNode(
+ CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND,
+ node,
+ [type]);
+ }
+ }
+
void _checkForImplicitDynamicTypedLiteral(TypedLiteral node) {
if (_options.implicitDynamic || node.typeArguments != null) {
return;
@@ -5905,7 +5919,9 @@
* Verify that the type arguments in the given [typeName] are all within
* their bounds.
*
- * See [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS].
+ * See [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS],
+ * [CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS],
+ * [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_BOUND].
*/
void _checkForTypeArgumentNotMatchingBounds(TypeName typeName) {
if (typeName.typeArguments == null) {
@@ -5931,11 +5947,19 @@
for (int i = 0; i < loopThroughIndex; i++) {
TypeAnnotation argumentNode = argumentNodes[i];
DartType argType = argumentNode.type;
+ if (argType is FunctionType && argType.typeFormals.isNotEmpty) {
+ _errorReporter.reportTypeErrorForNode(
+ CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT,
+ argumentNode,
+ [argType.typeFormals.join(', ')]);
+ continue;
+ }
DartType boundType = parameterElements[i].bound;
if (argType != null && boundType != null) {
if (shouldSubstitute) {
boundType = boundType.substitute2(arguments, parameterTypes);
}
+
if (!_typeSystem.isSubtypeOf(argType, boundType)) {
ErrorCode errorCode;
if (_isInConstInstanceCreation) {
@@ -6455,6 +6479,15 @@
// <T extends Clonable<T>>
//
DartType argType = typeArgs[i];
+
+ if (argType is FunctionType && argType.typeFormals.isNotEmpty) {
+ _errorReporter.reportTypeErrorForNode(
+ CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT,
+ typeArgumentList[i],
+ [argType.typeFormals.join(', ')]);
+ continue;
+ }
+
DartType bound =
fnTypeParams[i].bound.substitute2(typeArgs, fnTypeParams);
if (!_typeSystem.isSubtypeOf(argType, bound)) {
diff --git a/pkg/analyzer/lib/src/generated/parser_fasta.dart b/pkg/analyzer/lib/src/generated/parser_fasta.dart
index 6f5e77a..43b4191 100644
--- a/pkg/analyzer/lib/src/generated/parser_fasta.dart
+++ b/pkg/analyzer/lib/src/generated/parser_fasta.dart
@@ -283,8 +283,10 @@
@override
TypeAnnotation parseTypeAnnotation(bool inExpression) {
- currentToken = fastaParser
- .parseType(fastaParser.syntheticPreviousToken(currentToken))
+ Token previous = fastaParser.syntheticPreviousToken(currentToken);
+ currentToken = fasta
+ .computeType(previous, true, !inExpression)
+ .parseType(previous, fastaParser)
.next;
return astBuilder.pop();
}
@@ -301,8 +303,10 @@
@override
TypeName parseTypeName(bool inExpression) {
- currentToken = fastaParser
- .parseType(fastaParser.syntheticPreviousToken(currentToken))
+ Token previous = fastaParser.syntheticPreviousToken(currentToken);
+ currentToken = fasta
+ .computeType(previous, true, !inExpression)
+ .parseType(previous, fastaParser)
.next;
return astBuilder.pop();
}
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 663b76e..685704b 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -9043,7 +9043,10 @@
TypeNameResolver typeNameResolver = null;
TypeParameterBoundsResolver(
- this.typeSystem, this.library, this.source, this.errorListener);
+ this.typeSystem, this.library, this.source, this.errorListener)
+ : libraryScope = new LibraryScope(library),
+ typeNameResolver = new TypeNameResolver(typeSystem,
+ typeSystem.typeProvider, library, source, errorListener);
/**
* Resolve bounds of type parameters of classes, class and function type
@@ -9070,27 +9073,40 @@
typeNameResolver.resolveTypeName(type);
// TODO(scheglov) report error when don't apply type bounds for type bounds
} else if (type is GenericFunctionType) {
- void resolveTypeParameter(TypeParameter t) {
- _resolveTypeName(t.bound);
- }
+ // While GenericFunctionTypes with free types are not allowed as bounds,
+ // those free types *should* ideally be recognized as type parameter types
+ // rather than classnames. Create a scope to accomplish that.
+ Scope previousScope = typeNameResolver.nameScope;
- void resolveParameter(FormalParameter p) {
- if (p is SimpleFormalParameter) {
- _resolveTypeName(p.type);
- } else if (p is DefaultFormalParameter) {
- resolveParameter(p.parameter);
- } else if (p is FieldFormalParameter) {
- _resolveTypeName(p.type);
- } else if (p is FunctionTypedFormalParameter) {
- _resolveTypeName(p.returnType);
- p.typeParameters?.typeParameters?.forEach(resolveTypeParameter);
- p.parameters?.parameters?.forEach(resolveParameter);
+ try {
+ Scope typeParametersScope = new TypeParameterScope(
+ typeNameResolver.nameScope, type.type.element);
+ typeNameResolver.nameScope = typeParametersScope;
+
+ void resolveTypeParameter(TypeParameter t) {
+ _resolveTypeName(t.bound);
}
- }
- _resolveTypeName(type.returnType);
- type.typeParameters?.typeParameters?.forEach(resolveTypeParameter);
- type.parameters?.parameters?.forEach(resolveParameter);
+ void resolveParameter(FormalParameter p) {
+ if (p is SimpleFormalParameter) {
+ _resolveTypeName(p.type);
+ } else if (p is DefaultFormalParameter) {
+ resolveParameter(p.parameter);
+ } else if (p is FieldFormalParameter) {
+ _resolveTypeName(p.type);
+ } else if (p is FunctionTypedFormalParameter) {
+ _resolveTypeName(p.returnType);
+ p.typeParameters?.typeParameters?.forEach(resolveTypeParameter);
+ p.parameters?.parameters?.forEach(resolveParameter);
+ }
+ }
+
+ _resolveTypeName(type.returnType);
+ type.typeParameters?.typeParameters?.forEach(resolveTypeParameter);
+ type.parameters?.parameters?.forEach(resolveParameter);
+ } finally {
+ typeNameResolver.nameScope = previousScope;
+ }
}
}
@@ -9111,10 +9127,10 @@
bound.type = typeParameterElement.bound;
}
} else {
- libraryScope ??= new LibraryScope(library);
typeParametersScope ??= createTypeParametersScope();
- typeNameResolver ??= new TypeNameResolver(typeSystem,
- typeSystem.typeProvider, library, source, errorListener);
+ // _resolveTypeParameters is the entry point into each declaration
+ // with a separate scope. We can safely, and should, clobber the
+ // old scope here.
typeNameResolver.nameScope = typeParametersScope;
_resolveTypeName(bound);
typeParameterElement.bound = bound.type;
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index e54318a..a500975 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -15,7 +15,8 @@
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/member.dart' show TypeParameterMember;
import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/error/codes.dart' show StrongModeCode;
+import 'package:analyzer/src/error/codes.dart'
+ show StrongModeCode, CompileTimeErrorCode;
import 'package:analyzer/src/generated/engine.dart'
show AnalysisContext, AnalysisOptionsImpl;
import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
diff --git a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
index 171376f..6cd4ceb 100644
--- a/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/checked_mode_compile_time_error_code_kernel_test.dart
@@ -149,13 +149,6 @@
@failingTest
@override
- test_fieldTypeOk_generic() async {
- // UnimplementedError: kernel: (Let) let final dynamic #t4 = #lib2::y in let ...
- await super.test_fieldTypeOk_generic();
- }
-
- @failingTest
- @override
test_fieldTypeOk_unresolved_null() async {
// UnimplementedError: kernel: (AsExpression) x as{TypeError} invalid-type
await super.test_fieldTypeOk_unresolved_null();
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
index 4d9b603..97fa300 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_kernel_test.dart
@@ -526,16 +526,16 @@
@override
@failingTest
- test_constWithNonConst_with() async {
- // Bad state: No type information for C at 72
- await super.test_constWithNonConst_with();
+ test_constWithNonConst_in_const_context() async {
+ // Bad state: No data for () at 58
+ await super.test_constWithNonConst_in_const_context();
}
@override
@failingTest
- test_constWithNonConst_in_const_context() async {
- // Bad state: No data for () at 58
- await super.test_constWithNonConst_in_const_context();
+ test_constWithNonConst_with() async {
+ // Bad state: No type information for C at 72
+ await super.test_constWithNonConst_with();
}
@override
@@ -3098,6 +3098,69 @@
// Test passes, even though if fails in the superclass
await super.test_yieldInNonGenerator_async();
}
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_genericFunctionTypeAsBound_class() async {
+ await super.test_genericFunctionTypeAsBound_class();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_genericFunctionTypeAsBound_genericFunction() async {
+ await super.test_genericFunctionTypeAsBound_genericFunction();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_genericFunctionTypeAsBound_genericFunctionTypedef() async {
+ await super.test_genericFunctionTypeAsBound_genericFunctionTypedef();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_genericFunctionTypeAsBound_parameterOfFunction() async {
+ await super.test_genericFunctionTypeAsBound_parameterOfFunction();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_genericFunctionTypeAsBound_typedef() async {
+ await super.test_genericFunctionTypeAsBound_typedef();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_genericFunctionTypeArgument_class() async {
+ await super.test_genericFunctionTypeArgument_class();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_genericFunctionTypeArgument_functionType() async {
+ await super.test_genericFunctionTypeArgument_functionType();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_genericFunctionTypeArgument_function() async {
+ await super.test_genericFunctionTypeArgument_function();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_genericFunctionTypeArgument_method() async {
+ await super.test_genericFunctionTypeArgument_method();
+ }
}
/// Tests marked with this annotation fail because of a Fasta problem.
diff --git a/pkg/analyzer/test/generated/compile_time_error_code_test.dart b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
index 6923bc6..6f250b2 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code_test.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code_test.dart
@@ -2749,6 +2749,55 @@
verify([source]);
}
+ test_genericFunctionTypeAsBound_class() async {
+ Source source = addSource(r'''
+class C<T extends S Function<S>(S)> {
+}''');
+ await computeAnalysisResult(source);
+ assertErrors(
+ source, [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND]);
+ verify([source]);
+ }
+
+ test_genericFunctionTypeAsBound_genericFunction() async {
+ Source source = addSource(r'''
+T Function<T extends S Function<S>(S)>(T) fun;
+''');
+ await computeAnalysisResult(source);
+ assertErrors(
+ source, [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND]);
+ verify([source]);
+ }
+
+ test_genericFunctionTypeAsBound_genericFunctionTypedef() async {
+ Source source = addSource(r'''
+typedef foo = T Function<T extends S Function<S>(S)>(T t);
+''');
+ await computeAnalysisResult(source);
+ assertErrors(
+ source, [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND]);
+ verify([source]);
+ }
+
+ test_genericFunctionTypeAsBound_parameterOfFunction() async {
+ Source source = addSource(r'''
+class C<T extends void Function(S Function<S>(S))> {
+}''');
+ await computeAnalysisResult(source);
+ assertNoErrors(source);
+ verify([source]);
+ }
+
+ test_genericFunctionTypeAsBound_typedef() async {
+ Source source = addSource(r'''
+typedef T foo<T extends S Function<S>(S)>(T t);
+''');
+ await computeAnalysisResult(source);
+ assertErrors(
+ source, [CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND]);
+ verify([source]);
+ }
+
test_genericFunctionTypedParameter() async {
// Once dartbug.com/28515 is fixed, this syntax should no longer generate an
// error.
@@ -7014,6 +7063,98 @@
verify([source]);
}
+ test_genericFunctionTypeArgument_class() async {
+ Source source = addSource(r'''
+class C<T> {}
+C<T Function<T>(T)> c;''');
+ await computeAnalysisResult(source);
+ assertErrors(source,
+ [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+ verify([source]);
+ }
+
+ test_genericFunctionTypeArgument_functionType() async {
+ Source source = addSource(r'''
+T Function<T>(T) f;
+main() { f<S Function<S>(S)>(null); }''');
+ await computeAnalysisResult(source);
+ assertErrors(source,
+ [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+ verify([source]);
+ }
+
+ test_genericFunctionTypeArgument_function() async {
+ Source source = addSource(r'''
+T f<T>(T) => null;
+main() { f<S Function<S>(S)>(null); }''');
+ await computeAnalysisResult(source);
+ assertErrors(source,
+ [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+ verify([source]);
+ }
+
+ test_genericFunctionTypeArgument_method() async {
+ Source source = addSource(r'''
+class C {
+ T f<T>(T) => null;
+}
+main() { new C().f<S Function<S>(S)>(null); }''');
+ await computeAnalysisResult(source);
+ assertErrors(source,
+ [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+ verify([source]);
+ }
+
+ @failingTest
+ test_genericFunctionTypeArgument_inference_functionType() async {
+ // TODO(mfairhurst) how should these inference errors be reported?
+ Source source = addSource(r'''
+T Function<T>(T) f;
+main() { f(<S>(S s) => s); }''');
+ await computeAnalysisResult(source);
+ assertErrors(source,
+ [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+ verify([source]);
+ }
+
+ @failingTest
+ test_genericFunctionTypeArgument_inference_function() async {
+ // TODO(mfairhurst) how should these inference errors be reported?
+ Source source = addSource(r'''
+T f<T>(T) => null;
+main() { f(<S>(S s) => s); }''');
+ await computeAnalysisResult(source);
+ assertErrors(source,
+ [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+ verify([source]);
+ }
+
+ @failingTest
+ test_genericFunctionTypeArgument_inference_method() async {
+ // TODO(mfairhurst) how should these inference errors be reported?
+ Source source = addSource(r'''
+class C {
+ T f<T>(T) => null;
+}
+main() { new C().f(<S>(S s) => s); }''');
+ await computeAnalysisResult(source);
+ assertErrors(source,
+ [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+ verify([source]);
+ }
+
+ @failingTest
+ test_genericFunctionTypeArgument_typedef() async {
+ // TODO(mfairhurst) diagnose these parse errors to give the correct error
+ Source source = addSource(r'''
+typedef T f<T>(T t);
+final T<Function<S>(int)> x = null;''');
+ await computeAnalysisResult(source);
+ assertErrors(source,
+ [CompileTimeErrorCode.GENERIC_FUNCTION_CANNOT_BE_TYPE_ARGUMENT]);
+ verify([source]);
+ }
+
test_undefinedAnnotation_unresolved_identifier() async {
Source source = addSource(r'''
@unresolved
diff --git a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
index 410dd7e..85bd5a7 100644
--- a/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
+++ b/pkg/analyzer/test/generated/error_suppression_kernel_test.dart
@@ -66,41 +66,6 @@
@override
@failingTest
- test_multiple_ignores() async {
- // UnimplementedError: kernel: (Let) let final dynamic #t2 = #lib2::x in let ...
- await super.test_multiple_ignores();
- }
-
- @override
- @failingTest
- test_multiple_ignores_traling() async {
- // UnimplementedError: kernel: (Let) let final dynamic #t3 = #lib3::x in let ...
- await super.test_multiple_ignores_traling();
- }
-
- @override
- @failingTest
- test_multiple_ignores_whitespace_variant_1() async {
- // UnimplementedError: kernel: (Let) let final dynamic #t4 = #lib4::x in let ...
- await super.test_multiple_ignores_whitespace_variant_1();
- }
-
- @override
- @failingTest
- test_multiple_ignores_whitespace_variant_2() async {
- // UnimplementedError: kernel: (Let) let final dynamic #t5 = #lib5::x in let ...
- await super.test_multiple_ignores_whitespace_variant_2();
- }
-
- @override
- @failingTest
- test_multiple_ignores_whitespace_variant_3() async {
- // UnimplementedError: kernel: (Let) let final dynamic #t6 = #lib6::x in let ...
- await super.test_multiple_ignores_whitespace_variant_3();
- }
-
- @override
- @failingTest
test_no_ignores() async {
// Expected 1 errors of type StaticTypeWarningCode.INVALID_ASSIGNMENT, found 0;
// 1 errors of type CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, found 0
diff --git a/pkg/analyzer/test/generated/hint_code_kernel_test.dart b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
index ad843c2..333ef36 100644
--- a/pkg/analyzer/test/generated/hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_kernel_test.dart
@@ -12,6 +12,11 @@
});
}
+/// Tests marked with this annotation fail because of a Fasta problem.
+class FastaProblem {
+ const FastaProblem(String issueUri);
+}
+
@reflectiveTest
class HintCodeTest_Kernel extends HintCodeTest_Driver {
@override
@@ -69,6 +74,27 @@
return super.test_deadCode_deadFinalStatementInCase();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deadCode_statementAfterAlwaysThrowsFunction() async {
+ await super.test_deadCode_statementAfterAlwaysThrowsFunction();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deadCode_statementAfterAlwaysThrowsMethod() async {
+ await super.test_deadCode_statementAfterAlwaysThrowsMethod();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_assignment() async {
+ await super.test_deprecatedAnnotationUse_assignment();
+ }
+
@failingTest
@override
test_deprecatedAnnotationUse_call() async {
@@ -76,6 +102,13 @@
return super.test_deprecatedAnnotationUse_call();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_deprecated() async {
+ await super.test_deprecatedAnnotationUse_deprecated();
+ }
+
@failingTest
@override
test_deprecatedAnnotationUse_Deprecated() async {
@@ -85,16 +118,95 @@
@override
@failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_export() async {
+ await super.test_deprecatedAnnotationUse_export();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_field() async {
+ await super.test_deprecatedAnnotationUse_field();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_getter() async {
+ await super.test_deprecatedAnnotationUse_getter();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_import() async {
+ await super.test_deprecatedAnnotationUse_import();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_indexExpression() async {
+ await super.test_deprecatedAnnotationUse_indexExpression();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_instanceCreation() async {
+ await super.test_deprecatedAnnotationUse_instanceCreation();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_instanceCreation_namedConstructor() async {
+ await super
+ .test_deprecatedAnnotationUse_instanceCreation_namedConstructor();
+ }
+
+ @override
+ @failingTest
test_deprecatedAnnotationUse_named() async {
return super.test_deprecatedAnnotationUse_named();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_operator() async {
+ await super.test_deprecatedAnnotationUse_operator();
+ }
+
@failingTest
@override
test_deprecatedAnnotationUse_positional() async {
return super.test_deprecatedAnnotationUse_positional();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_setter() async {
+ await super.test_deprecatedAnnotationUse_setter();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_superConstructor() async {
+ await super.test_deprecatedAnnotationUse_superConstructor();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedAnnotationUse_superConstructor_namedConstructor() async {
+ await super
+ .test_deprecatedAnnotationUse_superConstructor_namedConstructor();
+ }
+
@failingTest
@override
test_deprecatedFunction_class() async {
@@ -150,6 +262,83 @@
@override
@failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_factory__expr_return_null_OK() async {
+ await super.test_factory__expr_return_null_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_factory_abstract_OK() async {
+ await super.test_factory_abstract_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_factory_bad_return() async {
+ await super.test_factory_bad_return();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_factory_block_OK() async {
+ await super.test_factory_block_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_factory_block_return_null_OK() async {
+ await super.test_factory_block_return_null_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_factory_expr_OK() async {
+ await super.test_factory_expr_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_factory_misplaced_annotation() async {
+ await super.test_factory_misplaced_annotation();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_factory_no_return_type_OK() async {
+ await super.test_factory_no_return_type_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_factory_subclass_OK() async {
+ await super.test_factory_subclass_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_factory_void_return() async {
+ await super.test_factory_void_return();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidImmutableAnnotation_method() async {
+ await super.test_invalidImmutableAnnotation_method();
+ }
+
+ @override
+ @failingTest
test_invalidRequiredParam_on_named_parameter_with_default() async {
return super.test_invalidRequiredParam_on_named_parameter_with_default();
}
@@ -181,6 +370,223 @@
@override
@failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_closure() async {
+ await super.test_invalidUseOfProtectedMember_closure();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_field() async {
+ await super.test_invalidUseOfProtectedMember_field();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_field_OK() async {
+ await super.test_invalidUseOfProtectedMember_field_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_function() async {
+ await super.test_invalidUseOfProtectedMember_function();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_function_OK() async {
+ await super.test_invalidUseOfProtectedMember_function_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_function_OK2() async {
+ await super.test_invalidUseOfProtectedMember_function_OK2();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_getter() async {
+ await super.test_invalidUseOfProtectedMember_getter();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_getter_OK() async {
+ await super.test_invalidUseOfProtectedMember_getter_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_in_docs_OK() async {
+ await super.test_invalidUseOfProtectedMember_in_docs_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_message() async {
+ await super.test_invalidUseOfProtectedMember_message();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_method_1() async {
+ await super.test_invalidUseOfProtectedMember_method_1();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_method_OK() async {
+ await super.test_invalidUseOfProtectedMember_method_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_OK_1() async {
+ await super.test_invalidUseOfProtectedMember_OK_1();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_OK_2() async {
+ await super.test_invalidUseOfProtectedMember_OK_2();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_OK_3() async {
+ await super.test_invalidUseOfProtectedMember_OK_3();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_OK_4() async {
+ await super.test_invalidUseOfProtectedMember_OK_4();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_OK_field() async {
+ await super.test_invalidUseOfProtectedMember_OK_field();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_OK_getter() async {
+ await super.test_invalidUseOfProtectedMember_OK_getter();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_OK_setter() async {
+ await super.test_invalidUseOfProtectedMember_OK_setter();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_OK_setter_2() async {
+ await super.test_invalidUseOfProtectedMember_OK_setter_2();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_setter() async {
+ await super.test_invalidUseOfProtectedMember_setter();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_setter_OK() async {
+ await super.test_invalidUseOfProtectedMember_setter_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfProtectedMember_topLevelVariable() async {
+ await super.test_invalidUseOfProtectedMember_topLevelVariable();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfVisibleForTestingMember_constructor() async {
+ await super.test_invalidUseOfVisibleForTestingMember_constructor();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfVisibleForTestingMember_method() async {
+ await super.test_invalidUseOfVisibleForTestingMember_method();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfVisibleForTestingMember_method_OK() async {
+ await super.test_invalidUseOfVisibleForTestingMember_method_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfVisibleForTestingMember_OK_export() async {
+ await super.test_invalidUseOfVisibleForTestingMember_OK_export();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfVisibleForTestingMember_propertyAccess() async {
+ await super.test_invalidUseOfVisibleForTestingMember_propertyAccess();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseOfVisibleForTestingMember_topLevelFunction() async {
+ await super.test_invalidUseOfVisibleForTestingMember_topLevelFunction();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseProtectedAndForTesting_asProtected_OK() async {
+ await super.test_invalidUseProtectedAndForTesting_asProtected_OK();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUseProtectedAndForTesting_asTesting_OK() async {
+ await super.test_invalidUseProtectedAndForTesting_asTesting_OK();
+ }
+
+ @override
+ @failingTest
test_isNotDouble() {
// Bad state: No data for is at 10
return super.test_isNotDouble();
@@ -235,6 +641,34 @@
return super.test_missingJsLibAnnotation_variable();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_mustBeImmutable_direct() async {
+ await super.test_mustBeImmutable_direct();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_mustBeImmutable_extends() async {
+ await super.test_mustBeImmutable_extends();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_mustBeImmutable_fromMixin() async {
+ await super.test_mustBeImmutable_fromMixin();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_mustBeImmutable_instance() async {
+ await super.test_mustBeImmutable_instance();
+ }
+
@failingTest
@override
test_mustCallSuper() async {
@@ -242,6 +676,13 @@
return super.test_mustCallSuper();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_mustCallSuper_fromInterface() async {
+ await super.test_mustCallSuper_fromInterface();
+ }
+
@failingTest
@override
test_mustCallSuper_indirect() async {
@@ -249,6 +690,27 @@
return super.test_mustCallSuper_indirect();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_mustCallSuper_overridden() async {
+ await super.test_mustCallSuper_overridden();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_mustCallSuper_overridden_w_future() async {
+ await super.test_mustCallSuper_overridden_w_future();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_mustCallSuper_overridden_w_future2() async {
+ await super.test_mustCallSuper_overridden_w_future2();
+ }
+
@failingTest
@override
test_nullAwareBeforeOperator_ok_is_not() {
@@ -258,6 +720,34 @@
@override
@failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_overrideOnNonOverridingField_invalid() async {
+ await super.test_overrideOnNonOverridingField_invalid();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_overrideOnNonOverridingGetter_invalid() async {
+ await super.test_overrideOnNonOverridingGetter_invalid();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_overrideOnNonOverridingMethod_invalid() async {
+ await super.test_overrideOnNonOverridingMethod_invalid();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_overrideOnNonOverridingSetter_invalid() async {
+ await super.test_overrideOnNonOverridingSetter_invalid();
+ }
+
+ @override
+ @failingTest
test_required_constructor_param() async {
return super.test_required_constructor_param();
}
diff --git a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
index 2f7a8c9..b080ee6 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -283,6 +283,13 @@
@override
@failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_instance_creation_inside_annotation() async {
+ return super.test_instance_creation_inside_annotation();
+ }
+
+ @override
+ @failingTest
@potentialAnalyzerProblem
test_integerLiteralOutOfRange_negative_valid() async {
return super.test_integerLiteralOutOfRange_negative_valid();
@@ -306,6 +313,13 @@
@override
@failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidAnnotation_constantVariable_topLevel() async {
+ return super.test_invalidAnnotation_constantVariable_topLevel();
+ }
+
+ @override
+ @failingTest
test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() {
// type 'PrefixedIdentifierImpl' is not a subtype of type 'SimpleIdentifier'
// of 'topEntity'
@@ -430,13 +444,6 @@
@override
@failingTest
- @potentialAnalyzerProblem
- test_typeArgument_boundToFunctionType() async {
- return super.test_typeArgument_boundToFunctionType();
- }
-
- @override
- @failingTest
test_undefinedGetter_static_conditionalAccess() {
// Bad state: No data for A at 36
return super.test_undefinedGetter_static_conditionalAccess();
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 1084149..6a12526 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -5386,7 +5386,7 @@
}
test_typeArgument_boundToFunctionType() async {
- Source source = addSource("class A<T extends void Function<T>(T)>{}");
+ Source source = addSource("class A<T extends void Function(T)>{}");
await computeAnalysisResult(source);
assertNoErrors(source);
verify([source]);
diff --git a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
index dc39f65..b3fe456 100644
--- a/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_kernel_test.dart
@@ -48,11 +48,10 @@
@override
@failingTest
- test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction() {
- // Failed assertion: line 215 pos 14: 'node.parent is PartOfDirective ||
- // node.parent is EnumConstantDeclaration': is not true.
+ test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction() {
+ // Failed to resolve 1 nodes
return super
- .test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction();
+ .test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction();
}
@override
@@ -65,10 +64,25 @@
@override
@failingTest
- test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction() {
- // Failed to resolve 1 nodes
+ test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction() {
+ // Failed assertion: line 215 pos 14: 'node.parent is PartOfDirective ||
+ // node.parent is EnumConstantDeclaration': is not true.
return super
- .test_deprecatedAnnotationUse_namedParameter_inDefiningLocalFunction();
+ .test_deprecatedAnnotationUse_namedParameter_inNestedLocalFunction();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedMemberUse_inDeprecatedClass() async {
+ await super.test_deprecatedMemberUse_inDeprecatedClass();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedMemberUse_inDeprecatedFunction() async {
+ await super.test_deprecatedMemberUse_inDeprecatedFunction();
}
@failingTest
@@ -82,6 +96,113 @@
@override
@failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedMemberUse_inDeprecatedMethod() async {
+ await super.test_deprecatedMemberUse_inDeprecatedMethod();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_deprecatedMemberUse_inDeprecatedMethod_inDeprecatedClass() async {
+ await super.test_deprecatedMemberUse_inDeprecatedMethod_inDeprecatedClass();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_missingReturn_alwaysThrows() async {
+ await super.test_missingReturn_alwaysThrows();
+ }
+
+ @override
+ @failingTest
+ test_overrideOnNonOverridingField_inInterface() {
+ // Expected 1 errors of type
+ // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
+ return super.test_overrideOnNonOverridingField_inInterface();
+ }
+
+ @override
+ @failingTest
+ test_overrideOnNonOverridingField_inSuperclass() {
+ // Expected 1 errors of type
+ // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
+ return super.test_overrideOnNonOverridingField_inSuperclass();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_overrideOnNonOverridingGetter_inInterface() async {
+ await super.test_overrideOnNonOverridingGetter_inInterface();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_overrideOnNonOverridingGetter_inSuperclass() async {
+ await super.test_overrideOnNonOverridingGetter_inSuperclass();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_overrideOnNonOverridingMethod_inInterface() async {
+ await super.test_overrideOnNonOverridingMethod_inInterface();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_overrideOnNonOverridingMethod_inSuperclass() async {
+ await super.test_overrideOnNonOverridingMethod_inSuperclass();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_overrideOnNonOverridingMethod_inSuperclass_abstract() async {
+ await super.test_overrideOnNonOverridingMethod_inSuperclass_abstract();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_overrideOnNonOverridingSetter_inInterface() async {
+ await super.test_overrideOnNonOverridingSetter_inInterface();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_overrideOnNonOverridingSetter_inSuperclass() async {
+ await super.test_overrideOnNonOverridingSetter_inSuperclass();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_proxy_annotation_prefixed() async {
+ await super.test_proxy_annotation_prefixed();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_proxy_annotation_prefixed2() async {
+ await super.test_proxy_annotation_prefixed2();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_proxy_annotation_prefixed3() async {
+ await super.test_proxy_annotation_prefixed3();
+ }
+
+ @override
+ @failingTest
@notForDart2
test_undefinedOperator_binaryExpression_inSubtype() async {
await super.test_undefinedOperator_binaryExpression_inSubtype();
@@ -133,22 +254,6 @@
// await super.test_unusedImport_annotationOnDirective();
}
- @override
- @failingTest
- test_overrideOnNonOverridingField_inSuperclass() {
- // Expected 1 errors of type
- // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
- return super.test_overrideOnNonOverridingField_inSuperclass();
- }
-
- @override
- @failingTest
- test_overrideOnNonOverridingField_inInterface() {
- // Expected 1 errors of type
- // StrongModeCode.STRONG_MODE_INVALID_METHOD_OVERRIDE, found 0
- return super.test_overrideOnNonOverridingField_inInterface();
- }
-
@failingTest
@override
@potentialAnalyzerProblem
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index a341ce7..9697a3c 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -508,8 +508,8 @@
}
@override
- void beginTypeVariable(Token name) {
- super.beginTypeVariable(name);
+ void beginTypeVariable(Token token) {
+ super.beginTypeVariable(token);
begin('TypeVariable');
}
@@ -1037,15 +1037,15 @@
}
@override
- void endTypeVariable(Token token, Token extendsOrSuper) {
+ void endTypeVariable(Token token, int index, Token extendsOrSuper) {
end('TypeVariable');
- super.endTypeVariable(token, extendsOrSuper);
+ super.endTypeVariable(token, index, extendsOrSuper);
}
@override
- void endTypeVariables(int count, Token beginToken, Token endToken) {
+ void endTypeVariables(Token beginToken, Token endToken) {
end('TypeVariables');
- super.endTypeVariables(count, beginToken, endToken);
+ super.endTypeVariables(beginToken, endToken);
}
@override
@@ -1169,4 +1169,9 @@
expectIn('CompilationUnit');
listener.handleScript(token);
}
+
+ @override
+ void handleTypeVariablesDefined(Token token, int count) {
+ listener.handleTypeVariablesDefined(token, count);
+ }
}
diff --git a/pkg/analyzer/test/generated/parser_forest_test.dart b/pkg/analyzer/test/generated/parser_forest_test.dart
deleted file mode 100644
index 7ca4c06..0000000
--- a/pkg/analyzer/test/generated/parser_forest_test.dart
+++ /dev/null
@@ -1,6141 +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.
-
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../src/fasta/body_builder_test_helper.dart';
-import 'parser_test.dart';
-
-main() {
- return CompilerTestContext.runWithTestOptions((_) {
- defineReflectiveSuite(() {
- defineReflectiveTests(ClassMemberParserTest_Forest);
- defineReflectiveTests(ComplexParserTest_Forest);
- defineReflectiveTests(ErrorParserTest_Forest);
- defineReflectiveTests(ExpressionParserTest_Forest);
- defineReflectiveTests(FormalParameterParserTest_Forest);
- defineReflectiveTests(RecoveryParserTest_Forest);
- defineReflectiveTests(SimpleParserTest_Forest);
- defineReflectiveTests(StatementParserTest_Forest);
- defineReflectiveTests(TopLevelParserTest_Forest);
- });
- });
-}
-
-void dart2Failure() {
- fail(
- 'This passes under Dart 1, but fails under Dart 2 because of a cast exception');
-}
-
-@reflectiveTest
-class ClassMemberParserTest_Forest extends FastaBodyBuilderTestCase
- with ClassMemberParserTestMixin {
- ClassMemberParserTest_Forest() : super(false);
-
- @failingTest
- void test_parseAwaitExpression_asStatement_inAsync() {
- super.test_parseAwaitExpression_asStatement_inAsync();
- }
-
- @failingTest
- void test_parseAwaitExpression_asStatement_inSync() {
- super.test_parseAwaitExpression_asStatement_inSync();
- }
-
- @failingTest
- void test_parseAwaitExpression_inSync() {
- super.test_parseAwaitExpression_inSync();
- }
-
- @failingTest
- void test_parseClassMember_constructor_withDocComment() {
- super.test_parseClassMember_constructor_withDocComment();
- }
-
- @failingTest
- void test_parseClassMember_constructor_withInitializers() {
- super.test_parseClassMember_constructor_withInitializers();
- }
-
- @failingTest
- void test_parseClassMember_field_covariant() {
- super.test_parseClassMember_field_covariant();
- }
-
- @failingTest
- void test_parseClassMember_field_generic() {
- super.test_parseClassMember_field_generic();
- }
-
- @failingTest
- void test_parseClassMember_field_gftType_gftReturnType() {
- super.test_parseClassMember_field_gftType_gftReturnType();
- }
-
- @failingTest
- void test_parseClassMember_field_gftType_noReturnType() {
- super.test_parseClassMember_field_gftType_noReturnType();
- }
-
- @failingTest
- void test_parseClassMember_field_instance_prefixedType() {
- super.test_parseClassMember_field_instance_prefixedType();
- }
-
- @failingTest
- void test_parseClassMember_field_namedGet() {
- super.test_parseClassMember_field_namedGet();
- }
-
- @failingTest
- void test_parseClassMember_field_namedOperator() {
- super.test_parseClassMember_field_namedOperator();
- }
-
- @failingTest
- void test_parseClassMember_field_namedOperator_withAssignment() {
- super.test_parseClassMember_field_namedOperator_withAssignment();
- }
-
- @failingTest
- void test_parseClassMember_field_namedSet() {
- super.test_parseClassMember_field_namedSet();
- }
-
- @failingTest
- void test_parseClassMember_field_nameKeyword() {
- super.test_parseClassMember_field_nameKeyword();
- }
-
- @failingTest
- void test_parseClassMember_field_nameMissing() {
- super.test_parseClassMember_field_nameMissing();
- }
-
- @failingTest
- void test_parseClassMember_field_nameMissing2() {
- super.test_parseClassMember_field_nameMissing2();
- }
-
- @failingTest
- void test_parseClassMember_field_static() {
- super.test_parseClassMember_field_static();
- }
-
- @failingTest
- void test_parseClassMember_getter_functionType() {
- super.test_parseClassMember_getter_functionType();
- }
-
- @failingTest
- void test_parseClassMember_getter_void() {
- super.test_parseClassMember_getter_void();
- }
-
- @failingTest
- void test_parseClassMember_method_external() {
- super.test_parseClassMember_method_external();
- }
-
- @failingTest
- void test_parseClassMember_method_external_withTypeAndArgs() {
- super.test_parseClassMember_method_external_withTypeAndArgs();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_comment_noReturnType() {
- super.test_parseClassMember_method_generic_comment_noReturnType();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_comment_parameterType() {
- super.test_parseClassMember_method_generic_comment_parameterType();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_comment_returnType() {
- super.test_parseClassMember_method_generic_comment_returnType();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_comment_returnType_bound() {
- super.test_parseClassMember_method_generic_comment_returnType_bound();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_comment_returnType_complex() {
- super.test_parseClassMember_method_generic_comment_returnType_complex();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_comment_void() {
- super.test_parseClassMember_method_generic_comment_void();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_noReturnType() {
- super.test_parseClassMember_method_generic_noReturnType();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_parameterType() {
- super.test_parseClassMember_method_generic_parameterType();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_returnType() {
- super.test_parseClassMember_method_generic_returnType();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_returnType_bound() {
- super.test_parseClassMember_method_generic_returnType_bound();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_returnType_complex() {
- super.test_parseClassMember_method_generic_returnType_complex();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_returnType_static() {
- super.test_parseClassMember_method_generic_returnType_static();
- }
-
- @failingTest
- void test_parseClassMember_method_generic_void() {
- super.test_parseClassMember_method_generic_void();
- }
-
- @failingTest
- void test_parseClassMember_method_get_noType() {
- super.test_parseClassMember_method_get_noType();
- }
-
- @failingTest
- void test_parseClassMember_method_get_type() {
- super.test_parseClassMember_method_get_type();
- }
-
- @failingTest
- void test_parseClassMember_method_get_void() {
- super.test_parseClassMember_method_get_void();
- }
-
- @failingTest
- void test_parseClassMember_method_gftReturnType_noReturnType() {
- super.test_parseClassMember_method_gftReturnType_noReturnType();
- }
-
- @failingTest
- void test_parseClassMember_method_gftReturnType_voidReturnType() {
- super.test_parseClassMember_method_gftReturnType_voidReturnType();
- }
-
- @failingTest
- void test_parseClassMember_method_native_allowed() {
- super.test_parseClassMember_method_native_allowed();
- }
-
- @failingTest
- void test_parseClassMember_method_native_missing_literal_allowed() {
- super.test_parseClassMember_method_native_missing_literal_allowed();
- }
-
- @failingTest
- void test_parseClassMember_method_native_missing_literal_not_allowed() {
- super.test_parseClassMember_method_native_missing_literal_not_allowed();
- }
-
- @failingTest
- void test_parseClassMember_method_native_not_allowed() {
- super.test_parseClassMember_method_native_not_allowed();
- }
-
- @failingTest
- void test_parseClassMember_method_native_with_body_allowed() {
- super.test_parseClassMember_method_native_with_body_allowed();
- }
-
- @failingTest
- void test_parseClassMember_method_native_with_body_not_allowed() {
- super.test_parseClassMember_method_native_with_body_not_allowed();
- }
-
- @failingTest
- void test_parseClassMember_method_operator_noType() {
- super.test_parseClassMember_method_operator_noType();
- }
-
- @failingTest
- void test_parseClassMember_method_operator_type() {
- super.test_parseClassMember_method_operator_type();
- }
-
- @failingTest
- void test_parseClassMember_method_operator_void() {
- super.test_parseClassMember_method_operator_void();
- }
-
- @failingTest
- void test_parseClassMember_method_returnType_functionType() {
- super.test_parseClassMember_method_returnType_functionType();
- }
-
- @failingTest
- void test_parseClassMember_method_returnType_parameterized() {
- super.test_parseClassMember_method_returnType_parameterized();
- }
-
- @failingTest
- void test_parseClassMember_method_set_noType() {
- super.test_parseClassMember_method_set_noType();
- }
-
- @failingTest
- void test_parseClassMember_method_set_type() {
- super.test_parseClassMember_method_set_type();
- }
-
- @failingTest
- void test_parseClassMember_method_set_void() {
- super.test_parseClassMember_method_set_void();
- }
-
- @failingTest
- void test_parseClassMember_method_static_generic_comment_returnType() {
- super.test_parseClassMember_method_static_generic_comment_returnType();
- }
-
- @failingTest
- void test_parseClassMember_method_trailing_commas() {
- super.test_parseClassMember_method_trailing_commas();
- }
-
- @failingTest
- void test_parseClassMember_operator_functionType() {
- super.test_parseClassMember_operator_functionType();
- }
-
- @failingTest
- void test_parseClassMember_operator_index() {
- super.test_parseClassMember_operator_index();
- }
-
- @failingTest
- void test_parseClassMember_operator_indexAssign() {
- super.test_parseClassMember_operator_indexAssign();
- }
-
- @failingTest
- void test_parseClassMember_operator_lessThan() {
- super.test_parseClassMember_operator_lessThan();
- }
-
- @failingTest
- void test_parseClassMember_redirectingFactory_const() {
- super.test_parseClassMember_redirectingFactory_const();
- }
-
- @failingTest
- void test_parseClassMember_redirectingFactory_expressionBody() {
- super.test_parseClassMember_redirectingFactory_expressionBody();
- }
-
- @failingTest
- void test_parseClassMember_redirectingFactory_nonConst() {
- super.test_parseClassMember_redirectingFactory_nonConst();
- }
-
- @failingTest
- void test_parseConstructor_assert() {
- super.test_parseConstructor_assert();
- }
-
- @failingTest
- void test_parseConstructor_factory_const_external() {
- super.test_parseConstructor_factory_const_external();
- }
-
- @failingTest
- void test_parseConstructor_factory_named() {
- super.test_parseConstructor_factory_named();
- }
-
- @failingTest
- void test_parseConstructor_initializers_field() {
- super.test_parseConstructor_initializers_field();
- }
-
- @failingTest
- void test_parseConstructor_named() {
- super.test_parseConstructor_named();
- }
-
- @failingTest
- void test_parseConstructor_unnamed() {
- super.test_parseConstructor_unnamed();
- }
-
- @failingTest
- void test_parseConstructor_with_pseudo_function_literal() {
- super.test_parseConstructor_with_pseudo_function_literal();
- }
-
- @failingTest
- void test_parseConstructorFieldInitializer_qualified() {
- super.test_parseConstructorFieldInitializer_qualified();
- }
-
- @failingTest
- void test_parseConstructorFieldInitializer_unqualified() {
- super.test_parseConstructorFieldInitializer_unqualified();
- }
-
- @failingTest
- void test_parseGetter_nonStatic() {
- super.test_parseGetter_nonStatic();
- }
-
- @failingTest
- void test_parseGetter_static() {
- super.test_parseGetter_static();
- }
-
- @failingTest
- void test_parseInitializedIdentifierList_type() {
- super.test_parseInitializedIdentifierList_type();
- }
-
- @failingTest
- void test_parseInitializedIdentifierList_var() {
- super.test_parseInitializedIdentifierList_var();
- }
-
- @failingTest
- void test_parseOperator() {
- super.test_parseOperator();
- }
-
- @failingTest
- void test_parseSetter_nonStatic() {
- super.test_parseSetter_nonStatic();
- }
-
- @failingTest
- void test_parseSetter_static() {
- super.test_parseSetter_static();
- }
-
- @failingTest
- void test_simpleFormalParameter_withDocComment() {
- super.test_simpleFormalParameter_withDocComment();
- }
-}
-
-@reflectiveTest
-class ComplexParserTest_Forest extends FastaBodyBuilderTestCase
- with ComplexParserTestMixin {
- ComplexParserTest_Forest() : super(false);
-
- @failingTest
- void test_additiveExpression_normal() {
- super.test_additiveExpression_normal();
- }
-
- @failingTest
- void test_additiveExpression_noSpaces() {
- super.test_additiveExpression_noSpaces();
- }
-
- @failingTest
- void test_additiveExpression_precedence_multiplicative_left() {
- super.test_additiveExpression_precedence_multiplicative_left();
- }
-
- @failingTest
- void test_additiveExpression_precedence_multiplicative_left_withSuper() {
- super.test_additiveExpression_precedence_multiplicative_left_withSuper();
- }
-
- @failingTest
- void test_additiveExpression_precedence_multiplicative_right() {
- super.test_additiveExpression_precedence_multiplicative_right();
- }
-
- @failingTest
- void test_additiveExpression_super() {
- super.test_additiveExpression_super();
- }
-
- @failingTest
- void test_assignableExpression_arguments_normal_chain() {
- super.test_assignableExpression_arguments_normal_chain();
- }
-
- @failingTest
- void test_assignableExpression_arguments_normal_chain_typeArgumentComments() {
- super
- .test_assignableExpression_arguments_normal_chain_typeArgumentComments();
- }
-
- @failingTest
- void test_assignableExpression_arguments_normal_chain_typeArguments() {
- super.test_assignableExpression_arguments_normal_chain_typeArguments();
- }
-
- @failingTest
- void test_assignmentExpression_compound() {
- super.test_assignmentExpression_compound();
- dart2Failure();
- }
-
- @failingTest
- void test_assignmentExpression_indexExpression() {
- super.test_assignmentExpression_indexExpression();
- dart2Failure();
- }
-
- @failingTest
- void test_assignmentExpression_prefixedIdentifier() {
- super.test_assignmentExpression_prefixedIdentifier();
- }
-
- @failingTest
- void test_assignmentExpression_propertyAccess() {
- super.test_assignmentExpression_propertyAccess();
- }
-
- @failingTest
- void test_bitwiseAndExpression_normal() {
- super.test_bitwiseAndExpression_normal();
- }
-
- @failingTest
- void test_bitwiseAndExpression_precedence_equality_left() {
- super.test_bitwiseAndExpression_precedence_equality_left();
- }
-
- @failingTest
- void test_bitwiseAndExpression_precedence_equality_right() {
- super.test_bitwiseAndExpression_precedence_equality_right();
- }
-
- @failingTest
- void test_bitwiseAndExpression_super() {
- super.test_bitwiseAndExpression_super();
- }
-
- @failingTest
- void test_bitwiseOrExpression_normal() {
- super.test_bitwiseOrExpression_normal();
- }
-
- @failingTest
- void test_bitwiseOrExpression_precedence_xor_left() {
- super.test_bitwiseOrExpression_precedence_xor_left();
- }
-
- @failingTest
- void test_bitwiseOrExpression_precedence_xor_right() {
- super.test_bitwiseOrExpression_precedence_xor_right();
- }
-
- @failingTest
- void test_bitwiseOrExpression_super() {
- super.test_bitwiseOrExpression_super();
- }
-
- @failingTest
- void test_bitwiseXorExpression_normal() {
- super.test_bitwiseXorExpression_normal();
- }
-
- @failingTest
- void test_bitwiseXorExpression_precedence_and_left() {
- super.test_bitwiseXorExpression_precedence_and_left();
- }
-
- @failingTest
- void test_bitwiseXorExpression_precedence_and_right() {
- super.test_bitwiseXorExpression_precedence_and_right();
- }
-
- @failingTest
- void test_bitwiseXorExpression_super() {
- super.test_bitwiseXorExpression_super();
- }
-
- @failingTest
- void test_cascade_withAssignment() {
- super.test_cascade_withAssignment();
- }
-
- @failingTest
- void test_conditionalExpression_precedence_ifNullExpression() {
- super.test_conditionalExpression_precedence_ifNullExpression();
- }
-
- @failingTest
- void test_conditionalExpression_precedence_logicalOrExpression() {
- super.test_conditionalExpression_precedence_logicalOrExpression();
- }
-
- @failingTest
- void test_conditionalExpression_precedence_nullableType_as() {
- super.test_conditionalExpression_precedence_nullableType_as();
- }
-
- @failingTest
- void test_conditionalExpression_precedence_nullableType_is() {
- super.test_conditionalExpression_precedence_nullableType_is();
- }
-
- @failingTest
- void test_constructor_initializer_withParenthesizedExpression() {
- super.test_constructor_initializer_withParenthesizedExpression();
- }
-
- @failingTest
- void test_equalityExpression_normal() {
- super.test_equalityExpression_normal();
- }
-
- @failingTest
- void test_equalityExpression_precedence_relational_left() {
- super.test_equalityExpression_precedence_relational_left();
- }
-
- @failingTest
- void test_equalityExpression_precedence_relational_right() {
- super.test_equalityExpression_precedence_relational_right();
- }
-
- @failingTest
- void test_equalityExpression_super() {
- super.test_equalityExpression_super();
- }
-
- @failingTest
- void test_ifNullExpression() {
- super.test_ifNullExpression();
- }
-
- @failingTest
- void test_ifNullExpression_precedence_logicalOr_left() {
- super.test_ifNullExpression_precedence_logicalOr_left();
- }
-
- @failingTest
- void test_ifNullExpression_precedence_logicalOr_right() {
- super.test_ifNullExpression_precedence_logicalOr_right();
- }
-
- @failingTest
- void test_logicalAndExpression() {
- super.test_logicalAndExpression();
- dart2Failure();
- }
-
- @failingTest
- void test_logicalAndExpression_precedence_bitwiseOr_left() {
- super.test_logicalAndExpression_precedence_bitwiseOr_left();
- }
-
- @failingTest
- void test_logicalAndExpression_precedence_bitwiseOr_right() {
- super.test_logicalAndExpression_precedence_bitwiseOr_right();
- }
-
- @failingTest
- void test_logicalAndExpressionStatement() {
- super.test_logicalAndExpressionStatement();
- }
-
- @failingTest
- void test_logicalOrExpression() {
- super.test_logicalOrExpression();
- dart2Failure();
- }
-
- @failingTest
- void test_logicalOrExpression_precedence_logicalAnd_left() {
- super.test_logicalOrExpression_precedence_logicalAnd_left();
- dart2Failure();
- }
-
- @failingTest
- void test_logicalOrExpression_precedence_logicalAnd_right() {
- super.test_logicalOrExpression_precedence_logicalAnd_right();
- dart2Failure();
- }
-
- @failingTest
- void test_methodInvocation1() {
- super.test_methodInvocation1();
- }
-
- @failingTest
- void test_methodInvocation2() {
- super.test_methodInvocation2();
- }
-
- @failingTest
- void test_methodInvocation3() {
- super.test_methodInvocation3();
- }
-
- @failingTest
- void test_multiplicativeExpression_normal() {
- super.test_multiplicativeExpression_normal();
- }
-
- @failingTest
- void test_multiplicativeExpression_precedence_unary_left() {
- super.test_multiplicativeExpression_precedence_unary_left();
- }
-
- @failingTest
- void test_multiplicativeExpression_precedence_unary_right() {
- super.test_multiplicativeExpression_precedence_unary_right();
- }
-
- @failingTest
- void test_multiplicativeExpression_super() {
- super.test_multiplicativeExpression_super();
- }
-
- @failingTest
- void test_relationalExpression_precedence_shift_right() {
- super.test_relationalExpression_precedence_shift_right();
- }
-
- @failingTest
- void test_shiftExpression_normal() {
- super.test_shiftExpression_normal();
- }
-
- @failingTest
- void test_shiftExpression_precedence_additive_left() {
- super.test_shiftExpression_precedence_additive_left();
- }
-
- @failingTest
- void test_shiftExpression_precedence_additive_right() {
- super.test_shiftExpression_precedence_additive_right();
- }
-
- @failingTest
- void test_shiftExpression_super() {
- super.test_shiftExpression_super();
- }
-
- @failingTest
- void test_topLevelFunction_nestedGenericFunction() {
- super.test_topLevelFunction_nestedGenericFunction();
- }
-}
-
-@reflectiveTest
-class ErrorParserTest_Forest extends FastaBodyBuilderTestCase
- with ErrorParserTestMixin {
- ErrorParserTest_Forest() : super(false);
-
- @failingTest
- void test_abstractClassMember_constructor() {
- super.test_abstractClassMember_constructor();
- }
-
- @failingTest
- void test_abstractClassMember_field() {
- super.test_abstractClassMember_field();
- }
-
- @failingTest
- void test_abstractClassMember_getter() {
- super.test_abstractClassMember_getter();
- }
-
- @failingTest
- void test_abstractClassMember_method() {
- super.test_abstractClassMember_method();
- }
-
- @failingTest
- void test_abstractClassMember_setter() {
- super.test_abstractClassMember_setter();
- }
-
- @failingTest
- void test_abstractEnum() {
- super.test_abstractEnum();
- }
-
- @failingTest
- void test_abstractTopLevelFunction_function() {
- super.test_abstractTopLevelFunction_function();
- }
-
- @failingTest
- void test_abstractTopLevelFunction_getter() {
- super.test_abstractTopLevelFunction_getter();
- }
-
- @failingTest
- void test_abstractTopLevelFunction_setter() {
- super.test_abstractTopLevelFunction_setter();
- }
-
- @failingTest
- void test_abstractTopLevelVariable() {
- super.test_abstractTopLevelVariable();
- }
-
- @failingTest
- void test_abstractTypeDef() {
- super.test_abstractTypeDef();
- }
-
- @failingTest
- void test_breakOutsideOfLoop_breakInForStatement() {
- super.test_breakOutsideOfLoop_breakInForStatement();
- }
-
- @failingTest
- void test_breakOutsideOfLoop_breakInIfStatement() {
- super.test_breakOutsideOfLoop_breakInIfStatement();
- }
-
- @failingTest
- void test_breakOutsideOfLoop_breakInSwitchStatement() {
- super.test_breakOutsideOfLoop_breakInSwitchStatement();
- }
-
- @failingTest
- void test_breakOutsideOfLoop_functionExpression_inALoop() {
- super.test_breakOutsideOfLoop_functionExpression_inALoop();
- }
-
- @failingTest
- void test_breakOutsideOfLoop_functionExpression_withALoop() {
- super.test_breakOutsideOfLoop_functionExpression_withALoop();
- }
-
- @failingTest
- void test_classInClass_abstract() {
- super.test_classInClass_abstract();
- }
-
- @failingTest
- void test_classInClass_nonAbstract() {
- super.test_classInClass_nonAbstract();
- }
-
- @failingTest
- void test_classTypeAlias_abstractAfterEq() {
- super.test_classTypeAlias_abstractAfterEq();
- }
-
- @failingTest
- void test_colonInPlaceOfIn() {
- super.test_colonInPlaceOfIn();
- }
-
- @failingTest
- void test_constAndCovariant() {
- super.test_constAndCovariant();
- }
-
- @failingTest
- void test_constAndFinal() {
- super.test_constAndFinal();
- }
-
- @failingTest
- void test_constAndVar() {
- super.test_constAndVar();
- }
-
- @failingTest
- void test_constClass() {
- super.test_constClass();
- }
-
- @failingTest
- void test_constConstructorWithBody() {
- super.test_constConstructorWithBody();
- }
-
- @failingTest
- void test_constEnum() {
- super.test_constEnum();
- }
-
- @failingTest
- void test_constFactory() {
- super.test_constFactory();
- }
-
- @failingTest
- void test_constMethod() {
- super.test_constMethod();
- }
-
- @failingTest
- void test_constructorPartial() {
- super.test_constructorPartial();
- }
-
- @failingTest
- void test_constructorPartial2() {
- super.test_constructorPartial();
- }
-
- @failingTest
- void test_constructorPartial3() {
- super.test_constructorPartial();
- }
-
- @failingTest
- void test_constructorWithReturnType() {
- super.test_constructorWithReturnType();
- }
-
- @failingTest
- void test_constructorWithReturnType_var() {
- super.test_constructorWithReturnType_var();
- }
-
- @failingTest
- void test_constTypedef() {
- super.test_constTypedef();
- }
-
- @failingTest
- void test_continueOutsideOfLoop_continueInForStatement() {
- super.test_continueOutsideOfLoop_continueInForStatement();
- }
-
- @failingTest
- void test_continueOutsideOfLoop_continueInIfStatement() {
- super.test_continueOutsideOfLoop_continueInIfStatement();
- }
-
- @failingTest
- void test_continueOutsideOfLoop_continueInSwitchStatement() {
- super.test_continueOutsideOfLoop_continueInSwitchStatement();
- }
-
- @failingTest
- void test_continueOutsideOfLoop_functionExpression_inALoop() {
- super.test_continueOutsideOfLoop_functionExpression_inALoop();
- }
-
- @failingTest
- void test_continueOutsideOfLoop_functionExpression_withALoop() {
- super.test_continueOutsideOfLoop_functionExpression_withALoop();
- }
-
- @failingTest
- void test_continueWithoutLabelInCase_error() {
- super.test_continueWithoutLabelInCase_error();
- }
-
- @failingTest
- void test_continueWithoutLabelInCase_noError() {
- super.test_continueWithoutLabelInCase_noError();
- }
-
- @failingTest
- void test_continueWithoutLabelInCase_noError_switchInLoop() {
- super.test_continueWithoutLabelInCase_noError_switchInLoop();
- }
-
- @failingTest
- void test_covariantAfterVar() {
- super.test_covariantAfterVar();
- }
-
- @failingTest
- void test_covariantAndFinal() {
- super.test_covariantAndFinal();
- }
-
- @failingTest
- void test_covariantAndStatic() {
- super.test_covariantAndStatic();
- }
-
- @failingTest
- void test_covariantAndType_local() {
- super.test_covariantAndType_local();
- }
-
- @failingTest
- void test_covariantConstructor() {
- super.test_covariantConstructor();
- }
-
- @failingTest
- void test_covariantMember_getter_noReturnType() {
- super.test_covariantMember_getter_noReturnType();
- }
-
- @failingTest
- void test_covariantMember_getter_returnType() {
- super.test_covariantMember_getter_returnType();
- }
-
- @failingTest
- void test_covariantMember_method() {
- super.test_covariantMember_method();
- }
-
- @failingTest
- void test_covariantTopLevelDeclaration_class() {
- super.test_covariantTopLevelDeclaration_class();
- }
-
- @failingTest
- void test_covariantTopLevelDeclaration_enum() {
- super.test_covariantTopLevelDeclaration_enum();
- }
-
- @failingTest
- void test_covariantTopLevelDeclaration_typedef() {
- super.test_covariantTopLevelDeclaration_typedef();
- }
-
- @failingTest
- void test_defaultValueInFunctionType_named_colon() {
- super.test_defaultValueInFunctionType_named_colon();
- }
-
- @failingTest
- void test_defaultValueInFunctionType_named_equal() {
- super.test_defaultValueInFunctionType_named_equal();
- }
-
- @failingTest
- void test_defaultValueInFunctionType_positional() {
- super.test_defaultValueInFunctionType_positional();
- }
-
- @failingTest
- void test_directiveAfterDeclaration_classBeforeDirective() {
- super.test_directiveAfterDeclaration_classBeforeDirective();
- }
-
- @failingTest
- void test_directiveAfterDeclaration_classBetweenDirectives() {
- super.test_directiveAfterDeclaration_classBetweenDirectives();
- }
-
- @failingTest
- void test_duplicatedModifier_const() {
- super.test_duplicatedModifier_const();
- }
-
- @failingTest
- void test_duplicatedModifier_external() {
- super.test_duplicatedModifier_external();
- }
-
- @failingTest
- void test_duplicatedModifier_factory() {
- super.test_duplicatedModifier_factory();
- }
-
- @failingTest
- void test_duplicatedModifier_final() {
- super.test_duplicatedModifier_final();
- }
-
- @failingTest
- void test_duplicatedModifier_static() {
- super.test_duplicatedModifier_static();
- }
-
- @failingTest
- void test_duplicatedModifier_var() {
- super.test_duplicatedModifier_var();
- }
-
- @failingTest
- void test_duplicateLabelInSwitchStatement() {
- super.test_duplicateLabelInSwitchStatement();
- }
-
- @failingTest
- void test_emptyEnumBody() {
- super.test_emptyEnumBody();
- }
-
- @failingTest
- void test_enumInClass() {
- super.test_enumInClass();
- }
-
- @failingTest
- void test_equalityCannotBeEqualityOperand_eq_eq() {
- super.test_equalityCannotBeEqualityOperand_eq_eq();
- }
-
- @failingTest
- void test_equalityCannotBeEqualityOperand_eq_neq() {
- super.test_equalityCannotBeEqualityOperand_eq_neq();
- }
-
- @failingTest
- void test_equalityCannotBeEqualityOperand_neq_eq() {
- super.test_equalityCannotBeEqualityOperand_neq_eq();
- }
-
- @failingTest
- void test_expectedCaseOrDefault() {
- super.test_expectedCaseOrDefault();
- }
-
- @failingTest
- void test_expectedClassMember_inClass_afterType() {
- super.test_expectedClassMember_inClass_afterType();
- }
-
- @failingTest
- void test_expectedClassMember_inClass_beforeType() {
- super.test_expectedClassMember_inClass_beforeType();
- }
-
- @failingTest
- void test_expectedExecutable_afterAnnotation_atEOF() {
- super.test_expectedExecutable_afterAnnotation_atEOF();
- }
-
- @failingTest
- void test_expectedExecutable_inClass_afterVoid() {
- super.test_expectedExecutable_inClass_afterVoid();
- }
-
- @failingTest
- void test_expectedExecutable_topLevel_afterType() {
- super.test_expectedExecutable_topLevel_afterType();
- }
-
- @failingTest
- void test_expectedExecutable_topLevel_afterVoid() {
- super.test_expectedExecutable_topLevel_afterVoid();
- }
-
- @failingTest
- void test_expectedExecutable_topLevel_beforeType() {
- super.test_expectedExecutable_topLevel_beforeType();
- }
-
- @failingTest
- void test_expectedExecutable_topLevel_eof() {
- super.test_expectedExecutable_topLevel_eof();
- }
-
- @failingTest
- void test_expectedInterpolationIdentifier() {
- super.test_expectedInterpolationIdentifier();
- }
-
- @failingTest
- void test_expectedInterpolationIdentifier_emptyString() {
- super.test_expectedInterpolationIdentifier_emptyString();
- }
-
- @failingTest
- void test_expectedListOrMapLiteral() {
- super.test_expectedListOrMapLiteral();
- }
-
- @failingTest
- void test_expectedStringLiteral() {
- super.test_expectedStringLiteral();
- }
-
- @failingTest
- void test_expectedToken_commaMissingInArgumentList() {
- super.test_expectedToken_commaMissingInArgumentList();
- }
-
- @failingTest
- void test_expectedToken_parseStatement_afterVoid() {
- super.test_expectedToken_parseStatement_afterVoid();
- }
-
- @failingTest
- void test_expectedToken_semicolonMissingAfterExport() {
- super.test_expectedToken_semicolonMissingAfterExport();
- }
-
- @failingTest
- void test_expectedToken_semicolonMissingAfterExpression() {
- super.test_expectedToken_semicolonMissingAfterExpression();
- }
-
- @failingTest
- void test_expectedToken_semicolonMissingAfterImport() {
- super.test_expectedToken_semicolonMissingAfterImport();
- }
-
- @failingTest
- void test_expectedToken_uriAndSemicolonMissingAfterExport() {
- super.test_expectedToken_uriAndSemicolonMissingAfterExport();
- }
-
- @failingTest
- void test_expectedToken_whileMissingInDoStatement() {
- super.test_expectedToken_whileMissingInDoStatement();
- }
-
- @failingTest
- void test_expectedTypeName_as() {
- super.test_expectedTypeName_as();
- }
-
- @failingTest
- void test_expectedTypeName_as_void() {
- super.test_expectedTypeName_as_void();
- }
-
- @failingTest
- void test_expectedTypeName_is() {
- super.test_expectedTypeName_is();
- }
-
- @failingTest
- void test_expectedTypeName_is_void() {
- super.test_expectedTypeName_is_void();
- }
-
- @failingTest
- void test_exportAsType() {
- super.test_exportAsType();
- }
-
- @failingTest
- void test_exportAsType_inClass() {
- super.test_exportAsType_inClass();
- }
-
- @failingTest
- void test_exportDirectiveAfterPartDirective() {
- super.test_exportDirectiveAfterPartDirective();
- }
-
- @failingTest
- void test_externalAfterConst() {
- super.test_externalAfterConst();
- }
-
- @failingTest
- void test_externalAfterFactory() {
- super.test_externalAfterFactory();
- }
-
- @failingTest
- void test_externalAfterStatic() {
- super.test_externalAfterStatic();
- }
-
- @failingTest
- void test_externalClass() {
- super.test_externalClass();
- }
-
- @failingTest
- void test_externalConstructorWithBody_factory() {
- super.test_externalConstructorWithBody_factory();
- }
-
- @failingTest
- void test_externalConstructorWithBody_named() {
- super.test_externalConstructorWithBody_named();
- }
-
- @failingTest
- void test_externalEnum() {
- super.test_externalEnum();
- }
-
- @failingTest
- void test_externalField_const() {
- super.test_externalField_const();
- }
-
- @failingTest
- void test_externalField_final() {
- super.test_externalField_final();
- }
-
- @failingTest
- void test_externalField_static() {
- super.test_externalField_static();
- }
-
- @failingTest
- void test_externalField_typed() {
- super.test_externalField_typed();
- }
-
- @failingTest
- void test_externalField_untyped() {
- super.test_externalField_untyped();
- }
-
- @failingTest
- void test_externalGetterWithBody() {
- super.test_externalGetterWithBody();
- }
-
- @failingTest
- void test_externalMethodWithBody() {
- super.test_externalMethodWithBody();
- }
-
- @failingTest
- void test_externalOperatorWithBody() {
- super.test_externalOperatorWithBody();
- }
-
- @failingTest
- void test_externalSetterWithBody() {
- super.test_externalSetterWithBody();
- }
-
- @failingTest
- void test_externalTypedef() {
- super.test_externalTypedef();
- }
-
- @failingTest
- void test_extraCommaInParameterList() {
- super.test_extraCommaInParameterList();
- }
-
- @failingTest
- void test_extraCommaTrailingNamedParameterGroup() {
- super.test_extraCommaTrailingNamedParameterGroup();
- }
-
- @failingTest
- void test_extraCommaTrailingPositionalParameterGroup() {
- super.test_extraCommaTrailingPositionalParameterGroup();
- }
-
- @failingTest
- void test_extraTrailingCommaInParameterList() {
- super.test_extraTrailingCommaInParameterList();
- }
-
- @failingTest
- void test_factoryTopLevelDeclaration_class() {
- super.test_factoryTopLevelDeclaration_class();
- }
-
- @failingTest
- void test_factoryTopLevelDeclaration_enum() {
- super.test_factoryTopLevelDeclaration_enum();
- }
-
- @failingTest
- void test_factoryTopLevelDeclaration_typedef() {
- super.test_factoryTopLevelDeclaration_typedef();
- }
-
- @failingTest
- void test_factoryWithInitializers() {
- super.test_factoryWithInitializers();
- }
-
- @failingTest
- void test_factoryWithoutBody() {
- super.test_factoryWithoutBody();
- }
-
- @failingTest
- void test_fieldInitializerOutsideConstructor() {
- super.test_fieldInitializerOutsideConstructor();
- }
-
- @failingTest
- void test_finalAndCovariant() {
- super.test_finalAndCovariant();
- }
-
- @failingTest
- void test_finalAndVar() {
- super.test_finalAndVar();
- }
-
- @failingTest
- void test_finalClass() {
- super.test_finalClass();
- }
-
- @failingTest
- void test_finalClassMember_modifierOnly() {
- super.test_finalClassMember_modifierOnly();
- }
-
- @failingTest
- void test_finalConstructor() {
- super.test_finalConstructor();
- }
-
- @failingTest
- void test_finalEnum() {
- super.test_finalEnum();
- }
-
- @failingTest
- void test_finalMethod() {
- super.test_finalMethod();
- }
-
- @failingTest
- void test_finalTypedef() {
- super.test_finalTypedef();
- }
-
- @failingTest
- void test_functionTypedField_invalidType_abstract() {
- super.test_functionTypedField_invalidType_abstract();
- }
-
- @failingTest
- void test_functionTypedField_invalidType_class() {
- super.test_functionTypedField_invalidType_class();
- }
-
- @failingTest
- void test_functionTypedParameter_const() {
- super.test_functionTypedParameter_const();
- }
-
- @failingTest
- void test_functionTypedParameter_final() {
- super.test_functionTypedParameter_final();
- }
-
- @failingTest
- void test_functionTypedParameter_incomplete1() {
- super.test_functionTypedParameter_incomplete1();
- }
-
- @failingTest
- void test_functionTypedParameter_var() {
- super.test_functionTypedParameter_var();
- }
-
- @failingTest
- void test_genericFunctionType_asIdentifier() {
- super.test_genericFunctionType_asIdentifier();
- }
-
- @failingTest
- void test_genericFunctionType_asIdentifier2() {
- super.test_genericFunctionType_asIdentifier2();
- }
-
- @failingTest
- void test_genericFunctionType_asIdentifier3() {
- super.test_genericFunctionType_asIdentifier3();
- }
-
- @failingTest
- void test_genericFunctionType_extraLessThan() {
- super.test_genericFunctionType_extraLessThan();
- }
-
- @failingTest
- void test_getterInFunction_block_noReturnType() {
- super.test_getterInFunction_block_noReturnType();
- }
-
- @failingTest
- void test_getterInFunction_block_returnType() {
- super.test_getterInFunction_block_returnType();
- }
-
- @failingTest
- void test_getterInFunction_expression_noReturnType() {
- super.test_getterInFunction_expression_noReturnType();
- }
-
- @failingTest
- void test_getterInFunction_expression_returnType() {
- super.test_getterInFunction_expression_returnType();
- }
-
- @failingTest
- void test_getterWithParameters() {
- super.test_getterWithParameters();
- }
-
- @failingTest
- void test_illegalAssignmentToNonAssignable_assign_int() {
- super.test_illegalAssignmentToNonAssignable_assign_int();
- }
-
- @failingTest
- void test_illegalAssignmentToNonAssignable_assign_this() {
- super.test_illegalAssignmentToNonAssignable_assign_this();
- }
-
- @failingTest
- void test_illegalAssignmentToNonAssignable_postfix_minusMinus_literal() {
- super.test_illegalAssignmentToNonAssignable_postfix_minusMinus_literal();
- }
-
- @failingTest
- void test_illegalAssignmentToNonAssignable_postfix_plusPlus_literal() {
- super.test_illegalAssignmentToNonAssignable_postfix_plusPlus_literal();
- }
-
- @failingTest
- void test_illegalAssignmentToNonAssignable_postfix_plusPlus_parenthesized() {
- super
- .test_illegalAssignmentToNonAssignable_postfix_plusPlus_parenthesized();
- }
-
- @failingTest
- void test_illegalAssignmentToNonAssignable_primarySelectorPostfix() {
- super.test_illegalAssignmentToNonAssignable_primarySelectorPostfix();
- }
-
- @failingTest
- void test_illegalAssignmentToNonAssignable_superAssigned() {
- super.test_illegalAssignmentToNonAssignable_superAssigned();
- }
-
- @failingTest
- void test_implementsBeforeExtends() {
- super.test_implementsBeforeExtends();
- }
-
- @failingTest
- void test_implementsBeforeWith() {
- super.test_implementsBeforeWith();
- }
-
- @failingTest
- void test_importDirectiveAfterPartDirective() {
- super.test_importDirectiveAfterPartDirective();
- }
-
- @failingTest
- void test_initializedVariableInForEach() {
- super.test_initializedVariableInForEach();
- }
-
- @failingTest
- void test_initializedVariableInForEach_annotation() {
- super.test_initializedVariableInForEach_annotation();
- }
-
- @failingTest
- void test_initializedVariableInForEach_localFunction() {
- super.test_initializedVariableInForEach_localFunction();
- }
-
- @failingTest
- void test_initializedVariableInForEach_localFunction2() {
- super.test_initializedVariableInForEach_localFunction2();
- }
-
- @failingTest
- void test_initializedVariableInForEach_var() {
- super.test_initializedVariableInForEach_var();
- }
-
- @failingTest
- void test_invalidAwaitInFor() {
- super.test_invalidAwaitInFor();
- }
-
- @failingTest
- void test_invalidCommentReference__new_nonIdentifier() {
- super.test_invalidCommentReference__new_nonIdentifier();
- }
-
- @failingTest
- void test_invalidCommentReference__new_tooMuch() {
- super.test_invalidCommentReference__new_tooMuch();
- }
-
- @failingTest
- void test_invalidCommentReference__nonNew_nonIdentifier() {
- super.test_invalidCommentReference__nonNew_nonIdentifier();
- }
-
- @failingTest
- void test_invalidCommentReference__nonNew_tooMuch() {
- super.test_invalidCommentReference__nonNew_tooMuch();
- }
-
- @failingTest
- void test_invalidConstructorName_star() {
- super.test_invalidConstructorName_star();
- }
-
- @failingTest
- void test_invalidConstructorName_with() {
- super.test_invalidConstructorName_with();
- }
-
- @failingTest
- void test_invalidInterpolationIdentifier_startWithDigit() {
- super.test_invalidInterpolationIdentifier_startWithDigit();
- }
-
- @failingTest
- void test_invalidLiteralInConfiguration() {
- super.test_invalidLiteralInConfiguration();
- }
-
- @failingTest
- void test_invalidOperator() {
- super.test_invalidOperator();
- }
-
- @failingTest
- void test_invalidOperator_unary() {
- super.test_invalidOperator_unary();
- }
-
- @failingTest
- void test_invalidOperatorAfterSuper_assignableExpression() {
- super.test_invalidOperatorAfterSuper_assignableExpression();
- }
-
- @failingTest
- void test_invalidOperatorAfterSuper_primaryExpression() {
- super.test_invalidOperatorAfterSuper_primaryExpression();
- }
-
- @failingTest
- void test_invalidOperatorForSuper() {
- super.test_invalidOperatorForSuper();
- }
-
- @failingTest
- void test_invalidStarAfterAsync() {
- super.test_invalidStarAfterAsync();
- }
-
- @failingTest
- void test_invalidSync() {
- super.test_invalidSync();
- }
-
- @failingTest
- void test_invalidTopLevelSetter() {
- super.test_invalidTopLevelSetter();
- }
-
- @failingTest
- void test_invalidTopLevelVar() {
- super.test_invalidTopLevelVar();
- }
-
- @failingTest
- void test_invalidTypedef() {
- super.test_invalidTypedef();
- }
-
- @failingTest
- void test_invalidTypedef2() {
- super.test_invalidTypedef2();
- }
-
- @failingTest
- void test_invalidUnicodeEscape_incomplete_noDigits() {
- super.test_invalidUnicodeEscape_incomplete_noDigits();
- }
-
- @failingTest
- void test_invalidUnicodeEscape_incomplete_someDigits() {
- super.test_invalidUnicodeEscape_incomplete_someDigits();
- }
-
- @failingTest
- void test_invalidUnicodeEscape_invalidDigit() {
- super.test_invalidUnicodeEscape_invalidDigit();
- }
-
- @failingTest
- void test_invalidUnicodeEscape_tooFewDigits_fixed() {
- super.test_invalidUnicodeEscape_tooFewDigits_fixed();
- }
-
- @failingTest
- void test_invalidUnicodeEscape_tooFewDigits_variable() {
- super.test_invalidUnicodeEscape_tooFewDigits_variable();
- }
-
- @failingTest
- void test_invalidUnicodeEscape_tooManyDigits_variable() {
- super.test_invalidUnicodeEscape_tooManyDigits_variable();
- }
-
- @failingTest
- void test_libraryDirectiveNotFirst() {
- super.test_libraryDirectiveNotFirst();
- }
-
- @failingTest
- void test_libraryDirectiveNotFirst_afterPart() {
- super.test_libraryDirectiveNotFirst_afterPart();
- }
-
- @failingTest
- void test_localFunction_annotation() {
- super.test_localFunction_annotation();
- }
-
- @failingTest
- void test_localFunctionDeclarationModifier_abstract() {
- super.test_localFunctionDeclarationModifier_abstract();
- }
-
- @failingTest
- void test_localFunctionDeclarationModifier_external() {
- super.test_localFunctionDeclarationModifier_external();
- }
-
- @failingTest
- void test_localFunctionDeclarationModifier_factory() {
- super.test_localFunctionDeclarationModifier_factory();
- }
-
- @failingTest
- void test_localFunctionDeclarationModifier_static() {
- super.test_localFunctionDeclarationModifier_static();
- }
-
- @failingTest
- void test_method_invalidTypeParameterComments() {
- super.test_method_invalidTypeParameterComments();
- }
-
- @failingTest
- void test_method_invalidTypeParameterExtends() {
- super.test_method_invalidTypeParameterExtends();
- }
-
- @failingTest
- void test_method_invalidTypeParameterExtendsComment() {
- super.test_method_invalidTypeParameterExtendsComment();
- }
-
- @failingTest
- void test_method_invalidTypeParameters() {
- super.test_method_invalidTypeParameters();
- }
-
- @failingTest
- void test_missingAssignableSelector_identifiersAssigned() {
- super.test_missingAssignableSelector_identifiersAssigned();
- dart2Failure();
- }
-
- @failingTest
- void test_missingAssignableSelector_prefix_minusMinus_literal() {
- super.test_missingAssignableSelector_prefix_minusMinus_literal();
- }
-
- @failingTest
- void test_missingAssignableSelector_prefix_plusPlus_literal() {
- super.test_missingAssignableSelector_prefix_plusPlus_literal();
- }
-
- @failingTest
- void test_missingAssignableSelector_selector() {
- super.test_missingAssignableSelector_selector();
- }
-
- @failingTest
- void test_missingAssignableSelector_superPrimaryExpression() {
- super.test_missingAssignableSelector_superPrimaryExpression();
- }
-
- @failingTest
- void test_missingAssignableSelector_superPropertyAccessAssigned() {
- super.test_missingAssignableSelector_superPropertyAccessAssigned();
- dart2Failure();
- }
-
- @failingTest
- void test_missingCatchOrFinally() {
- super.test_missingCatchOrFinally();
- }
-
- @failingTest
- void test_missingClassBody() {
- super.test_missingClassBody();
- }
-
- @failingTest
- void test_missingClosingParenthesis() {
- super.test_missingClosingParenthesis();
- }
-
- @failingTest
- void test_missingConstFinalVarOrType_static() {
- super.test_missingConstFinalVarOrType_static();
- }
-
- @failingTest
- void test_missingConstFinalVarOrType_topLevel() {
- super.test_missingConstFinalVarOrType_topLevel();
- }
-
- @failingTest
- void test_missingEnumBody() {
- super.test_missingEnumBody();
- }
-
- @failingTest
- void test_missingEnumComma() {
- super.test_missingEnumComma();
- }
-
- @failingTest
- void test_missingExpressionInThrow() {
- super.test_missingExpressionInThrow();
- }
-
- @failingTest
- void test_missingFunctionBody_emptyNotAllowed() {
- super.test_missingFunctionBody_emptyNotAllowed();
- }
-
- @failingTest
- void test_missingFunctionBody_invalid() {
- super.test_missingFunctionBody_invalid();
- }
-
- @failingTest
- void test_missingFunctionParameters_local_nonVoid_block() {
- super.test_missingFunctionParameters_local_nonVoid_block();
- }
-
- @failingTest
- void test_missingFunctionParameters_local_nonVoid_expression() {
- super.test_missingFunctionParameters_local_nonVoid_expression();
- }
-
- @failingTest
- void test_missingFunctionParameters_local_void_block() {
- super.test_missingFunctionParameters_local_void_block();
- }
-
- @failingTest
- void test_missingFunctionParameters_local_void_expression() {
- super.test_missingFunctionParameters_local_void_expression();
- }
-
- @failingTest
- void test_missingFunctionParameters_topLevel_nonVoid_block() {
- super.test_missingFunctionParameters_topLevel_nonVoid_block();
- }
-
- @failingTest
- void test_missingFunctionParameters_topLevel_nonVoid_expression() {
- super.test_missingFunctionParameters_topLevel_nonVoid_expression();
- }
-
- @failingTest
- void test_missingFunctionParameters_topLevel_void_block() {
- super.test_missingFunctionParameters_topLevel_void_block();
- }
-
- @failingTest
- void test_missingFunctionParameters_topLevel_void_expression() {
- super.test_missingFunctionParameters_topLevel_void_expression();
- }
-
- @failingTest
- void test_missingIdentifier_afterOperator() {
- super.test_missingIdentifier_afterOperator();
- }
-
- @failingTest
- void test_missingIdentifier_beforeClosingCurly() {
- super.test_missingIdentifier_beforeClosingCurly();
- }
-
- @failingTest
- void test_missingIdentifier_inEnum() {
- super.test_missingIdentifier_inEnum();
- }
-
- @failingTest
- void test_missingIdentifier_inParameterGroupNamed() {
- super.test_missingIdentifier_inParameterGroupNamed();
- }
-
- @failingTest
- void test_missingIdentifier_inParameterGroupOptional() {
- super.test_missingIdentifier_inParameterGroupOptional();
- }
-
- @failingTest
- void test_missingIdentifier_inSymbol_afterPeriod() {
- super.test_missingIdentifier_inSymbol_afterPeriod();
- }
-
- @failingTest
- void test_missingIdentifier_inSymbol_first() {
- super.test_missingIdentifier_inSymbol_first();
- }
-
- @failingTest
- void test_missingIdentifierForParameterGroup() {
- super.test_missingIdentifierForParameterGroup();
- }
-
- @failingTest
- void test_missingKeywordOperator() {
- super.test_missingKeywordOperator();
- }
-
- @failingTest
- void test_missingKeywordOperator_parseClassMember() {
- super.test_missingKeywordOperator_parseClassMember();
- }
-
- @failingTest
- void test_missingKeywordOperator_parseClassMember_afterTypeName() {
- super.test_missingKeywordOperator_parseClassMember_afterTypeName();
- }
-
- @failingTest
- void test_missingKeywordOperator_parseClassMember_afterVoid() {
- super.test_missingKeywordOperator_parseClassMember_afterVoid();
- }
-
- @failingTest
- void test_missingMethodParameters_void_block() {
- super.test_missingMethodParameters_void_block();
- }
-
- @failingTest
- void test_missingMethodParameters_void_expression() {
- super.test_missingMethodParameters_void_expression();
- }
-
- @failingTest
- void test_missingNameForNamedParameter_colon() {
- super.test_missingNameForNamedParameter_colon();
- }
-
- @failingTest
- void test_missingNameForNamedParameter_equals() {
- super.test_missingNameForNamedParameter_equals();
- }
-
- @failingTest
- void test_missingNameForNamedParameter_noDefault() {
- super.test_missingNameForNamedParameter_noDefault();
- }
-
- @failingTest
- void test_missingNameInLibraryDirective() {
- super.test_missingNameInLibraryDirective();
- }
-
- @failingTest
- void test_missingNameInPartOfDirective() {
- super.test_missingNameInPartOfDirective();
- }
-
- @failingTest
- void test_missingPrefixInDeferredImport() {
- super.test_missingPrefixInDeferredImport();
- }
-
- @failingTest
- void test_missingStartAfterSync() {
- super.test_missingStartAfterSync();
- }
-
- @failingTest
- void test_missingStatement() {
- super.test_missingStatement();
- }
-
- @failingTest
- void test_missingStatement_afterVoid() {
- super.test_missingStatement_afterVoid();
- }
-
- @failingTest
- void test_missingTerminatorForParameterGroup_named() {
- super.test_missingTerminatorForParameterGroup_named();
- }
-
- @failingTest
- void test_missingTerminatorForParameterGroup_optional() {
- super.test_missingTerminatorForParameterGroup_optional();
- }
-
- @failingTest
- void test_missingTypedefParameters_nonVoid() {
- super.test_missingTypedefParameters_nonVoid();
- }
-
- @failingTest
- void test_missingTypedefParameters_typeParameters() {
- super.test_missingTypedefParameters_typeParameters();
- }
-
- @failingTest
- void test_missingTypedefParameters_void() {
- super.test_missingTypedefParameters_void();
- }
-
- @failingTest
- void test_missingVariableInForEach() {
- super.test_missingVariableInForEach();
- }
-
- @failingTest
- void test_mixedParameterGroups_namedPositional() {
- super.test_mixedParameterGroups_namedPositional();
- }
-
- @failingTest
- void test_mixedParameterGroups_positionalNamed() {
- super.test_mixedParameterGroups_positionalNamed();
- }
-
- @failingTest
- void test_mixin_application_lacks_with_clause() {
- super.test_mixin_application_lacks_with_clause();
- }
-
- @failingTest
- void test_multipleExtendsClauses() {
- super.test_multipleExtendsClauses();
- }
-
- @failingTest
- void test_multipleImplementsClauses() {
- super.test_multipleImplementsClauses();
- }
-
- @failingTest
- void test_multipleLibraryDirectives() {
- super.test_multipleLibraryDirectives();
- }
-
- @failingTest
- void test_multipleNamedParameterGroups() {
- super.test_multipleNamedParameterGroups();
- }
-
- @failingTest
- void test_multiplePartOfDirectives() {
- super.test_multiplePartOfDirectives();
- }
-
- @failingTest
- void test_multiplePositionalParameterGroups() {
- super.test_multiplePositionalParameterGroups();
- }
-
- @failingTest
- void test_multipleVariablesInForEach() {
- super.test_multipleVariablesInForEach();
- }
-
- @failingTest
- void test_multipleWithClauses() {
- super.test_multipleWithClauses();
- }
-
- @failingTest
- void test_namedFunctionExpression() {
- super.test_namedFunctionExpression();
- }
-
- @failingTest
- void test_namedParameterOutsideGroup() {
- super.test_namedParameterOutsideGroup();
- }
-
- @failingTest
- void test_nonConstructorFactory_field() {
- super.test_nonConstructorFactory_field();
- }
-
- @failingTest
- void test_nonConstructorFactory_method() {
- super.test_nonConstructorFactory_method();
- }
-
- @failingTest
- void test_nonIdentifierLibraryName_library() {
- super.test_nonIdentifierLibraryName_library();
- }
-
- @failingTest
- void test_nonIdentifierLibraryName_partOf() {
- super.test_nonIdentifierLibraryName_partOf();
- }
-
- @failingTest
- void test_nonPartOfDirectiveInPart_after() {
- super.test_nonPartOfDirectiveInPart_after();
- }
-
- @failingTest
- void test_nonPartOfDirectiveInPart_before() {
- super.test_nonPartOfDirectiveInPart_before();
- }
-
- @failingTest
- void test_nonUserDefinableOperator() {
- super.test_nonUserDefinableOperator();
- }
-
- @failingTest
- void test_optionalAfterNormalParameters_named() {
- super.test_optionalAfterNormalParameters_named();
- }
-
- @failingTest
- void test_optionalAfterNormalParameters_positional() {
- super.test_optionalAfterNormalParameters_positional();
- }
-
- @failingTest
- void test_parseCascadeSection_missingIdentifier() {
- super.test_parseCascadeSection_missingIdentifier();
- }
-
- @failingTest
- void test_parseCascadeSection_missingIdentifier_typeArguments() {
- super.test_parseCascadeSection_missingIdentifier_typeArguments();
- }
-
- @failingTest
- void test_positionalAfterNamedArgument() {
- super.test_positionalAfterNamedArgument();
- }
-
- @failingTest
- void test_positionalParameterOutsideGroup() {
- super.test_positionalParameterOutsideGroup();
- }
-
- @failingTest
- void test_redirectingConstructorWithBody_named() {
- super.test_redirectingConstructorWithBody_named();
- }
-
- @failingTest
- void test_redirectingConstructorWithBody_unnamed() {
- super.test_redirectingConstructorWithBody_unnamed();
- }
-
- @failingTest
- void test_redirectionInNonFactoryConstructor() {
- super.test_redirectionInNonFactoryConstructor();
- }
-
- @failingTest
- void test_setterInFunction_block() {
- super.test_setterInFunction_block();
- }
-
- @failingTest
- void test_setterInFunction_expression() {
- super.test_setterInFunction_expression();
- }
-
- @failingTest
- void test_staticAfterConst() {
- super.test_staticAfterConst();
- }
-
- @failingTest
- void test_staticAfterFinal() {
- super.test_staticAfterFinal();
- }
-
- @failingTest
- void test_staticAfterVar() {
- super.test_staticAfterVar();
- }
-
- @failingTest
- void test_staticConstructor() {
- super.test_staticConstructor();
- }
-
- @failingTest
- void test_staticGetterWithoutBody() {
- super.test_staticGetterWithoutBody();
- }
-
- @failingTest
- void test_staticOperator_noReturnType() {
- super.test_staticOperator_noReturnType();
- }
-
- @failingTest
- void test_staticOperator_returnType() {
- super.test_staticOperator_returnType();
- }
-
- @failingTest
- void test_staticSetterWithoutBody() {
- super.test_staticSetterWithoutBody();
- }
-
- @failingTest
- void test_staticTopLevelDeclaration_class() {
- super.test_staticTopLevelDeclaration_class();
- }
-
- @failingTest
- void test_staticTopLevelDeclaration_enum() {
- super.test_staticTopLevelDeclaration_enum();
- }
-
- @failingTest
- void test_staticTopLevelDeclaration_function() {
- super.test_staticTopLevelDeclaration_function();
- }
-
- @failingTest
- void test_staticTopLevelDeclaration_typedef() {
- super.test_staticTopLevelDeclaration_typedef();
- }
-
- @failingTest
- void test_staticTopLevelDeclaration_variable() {
- super.test_staticTopLevelDeclaration_variable();
- }
-
- @failingTest
- void test_string_unterminated_interpolation_block() {
- super.test_string_unterminated_interpolation_block();
- }
-
- @failingTest
- void test_switchCase_missingColon() {
- super.test_switchCase_missingColon();
- }
-
- @failingTest
- void test_switchDefault_missingColon() {
- super.test_switchDefault_missingColon();
- }
-
- @failingTest
- void test_switchHasCaseAfterDefaultCase() {
- super.test_switchHasCaseAfterDefaultCase();
- }
-
- @failingTest
- void test_switchHasCaseAfterDefaultCase_repeated() {
- super.test_switchHasCaseAfterDefaultCase_repeated();
- }
-
- @failingTest
- void test_switchHasMultipleDefaultCases() {
- super.test_switchHasMultipleDefaultCases();
- }
-
- @failingTest
- void test_switchHasMultipleDefaultCases_repeated() {
- super.test_switchHasMultipleDefaultCases_repeated();
- }
-
- @failingTest
- void test_switchMissingBlock() {
- super.test_switchMissingBlock();
- }
-
- @failingTest
- void test_topLevel_getter() {
- super.test_topLevel_getter();
- }
-
- @failingTest
- void test_topLevelFactory_withFunction() {
- super.test_topLevelFactory_withFunction();
- }
-
- @failingTest
- void test_topLevelOperator_withFunction() {
- super.test_topLevelOperator_withFunction();
- }
-
- @failingTest
- void test_topLevelOperator_withoutOperator() {
- super.test_topLevelOperator_withoutOperator();
- }
-
- @failingTest
- void test_topLevelOperator_withoutType() {
- super.test_topLevelOperator_withoutType();
- }
-
- @failingTest
- void test_topLevelOperator_withType() {
- super.test_topLevelOperator_withType();
- }
-
- @failingTest
- void test_topLevelOperator_withVoid() {
- super.test_topLevelOperator_withVoid();
- }
-
- @failingTest
- void test_topLevelVariable_withMetadata() {
- super.test_topLevelVariable_withMetadata();
- }
-
- @failingTest
- void test_typedef_incomplete() {
- super.test_typedef_incomplete();
- }
-
- @failingTest
- void test_typedef_namedFunction() {
- super.test_typedef_namedFunction();
- }
-
- @failingTest
- void test_typedefInClass_withoutReturnType() {
- super.test_typedefInClass_withoutReturnType();
- }
-
- @failingTest
- void test_typedefInClass_withReturnType() {
- super.test_typedefInClass_withReturnType();
- }
-
- @failingTest
- void test_unexpectedTerminatorForParameterGroup_named() {
- super.test_unexpectedTerminatorForParameterGroup_named();
- }
-
- @failingTest
- void test_unexpectedTerminatorForParameterGroup_optional() {
- super.test_unexpectedTerminatorForParameterGroup_optional();
- }
-
- @failingTest
- void test_unexpectedToken_endOfFieldDeclarationStatement() {
- super.test_unexpectedToken_endOfFieldDeclarationStatement();
- }
-
- @failingTest
- void test_unexpectedToken_invalidPostfixExpression() {
- super.test_unexpectedToken_invalidPostfixExpression();
- }
-
- @failingTest
- void test_unexpectedToken_invalidPrefixExpression() {
- super.test_unexpectedToken_invalidPrefixExpression();
- }
-
- @failingTest
- void test_unexpectedToken_returnInExpressionFunctionBody() {
- super.test_unexpectedToken_returnInExpressionFunctionBody();
- }
-
- @failingTest
- void test_unexpectedToken_semicolonBetweenClassMembers() {
- super.test_unexpectedToken_semicolonBetweenClassMembers();
- }
-
- @failingTest
- void test_unexpectedToken_semicolonBetweenCompilationUnitMembers() {
- super.test_unexpectedToken_semicolonBetweenCompilationUnitMembers();
- }
-
- @failingTest
- void test_unterminatedString_at_eof() {
- super.test_unterminatedString_at_eof();
- }
-
- @failingTest
- void test_unterminatedString_at_eol() {
- super.test_unterminatedString_at_eol();
- }
-
- @failingTest
- void test_unterminatedString_multiline_at_eof_3_quotes() {
- super.test_unterminatedString_multiline_at_eof_3_quotes();
- }
-
- @failingTest
- void test_unterminatedString_multiline_at_eof_4_quotes() {
- super.test_unterminatedString_multiline_at_eof_4_quotes();
- }
-
- @failingTest
- void test_unterminatedString_multiline_at_eof_5_quotes() {
- super.test_unterminatedString_multiline_at_eof_5_quotes();
- }
-
- @failingTest
- void test_useOfUnaryPlusOperator() {
- super.test_useOfUnaryPlusOperator();
- }
-
- @failingTest
- void test_varAndType_field() {
- super.test_varAndType_field();
- }
-
- @failingTest
- void test_varAndType_local() {
- super.test_varAndType_local();
- }
-
- @failingTest
- void test_varAndType_parameter() {
- super.test_varAndType_parameter();
- }
-
- @failingTest
- void test_varAndType_topLevelVariable() {
- super.test_varAndType_topLevelVariable();
- }
-
- @failingTest
- void test_varAsTypeName_as() {
- super.test_varAsTypeName_as();
- }
-
- @failingTest
- void test_varClass() {
- super.test_varClass();
- }
-
- @failingTest
- void test_varEnum() {
- super.test_varEnum();
- }
-
- @failingTest
- void test_varReturnType() {
- super.test_varReturnType();
- }
-
- @failingTest
- void test_varTypedef() {
- super.test_varTypedef();
- }
-
- @failingTest
- void test_voidParameter() {
- super.test_voidParameter();
- }
-
- @failingTest
- void test_voidVariable_parseClassMember_initializer() {
- super.test_voidVariable_parseClassMember_initializer();
- }
-
- @failingTest
- void test_voidVariable_parseClassMember_noInitializer() {
- super.test_voidVariable_parseClassMember_noInitializer();
- }
-
- @failingTest
- void test_voidVariable_parseCompilationUnit_initializer() {
- super.test_voidVariable_parseCompilationUnit_initializer();
- }
-
- @failingTest
- void test_voidVariable_parseCompilationUnit_noInitializer() {
- super.test_voidVariable_parseCompilationUnit_noInitializer();
- }
-
- @failingTest
- void test_voidVariable_parseCompilationUnitMember_initializer() {
- super.test_voidVariable_parseCompilationUnitMember_initializer();
- }
-
- @failingTest
- void test_voidVariable_parseCompilationUnitMember_noInitializer() {
- super.test_voidVariable_parseCompilationUnitMember_noInitializer();
- }
-
- @failingTest
- void test_voidVariable_statement_initializer() {
- super.test_voidVariable_statement_initializer();
- }
-
- @failingTest
- void test_voidVariable_statement_noInitializer() {
- super.test_voidVariable_statement_noInitializer();
- }
-
- @failingTest
- void test_withBeforeExtends() {
- super.test_withBeforeExtends();
- }
-
- @failingTest
- void test_withWithoutExtends() {
- super.test_withWithoutExtends();
- }
-
- @failingTest
- void test_wrongSeparatorForPositionalParameter() {
- super.test_wrongSeparatorForPositionalParameter();
- }
-
- @failingTest
- void test_wrongTerminatorForParameterGroup_named() {
- super.test_wrongTerminatorForParameterGroup_named();
- }
-
- @failingTest
- void test_wrongTerminatorForParameterGroup_optional() {
- super.test_wrongTerminatorForParameterGroup_optional();
- }
-}
-
-@reflectiveTest
-class ExpressionParserTest_Forest extends FastaBodyBuilderTestCase
- with ExpressionParserTestMixin {
- ExpressionParserTest_Forest() : super(false);
-
- @failingTest
- void test_namedArgument() {
- super.test_namedArgument();
- }
-
- @failingTest
- void test_parseAdditiveExpression_normal() {
- super.test_parseAdditiveExpression_normal();
- }
-
- @failingTest
- void test_parseAdditiveExpression_super() {
- super.test_parseAdditiveExpression_super();
- }
-
- @failingTest
- void test_parseAssignableExpression_expression_args_dot() {
- super.test_parseAssignableExpression_expression_args_dot();
- }
-
- @failingTest
- void
- test_parseAssignableExpression_expression_args_dot_typeArgumentComments() {
- super
- .test_parseAssignableExpression_expression_args_dot_typeArgumentComments();
- }
-
- @failingTest
- void test_parseAssignableExpression_expression_args_dot_typeArguments() {
- super.test_parseAssignableExpression_expression_args_dot_typeArguments();
- }
-
- @failingTest
- void test_parseAssignableExpression_expression_dot() {
- super.test_parseAssignableExpression_expression_dot();
- }
-
- @failingTest
- void test_parseAssignableExpression_expression_index() {
- super.test_parseAssignableExpression_expression_index();
- dart2Failure();
- }
-
- @failingTest
- void test_parseAssignableExpression_expression_question_dot() {
- super.test_parseAssignableExpression_expression_question_dot();
- }
-
- @failingTest
- void test_parseAssignableExpression_identifier_args_dot() {
- super.test_parseAssignableExpression_identifier_args_dot();
- }
-
- @failingTest
- void
- test_parseAssignableExpression_identifier_args_dot_typeArgumentComments() {
- super
- .test_parseAssignableExpression_identifier_args_dot_typeArgumentComments();
- }
-
- @failingTest
- void test_parseAssignableExpression_identifier_args_dot_typeArguments() {
- super.test_parseAssignableExpression_identifier_args_dot_typeArguments();
- }
-
- @failingTest
- void test_parseAssignableExpression_identifier_dot() {
- super.test_parseAssignableExpression_identifier_dot();
- }
-
- @failingTest
- void test_parseAssignableExpression_identifier_question_dot() {
- super.test_parseAssignableExpression_identifier_question_dot();
- }
-
- @failingTest
- void test_parseAssignableExpression_super_dot() {
- super.test_parseAssignableExpression_super_dot();
- }
-
- @failingTest
- void test_parseAssignableExpression_super_index() {
- super.test_parseAssignableExpression_super_index();
- }
-
- @failingTest
- void test_parseAssignableSelector_dot() {
- super.test_parseAssignableSelector_dot();
- }
-
- @failingTest
- void test_parseAssignableSelector_index() {
- super.test_parseAssignableSelector_index();
- }
-
- @failingTest
- void test_parseAssignableSelector_question_dot() {
- super.test_parseAssignableSelector_question_dot();
- }
-
- @failingTest
- void test_parseBitwiseAndExpression_normal() {
- super.test_parseBitwiseAndExpression_normal();
- }
-
- @failingTest
- void test_parseBitwiseAndExpression_super() {
- super.test_parseBitwiseAndExpression_super();
- }
-
- @failingTest
- void test_parseBitwiseOrExpression_normal() {
- super.test_parseBitwiseOrExpression_normal();
- }
-
- @failingTest
- void test_parseBitwiseOrExpression_super() {
- super.test_parseBitwiseOrExpression_super();
- }
-
- @failingTest
- void test_parseBitwiseXorExpression_normal() {
- super.test_parseBitwiseXorExpression_normal();
- }
-
- @failingTest
- void test_parseBitwiseXorExpression_super() {
- super.test_parseBitwiseXorExpression_super();
- }
-
- @failingTest
- void test_parseCascadeSection_i() {
- super.test_parseCascadeSection_i();
- }
-
- @failingTest
- void test_parseCascadeSection_ia() {
- super.test_parseCascadeSection_ia();
- }
-
- @failingTest
- void test_parseCascadeSection_ia_typeArgumentComments() {
- super.test_parseCascadeSection_ia_typeArgumentComments();
- }
-
- @failingTest
- void test_parseCascadeSection_ia_typeArguments() {
- super.test_parseCascadeSection_ia_typeArguments();
- }
-
- @failingTest
- void test_parseCascadeSection_ii() {
- super.test_parseCascadeSection_ii();
- }
-
- @failingTest
- void test_parseCascadeSection_ii_typeArgumentComments() {
- super.test_parseCascadeSection_ii_typeArgumentComments();
- }
-
- @failingTest
- void test_parseCascadeSection_ii_typeArguments() {
- super.test_parseCascadeSection_ii_typeArguments();
- }
-
- @failingTest
- void test_parseCascadeSection_p() {
- super.test_parseCascadeSection_p();
- }
-
- @failingTest
- void test_parseCascadeSection_p_assign() {
- super.test_parseCascadeSection_p_assign();
- }
-
- @failingTest
- void test_parseCascadeSection_p_assign_withCascade() {
- super.test_parseCascadeSection_p_assign_withCascade();
- }
-
- @failingTest
- void test_parseCascadeSection_p_assign_withCascade_typeArgumentComments() {
- super.test_parseCascadeSection_p_assign_withCascade_typeArgumentComments();
- }
-
- @failingTest
- void test_parseCascadeSection_p_assign_withCascade_typeArguments() {
- super.test_parseCascadeSection_p_assign_withCascade_typeArguments();
- }
-
- @failingTest
- void test_parseCascadeSection_p_builtIn() {
- super.test_parseCascadeSection_p_builtIn();
- }
-
- @failingTest
- void test_parseCascadeSection_pa() {
- super.test_parseCascadeSection_pa();
- }
-
- @failingTest
- void test_parseCascadeSection_pa_typeArgumentComments() {
- super.test_parseCascadeSection_pa_typeArgumentComments();
- }
-
- @failingTest
- void test_parseCascadeSection_pa_typeArguments() {
- super.test_parseCascadeSection_pa_typeArguments();
- }
-
- @failingTest
- void test_parseCascadeSection_paa() {
- super.test_parseCascadeSection_paa();
- }
-
- @failingTest
- void test_parseCascadeSection_paa_typeArgumentComments() {
- super.test_parseCascadeSection_paa_typeArgumentComments();
- }
-
- @failingTest
- void test_parseCascadeSection_paa_typeArguments() {
- super.test_parseCascadeSection_paa_typeArguments();
- }
-
- @failingTest
- void test_parseCascadeSection_paapaa() {
- super.test_parseCascadeSection_paapaa();
- }
-
- @failingTest
- void test_parseCascadeSection_paapaa_typeArgumentComments() {
- super.test_parseCascadeSection_paapaa_typeArgumentComments();
- }
-
- @failingTest
- void test_parseCascadeSection_paapaa_typeArguments() {
- super.test_parseCascadeSection_paapaa_typeArguments();
- }
-
- @failingTest
- void test_parseCascadeSection_pap() {
- super.test_parseCascadeSection_pap();
- }
-
- @failingTest
- void test_parseCascadeSection_pap_typeArgumentComments() {
- super.test_parseCascadeSection_pap_typeArgumentComments();
- }
-
- @failingTest
- void test_parseCascadeSection_pap_typeArguments() {
- super.test_parseCascadeSection_pap_typeArguments();
- }
-
- @failingTest
- void test_parseConditionalExpression() {
- super.test_parseConditionalExpression();
- dart2Failure();
- }
-
- @failingTest
- void test_parseConstExpression_instanceCreation() {
- super.test_parseConstExpression_instanceCreation();
- }
-
- @failingTest
- void test_parseConstExpression_listLiteral_typed() {
- super.test_parseConstExpression_listLiteral_typed();
- }
-
- @failingTest
- void test_parseConstExpression_listLiteral_typed_genericComment() {
- super.test_parseConstExpression_listLiteral_typed_genericComment();
- }
-
- @failingTest
- void test_parseConstExpression_mapLiteral_typed() {
- super.test_parseConstExpression_mapLiteral_typed();
- }
-
- @failingTest
- void test_parseConstExpression_mapLiteral_typed_genericComment() {
- super.test_parseConstExpression_mapLiteral_typed_genericComment();
- }
-
- @failingTest
- void test_parseEqualityExpression_normal() {
- super.test_parseEqualityExpression_normal();
- }
-
- @failingTest
- void test_parseEqualityExpression_super() {
- super.test_parseEqualityExpression_super();
- }
-
- @failingTest
- void test_parseExpression_assign() {
- super.test_parseExpression_assign();
- }
-
- @failingTest
- void test_parseExpression_comparison() {
- super.test_parseExpression_comparison();
- }
-
- @failingTest
- void test_parseExpression_function_async() {
- super.test_parseExpression_function_async();
- }
-
- @failingTest
- void test_parseExpression_function_asyncStar() {
- super.test_parseExpression_function_asyncStar();
- }
-
- @failingTest
- void test_parseExpression_function_sync() {
- super.test_parseExpression_function_sync();
- }
-
- @failingTest
- void test_parseExpression_function_syncStar() {
- super.test_parseExpression_function_syncStar();
- }
-
- @failingTest
- void test_parseExpression_invokeFunctionExpression() {
- super.test_parseExpression_invokeFunctionExpression();
- }
-
- @failingTest
- void test_parseExpression_nonAwait() {
- super.test_parseExpression_nonAwait();
- }
-
- @failingTest
- void test_parseExpression_superMethodInvocation() {
- super.test_parseExpression_superMethodInvocation();
- }
-
- @failingTest
- void test_parseExpression_superMethodInvocation_typeArgumentComments() {
- super.test_parseExpression_superMethodInvocation_typeArgumentComments();
- }
-
- @failingTest
- void test_parseExpression_superMethodInvocation_typeArguments() {
- super.test_parseExpression_superMethodInvocation_typeArguments();
- }
-
- @failingTest
- void test_parseExpression_superMethodInvocation_typeArguments_chained() {
- super.test_parseExpression_superMethodInvocation_typeArguments_chained();
- }
-
- @failingTest
- void test_parseExpressionList_multiple() {
- super.test_parseExpressionList_multiple();
- }
-
- @failingTest
- void test_parseExpressionList_single() {
- super.test_parseExpressionList_single();
- }
-
- @failingTest
- void test_parseExpressionWithoutCascade_assign() {
- super.test_parseExpressionWithoutCascade_assign();
- }
-
- @failingTest
- void test_parseExpressionWithoutCascade_comparison() {
- super.test_parseExpressionWithoutCascade_comparison();
- }
-
- @failingTest
- void test_parseExpressionWithoutCascade_superMethodInvocation() {
- super.test_parseExpressionWithoutCascade_superMethodInvocation();
- }
-
- @failingTest
- void
- test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments() {
- super
- .test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments();
- }
-
- @failingTest
- void
- test_parseExpressionWithoutCascade_superMethodInvocation_typeArguments() {
- super
- .test_parseExpressionWithoutCascade_superMethodInvocation_typeArguments();
- }
-
- @failingTest
- void test_parseFunctionExpression_body_inExpression() {
- super.test_parseFunctionExpression_body_inExpression();
- }
-
- @failingTest
- void test_parseFunctionExpression_typeParameterComments() {
- super.test_parseFunctionExpression_typeParameterComments();
- }
-
- @failingTest
- void test_parseFunctionExpression_typeParameters() {
- super.test_parseFunctionExpression_typeParameters();
- }
-
- @failingTest
- void test_parseInstanceCreationExpression_qualifiedType() {
- super.test_parseInstanceCreationExpression_qualifiedType();
- }
-
- @failingTest
- void test_parseInstanceCreationExpression_qualifiedType_named() {
- super.test_parseInstanceCreationExpression_qualifiedType_named();
- }
-
- @failingTest
- void
- test_parseInstanceCreationExpression_qualifiedType_named_typeArgumentComments() {
- super
- .test_parseInstanceCreationExpression_qualifiedType_named_typeArgumentComments();
- }
-
- @failingTest
- void
- test_parseInstanceCreationExpression_qualifiedType_named_typeArguments() {
- super
- .test_parseInstanceCreationExpression_qualifiedType_named_typeArguments();
- }
-
- @failingTest
- void
- test_parseInstanceCreationExpression_qualifiedType_typeArgumentComments() {
- super
- .test_parseInstanceCreationExpression_qualifiedType_typeArgumentComments();
- }
-
- @failingTest
- void test_parseInstanceCreationExpression_qualifiedType_typeArguments() {
- super.test_parseInstanceCreationExpression_qualifiedType_typeArguments();
- }
-
- @failingTest
- void test_parseInstanceCreationExpression_type() {
- super.test_parseInstanceCreationExpression_type();
- }
-
- @failingTest
- void test_parseInstanceCreationExpression_type_named() {
- super.test_parseInstanceCreationExpression_type_named();
- }
-
- @failingTest
- void test_parseInstanceCreationExpression_type_named_typeArgumentComments() {
- super
- .test_parseInstanceCreationExpression_type_named_typeArgumentComments();
- }
-
- @failingTest
- void test_parseInstanceCreationExpression_type_named_typeArguments() {
- super.test_parseInstanceCreationExpression_type_named_typeArguments();
- }
-
- @failingTest
- void test_parseInstanceCreationExpression_type_typeArgumentComments() {
- super.test_parseInstanceCreationExpression_type_typeArgumentComments();
- }
-
- @failingTest
- void test_parseInstanceCreationExpression_type_typeArguments() {
- super.test_parseInstanceCreationExpression_type_typeArguments();
- }
-
- @failingTest
- void test_parseListLiteral_empty_oneToken_withComment() {
- super.test_parseListLiteral_empty_oneToken_withComment();
- }
-
- @failingTest
- void test_parseListLiteral_single_withTypeArgument() {
- super.test_parseListLiteral_single_withTypeArgument();
- }
-
- @failingTest
- void test_parseListOrMapLiteral_list_type() {
- super.test_parseListOrMapLiteral_list_type();
- }
-
- @failingTest
- void test_parseListOrMapLiteral_map_type() {
- super.test_parseListOrMapLiteral_map_type();
- }
-
- @failingTest
- void test_parseLogicalAndExpression() {
- super.test_parseLogicalAndExpression();
- dart2Failure();
- }
-
- @failingTest
- void test_parseLogicalOrExpression() {
- super.test_parseLogicalOrExpression();
- dart2Failure();
- }
-
- @failingTest
- void test_parseMapLiteral_empty() {
- super.test_parseMapLiteral_empty();
- }
-
- @failingTest
- void test_parseMapLiteralEntry_complex() {
- super.test_parseMapLiteralEntry_complex();
- }
-
- @failingTest
- void test_parseMultiplicativeExpression_normal() {
- super.test_parseMultiplicativeExpression_normal();
- }
-
- @failingTest
- void test_parseMultiplicativeExpression_super() {
- super.test_parseMultiplicativeExpression_super();
- }
-
- @failingTest
- void test_parseNewExpression() {
- super.test_parseNewExpression();
- }
-
- @failingTest
- void test_parsePostfixExpression_decrement() {
- super.test_parsePostfixExpression_decrement();
- }
-
- @failingTest
- void test_parsePostfixExpression_increment() {
- super.test_parsePostfixExpression_increment();
- }
-
- @failingTest
- void test_parsePostfixExpression_none_methodInvocation() {
- super.test_parsePostfixExpression_none_methodInvocation();
- }
-
- @failingTest
- void test_parsePostfixExpression_none_methodInvocation_question_dot() {
- super.test_parsePostfixExpression_none_methodInvocation_question_dot();
- }
-
- @failingTest
- void
- test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments() {
- super
- .test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments();
- }
-
- @failingTest
- void
- test_parsePostfixExpression_none_methodInvocation_question_dot_typeArguments() {
- super
- .test_parsePostfixExpression_none_methodInvocation_question_dot_typeArguments();
- }
-
- @failingTest
- void
- test_parsePostfixExpression_none_methodInvocation_typeArgumentComments() {
- super
- .test_parsePostfixExpression_none_methodInvocation_typeArgumentComments();
- }
-
- @failingTest
- void test_parsePostfixExpression_none_methodInvocation_typeArguments() {
- super.test_parsePostfixExpression_none_methodInvocation_typeArguments();
- }
-
- @failingTest
- void test_parsePostfixExpression_none_propertyAccess() {
- super.test_parsePostfixExpression_none_propertyAccess();
- }
-
- @failingTest
- void test_parsePrefixedIdentifier_prefix() {
- super.test_parsePrefixedIdentifier_prefix();
- }
-
- @failingTest
- void test_parsePrimaryExpression_const() {
- super.test_parsePrimaryExpression_const();
- dart2Failure();
- }
-
- @failingTest
- void test_parsePrimaryExpression_function_arguments() {
- super.test_parsePrimaryExpression_function_arguments();
- }
-
- @failingTest
- void test_parsePrimaryExpression_function_noArguments() {
- super.test_parsePrimaryExpression_function_noArguments();
- }
-
- @failingTest
- void test_parsePrimaryExpression_genericFunctionExpression() {
- super.test_parsePrimaryExpression_genericFunctionExpression();
- }
-
- @failingTest
- void test_parsePrimaryExpression_listLiteral_typed() {
- super.test_parsePrimaryExpression_listLiteral_typed();
- }
-
- @failingTest
- void test_parsePrimaryExpression_listLiteral_typed_genericComment() {
- super.test_parsePrimaryExpression_listLiteral_typed_genericComment();
- }
-
- @failingTest
- void test_parsePrimaryExpression_mapLiteral_typed() {
- super.test_parsePrimaryExpression_mapLiteral_typed();
- }
-
- @failingTest
- void test_parsePrimaryExpression_mapLiteral_typed_genericComment() {
- super.test_parsePrimaryExpression_mapLiteral_typed_genericComment();
- }
-
- @failingTest
- void test_parsePrimaryExpression_new() {
- super.test_parsePrimaryExpression_new();
- }
-
- @failingTest
- void test_parsePrimaryExpression_parenthesized() {
- super.test_parsePrimaryExpression_parenthesized();
- }
-
- @failingTest
- void test_parsePrimaryExpression_super() {
- super.test_parsePrimaryExpression_super();
- }
-
- @failingTest
- void test_parsePrimaryExpression_this() {
- super.test_parsePrimaryExpression_this();
- }
-
- @failingTest
- void test_parseRedirectingConstructorInvocation_named() {
- super.test_parseRedirectingConstructorInvocation_named();
- }
-
- @failingTest
- void test_parseRedirectingConstructorInvocation_unnamed() {
- super.test_parseRedirectingConstructorInvocation_unnamed();
- }
-
- @failingTest
- void test_parseRelationalExpression_as_functionType_noReturnType() {
- super.test_parseRelationalExpression_as_functionType_noReturnType();
- }
-
- @failingTest
- void test_parseRelationalExpression_as_functionType_returnType() {
- super.test_parseRelationalExpression_as_functionType_returnType();
- }
-
- @failingTest
- void test_parseRelationalExpression_as_generic() {
- super.test_parseRelationalExpression_as_generic();
- }
-
- @failingTest
- void test_parseRelationalExpression_as_simple() {
- super.test_parseRelationalExpression_as_simple();
- }
-
- @failingTest
- void test_parseRelationalExpression_as_simple_function() {
- super.test_parseRelationalExpression_as_simple_function();
- }
-
- @failingTest
- void test_parseRelationalExpression_is() {
- super.test_parseRelationalExpression_is();
- }
-
- @failingTest
- void test_parseRelationalExpression_isNot() {
- super.test_parseRelationalExpression_isNot();
- }
-
- @failingTest
- void test_parseRelationalExpression_normal() {
- super.test_parseRelationalExpression_normal();
- }
-
- @failingTest
- void test_parseRelationalExpression_super() {
- super.test_parseRelationalExpression_super();
- }
-
- @failingTest
- void test_parseShiftExpression_normal() {
- super.test_parseShiftExpression_normal();
- }
-
- @failingTest
- void test_parseShiftExpression_super() {
- super.test_parseShiftExpression_super();
- }
-
- @failingTest
- void test_parseStringLiteral_endsWithInterpolation() {
- super.test_parseStringLiteral_endsWithInterpolation();
- }
-
- @failingTest
- void test_parseStringLiteral_interpolated() {
- super.test_parseStringLiteral_interpolated();
- }
-
- @failingTest
- void test_parseStringLiteral_multiline_endsWithInterpolation() {
- super.test_parseStringLiteral_multiline_endsWithInterpolation();
- }
-
- @failingTest
- void test_parseStringLiteral_multiline_quoteAfterInterpolation() {
- super.test_parseStringLiteral_multiline_quoteAfterInterpolation();
- }
-
- @failingTest
- void test_parseStringLiteral_multiline_startsWithInterpolation() {
- super.test_parseStringLiteral_multiline_startsWithInterpolation();
- }
-
- @failingTest
- void test_parseStringLiteral_quoteAfterInterpolation() {
- super.test_parseStringLiteral_quoteAfterInterpolation();
- }
-
- @failingTest
- void test_parseStringLiteral_startsWithInterpolation() {
- super.test_parseStringLiteral_startsWithInterpolation();
- }
-
- @failingTest
- void test_parseSuperConstructorInvocation_named() {
- super.test_parseSuperConstructorInvocation_named();
- }
-
- @failingTest
- void test_parseSuperConstructorInvocation_unnamed() {
- super.test_parseSuperConstructorInvocation_unnamed();
- }
-
- @failingTest
- void test_parseUnaryExpression_decrement_normal() {
- super.test_parseUnaryExpression_decrement_normal();
- }
-
- @failingTest
- void test_parseUnaryExpression_decrement_super() {
- super.test_parseUnaryExpression_decrement_super();
- }
-
- @failingTest
- void test_parseUnaryExpression_decrement_super_propertyAccess() {
- super.test_parseUnaryExpression_decrement_super_propertyAccess();
- }
-
- @failingTest
- void test_parseUnaryExpression_decrement_super_withComment() {
- super.test_parseUnaryExpression_decrement_super_withComment();
- }
-
- @failingTest
- void test_parseUnaryExpression_increment_normal() {
- super.test_parseUnaryExpression_increment_normal();
- }
-
- @failingTest
- void test_parseUnaryExpression_increment_super_index() {
- super.test_parseUnaryExpression_increment_super_index();
- }
-
- @failingTest
- void test_parseUnaryExpression_increment_super_propertyAccess() {
- super.test_parseUnaryExpression_increment_super_propertyAccess();
- }
-
- @failingTest
- void test_parseUnaryExpression_minus_normal() {
- super.test_parseUnaryExpression_minus_normal();
- }
-
- @failingTest
- void test_parseUnaryExpression_minus_super() {
- super.test_parseUnaryExpression_minus_super();
- }
-
- @failingTest
- void test_parseUnaryExpression_not_super() {
- super.test_parseUnaryExpression_not_super();
- }
-
- @failingTest
- void test_parseUnaryExpression_tilda_normal() {
- super.test_parseUnaryExpression_tilda_normal();
- }
-
- @failingTest
- void test_parseUnaryExpression_tilda_super() {
- super.test_parseUnaryExpression_tilda_super();
- }
-}
-
-@reflectiveTest
-class FormalParameterParserTest_Forest extends FastaBodyBuilderTestCase
- with FormalParameterParserTestMixin {
- FormalParameterParserTest_Forest() : super(false);
-
- @failingTest
- void test_parseFormalParameter_covariant_final_named() {
- super.test_parseFormalParameter_covariant_final_named();
- }
-
- @failingTest
- void test_parseFormalParameter_covariant_final_normal() {
- super.test_parseFormalParameter_covariant_final_normal();
- }
-
- @failingTest
- void test_parseFormalParameter_covariant_final_positional() {
- super.test_parseFormalParameter_covariant_final_positional();
- }
-
- @failingTest
- void test_parseFormalParameter_covariant_final_type_named() {
- super.test_parseFormalParameter_covariant_final_type_named();
- }
-
- @failingTest
- void test_parseFormalParameter_covariant_final_type_normal() {
- super.test_parseFormalParameter_covariant_final_type_normal();
- }
-
- @failingTest
- void test_parseFormalParameter_covariant_final_type_positional() {
- super.test_parseFormalParameter_covariant_final_type_positional();
- }
-
- @failingTest
- void test_parseFormalParameter_covariant_type_function() {
- super.test_parseFormalParameter_covariant_type_function();
- }
-
- @failingTest
- void test_parseFormalParameter_covariant_type_named() {
- super.test_parseFormalParameter_covariant_type_named();
- }
-
- @failingTest
- void test_parseFormalParameter_covariant_type_normal() {
- super.test_parseFormalParameter_covariant_type_normal();
- }
-
- @failingTest
- void test_parseFormalParameter_covariant_type_positional() {
- super.test_parseFormalParameter_covariant_type_positional();
- }
-
- @failingTest
- void test_parseFormalParameter_covariant_var_named() {
- super.test_parseFormalParameter_covariant_var_named();
- }
-
- @failingTest
- void test_parseFormalParameter_covariant_var_normal() {
- super.test_parseFormalParameter_covariant_var_normal();
- }
-
- @failingTest
- void test_parseFormalParameter_covariant_var_positional() {
- super.test_parseFormalParameter_covariant_var_positional();
- }
-
- @failingTest
- void test_parseFormalParameter_final_named() {
- super.test_parseFormalParameter_final_named();
- }
-
- @failingTest
- void test_parseFormalParameter_final_normal() {
- super.test_parseFormalParameter_final_normal();
- }
-
- @failingTest
- void test_parseFormalParameter_final_positional() {
- super.test_parseFormalParameter_final_positional();
- }
-
- @failingTest
- void test_parseFormalParameter_final_type_named() {
- super.test_parseFormalParameter_final_type_named();
- }
-
- @failingTest
- void test_parseFormalParameter_final_type_normal() {
- super.test_parseFormalParameter_final_type_normal();
- }
-
- @failingTest
- void test_parseFormalParameter_final_type_positional() {
- super.test_parseFormalParameter_final_type_positional();
- }
-
- @failingTest
- void test_parseFormalParameter_type_function() {
- super.test_parseFormalParameter_type_function();
- }
-
- @failingTest
- void test_parseFormalParameter_type_named() {
- super.test_parseFormalParameter_type_named();
- }
-
- @failingTest
- void test_parseFormalParameter_type_named_noDefault() {
- super.test_parseFormalParameter_type_named_noDefault();
- }
-
- @failingTest
- void test_parseFormalParameter_type_normal() {
- super.test_parseFormalParameter_type_normal();
- }
-
- @failingTest
- void test_parseFormalParameter_type_positional() {
- super.test_parseFormalParameter_type_positional();
- }
-
- @failingTest
- void test_parseFormalParameter_type_positional_noDefault() {
- super.test_parseFormalParameter_type_positional_noDefault();
- }
-
- @failingTest
- void test_parseFormalParameter_var_named() {
- super.test_parseFormalParameter_var_named();
- }
-
- @failingTest
- void test_parseFormalParameter_var_normal() {
- super.test_parseFormalParameter_var_normal();
- }
-
- @failingTest
- void test_parseFormalParameter_var_positional() {
- super.test_parseFormalParameter_var_positional();
- }
-
- @failingTest
- void test_parseFormalParameterList_empty() {
- super.test_parseFormalParameterList_empty();
- }
-
- @failingTest
- void test_parseFormalParameterList_named_multiple() {
- super.test_parseFormalParameterList_named_multiple();
- }
-
- @failingTest
- void test_parseFormalParameterList_named_single() {
- super.test_parseFormalParameterList_named_single();
- }
-
- @failingTest
- void test_parseFormalParameterList_named_trailing_comma() {
- super.test_parseFormalParameterList_named_trailing_comma();
- }
-
- @failingTest
- void test_parseFormalParameterList_normal_multiple() {
- super.test_parseFormalParameterList_normal_multiple();
- }
-
- @failingTest
- void test_parseFormalParameterList_normal_named() {
- super.test_parseFormalParameterList_normal_named();
- }
-
- @failingTest
- void test_parseFormalParameterList_normal_named_inFunctionType() {
- super.test_parseFormalParameterList_normal_named_inFunctionType();
- }
-
- @failingTest
- void test_parseFormalParameterList_normal_positional() {
- super.test_parseFormalParameterList_normal_positional();
- }
-
- @failingTest
- void test_parseFormalParameterList_normal_single() {
- super.test_parseFormalParameterList_normal_single();
- }
-
- @failingTest
- void test_parseFormalParameterList_normal_single_Function() {
- super.test_parseFormalParameterList_normal_single_Function();
- }
-
- @failingTest
- void test_parseFormalParameterList_normal_single_trailing_comma() {
- super.test_parseFormalParameterList_normal_single_trailing_comma();
- }
-
- @failingTest
- void test_parseFormalParameterList_positional_multiple() {
- super.test_parseFormalParameterList_positional_multiple();
- }
-
- @failingTest
- void test_parseFormalParameterList_positional_single() {
- super.test_parseFormalParameterList_positional_single();
- }
-
- @failingTest
- void test_parseFormalParameterList_positional_trailing_comma() {
- super.test_parseFormalParameterList_positional_trailing_comma();
- }
-
- @failingTest
- void test_parseFormalParameterList_prefixedType() {
- super.test_parseFormalParameterList_prefixedType();
- }
-
- @failingTest
- void test_parseFormalParameterList_prefixedType_missingName() {
- super.test_parseFormalParameterList_prefixedType_missingName();
- }
-
- @failingTest
- void test_parseFormalParameterList_prefixedType_partial() {
- super.test_parseFormalParameterList_prefixedType_partial();
- }
-
- @failingTest
- void test_parseFormalParameterList_prefixedType_partial2() {
- super.test_parseFormalParameterList_prefixedType_partial2();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_field_const_noType() {
- super.test_parseNormalFormalParameter_field_const_noType();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_field_const_type() {
- super.test_parseNormalFormalParameter_field_const_type();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_field_final_noType() {
- super.test_parseNormalFormalParameter_field_final_noType();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_field_final_type() {
- super.test_parseNormalFormalParameter_field_final_type();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_field_function_nested() {
- super.test_parseNormalFormalParameter_field_function_nested();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_field_function_noNested() {
- super.test_parseNormalFormalParameter_field_function_noNested();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_field_function_withDocComment() {
- super.test_parseNormalFormalParameter_field_function_withDocComment();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_field_noType() {
- super.test_parseNormalFormalParameter_field_noType();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_field_type() {
- super.test_parseNormalFormalParameter_field_type();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_field_var() {
- super.test_parseNormalFormalParameter_field_var();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_field_withDocComment() {
- super.test_parseNormalFormalParameter_field_withDocComment();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_named() {
- super.test_parseNormalFormalParameter_function_named();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_noType() {
- super.test_parseNormalFormalParameter_function_noType();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_noType_covariant() {
- super.test_parseNormalFormalParameter_function_noType_covariant();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_noType_typeParameterComments() {
- super
- .test_parseNormalFormalParameter_function_noType_typeParameterComments();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_noType_typeParameters() {
- super.test_parseNormalFormalParameter_function_noType_typeParameters();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_type() {
- super.test_parseNormalFormalParameter_function_type();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_type_typeParameterComments() {
- super.test_parseNormalFormalParameter_function_type_typeParameterComments();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_type_typeParameters() {
- super.test_parseNormalFormalParameter_function_type_typeParameters();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_typeVoid_covariant() {
- super.test_parseNormalFormalParameter_function_typeVoid_covariant();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_void() {
- super.test_parseNormalFormalParameter_function_void();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_void_typeParameterComments() {
- super.test_parseNormalFormalParameter_function_void_typeParameterComments();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_void_typeParameters() {
- super.test_parseNormalFormalParameter_function_void_typeParameters();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_function_withDocComment() {
- super.test_parseNormalFormalParameter_function_withDocComment();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_simple_const_noType() {
- super.test_parseNormalFormalParameter_simple_const_noType();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_simple_const_type() {
- super.test_parseNormalFormalParameter_simple_const_type();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_simple_final_noType() {
- super.test_parseNormalFormalParameter_simple_final_noType();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_simple_final_type() {
- super.test_parseNormalFormalParameter_simple_final_type();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_simple_noName() {
- super.test_parseNormalFormalParameter_simple_noName();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_simple_noType() {
- super.test_parseNormalFormalParameter_simple_noType();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_simple_noType_namedCovariant() {
- super.test_parseNormalFormalParameter_simple_noType_namedCovariant();
- }
-
- @failingTest
- void test_parseNormalFormalParameter_simple_type() {
- super.test_parseNormalFormalParameter_simple_type();
- }
-}
-
-@reflectiveTest
-class RecoveryParserTest_Forest extends FastaBodyBuilderTestCase
- with RecoveryParserTestMixin {
- RecoveryParserTest_Forest() : super(false);
-
- @failingTest
- void test_additiveExpression_missing_LHS() {
- super.test_additiveExpression_missing_LHS();
- }
-
- @failingTest
- void test_additiveExpression_missing_LHS_RHS() {
- super.test_additiveExpression_missing_LHS_RHS();
- }
-
- @failingTest
- void test_additiveExpression_missing_RHS() {
- super.test_additiveExpression_missing_RHS();
- }
-
- @failingTest
- void test_additiveExpression_missing_RHS_super() {
- super.test_additiveExpression_missing_RHS_super();
- }
-
- @failingTest
- void test_additiveExpression_precedence_multiplicative_left() {
- super.test_additiveExpression_precedence_multiplicative_left();
- }
-
- @failingTest
- void test_additiveExpression_precedence_multiplicative_right() {
- super.test_additiveExpression_precedence_multiplicative_right();
- }
-
- @failingTest
- void test_additiveExpression_super() {
- super.test_additiveExpression_super();
- }
-
- @failingTest
- void test_assignableSelector() {
- super.test_assignableSelector();
- }
-
- @failingTest
- void test_assignmentExpression_missing_compound1() {
- super.test_assignmentExpression_missing_compound1();
- dart2Failure();
- }
-
- @failingTest
- void test_assignmentExpression_missing_compound2() {
- super.test_assignmentExpression_missing_compound2();
- dart2Failure();
- }
-
- @failingTest
- void test_assignmentExpression_missing_compound3() {
- super.test_assignmentExpression_missing_compound3();
- dart2Failure();
- }
-
- @failingTest
- void test_assignmentExpression_missing_LHS() {
- super.test_assignmentExpression_missing_LHS();
- dart2Failure();
- }
-
- @failingTest
- void test_assignmentExpression_missing_RHS() {
- super.test_assignmentExpression_missing_RHS();
- dart2Failure();
- }
-
- @failingTest
- void test_bitwiseAndExpression_missing_LHS() {
- super.test_bitwiseAndExpression_missing_LHS();
- }
-
- @failingTest
- void test_bitwiseAndExpression_missing_LHS_RHS() {
- super.test_bitwiseAndExpression_missing_LHS_RHS();
- }
-
- @failingTest
- void test_bitwiseAndExpression_missing_RHS() {
- super.test_bitwiseAndExpression_missing_RHS();
- }
-
- @failingTest
- void test_bitwiseAndExpression_missing_RHS_super() {
- super.test_bitwiseAndExpression_missing_RHS_super();
- }
-
- @failingTest
- void test_bitwiseAndExpression_precedence_equality_left() {
- super.test_bitwiseAndExpression_precedence_equality_left();
- }
-
- @failingTest
- void test_bitwiseAndExpression_precedence_equality_right() {
- super.test_bitwiseAndExpression_precedence_equality_right();
- }
-
- @failingTest
- void test_bitwiseAndExpression_super() {
- super.test_bitwiseAndExpression_super();
- }
-
- @failingTest
- void test_bitwiseOrExpression_missing_LHS() {
- super.test_bitwiseOrExpression_missing_LHS();
- }
-
- @failingTest
- void test_bitwiseOrExpression_missing_LHS_RHS() {
- super.test_bitwiseOrExpression_missing_LHS_RHS();
- }
-
- @failingTest
- void test_bitwiseOrExpression_missing_RHS() {
- super.test_bitwiseOrExpression_missing_RHS();
- }
-
- @failingTest
- void test_bitwiseOrExpression_missing_RHS_super() {
- super.test_bitwiseOrExpression_missing_RHS_super();
- }
-
- @failingTest
- void test_bitwiseOrExpression_precedence_xor_left() {
- super.test_bitwiseOrExpression_precedence_xor_left();
- }
-
- @failingTest
- void test_bitwiseOrExpression_precedence_xor_right() {
- super.test_bitwiseOrExpression_precedence_xor_right();
- }
-
- @failingTest
- void test_bitwiseOrExpression_super() {
- super.test_bitwiseOrExpression_super();
- }
-
- @failingTest
- void test_bitwiseXorExpression_missing_LHS() {
- super.test_bitwiseXorExpression_missing_LHS();
- }
-
- @failingTest
- void test_bitwiseXorExpression_missing_LHS_RHS() {
- super.test_bitwiseXorExpression_missing_LHS_RHS();
- }
-
- @failingTest
- void test_bitwiseXorExpression_missing_RHS() {
- super.test_bitwiseXorExpression_missing_RHS();
- }
-
- @failingTest
- void test_bitwiseXorExpression_missing_RHS_super() {
- super.test_bitwiseXorExpression_missing_RHS_super();
- }
-
- @failingTest
- void test_bitwiseXorExpression_precedence_and_left() {
- super.test_bitwiseXorExpression_precedence_and_left();
- }
-
- @failingTest
- void test_bitwiseXorExpression_precedence_and_right() {
- super.test_bitwiseXorExpression_precedence_and_right();
- }
-
- @failingTest
- void test_bitwiseXorExpression_super() {
- super.test_bitwiseXorExpression_super();
- }
-
- @failingTest
- void test_classTypeAlias_withBody() {
- super.test_classTypeAlias_withBody();
- }
-
- @failingTest
- void test_combinator_badIdentifier() {
- super.test_combinator_badIdentifier();
- }
-
- @failingTest
- void test_combinator_missingIdentifier() {
- super.test_combinator_missingIdentifier();
- }
-
- @failingTest
- void test_conditionalExpression_missingElse() {
- super.test_conditionalExpression_missingElse();
- dart2Failure();
- }
-
- @failingTest
- void test_conditionalExpression_missingThen() {
- super.test_conditionalExpression_missingThen();
- dart2Failure();
- }
-
- @failingTest
- void test_declarationBeforeDirective() {
- super.test_declarationBeforeDirective();
- }
-
- @failingTest
- void test_equalityExpression_missing_LHS() {
- super.test_equalityExpression_missing_LHS();
- }
-
- @failingTest
- void test_equalityExpression_missing_LHS_RHS() {
- super.test_equalityExpression_missing_LHS_RHS();
- }
-
- @failingTest
- void test_equalityExpression_missing_RHS() {
- super.test_equalityExpression_missing_RHS();
- }
-
- @failingTest
- void test_equalityExpression_missing_RHS_super() {
- super.test_equalityExpression_missing_RHS_super();
- }
-
- @failingTest
- void test_equalityExpression_precedence_relational_left() {
- super.test_equalityExpression_precedence_relational_left();
- }
-
- @failingTest
- void test_equalityExpression_precedence_relational_right() {
- super.test_equalityExpression_precedence_relational_right();
- }
-
- @failingTest
- void test_equalityExpression_super() {
- super.test_equalityExpression_super();
- }
-
- @failingTest
- void test_expressionList_multiple_end() {
- super.test_expressionList_multiple_end();
- }
-
- @failingTest
- void test_expressionList_multiple_middle() {
- super.test_expressionList_multiple_middle();
- }
-
- @failingTest
- void test_expressionList_multiple_start() {
- super.test_expressionList_multiple_start();
- }
-
- @failingTest
- void test_functionExpression_in_ConstructorFieldInitializer() {
- super.test_functionExpression_in_ConstructorFieldInitializer();
- }
-
- @failingTest
- void test_functionExpression_named() {
- super.test_functionExpression_named();
- }
-
- @failingTest
- void test_ifStatement_noElse_statement() {
- super.test_ifStatement_noElse_statement();
- }
-
- @failingTest
- void test_importDirectivePartial_as() {
- super.test_importDirectivePartial_as();
- }
-
- @failingTest
- void test_importDirectivePartial_hide() {
- super.test_importDirectivePartial_hide();
- }
-
- @failingTest
- void test_importDirectivePartial_show() {
- super.test_importDirectivePartial_show();
- }
-
- @failingTest
- void test_incomplete_conditionalExpression() {
- super.test_incomplete_conditionalExpression();
- dart2Failure();
- }
-
- @failingTest
- void test_incomplete_constructorInitializers_empty() {
- super.test_incomplete_constructorInitializers_empty();
- }
-
- @failingTest
- void test_incomplete_constructorInitializers_missingEquals() {
- super.test_incomplete_constructorInitializers_missingEquals();
- }
-
- @failingTest
- void test_incomplete_constructorInitializers_this() {
- super.test_incomplete_constructorInitializers_this();
- }
-
- @failingTest
- void test_incomplete_constructorInitializers_thisField() {
- super.test_incomplete_constructorInitializers_thisField();
- }
-
- @failingTest
- void test_incomplete_constructorInitializers_thisPeriod() {
- super.test_incomplete_constructorInitializers_thisPeriod();
- }
-
- @failingTest
- void test_incomplete_constructorInitializers_variable() {
- super.test_incomplete_constructorInitializers_variable();
- }
-
- @failingTest
- void test_incomplete_functionExpression() {
- super.test_incomplete_functionExpression();
- }
-
- @failingTest
- void test_incomplete_functionExpression2() {
- super.test_incomplete_functionExpression2();
- }
-
- @failingTest
- void test_incomplete_returnType() {
- super.test_incomplete_returnType();
- }
-
- @failingTest
- void test_incomplete_topLevelFunction() {
- super.test_incomplete_topLevelFunction();
- }
-
- @failingTest
- void test_incomplete_topLevelVariable() {
- super.test_incomplete_topLevelVariable();
- }
-
- @failingTest
- void test_incomplete_topLevelVariable_const() {
- super.test_incomplete_topLevelVariable_const();
- }
-
- @failingTest
- void test_incomplete_topLevelVariable_final() {
- super.test_incomplete_topLevelVariable_final();
- }
-
- @failingTest
- void test_incomplete_topLevelVariable_var() {
- super.test_incomplete_topLevelVariable_var();
- }
-
- @failingTest
- void test_incompleteField_const() {
- super.test_incompleteField_const();
- }
-
- @failingTest
- void test_incompleteField_final() {
- super.test_incompleteField_final();
- }
-
- @failingTest
- void test_incompleteField_static() {
- super.test_incompleteField_static();
- }
-
- @failingTest
- void test_incompleteField_static2() {
- super.test_incompleteField_static2();
- }
-
- @failingTest
- void test_incompleteField_type() {
- super.test_incompleteField_type();
- }
-
- @failingTest
- void test_incompleteField_var() {
- super.test_incompleteField_var();
- }
-
- @failingTest
- void test_incompleteForEach() {
- super.test_incompleteForEach();
- }
-
- @failingTest
- void test_incompleteLocalVariable_atTheEndOfBlock() {
- super.test_incompleteLocalVariable_atTheEndOfBlock();
- }
-
- @failingTest
- void test_incompleteLocalVariable_atTheEndOfBlock_modifierOnly() {
- super.test_incompleteLocalVariable_atTheEndOfBlock_modifierOnly();
- }
-
- @failingTest
- void test_incompleteLocalVariable_beforeIdentifier() {
- super.test_incompleteLocalVariable_beforeIdentifier();
- }
-
- @failingTest
- void test_incompleteLocalVariable_beforeKeyword() {
- super.test_incompleteLocalVariable_beforeKeyword();
- }
-
- @failingTest
- void test_incompleteLocalVariable_beforeNextBlock() {
- super.test_incompleteLocalVariable_beforeNextBlock();
- }
-
- @failingTest
- void test_incompleteLocalVariable_parameterizedType() {
- super.test_incompleteLocalVariable_parameterizedType();
- }
-
- @failingTest
- void test_incompleteTypeArguments_field() {
- super.test_incompleteTypeArguments_field();
- }
-
- @failingTest
- void test_incompleteTypeParameters() {
- super.test_incompleteTypeParameters();
- }
-
- @failingTest
- void test_incompleteTypeParameters2() {
- super.test_incompleteTypeParameters2();
- }
-
- @failingTest
- void test_incompleteTypeParameters3() {
- super.test_incompleteTypeParameters3();
- }
-
- @failingTest
- void test_invalidFunctionBodyModifier() {
- super.test_invalidFunctionBodyModifier();
- }
-
- @failingTest
- void test_invalidTypeParameters() {
- super.test_invalidTypeParameters();
- }
-
- @failingTest
- void test_isExpression_noType() {
- super.test_isExpression_noType();
- }
-
- @failingTest
- void test_keywordInPlaceOfIdentifier() {
- super.test_keywordInPlaceOfIdentifier();
- }
-
- @failingTest
- void test_logicalAndExpression_missing_LHS() {
- super.test_logicalAndExpression_missing_LHS();
- dart2Failure();
- }
-
- @failingTest
- void test_logicalAndExpression_missing_LHS_RHS() {
- super.test_logicalAndExpression_missing_LHS_RHS();
- dart2Failure();
- }
-
- @failingTest
- void test_logicalAndExpression_missing_RHS() {
- super.test_logicalAndExpression_missing_RHS();
- dart2Failure();
- }
-
- @failingTest
- void test_logicalAndExpression_precedence_bitwiseOr_left() {
- super.test_logicalAndExpression_precedence_bitwiseOr_left();
- }
-
- @failingTest
- void test_logicalAndExpression_precedence_bitwiseOr_right() {
- super.test_logicalAndExpression_precedence_bitwiseOr_right();
- }
-
- @failingTest
- void test_logicalOrExpression_missing_LHS() {
- super.test_logicalOrExpression_missing_LHS();
- dart2Failure();
- }
-
- @failingTest
- void test_logicalOrExpression_missing_LHS_RHS() {
- super.test_logicalOrExpression_missing_LHS_RHS();
- dart2Failure();
- }
-
- @failingTest
- void test_logicalOrExpression_missing_RHS() {
- super.test_logicalOrExpression_missing_RHS();
- dart2Failure();
- }
-
- @failingTest
- void test_logicalOrExpression_precedence_logicalAnd_left() {
- super.test_logicalOrExpression_precedence_logicalAnd_left();
- dart2Failure();
- }
-
- @failingTest
- void test_logicalOrExpression_precedence_logicalAnd_right() {
- super.test_logicalOrExpression_precedence_logicalAnd_right();
- dart2Failure();
- }
-
- @failingTest
- void test_method_missingBody() {
- super.test_method_missingBody();
- }
-
- @failingTest
- void test_missing_commaInArgumentList() {
- super.test_missing_commaInArgumentList();
- }
-
- @failingTest
- void test_missingComma_beforeNamedArgument() {
- super.test_missingComma_beforeNamedArgument();
- }
-
- @failingTest
- void test_missingGet() {
- super.test_missingGet();
- }
-
- @failingTest
- void test_missingIdentifier_afterAnnotation() {
- super.test_missingIdentifier_afterAnnotation();
- }
-
- @failingTest
- void test_missingSemicolon_varialeDeclarationList() {
- super.test_missingSemicolon_varialeDeclarationList();
- }
-
- @failingTest
- void test_multiplicativeExpression_missing_LHS() {
- super.test_multiplicativeExpression_missing_LHS();
- }
-
- @failingTest
- void test_multiplicativeExpression_missing_LHS_RHS() {
- super.test_multiplicativeExpression_missing_LHS_RHS();
- }
-
- @failingTest
- void test_multiplicativeExpression_missing_RHS() {
- super.test_multiplicativeExpression_missing_RHS();
- }
-
- @failingTest
- void test_multiplicativeExpression_missing_RHS_super() {
- super.test_multiplicativeExpression_missing_RHS_super();
- }
-
- @failingTest
- void test_multiplicativeExpression_precedence_unary_left() {
- super.test_multiplicativeExpression_precedence_unary_left();
- }
-
- @failingTest
- void test_multiplicativeExpression_precedence_unary_right() {
- super.test_multiplicativeExpression_precedence_unary_right();
- }
-
- @failingTest
- void test_multiplicativeExpression_super() {
- super.test_multiplicativeExpression_super();
- }
-
- @failingTest
- void test_namedParameterOutsideGroup() {
- super.test_namedParameterOutsideGroup();
- }
-
- @failingTest
- void test_nonStringLiteralUri_import() {
- super.test_nonStringLiteralUri_import();
- }
-
- @failingTest
- void test_prefixExpression_missing_operand_minus() {
- super.test_prefixExpression_missing_operand_minus();
- }
-
- @failingTest
- void test_primaryExpression_argumentDefinitionTest() {
- super.test_primaryExpression_argumentDefinitionTest();
- }
-
- @failingTest
- void test_propertyAccess_missing_LHS_RHS() {
- super.test_propertyAccess_missing_LHS_RHS();
- }
-
- @failingTest
- void test_relationalExpression_missing_LHS() {
- super.test_relationalExpression_missing_LHS();
- }
-
- @failingTest
- void test_relationalExpression_missing_LHS_RHS() {
- super.test_relationalExpression_missing_LHS_RHS();
- }
-
- @failingTest
- void test_relationalExpression_missing_RHS() {
- super.test_relationalExpression_missing_RHS();
- }
-
- @failingTest
- void test_relationalExpression_precedence_shift_right() {
- super.test_relationalExpression_precedence_shift_right();
- }
-
- @failingTest
- void test_shiftExpression_missing_LHS() {
- super.test_shiftExpression_missing_LHS();
- }
-
- @failingTest
- void test_shiftExpression_missing_LHS_RHS() {
- super.test_shiftExpression_missing_LHS_RHS();
- }
-
- @failingTest
- void test_shiftExpression_missing_RHS() {
- super.test_shiftExpression_missing_RHS();
- }
-
- @failingTest
- void test_shiftExpression_missing_RHS_super() {
- super.test_shiftExpression_missing_RHS_super();
- }
-
- @failingTest
- void test_shiftExpression_precedence_unary_left() {
- super.test_shiftExpression_precedence_unary_left();
- }
-
- @failingTest
- void test_shiftExpression_precedence_unary_right() {
- super.test_shiftExpression_precedence_unary_right();
- }
-
- @failingTest
- void test_shiftExpression_super() {
- super.test_shiftExpression_super();
- }
-
- @failingTest
- void test_typedef_eof() {
- super.test_typedef_eof();
- }
-
- @failingTest
- void test_unaryPlus() {
- super.test_unaryPlus();
- }
-}
-
-@reflectiveTest
-class SimpleParserTest_Forest extends FastaBodyBuilderTestCase
- with SimpleParserTestMixin {
- SimpleParserTest_Forest() : super(false);
-
- @failingTest
- void test_classDeclaration_complexTypeParam() {
- super.test_classDeclaration_complexTypeParam();
- }
-
- @failingTest
- void test_parseAnnotation_n1() {
- super.test_parseAnnotation_n1();
- }
-
- @failingTest
- void test_parseAnnotation_n1_a() {
- super.test_parseAnnotation_n1_a();
- }
-
- @failingTest
- void test_parseAnnotation_n2() {
- super.test_parseAnnotation_n2();
- }
-
- @failingTest
- void test_parseAnnotation_n2_a() {
- super.test_parseAnnotation_n2_a();
- }
-
- @failingTest
- void test_parseAnnotation_n3() {
- super.test_parseAnnotation_n3();
- }
-
- @failingTest
- void test_parseAnnotation_n3_a() {
- super.test_parseAnnotation_n3_a();
- }
-
- @failingTest
- void test_parseArgumentList_empty() {
- super.test_parseArgumentList_empty();
- }
-
- @failingTest
- void test_parseArgumentList_mixed() {
- super.test_parseArgumentList_mixed();
- }
-
- @failingTest
- void test_parseArgumentList_noNamed() {
- super.test_parseArgumentList_noNamed();
- }
-
- @failingTest
- void test_parseArgumentList_onlyNamed() {
- super.test_parseArgumentList_onlyNamed();
- }
-
- @failingTest
- void test_parseArgumentList_trailing_comma() {
- super.test_parseArgumentList_trailing_comma();
- }
-
- @failingTest
- void test_parseArgumentList_typeArguments() {
- super.test_parseArgumentList_typeArguments();
- }
-
- @failingTest
- void test_parseArgumentList_typeArguments_none() {
- super.test_parseArgumentList_typeArguments_none();
- }
-
- @failingTest
- void test_parseArgumentList_typeArguments_prefixed() {
- super.test_parseArgumentList_typeArguments_prefixed();
- }
-
- @failingTest
- void test_parseCombinators_h() {
- super.test_parseCombinators_h();
- }
-
- @failingTest
- void test_parseCombinators_hs() {
- super.test_parseCombinators_hs();
- }
-
- @failingTest
- void test_parseCombinators_hshs() {
- super.test_parseCombinators_hshs();
- }
-
- @failingTest
- void test_parseCombinators_s() {
- super.test_parseCombinators_s();
- }
-
- @failingTest
- void test_parseCommentAndMetadata_c() {
- super.test_parseCommentAndMetadata_c();
- }
-
- @failingTest
- void test_parseCommentAndMetadata_cmc() {
- super.test_parseCommentAndMetadata_cmc();
- }
-
- @failingTest
- void test_parseCommentAndMetadata_cmcm() {
- super.test_parseCommentAndMetadata_cmcm();
- }
-
- @failingTest
- void test_parseCommentAndMetadata_cmm() {
- super.test_parseCommentAndMetadata_cmm();
- }
-
- @failingTest
- void test_parseCommentAndMetadata_m() {
- super.test_parseCommentAndMetadata_m();
- }
-
- @failingTest
- void test_parseCommentAndMetadata_mcm() {
- super.test_parseCommentAndMetadata_mcm();
- }
-
- @failingTest
- void test_parseCommentAndMetadata_mcmc() {
- super.test_parseCommentAndMetadata_mcmc();
- }
-
- @failingTest
- void test_parseCommentAndMetadata_mm() {
- super.test_parseCommentAndMetadata_mm();
- }
-
- @failingTest
- void test_parseCommentAndMetadata_none() {
- super.test_parseCommentAndMetadata_none();
- }
-
- @failingTest
- void test_parseCommentAndMetadata_singleLine() {
- super.test_parseCommentAndMetadata_singleLine();
- }
-
- @failingTest
- void test_parseConfiguration_noOperator_dottedIdentifier() {
- super.test_parseConfiguration_noOperator_dottedIdentifier();
- }
-
- @failingTest
- void test_parseConfiguration_noOperator_simpleIdentifier() {
- super.test_parseConfiguration_noOperator_simpleIdentifier();
- }
-
- @failingTest
- void test_parseConfiguration_operator_dottedIdentifier() {
- super.test_parseConfiguration_operator_dottedIdentifier();
- }
-
- @failingTest
- void test_parseConfiguration_operator_simpleIdentifier() {
- super.test_parseConfiguration_operator_simpleIdentifier();
- }
-
- @failingTest
- void test_parseConstructorName_named_noPrefix() {
- super.test_parseConstructorName_named_noPrefix();
- }
-
- @failingTest
- void test_parseConstructorName_named_prefixed() {
- super.test_parseConstructorName_named_prefixed();
- }
-
- @failingTest
- void test_parseConstructorName_unnamed_noPrefix() {
- super.test_parseConstructorName_unnamed_noPrefix();
- }
-
- @failingTest
- void test_parseConstructorName_unnamed_prefixed() {
- super.test_parseConstructorName_unnamed_prefixed();
- }
-
- @failingTest
- void test_parseDocumentationComment_block() {
- super.test_parseDocumentationComment_block();
- }
-
- @failingTest
- void test_parseDocumentationComment_block_withReference() {
- super.test_parseDocumentationComment_block_withReference();
- }
-
- @failingTest
- void test_parseDocumentationComment_endOfLine() {
- super.test_parseDocumentationComment_endOfLine();
- }
-
- @failingTest
- void test_parseExtendsClause() {
- super.test_parseExtendsClause();
- }
-
- @failingTest
- void test_parseFunctionBody_block() {
- super.test_parseFunctionBody_block();
- }
-
- @failingTest
- void test_parseFunctionBody_block_async() {
- super.test_parseFunctionBody_block_async();
- }
-
- @failingTest
- void test_parseFunctionBody_block_asyncGenerator() {
- super.test_parseFunctionBody_block_asyncGenerator();
- }
-
- @failingTest
- void test_parseFunctionBody_block_syncGenerator() {
- super.test_parseFunctionBody_block_syncGenerator();
- }
-
- @failingTest
- void test_parseFunctionBody_empty() {
- super.test_parseFunctionBody_empty();
- }
-
- @failingTest
- void test_parseFunctionBody_expression() {
- super.test_parseFunctionBody_expression();
- }
-
- @failingTest
- void test_parseFunctionBody_expression_async() {
- super.test_parseFunctionBody_expression_async();
- }
-
- @failingTest
- void test_parseIdentifierList_multiple() {
- super.test_parseIdentifierList_multiple();
- }
-
- @failingTest
- void test_parseIdentifierList_single() {
- super.test_parseIdentifierList_single();
- }
-
- @failingTest
- void test_parseImplementsClause_multiple() {
- super.test_parseImplementsClause_multiple();
- }
-
- @failingTest
- void test_parseImplementsClause_single() {
- super.test_parseImplementsClause_single();
- }
-
- @failingTest
- void test_parseInstanceCreation_noKeyword_noPrefix() {
- super.test_parseInstanceCreation_noKeyword_noPrefix();
- }
-
- @failingTest
- void test_parseInstanceCreation_noKeyword_prefix() {
- super.test_parseInstanceCreation_noKeyword_prefix();
- }
-
- @failingTest
- void test_parseInstanceCreation_noKeyword_varInit() {
- super.test_parseInstanceCreation_noKeyword_varInit();
- }
-
- @failingTest
- void test_parseLibraryIdentifier_builtin() {
- super.test_parseLibraryIdentifier_builtin();
- }
-
- @failingTest
- void test_parseLibraryIdentifier_invalid() {
- super.test_parseLibraryIdentifier_invalid();
- }
-
- @failingTest
- void test_parseLibraryIdentifier_multiple() {
- super.test_parseLibraryIdentifier_multiple();
- }
-
- @failingTest
- void test_parseLibraryIdentifier_pseudo() {
- super.test_parseLibraryIdentifier_pseudo();
- }
-
- @failingTest
- void test_parseLibraryIdentifier_single() {
- super.test_parseLibraryIdentifier_single();
- }
-
- @failingTest
- void test_parseStatement_function_noReturnType() {
- super.test_parseStatement_function_noReturnType();
- }
-
- @failingTest
- void test_parseTypeAnnotation_function_noReturnType_noParameters() {
- super.test_parseTypeAnnotation_function_noReturnType_noParameters();
- }
-
- @failingTest
- void test_parseTypeAnnotation_function_noReturnType_parameters() {
- super.test_parseTypeAnnotation_function_noReturnType_parameters();
- }
-
- @failingTest
- void test_parseTypeAnnotation_function_noReturnType_typeParameters() {
- super.test_parseTypeAnnotation_function_noReturnType_typeParameters();
- }
-
- @failingTest
- void
- test_parseTypeAnnotation_function_noReturnType_typeParameters_parameters() {
- super
- .test_parseTypeAnnotation_function_noReturnType_typeParameters_parameters();
- }
-
- @failingTest
- void test_parseTypeAnnotation_function_returnType_classFunction() {
- super.test_parseTypeAnnotation_function_returnType_classFunction();
- }
-
- @failingTest
- void test_parseTypeAnnotation_function_returnType_function() {
- super.test_parseTypeAnnotation_function_returnType_function();
- }
-
- @failingTest
- void test_parseTypeAnnotation_function_returnType_noParameters() {
- super.test_parseTypeAnnotation_function_returnType_noParameters();
- }
-
- @failingTest
- void test_parseTypeAnnotation_function_returnType_parameters() {
- super.test_parseTypeAnnotation_function_returnType_parameters();
- }
-
- @failingTest
- void test_parseTypeAnnotation_function_returnType_simple() {
- super.test_parseTypeAnnotation_function_returnType_simple();
- }
-
- @failingTest
- void test_parseTypeAnnotation_function_returnType_typeParameters() {
- super.test_parseTypeAnnotation_function_returnType_typeParameters();
- }
-
- @failingTest
- void
- test_parseTypeAnnotation_function_returnType_typeParameters_parameters() {
- super
- .test_parseTypeAnnotation_function_returnType_typeParameters_parameters();
- }
-
- @failingTest
- void test_parseTypeAnnotation_function_returnType_withArguments() {
- super.test_parseTypeAnnotation_function_returnType_withArguments();
- }
-
- @failingTest
- void test_parseTypeAnnotation_named() {
- super.test_parseTypeAnnotation_named();
- }
-
- @failingTest
- void test_parseTypeArgumentList_empty() {
- super.test_parseTypeArgumentList_empty();
- }
-
- @failingTest
- void test_parseTypeArgumentList_multiple() {
- super.test_parseTypeArgumentList_multiple();
- }
-
- @failingTest
- void test_parseTypeArgumentList_nested() {
- super.test_parseTypeArgumentList_nested();
- }
-
- @failingTest
- void test_parseTypeArgumentList_nested_withComment_double() {
- super.test_parseTypeArgumentList_nested_withComment_double();
- }
-
- @failingTest
- void test_parseTypeArgumentList_nested_withComment_tripple() {
- super.test_parseTypeArgumentList_nested_withComment_tripple();
- }
-
- @failingTest
- void test_parseTypeArgumentList_single() {
- super.test_parseTypeArgumentList_single();
- }
-
- @failingTest
- void test_parseTypeName_parameterized() {
- super.test_parseTypeName_parameterized();
- }
-
- @failingTest
- void test_parseTypeName_simple() {
- super.test_parseTypeName_simple();
- }
-
- @failingTest
- void test_parseTypeParameter_bounded_functionType_noReturn() {
- super.test_parseTypeParameter_bounded_functionType_noReturn();
- }
-
- @failingTest
- void test_parseTypeParameter_bounded_functionType_return() {
- super.test_parseTypeParameter_bounded_functionType_return();
- }
-
- @failingTest
- void test_parseTypeParameter_bounded_generic() {
- super.test_parseTypeParameter_bounded_generic();
- }
-
- @failingTest
- void test_parseTypeParameter_bounded_simple() {
- super.test_parseTypeParameter_bounded_simple();
- }
-
- @failingTest
- void test_parseTypeParameter_simple() {
- super.test_parseTypeParameter_simple();
- }
-
- @failingTest
- void test_parseTypeParameterList_multiple() {
- super.test_parseTypeParameterList_multiple();
- }
-
- @failingTest
- void test_parseTypeParameterList_parameterizedWithTrailingEquals() {
- super.test_parseTypeParameterList_parameterizedWithTrailingEquals();
- }
-
- @failingTest
- void test_parseTypeParameterList_parameterizedWithTrailingEquals2() {
- super.test_parseTypeParameterList_parameterizedWithTrailingEquals2();
- }
-
- @failingTest
- void test_parseTypeParameterList_single() {
- super.test_parseTypeParameterList_single();
- }
-
- @failingTest
- void test_parseTypeParameterList_withTrailingEquals() {
- super.test_parseTypeParameterList_withTrailingEquals();
- }
-
- @failingTest
- void test_parseVariableDeclaration_equals() {
- super.test_parseVariableDeclaration_equals();
- }
-
- @failingTest
- void test_parseVariableDeclaration_noEquals() {
- super.test_parseVariableDeclaration_noEquals();
- }
-
- @failingTest
- void test_parseWithClause_multiple() {
- super.test_parseWithClause_multiple();
- }
-
- @failingTest
- void test_parseWithClause_single() {
- super.test_parseWithClause_single();
- }
-}
-
-@reflectiveTest
-class StatementParserTest_Forest extends FastaBodyBuilderTestCase
- with StatementParserTestMixin {
- StatementParserTest_Forest() : super(false);
-
- @failingTest
- void test_invalid_typeParamAnnotation() {
- super.test_invalid_typeParamAnnotation();
- }
-
- @failingTest
- void test_invalid_typeParamAnnotation2() {
- super.test_invalid_typeParamAnnotation2();
- }
-
- @failingTest
- void test_invalid_typeParamAnnotation3() {
- super.test_invalid_typeParamAnnotation3();
- }
-
- @failingTest
- void test_parseForStatement_each_await() {
- super.test_parseForStatement_each_await();
- }
-
- @failingTest
- void test_parseForStatement_each_genericFunctionType() {
- super.test_parseForStatement_each_genericFunctionType();
- }
-
- @failingTest
- void test_parseForStatement_each_identifier() {
- super.test_parseForStatement_each_identifier();
- }
-
- @failingTest
- void test_parseForStatement_each_noType_metadata() {
- super.test_parseForStatement_each_noType_metadata();
- }
-
- @failingTest
- void test_parseForStatement_each_type() {
- super.test_parseForStatement_each_type();
- }
-
- @failingTest
- void test_parseForStatement_each_var() {
- super.test_parseForStatement_each_var();
- }
-
- @failingTest
- void test_parseForStatement_loop_c() {
- super.test_parseForStatement_loop_c();
- }
-
- @failingTest
- void test_parseForStatement_loop_cu() {
- super.test_parseForStatement_loop_cu();
- }
-
- @failingTest
- void test_parseForStatement_loop_ecu() {
- super.test_parseForStatement_loop_ecu();
- }
-
- @failingTest
- void test_parseForStatement_loop_i() {
- super.test_parseForStatement_loop_i();
- }
-
- @failingTest
- void test_parseForStatement_loop_i_withMetadata() {
- super.test_parseForStatement_loop_i_withMetadata();
- }
-
- @failingTest
- void test_parseForStatement_loop_ic() {
- super.test_parseForStatement_loop_ic();
- }
-
- @failingTest
- void test_parseForStatement_loop_icu() {
- super.test_parseForStatement_loop_icu();
- }
-
- @failingTest
- void test_parseForStatement_loop_iicuu() {
- super.test_parseForStatement_loop_iicuu();
- }
-
- @failingTest
- void test_parseForStatement_loop_iu() {
- super.test_parseForStatement_loop_iu();
- }
-
- @failingTest
- void test_parseForStatement_loop_u() {
- super.test_parseForStatement_loop_u();
- }
-
- @failingTest
- void test_parseFunctionDeclarationStatement() {
- super.test_parseFunctionDeclarationStatement();
- }
-
- @failingTest
- void test_parseFunctionDeclarationStatement_typeParameterComments() {
- super.test_parseFunctionDeclarationStatement_typeParameterComments();
- }
-
- @failingTest
- void test_parseFunctionDeclarationStatement_typeParameters() {
- super.test_parseFunctionDeclarationStatement_typeParameters();
- }
-
- @failingTest
- void test_parseFunctionDeclarationStatement_typeParameters_noReturnType() {
- super.test_parseFunctionDeclarationStatement_typeParameters_noReturnType();
- }
-
- @failingTest
- void test_parseIfStatement_else_statement() {
- super.test_parseIfStatement_else_statement();
- }
-
- @failingTest
- void test_parseIfStatement_noElse_statement() {
- super.test_parseIfStatement_noElse_statement();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_const_object() {
- super.test_parseNonLabeledStatement_const_object();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_const_object_named_typeParameters() {
- super.test_parseNonLabeledStatement_const_object_named_typeParameters();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_constructorInvocation() {
- super.test_parseNonLabeledStatement_constructorInvocation();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_functionDeclaration() {
- super.test_parseNonLabeledStatement_functionDeclaration();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_functionDeclaration_arguments() {
- super.test_parseNonLabeledStatement_functionDeclaration_arguments();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_functionExpressionIndex() {
- super.test_parseNonLabeledStatement_functionExpressionIndex();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_functionInvocation() {
- super.test_parseNonLabeledStatement_functionInvocation();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_invokeFunctionExpression() {
- super.test_parseNonLabeledStatement_invokeFunctionExpression();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_localFunction_gftReturnType() {
- super.test_parseNonLabeledStatement_localFunction_gftReturnType();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_startingWithBuiltInIdentifier() {
- super.test_parseNonLabeledStatement_startingWithBuiltInIdentifier();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_typeCast() {
- super.test_parseNonLabeledStatement_typeCast();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_variableDeclaration_final_namedFunction() {
- super
- .test_parseNonLabeledStatement_variableDeclaration_final_namedFunction();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_variableDeclaration_gftType() {
- super.test_parseNonLabeledStatement_variableDeclaration_gftType();
- }
-
- @failingTest
- void
- test_parseNonLabeledStatement_variableDeclaration_gftType_functionReturnType() {
- super
- .test_parseNonLabeledStatement_variableDeclaration_gftType_functionReturnType();
- }
-
- @failingTest
- void
- test_parseNonLabeledStatement_variableDeclaration_gftType_gftReturnType() {
- super
- .test_parseNonLabeledStatement_variableDeclaration_gftType_gftReturnType();
- }
-
- @failingTest
- void
- test_parseNonLabeledStatement_variableDeclaration_gftType_gftReturnType2() {
- super
- .test_parseNonLabeledStatement_variableDeclaration_gftType_gftReturnType2();
- }
-
- @failingTest
- void
- test_parseNonLabeledStatement_variableDeclaration_gftType_noReturnType() {
- super
- .test_parseNonLabeledStatement_variableDeclaration_gftType_noReturnType();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_variableDeclaration_gftType_returnType() {
- super
- .test_parseNonLabeledStatement_variableDeclaration_gftType_returnType();
- }
-
- @failingTest
- void
- test_parseNonLabeledStatement_variableDeclaration_gftType_voidReturnType() {
- super
- .test_parseNonLabeledStatement_variableDeclaration_gftType_voidReturnType();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_variableDeclaration_typeParam() {
- super.test_parseNonLabeledStatement_variableDeclaration_typeParam();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_variableDeclaration_typeParam2() {
- super.test_parseNonLabeledStatement_variableDeclaration_typeParam2();
- }
-
- @failingTest
- void test_parseNonLabeledStatement_variableDeclaration_typeParam3() {
- super.test_parseNonLabeledStatement_variableDeclaration_typeParam3();
- }
-
- @failingTest
- void test_parseStatement_emptyTypeArgumentList() {
- super.test_parseStatement_emptyTypeArgumentList();
- }
-
- @failingTest
- void test_parseStatement_function_gftReturnType() {
- super.test_parseStatement_function_gftReturnType();
- }
-
- @failingTest
- void
- test_parseStatement_functionDeclaration_noReturnType_typeParameterComments() {
- super
- .test_parseStatement_functionDeclaration_noReturnType_typeParameterComments();
- }
-
- @failingTest
- void test_parseStatement_functionDeclaration_noReturnType_typeParameters() {
- super.test_parseStatement_functionDeclaration_noReturnType_typeParameters();
- }
-
- @failingTest
- void test_parseStatement_functionDeclaration_returnType() {
- super.test_parseStatement_functionDeclaration_returnType();
- }
-
- @failingTest
- void test_parseStatement_functionDeclaration_returnType_typeParameters() {
- super.test_parseStatement_functionDeclaration_returnType_typeParameters();
- }
-
- @failingTest
- void test_parseSwitchStatement_case() {
- super.test_parseSwitchStatement_case();
- }
-
- @failingTest
- void test_parseSwitchStatement_empty() {
- super.test_parseSwitchStatement_empty();
- }
-
- @failingTest
- void test_parseSwitchStatement_labeledCase() {
- super.test_parseSwitchStatement_labeledCase();
- }
-
- @failingTest
- void test_parseSwitchStatement_labeledDefault() {
- super.test_parseSwitchStatement_labeledDefault();
- }
-
- @failingTest
- void test_parseSwitchStatement_labeledStatementInCase() {
- super.test_parseSwitchStatement_labeledStatementInCase();
- }
-
- @failingTest
- void test_parseTryStatement_catch() {
- super.test_parseTryStatement_catch();
- }
-
- @failingTest
- void test_parseTryStatement_catch_error_missingCatchParam() {
- super.test_parseTryStatement_catch_error_missingCatchParam();
- }
-
- @failingTest
- void test_parseTryStatement_catch_error_missingCatchParen() {
- super.test_parseTryStatement_catch_error_missingCatchParen();
- }
-
- @failingTest
- void test_parseTryStatement_catch_error_missingCatchTrace() {
- super.test_parseTryStatement_catch_error_missingCatchTrace();
- }
-
- @failingTest
- void test_parseTryStatement_catch_finally() {
- super.test_parseTryStatement_catch_finally();
- }
-
- @failingTest
- void test_parseTryStatement_multiple() {
- super.test_parseTryStatement_multiple();
- }
-
- @failingTest
- void test_parseTryStatement_on() {
- super.test_parseTryStatement_on();
- }
-
- @failingTest
- void test_parseTryStatement_on_catch() {
- super.test_parseTryStatement_on_catch();
- }
-
- @failingTest
- void test_parseTryStatement_on_catch_finally() {
- super.test_parseTryStatement_on_catch_finally();
- }
-
- @failingTest
- void test_parseVariableDeclaration_equals_builtIn() {
- super.test_parseVariableDeclaration_equals_builtIn();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_const_noType() {
- super.test_parseVariableDeclarationListAfterMetadata_const_noType();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_const_type() {
- super.test_parseVariableDeclarationListAfterMetadata_const_type();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_const_typeComment() {
- super.test_parseVariableDeclarationListAfterMetadata_const_typeComment();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_dynamic_typeComment() {
- super.test_parseVariableDeclarationListAfterMetadata_dynamic_typeComment();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_final_noType() {
- super.test_parseVariableDeclarationListAfterMetadata_final_noType();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_final_type() {
- super.test_parseVariableDeclarationListAfterMetadata_final_type();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_final_typeComment() {
- super.test_parseVariableDeclarationListAfterMetadata_final_typeComment();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_type_multiple() {
- super.test_parseVariableDeclarationListAfterMetadata_type_multiple();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_type_single() {
- super.test_parseVariableDeclarationListAfterMetadata_type_single();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_type_typeComment() {
- super.test_parseVariableDeclarationListAfterMetadata_type_typeComment();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_var_multiple() {
- super.test_parseVariableDeclarationListAfterMetadata_var_multiple();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_var_single() {
- super.test_parseVariableDeclarationListAfterMetadata_var_single();
- }
-
- @failingTest
- void test_parseVariableDeclarationListAfterMetadata_var_typeComment() {
- super.test_parseVariableDeclarationListAfterMetadata_var_typeComment();
- }
-
- @failingTest
- void test_parseVariableDeclarationStatementAfterMetadata_multiple() {
- super.test_parseVariableDeclarationStatementAfterMetadata_multiple();
- }
-
- @failingTest
- void test_parseVariableDeclarationStatementAfterMetadata_single() {
- super.test_parseVariableDeclarationStatementAfterMetadata_single();
- }
-
- @failingTest
- void test_parseYieldStatement_each() {
- super.test_parseYieldStatement_each();
- }
-
- @failingTest
- void test_parseYieldStatement_normal() {
- super.test_parseYieldStatement_normal();
- }
-}
-
-@reflectiveTest
-class TopLevelParserTest_Forest extends FastaBodyBuilderTestCase
- with TopLevelParserTestMixin {
- TopLevelParserTest_Forest() : super(false);
-
- @failingTest
- void test_function_literal_allowed_at_toplevel() {
- super.test_function_literal_allowed_at_toplevel();
- }
-
- @failingTest
- void
- test_function_literal_allowed_in_ArgumentList_in_ConstructorFieldInitializer() {
- super
- .test_function_literal_allowed_in_ArgumentList_in_ConstructorFieldInitializer();
- }
-
- @failingTest
- void
- test_function_literal_allowed_in_IndexExpression_in_ConstructorFieldInitializer() {
- super
- .test_function_literal_allowed_in_IndexExpression_in_ConstructorFieldInitializer();
- }
-
- @failingTest
- void
- test_function_literal_allowed_in_ListLiteral_in_ConstructorFieldInitializer() {
- super
- .test_function_literal_allowed_in_ListLiteral_in_ConstructorFieldInitializer();
- }
-
- @failingTest
- void
- test_function_literal_allowed_in_MapLiteral_in_ConstructorFieldInitializer() {
- super
- .test_function_literal_allowed_in_MapLiteral_in_ConstructorFieldInitializer();
- }
-
- @failingTest
- void
- test_function_literal_allowed_in_ParenthesizedExpression_in_ConstructorFieldInitializer() {
- super
- .test_function_literal_allowed_in_ParenthesizedExpression_in_ConstructorFieldInitializer();
- }
-
- @failingTest
- void
- test_function_literal_allowed_in_StringInterpolation_in_ConstructorFieldInitializer() {
- super
- .test_function_literal_allowed_in_StringInterpolation_in_ConstructorFieldInitializer();
- }
-
- @failingTest
- void test_import_as_show() {
- super.test_import_as_show();
- }
-
- @failingTest
- void test_import_show_hide() {
- super.test_import_show_hide();
- }
-
- @failingTest
- void test_import_withDocComment() {
- super.test_import_withDocComment();
- }
-
- @failingTest
- void test_parseClassDeclaration_abstract() {
- super.test_parseClassDeclaration_abstract();
- }
-
- @failingTest
- void test_parseClassDeclaration_empty() {
- super.test_parseClassDeclaration_empty();
- }
-
- @failingTest
- void test_parseClassDeclaration_extends() {
- super.test_parseClassDeclaration_extends();
- }
-
- @failingTest
- void test_parseClassDeclaration_extendsAndImplements() {
- super.test_parseClassDeclaration_extendsAndImplements();
- }
-
- @failingTest
- void test_parseClassDeclaration_extendsAndWith() {
- super.test_parseClassDeclaration_extendsAndWith();
- }
-
- @failingTest
- void test_parseClassDeclaration_extendsAndWithAndImplements() {
- super.test_parseClassDeclaration_extendsAndWithAndImplements();
- }
-
- @failingTest
- void test_parseClassDeclaration_implements() {
- super.test_parseClassDeclaration_implements();
- }
-
- @failingTest
- void test_parseClassDeclaration_metadata() {
- super.test_parseClassDeclaration_metadata();
- }
-
- @failingTest
- void test_parseClassDeclaration_native() {
- super.test_parseClassDeclaration_native();
- }
-
- @failingTest
- void test_parseClassDeclaration_nonEmpty() {
- super.test_parseClassDeclaration_nonEmpty();
- }
-
- @failingTest
- void test_parseClassDeclaration_typeAlias_implementsC() {
- super.test_parseClassDeclaration_typeAlias_implementsC();
- }
-
- @failingTest
- void test_parseClassDeclaration_typeAlias_withB() {
- super.test_parseClassDeclaration_typeAlias_withB();
- }
-
- @failingTest
- void test_parseClassDeclaration_typeParameters() {
- super.test_parseClassDeclaration_typeParameters();
- }
-
- @failingTest
- void test_parseClassDeclaration_withDocumentationComment() {
- super.test_parseClassDeclaration_withDocumentationComment();
- }
-
- @failingTest
- void test_parseClassTypeAlias_withDocumentationComment() {
- super.test_parseClassTypeAlias_withDocumentationComment();
- }
-
- @failingTest
- void test_parseCompilationUnit_abstractAsPrefix_parameterized() {
- super.test_parseCompilationUnit_abstractAsPrefix_parameterized();
- }
-
- @failingTest
- void test_parseCompilationUnit_builtIn_asFunctionName() {
- super.test_parseCompilationUnit_builtIn_asFunctionName();
- }
-
- @failingTest
- void test_parseCompilationUnit_builtIn_asFunctionName_withTypeParameter() {
- super.test_parseCompilationUnit_builtIn_asFunctionName_withTypeParameter();
- }
-
- @failingTest
- void test_parseCompilationUnit_builtIn_asGetter() {
- super.test_parseCompilationUnit_builtIn_asGetter();
- }
-
- @failingTest
- void test_parseCompilationUnit_directives_multiple() {
- super.test_parseCompilationUnit_directives_multiple();
- }
-
- @failingTest
- void test_parseCompilationUnit_directives_single() {
- super.test_parseCompilationUnit_directives_single();
- }
-
- @failingTest
- void test_parseCompilationUnit_empty() {
- super.test_parseCompilationUnit_empty();
- }
-
- @failingTest
- void test_parseCompilationUnit_exportAsPrefix() {
- super.test_parseCompilationUnit_exportAsPrefix();
- }
-
- @failingTest
- void test_parseCompilationUnit_exportAsPrefix_parameterized() {
- super.test_parseCompilationUnit_exportAsPrefix_parameterized();
- }
-
- @failingTest
- void test_parseCompilationUnit_operatorAsPrefix_parameterized() {
- super.test_parseCompilationUnit_operatorAsPrefix_parameterized();
- }
-
- @failingTest
- void test_parseCompilationUnit_pseudo_prefixed() {
- super.test_parseCompilationUnit_pseudo_prefixed();
- }
-
- @failingTest
- void test_parseCompilationUnit_script() {
- super.test_parseCompilationUnit_script();
- }
-
- @failingTest
- void test_parseCompilationUnit_skipFunctionBody_withInterpolation() {
- super.test_parseCompilationUnit_skipFunctionBody_withInterpolation();
- }
-
- @failingTest
- void test_parseCompilationUnit_topLevelDeclaration() {
- super.test_parseCompilationUnit_topLevelDeclaration();
- }
-
- @failingTest
- void test_parseCompilationUnit_typedefAsPrefix() {
- super.test_parseCompilationUnit_typedefAsPrefix();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_abstractAsPrefix() {
- super.test_parseCompilationUnitMember_abstractAsPrefix();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_class() {
- super.test_parseCompilationUnitMember_class();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_classTypeAlias() {
- super.test_parseCompilationUnitMember_classTypeAlias();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_constVariable() {
- super.test_parseCompilationUnitMember_constVariable();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_expressionFunctionBody_tokens() {
- super.test_parseCompilationUnitMember_expressionFunctionBody_tokens();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_finalVariable() {
- super.test_parseCompilationUnitMember_finalVariable();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_function_external_noType() {
- super.test_parseCompilationUnitMember_function_external_noType();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_function_external_type() {
- super.test_parseCompilationUnitMember_function_external_type();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_function_generic_noReturnType() {
- super.test_parseCompilationUnitMember_function_generic_noReturnType();
- }
-
- @failingTest
- void
- test_parseCompilationUnitMember_function_generic_noReturnType_annotated() {
- super
- .test_parseCompilationUnitMember_function_generic_noReturnType_annotated();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_function_generic_returnType() {
- super.test_parseCompilationUnitMember_function_generic_returnType();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_function_generic_void() {
- super.test_parseCompilationUnitMember_function_generic_void();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_function_gftReturnType() {
- super.test_parseCompilationUnitMember_function_gftReturnType();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_function_noReturnType() {
- super.test_parseCompilationUnitMember_function_noReturnType();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_function_noType() {
- super.test_parseCompilationUnitMember_function_noType();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_function_type() {
- super.test_parseCompilationUnitMember_function_type();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_function_void() {
- super.test_parseCompilationUnitMember_function_void();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_getter_external_noType() {
- super.test_parseCompilationUnitMember_getter_external_noType();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_getter_external_type() {
- super.test_parseCompilationUnitMember_getter_external_type();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_getter_noType() {
- super.test_parseCompilationUnitMember_getter_noType();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_getter_type() {
- super.test_parseCompilationUnitMember_getter_type();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_setter_external_noType() {
- super.test_parseCompilationUnitMember_setter_external_noType();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_setter_external_type() {
- super.test_parseCompilationUnitMember_setter_external_type();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_setter_noType() {
- super.test_parseCompilationUnitMember_setter_noType();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_setter_type() {
- super.test_parseCompilationUnitMember_setter_type();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_typeAlias_abstract() {
- super.test_parseCompilationUnitMember_typeAlias_abstract();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_typeAlias_generic() {
- super.test_parseCompilationUnitMember_typeAlias_generic();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_typeAlias_implements() {
- super.test_parseCompilationUnitMember_typeAlias_implements();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_typeAlias_noImplements() {
- super.test_parseCompilationUnitMember_typeAlias_noImplements();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_typedef() {
- super.test_parseCompilationUnitMember_typedef();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_typedef_withDocComment() {
- super.test_parseCompilationUnitMember_typedef_withDocComment();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_typedVariable() {
- super.test_parseCompilationUnitMember_typedVariable();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_variable() {
- super.test_parseCompilationUnitMember_variable();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_variable_gftType_gftReturnType() {
- super.test_parseCompilationUnitMember_variable_gftType_gftReturnType();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_variable_gftType_noReturnType() {
- super.test_parseCompilationUnitMember_variable_gftType_noReturnType();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_variable_withDocumentationComment() {
- super.test_parseCompilationUnitMember_variable_withDocumentationComment();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_variableGet() {
- super.test_parseCompilationUnitMember_variableGet();
- }
-
- @failingTest
- void test_parseCompilationUnitMember_variableSet() {
- super.test_parseCompilationUnitMember_variableSet();
- }
-
- @failingTest
- void test_parseDirective_export() {
- super.test_parseDirective_export();
- }
-
- @failingTest
- void test_parseDirective_export_withDocComment() {
- super.test_parseDirective_export_withDocComment();
- }
-
- @failingTest
- void test_parseDirective_import() {
- super.test_parseDirective_import();
- }
-
- @failingTest
- void test_parseDirective_library() {
- super.test_parseDirective_library();
- }
-
- @failingTest
- void test_parseDirective_library_1_component() {
- super.test_parseDirective_library_1_component();
- }
-
- @failingTest
- void test_parseDirective_library_2_components() {
- super.test_parseDirective_library_2_components();
- }
-
- @failingTest
- void test_parseDirective_library_3_components() {
- super.test_parseDirective_library_3_components();
- }
-
- @failingTest
- void test_parseDirective_library_withDocumentationComment() {
- super.test_parseDirective_library_withDocumentationComment();
- }
-
- @failingTest
- void test_parseDirective_part() {
- super.test_parseDirective_part();
- }
-
- @failingTest
- void test_parseDirective_part_of_1_component() {
- super.test_parseDirective_part_of_1_component();
- }
-
- @failingTest
- void test_parseDirective_part_of_2_components() {
- super.test_parseDirective_part_of_2_components();
- }
-
- @failingTest
- void test_parseDirective_part_of_3_components() {
- super.test_parseDirective_part_of_3_components();
- }
-
- @failingTest
- void test_parseDirective_part_of_withDocumentationComment() {
- super.test_parseDirective_part_of_withDocumentationComment();
- }
-
- @failingTest
- void test_parseDirective_part_withDocumentationComment() {
- super.test_parseDirective_part_withDocumentationComment();
- }
-
- @failingTest
- void test_parseDirective_partOf() {
- super.test_parseDirective_partOf();
- }
-
- @failingTest
- void test_parseDirectives_complete() {
- super.test_parseDirectives_complete();
- }
-
- @failingTest
- void test_parseDirectives_empty() {
- super.test_parseDirectives_empty();
- }
-
- @failingTest
- void test_parseDirectives_mixed() {
- super.test_parseDirectives_mixed();
- }
-
- @failingTest
- void test_parseDirectives_multiple() {
- super.test_parseDirectives_multiple();
- }
-
- @failingTest
- void test_parseDirectives_script() {
- super.test_parseDirectives_script();
- }
-
- @failingTest
- void test_parseDirectives_single() {
- super.test_parseDirectives_single();
- }
-
- @failingTest
- void test_parseDirectives_topLevelDeclaration() {
- super.test_parseDirectives_topLevelDeclaration();
- }
-
- @failingTest
- void test_parseEnumDeclaration_one() {
- super.test_parseEnumDeclaration_one();
- }
-
- @failingTest
- void test_parseEnumDeclaration_trailingComma() {
- super.test_parseEnumDeclaration_trailingComma();
- }
-
- @failingTest
- void test_parseEnumDeclaration_two() {
- super.test_parseEnumDeclaration_two();
- }
-
- @failingTest
- void test_parseEnumDeclaration_withDocComment_onEnum() {
- super.test_parseEnumDeclaration_withDocComment_onEnum();
- }
-
- @failingTest
- void test_parseEnumDeclaration_withDocComment_onValue() {
- super.test_parseEnumDeclaration_withDocComment_onValue();
- }
-
- @failingTest
- void test_parseExportDirective_configuration_multiple() {
- super.test_parseExportDirective_configuration_multiple();
- }
-
- @failingTest
- void test_parseExportDirective_configuration_single() {
- super.test_parseExportDirective_configuration_single();
- }
-
- @failingTest
- void test_parseExportDirective_hide() {
- super.test_parseExportDirective_hide();
- }
-
- @failingTest
- void test_parseExportDirective_hide_show() {
- super.test_parseExportDirective_hide_show();
- }
-
- @failingTest
- void test_parseExportDirective_noCombinator() {
- super.test_parseExportDirective_noCombinator();
- }
-
- @failingTest
- void test_parseExportDirective_show() {
- super.test_parseExportDirective_show();
- }
-
- @failingTest
- void test_parseExportDirective_show_hide() {
- super.test_parseExportDirective_show_hide();
- }
-
- @failingTest
- void test_parseFunctionDeclaration_function() {
- super.test_parseFunctionDeclaration_function();
- }
-
- @failingTest
- void test_parseFunctionDeclaration_functionWithTypeParameters() {
- super.test_parseFunctionDeclaration_functionWithTypeParameters();
- }
-
- @failingTest
- void test_parseFunctionDeclaration_getter() {
- super.test_parseFunctionDeclaration_getter();
- }
-
- @failingTest
- void test_parseFunctionDeclaration_metadata() {
- super.test_parseFunctionDeclaration_metadata();
- }
-
- @failingTest
- void test_parseFunctionDeclaration_setter() {
- super.test_parseFunctionDeclaration_setter();
- }
-
- @failingTest
- void test_parseGenericTypeAlias_noTypeParameters() {
- super.test_parseGenericTypeAlias_noTypeParameters();
- }
-
- @failingTest
- void test_parseGenericTypeAlias_typeParameters() {
- super.test_parseGenericTypeAlias_typeParameters();
- }
-
- @failingTest
- void test_parseImportDirective_configuration_multiple() {
- super.test_parseImportDirective_configuration_multiple();
- }
-
- @failingTest
- void test_parseImportDirective_configuration_single() {
- super.test_parseImportDirective_configuration_single();
- }
-
- @failingTest
- void test_parseImportDirective_deferred() {
- super.test_parseImportDirective_deferred();
- }
-
- @failingTest
- void test_parseImportDirective_hide() {
- super.test_parseImportDirective_hide();
- }
-
- @failingTest
- void test_parseImportDirective_noCombinator() {
- super.test_parseImportDirective_noCombinator();
- }
-
- @failingTest
- void test_parseImportDirective_prefix() {
- super.test_parseImportDirective_prefix();
- }
-
- @failingTest
- void test_parseImportDirective_prefix_hide_show() {
- super.test_parseImportDirective_prefix_hide_show();
- }
-
- @failingTest
- void test_parseImportDirective_prefix_show_hide() {
- super.test_parseImportDirective_prefix_show_hide();
- }
-
- @failingTest
- void test_parseImportDirective_show() {
- super.test_parseImportDirective_show();
- }
-
- @failingTest
- void test_parseLibraryDirective() {
- super.test_parseLibraryDirective();
- }
-
- @failingTest
- void test_parsePartDirective() {
- super.test_parsePartDirective();
- }
-
- @failingTest
- void test_parsePartOfDirective_name() {
- super.test_parsePartOfDirective_name();
- }
-
- @failingTest
- void test_parsePartOfDirective_uri() {
- super.test_parsePartOfDirective_uri();
- }
-
- @failingTest
- void test_parseTypeAlias_function_noParameters() {
- super.test_parseTypeAlias_function_noParameters();
- }
-
- @failingTest
- void test_parseTypeAlias_function_noReturnType() {
- super.test_parseTypeAlias_function_noReturnType();
- }
-
- @failingTest
- void test_parseTypeAlias_function_parameterizedReturnType() {
- super.test_parseTypeAlias_function_parameterizedReturnType();
- }
-
- @failingTest
- void test_parseTypeAlias_function_parameters() {
- super.test_parseTypeAlias_function_parameters();
- }
-
- @failingTest
- void test_parseTypeAlias_function_typeParameters() {
- super.test_parseTypeAlias_function_typeParameters();
- }
-
- @failingTest
- void test_parseTypeAlias_function_voidReturnType() {
- super.test_parseTypeAlias_function_voidReturnType();
- }
-
- @failingTest
- void test_parseTypeAlias_genericFunction_noParameters() {
- super.test_parseTypeAlias_genericFunction_noParameters();
- }
-
- @failingTest
- void test_parseTypeAlias_genericFunction_noReturnType() {
- super.test_parseTypeAlias_genericFunction_noReturnType();
- }
-
- @failingTest
- void test_parseTypeAlias_genericFunction_parameterizedReturnType() {
- super.test_parseTypeAlias_genericFunction_parameterizedReturnType();
- }
-
- @failingTest
- void test_parseTypeAlias_genericFunction_parameters() {
- super.test_parseTypeAlias_genericFunction_parameters();
- }
-
- @failingTest
- void test_parseTypeAlias_genericFunction_typeParameters() {
- super.test_parseTypeAlias_genericFunction_typeParameters();
- }
-
- @failingTest
- void test_parseTypeAlias_genericFunction_typeParameters_noParameters() {
- super.test_parseTypeAlias_genericFunction_typeParameters_noParameters();
- }
-
- @failingTest
- void test_parseTypeAlias_genericFunction_typeParameters_noReturnType() {
- super.test_parseTypeAlias_genericFunction_typeParameters_noReturnType();
- }
-
- @failingTest
- void
- test_parseTypeAlias_genericFunction_typeParameters_parameterizedReturnType() {
- super
- .test_parseTypeAlias_genericFunction_typeParameters_parameterizedReturnType();
- }
-
- @failingTest
- void test_parseTypeAlias_genericFunction_typeParameters_parameters() {
- super.test_parseTypeAlias_genericFunction_typeParameters_parameters();
- }
-
- @failingTest
- void test_parseTypeAlias_genericFunction_typeParameters_typeParameters() {
- super.test_parseTypeAlias_genericFunction_typeParameters_typeParameters();
- }
-
- @failingTest
- void test_parseTypeAlias_genericFunction_typeParameters_voidReturnType() {
- super.test_parseTypeAlias_genericFunction_typeParameters_voidReturnType();
- }
-
- @failingTest
- void test_parseTypeAlias_genericFunction_voidReturnType() {
- super.test_parseTypeAlias_genericFunction_voidReturnType();
- }
-
- @failingTest
- void test_parseTypeAlias_genericFunction_withDocComment() {
- super.test_parseTypeAlias_genericFunction_withDocComment();
- }
-
- @failingTest
- void test_parseTypeVariable_withDocumentationComment() {
- super.test_parseTypeVariable_withDocumentationComment();
- }
-}
diff --git a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
index 234c2ff..b0bd5c2 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_kernel_test.dart
@@ -261,20 +261,6 @@
@override
@failingTest
- test_invalidAssignment_defaultValue_named() async {
- // UnimplementedError: kernel: (Let) let final dynamic #t1 = 0 in let ...
- await super.test_invalidAssignment_defaultValue_named();
- }
-
- @override
- @failingTest
- test_invalidAssignment_defaultValue_optional() async {
- // UnimplementedError: kernel: (Let) let final dynamic #t2 = 0 in let ...
- await super.test_invalidAssignment_defaultValue_optional();
- }
-
- @override
- @failingTest
test_invalidAssignment_dynamic() async {
// Bad state: No reference information for dynamic at 11
await super.test_invalidAssignment_dynamic();
@@ -719,6 +705,13 @@
@override
@failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_undefinedGetter_proxy_annotation_fakeProxy() async {
+ await super.test_undefinedGetter_proxy_annotation_fakeProxy();
+ }
+
+ @override
+ @failingTest
test_undefinedGetter_static() async {
// Bad state: No reference information for A at 19
await super.test_undefinedGetter_static();
diff --git a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
index 9157b6d..0e94294 100644
--- a/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_kernel_test.dart
@@ -653,13 +653,6 @@
@override
@failingTest
- test_notInstantiatedBound_ok_class_function() {
- // Failed to resolve 1 nodes
- return super.test_notInstantiatedBound_ok_class_function();
- }
-
- @override
- @failingTest
test_objectMethodOnFunctions_Typedef() {
// UnimplementedError: TODO(paulberry): resynthesize generic typedef
return super.test_objectMethodOnFunctions_Typedef();
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 1414b83..a84ddc6 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -4107,7 +4107,7 @@
test_notInstantiatedBound_ok_class_function() async {
String code = r'''
-class A<T extends void Function<Z>()> {}
+class A<T extends void Function()> {}
class B<T extends A> {}
''';
await resolveTestUnit(code);
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index ef889c4..52a3081 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -42,7 +42,6 @@
import 'non_hint_code_test.dart' as non_hint_code_test;
import 'package_test.dart' as package_test;
import 'parser_fasta_test.dart' as parser_fasta_test;
-import 'parser_forest_test.dart' as parser_forest_test;
import 'parser_test.dart' as parser_test;
import 'resolver_driver_test.dart' as resolver_driver_test;
import 'resolver_kernel_test.dart' as resolver_kernel_test;
@@ -108,7 +107,6 @@
non_hint_code_test.main();
package_test.main();
parser_fasta_test.main();
- parser_forest_test.main();
parser_test.main();
resolver_driver_test.main();
resolver_kernel_test.main();
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
index 830cd0f..4bb1b75 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_kernel_test.dart
@@ -31,8 +31,6 @@
@override
bool get useCFE => true;
-// @failingTest
-// @potentialAnalyzerProblem
@override
test_asyncChangesDuringAnalysis_getErrors() async {
// TODO(brianwilkerson) Re-enable this test. It was disabled because it
@@ -54,6 +52,13 @@
// await super.test_asyncChangesDuringAnalysis_getErrors();
}
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_const_annotation_notConstConstructor() async {
+ await super.test_const_annotation_notConstConstructor();
+ }
+
@failingTest
@potentialAnalyzerProblem
@override
@@ -61,6 +66,27 @@
await super.test_const_annotation_withArgs();
}
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_const_annotation_withoutArgs() async {
+ await super.test_const_annotation_withoutArgs();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_const_circular_reference() async {
+ await super.test_const_circular_reference();
+ }
+
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_const_dependency_sameUnit() async {
+ await super.test_const_dependency_sameUnit();
+ }
+
@failingTest
@potentialAnalyzerProblem
@override
@@ -82,6 +108,13 @@
await super.test_const_implicitSuperConstructorInvocation();
}
+ @override
+ @failingTest
+ @potentialAnalyzerProblem
+ test_const_simple_topLevelVariable() async {
+ await super.test_const_simple_topLevelVariable();
+ }
+
@failingTest
@potentialAnalyzerProblem
@override
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
index 2422f69..ce897ed 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_kernel_test.dart
@@ -23,6 +23,27 @@
@override
@failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_annotation() async {
+ await super.test_annotation();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_annotation_constructor_withNestedConstructorInvocation() async {
+ await super.test_annotation_constructor_withNestedConstructorInvocation();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_annotation_kind_reference() async {
+ await super.test_annotation_kind_reference();
+ }
+
+ @override
+ @failingTest
@potentialAnalyzerProblem
test_annotation_prefixed_classConstructor() {
// TODO(paulberry): broken because prefixes are not working properly
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index d667f0e..d3573f1 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -1646,6 +1646,23 @@
}
}
+ test_subtypes_partWithoutLibrary() async {
+ await _resolveTestUnit('''
+part of lib;
+
+class A {}
+class B extends A {}
+''');
+ ClassElement a = _findElement('A');
+
+ List<SubtypeResult> subtypes = await driver.search.subtypes(type: a);
+ expect(subtypes, hasLength(1));
+
+ SubtypeResult b = subtypes.singleWhere((r) => r.name == 'B');
+ expect(b.libraryUri, testUri);
+ expect(b.id, '$testUri;$testUri;B');
+ }
+
test_subtypes_discover() async {
var pathT = _p('/test/lib/t.dart');
var pathA = _p('/aaa/lib/a.dart');
diff --git a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
index 66b2d52..22a2cc8 100644
--- a/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
+++ b/pkg/analyzer/test/src/fasta/body_builder_test_helper.dart
@@ -5,41 +5,24 @@
import 'dart:async';
import 'dart:io' show File;
-import 'package:analyzer/analyzer.dart';
-import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/fasta/ast_body_builder.dart';
-import 'package:analyzer/src/generated/parser.dart' as analyzer;
-import 'package:analyzer/src/generated/resolver.dart';
import "package:front_end/src/api_prototype/front_end.dart";
import "package:front_end/src/api_prototype/memory_file_system.dart";
import "package:front_end/src/base/processed_options.dart";
import "package:front_end/src/compute_platform_binaries_location.dart";
import 'package:front_end/src/fasta/compiler_context.dart';
-import 'package:front_end/src/fasta/constant_context.dart';
import 'package:front_end/src/fasta/dill/dill_target.dart';
import "package:front_end/src/fasta/fasta_codes.dart";
-import 'package:front_end/src/fasta/kernel/forest.dart' hide Identifier;
-import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
import "package:front_end/src/fasta/kernel/kernel_target.dart";
-import 'package:front_end/src/fasta/modifier.dart' as Modifier;
-import 'package:front_end/src/fasta/parser/async_modifier.dart';
-import 'package:front_end/src/fasta/parser/parser.dart';
-import 'package:front_end/src/fasta/scanner.dart';
import 'package:front_end/src/fasta/ticker.dart';
-import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
-import 'package:front_end/src/fasta/type_inference/type_schema_environment.dart';
import 'package:front_end/src/fasta/uri_translator_impl.dart';
import 'package:kernel/class_hierarchy.dart' as kernel;
import 'package:kernel/core_types.dart' as kernel;
import 'package:kernel/kernel.dart' as kernel;
import 'package:test/test.dart';
-import '../../generated/parser_test.dart';
-import '../../generated/test_support.dart';
-
Element _buildElement(kernel.Class coreType) {
ClassElementImpl element =
new ClassElementImpl(coreType.name, coreType.fileOffset);
@@ -54,7 +37,6 @@
class CompilerTestContext extends CompilerContext {
KernelTarget kernelTarget;
- TypeProvider _typeProvider;
CompilerTestContext(ProcessedOptions options) : super(options);
@@ -139,9 +121,6 @@
]) {
map[coreType.name] = _buildElement(coreType);
}
- Namespace namespace = new Namespace(map);
- c._typeProvider =
- new TypeProviderImpl.forNamespaces(namespace, namespace);
T result;
Completer<T> completer = new Completer<T>();
@@ -160,651 +139,3 @@
static CompilerTestContext get current => CompilerContext.current;
}
-
-/// Implementation of [AbstractParserTestCase] specialized for testing building
-/// Analyzer AST using the fasta [Forest] API.
-class FastaBodyBuilderTestCase extends Object
- with ParserTestHelpers
- implements AbstractParserTestCase {
- final bool resolveTypes;
-
- String content;
-
- /// The expected offset of the next token to be parsed after the parser has
- /// finished parsing, or `null` (the default) if EOF is expected.
- int expectedEndOffset;
-
- @override
- void set enableGenericMethodComments(_) {
- // Ignored.
- }
-
- FastaBodyBuilderTestCase(this.resolveTypes);
-
- analyzer.Parser get parser => new ParserProxy(this);
-
- TypeProvider get typeProvider => CompilerTestContext.current._typeProvider;
-
- bool get usingFastaParser => true;
-
- @override
- void assertNoErrors() {
- // TODO(brianwilkerson) Implement this.
- }
-
- void createParser(String content, {int expectedEndOffset}) {
- this.content = content;
- this.expectedEndOffset = expectedEndOffset;
- }
-
- @override
- void expectNotNullIfNoErrors(Object result) {
- // TODO(brianwilkerson) Implement this.
- }
-
- @override
- ExpectedError expectedError(ErrorCode code, int offset, int length) {
- return new ExpectedError(code, offset, length);
- }
-
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
- @override
- Expression parseAdditiveExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- Expression parseAssignableExpression(String code, bool primaryAllowed) {
- return parseExpression(code);
- }
-
- @override
- Expression parseAssignableSelector(String code, bool optional,
- {bool allowConditional: true}) {
- return parseExpression(code);
- }
-
- @override
- AwaitExpression parseAwaitExpression(String code) {
- return parseExpression(code, inAsync: true);
- }
-
- @override
- Expression parseBitwiseAndExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- Expression parseBitwiseOrExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- Expression parseBitwiseXorExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- Expression parseCascadeSection(String code) {
- return parseExpression(code);
- }
-
- @override
- CompilationUnit parseCompilationUnit(String source,
- {List<ErrorCode> codes, List<ExpectedError> errors}) {
- return _parse(source, (parser, token) => parser.parseUnit(token.next));
- }
-
- @override
- ConditionalExpression parseConditionalExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- Expression parseConstExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- ConstructorInitializer parseConstructorInitializer(String code) {
- throw new UnimplementedError();
- }
-
- @override
- CompilationUnit parseDirectives(String source,
- [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
- return parseCompilationUnit(content, codes: errorCodes);
- }
-
- @override
- BinaryExpression parseEqualityExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- Expression parseExpression(String source,
- {List<ErrorCode> codes,
- List<ExpectedError> errors,
- int expectedEndOffset,
- bool inAsync: false,
- bool inCatchBlock: false}) {
- // TODO(brianwilkerson) Check error codes.
- Object result = _parse(
- source, (parser, token) => parser.parseExpression(token),
- inAsync: inAsync, inCatchBlock: inCatchBlock);
- if (result is Generator) {
- result = (result as Generator).buildForEffect();
- }
- if (result is! Expression) {
- throw new StateError('Expected Expression, found ${result.runtimeType}');
- }
- return result;
- }
-
- @override
- List<Expression> parseExpressionList(String code) {
- throw new UnimplementedError();
- }
-
- @override
- Expression parseExpressionWithoutCascade(String code) {
- return parseExpression(code);
- }
-
- @override
- FormalParameter parseFormalParameter(String code, ParameterKind kind,
- {List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
- throw new UnimplementedError();
- }
-
- @override
- FormalParameterList parseFormalParameterList(String code,
- {bool inFunctionType: false,
- List<ErrorCode> errorCodes: const <ErrorCode>[],
- List<ExpectedError> errors}) {
- throw new UnimplementedError();
- }
-
- @override
- CompilationUnitMember parseFullCompilationUnitMember() {
- CompilationUnit unit = parseCompilationUnit(content);
- expect(unit.directives, hasLength(0));
- expect(unit.declarations, hasLength(1));
- return unit.declarations[0];
- }
-
- @override
- Directive parseFullDirective() {
- CompilationUnit unit = parseCompilationUnit(content);
- expect(unit.directives, hasLength(1));
- expect(unit.declarations, hasLength(0));
- return unit.directives[0];
- }
-
- @override
- FunctionExpression parseFunctionExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- InstanceCreationExpression parseInstanceCreationExpression(
- String code, Token newToken) {
- return parseExpression(code);
- }
-
- @override
- ListLiteral parseListLiteral(
- Token token, String typeArgumentsCode, String code) {
- StringBuffer buffer = new StringBuffer();
- if (token != null) {
- buffer.write(token.lexeme);
- buffer.write(' ');
- }
- if (typeArgumentsCode != null) {
- buffer.write(typeArgumentsCode);
- }
- buffer.write(code);
- return parseExpression(buffer.toString());
- }
-
- @override
- TypedLiteral parseListOrMapLiteral(Token modifier, String code) {
- return parseExpression(code);
- }
-
- @override
- Expression parseLogicalAndExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- Expression parseLogicalOrExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- MapLiteral parseMapLiteral(
- Token token, String typeArgumentsCode, String code) {
- StringBuffer buffer = new StringBuffer();
- if (token != null) {
- buffer.write(token.lexeme);
- buffer.write(' ');
- }
- if (typeArgumentsCode != null) {
- buffer.write(typeArgumentsCode);
- }
- buffer.write(code);
- return parseExpression(buffer.toString());
- }
-
- @override
- MapLiteralEntry parseMapLiteralEntry(String code) {
- Expression expression = parseExpression('{$code}');
- expect(expression, new isInstanceOf<MapLiteral>());
- MapLiteral literal = expression;
- expect(literal.entries, hasLength(1));
- return literal.entries[0];
- }
-
- @override
- Expression parseMultiplicativeExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- InstanceCreationExpression parseNewExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- NormalFormalParameter parseNormalFormalParameter(String code,
- {bool inFunctionType: false,
- List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
- throw new UnimplementedError();
- }
-
- @override
- Expression parsePostfixExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- Identifier parsePrefixedIdentifier(String code) {
- return parseExpression(code);
- }
-
- @override
- Expression parsePrimaryExpression(String code,
- {int expectedEndOffset, List<ExpectedError> errors}) {
- return parseExpression(code,
- expectedEndOffset: expectedEndOffset, errors: errors);
- }
-
- @override
- Expression parseRelationalExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- RethrowExpression parseRethrowExpression(String code) {
- Statement statement = parseStatement(code, inCatchBlock: true);
- expect(statement, new isInstanceOf<ExpressionStatement>());
- Expression expression = (statement as ExpressionStatement).expression;
- expect(expression, new isInstanceOf<RethrowExpression>());
- return expression;
- }
-
- @override
- BinaryExpression parseShiftExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- SimpleIdentifier parseSimpleIdentifier(String code) {
- return parseExpression(code);
- }
-
- @override
- Statement parseStatement(String source,
- {bool enableLazyAssignmentOperators,
- int expectedEndOffset,
- bool inCatchBlock: true}) {
- // TODO(brianwilkerson) Check error codes.
- return _parse(source, (parser, token) => parser.parseStatement(token),
- inCatchBlock: inCatchBlock);
- }
-
- @override
- Expression parseStringLiteral(String code) {
- return parseExpression(code);
- }
-
- @override
- SymbolLiteral parseSymbolLiteral(String code) {
- return parseExpression(code);
- }
-
- @override
- Expression parseThrowExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- Expression parseThrowExpressionWithoutCascade(String code) {
- return parseExpression(code);
- }
-
- @override
- PrefixExpression parseUnaryExpression(String code) {
- return parseExpression(code);
- }
-
- @override
- VariableDeclarationList parseVariableDeclarationList(String source) {
- CompilationUnit unit = parseCompilationUnit('''
-f() {
- $source;
-}
-''');
- FunctionDeclaration function = unit.declarations[0];
- BlockFunctionBody body = function.functionExpression.body;
- VariableDeclarationStatement statement = body.block.statements[0];
- return statement.variables;
- }
-
- T _parse<T>(
- String source, void parseFunction(Parser parser, Token previousToken),
- {bool inAsync: false, bool inCatchBlock: false}) {
- ScannerResult scan = scanString(source);
-
- CompilerTestContext c = CompilerTestContext.current;
- KernelLibraryBuilder library = new KernelLibraryBuilder(
- c.entryPoint,
- c.entryPoint,
- c.kernelTarget.loader,
- null /* actualOrigin */,
- null /* enclosingLibrary */,
- );
- List<KernelTypeVariableBuilder> typeVariableBuilders =
- <KernelTypeVariableBuilder>[];
- List<KernelFormalParameterBuilder> formalParameterBuilders =
- <KernelFormalParameterBuilder>[];
- KernelProcedureBuilder procedureBuilder = new KernelProcedureBuilder(
- null /* metadata */,
- Modifier.staticMask /* or Modifier.varMask */,
- c.kernelTarget.dynamicType,
- "analyzerTest",
- typeVariableBuilders,
- formalParameterBuilders,
- kernel.ProcedureKind.Method,
- library,
- -1 /* charOffset */,
- -1 /* charOpenParenOffset */,
- -1 /* charEndOffset */);
-
- TypeInferrerDisabled typeInferrer =
- new TypeInferrerDisabled(new TypeSchemaEnvironment(
- c.kernelTarget.loader.coreTypes,
- c.kernelTarget.loader.hierarchy,
- // TODO(danrubel): Enable strong mode.
- false /* strong mode */,
- ));
-
- AstBodyBuilder builder = new AstBodyBuilder(
- library,
- procedureBuilder,
- new UnlinkedScope(),
- null,
- c.kernelTarget.loader.hierarchy,
- c.kernelTarget.loader.coreTypes,
- null /* classBuilder */,
- false /* isInstanceMember */,
- null /* uri */,
- typeInferrer,
- typeProvider,
- )..constantContext = ConstantContext.none; // .inferred ?
-
- Parser parser = new Parser(builder);
- if (inAsync) {
- parser.asyncState = AsyncModifier.Async;
- }
- if (inCatchBlock) {
- builder.inCatchBlock = inCatchBlock;
- }
- parseFunction(parser, parser.syntheticPreviousToken(scan.tokens));
- // TODO(brianwilkerson) Check `expectedEndOffset` if it is not `null`.
- return builder.pop();
- }
-}
-
-/// A parser that can be used by [FastaBodyBuilderTestCase] to support the tests
-/// that still call methods on the parser directly.
-class ParserProxy implements analyzer.Parser {
- final FastaBodyBuilderTestCase testCase;
-
- ParserProxy(this.testCase);
-
- @override
- noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-
- @override
- Annotation parseAnnotation() {
- CompilationUnit unit =
- testCase.parseCompilationUnit('${testCase.content} var v;');
- expect(unit.directives, hasLength(0));
- expect(unit.declarations, hasLength(1));
- expect(
- unit.declarations[0], new isInstanceOf<TopLevelVariableDeclaration>());
- TopLevelVariableDeclaration declaration = unit.declarations[0];
- expect(declaration.metadata, hasLength(1));
- return declaration.metadata[0];
- }
-
- @override
- ArgumentList parseArgumentList() {
- Expression expression = testCase.parseExpression('f${testCase.content}');
- expect(expression, new isInstanceOf<MethodInvocation>());
- MethodInvocation invocation = expression;
- return invocation.argumentList;
- }
-
- @override
- ClassMember parseClassMember(String className) {
- CompilationUnit unit = testCase
- .parseCompilationUnit('class $className { ${testCase.content} }');
- expect(unit.directives, hasLength(0));
- expect(unit.declarations, hasLength(1));
- expect(unit.declarations[0], new isInstanceOf<ClassDeclaration>());
- ClassDeclaration classDeclaration = unit.declarations[0];
- expect(classDeclaration.members, hasLength(1));
- return classDeclaration.members[0];
- }
-
- @override
- List<Combinator> parseCombinators() {
- CompilationUnit unit = testCase
- .parseCompilationUnit('import "file.dart" ${testCase.content};');
- expect(unit.directives, hasLength(1));
- expect(unit.declarations, hasLength(0));
- expect(unit.directives[0], new isInstanceOf<LibraryDirective>());
- ImportDirective directive = unit.directives[0];
- return directive.combinators;
- }
-
- @override
- CommentReference parseCommentReference(
- String referenceSource, int sourceOffset) {
- // TODO(brianwilkerson) Implement this.
- throw new UnimplementedError();
- }
-
- @override
- CompilationUnit parseCompilationUnit2() {
- return testCase.parseCompilationUnit(testCase.content);
- }
-
- @override
- Configuration parseConfiguration() {
- CompilationUnit unit = testCase
- .parseCompilationUnit('import "file.dart" ${testCase.content};');
- expect(unit.directives, hasLength(1));
- expect(unit.declarations, hasLength(0));
- expect(unit.directives[0], new isInstanceOf<LibraryDirective>());
- ImportDirective directive = unit.directives[0];
- expect(directive.configurations, hasLength(1));
- return directive.configurations[0];
- }
-
- @override
- DottedName parseDottedName() {
- CompilationUnit unit = testCase.parseCompilationUnit(
- 'import "file.dart" if (${testCase.content}) "file2.dart";');
- expect(unit.directives, hasLength(1));
- expect(unit.declarations, hasLength(0));
- expect(unit.directives[0], new isInstanceOf<LibraryDirective>());
- ImportDirective directive = unit.directives[0];
- expect(directive.configurations, hasLength(1));
- return directive.configurations[0].name;
- }
-
- @override
- ExtendsClause parseExtendsClause() {
- CompilationUnit unit =
- testCase.parseCompilationUnit('class C ${testCase.content} {}');
- expect(unit.directives, hasLength(0));
- expect(unit.declarations, hasLength(1));
- expect(unit.declarations[0], new isInstanceOf<ClassDeclaration>());
- ClassDeclaration classDeclaration = unit.declarations[0];
- return classDeclaration.extendsClause;
- }
-
- @override
- analyzer.FinalConstVarOrType parseFinalConstVarOrType(bool optional,
- {bool inFunctionType: false}) {
- // TODO(brianwilkerson) Implement this or re-write the tests.
- throw new UnimplementedError();
- }
-
- @override
- FormalParameterList parseFormalParameterList({bool inFunctionType: false}) {
- CompilationUnit unit =
- testCase.parseCompilationUnit('f${testCase.content} {}');
- expect(unit.directives, hasLength(0));
- expect(unit.declarations, hasLength(1));
- expect(unit.declarations[0], new isInstanceOf<FunctionDeclaration>());
- FunctionDeclaration function = unit.declarations[0];
- return function.functionExpression.parameters;
- }
-
- @override
- FunctionBody parseFunctionBody(bool mayBeEmpty,
- analyzer.ParserErrorCode emptyErrorCode, bool inExpression) {
- CompilationUnit unit =
- testCase.parseCompilationUnit('f() ${testCase.content}');
- expect(unit.directives, hasLength(0));
- expect(unit.declarations, hasLength(1));
- expect(unit.declarations[0], new isInstanceOf<FunctionDeclaration>());
- FunctionDeclaration declaration = unit.declarations[0];
- return declaration.functionExpression.body;
- }
-
- @override
- ImplementsClause parseImplementsClause() {
- CompilationUnit unit =
- testCase.parseCompilationUnit('class C ${testCase.content} {}');
- expect(unit.directives, hasLength(0));
- expect(unit.declarations, hasLength(1));
- expect(unit.declarations[0], new isInstanceOf<ClassDeclaration>());
- ClassDeclaration classDeclaration = unit.declarations[0];
- return classDeclaration.implementsClause;
- }
-
- @override
- analyzer.Modifiers parseModifiers() {
- // TODO(brianwilkerson) Implement this or re-write the tests (this might
- // need context to create the right kind of declaration for the modifiers).
- throw new UnimplementedError();
- }
-
- @override
- Expression parseMultiplicativeExpression() {
- return testCase.parseExpression(testCase.content);
- }
-
- @override
- Expression parsePrimaryExpression() {
- return testCase.parseExpression(testCase.content);
- }
-
- @override
- SimpleIdentifier parseSimpleIdentifier(
- {bool allowKeyword: false, bool isDeclaration: false}) {
- return testCase.parseExpression(testCase.content);
- }
-
- @override
- Statement parseStatement2() {
- return testCase.parseStatement(testCase.content);
- }
-
- @override
- TypeAnnotation parseTypeAnnotation(bool inExpression) {
- if (inExpression) {
- // TODO(brianwilkerson) As far as I can see, this path is not used.
- throw new UnimplementedError();
- }
- CompilationUnit unit =
- testCase.parseCompilationUnit('${testCase.content} x;');
- expect(unit.directives, hasLength(0));
- expect(unit.declarations, hasLength(1));
- expect(
- unit.declarations[0], new isInstanceOf<TopLevelVariableDeclaration>());
- TopLevelVariableDeclaration variable = unit.declarations[0];
- return variable.variables.type;
- }
-
- @override
- TypeArgumentList parseTypeArgumentList() {
- CompilationUnit unit =
- testCase.parseCompilationUnit('C${testCase.content} c;');
- expect(unit.directives, hasLength(0));
- expect(unit.declarations, hasLength(1));
- expect(
- unit.declarations[0], new isInstanceOf<TopLevelVariableDeclaration>());
- TopLevelVariableDeclaration variable = unit.declarations[0];
- return (variable.variables.type as TypeName).typeArguments;
- }
-
- @override
- TypeName parseTypeName(bool inExpression) {
- return parseTypeAnnotation(inExpression) as TypeName;
- }
-
- @override
- TypeParameter parseTypeParameter() {
- CompilationUnit unit =
- testCase.parseCompilationUnit('class C<${testCase.content}> {}');
- expect(unit.directives, hasLength(0));
- expect(unit.declarations, hasLength(1));
- expect(unit.declarations[0], new isInstanceOf<ClassDeclaration>());
- ClassDeclaration classDeclaration = unit.declarations[0];
- return classDeclaration.typeParameters.typeParameters[0];
- }
-
- @override
- Expression parseUnaryExpression() {
- return testCase.parseExpression(testCase.content);
- }
-
- @override
- WithClause parseWithClause() {
- CompilationUnit unit =
- testCase.parseCompilationUnit('class C ${testCase.content} {}');
- expect(unit.directives, hasLength(0));
- expect(unit.declarations, hasLength(1));
- expect(unit.declarations[0], new isInstanceOf<ClassDeclaration>());
- ClassDeclaration classDeclaration = unit.declarations[0];
- return classDeclaration.withClause;
- }
-}
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/assert_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/assert_statement_test.dart
index f169558..decfa5e 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/assert_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/assert_statement_test.dart
@@ -31,13 +31,19 @@
ParserErrorCode.EXPECTED_TOKEN
],
"assert (_s_);",
- failing: allExceptEof),
+ failing: [
+ 'assert',
+ 'block',
+ 'labeled',
+ 'localFunctionNonVoid',
+ 'localFunctionVoid',
+ 'return'
+ ]),
new TestDescriptor(
'condition',
'assert (a',
[ParserErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN],
- "assert (a);",
- failing: allExceptEof),
+ "assert (a);"),
new TestDescriptor(
'comma',
'assert (a,',
@@ -48,14 +54,12 @@
'message',
'assert (a, b',
[ParserErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN],
- "assert (a, b);",
- failing: allExceptEof),
+ "assert (a, b);"),
new TestDescriptor(
'trailingComma',
'assert (a, b,',
[ParserErrorCode.EXPECTED_TOKEN, ScannerErrorCode.EXPECTED_TOKEN],
- "assert (a, b,);",
- failing: allExceptEof),
+ "assert (a, b,);"),
new TestDescriptor('rightParen', 'assert (a, b)',
[ParserErrorCode.EXPECTED_TOKEN], "assert (a, b);"),
],
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart
index a4ddf6b..af989fd 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/field_declaration_test.dart
@@ -56,7 +56,13 @@
'const f =',
[ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
'const f = _s_;',
- failing: allExceptEof,
+ failing: [
+ 'fieldConst',
+ 'methodNonVoid',
+ 'methodVoid',
+ 'getter',
+ 'setter'
+ ],
),
new TestDescriptor(
'const_initializer',
@@ -86,7 +92,13 @@
'final f =',
[ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
'final f = _s_;',
- failing: allExceptEof,
+ failing: [
+ 'fieldConst',
+ 'methodNonVoid',
+ 'methodVoid',
+ 'getter',
+ 'setter'
+ ],
),
new TestDescriptor(
'final_initializer',
@@ -116,7 +128,13 @@
'var f =',
[ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
'var f = _s_;',
- failing: allExceptEof,
+ failing: [
+ 'fieldConst',
+ 'methodNonVoid',
+ 'methodVoid',
+ 'getter',
+ 'setter'
+ ],
),
new TestDescriptor(
'var_initializer',
@@ -148,7 +166,13 @@
'A f =',
[ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
'A f = _s_;',
- failing: allExceptEof,
+ failing: [
+ 'fieldConst',
+ 'methodNonVoid',
+ 'methodVoid',
+ 'getter',
+ 'setter'
+ ],
),
new TestDescriptor(
'type_initializer',
@@ -187,7 +211,13 @@
'static const f =',
[ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
'static const f = _s_;',
- failing: allExceptEof,
+ failing: [
+ 'fieldConst',
+ 'methodNonVoid',
+ 'methodVoid',
+ 'getter',
+ 'setter'
+ ],
),
new TestDescriptor(
'static_const_initializer',
@@ -217,7 +247,13 @@
'static final f =',
[ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
'static final f = _s_;',
- failing: allExceptEof,
+ failing: [
+ 'fieldConst',
+ 'methodNonVoid',
+ 'methodVoid',
+ 'getter',
+ 'setter'
+ ],
),
new TestDescriptor(
'static_final_initializer',
@@ -247,7 +283,13 @@
'static var f =',
[ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
'static var f = _s_;',
- failing: allExceptEof,
+ failing: [
+ 'fieldConst',
+ 'methodNonVoid',
+ 'methodVoid',
+ 'getter',
+ 'setter'
+ ],
),
new TestDescriptor(
'static_var_initializer',
@@ -279,7 +321,13 @@
'static A f =',
[ParserErrorCode.MISSING_IDENTIFIER, ParserErrorCode.EXPECTED_TOKEN],
'static A f = _s_;',
- failing: allExceptEof,
+ failing: [
+ 'fieldConst',
+ 'methodNonVoid',
+ 'methodVoid',
+ 'getter',
+ 'setter'
+ ],
),
new TestDescriptor(
'static_type_initializer',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
index 388eec1..dc875ff 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/local_variable_test.dart
@@ -139,7 +139,14 @@
ParserErrorCode.EXPECTED_TOKEN
],
"var a = _s_;",
- failing: allExceptEof),
+ failing: [
+ 'block',
+ 'assert',
+ 'labeled',
+ 'localFunctionNonVoid',
+ 'localFunctionVoid',
+ 'return'
+ ]),
new TestDescriptor('varNameEqualsExpression', 'var a = b',
[ParserErrorCode.EXPECTED_TOKEN], "var a = b;"),
],
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
index bb3264c..76e6f1c 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/top_level_variable_test.dart
@@ -214,7 +214,15 @@
ParserErrorCode.EXPECTED_TOKEN
],
"var a = _s_;",
- failing: allExceptEof,
+ failing: [
+ 'class',
+ 'typedef',
+ 'functionVoid',
+ 'functionNonVoid',
+ 'const',
+ 'getter',
+ 'setter'
+ ],
),
new TestDescriptor(
'varNameEqualsExpression',
diff --git a/pkg/analyzer/test/src/fasta/recovery/partial_code/yield_statement_test.dart b/pkg/analyzer/test/src/fasta/recovery/partial_code/yield_statement_test.dart
index 0234d1f..bc15d07 100644
--- a/pkg/analyzer/test/src/fasta/recovery/partial_code/yield_statement_test.dart
+++ b/pkg/analyzer/test/src/fasta/recovery/partial_code/yield_statement_test.dart
@@ -26,19 +26,10 @@
failing: [
'assert',
'block',
- 'break',
- 'continue',
- 'do',
- 'if',
- 'for',
'labeled',
'localFunctionNonVoid',
'localFunctionVoid',
- 'localVariable',
- 'switch',
- 'try',
'return',
- 'while'
]),
new TestDescriptor('expression', 'yield a',
[ParserErrorCode.EXPECTED_TOKEN], "yield a;"),
@@ -53,19 +44,10 @@
failing: [
'assert',
'block',
- 'break',
- 'continue',
- 'do',
- 'if',
- 'for',
'labeled',
'localFunctionNonVoid',
'localFunctionVoid',
- 'localVariable',
- 'switch',
- 'try',
'return',
- 'while'
]),
new TestDescriptor('star_expression', 'yield * a',
[ParserErrorCode.EXPECTED_TOKEN], "yield * a;"),
diff --git a/pkg/analyzer/test/src/fasta/resolution_test.dart b/pkg/analyzer/test/src/fasta/resolution_test.dart
deleted file mode 100644
index 1fbaa11..0000000
--- a/pkg/analyzer/test/src/fasta/resolution_test.dart
+++ /dev/null
@@ -1,101 +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.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../../generated/parser_test.dart';
-import 'body_builder_test_helper.dart';
-
-main() {
- return CompilerTestContext.runWithTestOptions((_) {
- defineReflectiveSuite(() {
- defineReflectiveTests(ResolutionTest);
- });
- });
-}
-
-/**
- * Tests of the fasta parser based on [ExpressionParserTestMixin].
- */
-@reflectiveTest
-class ResolutionTest extends FastaBodyBuilderTestCase {
- ResolutionTest() : super(true);
-
- test_booleanLiteral_false() {
- Expression result = parseExpression('false');
- expect(result, new isInstanceOf<BooleanLiteral>());
- expect((result as BooleanLiteral).staticType, typeProvider.boolType);
- }
-
- test_booleanLiteral_true() {
- Expression result = parseExpression('true');
- expect(result, new isInstanceOf<BooleanLiteral>());
- expect((result as BooleanLiteral).staticType, typeProvider.boolType);
- }
-
- test_doubleLiteral() {
- Expression result = parseExpression('4.2');
- expect(result, new isInstanceOf<DoubleLiteral>());
- expect((result as DoubleLiteral).staticType, typeProvider.doubleType);
- }
-
- test_integerLiteral() {
- Expression result = parseExpression('3');
- expect(result, new isInstanceOf<IntegerLiteral>());
- expect((result as IntegerLiteral).staticType, typeProvider.intType);
- }
-
- @failingTest
- test_listLiteral_explicitType() {
- Expression result = parseExpression('<int>[]');
- expect(result, new isInstanceOf<ListLiteral>());
- InterfaceType listType = typeProvider.listType;
- expect((result as ListLiteral).staticType,
- listType.instantiate([typeProvider.intType]));
- }
-
- @failingTest
- test_listLiteral_noType() {
- Expression result = parseExpression('[]');
- expect(result, new isInstanceOf<ListLiteral>());
- InterfaceType listType = typeProvider.listType;
- expect((result as ListLiteral).staticType,
- listType.instantiate([typeProvider.dynamicType]));
- }
-
- @failingTest
- test_mapLiteral_explicitType() {
- Expression result = parseExpression('<String, int>{}');
- expect(result, new isInstanceOf<MapLiteral>());
- InterfaceType mapType = typeProvider.mapType;
- expect((result as MapLiteral).staticType,
- mapType.instantiate([typeProvider.stringType, typeProvider.intType]));
- }
-
- @failingTest
- test_mapLiteral_noType() {
- Expression result = parseExpression('{}');
- expect(result, new isInstanceOf<MapLiteral>());
- InterfaceType mapType = typeProvider.mapType;
- expect(
- (result as MapLiteral).staticType,
- mapType
- .instantiate([typeProvider.dynamicType, typeProvider.dynamicType]));
- }
-
- test_nullLiteral() {
- Expression result = parseExpression('null');
- expect(result, new isInstanceOf<NullLiteral>());
- expect((result as NullLiteral).staticType, typeProvider.nullType);
- }
-
- test_simpleStringLiteral() {
- Expression result = parseExpression('"abc"');
- expect(result, new isInstanceOf<SimpleStringLiteral>());
- expect((result as SimpleStringLiteral).staticType, typeProvider.stringType);
- }
-}
diff --git a/pkg/analyzer/test/src/fasta/test_all.dart b/pkg/analyzer/test/src/fasta/test_all.dart
index 37ccad1..b9f73b5 100644
--- a/pkg/analyzer/test/src/fasta/test_all.dart
+++ b/pkg/analyzer/test/src/fasta/test_all.dart
@@ -7,13 +7,11 @@
import 'ast_builder_test.dart' as ast_builder;
import 'message_coverage_test.dart' as message_coverage;
import 'recovery/test_all.dart' as recovery;
-import 'resolution_test.dart' as resolution;
main() {
defineReflectiveSuite(() {
ast_builder.main();
message_coverage.main();
recovery.main();
- resolution.main();
}, name: 'fasta');
}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
index 9a2a5e1..f594ed6 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart
@@ -29,11 +29,9 @@
import 'resynthesize_common.dart';
main() {
- // TODO(brianwilkerson) Either remove the following test, or uncomment it if
- // we get it working under Dart2 semantics.
-// defineReflectiveSuite(() {
-// defineReflectiveTests(ResynthesizeKernelStrongTest);
-// });
+ defineReflectiveSuite(() {
+ defineReflectiveTests(ResynthesizeKernelStrongTest);
+ });
}
/// Tests marked with this annotation fail because they test features that
@@ -97,6 +95,27 @@
}
@override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_class_constructor_fieldFormal_named_withDefault() async {
+ await super.test_class_constructor_fieldFormal_named_withDefault();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_class_constructor_fieldFormal_optional_withDefault() async {
+ await super.test_class_constructor_fieldFormal_optional_withDefault();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_class_field_const() async {
+ await super.test_class_field_const();
+ }
+
+ @override
test_class_setter_invalid_named_parameter() async {
var library = await checkLibrary('class C { void set x({a}) {} }');
checkElementText(library, r'''
@@ -149,6 +168,635 @@
test_const_constructor_inferred_args() =>
super.test_const_constructor_inferred_args();
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_finalField_hasConstConstructor() async {
+ await super.test_const_finalField_hasConstConstructor();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invalid_field_const() async {
+ await super.test_const_invalid_field_const();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invalid_intLiteral() async {
+ await super.test_const_invalid_intLiteral();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invalid_topLevel() async {
+ await super.test_const_invalid_topLevel();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_generic_named() async {
+ await super.test_const_invokeConstructor_generic_named();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_generic_named_imported() async {
+ await super.test_const_invokeConstructor_generic_named_imported();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_generic_named_imported_withPrefix() async {
+ return super
+ .test_const_invokeConstructor_generic_named_imported_withPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_generic_noTypeArguments() async {
+ await super.test_const_invokeConstructor_generic_noTypeArguments();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_generic_unnamed() async {
+ await super.test_const_invokeConstructor_generic_unnamed();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_generic_unnamed_imported() async {
+ await super.test_const_invokeConstructor_generic_unnamed_imported();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_generic_unnamed_imported_withPrefix() async {
+ return super
+ .test_const_invokeConstructor_generic_unnamed_imported_withPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_named() async {
+ await super.test_const_invokeConstructor_named();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_named_imported() async {
+ await super.test_const_invokeConstructor_named_imported();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_named_imported_withPrefix() async {
+ await super.test_const_invokeConstructor_named_imported_withPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_named_unresolved() async {
+ await super.test_const_invokeConstructor_named_unresolved();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_named_unresolved2() async {
+ await super.test_const_invokeConstructor_named_unresolved2();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_named_unresolved3() async {
+ await super.test_const_invokeConstructor_named_unresolved3();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_named_unresolved4() async {
+ await super.test_const_invokeConstructor_named_unresolved4();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_named_unresolved5() async {
+ await super.test_const_invokeConstructor_named_unresolved5();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_named_unresolved6() async {
+ await super.test_const_invokeConstructor_named_unresolved6();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_unnamed() async {
+ await super.test_const_invokeConstructor_unnamed();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_unnamed_imported() async {
+ await super.test_const_invokeConstructor_unnamed_imported();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_unnamed_imported_withPrefix() async {
+ await super.test_const_invokeConstructor_unnamed_imported_withPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_unnamed_unresolved() async {
+ await super.test_const_invokeConstructor_unnamed_unresolved();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_unnamed_unresolved2() async {
+ await super.test_const_invokeConstructor_unnamed_unresolved2();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_invokeConstructor_unnamed_unresolved3() async {
+ await super.test_const_invokeConstructor_unnamed_unresolved3();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_length_ofClassConstField() async {
+ await super.test_const_length_ofClassConstField();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_length_ofClassConstField_imported() async {
+ await super.test_const_length_ofClassConstField_imported();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_length_ofClassConstField_imported_withPrefix() async {
+ await super.test_const_length_ofClassConstField_imported_withPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_length_ofStringLiteral() async {
+ await super.test_const_length_ofStringLiteral();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_length_ofTopLevelVariable() async {
+ await super.test_const_length_ofTopLevelVariable();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_length_ofTopLevelVariable_imported() async {
+ await super.test_const_length_ofTopLevelVariable_imported();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_length_ofTopLevelVariable_imported_withPrefix() async {
+ await super.test_const_length_ofTopLevelVariable_imported_withPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_length_staticMethod() async {
+ await super.test_const_length_staticMethod();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_list_inferredType() async {
+ await super.test_const_list_inferredType();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_map_inferredType() async {
+ await super.test_const_map_inferredType();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_parameterDefaultValue_initializingFormal_functionTyped() async {
+ return super
+ .test_const_parameterDefaultValue_initializingFormal_functionTyped();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_parameterDefaultValue_initializingFormal_named() async {
+ await super.test_const_parameterDefaultValue_initializingFormal_named();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_parameterDefaultValue_initializingFormal_positional() async {
+ return super
+ .test_const_parameterDefaultValue_initializingFormal_positional();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_parameterDefaultValue_normal() async {
+ await super.test_const_parameterDefaultValue_normal();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_staticField() async {
+ await super.test_const_reference_staticField();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_staticField_imported() async {
+ await super.test_const_reference_staticField_imported();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_staticField_imported_withPrefix() async {
+ await super.test_const_reference_staticField_imported_withPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_staticMethod() async {
+ await super.test_const_reference_staticMethod();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_staticMethod_imported() async {
+ await super.test_const_reference_staticMethod_imported();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_staticMethod_imported_withPrefix() async {
+ await super.test_const_reference_staticMethod_imported_withPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_topLevelFunction() async {
+ await super.test_const_reference_topLevelFunction();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_topLevelFunction_generic() async {
+ await super.test_const_reference_topLevelFunction_generic();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_topLevelFunction_imported() async {
+ await super.test_const_reference_topLevelFunction_imported();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_topLevelFunction_imported_withPrefix() async {
+ await super.test_const_reference_topLevelFunction_imported_withPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_topLevelVariable() async {
+ await super.test_const_reference_topLevelVariable();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_topLevelVariable_imported() async {
+ await super.test_const_reference_topLevelVariable_imported();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_topLevelVariable_imported_withPrefix() async {
+ await super.test_const_reference_topLevelVariable_imported_withPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_type() async {
+ await super.test_const_reference_type();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_type_imported() async {
+ await super.test_const_reference_type_imported();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_type_imported_withPrefix() async {
+ await super.test_const_reference_type_imported_withPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_unresolved_prefix0() async {
+ await super.test_const_reference_unresolved_prefix0();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_unresolved_prefix1() async {
+ await super.test_const_reference_unresolved_prefix1();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_reference_unresolved_prefix2() async {
+ await super.test_const_reference_unresolved_prefix2();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_binary() async {
+ await super.test_const_topLevel_binary();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_conditional() async {
+ await super.test_const_topLevel_conditional();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_identical() async {
+ await super.test_const_topLevel_identical();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_ifNull() async {
+ await super.test_const_topLevel_ifNull();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_literal() async {
+ await super.test_const_topLevel_literal();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_parenthesis() async {
+ await super.test_const_topLevel_parenthesis();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_prefix() async {
+ await super.test_const_topLevel_prefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_super() async {
+ await super.test_const_topLevel_super();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_this() async {
+ await super.test_const_topLevel_this();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_typedList() async {
+ await super.test_const_topLevel_typedList();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_typedList_imported() async {
+ await super.test_const_topLevel_typedList_imported();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_typedList_importedWithPrefix() async {
+ await super.test_const_topLevel_typedList_importedWithPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_typedList_typedefArgument() async {
+ await super.test_const_topLevel_typedList_typedefArgument();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_typedMap() async {
+ await super.test_const_topLevel_typedMap();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_untypedList() async {
+ await super.test_const_topLevel_untypedList();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_const_topLevel_untypedMap() async {
+ await super.test_const_topLevel_untypedMap();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constExpr_pushReference_field_simpleIdentifier() async {
+ await super.test_constExpr_pushReference_field_simpleIdentifier();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constExpr_pushReference_staticMethod_simpleIdentifier() async {
+ await super.test_constExpr_pushReference_staticMethod_simpleIdentifier();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_initializers_assertInvocation() async {
+ await super.test_constructor_initializers_assertInvocation();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_initializers_assertInvocation_message() async {
+ await super.test_constructor_initializers_assertInvocation_message();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_initializers_field() async {
+ await super.test_constructor_initializers_field();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_initializers_field_notConst() async {
+ await super.test_constructor_initializers_field_notConst();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_initializers_field_withParameter() async {
+ await super.test_constructor_initializers_field_withParameter();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_initializers_superInvocation_named() async {
+ await super.test_constructor_initializers_superInvocation_named();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_initializers_superInvocation_named_underscore() async {
+ return super
+ .test_constructor_initializers_superInvocation_named_underscore();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_initializers_superInvocation_namedExpression() async {
+ return super
+ .test_constructor_initializers_superInvocation_namedExpression();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_initializers_superInvocation_unnamed() async {
+ await super.test_constructor_initializers_superInvocation_unnamed();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_initializers_thisInvocation_named() async {
+ await super.test_constructor_initializers_thisInvocation_named();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_initializers_thisInvocation_namedExpression() async {
+ await super.test_constructor_initializers_thisInvocation_namedExpression();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_initializers_thisInvocation_unnamed() async {
+ await super.test_constructor_initializers_thisInvocation_unnamed();
+ }
+
@failingTest
@FastaProblem('https://github.com/dart-lang/sdk/issues/30258')
test_constructor_redirected_factory_named_generic() async {
@@ -185,6 +833,83 @@
await super.test_constructor_redirected_factory_unnamed_prefixed_generic();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_redirected_thisInvocation_named() async {
+ await super.test_constructor_redirected_thisInvocation_named();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_redirected_thisInvocation_named_generic() async {
+ await super.test_constructor_redirected_thisInvocation_named_generic();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_redirected_thisInvocation_unnamed() async {
+ await super.test_constructor_redirected_thisInvocation_unnamed();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_redirected_thisInvocation_unnamed_generic() async {
+ await super.test_constructor_redirected_thisInvocation_unnamed_generic();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_constructor_withCycles_const() async {
+ await super.test_constructor_withCycles_const();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_defaultValue_refersToGenericClass_constructor() async {
+ await super.test_defaultValue_refersToGenericClass_constructor();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_defaultValue_refersToGenericClass_constructor2() async {
+ await super.test_defaultValue_refersToGenericClass_constructor2();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_defaultValue_refersToGenericClass_functionG() async {
+ await super.test_defaultValue_refersToGenericClass_functionG();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_defaultValue_refersToGenericClass_methodG() async {
+ await super.test_defaultValue_refersToGenericClass_methodG();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_defaultValue_refersToGenericClass_methodG_classG() async {
+ await super.test_defaultValue_refersToGenericClass_methodG_classG();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_defaultValue_refersToGenericClass_methodNG() async {
+ await super.test_defaultValue_refersToGenericClass_methodNG();
+ }
+
@failingTest
@notForDart2
test_export_configurations_useFirst() async {
@@ -203,6 +928,27 @@
await super.test_exportImport_configurations_useFirst();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_field_propagatedType_const_noDep() async {
+ await super.test_field_propagatedType_const_noDep();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_function_async() async {
+ await super.test_function_async();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_function_asyncStar() async {
+ await super.test_function_asyncStar();
+ }
+
@failingTest
@override
test_futureOr() async {
@@ -255,6 +1001,20 @@
@override
@failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_infer_generic_typedef_simple() async {
+ await super.test_infer_generic_typedef_simple();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_instantiateToBounds_functionTypeAlias_simple() async {
+ await super.test_instantiateToBounds_functionTypeAlias_simple();
+ }
+
+ @override
+ @failingTest
test_invalid_annotation_prefixed_constructor() {
return super.test_invalid_annotation_prefixed_constructor();
}
@@ -284,17 +1044,130 @@
}
@failingTest
- @FastaProblem('https://github.com/dart-lang/sdk/issues/30267')
- test_invalid_setterParameter_fieldFormalParameter() async {
- await super.test_invalid_setterParameter_fieldFormalParameter();
- }
-
- @failingTest
@FastaProblem('https://github.com/dart-lang/sdk/issues/30725')
test_invalidUri_part_emptyUri() async {
await super.test_invalidUri_part_emptyUri();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_invalidUris() async {
+ await super.test_invalidUris();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_member_function_async() async {
+ await super.test_member_function_async();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_member_function_asyncStar() async {
+ await super.test_member_function_asyncStar();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_member_function_syncStar() async {
+ await super.test_member_function_syncStar();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_classDeclaration() async {
+ await super.test_metadata_classDeclaration();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_classTypeAlias() async {
+ await super.test_metadata_classTypeAlias();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_constructor_call_named() async {
+ await super.test_metadata_constructor_call_named();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_constructor_call_named_prefixed() async {
+ await super.test_metadata_constructor_call_named_prefixed();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_constructor_call_unnamed() async {
+ await super.test_metadata_constructor_call_unnamed();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_constructor_call_unnamed_prefixed() async {
+ await super.test_metadata_constructor_call_unnamed_prefixed();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_constructor_call_with_args() async {
+ await super.test_metadata_constructor_call_with_args();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_constructorDeclaration_named() async {
+ await super.test_metadata_constructorDeclaration_named();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_constructorDeclaration_unnamed() async {
+ await super.test_metadata_constructorDeclaration_unnamed();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_enumConstantDeclaration() async {
+ await super.test_metadata_enumConstantDeclaration();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_enumDeclaration() async {
+ await super.test_metadata_enumDeclaration();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_exportDirective() async {
+ await super.test_metadata_exportDirective();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_fieldDeclaration() async {
+ await super.test_metadata_fieldDeclaration();
+ }
+
@failingTest
@FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
test_metadata_fieldFormalParameter() async {
@@ -307,6 +1180,34 @@
await super.test_metadata_fieldFormalParameter_withDefault();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_functionDeclaration_function() async {
+ await super.test_metadata_functionDeclaration_function();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_functionDeclaration_getter() async {
+ await super.test_metadata_functionDeclaration_getter();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_functionDeclaration_setter() async {
+ await super.test_metadata_functionDeclaration_setter();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_functionTypeAlias() async {
+ await super.test_metadata_functionTypeAlias();
+ }
+
@failingTest
@FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
test_metadata_functionTypedFormalParameter() async {
@@ -319,6 +1220,62 @@
await super.test_metadata_functionTypedFormalParameter_withDefault();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_importDirective() async {
+ await super.test_metadata_importDirective();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_invalid_classDeclaration() async {
+ await super.test_metadata_invalid_classDeclaration();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_libraryDirective() async {
+ await super.test_metadata_libraryDirective();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_methodDeclaration_getter() async {
+ await super.test_metadata_methodDeclaration_getter();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_methodDeclaration_method() async {
+ await super.test_metadata_methodDeclaration_method();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_methodDeclaration_setter() async {
+ await super.test_metadata_methodDeclaration_setter();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_partDirective() async {
+ await super.test_metadata_partDirective();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_prefixed_variable() async {
+ await super.test_metadata_prefixed_variable();
+ }
+
@failingTest
@FastaProblem('https://github.com/dart-lang/sdk/issues/28434')
test_metadata_simpleFormalParameter() async {
@@ -331,6 +1288,41 @@
await super.test_metadata_simpleFormalParameter_withDefault();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_topLevelVariableDeclaration() async {
+ await super.test_metadata_topLevelVariableDeclaration();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_typeParameter_ofClass() async {
+ await super.test_metadata_typeParameter_ofClass();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_typeParameter_ofClassTypeAlias() async {
+ await super.test_metadata_typeParameter_ofClassTypeAlias();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_typeParameter_ofFunction() async {
+ await super.test_metadata_typeParameter_ofFunction();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_metadata_typeParameter_ofTypedef() async {
+ await super.test_metadata_typeParameter_ofTypedef();
+ }
+
@failingTest
@notForDart2
test_parameter_checked() async {
@@ -345,6 +1337,55 @@
await super.test_parameter_checked_inherited();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_parameterTypeNotInferred_constructor() async {
+ await super.test_parameterTypeNotInferred_constructor();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_parameterTypeNotInferred_initializingFormal() async {
+ await super.test_parameterTypeNotInferred_initializingFormal();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_parameterTypeNotInferred_staticMethod() async {
+ await super.test_parameterTypeNotInferred_staticMethod();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_parameterTypeNotInferred_topLevelFunction() async {
+ await super.test_parameterTypeNotInferred_topLevelFunction();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_setter_inferred_type_conflictingInheritance() async {
+ await super.test_setter_inferred_type_conflictingInheritance();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_type_reference_to_typedef_with_type_arguments() async {
+ await super.test_type_reference_to_typedef_with_type_arguments();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_type_reference_to_typedef_with_type_arguments_implicit() async {
+ await super.test_type_reference_to_typedef_with_type_arguments_implicit();
+ }
+
@failingTest
@FastaProblem('https://github.com/dart-lang/sdk/issues/31711')
test_typedef_generic_asFieldType() async {
@@ -359,16 +1400,6 @@
}
@failingTest
- test_typedef_type_parameters_bound_recursive() async {
- await super.test_typedef_type_parameters_bound_recursive();
- }
-
- @failingTest
- test_typedef_type_parameters_bound_recursive2() async {
- await super.test_typedef_type_parameters_bound_recursive2();
- }
-
- @failingTest
@FastaProblem('https://github.com/dart-lang/sdk/issues/30267')
test_unresolved_annotation_instanceCreation_argument_super() async {
await super.test_unresolved_annotation_instanceCreation_argument_super();
@@ -376,6 +1407,28 @@
@override
@failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_unresolved_annotation_instanceCreation_argument_this() async {
+ await super.test_unresolved_annotation_instanceCreation_argument_this();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_unresolved_annotation_namedConstructorCall_noClass() async {
+ await super.test_unresolved_annotation_namedConstructorCall_noClass();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_unresolved_annotation_namedConstructorCall_noConstructor() async {
+ return super
+ .test_unresolved_annotation_namedConstructorCall_noConstructor();
+ }
+
+ @override
+ @failingTest
test_unresolved_annotation_prefixedIdentifier_badPrefix() {
return super.test_unresolved_annotation_prefixedIdentifier_badPrefix();
}
@@ -388,10 +1441,71 @@
@override
@failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix() async {
+ return super
+ .test_unresolved_annotation_prefixedNamedConstructorCall_badPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_unresolved_annotation_prefixedNamedConstructorCall_noClass() async {
+ return super
+ .test_unresolved_annotation_prefixedNamedConstructorCall_noClass();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor() async {
+ return super
+ .test_unresolved_annotation_prefixedNamedConstructorCall_noConstructor();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix() async {
+ return super
+ .test_unresolved_annotation_prefixedUnnamedConstructorCall_badPrefix();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass() async {
+ return super
+ .test_unresolved_annotation_prefixedUnnamedConstructorCall_noClass();
+ }
+
+ @override
+ @failingTest
test_unresolved_annotation_simpleIdentifier() {
return super.test_unresolved_annotation_simpleIdentifier();
}
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_unresolved_annotation_unnamedConstructorCall_noClass() async {
+ await super.test_unresolved_annotation_unnamedConstructorCall_noClass();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_variable_const() async {
+ await super.test_variable_const();
+ }
+
+ @override
+ @failingTest
+ @FastaProblem('https://github.com/dart-lang/sdk/issues/33567')
+ test_variable_propagatedType_const_noDep() async {
+ await super.test_variable_propagatedType_const_noDep();
+ }
+
Future<KernelResynthesizer> _createResynthesizer(Uri testUri) async {
var logger = new PerformanceLog(null);
var byteStore = new MemoryByteStore();
@@ -415,7 +1529,7 @@
fsState,
resourceProvider.pathContext);
- LibraryCompilationResult libraryResult = await compiler.compile(testUri);
+ LibraryOutlineResult libraryResult = await compiler.getOutline(testUri);
// Remember Kernel libraries produced by the compiler.
var libraryMap = <String, kernel.Library>{};
diff --git a/pkg/analyzer/tool/analyzer_cfe_progress.dart b/pkg/analyzer/tool/analyzer_cfe_progress.dart
new file mode 100644
index 0000000..27577db
--- /dev/null
+++ b/pkg/analyzer/tool/analyzer_cfe_progress.dart
@@ -0,0 +1,122 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io' as io;
+
+import 'package:analyzer/dart/analysis/context_builder.dart';
+import 'package:analyzer/dart/analysis/context_locator.dart';
+import 'package:analyzer/dart/analysis/context_root.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:path/path.dart' as path;
+
+// TODO(devoncarew): Convert the commented out code below to a --verbose option,
+// emitting failing tests in a markdown ready format?
+
+/// Count failing Analyzer CFE integration tests.
+///
+/// We look for classes ending in *Test_UseCFE or *Test_Kernel with test
+/// methods that are marked with @failingTest annotations.
+///
+/// In addition, we count the test exclusions from pkg/pkg.status related to
+/// using Fasta with the Analyzer.
+void main() {
+ if (!io.FileSystemEntity.isDirectorySync('pkg')) {
+ io.stderr
+ .writeln('This tool should be run from the top level sdk directory.');
+ io.exit(1);
+ }
+
+ final List<String> analysisPaths = [
+ 'pkg/analysis_server',
+ 'pkg/analyzer_cli',
+ 'pkg/analyzer_plugin',
+ 'pkg/analyzer',
+ ];
+
+ final ResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
+ ContextLocator locator =
+ new ContextLocator(resourceProvider: resourceProvider);
+ List<ContextRoot> contextRoots =
+ locator.locateRoots(includedPaths: analysisPaths);
+ ContextBuilder builder =
+ new ContextBuilder(resourceProvider: resourceProvider);
+
+ for (ContextRoot contextRoot in contextRoots) {
+ if (!analysisPaths
+ .any((analysisPath) => contextRoot.root.path.endsWith(analysisPath))) {
+ continue;
+ }
+
+ AnalysisSession analysisSession =
+ builder.createContext(contextRoot: contextRoot).currentSession;
+ print('\nCFE tests for ${path.relative(contextRoot.root.path)}:');
+
+ int totalFailingCount = 0;
+
+ for (String analyzedPath in contextRoot.analyzedFiles()) {
+ if (!analyzedPath.endsWith('_test.dart')) {
+ continue;
+ }
+
+ ParseResult result = analysisSession.getParsedAstSync(analyzedPath);
+ CompilationUnit unit = result.unit;
+
+ for (ClassDeclaration member
+ in unit.declarations.where((member) => member is ClassDeclaration)) {
+ String className = member.name.toString();
+ if (!className.endsWith('Test_UseCFE') &&
+ !className.endsWith('Test_Kernel')) {
+ continue;
+ }
+
+ int failingCount = 0;
+
+ for (MethodDeclaration method
+ in member.members.where((member) => member is MethodDeclaration)) {
+ String methodName = method.name.toString();
+ if (!methodName.startsWith('test_')) {
+ continue;
+ }
+
+ if (method.metadata.any((Annotation annotation) =>
+ annotation.name.toString() == 'failingTest')) {
+ failingCount++;
+ }
+ }
+
+ totalFailingCount += failingCount;
+
+ //if (failingCount > 0) {
+ // print(' ${member.name}, $failingCount failing tests');
+ //}
+ }
+ }
+
+ print(' $totalFailingCount failing tests');
+ }
+
+ // Also count the Fasta '-DuseFastaParser=true' tests.
+ print('\nuseFastaParser=true failures from pkg/pkg.status');
+
+ io.File file = new io.File('pkg/pkg.status');
+ List<String> lines = file.readAsLinesSync();
+ lines = lines
+ .where((line) => line.trim().isNotEmpty && !line.trim().startsWith('#'))
+ .toList();
+
+ int index = lines
+ .indexOf(r'[ $builder_tag == analyzer_use_fasta && $runtime == vm ]');
+ if (index == -1) {
+ print('error parsing ${file.path}');
+ }
+
+ lines = lines.sublist(index + 1);
+ lines = lines.sublist(0, lines.indexWhere((line) => line.startsWith('[')));
+
+ print(' ${lines.length} failing tests');
+}
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 606e0c3..fa3df1e 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -659,13 +659,6 @@
class ExitCodesTest_PreviewDart2 extends ExitCodesTest {
@override
bool get usePreviewDart2 => true;
-
- @override
- @failingTest
- test_fatalErrors() {
- // TODO(devoncarew): This test times out when used with @failingTest.
- return new Future.error('failing test');
- }
}
@reflectiveTest
@@ -675,64 +668,7 @@
@override
@failingTest
- test_enableAssertInitializer() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_fatalErrors() {
- // TODO(devoncarew): This test times out when used with @failingTest.
- return new Future.error('failing test');
- }
-
- @override
- @failingTest
- test_fatalHints() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_fatalWarnings() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_missingOptionsFile() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_notFatalHints() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_notFatalWarnings() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_partFile() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_partFile_extra() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_partFile_reversed() {
- fail('Test crashes CFE');
- }
+ test_fatalWarnings() => callFailingTest(super.test_fatalWarnings);
}
@reflectiveTest
@@ -841,48 +777,6 @@
class LinterTest_UseCFE extends LinterTest {
@override
bool get useCFE => true;
-
- @override
- @failingTest
- test_defaultLints_generatedLints() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_defaultLints_getsDefaultLints() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_lintsInOptions_generatedLints() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_lintsInOptions_getAnalysisOptions() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_noLints_lintsDisabled() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_noLints_noGeneratedWarnings() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_noLints_noRegisteredLints() {
- fail('Test times out');
- }
}
@reflectiveTest
@@ -1099,75 +993,45 @@
@override
@failingTest
- test_analysisOptions_excludes() {
- fail('Test times out');
- }
+ test_analysisOptions_excludes() =>
+ callFailingTest(super.test_analysisOptions_excludes);
@override
@failingTest
- test_analysisOptions_excludesRelativeToAnalysisOptions_explicit() {
- fail('Test times out');
- }
+ test_analysisOptions_excludesRelativeToAnalysisOptions_explicit() =>
+ callFailingTest(super
+ .test_analysisOptions_excludesRelativeToAnalysisOptions_explicit);
@override
@failingTest
- test_analysisOptions_excludesRelativeToAnalysisOptions_inferred() {
- fail('Test times out');
- }
+ test_analysisOptions_excludesRelativeToAnalysisOptions_inferred() =>
+ callFailingTest(super
+ .test_analysisOptions_excludesRelativeToAnalysisOptions_inferred);
@override
@failingTest
- test_analyzeFilesInDifferentContexts() {
- fail('Test times out');
- }
+ test_basic_filters() => callFailingTest(super.test_basic_filters);
@override
@failingTest
- test_basic_filters() {
- fail('Test times out');
- }
+ test_basic_language() => callFailingTest(super.test_basic_language);
@override
@failingTest
- test_basic_language() {
- fail('Test times out');
- }
+ test_basic_strongMode() => callFailingTest(super.test_basic_strongMode);
@override
@failingTest
- test_basic_strongMode() {
- fail('Test times out');
- }
+ test_includeDirective() => callFailingTest(super.test_includeDirective);
@override
@failingTest
- test_includeDirective() {
- fail('Test times out');
- }
+ test_previewDart2() => callFailingTest(super.test_previewDart2);
@override
@failingTest
- test_previewDart2() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_strongSdk() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_todo() {
- fail('Test times out');
- }
-
- @override
- @failingTest
- test_withFlags_overrideFatalWarning() {
- fail('Test times out');
- }
+ test_withFlags_overrideFatalWarning() =>
+ callFailingTest(super.test_withFlags_overrideFatalWarning);
}
class TestSource implements Source {
@@ -1176,3 +1040,32 @@
@override
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
+
+typedef dynamic NoArgFunction();
+
+/**
+ * Call a test that we think will fail.
+ *
+ * Ensure that we return any thrown exception correctly (avoiding the
+ * package:test zone error handler).
+ */
+callFailingTest(NoArgFunction expectedFailingTestFn) {
+ final Completer completer = new Completer();
+
+ try {
+ runZoned(
+ () async => await expectedFailingTestFn(),
+ onError: (error) {
+ completer.completeError(error);
+ },
+ ).then((result) {
+ completer.complete(result);
+ }).catchError((error) {
+ completer.completeError(error);
+ });
+ } catch (error) {
+ completer.completeError(error);
+ }
+
+ return completer.future;
+}
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
index cb58f97..a8c5bef 100644
--- a/pkg/build_integration/pubspec.yaml
+++ b/pkg/build_integration/pubspec.yaml
@@ -1,9 +1,9 @@
name: build_integration
-version: 0.0.1
-author: Dart Team <misc@dartlang.org>
description: >
Libraries for integrating Dart tools with build systems like bazel
and build_runner.
-homepage: https://github.com/dart-lang/sdk/tree/master/pkg/build_integration
+# This package is not intended to be published - yet
+publish_to: none
+
dependencies:
front_end: ^0.1.0
diff --git a/pkg/compiler/lib/compiler.dart b/pkg/compiler/lib/compiler.dart
index 32c8b43..671f426 100644
--- a/pkg/compiler/lib/compiler.dart
+++ b/pkg/compiler/lib/compiler.dart
@@ -109,7 +109,7 @@
CompilerInputProvider inputProvider, DiagnosticHandler handler,
[List<String> options = const [],
CompilerOutputProvider outputProvider,
- Map<String, dynamic> environment = const {},
+ Map<String, String> environment = const {},
Uri packageConfig,
PackagesDiscoveryProvider packagesDiscoveryProvider]) {
CompilerOptions compilerOptions =
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index 4fcea9f..a855925 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -157,6 +157,10 @@
});
}
+ String _formatMs(int ms) {
+ return (ms / 1000).toStringAsFixed(3) + 's';
+ }
+
void computeTimings(Duration setupDuration, StringBuffer timings) {
timings.writeln("Timings:");
Duration totalDuration = measurer.wallClock.elapsed;
@@ -167,13 +171,13 @@
Duration duration = task.duration;
if (duration != Duration.zero) {
cumulatedDuration += duration;
- timings.writeln(' $running${task.name} took'
- ' ${duration.inMilliseconds}msec');
+ timings.writeln(' $running${task.name}:'
+ ' ${_formatMs(duration.inMilliseconds)}');
for (String subtask in task.subtasks) {
int subtime = task.getSubtaskTime(subtask);
String running = task.getSubtaskIsRunning(subtask) ? "*" : "";
timings.writeln(
- ' $running${task.name} > $subtask took ${subtime}msec');
+ ' $running${task.name} > $subtask: ${_formatMs(subtime)}');
}
}
}
@@ -181,10 +185,11 @@
totalDuration - cumulatedDuration - setupDuration - asyncDuration;
double percent =
unaccountedDuration.inMilliseconds * 100 / totalDuration.inMilliseconds;
- timings.write(' Total compile-time ${totalDuration.inMilliseconds}msec;'
- ' setup ${setupDuration.inMilliseconds}msec;'
- ' async ${asyncDuration.inMilliseconds}msec;'
- ' unaccounted ${unaccountedDuration.inMilliseconds}msec'
+ timings.write(
+ ' Total compile-time ${_formatMs(totalDuration.inMilliseconds)};'
+ ' setup ${_formatMs(setupDuration.inMilliseconds)};'
+ ' async ${_formatMs(asyncDuration.inMilliseconds)};'
+ ' unaccounted ${_formatMs(unaccountedDuration.inMilliseconds)}'
' (${percent.toStringAsFixed(2)}%)');
}
diff --git a/pkg/compiler/lib/src/frontend_strategy.dart b/pkg/compiler/lib/src/frontend_strategy.dart
index f6b8293..45f1261 100644
--- a/pkg/compiler/lib/src/frontend_strategy.dart
+++ b/pkg/compiler/lib/src/frontend_strategy.dart
@@ -23,7 +23,7 @@
import 'library_loader.dart';
import 'native/enqueue.dart' show NativeResolutionEnqueuer;
import 'native/resolver.dart';
-import 'universe/class_hierarchy_builder.dart';
+import 'universe/class_hierarchy.dart';
import 'universe/world_builder.dart';
import 'universe/world_impact.dart';
diff --git a/pkg/compiler/lib/src/helpers/stats.dart b/pkg/compiler/lib/src/helpers/stats.dart
index c8f6c0da0..935ac8c 100644
--- a/pkg/compiler/lib/src/helpers/stats.dart
+++ b/pkg/compiler/lib/src/helpers/stats.dart
@@ -537,13 +537,13 @@
}
void recordFrequency(id, value, [example]) {
- Map<int, List> map = frequencyMaps.putIfAbsent(id, () => {});
+ Map<dynamic, List> map = frequencyMaps.putIfAbsent(id, () => {});
map.putIfAbsent(value, () => []);
map[value].add(example);
}
void recordFrequencies(id, Map<dynamic, Iterable> frequencyMap) {
- Map<int, List> map = frequencyMaps.putIfAbsent(id, () => {});
+ Map<dynamic, List> map = frequencyMaps.putIfAbsent(id, () => {});
frequencyMap.forEach((value, examples) {
map.putIfAbsent(value, () => []);
map[value].addAll(examples);
@@ -707,7 +707,7 @@
{int limit, Map dataMap, bool includeCount: true}) {
if (limit == 0) return;
- Map childData = {};
+ Map<String, dynamic> childData = {};
Iterable nonNullIterable = iterable.where((e) => e != null);
if (nonNullIterable.isEmpty && !includeCount) {
childData['name'] = title;
@@ -748,11 +748,11 @@
///
/// If [isValidKey] is provided, this is used to determine with a value of [map]
/// is a potential key of the inversion map.
-Map<dynamic, Set> inverseMap(Map map,
- {bool equals(key1, key2),
- int hashCode(key),
- bool isValidKey(potentialKey)}) {
- Map<dynamic, Set> result = new LinkedHashMap<dynamic, Set>(
+Map<V, Set<K>> inverseMap<K, V>(Map<K, V> map,
+ {bool equals(V key1, V key2),
+ int hashCode(V key),
+ bool isValidKey(V potentialKey)}) {
+ Map<V, Set<K>> result = new LinkedHashMap<V, Set<K>>(
equals: equals, hashCode: hashCode, isValidKey: isValidKey);
map.forEach((k, v) {
if (isValidKey == null || isValidKey(v)) {
@@ -767,11 +767,11 @@
/// the assumption that all keys are [Comparable].
/// Otherwise, the keys are sorted as string using their `toString`
/// representation.
-Map trySortMap(Map map) {
- Iterable iterable = map.keys.where((k) => k != null);
+Map<K, V> trySortMap<K, V>(Map<K, V> map) {
+ Iterable<K> iterable = map.keys.where((K k) => k != null);
if (iterable.isEmpty) return map;
var key = iterable.first;
- if (key is Comparable) {
+ if (key is Comparable<K>) {
return sortMap(map);
}
return sortMap(map, (a, b) => '$a'.compareTo('$b'));
@@ -779,10 +779,10 @@
/// Returns a new map in which the keys of [map] are sorted using [compare].
/// If [compare] is null, the keys must be [Comparable].
-Map sortMap(Map map, [int compare(a, b)]) {
- List keys = map.keys.toList();
+Map<K, V> sortMap<K, V>(Map<K, V> map, [int compare(K a, K b)]) {
+ List<K> keys = map.keys.toList();
keys.sort(compare);
- Map sortedMap = new Map();
- keys.forEach((k) => sortedMap[k] = map[k]);
+ Map<K, V> sortedMap = new Map<K, V>();
+ keys.forEach((K k) => sortedMap[k] = map[k]);
return sortedMap;
}
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
index 52ff120..549c287 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
@@ -364,7 +364,8 @@
addNode(info, 'BoolLiteral\n${info.value}');
}
- void handleCall(CallSiteTypeInformation info, String text, Map inputs) {
+ void handleCall(CallSiteTypeInformation info, String text,
+ Map<String, TypeInformation> inputs) {
String sourceCode = shorten('${info.debugName}');
text = '$text\n$sourceCode';
if (info.arguments != null) {
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
index 644cfd2..7311eb2 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart
@@ -334,23 +334,50 @@
assert(TypeMask.assertIsNormalized(this, closedWorld));
assert(TypeMask.assertIsNormalized(other, closedWorld));
FlatTypeMask flatOther = other;
- if (isEmptyOrNull) {
- return flatOther.isNullable ? this : nonNullable();
- } else if (flatOther.isEmptyOrNull) {
- return isNullable ? flatOther : other.nonNullable();
- } else if (base == flatOther.base) {
- return intersectionSame(flatOther, closedWorld);
- } else if (closedWorld.isSubclassOf(flatOther.base, base)) {
- return intersectionStrictSubclass(flatOther, closedWorld);
- } else if (closedWorld.isSubclassOf(base, flatOther.base)) {
- return flatOther.intersectionStrictSubclass(this, closedWorld);
- } else if (closedWorld.isSubtypeOf(flatOther.base, base)) {
- return intersectionStrictSubtype(flatOther, closedWorld);
- } else if (closedWorld.isSubtypeOf(base, flatOther.base)) {
- return flatOther.intersectionStrictSubtype(this, closedWorld);
- } else {
- return intersectionDisjoint(flatOther, closedWorld);
+
+ ClassEntity otherBase = flatOther.base;
+
+ bool includeNull = isNullable && flatOther.isNullable;
+
+ TypeMask emptyOrNull() {
+ return includeNull
+ ? closedWorld.abstractValueDomain.nullType
+ : closedWorld.abstractValueDomain.emptyType;
}
+
+ if (isEmptyOrNull || flatOther.isEmptyOrNull) {
+ return emptyOrNull();
+ }
+
+ SubclassResult result = closedWorld.classHierarchy
+ .commonSubclasses(base, _classQuery, otherBase, flatOther._classQuery);
+
+ FlatTypeMask createSingle(ClassEntity cls) {
+ switch (result.query) {
+ case ClassQuery.EXACT:
+ return includeNull
+ ? new TypeMask.exact(cls, closedWorld)
+ : new TypeMask.nonNullExact(cls, closedWorld);
+ case ClassQuery.SUBCLASS:
+ return includeNull
+ ? new TypeMask.subclass(cls, closedWorld)
+ : new TypeMask.nonNullSubclass(cls, closedWorld);
+ case ClassQuery.SUBTYPE:
+ return includeNull
+ ? new TypeMask.subtype(cls, closedWorld)
+ : new TypeMask.nonNullSubtype(cls, closedWorld);
+ }
+ throw new UnsupportedError("Unexpected ClassQuery: ${result.query}.");
+ }
+
+ List<FlatTypeMask> masks =
+ result.classes.map<FlatTypeMask>(createSingle).toList();
+ if (masks.isEmpty) return emptyOrNull();
+ if (masks.length == 1) return masks.single;
+ if (masks.length > UnionTypeMask.MAX_UNION_LENGTH) {
+ return UnionTypeMask.flatten(masks, closedWorld);
+ }
+ return new UnionTypeMask._internal(masks);
}
bool isDisjoint(TypeMask other, JClosedWorld closedWorld) {
@@ -432,54 +459,6 @@
}
}
- TypeMask intersectionStrictSubtype(
- FlatTypeMask other, JClosedWorld closedWorld) {
- assert(base != other.base);
- assert(closedWorld.isSubtypeOf(other.base, base));
- if (!isSubtype) return intersectionHelper(other, closedWorld);
- // Only the other mask puts constraints on the intersection mask,
- // so base the combined flags on the other mask. Only if both
- // masks are nullable, will the result be nullable too.
- // The result is guaranteed to be normalized, as the other type
- // was normalized.
- int combined = other.flags & ((flags & 1) | ~1);
- if (other.flags == combined) {
- return other;
- } else {
- return new FlatTypeMask.normalized(other.base, combined, closedWorld);
- }
- }
-
- TypeMask intersectionDisjoint(FlatTypeMask other, JClosedWorld closedWorld) {
- assert(base != other.base);
- assert(!closedWorld.isSubtypeOf(base, other.base));
- assert(!closedWorld.isSubtypeOf(other.base, base));
- return intersectionHelper(other, closedWorld);
- }
-
- TypeMask intersectionHelper(FlatTypeMask other, JClosedWorld closedWorld) {
- assert(base != other.base);
- assert(!closedWorld.isSubclassOf(base, other.base));
- assert(!closedWorld.isSubclassOf(other.base, base));
- // If one of the masks are exact or if both of them are subclass
- // masks, then the intersection is empty.
- if (isExact || other.isExact) return intersectionEmpty(other);
- if (isSubclass && other.isSubclass) return intersectionEmpty(other);
- assert(isSubtype || other.isSubtype);
- int kind = (isSubclass || other.isSubclass) ? SUBCLASS : SUBTYPE;
- Iterable<ClassEntity> candidates = closedWorld.commonSubclasses(
- base, _classQuery, other.base, other._classQuery);
- if (candidates.isEmpty) return intersectionEmpty(other);
- // Run through the list of candidates and compute the union. The
- // result will only be nullable if both masks are nullable. We have
- // to normalize here, as we generate types based on new base classes.
- int combined = (kind << 1) | (flags & other.flags & 1);
- Iterable<TypeMask> masks = candidates.map((ClassEntity cls) {
- return new FlatTypeMask.normalized(cls, combined, closedWorld);
- });
- return UnionTypeMask.unionOf(masks, closedWorld);
- }
-
TypeMask intersectionEmpty(FlatTypeMask other) {
return isNullable && other.isNullable
? new TypeMask.empty()
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index 2b6ae66..23752a0 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -9,12 +9,13 @@
import '../../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
import '../../elements/entities.dart';
import '../../types/abstract_value_domain.dart';
+import '../../universe/class_hierarchy.dart';
import '../../universe/selector.dart' show Selector;
import '../../universe/use.dart' show DynamicUse;
import '../../universe/world_builder.dart'
show UniverseSelectorConstraints, SelectorConstraintsStrategy;
import '../../util/util.dart';
-import '../../world.dart' show ClassQuery, JClosedWorld;
+import '../../world.dart' show JClosedWorld;
import '../type_graph_inferrer.dart' show TypeGraphInferrer;
import 'constants.dart';
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index 8b424b6..3b6fc65 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -38,7 +38,7 @@
import '../ssa/ssa.dart' show SsaFunctionCompiler;
import '../tracer.dart';
import '../universe/call_structure.dart' show CallStructure;
-import '../universe/class_hierarchy_builder.dart'
+import '../universe/class_hierarchy.dart'
show ClassHierarchyBuilder, ClassQueries;
import '../universe/selector.dart' show Selector;
import '../universe/use.dart' show StaticUse;
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index 7069820..0ce6141 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -13,6 +13,7 @@
import '../js_emitter/code_emitter_task.dart';
import '../options.dart';
import '../universe/world_builder.dart';
+import 'allocator_analysis.dart' show JAllocatorAnalysis;
import 'constant_system_javascript.dart';
import 'js_backend.dart';
import 'namer.dart';
@@ -40,6 +41,7 @@
final CodegenWorldBuilder _worldBuilder;
final RuntimeTypesNeed _rtiNeed;
final RuntimeTypesEncoder _rtiEncoder;
+ final JAllocatorAnalysis _allocatorAnalysis;
final Namer _namer;
final CodeEmitterTask _task;
final _ConstantReferenceGenerator constantReferenceGenerator;
@@ -56,6 +58,7 @@
this._worldBuilder,
this._rtiNeed,
this._rtiEncoder,
+ this._allocatorAnalysis,
this._namer,
this._task,
this.constantReferenceGenerator,
@@ -325,7 +328,9 @@
_emitter.constructorAccess(constant.type.element);
List<jsAst.Expression> fields = <jsAst.Expression>[];
_worldBuilder.forEachInstanceField(element, (_, FieldEntity field) {
- fields.add(constantReferenceGenerator(constant.fields[field]));
+ if (!_allocatorAnalysis.isInitializedInAllocator(field)) {
+ fields.add(constantReferenceGenerator(constant.fields[field]));
+ }
});
if (_rtiNeed.classNeedsTypeArguments(constant.type.element)) {
fields.add(_reifiedTypeArguments(constant, constant.type.typeArguments));
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index a438262..b7a388a 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -4,7 +4,7 @@
library js_backend.backend.impact_transformer;
-import '../universe/class_hierarchy_builder.dart' show ClassHierarchyBuilder;
+import '../universe/class_hierarchy.dart' show ClassHierarchyBuilder;
import '../common.dart';
import '../common_elements.dart';
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index a449b52..54863e5 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -13,10 +13,11 @@
import '../js/js.dart' show js;
import '../js_emitter/js_emitter.dart' show Emitter;
import '../options.dart';
+import '../universe/class_hierarchy.dart';
import '../universe/feature.dart';
import '../universe/selector.dart';
import '../universe/world_builder.dart';
-import '../world.dart' show ClassQuery, JClosedWorld, KClosedWorld;
+import '../world.dart' show JClosedWorld, KClosedWorld;
import 'backend_usage.dart';
import 'namer.dart';
import 'native_data.dart';
@@ -1469,7 +1470,8 @@
classesNeedingTypeArguments.add(cls);
// TODO(ngeoffray): This should use subclasses, not subtypes.
- closedWorld.forEachStrictSubtypeOf(cls, (ClassEntity sub) {
+ closedWorld.classHierarchy.forEachStrictSubtypeOf(cls,
+ (ClassEntity sub) {
potentiallyNeedTypeArguments(sub);
});
} else if (entity is FunctionEntity) {
@@ -1694,19 +1696,16 @@
impliedClass(runtimeTypeUse.argumentType);
// TODO(johnniwinther): Special case use of `this.runtimeType`.
- if (closedWorld.isSubtypeOf(receiverClass, argumentClass)) {
- addClass(receiverClass);
- } else if (closedWorld.isSubtypeOf(argumentClass, receiverClass)) {
- addClass(argumentClass);
+ SubclassResult result = closedWorld.classHierarchy.commonSubclasses(
+ receiverClass,
+ ClassQuery.SUBTYPE,
+ argumentClass,
+ ClassQuery.SUBTYPE);
+
+ for (ClassEntity cls in result.classes) {
+ addClass(cls);
+ if (neededOnAll) break;
}
- if (neededOnAll) break;
- // TODO(johnniwinther): Special case use of `this.runtimeType`.
- // TODO(johnniwinther): Rename [commonSubclasses] to something like
- // [strictCommonClasses] and support the non-strict case directly.
- // Since we do a subclassesOf
- classesDirectlyNeedingRuntimeType.addAll(
- closedWorld.commonSubclasses(receiverClass, ClassQuery.SUBTYPE,
- argumentClass, ClassQuery.SUBTYPE));
break;
case RuntimeTypeUseKind.unknown:
addClass(impliedClass(runtimeTypeUse.receiverType));
@@ -1717,15 +1716,17 @@
Set<ClassEntity> allClassesNeedingRuntimeType;
if (neededOnAll) {
neededOnFunctions = true;
- allClassesNeedingRuntimeType =
- closedWorld.subclassesOf(commonElements.objectClass).toSet();
+ allClassesNeedingRuntimeType = closedWorld.classHierarchy
+ .subclassesOf(commonElements.objectClass)
+ .toSet();
} else {
allClassesNeedingRuntimeType = new Set<ClassEntity>();
// TODO(johnniwinther): Support this operation directly in
// [ClosedWorld] using the [ClassSet]s.
for (ClassEntity cls in classesDirectlyNeedingRuntimeType) {
if (!allClassesNeedingRuntimeType.contains(cls)) {
- allClassesNeedingRuntimeType.addAll(closedWorld.subtypesOf(cls));
+ allClassesNeedingRuntimeType
+ .addAll(closedWorld.classHierarchy.subtypesOf(cls));
}
}
}
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
index 407b49e..19692ba 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -166,6 +166,7 @@
compiler.codegenWorldBuilder,
_closedWorld.rtiNeed,
compiler.backend.rtiEncoder,
+ _closedWorld.allocatorAnalysis,
namer,
task,
this.constantReference,
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index edda727..46bce90 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -83,6 +83,7 @@
compiler.codegenWorldBuilder,
_closedWorld.rtiNeed,
compiler.backend.rtiEncoder,
+ _closedWorld.allocatorAnalysis,
namer,
task,
this.generateConstantReference,
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index 6b68731..1f4923a 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -289,10 +289,10 @@
});
}
- closedWorld
+ closedWorld.classHierarchy
.getClassHierarchyNode(closedWorld.commonElements.objectClass)
.forEachSubclass((ClassEntity cls) {
- convertClassSet(closedWorld.getClassSet(cls));
+ convertClassSet(closedWorld.classHierarchy.getClassSet(cls));
}, ClassHierarchyNode.ALL);
Set<MemberEntity> liveInstanceMembers =
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 71a8c15..891f792 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -42,6 +42,9 @@
bool get nativeExtensionExpectsString => false;
@override
+ bool get errorOnUnexactWebIntLiterals => true;
+
+ @override
void performModularTransformationsOnLibraries(
CoreTypes coreTypes, ClassHierarchy hierarchy, List<ir.Library> libraries,
{void logger(String msg)}) {}
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index b2584d4..b3e5f49 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -43,7 +43,7 @@
import '../ordered_typeset.dart';
import '../ssa/kernel_impact.dart';
import '../ssa/type_builder.dart';
-import '../universe/class_hierarchy_builder.dart';
+import '../universe/class_hierarchy.dart';
import '../universe/class_set.dart';
import '../universe/selector.dart';
import '../universe/world_builder.dart';
@@ -439,11 +439,20 @@
}
List<DartType> parameterTypes = <DartType>[];
List<DartType> optionalParameterTypes = <DartType>[];
+
+ DartType getParameterType(ir.VariableDeclaration variable) {
+ if (variable.isCovariant || variable.isGenericCovariantImpl) {
+ // A covariant parameter has type `Object` in the method signature.
+ return commonElements.objectType;
+ }
+ return getDartType(variable.type);
+ }
+
for (ir.VariableDeclaration variable in node.positionalParameters) {
if (parameterTypes.length == node.requiredParameterCount) {
- optionalParameterTypes.add(getDartType(variable.type));
+ optionalParameterTypes.add(getParameterType(variable));
} else {
- parameterTypes.add(getDartType(variable.type));
+ parameterTypes.add(getParameterType(variable));
}
}
List<String> namedParameters = <String>[];
@@ -452,7 +461,7 @@
node.namedParameters.toList()..sort((a, b) => a.name.compareTo(b.name));
for (ir.VariableDeclaration variable in sortedNamedParameters) {
namedParameters.add(variable.name);
- namedParameterTypes.add(getDartType(variable.type));
+ namedParameterTypes.add(getParameterType(variable));
}
List<FunctionTypeVariable> typeVariables;
if (node.typeParameters.isNotEmpty && options.strongMode) {
@@ -2064,9 +2073,6 @@
final Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses;
- final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes;
- final Map<ClassEntity, ClassSet> _classSets;
-
// TODO(johnniwinther): Can this be derived from [ClassSet]s?
final Set<ClassEntity> _implementedClasses;
@@ -2080,6 +2086,8 @@
final Iterable<MemberEntity> processedMembers;
+ final ClassHierarchy classHierarchy;
+
KClosedWorldImpl(this.elementMap,
{CompilerOptions options,
this.elementEnvironment,
@@ -2102,8 +2110,8 @@
Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes,
Map<ClassEntity, ClassSet> classSets})
: _implementedClasses = implementedClasses,
- _classHierarchyNodes = classHierarchyNodes,
- _classSets = classSets {
+ classHierarchy = new ClassHierarchyImpl(
+ commonElements, classHierarchyNodes, classSets) {
computeRtiNeed(resolutionWorldBuilder, rtiNeedBuilder, options);
}
@@ -2111,152 +2119,6 @@
bool isImplemented(ClassEntity cls) {
return _implementedClasses.contains(cls);
}
-
- /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
- /// of known classes.
- ///
- /// This method is only provided for testing. For queries on classes, use the
- /// methods defined in [JClosedWorld].
- ClassHierarchyNode getClassHierarchyNode(ClassEntity cls) {
- return _classHierarchyNodes[cls];
- }
-
- /// Returns [ClassSet] for [cls] used to model the extends and implements
- /// relations of known classes.
- ///
- /// This method is only provided for testing. For queries on classes, use the
- /// methods defined in [JClosedWorld].
- ClassSet getClassSet(ClassEntity cls) {
- return _classSets[cls];
- }
-
- // TODO(johnniwinther): Share the methods based on [ClassSet] and
- // [ClassHierarchyNode] between KClosedWorld and JClosedWorld.
- /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
- /// instance of [y].
- bool isSubtypeOf(ClassEntity x, ClassEntity y) {
- ClassSet classSet = _classSets[y];
- assert(classSet != null,
- failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${_classSets}"));
- ClassHierarchyNode classHierarchyNode = _classHierarchyNodes[x];
- assert(classHierarchyNode != null,
- failedAt(x, "No ClassHierarchyNode for $x"));
- return classSet.hasSubtype(classHierarchyNode);
- }
-
- /// Returns an iterable over the directly instantiated that implement [cls]
- /// possibly including [cls] itself, if it is live.
- Iterable<ClassEntity> subtypesOf(ClassEntity cls) {
- ClassSet classSet = _classSets[cls];
- if (classSet == null) {
- return const <ClassEntity>[];
- } else {
- return classSet
- .subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
- }
- }
-
- /// Returns an iterable over the directly instantiated classes that extend
- /// [cls] possibly including [cls] itself, if it is live.
- Iterable<ClassEntity> subclassesOf(ClassEntity cls) {
- ClassHierarchyNode hierarchy = _classHierarchyNodes[cls];
- if (hierarchy == null) return const <ClassEntity>[];
- return hierarchy
- .subclassesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
- }
-
- /// Returns an iterable over the directly instantiated that implement [cls]
- /// _not_ including [cls].
- Iterable<ClassEntity> strictSubtypesOf(ClassEntity cls) {
- ClassSet classSet = _classSets[cls];
- if (classSet == null) {
- return const <ClassEntity>[];
- } else {
- return classSet.subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
- strict: true);
- }
- }
-
- Iterable<ClassEntity> getInterfaces(ClassEntity cls) {
- return elementMap._getInterfaces(cls).map((t) => t.element);
- }
-
- ClassEntity getSuperClass(ClassEntity cls) {
- return elementMap._getSuperType(cls)?.element;
- }
-
- /// Returns an iterable over the directly instantiated classes that extend
- /// [cls] _not_ including [cls] itself.
- Iterable<ClassEntity> strictSubclassesOf(ClassEntity cls) {
- ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
- if (subclasses == null) return const <ClassEntity>[];
- return subclasses.subclassesByMask(
- ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
- strict: true);
- }
-
- Set<ClassEntity> _commonContainedClasses(ClassEntity cls1, ClassQuery query1,
- ClassEntity cls2, ClassQuery query2) {
- Iterable<ClassEntity> xSubset = _containedSubset(cls1, query1);
- if (xSubset == null) return null;
- Iterable<ClassEntity> ySubset = _containedSubset(cls2, query2);
- if (ySubset == null) return null;
- return xSubset.toSet().intersection(ySubset.toSet());
- }
-
- Iterable<ClassEntity> _containedSubset(ClassEntity cls, ClassQuery query) {
- switch (query) {
- case ClassQuery.EXACT:
- return null;
- case ClassQuery.SUBCLASS:
- return strictSubclassesOf(cls);
- case ClassQuery.SUBTYPE:
- return strictSubtypesOf(cls);
- }
- throw new ArgumentError('Unexpected query: $query.');
- }
-
- Iterable<ClassEntity> commonSubclasses(ClassEntity cls1, ClassQuery query1,
- ClassEntity cls2, ClassQuery query2) {
- // TODO(johnniwinther): Use [ClassSet] to compute this.
- // Compute the set of classes that are contained in both class subsets.
- Set<ClassEntity> common =
- _commonContainedClasses(cls1, query1, cls2, query2);
- if (common == null || common.isEmpty) return const <ClassEntity>[];
- // Narrow down the candidates by only looking at common classes
- // that do not have a superclass or supertype that will be a
- // better candidate.
- return common.where((ClassEntity each) {
- bool containsSuperclass = common.contains(getSuperClass(each));
- // If the superclass is also a candidate, then we don't want to
- // deal with this class. If we're only looking for a subclass we
- // know we don't have to look at the list of interfaces because
- // they can never be in the common set.
- if (containsSuperclass ||
- query1 == ClassQuery.SUBCLASS ||
- query2 == ClassQuery.SUBCLASS) {
- return !containsSuperclass;
- }
- // Run through the direct supertypes of the class. If the common
- // set contains the direct supertype of the class, we ignore the
- // the class because the supertype is a better candidate.
-
- for (ClassEntity interface in getInterfaces(each)) {
- if (common.contains(interface)) return false;
- }
- return true;
- });
- }
-
- /// Applies [f] to each live class that implements [cls] _not_ including [cls]
- /// itself.
- void forEachStrictSubtypeOf(
- ClassEntity cls, IterationStep f(ClassEntity cls)) {
- ClassSet classSet = _classSets[cls];
- if (classSet == null) return;
- classSet.forEachSubtype(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
- strict: true);
- }
}
// Interface for testing equivalence of Kernel-based entities.
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 19e2aa3..9e91d03 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -31,7 +31,7 @@
import '../native/enqueue.dart' show NativeResolutionEnqueuer;
import '../native/resolver.dart';
import '../options.dart';
-import '../universe/class_hierarchy_builder.dart';
+import '../universe/class_hierarchy.dart';
import '../universe/world_builder.dart';
import '../universe/world_impact.dart';
import 'deferred_load.dart';
diff --git a/pkg/compiler/lib/src/source_file_provider.dart b/pkg/compiler/lib/src/source_file_provider.dart
index 7b4f019..c2d2fd0 100644
--- a/pkg/compiler/lib/src/source_file_provider.dart
+++ b/pkg/compiler/lib/src/source_file_provider.dart
@@ -465,10 +465,10 @@
BazelInputProvider(List<String> searchPaths)
: dirs = searchPaths.map(_resolve).toList();
- static _resolve(String path) => currentDirectory.resolve(path);
+ static Uri _resolve(String path) => currentDirectory.resolve(path);
@override
- Future<api.Input> readFromUri(Uri uri,
+ Future<api.Input<List<int>>> readFromUri(Uri uri,
{InputKind inputKind: InputKind.UTF8}) async {
var resolvedUri = uri;
var path = uri.path;
@@ -482,7 +482,8 @@
}
}
}
- api.Input result = await readBytesFromUri(resolvedUri, inputKind);
+ api.Input<List<int>> result =
+ await readBytesFromUri(resolvedUri, inputKind);
switch (inputKind) {
case InputKind.UTF8:
utf8SourceFiles[uri] = utf8SourceFiles[resolvedUri];
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index be3be29..795ed34 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -620,8 +620,8 @@
ConstructorBodyEntity constructorBody =
_elementMap.getConstructorBody(body);
if (!isCustomElement && // TODO(13836): Fix inlining.
- _tryInlineMethod(constructorBody, null, null, bodyCallInputs, node,
- sourceInformation)) {
+ _tryInlineMethod(constructorBody, null, null, bodyCallInputs, null,
+ node, sourceInformation)) {
pop();
} else {
_invokeConstructorBody(body, bodyCallInputs,
@@ -4100,7 +4100,8 @@
AbstractValue typeMask, List<DartType> typeArguments,
{SourceInformation sourceInformation, InterfaceType instanceType}) {
// TODO(redemption): Pass current node if needed.
- if (_tryInlineMethod(target, null, null, arguments, null, sourceInformation,
+ if (_tryInlineMethod(
+ target, null, null, arguments, typeArguments, null, sourceInformation,
instanceType: instanceType)) {
return;
}
@@ -4170,8 +4171,8 @@
!(element.isGetter && selector.isCall) &&
!(element.isFunction && selector.isGetter) &&
!isOptimizableOperation(selector, element)) {
- if (_tryInlineMethod(
- element, selector, mask, arguments, node, sourceInformation)) {
+ if (_tryInlineMethod(element, selector, mask, arguments, typeArguments,
+ node, sourceInformation)) {
return;
}
}
@@ -4988,6 +4989,7 @@
Selector selector,
AbstractValue mask,
List<HInstruction> providedArguments,
+ List<DartType> typeArguments,
ir.Node currentNode,
SourceInformation sourceInformation,
{InterfaceType instanceType}) {
@@ -5149,8 +5151,15 @@
}
void doInlining() {
- registry
- .registerStaticUse(new StaticUse.inlining(function, instanceType));
+ if (function.isConstructor) {
+ registry.registerStaticUse(
+ new StaticUse.constructorInlining(function, instanceType));
+ } else {
+ assert(instanceType == null,
+ "Unexpected instance type for $function: $instanceType");
+ registry.registerStaticUse(
+ new StaticUse.methodInlining(function, typeArguments));
+ }
// Add an explicit null check on the receiver before doing the
// inlining. We use [element] to get the same name in the
diff --git a/pkg/compiler/lib/src/ssa/kernel_impact.dart b/pkg/compiler/lib/src/ssa/kernel_impact.dart
index b5cd0b2..7f5367c 100644
--- a/pkg/compiler/lib/src/ssa/kernel_impact.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_impact.dart
@@ -234,21 +234,6 @@
@override
void visitIntLiteral(ir.IntLiteral literal) {
- // Check that this value can be precisely represented as a double, and throw
- // an error if not:
- if (new BigInt.from(literal.value) !=
- new BigInt.from(literal.value.toDouble())) {
- // TODO(efortuna): Switch to error message.
- reporter.reportWarningMessage(
- CURRENT_ELEMENT_SPANNABLE, MessageKind.GENERIC, {
- 'text': 'The integer literal '
- '${new BigInt.from(literal.value)} cannot be represented'
- ' exactly in JavaScript and will be rounded to '
- '${new BigInt.from(literal.value.toDouble())}. Use the rounded '
- 'value to avoid this warning.'
- });
- }
-
impactBuilder.registerConstantLiteral(new IntConstantExpression(
new BigInt.from(literal.value).toUnsigned(64)));
}
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index cd71861..a0ac620 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -665,7 +665,7 @@
node.typeArguments,
node.sourceInformation);
result.element = method;
- _registry.registerStaticUse(new StaticUse.inlining(method, null));
+ _registry.registerStaticUse(new StaticUse.methodInlining(method, null));
return result;
}
@@ -927,7 +927,24 @@
}
HInstruction visitTypeConversion(HTypeConversion node) {
- return node.isRedundant(_closedWorld) ? node.checkedInput : node;
+ if (node.isRedundant(_closedWorld)) return node.checkedInput;
+
+ // Simplify 'as T' where T is a simple type.
+ DartType checkedType = node.typeExpression;
+ if (checkedType is TypeVariableType && node.inputs.length == 2) {
+ HInstruction rep = node.typeRepresentation;
+ if (rep is HTypeInfoExpression &&
+ rep.kind == TypeInfoExpressionKind.COMPLETE &&
+ rep.inputs.isEmpty) {
+ DartType type = rep.dartType;
+ if (type.isInterfaceType && type.treatAsRaw) {
+ return node.checkedInput.convertType(_closedWorld, type, node.kind)
+ ..sourceInformation = node.sourceInformation;
+ }
+ }
+ }
+
+ return node;
}
HInstruction visitTypeKnown(HTypeKnown node) {
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy.dart b/pkg/compiler/lib/src/universe/class_hierarchy.dart
new file mode 100644
index 0000000..f19320a
--- /dev/null
+++ b/pkg/compiler/lib/src/universe/class_hierarchy.dart
@@ -0,0 +1,543 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../common.dart';
+import '../common_elements.dart';
+import '../elements/entities.dart';
+import '../elements/types.dart' show InterfaceType;
+import 'class_set.dart';
+
+// TODO(johnniwinther): Move more methods from `JClosedWorld` to
+// `ClassHierarchy`.
+abstract class ClassHierarchy {
+ /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
+ /// of known classes.
+ ///
+ /// This method is only provided for testing. For queries on classes, use the
+ /// methods defined in [JClosedWorld].
+ ClassHierarchyNode getClassHierarchyNode(ClassEntity cls);
+
+ /// Returns [ClassSet] for [cls] used to model the extends and implements
+ /// relations of known classes.
+ ///
+ /// This method is only provided for testing. For queries on classes, use the
+ /// methods defined in [JClosedWorld].
+ ClassSet getClassSet(ClassEntity cls);
+
+ /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
+ /// instance of [y].
+ bool isSubtypeOf(ClassEntity x, ClassEntity y);
+
+ /// Returns a [SubclassResult] for the subclasses that are contained in
+ /// the subclass/subtype sets of both [cls1] and [cls2].
+ ///
+ /// Classes that are implied by included superclasses/supertypes are not
+ /// returned.
+ ///
+ /// For instance for this hierarchy
+ ///
+ /// class A {}
+ /// class B {}
+ /// class C implements A, B {}
+ /// class D extends C {}
+ ///
+ /// the query
+ ///
+ /// commonSubclasses(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE)
+ ///
+ /// return the set {C} because [D] is implied by [C].
+ SubclassResult commonSubclasses(
+ ClassEntity cls1, ClassQuery query1, ClassEntity cls2, ClassQuery query2);
+
+ /// Returns an iterable over the directly instantiated that implement [cls]
+ /// possibly including [cls] itself, if it is live.
+ Iterable<ClassEntity> subtypesOf(ClassEntity cls);
+
+ /// Returns an iterable over the live classes that extend [cls] including
+ /// [cls] itself.
+ Iterable<ClassEntity> subclassesOf(ClassEntity cls);
+
+ /// Applies [f] to each live class that implements [cls] _not_ including [cls]
+ /// itself.
+ void forEachStrictSubtypeOf(
+ ClassEntity cls, IterationStep f(ClassEntity cls));
+}
+
+class ClassHierarchyImpl implements ClassHierarchy {
+ final CommonElements _commonElements;
+ final Map<ClassEntity, ClassHierarchyNode> _classHierarchyNodes;
+ final Map<ClassEntity, ClassSet> _classSets;
+
+ ClassHierarchyImpl(
+ this._commonElements, this._classHierarchyNodes, this._classSets);
+
+ /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
+ /// of known classes.
+ ///
+ /// This method is only provided for testing. For queries on classes, use the
+ /// methods defined in [JClosedWorld].
+ ClassHierarchyNode getClassHierarchyNode(ClassEntity cls) {
+ return _classHierarchyNodes[cls];
+ }
+
+ /// Returns [ClassSet] for [cls] used to model the extends and implements
+ /// relations of known classes.
+ ///
+ /// This method is only provided for testing. For queries on classes, use the
+ /// methods defined in [JClosedWorld].
+ ClassSet getClassSet(ClassEntity cls) {
+ return _classSets[cls];
+ }
+
+ /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
+ /// instance of [y].
+ bool isSubtypeOf(ClassEntity x, ClassEntity y) {
+ ClassSet classSet = _classSets[y];
+ assert(classSet != null,
+ failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${_classSets}"));
+ ClassHierarchyNode classHierarchyNode = _classHierarchyNodes[x];
+ assert(classHierarchyNode != null,
+ failedAt(x, "No ClassHierarchyNode for $x"));
+ return classSet.hasSubtype(classHierarchyNode);
+ }
+
+ /// Return `true` if [x] is a (non-strict) subclass of [y].
+ bool isSubclassOf(ClassEntity x, ClassEntity y) {
+ return _classHierarchyNodes[y].hasSubclass(_classHierarchyNodes[x]);
+ }
+
+ /// Returns an iterable over the directly instantiated that implement [cls]
+ /// possibly including [cls] itself, if it is live.
+ Iterable<ClassEntity> subtypesOf(ClassEntity cls) {
+ ClassSet classSet = _classSets[cls];
+ if (classSet == null) {
+ return const <ClassEntity>[];
+ } else {
+ return classSet
+ .subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
+ }
+ }
+
+ /// Returns an iterable over the directly instantiated classes that extend
+ /// [cls] possibly including [cls] itself, if it is live.
+ Iterable<ClassEntity> subclassesOf(ClassEntity cls) {
+ ClassHierarchyNode hierarchy = _classHierarchyNodes[cls];
+ if (hierarchy == null) return const <ClassEntity>[];
+ return hierarchy
+ .subclassesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED);
+ }
+
+ /// Returns an iterable over the directly instantiated that implement [cls]
+ /// _not_ including [cls].
+ Iterable<ClassEntity> strictSubtypesOf(ClassEntity cls) {
+ ClassSet classSet = _classSets[cls];
+ if (classSet == null) {
+ return const <ClassEntity>[];
+ } else {
+ return classSet.subtypesByMask(ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+ strict: true);
+ }
+ }
+
+ /// Returns an iterable over the directly instantiated classes that extend
+ /// [cls] _not_ including [cls] itself.
+ Iterable<ClassEntity> strictSubclassesOf(ClassEntity cls) {
+ ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
+ if (subclasses == null) return const <ClassEntity>[];
+ return subclasses.subclassesByMask(
+ ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+ strict: true);
+ }
+
+ /// Applies [f] to each live class that extend [cls] _not_ including [cls]
+ /// itself.
+ void forEachStrictSubclassOf(
+ ClassEntity cls, IterationStep f(ClassEntity cls)) {
+ ClassHierarchyNode subclasses = _classHierarchyNodes[cls];
+ if (subclasses == null) return;
+ subclasses.forEachSubclass(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+ strict: true);
+ }
+
+ /// Applies [f] to each live class that implements [cls] _not_ including [cls]
+ /// itself.
+ void forEachStrictSubtypeOf(
+ ClassEntity cls, IterationStep f(ClassEntity cls)) {
+ ClassSet classSet = _classSets[cls];
+ if (classSet == null) return;
+ classSet.forEachSubtype(f, ClassHierarchyNode.EXPLICITLY_INSTANTIATED,
+ strict: true);
+ }
+
+ SubclassResult commonSubclasses(ClassEntity cls1, ClassQuery query1,
+ ClassEntity cls2, ClassQuery query2) {
+ if (query1 == ClassQuery.EXACT && query2 == ClassQuery.EXACT) {
+ // Exact classes [cls1] and [cls2] must be identical to have any classes
+ // in common.
+ if (cls1 != cls2) {
+ return const SubclassResult.empty();
+ }
+ return new SubclassResult.exact(cls1);
+ } else if (query1 == ClassQuery.EXACT) {
+ if (query2 == ClassQuery.SUBCLASS) {
+ // Exact [cls1] must be a subclass of [cls2] to have any classes in
+ // common.
+ if (isSubclassOf(cls1, cls2)) {
+ return new SubclassResult.exact(cls1);
+ }
+ } else if (query2 == ClassQuery.SUBTYPE) {
+ // Exact [cls1] must be a subtype of [cls2] to have any classes in
+ // common.
+ if (isSubtypeOf(cls1, cls2)) {
+ return new SubclassResult.exact(cls1);
+ }
+ }
+ return const SubclassResult.empty();
+ } else if (query2 == ClassQuery.EXACT) {
+ if (query1 == ClassQuery.SUBCLASS) {
+ // Exact [cls2] must be a subclass of [cls1] to have any classes in
+ // common.
+ if (isSubclassOf(cls2, cls1)) {
+ return new SubclassResult.exact(cls2);
+ }
+ } else if (query1 == ClassQuery.SUBTYPE) {
+ // Exact [cls2] must be a subtype of [cls1] to have any classes in
+ // common.
+ if (isSubtypeOf(cls2, cls1)) {
+ return new SubclassResult.exact(cls2);
+ }
+ }
+ return const SubclassResult.empty();
+ } else if (query1 == ClassQuery.SUBCLASS && query2 == ClassQuery.SUBCLASS) {
+ // [cls1] must be a subclass of [cls2] or vice versa to have any classes
+ // in common.
+ if (cls1 == cls2 || isSubclassOf(cls1, cls2)) {
+ // The subclasses of [cls1] are contained within the subclasses of
+ // [cls2].
+ return new SubclassResult.subclass(cls1);
+ } else if (isSubclassOf(cls2, cls1)) {
+ // The subclasses of [cls2] are contained within the subclasses of
+ // [cls1].
+ return new SubclassResult.subclass(cls2);
+ }
+ return const SubclassResult.empty();
+ } else if (query1 == ClassQuery.SUBCLASS) {
+ if (isSubtypeOf(cls1, cls2)) {
+ // The subclasses of [cls1] are all subtypes of [cls2].
+ return new SubclassResult.subclass(cls1);
+ }
+ if (cls1 == _commonElements.objectClass) {
+ // Since [cls1] is `Object` all subtypes of [cls2] are contained within
+ // the subclasses of [cls1].
+ return new SubclassResult.subtype(cls2);
+ }
+ // Find all the root subclasses of [cls1] of that implement [cls2].
+ //
+ // For this hierarchy:
+ //
+ // class I {}
+ // class A {}
+ // class B extends A implements I {}
+ // class C extends B {}
+ // class D extends A implements I {}
+ //
+ // the common subclasses of "subclass of A" and "subtype of I" returns
+ // "subclasses of {B, D}". The inclusion of class `C` is implied because
+ // it is a subclass of `B`.
+ List<ClassEntity> classes = <ClassEntity>[];
+ forEachStrictSubclassOf(cls1, (ClassEntity subclass) {
+ if (isSubtypeOf(subclass, cls2)) {
+ classes.add(subclass);
+ // Skip subclasses of [subclass]; they all implement [cls2] by
+ // inheritance and are included in the subclasses of [subclass].
+ return IterationStep.SKIP_SUBCLASSES;
+ }
+ return IterationStep.CONTINUE;
+ });
+ return new SubclassResult.subclasses(classes);
+ } else if (query2 == ClassQuery.SUBCLASS) {
+ if (isSubtypeOf(cls2, cls1)) {
+ // The subclasses of [cls2] are all subtypes of [cls1].
+ return new SubclassResult.subclass(cls2);
+ }
+ if (cls2 == _commonElements.objectClass) {
+ // Since [cls2] is `Object` all subtypes of [cls1] are contained within
+ // the subclasses of [cls2].
+ return new SubclassResult.subtype(cls1);
+ }
+ // Find all the root subclasses of [cls2] of that implement [cls1].
+ List<ClassEntity> classes = <ClassEntity>[];
+ forEachStrictSubclassOf(cls2, (ClassEntity subclass) {
+ if (isSubtypeOf(subclass, cls1)) {
+ classes.add(subclass);
+ // Skip subclasses of [subclass]; they all implement [cls1] by
+ // inheritance and are included in the subclasses of [subclass].
+ return IterationStep.SKIP_SUBCLASSES;
+ }
+ return IterationStep.CONTINUE;
+ });
+ return new SubclassResult.subclasses(classes);
+ } else {
+ if (cls1 == cls2 || isSubtypeOf(cls1, cls2)) {
+ // The subtypes of [cls1] are contained within the subtypes of [cls2].
+ return new SubclassResult.subtype(cls1);
+ } else if (isSubtypeOf(cls2, cls1)) {
+ // The subtypes of [cls2] are contained within the subtypes of [cls1].
+ return new SubclassResult.subtype(cls2);
+ }
+ // Find all the root subclasses of [cls1] of that implement [cls2].
+ //
+ // For this hierarchy:
+ //
+ // class I {}
+ // class A {}
+ // class B extends A implements I {}
+ // class C extends B {}
+ // class D extends A implements I {}
+ // class E implements B {}
+ // class F extends E {}
+ //
+ // the common subclasses of "subtype of A" and "subtype of I" returns
+ // "subclasses of {B, D, E}". The inclusion of classes `C` and `F` is
+ // implied because they are subclasses of `B` and `E`, respectively.
+ List<ClassEntity> classes = <ClassEntity>[];
+ forEachStrictSubtypeOf(cls1, (ClassEntity subclass) {
+ if (isSubtypeOf(subclass, cls2)) {
+ classes.add(subclass);
+ // Skip subclasses of [subclass]; they all implement [cls2] by
+ // inheritance and are included in the subclasses of [subclass].
+ return IterationStep.SKIP_SUBCLASSES;
+ }
+ return IterationStep.CONTINUE;
+ });
+ return new SubclassResult.subclasses(classes);
+ }
+ }
+}
+
+class ClassHierarchyBuilder {
+ // We keep track of subtype and subclass relationships in four
+ // distinct sets to make class hierarchy analysis faster.
+ final Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes =
+ <ClassEntity, ClassHierarchyNode>{};
+ final Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{};
+ final Map<ClassEntity, Set<ClassEntity>> mixinUses =
+ new Map<ClassEntity, Set<ClassEntity>>();
+
+ final CommonElements _commonElements;
+ final ClassQueries _classQueries;
+
+ ClassHierarchyBuilder(this._commonElements, this._classQueries);
+
+ void registerClass(ClassEntity cls) {
+ _ensureClassSet(_classQueries.getDeclaration(cls));
+ }
+
+ ClassHierarchyNode _ensureClassHierarchyNode(ClassEntity cls) {
+ assert(_classQueries.checkClass(cls));
+ return classHierarchyNodes.putIfAbsent(cls, () {
+ ClassHierarchyNode parentNode;
+ ClassEntity superclass = _classQueries.getSuperClass(cls);
+ if (superclass != null) {
+ parentNode = _ensureClassHierarchyNode(superclass);
+ }
+ return new ClassHierarchyNode(
+ parentNode, cls, _classQueries.getHierarchyDepth(cls));
+ });
+ }
+
+ ClassSet _ensureClassSet(ClassEntity cls) {
+ assert(_classQueries.checkClass(cls));
+ return classSets.putIfAbsent(cls, () {
+ ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
+ ClassSet classSet = new ClassSet(node);
+
+ for (InterfaceType type in _classQueries.getSupertypes(cls)) {
+ // TODO(johnniwinther): Optimization: Avoid adding [cls] to
+ // superclasses.
+ ClassSet subtypeSet = _ensureClassSet(type.element);
+ subtypeSet.addSubtype(node);
+ }
+
+ ClassEntity appliedMixin = _classQueries.getAppliedMixin(cls);
+ while (appliedMixin != null) {
+ // TODO(johnniwinther): Use the data stored in [ClassSet].
+ registerMixinUse(cls, appliedMixin);
+ ClassSet mixinSet = _ensureClassSet(appliedMixin);
+ mixinSet.addMixinApplication(node);
+
+ // In case of
+ //
+ // class A {}
+ // class B = Object with A;
+ // class C = Object with B;
+ //
+ // we need to register that C not only mixes in B but also A.
+ appliedMixin = _classQueries.getAppliedMixin(appliedMixin);
+ }
+ return classSet;
+ });
+ }
+
+ void _updateSuperClassHierarchyNodeForClass(ClassHierarchyNode node) {
+ // Ensure that classes implicitly implementing `Function` are in its
+ // subtype set.
+ ClassEntity cls = node.cls;
+ if (cls != _commonElements.functionClass &&
+ _classQueries.implementsFunction(cls)) {
+ ClassSet subtypeSet = _ensureClassSet(_commonElements.functionClass);
+ subtypeSet.addSubtype(node);
+ }
+ if (!node.isInstantiated && node.parentNode != null) {
+ _updateSuperClassHierarchyNodeForClass(node.parentNode);
+ }
+ }
+
+ void updateClassHierarchyNodeForClass(ClassEntity cls,
+ {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
+ ClassHierarchyNode node = _ensureClassSet(cls).node;
+ _updateSuperClassHierarchyNodeForClass(node);
+ if (directlyInstantiated) {
+ node.isDirectlyInstantiated = true;
+ }
+ if (abstractlyInstantiated) {
+ node.isAbstractlyInstantiated = true;
+ }
+ }
+
+ void registerMixinUse(ClassEntity mixinApplication, ClassEntity mixin) {
+ // TODO(johnniwinther): Add map restricted to live classes.
+ // We don't support patch classes as mixin.
+ Set<ClassEntity> users =
+ mixinUses.putIfAbsent(mixin, () => new Set<ClassEntity>());
+ users.add(mixinApplication);
+ }
+
+ bool _isSubtypeOf(ClassEntity x, ClassEntity y) {
+ assert(
+ classSets.containsKey(x), "ClassSet for $x has not been computed yet.");
+ ClassSet classSet = classSets[y];
+ assert(classSet != null,
+ failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${classSets}"));
+ ClassHierarchyNode classHierarchyNode = classHierarchyNodes[x];
+ assert(classHierarchyNode != null,
+ failedAt(x, "No ClassHierarchyNode for $x"));
+ return classSet.hasSubtype(classHierarchyNode);
+ }
+
+ bool isInheritedInSubtypeOf(ClassEntity x, ClassEntity y) {
+ ClassSet classSet = classSets[x];
+ assert(classSet != null,
+ failedAt(x, "No ClassSet for $x (${x.runtimeType}): ${classSets}"));
+
+ if (_isSubtypeOf(x, y)) {
+ // [x] implements [y] itself, possible through supertypes.
+ return true;
+ }
+
+ /// Returns `true` if any live subclass of [node] implements [y].
+ bool subclassImplements(ClassHierarchyNode node, {bool strict}) {
+ return node.anySubclass((ClassEntity z) => _isSubtypeOf(z, y),
+ ClassHierarchyNode.INSTANTIATED,
+ strict: strict);
+ }
+
+ if (subclassImplements(classSet.node, strict: true)) {
+ // A subclass of [x] implements [y].
+ return true;
+ }
+
+ for (ClassHierarchyNode mixinApplication
+ in classSet.mixinApplicationNodes) {
+ if (subclassImplements(mixinApplication, strict: false)) {
+ // A subclass of [mixinApplication] implements [y].
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
+abstract class ClassQueries {
+ bool checkClass(covariant ClassEntity cls);
+ bool validateClass(covariant ClassEntity cls);
+
+ /// Returns the declaration of [cls].
+ ClassEntity getDeclaration(covariant ClassEntity cls);
+
+ /// Returns the class mixed into [cls] if any.
+ // TODO(johnniwinther): Replace this by a `getAppliedMixins` function that
+ // return transitively mixed in classes like in:
+ // class A {}
+ // class B = Object with A;
+ // class C = Object with B;
+ ClassEntity getAppliedMixin(covariant ClassEntity cls);
+
+ /// Returns the hierarchy depth of [cls].
+ int getHierarchyDepth(covariant ClassEntity cls);
+
+ /// Returns `true` if [cls] implements `Function` either explicitly or through
+ /// a `call` method.
+ bool implementsFunction(covariant ClassEntity cls);
+
+ /// Returns the superclass of [cls] if any.
+ ClassEntity getSuperClass(covariant ClassEntity cls);
+
+ /// Returns all supertypes of [cls].
+ Iterable<InterfaceType> getSupertypes(covariant ClassEntity cls);
+}
+
+/// Enum values defining subset of classes included in queries.
+enum ClassQuery {
+ /// Only the class itself is included.
+ EXACT,
+
+ /// The class and all subclasses (transitively) are included.
+ SUBCLASS,
+
+ /// The class and all classes that implement or subclass it (transitively)
+ /// are included.
+ SUBTYPE,
+}
+
+/// Result computed in [ClassHierarchy.commonSubclasses].
+class SubclassResult {
+ /// The classes in the result set. The classes are always disjoint wrt. the
+ /// interpretation of [query].
+ final List<ClassEntity> classes;
+
+ /// How [classes] should be interpreted: If `ClassQuery.EXACT`, only the
+ /// classes in [classes] are on the result set. If `ClassQuery.SUBCLASS`,
+ /// non-strict subclasses of the classes in [classes] are in the result set.
+ /// If `ClassQuery.SUBTYPE`, non-strict subtypes of the classes in [classes]
+ /// are in the result set.
+ final ClassQuery query;
+
+ /// Creates the empty result set.
+ const SubclassResult.empty()
+ : query = ClassQuery.EXACT,
+ classes = const <ClassEntity>[];
+
+ /// Creates the single set of [cls].
+ SubclassResult.exact(ClassEntity cls)
+ : query = ClassQuery.EXACT,
+ classes = <ClassEntity>[cls];
+
+ /// Creates the set of subclasses of [cls].
+ SubclassResult.subclass(ClassEntity cls)
+ : query = ClassQuery.SUBCLASS,
+ classes = <ClassEntity>[cls];
+
+ /// Creates the set of subtypes of [cls].
+ SubclassResult.subtype(ClassEntity cls)
+ : query = ClassQuery.SUBTYPE,
+ classes = <ClassEntity>[cls];
+
+ /// Creates the set of classes that are subclasses of a class in [classes].
+ SubclassResult.subclasses(this.classes) : query = ClassQuery.SUBCLASS;
+
+ SubclassResult.internal(this.query, this.classes);
+
+ String toString() => 'SubclassResult($query,$classes)';
+}
diff --git a/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart b/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart
deleted file mode 100644
index 337975f..0000000
--- a/pkg/compiler/lib/src/universe/class_hierarchy_builder.dart
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import '../common.dart';
-import '../common_elements.dart';
-import '../elements/entities.dart';
-import '../elements/types.dart' show InterfaceType;
-import 'class_set.dart';
-
-class ClassHierarchyBuilder {
- // We keep track of subtype and subclass relationships in four
- // distinct sets to make class hierarchy analysis faster.
- final Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes =
- <ClassEntity, ClassHierarchyNode>{};
- final Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{};
- final Map<ClassEntity, Set<ClassEntity>> mixinUses =
- new Map<ClassEntity, Set<ClassEntity>>();
-
- final CommonElements _commonElements;
- final ClassQueries _classQueries;
-
- ClassHierarchyBuilder(this._commonElements, this._classQueries);
-
- void registerClass(ClassEntity cls) {
- _ensureClassSet(_classQueries.getDeclaration(cls));
- }
-
- ClassHierarchyNode _ensureClassHierarchyNode(ClassEntity cls) {
- assert(_classQueries.checkClass(cls));
- return classHierarchyNodes.putIfAbsent(cls, () {
- ClassHierarchyNode parentNode;
- ClassEntity superclass = _classQueries.getSuperClass(cls);
- if (superclass != null) {
- parentNode = _ensureClassHierarchyNode(superclass);
- }
- return new ClassHierarchyNode(
- parentNode, cls, _classQueries.getHierarchyDepth(cls));
- });
- }
-
- ClassSet _ensureClassSet(ClassEntity cls) {
- assert(_classQueries.checkClass(cls));
- return classSets.putIfAbsent(cls, () {
- ClassHierarchyNode node = _ensureClassHierarchyNode(cls);
- ClassSet classSet = new ClassSet(node);
-
- for (InterfaceType type in _classQueries.getSupertypes(cls)) {
- // TODO(johnniwinther): Optimization: Avoid adding [cls] to
- // superclasses.
- ClassSet subtypeSet = _ensureClassSet(type.element);
- subtypeSet.addSubtype(node);
- }
-
- ClassEntity appliedMixin = _classQueries.getAppliedMixin(cls);
- while (appliedMixin != null) {
- // TODO(johnniwinther): Use the data stored in [ClassSet].
- registerMixinUse(cls, appliedMixin);
- ClassSet mixinSet = _ensureClassSet(appliedMixin);
- mixinSet.addMixinApplication(node);
-
- // In case of
- //
- // class A {}
- // class B = Object with A;
- // class C = Object with B;
- //
- // we need to register that C not only mixes in B but also A.
- appliedMixin = _classQueries.getAppliedMixin(appliedMixin);
- }
- return classSet;
- });
- }
-
- void _updateSuperClassHierarchyNodeForClass(ClassHierarchyNode node) {
- // Ensure that classes implicitly implementing `Function` are in its
- // subtype set.
- ClassEntity cls = node.cls;
- if (cls != _commonElements.functionClass &&
- _classQueries.implementsFunction(cls)) {
- ClassSet subtypeSet = _ensureClassSet(_commonElements.functionClass);
- subtypeSet.addSubtype(node);
- }
- if (!node.isInstantiated && node.parentNode != null) {
- _updateSuperClassHierarchyNodeForClass(node.parentNode);
- }
- }
-
- void updateClassHierarchyNodeForClass(ClassEntity cls,
- {bool directlyInstantiated: false, bool abstractlyInstantiated: false}) {
- ClassHierarchyNode node = _ensureClassSet(cls).node;
- _updateSuperClassHierarchyNodeForClass(node);
- if (directlyInstantiated) {
- node.isDirectlyInstantiated = true;
- }
- if (abstractlyInstantiated) {
- node.isAbstractlyInstantiated = true;
- }
- }
-
- void registerMixinUse(ClassEntity mixinApplication, ClassEntity mixin) {
- // TODO(johnniwinther): Add map restricted to live classes.
- // We don't support patch classes as mixin.
- Set<ClassEntity> users =
- mixinUses.putIfAbsent(mixin, () => new Set<ClassEntity>());
- users.add(mixinApplication);
- }
-
- bool _isSubtypeOf(ClassEntity x, ClassEntity y) {
- assert(
- classSets.containsKey(x), "ClassSet for $x has not been computed yet.");
- ClassSet classSet = classSets[y];
- assert(classSet != null,
- failedAt(y, "No ClassSet for $y (${y.runtimeType}): ${classSets}"));
- ClassHierarchyNode classHierarchyNode = classHierarchyNodes[x];
- assert(classHierarchyNode != null,
- failedAt(x, "No ClassHierarchyNode for $x"));
- return classSet.hasSubtype(classHierarchyNode);
- }
-
- bool isInheritedInSubtypeOf(ClassEntity x, ClassEntity y) {
- ClassSet classSet = classSets[x];
- assert(classSet != null,
- failedAt(x, "No ClassSet for $x (${x.runtimeType}): ${classSets}"));
-
- if (_isSubtypeOf(x, y)) {
- // [x] implements [y] itself, possible through supertypes.
- return true;
- }
-
- /// Returns `true` if any live subclass of [node] implements [y].
- bool subclassImplements(ClassHierarchyNode node, {bool strict}) {
- return node.anySubclass((ClassEntity z) => _isSubtypeOf(z, y),
- ClassHierarchyNode.INSTANTIATED,
- strict: strict);
- }
-
- if (subclassImplements(classSet.node, strict: true)) {
- // A subclass of [x] implements [y].
- return true;
- }
-
- for (ClassHierarchyNode mixinApplication
- in classSet.mixinApplicationNodes) {
- if (subclassImplements(mixinApplication, strict: false)) {
- // A subclass of [mixinApplication] implements [y].
- return true;
- }
- }
- return false;
- }
-}
-
-abstract class ClassQueries {
- bool checkClass(covariant ClassEntity cls);
- bool validateClass(covariant ClassEntity cls);
-
- /// Returns the declaration of [cls].
- ClassEntity getDeclaration(covariant ClassEntity cls);
-
- /// Returns the class mixed into [cls] if any.
- // TODO(johnniwinther): Replace this by a `getAppliedMixins` function that
- // return transitively mixed in classes like in:
- // class A {}
- // class B = Object with A;
- // class C = Object with B;
- ClassEntity getAppliedMixin(covariant ClassEntity cls);
-
- /// Returns the hierarchy depth of [cls].
- int getHierarchyDepth(covariant ClassEntity cls);
-
- /// Returns `true` if [cls] implements `Function` either explicitly or through
- /// a `call` method.
- bool implementsFunction(covariant ClassEntity cls);
-
- /// Returns the superclass of [cls] if any.
- ClassEntity getSuperClass(covariant ClassEntity cls);
-
- /// Returns all supertypes of [cls].
- Iterable<InterfaceType> getSupertypes(covariant ClassEntity cls);
-}
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index b0f526e..dc49fe5 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -445,6 +445,7 @@
}
break;
case StaticUseKind.INLINING:
+ registerStaticInvocation(staticUse);
break;
}
if (useSet.isNotEmpty) {
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index 8788342..0db511d 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -523,12 +523,18 @@
}
/// Inlining of [element].
- factory StaticUse.inlining(
- FunctionEntity element, InterfaceType instanceType) {
+ factory StaticUse.constructorInlining(
+ ConstructorEntity element, InterfaceType instanceType) {
return new StaticUse.internal(element, StaticUseKind.INLINING,
type: instanceType);
}
+ /// Inlining of [element].
+ factory StaticUse.methodInlining(
+ FunctionEntity element, List<DartType> typeArguments) {
+ return new GenericStaticUse.methodInlining(element, typeArguments);
+ }
+
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! StaticUse) return false;
@@ -540,7 +546,7 @@
}
String toString() =>
- 'StaticUse($element,$kind,$type,' '$typeArguments,$callStructure)';
+ 'StaticUse($element,$kind,$type,$typeArguments,$callStructure)';
}
class GenericStaticUse extends StaticUse {
@@ -559,6 +565,10 @@
"${callStructure?.typeArgumentCount ?? 0} but "
"${typeArguments?.length ?? 0} were passed."));
}
+
+ GenericStaticUse.methodInlining(FunctionEntity entity, this.typeArguments)
+ : super.internal(entity, StaticUseKind.INLINING,
+ typeArgumentsHash: Hashing.listHash(typeArguments));
}
enum TypeUseKind {
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index c1bf88d..2417fd3 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -28,7 +28,7 @@
import '../util/enumset.dart';
import '../util/util.dart';
import '../world.dart' show World, JClosedWorld, KClosedWorld, OpenWorld;
-import 'class_hierarchy_builder.dart' show ClassHierarchyBuilder, ClassQueries;
+import 'class_hierarchy.dart' show ClassHierarchyBuilder, ClassQueries;
import 'selector.dart' show Selector;
import 'use.dart'
show
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 2a33f49..d440deb 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -23,6 +23,7 @@
import 'ordered_typeset.dart';
import 'options.dart';
import 'types/abstract_value_domain.dart';
+import 'universe/class_hierarchy.dart';
import 'universe/class_set.dart';
import 'universe/function_set.dart' show FunctionSet;
import 'universe/selector.dart' show Selector;
@@ -68,6 +69,8 @@
Iterable<MemberEntity> get processedMembers;
+ ClassHierarchy get classHierarchy;
+
/// Returns `true` if [cls] is either directly or indirectly instantiated.
bool isInstantiated(ClassEntity cls);
@@ -172,27 +175,6 @@
/// Returns an iterable over the common supertypes of the [classes].
Iterable<ClassEntity> commonSupertypesOf(Iterable<ClassEntity> classes);
- /// Returns an iterable of the classes that are contained in the
- /// strict subclass/subtype sets of both [cls1] and [cls2].
- ///
- /// Classes that are implied by included superclasses/supertypes are not
- /// returned.
- ///
- /// For instance for this hierarchy
- ///
- /// class A {}
- /// class B {}
- /// class C implements A, B {}
- /// class D extends C {}
- ///
- /// the query
- ///
- /// commonSubclasses(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE)
- ///
- /// return the set {C} because [D] is implied by [C].
- Iterable<ClassEntity> commonSubclasses(
- ClassEntity cls1, ClassQuery query1, ClassEntity cls2, ClassQuery query2);
-
/// Returns an iterable over the live mixin applications that mixin [cls].
Iterable<ClassEntity> mixinUsesOf(ClassEntity cls);
@@ -355,19 +337,6 @@
bool isInheritedInSubtypeOf(MemberEntity member, ClassEntity type);
}
-/// Enum values defining subset of classes included in queries.
-enum ClassQuery {
- /// Only the class itself is included.
- EXACT,
-
- /// The class and all subclasses (transitively) are included.
- SUBCLASS,
-
- /// The class and all classes that implement or subclass it (transitively)
- /// are included.
- SUBTYPE,
-}
-
abstract class ClosedWorldBase implements JClosedWorld {
final ConstantSystem constantSystem;
final NativeData nativeData;
@@ -404,6 +373,8 @@
final Iterable<MemberEntity> processedMembers;
+ final ClassHierarchy classHierarchy;
+
ClosedWorldBase(
this.elementEnvironment,
this.dartTypes,
@@ -425,7 +396,9 @@
AbstractValueStrategy abstractValueStrategy)
: this._implementedClasses = implementedClasses,
this._classHierarchyNodes = classHierarchyNodes,
- this._classSets = classSets {}
+ this._classSets = classSets,
+ classHierarchy = new ClassHierarchyImpl(
+ commonElements, classHierarchyNodes, classSets) {}
bool checkEntity(covariant Entity element);
@@ -665,27 +638,6 @@
return classSet != null ? classSet.getLubOfInstantiatedSubtypes() : null;
}
- Set<ClassEntity> _commonContainedClasses(ClassEntity cls1, ClassQuery query1,
- ClassEntity cls2, ClassQuery query2) {
- Iterable<ClassEntity> xSubset = _containedSubset(cls1, query1);
- if (xSubset == null) return null;
- Iterable<ClassEntity> ySubset = _containedSubset(cls2, query2);
- if (ySubset == null) return null;
- return xSubset.toSet().intersection(ySubset.toSet());
- }
-
- Iterable<ClassEntity> _containedSubset(ClassEntity cls, ClassQuery query) {
- switch (query) {
- case ClassQuery.EXACT:
- return null;
- case ClassQuery.SUBCLASS:
- return strictSubclassesOf(cls);
- case ClassQuery.SUBTYPE:
- return strictSubtypesOf(cls);
- }
- throw new ArgumentError('Unexpected query: $query.');
- }
-
/// Returns `true` if [cls] is mixed into a live class.
bool isUsedAsMixin(ClassEntity cls) {
return !mixinUsesOf(cls).isEmpty;
@@ -809,38 +761,6 @@
return commonSupertypes;
}
- Iterable<ClassEntity> commonSubclasses(ClassEntity cls1, ClassQuery query1,
- ClassEntity cls2, ClassQuery query2) {
- // TODO(johnniwinther): Use [ClassSet] to compute this.
- // Compute the set of classes that are contained in both class subsets.
- Set<ClassEntity> common =
- _commonContainedClasses(cls1, query1, cls2, query2);
- if (common == null || common.isEmpty) return const <ClassEntity>[];
- // Narrow down the candidates by only looking at common classes
- // that do not have a superclass or supertype that will be a
- // better candidate.
- return common.where((ClassEntity each) {
- bool containsSuperclass = common.contains(getSuperClass(each));
- // If the superclass is also a candidate, then we don't want to
- // deal with this class. If we're only looking for a subclass we
- // know we don't have to look at the list of interfaces because
- // they can never be in the common set.
- if (containsSuperclass ||
- query1 == ClassQuery.SUBCLASS ||
- query2 == ClassQuery.SUBCLASS) {
- return !containsSuperclass;
- }
- // Run through the direct supertypes of the class. If the common
- // set contains the direct supertype of the class, we ignore the
- // the class because the supertype is a better candidate.
-
- for (ClassEntity interface in getInterfaces(each)) {
- if (common.contains(interface)) return false;
- }
- return true;
- });
- }
-
/// Returns an iterable over the live mixin applications that mixin [cls].
Iterable<ClassEntity> mixinUsesOf(ClassEntity cls) {
if (_liveMixinUses == null) {
@@ -1037,23 +957,11 @@
InterceptorData get interceptorData;
ElementEnvironment get elementEnvironment;
CommonElements get commonElements;
+ ClassHierarchy get classHierarchy;
/// Returns `true` if [cls] is implemented by an instantiated class.
bool isImplemented(ClassEntity cls);
- /// Returns [ClassHierarchyNode] for [cls] used to model the class hierarchies
- /// of known classes.
- ///
- /// This method is only provided for testing. For queries on classes, use the
- /// methods defined in [JClosedWorld].
- ClassHierarchyNode getClassHierarchyNode(ClassEntity cls);
-
- /// Returns [ClassSet] for [cls] used to model the extends and implements
- /// relations of known classes.
- ///
- /// This method is only provided for testing. For queries on classes, use the
- /// methods defined in [JClosedWorld].
- ClassSet getClassSet(ClassEntity cls);
Iterable<MemberEntity> get liveInstanceMembers;
Map<ClassEntity, Set<ClassEntity>> get mixinUses;
Map<ClassEntity, Set<ClassEntity>> get typesImplementedBySubclasses;
@@ -1065,42 +973,4 @@
Iterable<MemberEntity> get processedMembers;
RuntimeTypesNeed get rtiNeed;
NoSuchMethodData get noSuchMethodData;
-
- /// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
- /// instance of [y].
- bool isSubtypeOf(ClassEntity x, ClassEntity y);
-
- /// Returns an iterable of the classes that are contained in the
- /// strict subclass/subtype sets of both [cls1] and [cls2].
- ///
- /// Classes that are implied by included superclasses/supertypes are not
- /// returned.
- ///
- /// For instance for this hierarchy
- ///
- /// class A {}
- /// class B {}
- /// class C implements A, B {}
- /// class D extends C {}
- ///
- /// the query
- ///
- /// commonSubclasses(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE)
- ///
- /// return the set {C} because [D] is implied by [C].
- Iterable<ClassEntity> commonSubclasses(
- ClassEntity cls1, ClassQuery query1, ClassEntity cls2, ClassQuery query2);
-
- /// Returns an iterable over the directly instantiated that implement [cls]
- /// possibly including [cls] itself, if it is live.
- Iterable<ClassEntity> subtypesOf(ClassEntity cls);
-
- /// Returns an iterable over the live classes that extend [cls] including
- /// [cls] itself.
- Iterable<ClassEntity> subclassesOf(ClassEntity cls);
-
- /// Applies [f] to each live class that implements [cls] _not_ including [cls]
- /// itself.
- void forEachStrictSubtypeOf(
- ClassEntity cls, IterationStep f(ClassEntity cls));
}
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 33329bb..56f5b5f 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -58,6 +58,9 @@
bool get nativeExtensionExpectsString => false;
@override
+ bool get errorOnUnexactWebIntLiterals => true;
+
+ @override
bool get enableNoSuchMethodForwarders => true;
@override
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index c6e5ab7..60f32c8 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -92,18 +92,26 @@
}
String sdkJsPath;
+ String requirePath;
+ String ddcSdk;
if (debug) {
var sdkRoot = path.dirname(path.dirname(ddcPath));
var buildDir = path.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out');
var genDir = path.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc');
- sdkJsPath = path.join(genDir, kernel ? 'kernel' : 'js', mod);
+ sdkJsPath = path.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc',
+ kernel ? 'kernel' : 'js', mod);
+ requirePath = path.join(sdkRoot, 'third_party', 'requirejs');
+ ddcSdk = path.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc',
+ kernel ? path.join('kernel', 'ddc_sdk.dill') : 'ddc_sdk.sum');
} else {
var suffix = kernel ? path.join('kernel', mod) : mod;
sdkJsPath = path.join(dartSdk, 'lib', 'dev_compiler', suffix);
+ requirePath = sdkJsPath;
+ ddcSdk = path.join(
+ dartSdk, 'lib', '_internal', kernel ? 'ddc_sdk.dill' : 'ddc_sdk.sum');
}
ProcessResult result;
if (kernel) {
- var ddcSdk = path.join(dartSdk, 'lib', '_internal', 'ddc_sdk.dill');
result = runDdc('dartdevk', [
'--modules=$mod',
'--dart-sdk-summary=$ddcSdk',
@@ -114,6 +122,7 @@
} else {
result = runDdc('dartdevc', [
'--modules=$mod',
+ '--dart-sdk-summary=$ddcSdk',
'--library-root=$libRoot',
'-o',
'$libRoot/$basename.js',
@@ -143,7 +152,7 @@
}
var html = """
-<script src='$sdkJsPath/require.js'></script>
+<script src='$requirePath/require.js'></script>
<script>
require.config({
baseUrl: '$libRoot',
diff --git a/pkg/dev_compiler/tool/ddc b/pkg/dev_compiler/tool/ddc
index 937accd..a34aabb 100755
--- a/pkg/dev_compiler/tool/ddc
+++ b/pkg/dev_compiler/tool/ddc
@@ -93,6 +93,7 @@
-o $LIBROOT/$BASENAME.js $*
fi
+export NODE_PATH
pushd $LIBROOT > /dev/null
# TODO(jmesserly): we could have this output the same content as the devtool
# script, so you could debug the output without recompiling?
diff --git a/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart b/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
index ca27f7f..16fc417 100644
--- a/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
@@ -9,7 +9,8 @@
import 'constructor_reference_builder.dart' show ConstructorReferenceBuilder;
abstract class MetadataBuilder<T extends TypeBuilder> {
- MetadataBuilder(Declaration parent, int charOffset);
+ final int charOffset;
+ MetadataBuilder(Declaration parent, this.charOffset);
factory MetadataBuilder.fromConstructor(
ConstructorReferenceBuilder constructorReference,
diff --git a/pkg/front_end/lib/src/fasta/deprecated_problems.dart b/pkg/front_end/lib/src/fasta/deprecated_problems.dart
index fd2e6dd..e197801 100644
--- a/pkg/front_end/lib/src/fasta/deprecated_problems.dart
+++ b/pkg/front_end/lib/src/fasta/deprecated_problems.dart
@@ -126,7 +126,7 @@
request = await client.postUrl(serverUri);
} on SocketException {
// Assume the crash logger isn't running.
- await client.close(force: true);
+ client.close(force: true);
return new Future<T>.error(
new Crash(uri, charOffset, error, trace), trace);
}
@@ -147,7 +147,7 @@
await note("\n${safeToString(e)}\n$s\n");
await note("\n\n\nFE::ERROR::$json\n\n\n");
}
- await client.close(force: true);
+ client.close(force: true);
await note("\n");
return new Future<T>.error(error, trace);
}
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 da38ef1..17e0074 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -215,6 +215,96 @@
message: r"""'await' can only be used in 'async' or 'async*' methods.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
+ String name,
+ String
+ name2)> templateBoundIssueViaCycleNonSimplicity = const Template<
+ Message Function(String name,
+ String name2)>(
+ messageTemplate:
+ r"""Generic type '#name' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through '#name2'.""",
+ tipTemplate:
+ r"""Try providing type arguments to '#name2' here or to some other raw types in the bounds along the reference chain.""",
+ withArguments: _withArgumentsBoundIssueViaCycleNonSimplicity);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name, String name2)>
+ codeBoundIssueViaCycleNonSimplicity =
+ const Code<Message Function(String name, String name2)>(
+ "BoundIssueViaCycleNonSimplicity",
+ templateBoundIssueViaCycleNonSimplicity,
+ analyzerCode: "STRONG_MODE_NOT_INSTANTIATED_BOUND",
+ dart2jsCode: "*fatal*",
+ severity: Severity.error);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsBoundIssueViaCycleNonSimplicity(
+ String name, String name2) {
+ return new Message(codeBoundIssueViaCycleNonSimplicity,
+ message:
+ """Generic type '${name}' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through '${name2}'.""",
+ tip: """Try providing type arguments to '${name2}' here or to some other raw types in the bounds along the reference chain.""",
+ arguments: {'name': name, 'name2': name2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
+ String
+ name)> templateBoundIssueViaLoopNonSimplicity = const Template<
+ Message Function(String name)>(
+ messageTemplate:
+ r"""Generic type '#name' can't be used without type arguments in the bounds of its own type variables.""",
+ tipTemplate: r"""Try providing type arguments to '#name' here.""",
+ withArguments: _withArgumentsBoundIssueViaLoopNonSimplicity);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeBoundIssueViaLoopNonSimplicity =
+ const Code<Message Function(String name)>("BoundIssueViaLoopNonSimplicity",
+ templateBoundIssueViaLoopNonSimplicity,
+ analyzerCode: "STRONG_MODE_NOT_INSTANTIATED_BOUND",
+ dart2jsCode: "*fatal*",
+ severity: Severity.error);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsBoundIssueViaLoopNonSimplicity(String name) {
+ return new Message(codeBoundIssueViaLoopNonSimplicity,
+ message:
+ """Generic type '${name}' can't be used without type arguments in the bounds of its own type variables.""",
+ tip: """Try providing type arguments to '${name}' here.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+ templateBoundIssueViaRawTypeWithNonSimpleBounds =
+ const Template<Message Function(String name)>(
+ messageTemplate:
+ r"""Generic type '#name' can't be used without type arguments in a type variable bound.""",
+ tipTemplate: r"""Try providing type arguments to '#name' here.""",
+ withArguments: _withArgumentsBoundIssueViaRawTypeWithNonSimpleBounds);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)>
+ codeBoundIssueViaRawTypeWithNonSimpleBounds =
+ const Code<Message Function(String name)>(
+ "BoundIssueViaRawTypeWithNonSimpleBounds",
+ templateBoundIssueViaRawTypeWithNonSimpleBounds,
+ analyzerCode: "STRONG_MODE_NOT_INSTANTIATED_BOUND",
+ dart2jsCode: "*fatal*",
+ severity: Severity.error);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsBoundIssueViaRawTypeWithNonSimpleBounds(String name) {
+ return new Message(codeBoundIssueViaRawTypeWithNonSimpleBounds,
+ message:
+ """Generic type '${name}' can't be used without type arguments in a type variable bound.""",
+ tip: """Try providing type arguments to '${name}' here.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeBreakOutsideOfLoop = messageBreakOutsideOfLoop;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -1001,6 +1091,32 @@
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(
+ String
+ string)> templateConstEvalNonConstantVariableGet = const Template<
+ Message Function(String string)>(
+ messageTemplate:
+ r"""The variable '#string' is not a constant, only constant expressions are allowed.""",
+ withArguments: _withArgumentsConstEvalNonConstantVariableGet);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string)>
+ codeConstEvalNonConstantVariableGet =
+ const Code<Message Function(String string)>(
+ "ConstEvalNonConstantVariableGet",
+ templateConstEvalNonConstantVariableGet,
+ analyzerCode: "NON_CONSTANT_VALUE_IN_INITIALIZER");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsConstEvalNonConstantVariableGet(String string) {
+ return new Message(codeConstEvalNonConstantVariableGet,
+ message:
+ """The variable '${string}' is not a constant, only constant expressions are allowed.""",
+ arguments: {'string': string});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
String string,
String
string2)> templateConstEvalZeroDivisor = const Template<
@@ -4541,6 +4657,51 @@
r"""Try removing the other directives, or moving them to the library for which this is a part.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<Message Function(String name)>
+ templateNonSimpleBoundViaReference =
+ const Template<Message Function(String name)>(
+ messageTemplate:
+ r"""Bound of this variable references raw type '#name'.""",
+ withArguments: _withArgumentsNonSimpleBoundViaReference);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeNonSimpleBoundViaReference =
+ const Code<Message Function(String name)>(
+ "NonSimpleBoundViaReference", templateNonSimpleBoundViaReference,
+ severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNonSimpleBoundViaReference(String name) {
+ return new Message(codeNonSimpleBoundViaReference,
+ message: """Bound of this variable references raw type '${name}'.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
+ String
+ name)> templateNonSimpleBoundViaVariable = const Template<
+ Message Function(String name)>(
+ messageTemplate:
+ r"""Bound of this variable references variable '#name' from the same declaration.""",
+ withArguments: _withArgumentsNonSimpleBoundViaVariable);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeNonSimpleBoundViaVariable =
+ const Code<Message Function(String name)>(
+ "NonSimpleBoundViaVariable", templateNonSimpleBoundViaVariable,
+ severity: Severity.context);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsNonSimpleBoundViaVariable(String name) {
+ return new Message(codeNonSimpleBoundViaVariable,
+ message:
+ """Bound of this variable references variable '${name}' from the same declaration.""",
+ arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<
Message Function(
String name,
@@ -6326,6 +6487,38 @@
r"""Try removing the keyword 'var', or replacing it with the name of the return type.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+ Message Function(
+ String string,
+ String
+ string2)> templateWebLiteralCannotBeRepresentedExactly = const Template<
+ Message Function(String string, String string2)>(
+ messageTemplate:
+ r"""The integer literal #string can't be represented exactly in JavaScript.""",
+ tipTemplate:
+ r"""Try changing the literal to something that can be represented in Javascript. In Javascript #string2 is the nearest value that can be represented exactly.""",
+ withArguments: _withArgumentsWebLiteralCannotBeRepresentedExactly);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String string, String string2)>
+ codeWebLiteralCannotBeRepresentedExactly =
+ const Code<Message Function(String string, String string2)>(
+ "WebLiteralCannotBeRepresentedExactly",
+ templateWebLiteralCannotBeRepresentedExactly,
+ dart2jsCode: "*fatal*",
+ severity: Severity.error);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsWebLiteralCannotBeRepresentedExactly(
+ String string, String string2) {
+ return new Message(codeWebLiteralCannotBeRepresentedExactly,
+ message:
+ """The integer literal ${string} can't be represented exactly in JavaScript.""",
+ tip: """Try changing the literal to something that can be represented in Javascript. In Javascript ${string2} is the nearest value that can be represented exactly.""",
+ arguments: {'string': string, 'string2': string2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeWithBeforeExtends = messageWithBeforeExtends;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index a1382d0..4bdff1a 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -171,7 +171,7 @@
}
Set<Uri> invalidatedUris = this.invalidatedUris.toSet();
- if (fullComponent) {
+ if (data.includeUserLoadedLibraries || fullComponent) {
invalidatedUris.add(entryPoint);
}
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 1a6e1f0..c72cfab 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -6,8 +6,6 @@
import 'dart:core' hide MapEntry;
-import 'package:kernel/ast.dart' as kernel show Expression, Statement;
-
import '../constant_context.dart' show ConstantContext;
import '../fasta_codes.dart' as fasta;
@@ -107,7 +105,7 @@
import 'kernel_api.dart';
-import 'kernel_ast_api.dart' hide Expression, Statement;
+import 'kernel_ast_api.dart';
import 'kernel_builder.dart';
@@ -118,9 +116,8 @@
// TODO(ahe): Remove this and ensure all nodes have a location.
const noLocation = null;
-abstract class BodyBuilder<Expression, Statement, Arguments>
- extends ScopeListener<JumpTarget<Statement>>
- implements ExpressionGeneratorHelper<Expression, Statement, Arguments> {
+abstract class BodyBuilder extends ScopeListener<JumpTarget>
+ implements ExpressionGeneratorHelper {
// TODO(ahe): Rename [library] to 'part'.
@override
final KernelLibraryBuilder library;
@@ -141,6 +138,8 @@
final bool stringExpectedAfterNative;
+ final bool errorOnUnexactWebIntLiterals;
+
/// Whether to ignore an unresolved reference to `main` within the body of
/// `_getMainClosure` when compiling the current library.
///
@@ -203,9 +202,9 @@
int functionNestingLevel = 0;
- kernel.Statement compileTimeErrorInTry;
+ Statement compileTimeErrorInTry;
- kernel.Statement compileTimeErrorInLoopOrSwitch;
+ Statement compileTimeErrorInLoopOrSwitch;
Scope switchScope;
@@ -238,6 +237,8 @@
library.loader.target.backendTarget.enableNative(library.uri),
stringExpectedAfterNative =
library.loader.target.backendTarget.nativeExtensionExpectsString,
+ errorOnUnexactWebIntLiterals =
+ library.loader.target.backendTarget.errorOnUnexactWebIntLiterals,
ignoreMainInGetMainClosure = library.uri.scheme == 'dart' &&
(library.uri.path == "_builtin" || library.uri.path == "ui"),
needsImplicitSuperInitializer =
@@ -294,7 +295,7 @@
@override
Expression toValue(Object node) {
- if (node is Generator<Expression, Statement, Arguments>) {
+ if (node is Generator) {
return node.buildSimpleRead();
} else if (node is Expression) {
return node;
@@ -312,8 +313,7 @@
}
Expression toEffect(Object node) {
- if (node is Generator<Expression, Statement, Arguments>)
- return node.buildForEffect();
+ if (node is Generator) return node.buildForEffect();
return toValue(node);
}
@@ -359,11 +359,11 @@
switchScope.unclaimedForwardDeclarations
.forEach((String name, Declaration declaration) {
if (outerSwitchScope == null) {
- JumpTarget<Statement> target = declaration;
+ JumpTarget target = declaration;
for (Statement statement in target.users) {
- toKernelStatement(statement).parent.replaceChild(
- toKernelStatement(statement),
- wrapInCompileTimeErrorStatement(toKernelStatement(statement),
+ statement.parent.replaceChild(
+ statement,
+ wrapInCompileTimeErrorStatement(statement,
fasta.templateLabelNotFound.withArguments(name)));
}
} else {
@@ -382,14 +382,13 @@
int offset = variable.fileOffset;
Message message = template.withArguments(name);
if (variable.initializer == null) {
- variable.initializer = toKernelExpression(
- buildCompileTimeError(message, offset, name.length, context: context))
- ..parent = variable;
+ variable.initializer =
+ buildCompileTimeError(message, offset, name.length, context: context)
+ ..parent = variable;
} else {
- variable.initializer = toKernelExpression(wrapInLocatedCompileTimeError(
- toExpression(variable.initializer),
- message.withLocation(uri, offset, name.length),
- context: context))
+ variable.initializer = wrapInLocatedCompileTimeError(
+ variable.initializer, message.withLocation(uri, offset, name.length),
+ context: context)
..parent = variable;
}
}
@@ -426,9 +425,8 @@
}
@override
- JumpTarget<Statement> createJumpTarget(JumpTargetKind kind, int charOffset) {
- return new JumpTarget<Statement>(
- kind, functionNestingLevel, member, charOffset);
+ JumpTarget createJumpTarget(JumpTargetKind kind, int charOffset) {
+ return new JumpTarget(kind, functionNestingLevel, member, charOffset);
}
@override
@@ -459,7 +457,7 @@
}
if (name?.isNotEmpty ?? false) {
Token period = periodBeforeName ?? beginToken.next;
- Generator<Expression, Statement, Arguments> generator = expression;
+ Generator generator = expression;
expression = generator.buildPropertyAccess(
new IncompletePropertyAccessGenerator(
this, period.next, new Name(name, library.library)),
@@ -468,8 +466,7 @@
}
ConstantContext savedConstantContext = pop();
- if (expression
- is! StaticAccessGenerator<Expression, Statement, Arguments>) {
+ if (expression is! StaticAccessGenerator) {
push(wrapInCompileTimeError(
toValue(expression), fasta.messageExpressionNotMetadata));
} else {
@@ -529,7 +526,7 @@
this,
factory,
field.hasTypeInferredFromInitializer ? null : field.builtType,
- toKernelExpression(initializer));
+ initializer);
}
}
pop(); // Type.
@@ -544,7 +541,7 @@
field = fields[i].target;
cloner ??= new CloneVisitor();
for (Expression annotation in annotations) {
- field.addAnnotation(cloner.clone(toKernelExpression(annotation)));
+ field.addAnnotation(cloner.clone(annotation));
}
}
}
@@ -588,11 +585,8 @@
formal.charOffset),
formal.charOffset);
} else {
- initializer = buildFieldInitializer(
- true,
- formal.name,
- formal.charOffset,
- toExpression(new VariableGet(formal.declaration)),
+ initializer = buildFieldInitializer(true, formal.name,
+ formal.charOffset, new VariableGet(formal.declaration),
formalType: formal.declaration.type);
}
member.addInitializer(initializer, _typeInferrer);
@@ -642,11 +636,11 @@
Initializer initializer;
if (node is Initializer) {
initializer = node;
- } else if (node is Generator<Expression, Statement, Arguments>) {
+ } else if (node is Generator) {
initializer = node.buildFieldInitializer(initializedFields);
} else if (node is ConstructorInvocation) {
initializer = buildSuperInitializer(
- false, node.target, unchecked(node.arguments), token.charOffset);
+ false, node.target, node.arguments, token.charOffset);
} else {
Expression value = toValue(node);
if (node is! Throw) {
@@ -678,7 +672,7 @@
List<Object> annotations,
FormalParameters<Expression, Statement, Arguments> formals,
AsyncMarker asyncModifier,
- kernel.Statement body) {
+ Statement body) {
debugEvent("finishFunction");
typePromoter.finished();
@@ -694,10 +688,9 @@
// TODO(ahe): Should store: realParameter.fileOffset
// https://github.com/dart-lang/sdk/issues/32289
null);
- realParameter.initializer = toKernelExpression(initializer)
- ..parent = realParameter;
+ realParameter.initializer = initializer..parent = realParameter;
_typeInferrer.inferParameterInitializer(
- this, factory, toKernelExpression(initializer), realParameter.type);
+ this, factory, initializer, realParameter.type);
}
}
@@ -719,11 +712,10 @@
// Add them as local variable to put them in scope of the body.
List<Statement> statements = <Statement>[];
for (KernelFormalParameterBuilder parameter in builder.formals) {
- statements.add(toStatement(parameter.target));
+ statements.add(parameter.target);
}
- statements.add(toStatement(body));
- body = toKernelStatement(
- storeOffset(forest.block(null, statements, null), charOffset));
+ statements.add(body);
+ body = forest.block(null, statements, null)..fileOffset = charOffset;
}
body = wrapInCompileTimeErrorStatement(
body, fasta.messageSetterWithWrongNumberOfFormals);
@@ -744,7 +736,7 @@
Member target = builder.target;
_typeInferrer.inferMetadata(this, factory, annotations);
for (Expression annotation in annotations ?? const []) {
- target.addAnnotation(toKernelExpression(annotation));
+ target.addAnnotation(annotation);
}
if (builder is KernelConstructorBuilder) {
finishConstructor(builder, asyncModifier);
@@ -757,8 +749,8 @@
}
@override
- List<kernel.Expression> finishMetadata() {
- List<kernel.Expression> expressions = pop();
+ List<Expression> finishMetadata() {
+ List<Expression> expressions = pop();
_typeInferrer.inferMetadata(this, factory, expressions);
return expressions;
}
@@ -792,13 +784,12 @@
.withLocation(uri, eof.charOffset, eof.length));
}
- ReturnJudgment fakeReturn =
- new ReturnJudgment(toKernelExpression(expression));
+ ReturnJudgment fakeReturn = new ReturnJudgment(null, null, expression);
_typeInferrer.inferFunctionBody(
this, factory, const DynamicType(), AsyncMarker.Sync, fakeReturn);
- return toExpression(fakeReturn.expression);
+ return fakeReturn.expression;
}
Expression parseFieldInitializer(Token token) {
@@ -882,8 +873,8 @@
if (i > firstNamedArgumentIndex) {
arguments[i] = new NamedExpression(
"#$i",
- toKernelExpression(deprecated_buildCompileTimeError(
- "Expected named argument.", forest.readOffset(argument))))
+ deprecated_buildCompileTimeError(
+ "Expected named argument.", forest.readOffset(argument)))
..fileOffset = beginToken.charOffset;
}
}
@@ -898,9 +889,9 @@
named = <NamedExpression>[
new NamedExpression(
named[1].name,
- toKernelExpression(deprecated_buildCompileTimeError(
+ deprecated_buildCompileTimeError(
"Duplicated named argument '${named[1].name}'.",
- named[1].fileOffset)))
+ named[1].fileOffset))
];
}
} else if (named.length > 2) {
@@ -910,10 +901,9 @@
if (seenNames.containsKey(expression.name)) {
hasProblem = true;
NamedExpression prevNamedExpression = seenNames[expression.name];
- prevNamedExpression.value = toKernelExpression(
- deprecated_buildCompileTimeError(
- "Duplicated named argument '${expression.name}'.",
- expression.fileOffset))
+ prevNamedExpression.value = deprecated_buildCompileTimeError(
+ "Duplicated named argument '${expression.name}'.",
+ expression.fileOffset)
..parent = prevNamedExpression;
} else {
seenNames[expression.name] = expression;
@@ -941,7 +931,7 @@
void handleParenthesizedExpression(Token token) {
debugEvent("ParenthesizedExpression");
push(new ParenthesizedExpressionGenerator(
- this, token.endGroup, toKernelExpression(popForValue())));
+ this, token.endGroup, popForValue()));
}
@override
@@ -973,7 +963,7 @@
@override
finishSend(Object receiver, Arguments arguments, int charOffset) {
- if (receiver is Generator<Expression, Statement, Arguments>) {
+ if (receiver is Generator) {
return receiver.doInvocation(charOffset, arguments);
} else {
return buildMethodInvocation(
@@ -986,17 +976,15 @@
void beginCascade(Token token) {
debugEvent("beginCascade");
Expression expression = popForValue();
- if (expression is ShadowCascadeExpression) {
+ if (expression is CascadeJudgment) {
push(expression);
- push(new VariableUseGenerator<Expression, Statement, Arguments>(
- this, token, expression.variable));
+ push(new VariableUseGenerator(this, token, expression.variable));
expression.extend();
} else {
VariableDeclaration variable = new VariableDeclarationJudgment.forValue(
- toKernelExpression(expression), functionNestingLevel);
- push(new ShadowCascadeExpression(variable));
- push(new VariableUseGenerator<Expression, Statement, Arguments>(
- this, token, variable));
+ expression, functionNestingLevel);
+ push(new CascadeJudgment(variable));
+ push(new VariableUseGenerator(this, token, variable));
}
}
@@ -1004,8 +992,8 @@
void endCascade() {
debugEvent("endCascade");
Expression expression = popForEffect();
- ShadowCascadeExpression cascadeReceiver = pop();
- cascadeReceiver.finalize(toKernelExpression(expression));
+ CascadeJudgment cascadeReceiver = pop();
+ cascadeReceiver.finalize(expression);
push(cascadeReceiver);
}
@@ -1028,8 +1016,7 @@
void beginBinaryExpression(Token token) {
if (optional("&&", token) || optional("||", token)) {
Expression lhs = popForValue();
- typePromoter.enterLogicalExpression(
- toKernelExpression(lhs), token.stringValue);
+ typePromoter.enterLogicalExpression(lhs, token.stringValue);
push(lhs);
}
}
@@ -1083,8 +1070,7 @@
Expression receiver = pop();
Expression logicalExpression =
forest.logicalExpression(receiver, token, argument);
- typePromoter.exitLogicalExpression(
- toKernelExpression(argument), toKernelExpression(logicalExpression));
+ typePromoter.exitLogicalExpression(argument, logicalExpression);
push(logicalExpression);
}
@@ -1092,17 +1078,16 @@
void doIfNull(Token token) {
Expression b = popForValue();
Expression a = popForValue();
- VariableDeclaration variable =
- new VariableDeclaration.forValue(toKernelExpression(a));
- push(new ShadowIfNullExpression(
+ VariableDeclaration variable = new VariableDeclaration.forValue(a);
+ push(new IfNullJudgment(
variable,
- toKernelExpression(forest.conditionalExpression(
- toExpression(buildIsNull(
- new VariableGet(variable), offsetForToken(token), this)),
+ token,
+ forest.conditionalExpression(
+ buildIsNull(new VariableGet(variable), offsetForToken(token), this),
token,
b,
null,
- toExpression(new VariableGet(variable)))))
+ new VariableGet(variable)))
..fileOffset = offsetForToken(token));
}
@@ -1124,7 +1109,7 @@
Object send = pop();
if (send is IncompleteSendGenerator) {
Object receiver = optional(".", token) ? pop() : popForValue();
- if (receiver is TypeUseGenerator<dynamic, dynamic, dynamic>) {
+ if (receiver is TypeUseGenerator) {
_typeInferrer.storeTypeUse(receiver);
}
push(send.withReceiver(receiver, token.charOffset));
@@ -1200,16 +1185,14 @@
return buildCompileTimeError(message, charOffset, noLength,
context: context);
} else {
- Expression error = toExpression(library.loader
- .instantiateNoSuchMethodError(toKernelExpression(receiver), name,
- forest.castArguments(arguments), charOffset,
- isMethod: !isGetter && !isSetter,
- isGetter: isGetter,
- isSetter: isSetter,
- isStatic: isStatic,
- isTopLevel: !isStatic && !isSuper));
- return toExpression(
- new ShadowSyntheticExpression(new Throw(toKernelExpression(error))));
+ Expression error = library.loader.instantiateNoSuchMethodError(
+ receiver, name, forest.castArguments(arguments), charOffset,
+ isMethod: !isGetter && !isSetter,
+ isGetter: isGetter,
+ isSetter: isSetter,
+ isStatic: isStatic,
+ isTopLevel: !isStatic && !isSuper);
+ return new SyntheticExpressionJudgment(new Throw(error));
}
}
@@ -1425,13 +1408,12 @@
if (constantContext != ConstantContext.none || member.isField) {
return new UnresolvedNameGenerator(this, token, n);
}
- return new ThisPropertyAccessGenerator<Expression, Statement,
- Arguments>(this, token, n, lookupInstanceMember(n),
- lookupInstanceMember(n, isSetter: true));
+ return new ThisPropertyAccessGenerator(this, token, n,
+ lookupInstanceMember(n), lookupInstanceMember(n, isSetter: true));
} else if (ignoreMainInGetMainClosure &&
name == "main" &&
member?.name == "_getMainClosure") {
- return storeOffset(forest.literalNull(null), charOffset);
+ return forest.literalNull(null)..fileOffset = charOffset;
} else {
return new UnresolvedNameGenerator(this, token, n);
}
@@ -1442,12 +1424,10 @@
deprecated_addCompileTimeError(
charOffset, "Not a constant expression.");
}
- TypeUseGenerator<Expression, Statement, Arguments> generator =
- new TypeUseGenerator<Expression, Statement, Arguments>(
- this, token, prefix, charOffset, declaration, name);
+ TypeUseGenerator generator = new TypeUseGenerator(
+ this, token, prefix, charOffset, declaration, name);
return (prefix?.deferred == true)
- ? new DeferredAccessGenerator<Expression, Statement, Arguments>(
- this, token, prefix, generator)
+ ? new DeferredAccessGenerator(this, token, prefix, generator)
: generator;
} else if (declaration.isLocal) {
if (constantContext != ConstantContext.none &&
@@ -1464,16 +1444,14 @@
Object fact = typePromoter.getFactForAccess(
declaration.target, functionNestingLevel);
Object scope = typePromoter.currentScope;
- return new ReadOnlyAccessGenerator<Expression, Statement, Arguments>(
+ return new ReadOnlyAccessGenerator(
this,
token,
- toExpression(
- new VariableGetJudgment(declaration.target, fact, scope)
- ..fileOffset = charOffset),
+ new VariableGetJudgment(declaration.target, fact, scope)
+ ..fileOffset = charOffset,
name);
} else {
- return new VariableUseGenerator<Expression, Statement, Arguments>(
- this, token, declaration.target);
+ return new VariableUseGenerator(this, token, declaration.target);
}
} else if (declaration.isInstanceMember) {
if (constantContext != ConstantContext.none &&
@@ -1496,16 +1474,13 @@
getter = declaration.target;
setter = lookupInstanceMember(n, isSetter: true);
}
- return new ThisPropertyAccessGenerator<Expression, Statement, Arguments>(
- this, token, n, getter, setter);
+ return new ThisPropertyAccessGenerator(this, token, n, getter, setter);
} else if (declaration.isRegularMethod) {
assert(declaration.isStatic || declaration.isTopLevel);
- StaticAccessGenerator<Expression, Statement, Arguments> generator =
- new StaticAccessGenerator<Expression, Statement, Arguments>(
- this, token, declaration.target, null);
+ StaticAccessGenerator generator =
+ new StaticAccessGenerator(this, token, declaration.target, null);
return (prefix?.deferred == true)
- ? new DeferredAccessGenerator<Expression, Statement, Arguments>(
- this, token, prefix, generator)
+ ? new DeferredAccessGenerator(this, token, prefix, generator)
: generator;
} else if (declaration is PrefixBuilder) {
if (constantContext != ConstantContext.none && declaration.deferred) {
@@ -1520,8 +1495,7 @@
_typeInferrer.storePrefix(token, declaration);
return declaration;
} else if (declaration is LoadLibraryBuilder) {
- return new LoadLibraryGenerator<Expression, Statement, Arguments>(
- this, token, declaration);
+ return new LoadLibraryGenerator(this, token, declaration);
} else {
if (declaration.hasProblem && declaration is! AccessErrorBuilder)
return declaration;
@@ -1533,9 +1507,8 @@
} else if (declaration.isField && !declaration.isFinal) {
setter = declaration;
}
- StaticAccessGenerator<Expression, Statement, Arguments> generator =
- new StaticAccessGenerator<Expression, Statement,
- Arguments>.fromBuilder(this, declaration, token, setter);
+ StaticAccessGenerator generator = new StaticAccessGenerator.fromBuilder(
+ this, declaration, token, setter);
if (constantContext != ConstantContext.none) {
Member readTarget = generator.readTarget;
if (!(readTarget is Field && readTarget.isConst ||
@@ -1546,8 +1519,7 @@
}
}
return (prefix?.deferred == true)
- ? new DeferredAccessGenerator<Expression, Statement, Arguments>(
- this, token, prefix, generator)
+ ? new DeferredAccessGenerator(this, token, prefix, generator)
: generator;
}
}
@@ -1642,8 +1614,8 @@
if (expressions == null) {
expressions = parts.sublist(0, i);
}
- for (kernel.Expression expression in part.expressions) {
- expressions.add(toExpression(expression));
+ for (Expression expression in part.expressions) {
+ expressions.add(expression);
}
} else {
if (expressions != null) {
@@ -1659,9 +1631,11 @@
debugEvent("LiteralInt");
int value = int.parse(token.lexeme, onError: (_) => null);
if (value == null) {
- push(new LargeIntAccessGenerator<Expression, Statement, Arguments>(
- this, token));
+ push(new LargeIntAccessGenerator(this, token));
} else {
+ if (errorOnUnexactWebIntLiterals) {
+ checkWebIntLiteralsErrorIfUnexact(value, token);
+ }
push(forest.literalInt(value, token));
}
}
@@ -1749,7 +1723,7 @@
bool isFinal = (currentLocalVariableModifiers & finalMask) != 0;
assert(isConst == (constantContext == ConstantContext.inferred));
push(new VariableDeclarationJudgment(identifier.name, functionNestingLevel,
- initializer: toKernelExpression(initializer),
+ initializer: initializer,
type: currentLocalVariableType,
isFinal: isFinal,
isConst: isConst)
@@ -1811,7 +1785,7 @@
List<Expression> annotations = pop();
if (annotations != null) {
for (Expression annotation in annotations) {
- variable.addAnnotation(toKernelExpression(annotation));
+ variable.addAnnotation(annotation);
}
}
push(variable);
@@ -1825,7 +1799,7 @@
if (annotations != null) {
for (VariableDeclaration variable in variables) {
for (Expression annotation in annotations) {
- variable.addAnnotation(toKernelExpression(annotation));
+ variable.addAnnotation(annotation);
}
}
}
@@ -1852,19 +1826,19 @@
debugEvent("AssignmentExpression");
Expression value = popForValue();
Object generator = pop();
- if (generator is! Generator<Expression, Statement, Arguments>) {
+ if (generator is! Generator) {
push(buildCompileTimeError(fasta.messageNotAnLvalue,
offsetForToken(token), lengthForToken(token)));
} else {
- push(new DelayedAssignment(this, token, generator,
- toKernelExpression(value), token.stringValue));
+ push(new DelayedAssignment(
+ this, token, generator, value, token.stringValue));
}
}
@override
void enterLoop(int charOffset) {
- if (peek() is LabelTarget<Statement>) {
- LabelTarget<Statement> target = peek();
+ if (peek() is LabelTarget) {
+ LabelTarget target = peek();
enterBreakTarget(charOffset, target.breakTarget);
enterContinueTarget(charOffset, target.continueTarget);
} else {
@@ -1882,27 +1856,17 @@
}
}
- List<VariableDeclaration> buildVariableDeclarations(variableOrExpression) {
- if (variableOrExpression is Generator<Expression, Statement, Arguments>) {
- variableOrExpression = variableOrExpression.buildForEffect();
- }
+ List<VariableDeclaration> buildForInitVariableDeclarations(
+ variableOrExpression) {
if (variableOrExpression is VariableDeclaration) {
return <VariableDeclaration>[variableOrExpression];
- } else if (variableOrExpression is Expression) {
- VariableDeclaration variable = new VariableDeclarationJudgment.forEffect(
- toKernelExpression(variableOrExpression), functionNestingLevel);
- return <VariableDeclaration>[variable];
- } else if (variableOrExpression is ExpressionStatement) {
- VariableDeclaration variable = new VariableDeclarationJudgment.forEffect(
- variableOrExpression.expression, functionNestingLevel);
- return <VariableDeclaration>[variable];
} else if (forest.isVariablesDeclaration(variableOrExpression)) {
return forest
.variablesDeclarationExtractDeclarations(variableOrExpression);
} else if (variableOrExpression is List<Object>) {
List<VariableDeclaration> variables = <VariableDeclaration>[];
for (Object v in variableOrExpression) {
- variables.addAll(buildVariableDeclarations(v));
+ variables.addAll(buildForInitVariableDeclarations(v));
}
return variables;
} else if (variableOrExpression == null) {
@@ -1911,6 +1875,15 @@
return null;
}
+ List<ExpressionJudgment> buildForInitExpressions(variableOrExpression) {
+ if (variableOrExpression is ExpressionJudgment) {
+ return <ExpressionJudgment>[variableOrExpression];
+ } else if (variableOrExpression is ExpressionStatementJudgment) {
+ return <ExpressionJudgment>[variableOrExpression.expression];
+ }
+ return null;
+ }
+
@override
void endForStatement(Token forKeyword, Token leftParen, Token leftSeparator,
int updateExpressionCount, Token endToken) {
@@ -1919,15 +1892,19 @@
List<Expression> updates = popListForEffect(updateExpressionCount);
Statement conditionStatement = popStatement();
Object variableOrExpression = pop();
- List<VariableDeclaration> variables =
- buildVariableDeclarations(variableOrExpression);
- if (variables == null) {
- return unhandled("${variableOrExpression.runtimeType}", "endForStatement",
- forKeyword.charOffset, uri);
- }
+
+ variableOrExpression = variableOrExpression is Generator
+ ? variableOrExpression.buildForEffect()
+ : variableOrExpression;
+ List<ExpressionJudgment> initializers =
+ buildForInitExpressions(variableOrExpression);
+ List<VariableDeclaration> variableList = initializers == null
+ ? buildForInitVariableDeclarations(variableOrExpression)
+ : null;
+
exitLocalScope();
- JumpTarget<Statement> continueTarget = exitContinueTarget();
- JumpTarget<Statement> breakTarget = exitBreakTarget();
+ JumpTarget continueTarget = exitContinueTarget();
+ JumpTarget breakTarget = exitBreakTarget();
if (continueTarget.hasUsers) {
body = forest.syntheticLabeledStatement(body);
continueTarget.resolveContinues(forest, body);
@@ -1942,8 +1919,8 @@
Statement result = forest.forStatement(
forKeyword,
leftParen,
- variables,
- variables,
+ variableList,
+ initializers,
leftSeparator,
condition,
conditionStatement,
@@ -2109,8 +2086,7 @@
if (prefix is PrefixBuilder) {
name = scopeLookup(prefix.exportScope, suffix.name, beginToken,
isQualified: true, prefix: prefix);
- } else if (prefix
- is ErroneousExpressionGenerator<Expression, Statement, Arguments>) {
+ } else if (prefix is ErroneousExpressionGenerator) {
push(prefix.buildErroneousTypeNotAPrefix(suffix));
return;
} else {
@@ -2121,7 +2097,7 @@
return;
}
}
- if (name is Generator<Expression, Statement, Arguments>) {
+ if (name is Generator) {
push(name.buildTypeWithBuiltArguments(arguments));
} else if (name is TypeBuilder) {
push(name.build(library));
@@ -2200,8 +2176,8 @@
bool isInverted = not != null;
Expression isExpression = forest.isExpression(operand, operator, not, type);
if (operand is VariableGet) {
- typePromoter.handleIsCheck(toKernelExpression(isExpression), isInverted,
- operand.variable, type, functionNestingLevel);
+ typePromoter.handleIsCheck(isExpression, isInverted, operand.variable,
+ type, functionNestingLevel);
}
if (constantContext != ConstantContext.none) {
push(deprecated_buildCompileTimeError(
@@ -2214,7 +2190,7 @@
@override
void beginConditionalExpression(Token question) {
Expression condition = popForValue();
- typePromoter.enterThen(toKernelExpression(condition));
+ typePromoter.enterThen(condition);
push(condition);
super.beginConditionalExpression(question);
}
@@ -2309,11 +2285,10 @@
}
if (annotations != null) {
if (functionNestingLevel == 0) {
- _typeInferrer.inferMetadata(
- this, factory, toKernelExpressionList(annotations));
+ _typeInferrer.inferMetadata(this, factory, annotations);
}
for (Expression annotation in annotations) {
- variable.addAnnotation(toKernelExpression(annotation));
+ variable.addAnnotation(annotation);
}
}
push(variable);
@@ -2372,8 +2347,7 @@
debugEvent("ValuedFormalParameter");
Expression initializer = popForValue();
Identifier name = pop();
- push(
- new InitializedIdentifier(name.token, toKernelExpression(initializer)));
+ push(new InitializedIdentifier(name.token, initializer));
}
@override
@@ -2455,9 +2429,9 @@
body = forest.block(
catchKeyword,
<Statement>[
- toStatement(compileTimeErrorInTry ??=
+ compileTimeErrorInTry ??=
deprecated_buildCompileTimeErrorStatement(
- "Invalid catch arguments.", catchKeyword.next.charOffset))
+ "Invalid catch arguments.", catchKeyword.next.charOffset)
],
null);
}
@@ -2494,14 +2468,14 @@
Expression index = popForValue();
Object receiver = pop();
if (receiver is ThisAccessGenerator && receiver.isSuper) {
- push(new SuperIndexedAccessGenerator<Expression, Statement, Arguments>(
+ push(new SuperIndexedAccessGenerator(
this,
openSquareBracket,
index,
lookupInstanceMember(indexGetName, isSuper: true),
lookupInstanceMember(indexSetName, isSuper: true)));
} else {
- push(IndexedAccessGenerator.make<Expression, Statement, Arguments>(
+ push(IndexedAccessGenerator.make(
this, openSquareBracket, toValue(receiver), index, null, null));
}
}
@@ -2518,11 +2492,13 @@
if (optional("-", token)) {
operator = "unary-";
- if (receiver
- is LargeIntAccessGenerator<Expression, Statement, Arguments>) {
+ if (receiver is LargeIntAccessGenerator) {
int value = int.tryParse("-" + receiver.token.lexeme);
if (value != null) {
receiverValue = forest.literalInt(value, token);
+ if (errorOnUnexactWebIntLiterals) {
+ checkWebIntLiteralsErrorIfUnexact(value, token);
+ }
}
}
}
@@ -2554,7 +2530,7 @@
void handleUnaryPrefixAssignmentExpression(Token token) {
debugEvent("UnaryPrefixAssignmentExpression");
Object generator = pop();
- if (generator is Generator<Expression, Statement, Arguments>) {
+ if (generator is Generator) {
push(generator.buildPrefixIncrement(incrementOperator(token),
offset: token.charOffset));
} else {
@@ -2567,7 +2543,7 @@
void handleUnaryPostfixAssignmentExpression(Token token) {
debugEvent("UnaryPostfixAssignmentExpression");
Object generator = pop();
- if (generator is Generator<Expression, Statement, Arguments>) {
+ if (generator is Generator) {
push(new DelayedPostfixIncrement(
this, token, generator, incrementOperator(token), null));
} else {
@@ -2630,9 +2606,9 @@
prefix.exportScope, identifier.name, identifier.token,
isQualified: true, prefix: prefix);
identifier = null;
- } else if (prefix is TypeUseGenerator<Expression, Statement, Arguments>) {
+ } else if (prefix is TypeUseGenerator) {
type = prefix;
- } else if (prefix is Generator<Expression, Statement, Arguments>) {
+ } else if (prefix is Generator) {
String name = suffix == null
? "${prefix.plainNameForRead}.${identifier.name}"
: "${prefix.plainNameForRead}.${identifier.name}.$suffix";
@@ -2675,7 +2651,7 @@
target.function, arguments, charOffset, typeParameters);
if (argMessage != null) {
return throwNoSuchMethodError(
- storeOffset(forest.literalNull(null), charOffset),
+ forest.literalNull(null)..fileOffset = charOffset,
target.name.name,
arguments,
charOffset,
@@ -2690,10 +2666,10 @@
return deprecated_buildCompileTimeError(
"Not a const constructor.", charOffset);
}
- return toExpression(new ShadowConstructorInvocation(target,
- targetTypeArguments, initialTarget, forest.castArguments(arguments),
+ return new ConstructorInvocationJudgment(target, targetTypeArguments,
+ initialTarget, forest.castArguments(arguments),
isConst: isConst)
- ..fileOffset = charOffset);
+ ..fileOffset = charOffset;
} else {
Procedure procedure = target;
if (procedure.isFactory) {
@@ -2704,15 +2680,15 @@
return deprecated_buildCompileTimeError(
"Not a const factory.", charOffset);
}
- return toExpression(new ShadowFactoryConstructorInvocation(target,
+ return new FactoryConstructorInvocationJudgment(target,
targetTypeArguments, initialTarget, forest.castArguments(arguments),
isConst: isConst)
- ..fileOffset = charOffset);
+ ..fileOffset = charOffset;
} else {
- return toExpression(new ShadowStaticInvocation(
+ return new StaticInvocationJudgment(
target, forest.castArguments(arguments),
isConst: isConst)
- ..fileOffset = charOffset);
+ ..fileOffset = charOffset;
}
}
}
@@ -2848,16 +2824,15 @@
Object type = pop();
PrefixBuilder deferredPrefix;
int checkOffset;
- if (type is DeferredAccessGenerator<Expression, Statement, Arguments>) {
- DeferredAccessGenerator<Expression, Statement, Arguments> generator =
- type;
+ if (type is DeferredAccessGenerator) {
+ DeferredAccessGenerator generator = type;
type = generator.generator;
deferredPrefix = generator.builder;
checkOffset = generator.token.charOffset;
}
- if (type is TypeUseGenerator<Expression, Statement, Arguments>) {
- TypeUseGenerator<Expression, Statement, Arguments> generator = type;
+ if (type is TypeUseGenerator) {
+ TypeUseGenerator generator = type;
_typeInferrer.storeTypeUse(generator);
if (generator.prefix != null) {
nameToken = nameToken.next.next;
@@ -2872,11 +2847,10 @@
push(deferredPrefix != null
? wrapInDeferredCheck(expression, deferredPrefix, checkOffset)
: expression);
- } else if (type
- is ErroneousExpressionGenerator<Expression, Statement, Arguments>) {
+ } else if (type is ErroneousExpressionGenerator) {
push(type.buildError(arguments));
} else {
- push(throwNoSuchMethodError(storeOffset(forest.literalNull(null), offset),
+ push(throwNoSuchMethodError(forest.literalNull(null)..fileOffset = offset,
debugName(getNodeName(type), name), arguments, nameToken.charOffset));
}
constantContext = savedConstantContext;
@@ -2924,14 +2898,13 @@
} else if (b.isConstructor) {
initialTarget = b.target;
if (type.isAbstract) {
- return toExpression(new ShadowSyntheticExpression(toKernelExpression(
- evaluateArgumentsBefore(
- arguments,
- buildAbstractClassInstantiationError(
- fasta.templateAbstractClassInstantiation
- .withArguments(type.name),
- type.name,
- nameToken.charOffset)))));
+ return new SyntheticExpressionJudgment(evaluateArgumentsBefore(
+ arguments,
+ buildAbstractClassInstantiationError(
+ fasta.templateAbstractClassInstantiation
+ .withArguments(type.name),
+ type.name,
+ nameToken.charOffset)));
} else {
target = initialTarget;
}
@@ -2947,14 +2920,13 @@
"Cyclic definition of factory '${name}'.", nameToken.charOffset);
}
if (target is Constructor && target.enclosingClass.isAbstract) {
- return toExpression(new ShadowSyntheticExpression(toKernelExpression(
- evaluateArgumentsBefore(
- arguments,
- buildAbstractClassInstantiationError(
- fasta.templateAbstractRedirectedClassInstantiation
- .withArguments(target.enclosingClass.name),
- target.enclosingClass.name,
- nameToken.charOffset)))));
+ return new SyntheticExpressionJudgment(evaluateArgumentsBefore(
+ arguments,
+ buildAbstractClassInstantiationError(
+ fasta.templateAbstractRedirectedClassInstantiation
+ .withArguments(target.enclosingClass.name),
+ target.enclosingClass.name,
+ nameToken.charOffset)));
}
RedirectingFactoryBody body = getRedirectingFactoryBody(target);
if (body != null) {
@@ -2980,8 +2952,12 @@
errorName = debugName(getNodeName(type), name);
}
errorName ??= name;
+ if (nameToken.lexeme == type.name && name.isNotEmpty) {
+ nameToken = nameToken.next.next;
+ }
+
return throwNoSuchMethodError(
- storeOffset(forest.literalNull(null), charOffset),
+ forest.literalNull(null)..fileOffset = charOffset,
errorName,
arguments,
nameToken.charOffset);
@@ -3030,7 +3006,7 @@
debugEvent("NamedArgument");
Expression value = popForValue();
Identifier identifier = pop();
- push(new NamedExpressionJudgment(identifier.name, toKernelExpression(value))
+ push(new NamedExpressionJudgment(identifier.token, colon, value)
..fileOffset = offsetForToken(identifier.token));
}
@@ -3046,7 +3022,7 @@
deprecated_addCompileTimeError(offsetForToken(name.token),
"'${variable.name}' already declared in this scope.");
}
- push(new ShadowFunctionDeclaration(
+ push(new FunctionDeclarationJudgment(
variable,
// The function node is created later.
null)
@@ -3111,8 +3087,7 @@
if (!isFunctionExpression) {
annotations = pop(); // Metadata.
}
- FunctionNode function = formals.addToFunction(new FunctionNode(
- toKernelStatement(body),
+ FunctionNode function = formals.addToFunction(new FunctionNodeJudgment(body,
typeParameters: typeParameters,
asyncMarker: asyncModifier,
returnType: returnType)
@@ -3123,30 +3098,28 @@
VariableDeclaration variable = declaration.variable;
if (annotations != null) {
for (Expression annotation in annotations) {
- variable.addAnnotation(toKernelExpression(annotation));
+ variable.addAnnotation(annotation);
}
}
- ShadowFunctionDeclaration.setHasImplicitReturnType(
+ FunctionDeclarationJudgment.setHasImplicitReturnType(
declaration, hasImplicitReturnType);
variable.type = function.functionType;
if (isFunctionExpression) {
- Expression oldInitializer = toExpression(variable.initializer);
- variable.initializer = new ShadowFunctionExpression(function)
+ Expression oldInitializer = variable.initializer;
+ variable.initializer = new FunctionExpressionJudgment(function)
..parent = variable
..fileOffset = formals.charOffset;
exitLocalScope();
- Expression expression =
- toExpression(new ShadowNamedFunctionExpression(variable));
+ Expression expression = new NamedFunctionExpressionJudgment(variable);
if (oldInitializer != null) {
// This must have been a compile-time error.
- assert(isErroneousNode(toKernelExpression(oldInitializer)));
+ assert(isErroneousNode(oldInitializer));
- push(new ShadowSyntheticExpression(new Let(
- new VariableDeclaration.forValue(
- toKernelExpression(oldInitializer))
+ push(new SyntheticExpressionJudgment(new Let(
+ new VariableDeclaration.forValue(oldInitializer)
..fileOffset = forest.readOffset(expression),
- toKernelExpression(expression))
+ expression)
..fileOffset = forest.readOffset(expression)));
} else {
push(expression);
@@ -3158,16 +3131,14 @@
// This must have been a compile-time error.
assert(isErroneousNode(variable.initializer));
- push(storeOffset(
- forest.block(
- null,
- <Statement>[
- forest.expressionStatement(
- toExpression(variable.initializer), token),
- toStatement(declaration)
- ],
- null),
- declaration.fileOffset));
+ push(forest.block(
+ null,
+ <Statement>[
+ forest.expressionStatement(variable.initializer, token),
+ declaration
+ ],
+ null)
+ ..fileOffset = declaration.fileOffset);
variable.initializer = null;
} else {
push(declaration);
@@ -3200,17 +3171,15 @@
FormalParameters<Expression, Statement, Arguments> formals = pop();
exitFunction();
List<TypeParameter> typeParameters = typeVariableBuildersToKernel(pop());
- FunctionNode function = formals.addToFunction(new FunctionNode(
- toKernelStatement(body),
- typeParameters: typeParameters,
- asyncMarker: asyncModifier)
+ FunctionNode function = formals.addToFunction(new FunctionNodeJudgment(body,
+ typeParameters: typeParameters, asyncMarker: asyncModifier)
..fileOffset = beginToken.charOffset
..fileEndOffset = token.charOffset);
if (constantContext != ConstantContext.none) {
push(deprecated_buildCompileTimeError(
"Not a constant expression.", formals.charOffset));
} else {
- push(new ShadowFunctionExpression(function)
+ push(new FunctionExpressionJudgment(function)
..fileOffset = offsetForToken(beginToken));
}
}
@@ -3221,8 +3190,8 @@
debugEvent("DoWhileStatement");
Expression condition = popForValue();
Statement body = popStatement();
- JumpTarget<Statement> continueTarget = exitContinueTarget();
- JumpTarget<Statement> breakTarget = exitBreakTarget();
+ JumpTarget continueTarget = exitContinueTarget();
+ JumpTarget breakTarget = exitBreakTarget();
if (continueTarget.hasUsers) {
body = forest.syntheticLabeledStatement(body);
continueTarget.resolveContinues(forest, body);
@@ -3257,16 +3226,16 @@
Expression expression = popForValue();
Object lvalue = pop();
exitLocalScope();
- JumpTarget<Statement> continueTarget = exitContinueTarget();
- JumpTarget<Statement> breakTarget = exitBreakTarget();
- kernel.Statement kernelBody = toKernelStatement(body);
+ JumpTarget continueTarget = exitContinueTarget();
+ JumpTarget breakTarget = exitBreakTarget();
+ Statement kernelBody = body;
if (continueTarget.hasUsers) {
kernelBody = new LabeledStatementJudgment(kernelBody);
- continueTarget.resolveContinues(forest, toStatement(kernelBody));
+ continueTarget.resolveContinues(forest, kernelBody);
}
VariableDeclaration variable;
bool declaresVariable = false;
- ShadowSyntheticExpression syntheticAssignment;
+ SyntheticExpressionJudgment syntheticAssignment;
if (lvalue is VariableDeclaration) {
declaresVariable = true;
variable = lvalue;
@@ -3274,7 +3243,7 @@
deprecated_addCompileTimeError(
variable.fileOffset, "A for-in loop-variable can't be 'const'.");
}
- } else if (lvalue is Generator<Expression, Statement, Arguments>) {
+ } else if (lvalue is Generator) {
/// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
///
/// for (lvalue in expression) body
@@ -3290,24 +3259,26 @@
TypePromotionFact fact =
typePromoter.getFactForAccess(variable, functionNestingLevel);
TypePromotionScope scope = typePromoter.currentScope;
- syntheticAssignment = toKernelExpression(lvalue.buildAssignment(
- toExpression(new VariableGetJudgment(variable, fact, scope)
- ..fileOffset = inKeyword.offset),
- voidContext: true));
- kernelBody = combineStatements(
- new ShadowLoopAssignmentStatement(syntheticAssignment), kernelBody);
+ syntheticAssignment = lvalue.buildAssignment(
+ new VariableGetJudgment(variable, fact, scope)
+ ..fileOffset = inKeyword.offset,
+ voidContext: true);
} else {
Message message = forest.isVariablesDeclaration(lvalue)
? fasta.messageForInLoopExactlyOneVariable
: fasta.messageForInLoopNotAssignable;
Token token = forToken.next.next;
- variable = new VariableDeclaration.forValue(toKernelExpression(
- buildCompileTimeError(
- message, offsetForToken(token), lengthForToken(token))));
+ variable = new VariableDeclaration.forValue(buildCompileTimeError(
+ message, offsetForToken(token), lengthForToken(token)));
}
- kernel.Statement result = new ShadowForInStatement(
+ Statement result = new ForInJudgment(
+ awaitToken,
+ forToken,
+ leftParenthesis,
variable,
- toKernelExpression(expression),
+ inKeyword,
+ expression,
+ leftParenthesis.endGroup,
kernelBody,
declaresVariable,
syntheticAssignment,
@@ -3316,9 +3287,9 @@
..bodyOffset = kernelBody.fileOffset;
if (breakTarget.hasUsers) {
result = new LabeledStatementJudgment(result);
- breakTarget.resolveBreaks(forest, toStatement(result));
+ breakTarget.resolveBreaks(forest, result);
}
- exitLoopOrSwitch(toStatement(result));
+ exitLoopOrSwitch(result);
}
@override
@@ -3335,8 +3306,8 @@
new List<Object>.filled(labelCount, null, growable: true);
popList(labelCount, labels);
enterLocalScope(null, scope.createNestedLabelScope());
- LabelTarget<Statement> target = new LabelTarget<Statement>(
- labels, member, functionNestingLevel, token.charOffset);
+ LabelTarget target =
+ new LabelTarget(labels, member, functionNestingLevel, token.charOffset);
for (Object label in labels) {
scope.declareLabel(forest.getLabelName(label), target);
}
@@ -3347,7 +3318,7 @@
void endLabeledStatement(int labelCount) {
debugEvent("LabeledStatement");
Statement statement = popStatement();
- LabelTarget<Statement> target = pop();
+ LabelTarget target = pop();
exitLocalScope();
if (target.breakTarget.hasUsers) {
if (statement is! LabeledStatement) {
@@ -3388,8 +3359,8 @@
debugEvent("WhileStatement");
Statement body = popStatement();
Expression condition = popForValue();
- JumpTarget<Statement> continueTarget = exitContinueTarget();
- JumpTarget<Statement> breakTarget = exitBreakTarget();
+ JumpTarget continueTarget = exitContinueTarget();
+ JumpTarget breakTarget = exitBreakTarget();
if (continueTarget.hasUsers) {
body = forest.syntheticLabeledStatement(body);
continueTarget.resolveContinues(forest, body);
@@ -3517,8 +3488,8 @@
for (Expression expression in expressions) {
expressionOffsets.add(forest.readOffset(expression));
}
- push(new SwitchCaseJudgment(toKernelExpressionList(expressions),
- expressionOffsets, toKernelStatement(block),
+ push(new SwitchCaseJudgment(defaultKeyword, expressions, expressionOffsets,
+ colonAfterDefault, block,
isDefault: defaultKeyword != null)
..fileOffset = firstToken.charOffset);
push(labels);
@@ -3529,18 +3500,20 @@
debugEvent("SwitchStatement");
List<SwitchCase> cases = pop();
- JumpTarget<Statement> target = exitBreakTarget();
+ JumpTarget target = exitBreakTarget();
exitSwitchScope();
exitLocalScope();
Expression expression = popForValue();
- kernel.Statement result =
- new SwitchStatementJudgment(toKernelExpression(expression), cases)
- ..fileOffset = switchKeyword.charOffset;
+ // TODO(brianwilkerson): Plumb through the left and right parentheses and
+ // the left and right curly braces.
+ Statement result = new SwitchStatementJudgment(
+ switchKeyword, null, expression, null, null, cases, null)
+ ..fileOffset = switchKeyword.charOffset;
if (target.hasUsers) {
result = new LabeledStatementJudgment(result);
- target.resolveBreaks(forest, toStatement(result));
+ target.resolveBreaks(forest, result);
}
- exitLoopOrSwitch(toStatement(result));
+ exitLoopOrSwitch(result);
}
@override
@@ -3552,8 +3525,7 @@
List<Object> labels = pop();
SwitchCase current = cases[i] = pop();
for (Object label in labels) {
- JumpTarget<Statement> target =
- switchScope.lookupLabel(forest.getLabelName(label));
+ JumpTarget target = switchScope.lookupLabel(forest.getLabelName(label));
if (target != null) {
target.resolveGotos(forest, current);
}
@@ -3580,8 +3552,8 @@
lastNode is! Rethrow &&
lastNode is! ReturnStatement &&
lastNode is! Throw) {
- block.addStatement(new ExpressionStatement(
- toKernelExpression(buildFallThroughError(current.fileOffset))));
+ block.addStatement(
+ new ExpressionStatement(buildFallThroughError(current.fileOffset)));
}
}
@@ -3598,7 +3570,7 @@
void handleBreakStatement(
bool hasTarget, Token breakKeyword, Token endToken) {
debugEvent("BreakStatement");
- JumpTarget<Statement> target = breakTarget;
+ JumpTarget target = breakTarget;
Identifier identifier;
String name;
if (hasTarget) {
@@ -3611,7 +3583,7 @@
deprecated_buildCompileTimeErrorStatement(
"No target of break.", breakKeyword.charOffset));
} else if (target == null ||
- target is! JumpTarget<Statement> ||
+ target is! JumpTarget ||
!target.isBreakTarget) {
push(compileTimeErrorInLoopOrSwitch =
deprecated_buildCompileTimeErrorStatement(
@@ -3633,14 +3605,14 @@
void handleContinueStatement(
bool hasTarget, Token continueKeyword, Token endToken) {
debugEvent("ContinueStatement");
- JumpTarget<Statement> target = continueTarget;
+ JumpTarget target = continueTarget;
Identifier identifier;
String name;
if (hasTarget) {
identifier = pop();
name = identifier.name;
Declaration namedTarget = scope.lookupLabel(identifier.name);
- if (namedTarget != null && namedTarget is! JumpTarget<Statement>) {
+ if (namedTarget != null && namedTarget is! JumpTarget) {
push(compileTimeErrorInLoopOrSwitch =
deprecated_buildCompileTimeErrorStatement(
"Target of continue must be a label.",
@@ -3659,9 +3631,10 @@
}
if (target.isGotoTarget &&
target.functionNestingLevel == functionNestingLevel) {
- ContinueSwitchStatement statement = new ContinueSwitchJudgment(null)
- ..fileOffset = continueKeyword.charOffset;
- target.addGoto(toStatement(statement));
+ ContinueSwitchStatement statement =
+ new ContinueSwitchJudgment(continueKeyword, null, endToken)
+ ..fileOffset = continueKeyword.charOffset;
+ target.addGoto(statement);
push(statement);
return;
}
@@ -3690,6 +3663,11 @@
@override
void beginTypeVariables(Token token) {
debugEvent("beginTypeVariables");
+
+ // TODO(danrubel): Now that the type variable events have been reordered,
+ // we should be able to cleanup body builder type variable declaration
+ // handling and remove this hack.
+
OutlineBuilder listener = new OutlineBuilder(library);
// TODO(dmitryas): [ClassMemberParser] shouldn't be used to parse and build
// the type variables for the local function. It also causes the unresolved
@@ -3713,26 +3691,14 @@
}
@override
- void beginTypeVariable(Token name) {
+ void beginTypeVariable(Token token) {
debugEvent("beginTypeVariable");
- }
-
- @override
- void handleNoTypeVariables(Token token) {
- debugEvent("NoTypeVariables");
- enterFunctionTypeScope(null);
- push(NullValue.TypeVariables);
- }
-
- @override
- void endTypeVariable(Token token, Token extendsOrSuper) {
- debugEvent("TypeVariable");
- DartType bound = pop();
Identifier name = pop();
List<Expression> annotations = pop();
+
KernelTypeVariableBuilder variable;
Object inScope = scopeLookup(scope, name.name, token);
- if (inScope is TypeUseGenerator<Expression, Statement, Arguments>) {
+ if (inScope is TypeUseGenerator) {
_typeInferrer.storeTypeUse(inScope);
variable = inScope.declaration;
} else {
@@ -3741,51 +3707,76 @@
variable = new KernelTypeVariableBuilder(
name.name, library, offsetForToken(name.token), null);
}
- variable.parameter.bound = bound;
if (annotations != null) {
- _typeInferrer.inferMetadata(
- this, factory, toKernelExpressionList(annotations));
+ _typeInferrer.inferMetadata(this, factory, annotations);
for (Expression annotation in annotations) {
- variable.parameter.addAnnotation(toKernelExpression(annotation));
+ variable.parameter.addAnnotation(annotation);
}
}
push(variable);
}
@override
- void endTypeVariables(int count, Token beginToken, Token endToken) {
+ void handleTypeVariablesDefined(Token token, int count) {
+ debugEvent("handleTypeVariablesDefined");
+ assert(count > 0);
+ List<KernelTypeVariableBuilder> typeVariables =
+ popList(count, new List<KernelTypeVariableBuilder>(count));
+
+ // TODO(danrubel): Call enterFunctionScope here
+ // once the hack in beginTypeVariables has been removed.
+ //enterFunctionTypeScope(typeVariables);
+ push(typeVariables);
+ }
+
+ @override
+ void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+ debugEvent("TypeVariable");
+ DartType bound = pop();
+ // Peek to leave type parameters on top of stack.
+ List<KernelTypeVariableBuilder> typeVariables = peek();
+
+ KernelTypeVariableBuilder variable = typeVariables[index];
+ variable.parameter.bound = bound;
+ }
+
+ @override
+ void endTypeVariables(Token beginToken, Token endToken) {
debugEvent("TypeVariables");
- List<KernelTypeVariableBuilder> typeVariables = popList(
- count,
- new List<KernelTypeVariableBuilder>.filled(count, null,
- growable: true));
- if (typeVariables != null) {
- if (library.loader.target.strongMode) {
- List<KernelTypeBuilder> calculatedBounds = calculateBounds(
- typeVariables,
- library.loader.target.dynamicType,
- library.loader.target.bottomType,
- library.loader.target.objectClassBuilder);
- for (int i = 0; i < typeVariables.length; ++i) {
- typeVariables[i].defaultType = calculatedBounds[i];
- typeVariables[i].defaultType.resolveIn(scope,
- typeVariables[i].charOffset, typeVariables[i].fileUri, library);
- typeVariables[i].finish(
- library,
- library.loader.target.objectClassBuilder,
- library.loader.target.dynamicType);
- }
- } else {
- for (int i = 0; i < typeVariables.length; ++i) {
- typeVariables[i].defaultType = library.loader.target.dynamicType;
- typeVariables[i].finish(
- library,
- library.loader.target.objectClassBuilder,
- library.loader.target.dynamicType);
- }
+ // Peek to leave type parameters on top of stack.
+ List<KernelTypeVariableBuilder> typeVariables = peek();
+
+ if (library.loader.target.strongMode) {
+ List<KernelTypeBuilder> calculatedBounds = calculateBounds(
+ typeVariables,
+ library.loader.target.dynamicType,
+ library.loader.target.bottomType,
+ library.loader.target.objectClassBuilder);
+ for (int i = 0; i < typeVariables.length; ++i) {
+ typeVariables[i].defaultType = calculatedBounds[i];
+ typeVariables[i].defaultType.resolveIn(scope,
+ typeVariables[i].charOffset, typeVariables[i].fileUri, library);
+ typeVariables[i].finish(
+ library,
+ library.loader.target.objectClassBuilder,
+ library.loader.target.dynamicType);
+ }
+ } else {
+ for (int i = 0; i < typeVariables.length; ++i) {
+ typeVariables[i].defaultType = library.loader.target.dynamicType;
+ typeVariables[i].finish(
+ library,
+ library.loader.target.objectClassBuilder,
+ library.loader.target.dynamicType);
}
}
- push(typeVariables ?? NullValue.TypeVariables);
+ }
+
+ @override
+ void handleNoTypeVariables(Token token) {
+ debugEvent("NoTypeVariables");
+ enterFunctionTypeScope(null);
+ push(NullValue.TypeVariables);
}
List<TypeParameter> typeVariableBuildersToKernel(
@@ -3827,7 +3818,7 @@
@override
void handleInvalidStatement(Token token, Message message) {
- kernel.Statement statement = pop();
+ Statement statement = pop();
push(wrapInCompileTimeErrorStatement(statement, message));
}
@@ -3843,9 +3834,9 @@
{List<LocatedMessage> context}) {
library.addCompileTimeError(message, charOffset, length, uri,
wasHandled: true, context: context);
- return toExpression(new ShadowSyntheticExpression(library.loader
+ return new SyntheticExpressionJudgment(library.loader
.throwCompileConstantError(library.loader
- .buildCompileTimeError(message, charOffset, length, uri))));
+ .buildCompileTimeError(message, charOffset, length, uri)));
}
Expression wrapInCompileTimeError(Expression expression, Message message,
@@ -3860,19 +3851,18 @@
{List<LocatedMessage> context}) {
// TODO(askesc): Produce explicit error expression wrapping the original.
// See [issue 29717](https://github.com/dart-lang/sdk/issues/29717)
- return toExpression(new ShadowSyntheticExpression(new Let(
- new VariableDeclaration.forValue(toKernelExpression(
- buildCompileTimeError(
- message.messageObject, message.charOffset, message.length,
- context: context)))
+ return new SyntheticExpressionJudgment(new Let(
+ new VariableDeclaration.forValue(buildCompileTimeError(
+ message.messageObject, message.charOffset, message.length,
+ context: context))
..fileOffset = forest.readOffset(expression),
new Let(
- new VariableDeclaration.forValue(toKernelExpression(expression))
+ new VariableDeclaration.forValue(expression)
..fileOffset = forest.readOffset(expression),
- toKernelExpression(storeOffset(
- forest.literalNull(null), forest.readOffset(expression))))
+ forest.literalNull(null)
+ ..fileOffset = forest.readOffset(expression))
..fileOffset = forest.readOffset(expression))
- ..fileOffset = forest.readOffset(expression)));
+ ..fileOffset = forest.readOffset(expression));
}
Expression buildFallThroughError(int charOffset) {
@@ -3884,14 +3874,14 @@
// TODO(ahe): Compute a LocatedMessage above instead?
Location location = messages.getLocationFromUri(uri, charOffset);
- return toExpression(new Throw(toKernelExpression(buildStaticInvocation(
+ return new Throw(buildStaticInvocation(
library.loader.coreTypes.fallThroughErrorUrlAndLineConstructor,
forest.arguments(<Expression>[
- storeOffset(forest.literalString("${location?.file ?? uri}", null),
- charOffset),
- storeOffset(forest.literalInt(location?.line ?? 0, null), charOffset),
+ forest.literalString("${location?.file ?? uri}", null)
+ ..fileOffset = charOffset,
+ forest.literalInt(location?.line ?? 0, null)..fileOffset = charOffset,
], noLocation),
- charOffset: charOffset))));
+ charOffset: charOffset));
}
Expression buildAbstractClassInstantiationError(
@@ -3901,29 +3891,28 @@
// TODO(ahe): The following doesn't make sense to Analyzer AST.
Declaration constructor =
library.loader.getAbstractClassInstantiationError();
- return toExpression(new Throw(toKernelExpression(buildStaticInvocation(
+ return new Throw(buildStaticInvocation(
constructor.target,
forest.arguments(<Expression>[
- storeOffset(forest.literalString(className, null), charOffset)
- ], noLocation)))));
+ forest.literalString(className, null)..fileOffset = charOffset
+ ], noLocation)));
}
- kernel.Statement deprecated_buildCompileTimeErrorStatement(error,
+ Statement deprecated_buildCompileTimeErrorStatement(error,
[int charOffset = -1]) {
- return new ExpressionStatementJudgment(toKernelExpression(
- deprecated_buildCompileTimeError(error, charOffset)));
+ return new ExpressionStatementJudgment(
+ deprecated_buildCompileTimeError(error, charOffset), null);
}
- kernel.Statement buildCompileTimeErrorStatement(
- Message message, int charOffset,
+ Statement buildCompileTimeErrorStatement(Message message, int charOffset,
{List<LocatedMessage> context}) {
- return new ExpressionStatementJudgment(toKernelExpression(
- buildCompileTimeError(message, charOffset, noLength,
- context: context)));
+ return new ExpressionStatementJudgment(
+ buildCompileTimeError(message, charOffset, noLength, context: context),
+ null);
}
- kernel.Statement wrapInCompileTimeErrorStatement(
- kernel.Statement statement, Message message) {
+ Statement wrapInCompileTimeErrorStatement(
+ Statement statement, Message message) {
// TODO(askesc): Produce explicit error statement wrapping the original.
// See [issue 29717](https://github.com/dart-lang/sdk/issues/29717)
return buildCompileTimeErrorStatement(message, statement.fileOffset);
@@ -3934,7 +3923,7 @@
[int charOffset = -1]) {
needsImplicitSuperInitializer = false;
return new ShadowInvalidInitializer(
- new VariableDeclaration.forValue(toKernelExpression(expression)))
+ new VariableDeclaration.forValue(expression))
..fileOffset = charOffset;
}
@@ -3987,12 +3976,12 @@
Declaration constructor =
library.loader.getDuplicatedFieldInitializerError();
return buildInvalidInitializer(
- toExpression(new Throw(toKernelExpression(buildStaticInvocation(
+ new Throw(buildStaticInvocation(
constructor.target,
forest.arguments(<Expression>[
- storeOffset(forest.literalString(name, null), offset)
+ forest.literalString(name, null)..fileOffset = offset
], noLocation),
- charOffset: offset)))),
+ charOffset: offset)),
offset);
} else {
if (library.loader.target.strongMode &&
@@ -4010,8 +3999,7 @@
.withLocation(builder.fileUri, builder.charOffset, noLength)
]);
}
- return new ShadowFieldInitializer(
- builder.field, toKernelExpression(expression))
+ return new ShadowFieldInitializer(builder.field, expression)
..fileOffset = offset
..isSynthetic = isSynthetic;
}
@@ -4034,8 +4022,10 @@
charOffset);
}
needsImplicitSuperInitializer = false;
- return new ShadowSuperInitializer(
- constructor, forest.castArguments(arguments))
+ // TODO(brianwilkerson): Plumb through the `super`, period, and constructor
+ // name tokens.
+ return new SuperInitializerJudgment(
+ null, null, null, constructor, forest.castArguments(arguments))
..fileOffset = charOffset
..isSynthetic = isSynthetic;
}
@@ -4045,7 +4035,7 @@
Constructor constructor, Arguments arguments,
[int charOffset = -1]) {
needsImplicitSuperInitializer = false;
- return new ShadowRedirectingInitializer(
+ return new RedirectingInitializerJudgment(
constructor, forest.castArguments(arguments))
..fileOffset = charOffset;
}
@@ -4089,8 +4079,8 @@
push(forest.block(
token,
<Statement>[
- toStatement(deprecated_buildCompileTimeErrorStatement(
- "Expected '{'.", token.charOffset))
+ deprecated_buildCompileTimeErrorStatement(
+ "Expected '{'.", token.charOffset)
],
null));
}
@@ -4123,13 +4113,12 @@
List<Expression> expressions =
new List<Expression>.from(forest.argumentsPositional(arguments));
for (NamedExpression named in forest.argumentsNamed(arguments)) {
- expressions.add(toExpression(named.value));
+ expressions.add(named.value);
}
for (Expression argument in expressions.reversed) {
- expression = toExpression(new Let(
- new VariableDeclaration.forValue(toKernelExpression(argument),
- isFinal: true),
- toKernelExpression(expression)));
+ expression = new Let(
+ new VariableDeclaration.forValue(argument, isFinal: true),
+ expression);
}
return expression;
}
@@ -4165,43 +4154,38 @@
offset,
name.name.length);
}
- return toExpression(new ShadowSuperMethodInvocation(
+ return new SuperMethodInvocationJudgment(
name, forest.castArguments(arguments), target)
- ..fileOffset = offset);
+ ..fileOffset = offset;
}
- receiver = toExpression(
- new SuperPropertyGetJudgment(name, target)..fileOffset = offset);
- return toExpression(new ShadowMethodInvocation(
- toKernelExpression(receiver),
- callName,
- forest.castArguments(arguments),
+ receiver = new SuperPropertyGetJudgment(name, target)
+ ..fileOffset = offset;
+ return new MethodInvocationJudgment(
+ receiver, callName, forest.castArguments(arguments),
isImplicitCall: true)
- ..fileOffset = forest.readOffset(arguments));
+ ..fileOffset = forest.readOffset(arguments);
}
if (isNullAware) {
- VariableDeclaration variable =
- new VariableDeclaration.forValue(toKernelExpression(receiver));
- return toExpression(new ShadowNullAwareMethodInvocation(
+ VariableDeclaration variable = new VariableDeclaration.forValue(receiver);
+ return new NullAwareMethodInvocationJudgment(
variable,
- toKernelExpression(storeOffset(
- forest.conditionalExpression(
- toExpression(
- buildIsNull(new VariableGet(variable), offset, this)),
- null,
- storeOffset(forest.literalNull(null), offset),
- null,
- toExpression(new MethodInvocation(new VariableGet(variable),
- name, forest.castArguments(arguments), interfaceTarget)
- ..fileOffset = offset)),
- offset)))
- ..fileOffset = offset);
+ forest.conditionalExpression(
+ buildIsNull(new VariableGet(variable), offset, this),
+ null,
+ forest.literalNull(null)..fileOffset = offset,
+ null,
+ new MethodInvocation(new VariableGet(variable), name,
+ forest.castArguments(arguments), interfaceTarget)
+ ..fileOffset = offset)
+ ..fileOffset = offset)
+ ..fileOffset = offset;
} else {
- return toExpression(new ShadowMethodInvocation(
- toKernelExpression(receiver), name, forest.castArguments(arguments),
+ return new MethodInvocationJudgment(
+ receiver, name, forest.castArguments(arguments),
isImplicitCall: isImplicitCall, interfaceTarget: interfaceTarget)
- ..fileOffset = offset);
+ ..fileOffset = offset;
}
}
@@ -4246,42 +4230,9 @@
Expression wrapInDeferredCheck(
Expression expression, KernelPrefixBuilder prefix, int charOffset) {
Object check = new VariableDeclaration.forValue(
- toKernelExpression(forest.checkLibraryIsLoaded(prefix.dependency)))
+ forest.checkLibraryIsLoaded(prefix.dependency))
..fileOffset = charOffset;
- return toExpression(
- new ShadowDeferredCheck(check, toKernelExpression(expression)));
- }
-
- // TODO(ahe): Remove this method once Forest API is complete.
- @override
- T storeOffset<T>(T object, int offset) {
- TreeNode node = unchecked(object);
- node.fileOffset = offset;
- return object;
- }
-
- // TODO(ahe): Remove this method once Forest API is complete.
- kernel.Expression toKernelExpression(Expression expression) {
- return unchecked(expression);
- }
-
- // TODO(ahe): Remove this method once Forest API is complete.
- Expression toExpression(kernel.Expression expression) {
- return unchecked(expression);
- }
-
- List<kernel.Expression> toKernelExpressionList(List<Expression> expressions) {
- return unchecked(expressions);
- }
-
- // TODO(ahe): Remove this method once Forest API is complete.
- kernel.Statement toKernelStatement(Statement statement) {
- return unchecked(statement);
- }
-
- // TODO(ahe): Remove this method once Forest API is complete.
- Statement toStatement(kernel.Statement statement) {
- return unchecked(statement);
+ return new DeferredCheckJudgment(check, expression);
}
/// TODO(ahe): This method is temporarily implemented by subclasses. Once type
@@ -4292,6 +4243,26 @@
return library.loader.handledErrors.isNotEmpty &&
forest.isErroneousNode(node);
}
+
+ void checkWebIntLiteralsErrorIfUnexact(int value, Token token) {
+ BigInt asInt = new BigInt.from(value).toUnsigned(64);
+ BigInt asDouble = new BigInt.from(asInt.toDouble());
+ if (asInt != asDouble) {
+ String nearest;
+ if (token.lexeme.startsWith("0x") || token.lexeme.startsWith("0X")) {
+ nearest = '0x${asDouble.toRadixString(16)}';
+ } else {
+ nearest = '$asDouble';
+ }
+ library.addCompileTimeError(
+ fasta.templateWebLiteralCannotBeRepresentedExactly
+ .withArguments(token.lexeme, nearest),
+ token.charOffset,
+ token.charCount,
+ uri,
+ wasHandled: true);
+ }
+ }
}
class Identifier {
@@ -4300,7 +4271,7 @@
Identifier(this.token);
- kernel.Expression get initializer => null;
+ Expression get initializer => null;
String toString() => "identifier($name)";
}
@@ -4317,14 +4288,14 @@
}
class InitializedIdentifier extends Identifier {
- final kernel.Expression initializer;
+ final Expression initializer;
InitializedIdentifier(Token token, this.initializer) : super(token);
String toString() => "initialized-identifier($name, $initializer)";
}
-class JumpTarget<Statement> extends Declaration {
+class JumpTarget extends Declaration {
final List<Statement> users = <Statement>[];
final JumpTargetKind kind;
@@ -4366,8 +4337,7 @@
users.add(statement);
}
- void resolveBreaks(
- Forest<Object, Statement, Object, Object> forest, Statement target) {
+ void resolveBreaks(Forest forest, Statement target) {
assert(isBreakTarget);
for (Statement user in users) {
forest.resolveBreak(target, user);
@@ -4375,8 +4345,7 @@
users.clear();
}
- void resolveContinues(
- Forest<Object, Statement, Object, Object> forest, Statement target) {
+ void resolveContinues(Forest forest, Statement target) {
assert(isContinueTarget);
for (Statement user in users) {
forest.resolveContinue(target, user);
@@ -4384,8 +4353,7 @@
users.clear();
}
- void resolveGotos(
- Forest<Object, Statement, Object, Object> forest, Object target) {
+ void resolveGotos(Forest forest, Object target) {
assert(isGotoTarget);
for (Statement user in users) {
forest.resolveContinueInSwitch(target, user);
@@ -4397,16 +4365,15 @@
String get fullNameForErrors => "<jump-target>";
}
-class LabelTarget<Statement> extends Declaration
- implements JumpTarget<Statement> {
+class LabelTarget extends Declaration implements JumpTarget {
final List<Object> labels;
@override
final MemberBuilder parent;
- final JumpTarget<Statement> breakTarget;
+ final JumpTarget breakTarget;
- final JumpTarget<Statement> continueTarget;
+ final JumpTarget continueTarget;
final int functionNestingLevel;
@@ -4415,9 +4382,9 @@
LabelTarget(
this.labels, this.parent, this.functionNestingLevel, this.charOffset)
- : breakTarget = new JumpTarget<Statement>(
+ : breakTarget = new JumpTarget(
JumpTargetKind.Break, functionNestingLevel, parent, charOffset),
- continueTarget = new JumpTarget<Statement>(
+ continueTarget = new JumpTarget(
JumpTargetKind.Continue, functionNestingLevel, parent, charOffset);
@override
@@ -4447,18 +4414,15 @@
unsupported("addGoto", charOffset, fileUri);
}
- void resolveBreaks(
- Forest<Object, Statement, Object, Object> forest, Statement target) {
+ void resolveBreaks(Forest forest, Statement target) {
breakTarget.resolveBreaks(forest, target);
}
- void resolveContinues(
- Forest<Object, Statement, Object, Object> forest, Statement target) {
+ void resolveContinues(Forest forest, Statement target) {
continueTarget.resolveContinues(forest, target);
}
- void resolveGotos(
- Forest<Object, Statement, Object, Object> forest, Object target) {
+ void resolveGotos(Forest forest, Object target) {
unsupported("resolveGotos", charOffset, fileUri);
}
@@ -4525,8 +4489,8 @@
typeParameters: typeParameters);
}
- Scope computeFormalParameterScope(Scope parent, Declaration declaration,
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper) {
+ Scope computeFormalParameterScope(
+ Scope parent, Declaration declaration, ExpressionGeneratorHelper helper) {
if (required.length == 0 && optional == null) return parent;
Map<String, Declaration> local = <String, Declaration>{};
@@ -4560,13 +4524,13 @@
/// }
///
/// If [body] is a [Block], it's returned with [statement] prepended to it.
-Block combineStatements(kernel.Statement statement, kernel.Statement body) {
+Block combineStatements(Statement statement, Statement body) {
if (body is Block) {
body.statements.insert(0, statement);
statement.parent = body;
return body;
} else {
- return new Block(<kernel.Statement>[statement, body]);
+ return new Block(<Statement>[statement, body]);
}
}
@@ -4582,7 +4546,7 @@
return node.fullNameForErrors;
} else if (node is ThisAccessGenerator) {
return node.isSuper ? "super" : "this";
- } else if (node is Generator<Object, Object, Object>) {
+ } else if (node is Generator) {
return node.plainNameForRead;
} else {
return unhandled("${node.runtimeType}", "getNodeName", -1, null);
@@ -4609,6 +4573,3 @@
asyncToken.charOffset, null);
}
}
-
-// TODO(ahe): Remove this method when all AST nodes have moved to [Forest].
-dynamic unchecked(Object o) => o;
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 24aedf5..e24dd18 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -53,8 +53,10 @@
import 'kernel_ast_api.dart'
show
+ Arguments,
DartType,
DynamicType,
+ Expression,
Initializer,
InvalidType,
Member,
@@ -86,7 +88,7 @@
ThisAccessGenerator,
buildIsNull;
-abstract class ExpressionGenerator<Expression, Statement, Arguments> {
+abstract class ExpressionGenerator {
/// Builds a [Expression] representing a read from the generator.
Expression buildSimpleRead();
@@ -159,15 +161,14 @@
/// generate an invocation of `operator[]` or `operator[]=`, so we create a
/// [Generator] object. Later, after `= b` is parsed, [buildAssignment] will
/// be called.
-abstract class Generator<Expression, Statement, Arguments>
- implements ExpressionGenerator<Expression, Statement, Arguments> {
- final ExpressionGeneratorHelper<Expression, Statement, Arguments> helper;
+abstract class Generator implements ExpressionGenerator {
+ final ExpressionGeneratorHelper helper;
final Token token;
Generator(this.helper, this.token);
- Forest<Expression, Statement, Token, Arguments> get forest => helper.forest;
+ Forest get forest => helper.forest;
String get plainNameForRead;
@@ -179,11 +180,6 @@
bool get isInitializer => false;
- // TODO(ahe): Remove this method.
- T storeOffset<T>(T node, int offset) {
- return helper.storeOffset(node, offset);
- }
-
Expression buildForEffect() => buildSimpleRead();
Initializer buildFieldInitializer(Map<String, int> initializedFields) {
@@ -212,14 +208,8 @@
helper.deprecated_addCompileTimeError(
offsetForToken(token), "Not a constant expression.");
}
- return PropertyAccessGenerator.make<Expression, Statement, Arguments>(
- helper,
- send.token,
- buildSimpleRead(),
- send.name,
- null,
- null,
- isNullAware);
+ return PropertyAccessGenerator.make(helper, send.token, buildSimpleRead(),
+ send.name, null, null, isNullAware);
}
}
@@ -264,11 +254,8 @@
}
}
-abstract class VariableUseGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
- factory VariableUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
+abstract class VariableUseGenerator implements Generator {
+ factory VariableUseGenerator(ExpressionGeneratorHelper helper, Token token,
VariableDeclaration variable,
[DartType promotedType]) {
return helper.forest
@@ -279,10 +266,9 @@
String get debugName => "VariableUseGenerator";
}
-abstract class PropertyAccessGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
+abstract class PropertyAccessGenerator implements Generator {
factory PropertyAccessGenerator.internal(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
Expression receiver,
Name name,
@@ -292,23 +278,21 @@
.propertyAccessGenerator(helper, token, receiver, name, getter, setter);
}
- static Generator<Expression, Statement, Arguments>
- make<Expression, Statement, Arguments>(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Expression receiver,
- Name name,
- Member getter,
- Member setter,
- bool isNullAware) {
+ static Generator make(
+ ExpressionGeneratorHelper helper,
+ Token token,
+ Expression receiver,
+ Name name,
+ Member getter,
+ Member setter,
+ bool isNullAware) {
if (helper.forest.isThisExpression(receiver)) {
return unsupported("ThisExpression", offsetForToken(token), helper.uri);
} else {
return isNullAware
- ? new NullAwarePropertyAccessGenerator<Expression, Statement,
- Arguments>(helper, token, receiver, name, getter, setter, null)
- : new PropertyAccessGenerator<Expression, Statement,
- Arguments>.internal(
+ ? new NullAwarePropertyAccessGenerator(
+ helper, token, receiver, name, getter, setter, null)
+ : new PropertyAccessGenerator.internal(
helper, token, receiver, name, getter, setter);
}
}
@@ -322,14 +306,9 @@
/// Special case of [PropertyAccessGenerator] to avoid creating an indirect
/// access to 'this'.
-abstract class ThisPropertyAccessGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
- factory ThisPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Name name,
- Member getter,
- Member setter) {
+abstract class ThisPropertyAccessGenerator implements Generator {
+ factory ThisPropertyAccessGenerator(ExpressionGeneratorHelper helper,
+ Token token, Name name, Member getter, Member setter) {
return helper.forest
.thisPropertyAccessGenerator(helper, token, name, getter, setter);
}
@@ -341,10 +320,9 @@
bool get isThisPropertyAccess => true;
}
-abstract class NullAwarePropertyAccessGenerator<Expression, Statement,
- Arguments> implements Generator<Expression, Statement, Arguments> {
+abstract class NullAwarePropertyAccessGenerator implements Generator {
factory NullAwarePropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
Expression receiverExpression,
Name name,
@@ -359,14 +337,9 @@
String get debugName => "NullAwarePropertyAccessGenerator";
}
-abstract class SuperPropertyAccessGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
- factory SuperPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Name name,
- Member getter,
- Member setter) {
+abstract class SuperPropertyAccessGenerator implements Generator {
+ factory SuperPropertyAccessGenerator(ExpressionGeneratorHelper helper,
+ Token token, Name name, Member getter, Member setter) {
return helper.forest
.superPropertyAccessGenerator(helper, token, name, getter, setter);
}
@@ -375,10 +348,9 @@
String get debugName => "SuperPropertyAccessGenerator";
}
-abstract class IndexedAccessGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
+abstract class IndexedAccessGenerator implements Generator {
factory IndexedAccessGenerator.internal(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
Expression receiver,
Expression index,
@@ -388,20 +360,19 @@
.indexedAccessGenerator(helper, token, receiver, index, getter, setter);
}
- static Generator<Expression, Statement, Arguments>
- make<Expression, Statement, Arguments>(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Expression receiver,
- Expression index,
- Procedure getter,
- Procedure setter) {
+ static Generator make(
+ ExpressionGeneratorHelper helper,
+ Token token,
+ Expression receiver,
+ Expression index,
+ Procedure getter,
+ Procedure setter) {
if (helper.forest.isThisExpression(receiver)) {
- return new ThisIndexedAccessGenerator<Expression, Statement, Arguments>(
+ return new ThisIndexedAccessGenerator(
helper, token, index, getter, setter);
} else {
- return new IndexedAccessGenerator<Expression, Statement,
- Arguments>.internal(helper, token, receiver, index, getter, setter);
+ return new IndexedAccessGenerator.internal(
+ helper, token, receiver, index, getter, setter);
}
}
@@ -417,14 +388,9 @@
/// Special case of [IndexedAccessGenerator] to avoid creating an indirect
/// access to 'this'.
-abstract class ThisIndexedAccessGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
- factory ThisIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Expression index,
- Procedure getter,
- Procedure setter) {
+abstract class ThisIndexedAccessGenerator implements Generator {
+ factory ThisIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+ Token token, Expression index, Procedure getter, Procedure setter) {
return helper.forest
.thisIndexedAccessGenerator(helper, token, index, getter, setter);
}
@@ -439,14 +405,9 @@
String get debugName => "ThisIndexedAccessGenerator";
}
-abstract class SuperIndexedAccessGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
- factory SuperIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Expression index,
- Member getter,
- Member setter) {
+abstract class SuperIndexedAccessGenerator implements Generator {
+ factory SuperIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+ Token token, Expression index, Member getter, Member setter) {
return helper.forest
.superIndexedAccessGenerator(helper, token, index, getter, setter);
}
@@ -458,22 +419,15 @@
String get debugName => "SuperIndexedAccessGenerator";
}
-abstract class StaticAccessGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
- factory StaticAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Member readTarget,
- Member writeTarget) {
+abstract class StaticAccessGenerator implements Generator {
+ factory StaticAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+ Member readTarget, Member writeTarget) {
return helper.forest
.staticAccessGenerator(helper, token, readTarget, writeTarget);
}
- factory StaticAccessGenerator.fromBuilder(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Declaration declaration,
- Token token,
- Declaration builderSetter) {
+ factory StaticAccessGenerator.fromBuilder(ExpressionGeneratorHelper helper,
+ Declaration declaration, Token token, Declaration builderSetter) {
if (declaration is AccessErrorBuilder) {
AccessErrorBuilder error = declaration;
declaration = error.builder;
@@ -494,8 +448,7 @@
setter = builderSetter.target;
}
}
- return new StaticAccessGenerator<Expression, Statement, Arguments>(
- helper, token, getter, setter);
+ return new StaticAccessGenerator(helper, token, getter, setter);
}
Member get readTarget;
@@ -504,11 +457,8 @@
String get debugName => "StaticAccessGenerator";
}
-abstract class LoadLibraryGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
- factory LoadLibraryGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
+abstract class LoadLibraryGenerator implements Generator {
+ factory LoadLibraryGenerator(ExpressionGeneratorHelper helper, Token token,
LoadLibraryBuilder builder) {
return helper.forest.loadLibraryGenerator(helper, token, builder);
}
@@ -520,20 +470,16 @@
String get debugName => "LoadLibraryGenerator";
}
-abstract class DeferredAccessGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
- factory DeferredAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- PrefixBuilder builder,
- Generator<Expression, Statement, Arguments> generator) {
+abstract class DeferredAccessGenerator implements Generator {
+ factory DeferredAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+ PrefixBuilder builder, Generator generator) {
return helper.forest
.deferredAccessGenerator(helper, token, builder, generator);
}
PrefixBuilder get builder;
- Generator<Expression, Statement, Arguments> get generator;
+ Generator get generator;
@override
buildPropertyAccess(
@@ -541,7 +487,7 @@
var propertyAccess =
generator.buildPropertyAccess(send, operatorOffset, isNullAware);
if (propertyAccess is Generator) {
- return new DeferredAccessGenerator<Expression, Statement, Arguments>(
+ return new DeferredAccessGenerator(
helper, token, builder, propertyAccess);
} else {
Expression expression = propertyAccess;
@@ -586,10 +532,9 @@
}
}
-abstract class TypeUseGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
+abstract class TypeUseGenerator implements Generator {
factory TypeUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
PrefixBuilder prefix,
int declarationReferenceOffset,
@@ -666,13 +611,9 @@
}
}
-abstract class ReadOnlyAccessGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
- factory ReadOnlyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Expression expression,
- String plainNameForRead) {
+abstract class ReadOnlyAccessGenerator implements Generator {
+ factory ReadOnlyAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+ Expression expression, String plainNameForRead) {
return helper.forest
.readOnlyAccessGenerator(helper, token, expression, plainNameForRead);
}
@@ -681,11 +622,9 @@
String get debugName => "ReadOnlyAccessGenerator";
}
-abstract class LargeIntAccessGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
+abstract class LargeIntAccessGenerator implements Generator {
factory LargeIntAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token) {
+ ExpressionGeneratorHelper helper, Token token) {
return helper.forest.largeIntAccessGenerator(helper, token);
}
@@ -715,8 +654,7 @@
}
}
-abstract class ErroneousExpressionGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
+abstract class ErroneousExpressionGenerator implements Generator {
/// Pass [arguments] that must be evaluated before throwing an error. At
/// most one of [isGetter] and [isSetter] should be true and they're passed
/// to [ExpressionGeneratorHelper.buildThrowNoSuchMethodError] if it is used.
@@ -785,7 +723,7 @@
// increment node that wraps an error.
return buildError(
forest.arguments(
- <Expression>[storeOffset(forest.literalInt(1, null), offset)],
+ <Expression>[forest.literalInt(1, null)..fileOffset = offset],
token),
isGetter: true);
}
@@ -797,7 +735,7 @@
// node that wraps an error.
return buildError(
forest.arguments(
- <Expression>[storeOffset(forest.literalInt(1, null), offset)],
+ <Expression>[forest.literalInt(1, null)..fileOffset = offset],
token),
isGetter: true);
}
@@ -825,12 +763,9 @@
}
}
-abstract class UnresolvedNameGenerator<Expression, Statement, Arguments>
- implements ErroneousExpressionGenerator<Expression, Statement, Arguments> {
+abstract class UnresolvedNameGenerator implements ErroneousExpressionGenerator {
factory UnresolvedNameGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Name name) {
+ ExpressionGeneratorHelper helper, Token token, Name name) {
return helper.forest.unresolvedNameGenerator(helper, token, name);
}
@@ -855,7 +790,7 @@
{bool isGetter: false, bool isSetter: false, int offset}) {
offset ??= offsetForToken(this.token);
return helper.throwNoSuchMethodError(
- storeOffset(forest.literalNull(null), offset),
+ forest.literalNull(null)..fileOffset = offset,
plainNameForRead,
arguments,
offset,
@@ -864,11 +799,8 @@
}
}
-abstract class UnlinkedGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
- factory UnlinkedGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
+abstract class UnlinkedGenerator implements Generator {
+ factory UnlinkedGenerator(ExpressionGeneratorHelper helper, Token token,
UnlinkedDeclaration declaration) {
return helper.forest.unlinkedGenerator(helper, token, declaration);
}
@@ -888,9 +820,8 @@
}
}
-abstract class ContextAwareGenerator<Expression, Statement, Arguments>
- implements Generator<Expression, Statement, Arguments> {
- Generator<Expression, Statement, Arguments> get generator;
+abstract class ContextAwareGenerator implements Generator {
+ Generator get generator;
@override
String get plainNameForRead {
@@ -948,14 +879,9 @@
}
}
-abstract class DelayedAssignment<Expression, Statement, Arguments>
- implements ContextAwareGenerator<Expression, Statement, Arguments> {
- factory DelayedAssignment(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Generator<Expression, Statement, Arguments> generator,
- Expression value,
- String assignmentOperator) {
+abstract class DelayedAssignment implements ContextAwareGenerator {
+ factory DelayedAssignment(ExpressionGeneratorHelper helper, Token token,
+ Generator generator, Expression value, String assignmentOperator) {
return helper.forest
.delayedAssignment(helper, token, generator, value, assignmentOperator);
}
@@ -1038,14 +964,9 @@
}
}
-abstract class DelayedPostfixIncrement<Expression, Statement, Arguments>
- implements ContextAwareGenerator<Expression, Statement, Arguments> {
- factory DelayedPostfixIncrement(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Generator<Expression, Statement, Arguments> generator,
- Name binaryOperator,
- Procedure interfaceTarget) {
+abstract class DelayedPostfixIncrement implements ContextAwareGenerator {
+ factory DelayedPostfixIncrement(ExpressionGeneratorHelper helper, Token token,
+ Generator generator, Name binaryOperator, Procedure interfaceTarget) {
return helper.forest.delayedPostfixIncrement(
helper, token, generator, binaryOperator, interfaceTarget);
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index 3589b1c..57df1bb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -26,8 +26,10 @@
import 'kernel_ast_api.dart'
show
+ Arguments,
Constructor,
DartType,
+ Expression,
FunctionNode,
FunctionType,
Initializer,
@@ -45,8 +47,7 @@
PrefixBuilder,
TypeDeclarationBuilder;
-abstract class ExpressionGeneratorHelper<Expression, Statement, Arguments>
- implements InferenceHelper<Expression, Statement, Arguments> {
+abstract class ExpressionGeneratorHelper implements InferenceHelper {
LibraryBuilder get library;
Uri get uri;
@@ -57,7 +58,7 @@
ConstantContext get constantContext;
- Forest<Expression, Statement, Token, Arguments> get forest;
+ Forest get forest;
Constructor lookupConstructor(Name name, {bool isSuper});
@@ -152,6 +153,4 @@
Message warnUnresolvedMethod(Name name, int charOffset, {bool isSuper});
void warnTypeArgumentsMismatch(String name, int expected, int charOffset);
-
- T storeOffset<T>(T node, int offset);
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/factory.dart b/pkg/front_end/lib/src/fasta/kernel/factory.dart
index ebae116..9995d68 100644
--- a/pkg/front_end/lib/src/fasta/kernel/factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/factory.dart
@@ -2,14 +2,18 @@
// 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/scanner/token.dart' show Token;
-
import 'package:kernel/ast.dart' show Catch, DartType, FunctionType, Node;
import 'package:kernel/type_algebra.dart' show Substitution;
+import '../../scanner/token.dart' show Token;
+
import 'kernel_shadow_ast.dart'
- show ExpressionJudgment, InitializerJudgment, StatementJudgment;
+ show
+ ExpressionJudgment,
+ InitializerJudgment,
+ StatementJudgment,
+ SwitchCaseJudgment;
/// Abstract base class for factories that can construct trees of expressions,
/// statements, initializers, and literal types based on tokens, inferred types,
@@ -53,8 +57,13 @@
Expression boolLiteral(ExpressionJudgment judgment, int fileOffset,
Token literal, bool value, DartType inferredType);
- Statement breakStatement(StatementJudgment judgment, int fileOffset,
- Token breakKeyword, Expression label, Token semicolon);
+ Statement breakStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token breakKeyword,
+ Expression label,
+ Token semicolon,
+ covariant Object labelBinder);
Expression cascadeExpression(
ExpressionJudgment judgment, int fileOffset, DartType inferredType);
@@ -72,9 +81,9 @@
Token rightParenthesis,
Statement body,
DartType guardType,
- int exceptionOffset,
+ covariant Object exceptionBinder,
DartType exceptionType,
- int stackTraceOffset,
+ covariant Object stackTraceBinder,
DartType stackTraceType);
Expression conditionalExpression(
@@ -90,11 +99,21 @@
Expression constructorInvocation(ExpressionJudgment judgment, int fileOffset,
Node expressionTarget, DartType inferredType);
- Statement continueStatement(StatementJudgment judgment, int fileOffset,
- Token continueKeyword, Expression label, Token semicolon);
+ Statement continueStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token continueKeyword,
+ Expression label,
+ Token semicolon,
+ covariant Object labelBinder);
- Statement continueSwitchStatement(StatementJudgment judgment, int fileOffset,
- Token continueKeyword, Expression label, Token semicolon);
+ Statement continueSwitchStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token continueKeyword,
+ Expression label,
+ Token semicolon,
+ covariant Object labelBinder);
Expression deferredCheck(
ExpressionJudgment judgment, int fileOffset, DartType inferredType);
@@ -113,6 +132,8 @@
Expression doubleLiteral(ExpressionJudgment judgment, int fileOffset,
Token literal, double value, DartType inferredType);
+ Statement emptyStatement(Token semicolon);
+
Statement expressionStatement(StatementJudgment judgment, int fileOffset,
Expression expression, Token semicolon);
@@ -129,17 +150,41 @@
Statement forInStatement(
StatementJudgment judgment,
int fileOffset,
- int variableOffset,
- DartType variableType,
+ Token awaitKeyword,
+ Token forKeyword,
+ Token leftParenthesis,
+ covariant Object loopVariable,
+ Token identifier,
+ Token inKeyword,
+ Expression iterator,
+ Token rightParenthesis,
+ Statement body,
+ covariant Object loopVariableBinder,
+ DartType loopVariableType,
int writeOffset,
DartType writeVariableType,
int writeVariableDeclarationOffset,
Node writeTarget);
- Statement forStatement(StatementJudgment judgment, int fileOffset);
+ Statement forStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token forKeyword,
+ Token leftParenthesis,
+ covariant Object variableDeclarationList,
+ Expression initialization,
+ Token leftSeparator,
+ Expression condition,
+ Token rightSeparator,
+ List<Expression> updaters,
+ Token rightParenthesis,
+ Statement body);
Statement functionDeclaration(
- StatementJudgment judgment, int fileOffset, FunctionType inferredType);
+ covariant Object binder, FunctionType inferredType);
+
+ Object binderForFunctionDeclaration(
+ StatementJudgment judgment, int fileOffset, String name);
Expression functionExpression(
ExpressionJudgment judgment, int fileOffset, DartType inferredType);
@@ -190,10 +235,22 @@
DartType testedType,
DartType inferredType);
- Statement labeledStatement(StatementJudgment judgment, int fileOffset);
+ Statement labeledStatement(List<Object> labels, Statement statement);
+
+ Object statementLabel(covariant Object binder, Token label, Token colon);
+
+ Object binderForStatementLabel(
+ StatementJudgment judgment, int fileOffset, String name);
Expression listLiteral(
- ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+ ExpressionJudgment judgment,
+ int fileOffset,
+ Token constKeyword,
+ covariant Object typeArguments,
+ Token leftBracket,
+ List<Expression> elements,
+ Token rightBracket,
+ DartType inferredType);
Expression logicalExpression(
ExpressionJudgment judgment,
@@ -204,7 +261,17 @@
DartType inferredType);
Expression mapLiteral(
- ExpressionJudgment judgment, int fileOffset, DartType typeContext);
+ ExpressionJudgment judgment,
+ int fileOffset,
+ Token constKeyword,
+ covariant Object typeArguments,
+ Token leftBracket,
+ List<Object> entries,
+ Token rightBracket,
+ DartType inferredType);
+
+ Object mapLiteralEntry(Object judgment, int fileOffset, Expression key,
+ Token separator, Expression value);
Expression methodInvocation(
ExpressionJudgment judgment,
@@ -225,8 +292,8 @@
Substitution substitution,
DartType inferredType);
- Expression namedFunctionExpression(
- ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+ Expression namedFunctionExpression(ExpressionJudgment judgment,
+ covariant Object binder, DartType inferredType);
Expression not(ExpressionJudgment judgment, int fileOffset, Token operator,
Expression operand, DartType inferredType);
@@ -300,7 +367,29 @@
Token constructorName,
covariant Object argumentList);
- Statement switchStatement(StatementJudgment judgment, int fileOffset);
+ Object switchCase(
+ SwitchCaseJudgment judgment,
+ List<Object> labels,
+ Token keyword,
+ Expression expression,
+ Token colon,
+ List<Statement> statements);
+
+ Object switchLabel(covariant Object binder, Token label, Token colon);
+
+ Object binderForSwitchLabel(
+ SwitchCaseJudgment judgment, int fileOffset, String name);
+
+ Statement switchStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token switchKeyword,
+ Token leftParenthesis,
+ Expression expression,
+ Token rightParenthesis,
+ Token leftBracket,
+ List<Object> members,
+ Token rightBracket);
Expression symbolLiteral(
ExpressionJudgment judgment,
@@ -318,7 +407,14 @@
Statement tryCatch(StatementJudgment judgment, int fileOffset);
- Statement tryFinally(StatementJudgment judgment, int fileOffset);
+ Statement tryFinally(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token tryKeyword,
+ Statement body,
+ List<Object> catchClauses,
+ Token finallyKeyword,
+ Statement finallyBlock);
Expression typeLiteral(ExpressionJudgment judgment, int fileOffset,
Node expressionType, DartType inferredType);
@@ -331,18 +427,14 @@
Node combiner,
DartType inferredType);
- Statement variableDeclaration(StatementJudgment judgment, int fileOffset,
- DartType statementType, DartType inferredType);
+ Statement variableDeclaration(
+ covariant Object binder, DartType statementType, DartType inferredType);
- Expression variableGet(
- ExpressionJudgment judgment,
- int fileOffset,
- bool isInCascade,
- int expressionVariableDeclarationOffset,
- DartType inferredType);
+ Object binderForVariableDeclaration(
+ StatementJudgment judgment, int fileOffset, String name);
- Expression variableSet(
- ExpressionJudgment judgment, int fileOffset, DartType inferredType);
+ Expression variableGet(ExpressionJudgment judgment, int fileOffset,
+ bool isInCascade, covariant Object variableBinder, DartType inferredType);
Statement whileStatement(
StatementJudgment judgment,
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 0c4014e..b091616 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -81,32 +81,33 @@
DoJudgment,
DoubleJudgment,
EmptyStatementJudgment,
+ ExpressionStatementJudgment,
+ ForJudgment,
+ IfJudgment,
IntJudgment,
IsJudgment,
IsNotJudgment,
LabeledStatementJudgment,
+ ListLiteralJudgment,
LoadLibraryJudgment,
+ LogicalJudgment,
+ MapEntryJudgment,
+ MapLiteralJudgment,
+ NotJudgment,
NullJudgment,
- ExpressionStatementJudgment,
- ShadowForStatement,
- IfJudgment,
- ShadowListLiteral,
- ShadowLogicalExpression,
- ShadowMapLiteral,
- ShadowNot,
- ShadowRethrow,
+ RethrowJudgment,
ReturnJudgment,
- ShadowStringConcatenation,
- ShadowStringLiteral,
- ShadowSymbolLiteral,
- ShadowSyntheticExpression,
- TryCatchJudgment,
- ShadowTryFinally,
- WhileJudgment,
- YieldJudgment,
+ StringConcatenationJudgment,
+ StringLiteralJudgment,
+ SymbolLiteralJudgment,
+ SyntheticExpressionJudgment,
ThisJudgment,
ThrowJudgment,
- TypeLiteralJudgment;
+ TryCatchJudgment,
+ TryFinallyJudgment,
+ TypeLiteralJudgment,
+ WhileJudgment,
+ YieldJudgment;
import 'forest.dart'
show
@@ -119,7 +120,7 @@
UnlinkedDeclaration;
/// A shadow tree factory.
-class Fangorn extends Forest<Expression, Statement, Token, Arguments> {
+class Fangorn extends Forest {
const Fangorn();
@override
@@ -155,25 +156,25 @@
}
@override
- ShadowStringLiteral asLiteralString(Expression value) => value;
+ StringLiteralJudgment asLiteralString(Expression value) => value;
@override
BoolJudgment literalBool(bool value, Token token) {
- return new BoolJudgment(value)..fileOffset = offsetForToken(token);
+ return new BoolJudgment(token, value)..fileOffset = offsetForToken(token);
}
@override
DoubleJudgment literalDouble(double value, Token token) {
- return new DoubleJudgment(value)..fileOffset = offsetForToken(token);
+ return new DoubleJudgment(token, value)..fileOffset = offsetForToken(token);
}
@override
IntJudgment literalInt(int value, Token token) {
- return new IntJudgment(value)..fileOffset = offsetForToken(token);
+ return new IntJudgment(token, value)..fileOffset = offsetForToken(token);
}
@override
- ShadowListLiteral literalList(
+ ListLiteralJudgment literalList(
Token constKeyword,
bool isConst,
Object typeArgument,
@@ -183,13 +184,14 @@
Token rightBracket) {
// TODO(brianwilkerson): The file offset computed below will not be correct
// if there are type arguments but no `const` keyword.
- return new ShadowListLiteral(expressions,
+ return new ListLiteralJudgment(
+ constKeyword, leftBracket, expressions, rightBracket,
typeArgument: typeArgument, isConst: isConst)
..fileOffset = offsetForToken(constKeyword ?? leftBracket);
}
@override
- ShadowMapLiteral literalMap(
+ MapLiteralJudgment literalMap(
Token constKeyword,
bool isConst,
DartType keyType,
@@ -200,29 +202,31 @@
Token rightBracket) {
// TODO(brianwilkerson): The file offset computed below will not be correct
// if there are type arguments but no `const` keyword.
- return new ShadowMapLiteral(entries,
+ return new MapLiteralJudgment(
+ constKeyword, leftBracket, entries, rightBracket,
keyType: keyType, valueType: valueType, isConst: isConst)
..fileOffset = offsetForToken(constKeyword ?? leftBracket);
}
@override
NullJudgment literalNull(Token token) {
- return new NullJudgment()..fileOffset = offsetForToken(token);
+ return new NullJudgment(token)..fileOffset = offsetForToken(token);
}
@override
- ShadowStringLiteral literalString(String value, Token token) {
- return new ShadowStringLiteral(value)..fileOffset = offsetForToken(token);
+ StringLiteralJudgment literalString(String value, Token token) {
+ return new StringLiteralJudgment(token, value)
+ ..fileOffset = offsetForToken(token);
}
@override
- ShadowSymbolLiteral literalSymbolMultiple(String value, Token hash, _) {
- return new ShadowSymbolLiteral(value)..fileOffset = offsetForToken(hash);
+ SymbolLiteralJudgment literalSymbolMultiple(String value, Token hash, _) {
+ return new SymbolLiteralJudgment(value)..fileOffset = offsetForToken(hash);
}
@override
- ShadowSymbolLiteral literalSymbolSingluar(String value, Token hash, _) {
- return new ShadowSymbolLiteral(value)..fileOffset = offsetForToken(hash);
+ SymbolLiteralJudgment literalSymbolSingluar(String value, Token hash, _) {
+ return new SymbolLiteralJudgment(value)..fileOffset = offsetForToken(hash);
}
@override
@@ -232,12 +236,12 @@
@override
MapEntry mapEntry(Expression key, Token colon, Expression value) {
- return new MapEntry(key, value)..fileOffset = offsetForToken(colon);
+ return new MapEntryJudgment(key, value)..fileOffset = offsetForToken(colon);
}
@override
List<MapEntry> mapEntryList(int length) {
- return new List<MapEntry>.filled(length, null, growable: true);
+ return new List<MapEntryJudgment>.filled(length, null, growable: true);
}
@override
@@ -261,7 +265,8 @@
@override
Expression asExpression(Expression expression, covariant type, Token token) {
- return new AsJudgment(expression, type)..fileOffset = offsetForToken(token);
+ return new AsJudgment(expression, token, type)
+ ..fileOffset = offsetForToken(token);
}
@override
@@ -271,8 +276,13 @@
Expression condition,
Token comma,
Expression message) {
- return new AssertInitializerJudgment(assertStatement(
- assertKeyword, leftParenthesis, condition, comma, message, null));
+ return new AssertInitializerJudgment(
+ assertStatement(
+ assertKeyword, leftParenthesis, condition, comma, message, null),
+ assertKeyword,
+ leftParenthesis,
+ comma,
+ leftParenthesis.endGroup);
}
@override
@@ -311,7 +321,8 @@
endOffset = conditionLastToken.offset + conditionLastToken.length;
}
}
- return new AssertStatementJudgment(condition,
+ return new AssertStatementJudgment(assertKeyword, leftParenthesis,
+ condition, comma, leftParenthesis.endGroup, semicolon,
conditionStartOffset: startOffset,
conditionEndOffset: endOffset,
message: message);
@@ -319,7 +330,8 @@
@override
Expression awaitExpression(Expression operand, Token token) {
- return new AwaitJudgment(operand)..fileOffset = offsetForToken(token);
+ return new AwaitJudgment(token, operand)
+ ..fileOffset = offsetForToken(token);
}
@override
@@ -335,13 +347,14 @@
copy.add(statement);
}
}
- return new BlockJudgment(copy ?? statements)
+ return new BlockJudgment(openBrace, copy ?? statements, closeBrace)
..fileOffset = offsetForToken(openBrace);
}
@override
Statement breakStatement(Token breakKeyword, Object label, Token semicolon) {
- return new BreakJudgment(null)..fileOffset = breakKeyword.charOffset;
+ return new BreakJudgment(breakKeyword, null, semicolon)
+ ..fileOffset = breakKeyword.charOffset;
}
@override
@@ -354,7 +367,9 @@
DartType stackTraceType,
Statement body) {
exceptionType ??= const DynamicType();
- return new CatchJudgment(exceptionParameter, body,
+ // TODO(brianwilkerson) Get the left and right parentheses and the comma.
+ return new CatchJudgment(
+ onKeyword, catchKeyword, null, exceptionParameter, null, null, body,
guard: exceptionType, stackTrace: stackTraceParameter)
..fileOffset = offsetForToken(onKeyword ?? catchKeyword);
}
@@ -362,29 +377,34 @@
@override
Expression conditionalExpression(Expression condition, Token question,
Expression thenExpression, Token colon, Expression elseExpression) {
- return new ConditionalJudgment(condition, thenExpression, elseExpression)
+ return new ConditionalJudgment(
+ condition, question, thenExpression, colon, elseExpression)
..fileOffset = offsetForToken(question);
}
@override
Statement continueStatement(
Token continueKeyword, Object label, Token semicolon) {
- return new ContinueJudgment(null)..fileOffset = continueKeyword.charOffset;
+ return new ContinueJudgment(continueKeyword, null, semicolon)
+ ..fileOffset = continueKeyword.charOffset;
}
@override
Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
Expression condition, Token semicolon) {
- return new DoJudgment(body, condition)..fileOffset = doKeyword.charOffset;
+ // TODO(brianwilkerson): Plumb through the left-and right parentheses.
+ return new DoJudgment(
+ doKeyword, body, whileKeyword, null, condition, null, semicolon)
+ ..fileOffset = doKeyword.charOffset;
}
Statement expressionStatement(Expression expression, Token semicolon) {
- return new ExpressionStatementJudgment(expression);
+ return new ExpressionStatementJudgment(expression, semicolon);
}
@override
Statement emptyStatement(Token semicolon) {
- return new EmptyStatementJudgment();
+ return new EmptyStatementJudgment(semicolon);
}
@override
@@ -392,21 +412,34 @@
Token forKeyword,
Token leftParenthesis,
List<VariableDeclaration> variableList,
- covariant initialization,
+ List<Expression> initializers,
Token leftSeparator,
Expression condition,
Statement conditionStatement,
List<Expression> updaters,
Token rightParenthesis,
Statement body) {
- return new ShadowForStatement(variableList, condition, updaters, body)
+ // TODO(brianwilkerson): Plumb through the right separator.
+ return new ForJudgment(
+ forKeyword,
+ leftParenthesis,
+ variableList,
+ initializers,
+ leftSeparator,
+ condition,
+ null,
+ updaters,
+ leftParenthesis.endGroup,
+ body)
..fileOffset = forKeyword.charOffset;
}
@override
Statement ifStatement(Token ifKeyword, Expression condition,
Statement thenStatement, Token elseKeyword, Statement elseStatement) {
- return new IfJudgment(condition, thenStatement, elseStatement)
+ // TODO(brianwilkerson) Plumb through the left and right parentheses.
+ return new IfJudgment(ifKeyword, null, condition, null, thenStatement,
+ elseKeyword, elseStatement)
..fileOffset = ifKeyword.charOffset;
}
@@ -415,9 +448,9 @@
Expression operand, isOperator, Token notOperator, covariant type) {
int offset = offsetForToken(isOperator);
if (notOperator != null) {
- return new IsNotJudgment(operand, type, offset);
+ return new IsNotJudgment(operand, isOperator, notOperator, type, offset);
}
- return new IsJudgment(operand, type)..fileOffset = offset;
+ return new IsJudgment(operand, isOperator, type)..fileOffset = offset;
}
@override
@@ -426,21 +459,19 @@
}
@override
- Statement labeledStatement(
- LabelTarget<Statement> target, Statement statement) =>
+ Statement labeledStatement(LabelTarget target, Statement statement) =>
statement;
@override
Expression logicalExpression(
Expression leftOperand, Token operator, Expression rightOperand) {
- return new ShadowLogicalExpression(
- leftOperand, operator.stringValue, rightOperand)
+ return new LogicalJudgment(leftOperand, operator, rightOperand)
..fileOffset = offsetForToken(operator);
}
@override
Expression notExpression(Expression operand, Token token) {
- return new ShadowNot(operand)..fileOffset = offsetForToken(token);
+ return new NotJudgment(token, operand)..fileOffset = offsetForToken(token);
}
@override
@@ -452,20 +483,22 @@
@override
Statement rethrowStatement(Token rethrowKeyword, Token semicolon) {
return new ExpressionStatementJudgment(
- new ShadowRethrow()..fileOffset = offsetForToken(rethrowKeyword));
+ new RethrowJudgment(rethrowKeyword)
+ ..fileOffset = offsetForToken(rethrowKeyword),
+ semicolon);
}
@override
Statement returnStatement(
Token returnKeyword, Expression expression, Token semicolon) {
- return new ReturnJudgment(expression)
+ return new ReturnJudgment(returnKeyword, semicolon, expression)
..fileOffset = returnKeyword.charOffset;
}
@override
Expression stringConcatenationExpression(
List<Expression> expressions, Token token) {
- return new ShadowStringConcatenation(expressions)
+ return new StringConcatenationJudgment(expressions)
..fileOffset = offsetForToken(token);
}
@@ -476,26 +509,23 @@
@override
Expression thisExpression(Token token) {
- return new ThisJudgment()..fileOffset = offsetForToken(token);
+ return new ThisJudgment(token)..fileOffset = offsetForToken(token);
}
@override
Expression throwExpression(Token throwKeyword, Expression expression) {
- return new ThrowJudgment(expression)
+ return new ThrowJudgment(throwKeyword, expression)
..fileOffset = offsetForToken(throwKeyword);
}
@override
Statement tryStatement(Token tryKeyword, Statement body,
List<Catch> catchClauses, Token finallyKeyword, Statement finallyBlock) {
- Statement tryStatement = body;
- if (catchClauses != null) {
- tryStatement = new TryCatchJudgment(tryStatement, catchClauses);
- }
if (finallyBlock != null) {
- tryStatement = new ShadowTryFinally(tryStatement, finallyBlock);
+ return new TryFinallyJudgment(
+ tryKeyword, body, catchClauses, finallyKeyword, finallyBlock);
}
- return tryStatement;
+ return new TryCatchJudgment(body, catchClauses ?? const <CatchJudgment>[]);
}
@override
@@ -513,10 +543,10 @@
@override
Statement wrapVariables(Statement statement) {
if (statement is _VariablesDeclaration) {
- return new BlockJudgment(statement.declarations)
+ return new BlockJudgment(null, statement.declarations, null)
..fileOffset = statement.fileOffset;
} else if (statement is VariableDeclaration) {
- return new BlockJudgment(<Statement>[statement])
+ return new BlockJudgment(null, <Statement>[statement], null)
..fileOffset = statement.fileOffset;
} else {
return statement;
@@ -526,14 +556,15 @@
@override
Statement whileStatement(
Token whileKeyword, Expression condition, Statement body) {
- return new WhileJudgment(condition, body)
+ // TODO(brianwilkerson) Plumb through the left and right parentheses.
+ return new WhileJudgment(whileKeyword, null, condition, null, body)
..fileOffset = whileKeyword.charOffset;
}
@override
Statement yieldStatement(
Token yieldKeyword, Token star, Expression expression, Token semicolon) {
- return new YieldJudgment(expression, isYieldStar: star != null)
+ return new YieldJudgment(yieldKeyword, star, expression, semicolon)
..fileOffset = yieldKeyword.charOffset;
}
@@ -569,8 +600,8 @@
VariableDeclaration variable = node;
node = variable.initializer;
}
- if (node is ShadowSyntheticExpression) {
- ShadowSyntheticExpression synth = node;
+ if (node is SyntheticExpressionJudgment) {
+ SyntheticExpressionJudgment synth = node;
node = synth.desugared;
}
if (node is Let) {
@@ -616,7 +647,7 @@
@override
KernelVariableUseGenerator variableUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
VariableDeclaration variable,
DartType promotedType) {
@@ -626,7 +657,7 @@
@override
KernelPropertyAccessGenerator propertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
Expression receiver,
Name name,
@@ -638,7 +669,7 @@
@override
KernelThisPropertyAccessGenerator thisPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
Name name,
Member getter,
@@ -649,7 +680,7 @@
@override
KernelNullAwarePropertyAccessGenerator nullAwarePropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
Expression receiverExpression,
Name name,
@@ -662,7 +693,7 @@
@override
KernelSuperPropertyAccessGenerator superPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
Name name,
Member getter,
@@ -673,7 +704,7 @@
@override
KernelIndexedAccessGenerator indexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
Expression receiver,
Expression index,
@@ -685,7 +716,7 @@
@override
KernelThisIndexedAccessGenerator thisIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
Expression index,
Procedure getter,
@@ -696,7 +727,7 @@
@override
KernelSuperIndexedAccessGenerator superIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
Expression index,
Member getter,
@@ -707,7 +738,7 @@
@override
KernelStaticAccessGenerator staticAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
Member getter,
Member setter) {
@@ -716,7 +747,7 @@
@override
KernelLoadLibraryGenerator loadLibraryGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
LoadLibraryBuilder builder) {
return new KernelLoadLibraryGenerator(helper, token, builder);
@@ -724,16 +755,16 @@
@override
KernelDeferredAccessGenerator deferredAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
PrefixBuilder builder,
- Generator<Expression, Statement, Arguments> generator) {
+ Generator generator) {
return new KernelDeferredAccessGenerator(helper, token, builder, generator);
}
@override
KernelTypeUseGenerator typeUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
PrefixBuilder prefix,
int declarationReferenceOffset,
@@ -745,7 +776,7 @@
@override
KernelReadOnlyAccessGenerator readOnlyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
Expression expression,
String plainNameForRead) {
@@ -755,32 +786,27 @@
@override
KernelLargeIntAccessGenerator largeIntAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token) {
+ ExpressionGeneratorHelper helper, Token token) {
return new KernelLargeIntAccessGenerator(helper, token);
}
@override
KernelUnresolvedNameGenerator unresolvedNameGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Name name) {
+ ExpressionGeneratorHelper helper, Token token, Name name) {
return new KernelUnresolvedNameGenerator(helper, token, name);
}
@override
- KernelUnlinkedGenerator unlinkedGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- UnlinkedDeclaration declaration) {
+ KernelUnlinkedGenerator unlinkedGenerator(ExpressionGeneratorHelper helper,
+ Token token, UnlinkedDeclaration declaration) {
return new KernelUnlinkedGenerator(helper, token, declaration);
}
@override
KernelDelayedAssignment delayedAssignment(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
- Generator<Expression, Statement, Arguments> generator,
+ Generator generator,
Expression value,
String assignmentOperator) {
return new KernelDelayedAssignment(
@@ -789,9 +815,9 @@
@override
KernelDelayedPostfixIncrement delayedPostfixIncrement(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
- Generator<Expression, Statement, Arguments> generator,
+ Generator generator,
Name binaryOperator,
Procedure interfaceTarget) {
return new KernelDelayedPostfixIncrement(
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 4d80798..0325d02 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -4,13 +4,15 @@
library fasta.forest;
-import 'package:kernel/ast.dart' as kernel
+import 'package:kernel/ast.dart'
show
Arguments, // TODO(ahe): Remove this import.
DartType,
+ Expression,
Member,
Name,
- Procedure;
+ Procedure,
+ Statement;
import 'body_builder.dart' show Identifier, LabelTarget;
@@ -25,6 +27,8 @@
TypeDeclarationBuilder,
UnlinkedDeclaration;
+import '../scanner.dart' show Token;
+
export 'body_builder.dart' show Identifier, Operator;
export 'expression_generator.dart' show Generator;
@@ -39,15 +43,13 @@
UnlinkedDeclaration;
/// A tree factory.
-///
-/// For now, the [Location] is always a token.
-abstract class Forest<Expression, Statement, Location, Arguments> {
+abstract class Forest {
const Forest();
- Arguments arguments(List<Expression> positional, Location location,
+ Arguments arguments(List<Expression> positional, Token location,
{covariant List types, covariant List named});
- Arguments argumentsEmpty(Location location);
+ Arguments argumentsEmpty(Token location);
List argumentsNamed(Arguments arguments);
@@ -61,15 +63,15 @@
/// Return a representation of a boolean literal at the given [location]. The
/// literal has the given [value].
- Expression literalBool(bool value, Location location);
+ Expression literalBool(bool value, Token location);
/// Return a representation of a double literal at the given [location]. The
/// literal has the given [value].
- Expression literalDouble(double value, Location location);
+ Expression literalDouble(double value, Token location);
/// Return a representation of an integer literal at the given [location]. The
/// literal has the given [value].
- Expression literalInt(int value, Location location);
+ Expression literalInt(int value, Token location);
/// Return a representation of a list literal. The [constKeyword] is the
/// location of the `const` keyword, or `null` if there is no keyword. The
@@ -83,13 +85,13 @@
/// [expressions] is a list of the representations of the list elements. The
/// [rightBracket] is the location of the `]`.
Expression literalList(
- Location constKeyword,
+ Token constKeyword,
bool isConst,
Object typeArgument,
Object typeArguments,
- Location leftBracket,
+ Token leftBracket,
List<Expression> expressions,
- Location rightBracket);
+ Token rightBracket);
/// Return a representation of a map literal. The [constKeyword] is the
/// location of the `const` keyword, or `null` if there is no keyword. The
@@ -105,41 +107,40 @@
/// of the `{`. The list of [entries] is a list of the representations of the
/// map entries. The [rightBracket] is the location of the `}`.
Expression literalMap(
- Location constKeyword,
+ Token constKeyword,
bool isConst,
covariant keyType,
covariant valueType,
Object typeArguments,
- Location leftBracket,
+ Token leftBracket,
covariant List entries,
- Location rightBracket);
+ Token rightBracket);
/// Return a representation of a null literal at the given [location].
- Expression literalNull(Location location);
+ Expression literalNull(Token location);
/// Return a representation of a simple string literal at the given
/// [location]. The literal has the given [value]. This does not include
/// either adjacent strings or interpolated strings.
- Expression literalString(String value, Location location);
+ Expression literalString(String value, Token location);
/// Return a representation of a symbol literal defined by the [hash] and the
/// list of [components]. The [value] is the string value of the symbol.
Expression literalSymbolMultiple(
- String value, Location hash, List<Identifier> components);
+ String value, Token hash, List<Identifier> components);
/// Return a representation of a symbol literal defined by the [hash] and the
/// single [component]. The component can be either an [Identifier] or an
/// [Operator]. The [value] is the string value of the symbol.
- Expression literalSymbolSingluar(
- String value, Location hash, Object component);
+ Expression literalSymbolSingluar(String value, Token hash, Object component);
- Expression literalType(covariant type, Location location);
+ Expression literalType(covariant type, Token location);
/// Return a representation of a key/value pair in a literal map. The [key] is
/// the representation of the expression used to compute the key. The [colon]
/// is the location of the colon separating the key and the value. The [value]
/// is the representation of the expression used to compute the value.
- Object mapEntry(Expression key, Location colon, Expression value);
+ Object mapEntry(Expression key, Token colon, Expression value);
/// Return a list that can hold [length] representations of map entries, as
/// returned from [mapEntry].
@@ -153,45 +154,40 @@
/// Given a representation of a list of [typeArguments], return the type
/// associated with the argument at the given [index].
- kernel.DartType getTypeAt(covariant typeArguments, int index);
+ DartType getTypeAt(covariant typeArguments, int index);
Expression loadLibrary(covariant dependency);
Expression checkLibraryIsLoaded(covariant dependency);
Expression asExpression(
- Expression expression, covariant type, Location location);
+ Expression expression, covariant type, Token location);
/// Return a representation of an assert that appears in a constructor's
/// initializer list.
- Object assertInitializer(Location assertKeyword, Location leftParenthesis,
- Expression condition, Location comma, Expression message);
+ Object assertInitializer(Token assertKeyword, Token leftParenthesis,
+ Expression condition, Token comma, Expression message);
/// Return a representation of an assert that appears as a statement.
- Statement assertStatement(
- Location assertKeyword,
- Location leftParenthesis,
- Expression condition,
- Location comma,
- Expression message,
- Location semicolon);
+ Statement assertStatement(Token assertKeyword, Token leftParenthesis,
+ Expression condition, Token comma, Expression message, Token semicolon);
- Expression awaitExpression(Expression operand, Location location);
+ Expression awaitExpression(Expression operand, Token location);
/// Return a representation of a block of [statements] enclosed between the
/// [openBracket] and [closeBracket].
Statement block(
- Location openBrace, List<Statement> statements, Location closeBrace);
+ Token openBrace, List<Statement> statements, Token closeBrace);
/// Return a representation of a break statement.
Statement breakStatement(
- Location breakKeyword, Identifier label, Location semicolon);
+ Token breakKeyword, Identifier label, Token semicolon);
/// Return a representation of a catch clause.
Object catchClause(
- Location onKeyword,
+ Token onKeyword,
covariant exceptionType,
- Location catchKeyword,
+ Token catchKeyword,
covariant exceptionParameter,
covariant stackTraceParameter,
covariant stackTraceType,
@@ -202,95 +198,90 @@
/// [thenExpression] is the expression following the question mark. The
/// [colon] is the `:`. The [elseExpression] is the expression following the
/// colon.
- Expression conditionalExpression(Expression condition, Location question,
- Expression thenExpression, Location colon, Expression elseExpression);
+ Expression conditionalExpression(Expression condition, Token question,
+ Expression thenExpression, Token colon, Expression elseExpression);
/// Return a representation of a continue statement.
Statement continueStatement(
- Location continueKeyword, Identifier label, Location semicolon);
+ Token continueKeyword, Identifier label, Token semicolon);
/// Return a representation of a do statement.
- Statement doStatement(
- Location doKeyword,
- Statement body,
- Location whileKeyword,
- covariant Expression condition,
- Location semicolon);
+ Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
+ covariant Expression condition, Token semicolon);
/// Return a representation of an expression statement composed from the
/// [expression] and [semicolon].
- Statement expressionStatement(Expression expression, Location semicolon);
+ Statement expressionStatement(Expression expression, Token semicolon);
/// Return a representation of an empty statement consisting of the given
/// [semicolon].
- Statement emptyStatement(Location semicolon);
+ Statement emptyStatement(Token semicolon);
/// Return a representation of a for statement.
Statement forStatement(
- Location forKeyword,
- Location leftParenthesis,
+ Token forKeyword,
+ Token leftParenthesis,
covariant variableList,
- covariant initialization,
- Location leftSeparator,
+ covariant initializers,
+ Token leftSeparator,
Expression condition,
Statement conditionStatement,
List<Expression> updaters,
- Location rightParenthesis,
+ Token rightParenthesis,
Statement body);
/// Return a representation of an `if` statement.
- Statement ifStatement(Location ifKeyword, covariant Expression condition,
- Statement thenStatement, Location elseKeyword, Statement elseStatement);
+ Statement ifStatement(Token ifKeyword, covariant Expression condition,
+ Statement thenStatement, Token elseKeyword, Statement elseStatement);
/// Return a representation of an `is` expression. The [operand] is the
/// representation of the left operand. The [isOperator] is the `is` operator.
/// The [notOperator] is either the `!` or `null` if the test is not negated.
/// The [type] is a representation of the type that is the right operand.
- Expression isExpression(Expression operand, Location isOperator,
- Location notOperator, covariant type);
+ Expression isExpression(
+ Expression operand, Token isOperator, Token notOperator, covariant type);
/// Return a representation of the label consisting of the given [identifer]
/// followed by the given [colon].
- Object label(Location identifier, Location colon);
+ Object label(Token identifier, Token colon);
/// Return a representation of a [statement] that has one or more labels (from
/// the [target]) associated with it.
- Statement labeledStatement(
- LabelTarget<Statement> target, Statement statement);
+ Statement labeledStatement(LabelTarget target, Statement statement);
/// Return a representation of a logical expression having the [leftOperand],
/// [rightOperand] and the [operator] (either `&&` or `||`).
Expression logicalExpression(
- Expression leftOperand, Location operator, Expression rightOperand);
+ Expression leftOperand, Token operator, Expression rightOperand);
- Expression notExpression(Expression operand, Location location);
+ Expression notExpression(Expression operand, Token location);
/// Return a representation of a parenthesized condition consisting of the
/// given [expression] between the [leftParenthesis] and [rightParenthesis].
- Object parenthesizedCondition(Location leftParenthesis, Expression expression,
- Location rightParenthesis);
+ Object parenthesizedCondition(
+ Token leftParenthesis, Expression expression, Token rightParenthesis);
/// Return a representation of a rethrow statement consisting of the
/// [rethrowKeyword] followed by the [semicolon].
- Statement rethrowStatement(Location rethrowKeyword, Location semicolon);
+ Statement rethrowStatement(Token rethrowKeyword, Token semicolon);
/// Return a representation of a return statement.
Statement returnStatement(
- Location returnKeyword, Expression expression, Location semicolon);
+ Token returnKeyword, Expression expression, Token semicolon);
Expression stringConcatenationExpression(
- List<Expression> expressions, Location location);
+ List<Expression> expressions, Token location);
/// The given [statement] is being used as the target of either a break or
/// continue statement. Return the statement that should be used as the actual
/// target.
Statement syntheticLabeledStatement(Statement statement);
- Expression thisExpression(Location location);
+ Expression thisExpression(Token location);
/// Return a representation of a throw expression consisting of the
/// [throwKeyword].
- Expression throwExpression(Location throwKeyword, Expression expression);
+ Expression throwExpression(Token throwKeyword, Expression expression);
/// Return a representation of a try statement. The statement is introduced by
/// the [tryKeyword] and the given [body]. If catch clauses were included,
@@ -300,8 +291,8 @@
/// was an error in some part of the try statement, then an [errorReplacement]
/// might be provided, in which case it could be returned instead of the
/// representation of the try statement.
- Statement tryStatement(Location tryKeyword, Statement body,
- covariant catchClauses, Location finallyKeyword, Statement finallyBlock);
+ Statement tryStatement(Token tryKeyword, Statement body,
+ covariant catchClauses, Token finallyKeyword, Statement finallyBlock);
Statement variablesDeclaration(covariant List declarations, Uri uri);
@@ -313,13 +304,13 @@
/// Return a representation of a while statement introduced by the
/// [whileKeyword] and consisting of the given [condition] and [body].
Statement whileStatement(
- Location whileKeyword, covariant Expression condition, Statement body);
+ Token whileKeyword, covariant Expression condition, Statement body);
/// Return a representation of a yield statement consisting of the
/// [yieldKeyword], [star], [expression], and [semicolon]. The [star] is null
/// when no star was included in the source code.
- Statement yieldStatement(Location yieldKeyword, Location star,
- Expression expression, Location semicolon);
+ Statement yieldStatement(
+ Token yieldKeyword, Token star, Expression expression, Token semicolon);
/// Return the expression from the given expression [statement].
Expression getExpressionFromExpressionStatement(Statement statement);
@@ -368,127 +359,87 @@
/// Set the type of the [parameter] to the given [type].
void setParameterType(covariant parameter, covariant type);
- Generator<Expression, Statement, Arguments> variableUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
- covariant variable,
- kernel.DartType promotedType);
+ Generator variableUseGenerator(ExpressionGeneratorHelper helper,
+ Token location, covariant variable, DartType promotedType);
- Generator<Expression, Statement, Arguments> propertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
+ Generator propertyAccessGenerator(
+ ExpressionGeneratorHelper helper,
+ Token location,
Expression receiver,
- kernel.Name name,
- kernel.Member getter,
- kernel.Member setter);
+ Name name,
+ Member getter,
+ Member setter);
- Generator<Expression, Statement, Arguments> thisPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
- kernel.Name name,
- kernel.Member getter,
- kernel.Member setter);
+ Generator thisPropertyAccessGenerator(ExpressionGeneratorHelper helper,
+ Token location, Name name, Member getter, Member setter);
- Generator<Expression, Statement, Arguments> nullAwarePropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
+ Generator nullAwarePropertyAccessGenerator(
+ ExpressionGeneratorHelper helper,
+ Token location,
Expression receiverExpression,
- kernel.Name name,
- kernel.Member getter,
- kernel.Member setter,
- kernel.DartType type);
+ Name name,
+ Member getter,
+ Member setter,
+ DartType type);
- Generator<Expression, Statement, Arguments> superPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
- kernel.Name name,
- kernel.Member getter,
- kernel.Member setter);
+ Generator superPropertyAccessGenerator(ExpressionGeneratorHelper helper,
+ Token location, Name name, Member getter, Member setter);
- Generator<Expression, Statement, Arguments> indexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
+ Generator indexedAccessGenerator(
+ ExpressionGeneratorHelper helper,
+ Token location,
Expression receiver,
Expression index,
- kernel.Procedure getter,
- kernel.Procedure setter);
+ Procedure getter,
+ Procedure setter);
- Generator<Expression, Statement, Arguments> thisIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
- Expression index,
- kernel.Procedure getter,
- kernel.Procedure setter);
+ Generator thisIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+ Token location, Expression index, Procedure getter, Procedure setter);
- Generator<Expression, Statement, Arguments> superIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
- Expression index,
- kernel.Member getter,
- kernel.Member setter);
+ Generator superIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+ Token location, Expression index, Member getter, Member setter);
- Generator<Expression, Statement, Arguments> staticAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
- kernel.Member getter,
- kernel.Member setter);
+ Generator staticAccessGenerator(ExpressionGeneratorHelper helper,
+ Token location, Member getter, Member setter);
- Generator<Expression, Statement, Arguments> loadLibraryGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
- LoadLibraryBuilder builder);
+ Generator loadLibraryGenerator(ExpressionGeneratorHelper helper,
+ Token location, LoadLibraryBuilder builder);
- Generator<Expression, Statement, Arguments> deferredAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
- PrefixBuilder builder,
- Generator<Expression, Statement, Arguments> generator);
+ Generator deferredAccessGenerator(ExpressionGeneratorHelper helper,
+ Token location, PrefixBuilder builder, Generator generator);
- Generator<Expression, Statement, Arguments> typeUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
+ Generator typeUseGenerator(
+ ExpressionGeneratorHelper helper,
+ Token location,
PrefixBuilder prefix,
int declarationReferenceOffset,
TypeDeclarationBuilder declaration,
String plainNameForRead);
- Generator<Expression, Statement, Arguments> readOnlyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
- Expression expression,
- String plainNameForRead);
+ Generator readOnlyAccessGenerator(ExpressionGeneratorHelper helper,
+ Token location, Expression expression, String plainNameForRead);
- Generator<Expression, Statement, Arguments> largeIntAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location);
+ Generator largeIntAccessGenerator(
+ ExpressionGeneratorHelper helper, Token location);
- Generator<Expression, Statement, Arguments> unresolvedNameGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
- kernel.Name name);
+ Generator unresolvedNameGenerator(
+ ExpressionGeneratorHelper helper, Token location, Name name);
- Generator<Expression, Statement, Arguments> unlinkedGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
+ Generator unlinkedGenerator(ExpressionGeneratorHelper helper, Token location,
UnlinkedDeclaration declaration);
- Generator<Expression, Statement, Arguments> delayedAssignment(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
- Generator<Expression, Statement, Arguments> generator,
- Expression value,
- String assignmentOperator);
+ Generator delayedAssignment(ExpressionGeneratorHelper helper, Token location,
+ Generator generator, Expression value, String assignmentOperator);
- Generator<Expression, Statement, Arguments> delayedPostfixIncrement(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Location location,
- Generator<Expression, Statement, Arguments> generator,
- kernel.Name binaryOperator,
- kernel.Procedure interfaceTarget);
+ Generator delayedPostfixIncrement(
+ ExpressionGeneratorHelper helper,
+ Token location,
+ Generator generator,
+ Name binaryOperator,
+ Procedure interfaceTarget);
// TODO(ahe): Remove this method when all users are moved here.
- kernel.Arguments castArguments(Arguments arguments) {
- dynamic a = arguments;
- return a;
+ Arguments castArguments(Arguments arguments) {
+ return arguments;
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
index 35a714d..40e1263 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
@@ -8,6 +8,7 @@
export 'package:kernel/ast.dart'
show
+ Arguments,
AssertStatement,
AsyncMarker,
Block,
@@ -64,45 +65,47 @@
export 'kernel_shadow_ast.dart'
show
+ ArgumentsJudgment,
AssertInitializerJudgment,
AssertStatementJudgment,
BreakJudgment,
- ShadowCascadeExpression,
- ShadowComplexAssignment,
- ShadowConstructorInvocation,
+ CascadeJudgment,
+ ComplexAssignmentJudgment,
+ ConstructorInvocationJudgment,
ContinueSwitchJudgment,
- ShadowDeferredCheck,
+ DeferredCheckJudgment,
+ ExpressionJudgment,
ExpressionStatementJudgment,
- ShadowFactoryConstructorInvocation,
+ FactoryConstructorInvocationJudgment,
ShadowFieldInitializer,
- ShadowForInStatement,
- ShadowFunctionDeclaration,
- ShadowFunctionExpression,
- ShadowIfNullExpression,
+ ForInJudgment,
+ FunctionDeclarationJudgment,
+ FunctionExpressionJudgment,
+ FunctionNodeJudgment,
+ IfNullJudgment,
IfJudgment,
- ShadowIllegalAssignment,
- ShadowIndexAssign,
+ IllegalAssignmentJudgment,
+ IndexAssignmentJudgment,
ShadowInvalidInitializer,
LabeledStatementJudgment,
- ShadowLogicalExpression,
- ShadowLoopAssignmentStatement,
- ShadowMethodInvocation,
- ShadowNamedFunctionExpression,
- ShadowNullAwareMethodInvocation,
+ LogicalJudgment,
+ MethodInvocationJudgment,
+ NamedFunctionExpressionJudgment,
+ NullAwareMethodInvocationJudgment,
NullAwarePropertyGetJudgment,
- ShadowPropertyAssign,
+ PropertyAssignmentJudgment,
PropertyGetJudgment,
- ShadowRedirectingInitializer,
+ RedirectingInitializerJudgment,
ReturnJudgment,
- ShadowStaticAssignment,
+ StaticAssignmentJudgment,
StaticGetJudgment,
- ShadowStaticInvocation,
- ShadowSuperInitializer,
- ShadowSuperMethodInvocation,
+ StaticInvocationJudgment,
+ SuperInitializerJudgment,
+ SuperMethodInvocationJudgment,
SuperPropertyGetJudgment,
SwitchCaseJudgment,
SwitchStatementJudgment,
- ShadowSyntheticExpression,
+ SyntheticExpressionJudgment,
VariableAssignmentJudgment,
VariableDeclarationJudgment,
VariableGetJudgment,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
index a1c93b1..3be83dc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
@@ -4,9 +4,7 @@
library fasta.kernel_body_builder;
-import 'package:kernel/ast.dart' show Arguments, Expression, Statement;
-
-import '../scanner.dart' show Token;
+import 'package:kernel/ast.dart' show Expression;
import '../type_inference/type_inferrer.dart' show TypeInferrer;
@@ -21,10 +19,9 @@
import 'kernel_builder.dart'
show KernelClassBuilder, KernelLibraryBuilder, ModifierBuilder, Scope;
-class KernelBodyBuilder extends BodyBuilder<Expression, Statement, Arguments> {
+class KernelBodyBuilder extends BodyBuilder {
@override
- final Forest<Expression, Statement, Token, Arguments> forest =
- const Fangorn();
+ final Forest forest = const Fangorn();
KernelBodyBuilder(
KernelLibraryBuilder library,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
index 0964665..617e6f3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
@@ -84,9 +84,10 @@
this.objectType,
this.stringType,
LibraryBuilder parent,
+ int startCharOffset,
int charOffset)
: super(metadata, 0, name, null, null, null, scope, constructors, parent,
- null, charOffset, TreeNode.noOffset, cls);
+ null, startCharOffset, charOffset, TreeNode.noOffset, cls);
factory KernelEnumBuilder(
MetadataCollector metadataCollector,
@@ -140,6 +141,7 @@
parent,
charOffset,
charOffset,
+ charOffset,
charEndOffset);
constructors[""] = constructorBuilder;
KernelFieldBuilder valuesBuilder = new KernelFieldBuilder(null, listType,
@@ -156,6 +158,7 @@
parent,
charOffset,
charOffset,
+ charOffset,
charEndOffset);
members["toString"] = toStringBuilder;
String className = name;
@@ -192,6 +195,8 @@
fieldBuilder.target, documentationComment);
members[name] = fieldBuilder;
}
+ final int startCharOffset =
+ metadata == null ? charOffset : metadata.first.charOffset;
KernelEnumBuilder enumBuilder = new KernelEnumBuilder.internal(
metadata,
name,
@@ -206,6 +211,7 @@
objectType,
stringType,
parent,
+ startCharOffset,
charOffset);
// TODO(sigmund): dynamic should be `covariant MemberBuilder`.
void setParent(String name, dynamic b) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
index 51f22e3..1343555 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
@@ -3,7 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart'
- show Arguments, Expression, InvalidExpression, Node, Statement;
+ show Arguments, Expression, InvalidExpression, Node;
import '../../scanner/token.dart' show Token;
@@ -74,18 +74,18 @@
Name,
Procedure,
PropertySet,
- ShadowComplexAssignment,
- ShadowIllegalAssignment,
- ShadowIndexAssign,
- ShadowMethodInvocation,
+ ComplexAssignmentJudgment,
+ IllegalAssignmentJudgment,
+ IndexAssignmentJudgment,
+ MethodInvocationJudgment,
NullAwarePropertyGetJudgment,
- ShadowPropertyAssign,
+ PropertyAssignmentJudgment,
PropertyGetJudgment,
- ShadowStaticAssignment,
- ShadowSuperMethodInvocation,
+ StaticAssignmentJudgment,
+ SuperMethodInvocationJudgment,
SuperPropertyGetJudgment,
VariableAssignmentJudgment,
- ShadowSyntheticExpression,
+ SyntheticExpressionJudgment,
VariableDeclarationJudgment,
VariableGetJudgment,
StaticSet,
@@ -109,13 +109,12 @@
part 'kernel_expression_generator_impl.dart';
-abstract class KernelExpressionGenerator
- implements ExpressionGenerator<Expression, Statement, Arguments> {
- ExpressionGeneratorHelper<Expression, Statement, Arguments> get helper;
+abstract class KernelExpressionGenerator implements ExpressionGenerator {
+ ExpressionGeneratorHelper get helper;
Token get token;
- Forest<Expression, Statement, Token, Arguments> get forest;
+ Forest get forest;
@override
Expression buildSimpleRead() {
@@ -135,26 +134,24 @@
{bool voidContext: false}) {
var complexAssignment = startComplexAssignment(value);
if (voidContext) {
- var nullAwareCombiner = helper.storeOffset(
- forest.conditionalExpression(
- buildIsNull(_makeRead(complexAssignment), offset, helper),
- null,
- _makeWrite(value, false, complexAssignment),
- null,
- helper.storeOffset(forest.literalNull(null), offset)),
- offset);
+ var nullAwareCombiner = forest.conditionalExpression(
+ buildIsNull(_makeRead(complexAssignment), offset, helper),
+ null,
+ _makeWrite(value, false, complexAssignment),
+ null,
+ forest.literalNull(null)..fileOffset = offset)
+ ..fileOffset = offset;
complexAssignment?.nullAwareCombiner = nullAwareCombiner;
return _finish(nullAwareCombiner, complexAssignment);
}
var tmp = new VariableDeclaration.forValue(_makeRead(complexAssignment));
- var nullAwareCombiner = helper.storeOffset(
- forest.conditionalExpression(
- buildIsNull(new VariableGet(tmp), offset, helper),
- null,
- _makeWrite(value, false, complexAssignment),
- null,
- new VariableGet(tmp)),
- offset);
+ var nullAwareCombiner = forest.conditionalExpression(
+ buildIsNull(new VariableGet(tmp), offset, helper),
+ null,
+ _makeWrite(value, false, complexAssignment),
+ null,
+ new VariableGet(tmp))
+ ..fileOffset = offset;
complexAssignment?.nullAwareCombiner = nullAwareCombiner;
return _finish(makeLet(tmp, nullAwareCombiner), complexAssignment);
}
@@ -181,7 +178,7 @@
bool voidContext: false,
Procedure interfaceTarget}) {
return buildCompoundAssignment(
- binaryOperator, helper.storeOffset(forest.literalInt(1, null), offset),
+ binaryOperator, forest.literalInt(1, null)..fileOffset = offset,
offset: offset,
voidContext: voidContext,
interfaceTarget: interfaceTarget,
@@ -197,7 +194,7 @@
return buildPrefixIncrement(binaryOperator,
offset: offset, voidContext: true, interfaceTarget: interfaceTarget);
}
- var rhs = helper.storeOffset(forest.literalInt(1, null), offset);
+ var rhs = forest.literalInt(1, null)..fileOffset = offset;
var complexAssignment = startComplexAssignment(rhs);
var value = new VariableDeclaration.forValue(_makeRead(complexAssignment));
valueAccess() => new VariableGet(value);
@@ -230,17 +227,17 @@
Expression _makeSimpleRead() => _makeRead(null);
Expression _makeSimpleWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
return _makeWrite(value, voidContext, complexAssignment);
}
- Expression _makeRead(ShadowComplexAssignment complexAssignment);
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment);
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment);
+ ComplexAssignmentJudgment complexAssignment);
Expression _finish(
- Expression body, ShadowComplexAssignment complexAssignment) {
+ Expression body, ComplexAssignmentJudgment complexAssignment) {
if (complexAssignment != null) {
complexAssignment.desugared = body;
return complexAssignment;
@@ -251,31 +248,27 @@
/// Creates a data structure for tracking the desugaring of a complex
/// assignment expression whose right hand side is [rhs].
- ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
- new ShadowIllegalAssignment(rhs);
+ ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+ new IllegalAssignmentJudgment(rhs);
}
-abstract class KernelGenerator = Generator<Expression, Statement, Arguments>
- with KernelExpressionGenerator;
+abstract class KernelGenerator = Generator with KernelExpressionGenerator;
class KernelVariableUseGenerator extends KernelGenerator
- with VariableUseGenerator<Expression, Statement, Arguments> {
+ with VariableUseGenerator {
final VariableDeclaration variable;
final DartType promotedType;
- KernelVariableUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.variable,
- this.promotedType)
+ KernelVariableUseGenerator(ExpressionGeneratorHelper helper, Token token,
+ this.variable, this.promotedType)
: super(helper, token);
@override
String get plainNameForRead => variable.name;
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
var fact = helper.typePromoter
.getFactForAccess(variable, helper.functionNestingLevel);
var scope = helper.typePromoter.currentScope;
@@ -287,7 +280,7 @@
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
helper.typePromoter.mutateVariable(variable, helper.functionNestingLevel);
var write = variable.isFinal || variable.isConst
? makeInvalidWrite(value)
@@ -305,7 +298,7 @@
}
@override
- ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
+ ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
new VariableAssignmentJudgment(rhs);
@override
@@ -319,7 +312,7 @@
}
class KernelPropertyAccessGenerator extends KernelGenerator
- with PropertyAccessGenerator<Expression, Statement, Arguments> {
+ with PropertyAccessGenerator {
final Expression receiver;
final Name name;
@@ -330,13 +323,8 @@
VariableDeclaration _receiverVariable;
- KernelPropertyAccessGenerator.internal(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.receiver,
- this.name,
- this.getter,
- this.setter)
+ KernelPropertyAccessGenerator.internal(ExpressionGeneratorHelper helper,
+ Token token, this.receiver, this.name, this.getter, this.setter)
: super(helper, token);
@override
@@ -354,8 +342,8 @@
}
@override
- ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
- new ShadowPropertyAssign(receiver, rhs);
+ ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+ new PropertyAssignmentJudgment(receiver, rhs);
@override
void printOn(StringSink sink) {
@@ -379,7 +367,7 @@
@override
Expression _makeSimpleWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
var write = new PropertySet(receiver, name, value, setter)
..fileOffset = offsetForToken(token);
complexAssignment?.write = write;
@@ -387,7 +375,7 @@
}
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
var read = new PropertyGetJudgment(receiverAccess(), name, getter)
..fileOffset = offsetForToken(token);
complexAssignment?.read = read;
@@ -396,7 +384,7 @@
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
var write = new PropertySet(receiverAccess(), name, value, setter)
..fileOffset = offsetForToken(token);
complexAssignment?.write = write;
@@ -405,32 +393,28 @@
@override
Expression _finish(
- Expression body, ShadowComplexAssignment complexAssignment) {
+ Expression body, ComplexAssignmentJudgment complexAssignment) {
return super._finish(makeLet(_receiverVariable, body), complexAssignment);
}
}
class KernelThisPropertyAccessGenerator extends KernelGenerator
- with ThisPropertyAccessGenerator<Expression, Statement, Arguments> {
+ with ThisPropertyAccessGenerator {
final Name name;
final Member getter;
final Member setter;
- KernelThisPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.name,
- this.getter,
- this.setter)
+ KernelThisPropertyAccessGenerator(ExpressionGeneratorHelper helper,
+ Token token, this.name, this.getter, this.setter)
: super(helper, token);
@override
String get plainNameForRead => name.name;
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
if (getter == null) {
helper.warnUnresolvedGet(name, offsetForToken(token));
}
@@ -443,7 +427,7 @@
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
if (setter == null) {
helper.warnUnresolvedSet(name, offsetForToken(token));
}
@@ -471,8 +455,8 @@
}
@override
- ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
- new ShadowPropertyAssign(null, rhs);
+ ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+ new PropertyAssignmentJudgment(null, rhs);
@override
void printOn(StringSink sink) {
@@ -487,7 +471,7 @@
}
class KernelNullAwarePropertyAccessGenerator extends KernelGenerator
- with NullAwarePropertyAccessGenerator<Expression, Statement, Arguments> {
+ with NullAwarePropertyAccessGenerator {
final VariableDeclaration receiver;
final Expression receiverExpression;
@@ -501,7 +485,7 @@
final DartType type;
KernelNullAwarePropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
this.receiverExpression,
this.name,
@@ -517,7 +501,7 @@
String get plainNameForRead => name.name;
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
var read = new PropertyGetJudgment(receiverAccess(), name, getter)
..fileOffset = offsetForToken(token);
complexAssignment?.read = read;
@@ -526,7 +510,7 @@
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
var write = new PropertySet(receiverAccess(), name, value, setter)
..fileOffset = offsetForToken(token);
complexAssignment?.write = write;
@@ -535,19 +519,18 @@
@override
Expression _finish(
- Expression body, ShadowComplexAssignment complexAssignment) {
+ Expression body, ComplexAssignmentJudgment complexAssignment) {
var offset = offsetForToken(token);
- var nullAwareGuard = helper.storeOffset(
- forest.conditionalExpression(
- buildIsNull(receiverAccess(), offset, helper),
- null,
- helper.storeOffset(forest.literalNull(null), offset),
- null,
- body),
- offset);
+ var nullAwareGuard = forest.conditionalExpression(
+ buildIsNull(receiverAccess(), offset, helper),
+ null,
+ forest.literalNull(null)..fileOffset = offset,
+ null,
+ body)
+ ..fileOffset = offset;
if (complexAssignment != null) {
body = makeLet(receiver, nullAwareGuard);
- ShadowPropertyAssign kernelPropertyAssign = complexAssignment;
+ PropertyAssignmentJudgment kernelPropertyAssign = complexAssignment;
kernelPropertyAssign.nullAwareGuard = nullAwareGuard;
kernelPropertyAssign.desugared = body;
return kernelPropertyAssign;
@@ -563,8 +546,8 @@
}
@override
- ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
- new ShadowPropertyAssign(receiverExpression, rhs);
+ ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+ new PropertyAssignmentJudgment(receiverExpression, rhs);
@override
void printOn(StringSink sink) {
@@ -585,26 +568,22 @@
}
class KernelSuperPropertyAccessGenerator extends KernelGenerator
- with SuperPropertyAccessGenerator<Expression, Statement, Arguments> {
+ with SuperPropertyAccessGenerator {
final Name name;
final Member getter;
final Member setter;
- KernelSuperPropertyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.name,
- this.getter,
- this.setter)
+ KernelSuperPropertyAccessGenerator(ExpressionGeneratorHelper helper,
+ Token token, this.name, this.getter, this.setter)
: super(helper, token);
@override
String get plainNameForRead => name.name;
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
if (getter == null) {
helper.warnUnresolvedGet(name, offsetForToken(token), isSuper: true);
}
@@ -617,7 +596,7 @@
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
if (setter == null) {
helper.warnUnresolvedSet(name, offsetForToken(token), isSuper: true);
}
@@ -649,8 +628,8 @@
}
@override
- ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
- new ShadowPropertyAssign(null, rhs, isSuper: true);
+ ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+ new PropertyAssignmentJudgment(null, rhs, isSuper: true);
@override
void printOn(StringSink sink) {
@@ -665,7 +644,7 @@
}
class KernelIndexedAccessGenerator extends KernelGenerator
- with IndexedAccessGenerator<Expression, Statement, Arguments> {
+ with IndexedAccessGenerator {
final Expression receiver;
final Expression index;
@@ -678,13 +657,8 @@
VariableDeclaration indexVariable;
- KernelIndexedAccessGenerator.internal(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.receiver,
- this.index,
- this.getter,
- this.setter)
+ KernelIndexedAccessGenerator.internal(ExpressionGeneratorHelper helper,
+ Token token, this.receiver, this.index, this.getter, this.setter)
: super(helper, token);
Expression indexAccess() {
@@ -702,7 +676,7 @@
@override
Expression _makeSimpleRead() {
- var read = new ShadowMethodInvocation(receiver, indexGetName,
+ var read = new MethodInvocationJudgment(receiver, indexGetName,
forest.castArguments(forest.arguments(<Expression>[index], token)),
interfaceTarget: getter)
..fileOffset = offsetForToken(token);
@@ -711,9 +685,9 @@
@override
Expression _makeSimpleWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
- var write = new ShadowMethodInvocation(
+ var write = new MethodInvocationJudgment(
receiver,
indexSetName,
forest
@@ -725,8 +699,8 @@
}
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
- var read = new ShadowMethodInvocation(
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+ var read = new MethodInvocationJudgment(
receiverAccess(),
indexGetName,
forest.castArguments(
@@ -739,9 +713,9 @@
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
- var write = new ShadowMethodInvocation(
+ var write = new MethodInvocationJudgment(
receiverAccess(),
indexSetName,
forest.castArguments(
@@ -755,11 +729,11 @@
// TODO(dmitryas): remove this method after the "[]=" operator of the Context
// class is made to return a value.
Expression _makeWriteAndReturn(
- Expression value, ShadowComplexAssignment complexAssignment) {
+ Expression value, ComplexAssignmentJudgment complexAssignment) {
// The call to []= does not return the value like direct-style assignments
// do. We need to bind the value in a let.
var valueVariable = new VariableDeclaration.forValue(value);
- var write = new ShadowMethodInvocation(
+ var write = new MethodInvocationJudgment(
receiverAccess(),
indexSetName,
forest.castArguments(forest.arguments(
@@ -776,7 +750,7 @@
@override
Expression _finish(
- Expression body, ShadowComplexAssignment complexAssignment) {
+ Expression body, ComplexAssignmentJudgment complexAssignment) {
return super._finish(
makeLet(receiverVariable, makeLet(indexVariable, body)),
complexAssignment);
@@ -790,8 +764,8 @@
}
@override
- ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
- new ShadowIndexAssign(receiver, index, rhs);
+ ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+ new IndexAssignmentJudgment(receiver, index, rhs);
@override
void printOn(StringSink sink) {
@@ -812,7 +786,7 @@
}
class KernelThisIndexedAccessGenerator extends KernelGenerator
- with ThisIndexedAccessGenerator<Expression, Statement, Arguments> {
+ with ThisIndexedAccessGenerator {
final Expression index;
final Procedure getter;
@@ -821,12 +795,8 @@
VariableDeclaration indexVariable;
- KernelThisIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.index,
- this.getter,
- this.setter)
+ KernelThisIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+ Token token, this.index, this.getter, this.setter)
: super(helper, token);
Expression indexAccess() {
@@ -835,9 +805,9 @@
}
Expression _makeWriteAndReturn(
- Expression value, ShadowComplexAssignment complexAssignment) {
+ Expression value, ComplexAssignmentJudgment complexAssignment) {
var valueVariable = new VariableDeclaration.forValue(value);
- var write = new ShadowMethodInvocation(
+ var write = new MethodInvocationJudgment(
forest.thisExpression(token),
indexSetName,
forest.castArguments(forest.arguments(
@@ -853,7 +823,7 @@
@override
Expression _makeSimpleRead() {
- return new ShadowMethodInvocation(
+ return new MethodInvocationJudgment(
forest.thisExpression(token),
indexGetName,
forest.castArguments(forest.arguments(<Expression>[index], token)),
@@ -863,9 +833,9 @@
@override
Expression _makeSimpleWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
- var write = new ShadowMethodInvocation(
+ var write = new MethodInvocationJudgment(
forest.thisExpression(token),
indexSetName,
forest
@@ -877,8 +847,8 @@
}
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
- var read = new ShadowMethodInvocation(
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+ var read = new MethodInvocationJudgment(
forest.thisExpression(token),
indexGetName,
forest.castArguments(
@@ -891,9 +861,9 @@
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
- var write = new ShadowMethodInvocation(
+ var write = new MethodInvocationJudgment(
forest.thisExpression(token),
indexSetName,
forest.castArguments(
@@ -906,7 +876,7 @@
@override
Expression _finish(
- Expression body, ShadowComplexAssignment complexAssignment) {
+ Expression body, ComplexAssignmentJudgment complexAssignment) {
return super._finish(makeLet(indexVariable, body), complexAssignment);
}
@@ -918,8 +888,8 @@
}
@override
- ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
- new ShadowIndexAssign(null, index, rhs);
+ ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+ new IndexAssignmentJudgment(null, index, rhs);
@override
void printOn(StringSink sink) {
@@ -936,7 +906,7 @@
}
class KernelSuperIndexedAccessGenerator extends KernelGenerator
- with SuperIndexedAccessGenerator<Expression, Statement, Arguments> {
+ with SuperIndexedAccessGenerator {
final Expression index;
final Member getter;
@@ -945,12 +915,8 @@
VariableDeclaration indexVariable;
- KernelSuperIndexedAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.index,
- this.getter,
- this.setter)
+ KernelSuperIndexedAccessGenerator(ExpressionGeneratorHelper helper,
+ Token token, this.index, this.getter, this.setter)
: super(helper, token);
Expression indexAccess() {
@@ -959,7 +925,7 @@
}
Expression _makeWriteAndReturn(
- Expression value, ShadowComplexAssignment complexAssignment) {
+ Expression value, ComplexAssignmentJudgment complexAssignment) {
var valueVariable = new VariableDeclaration.forValue(value);
if (setter == null) {
helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
@@ -985,7 +951,7 @@
isSuper: true);
}
// TODO(ahe): Use [DirectMethodInvocation] when possible.
- return new ShadowSuperMethodInvocation(
+ return new SuperMethodInvocationJudgment(
indexGetName,
forest.castArguments(forest.arguments(<Expression>[index], token)),
getter)
@@ -994,7 +960,7 @@
@override
Expression _makeSimpleWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
if (setter == null) {
helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
@@ -1011,7 +977,7 @@
}
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
if (getter == null) {
helper.warnUnresolvedMethod(indexGetName, offsetForToken(token),
isSuper: true);
@@ -1028,7 +994,7 @@
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
if (setter == null) {
helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
@@ -1046,7 +1012,7 @@
@override
Expression _finish(
- Expression body, ShadowComplexAssignment complexAssignment) {
+ Expression body, ComplexAssignmentJudgment complexAssignment) {
return super._finish(makeLet(indexVariable, body), complexAssignment);
}
@@ -1058,8 +1024,8 @@
}
@override
- ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
- new ShadowIndexAssign(null, index, rhs, isSuper: true);
+ ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+ new IndexAssignmentJudgment(null, index, rhs, isSuper: true);
@override
void printOn(StringSink sink) {
@@ -1076,17 +1042,14 @@
}
class KernelStaticAccessGenerator extends KernelGenerator
- with StaticAccessGenerator<Expression, Statement, Arguments> {
+ with StaticAccessGenerator {
@override
final Member readTarget;
final Member writeTarget;
- KernelStaticAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.readTarget,
- this.writeTarget)
+ KernelStaticAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+ this.readTarget, this.writeTarget)
: assert(readTarget != null || writeTarget != null),
super(helper, token);
@@ -1094,7 +1057,7 @@
String get plainNameForRead => (readTarget ?? writeTarget).name.name;
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
if (readTarget == null) {
return makeInvalidRead();
} else {
@@ -1106,7 +1069,7 @@
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
Expression write;
if (writeTarget == null) {
write = makeInvalidWrite(value);
@@ -1139,8 +1102,8 @@
}
@override
- ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
- new ShadowStaticAssignment(rhs);
+ ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+ new StaticAssignmentJudgment(rhs);
@override
void printOn(StringSink sink) {
@@ -1153,17 +1116,15 @@
}
class KernelLoadLibraryGenerator extends KernelGenerator
- with LoadLibraryGenerator<Expression, Statement, Arguments> {
+ with LoadLibraryGenerator {
final LoadLibraryBuilder builder;
KernelLoadLibraryGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.builder)
+ ExpressionGeneratorHelper helper, Token token, this.builder)
: super(helper, token);
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
var read =
helper.makeStaticGet(builder.createTearoffMethod(helper.forest), token);
complexAssignment?.read = read;
@@ -1172,7 +1133,7 @@
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
Expression write = makeInvalidWrite(value);
write.fileOffset = offsetForToken(token);
return write;
@@ -1196,18 +1157,15 @@
}
class KernelDeferredAccessGenerator extends KernelGenerator
- with DeferredAccessGenerator<Expression, Statement, Arguments> {
+ with DeferredAccessGenerator {
@override
final PrefixBuilder builder;
@override
final KernelGenerator generator;
- KernelDeferredAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.builder,
- this.generator)
+ KernelDeferredAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+ this.builder, this.generator)
: super(helper, token);
@override
@@ -1217,14 +1175,14 @@
}
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
return helper.wrapInDeferredCheck(
generator._makeRead(complexAssignment), builder, token.charOffset);
}
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
return helper.wrapInDeferredCheck(
generator._makeWrite(value, voidContext, complexAssignment),
builder,
@@ -1233,7 +1191,7 @@
}
class KernelTypeUseGenerator extends KernelReadOnlyAccessGenerator
- with TypeUseGenerator<Expression, Statement, Arguments> {
+ with TypeUseGenerator {
/// The import prefix preceding the [declaration] reference, or `null` if
/// the reference is not prefixed.
@override
@@ -1248,7 +1206,7 @@
final TypeDeclarationBuilder declaration;
KernelTypeUseGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+ ExpressionGeneratorHelper helper,
Token token,
this.prefix,
this.declarationReferenceOffset,
@@ -1264,7 +1222,7 @@
KernelInvalidTypeBuilder declaration = this.declaration;
helper.addProblemErrorIfConst(
declaration.message.messageObject, offset, token.length);
- super.expression = new ShadowSyntheticExpression(
+ super.expression = new SyntheticExpressionJudgment(
new Throw(forest.literalString(declaration.message.message, token))
..fileOffset = offset);
} else {
@@ -1280,8 +1238,8 @@
Expression makeInvalidWrite(Expression value) {
return buildThrowNoSuchMethodError(
forest.literalNull(token),
- storeOffset(
- forest.arguments(<Expression>[value], null), value.fileOffset),
+ forest.arguments(<Expression>[value], null)
+ ..fileOffset = value.fileOffset,
isSetter: true);
}
@@ -1320,8 +1278,8 @@
} else if (member.isField && !member.isFinal) {
setter = member;
}
- generator = new StaticAccessGenerator<Expression, Statement,
- Arguments>.fromBuilder(helper, member, send.token, setter);
+ generator = new StaticAccessGenerator.fromBuilder(
+ helper, member, send.token, setter);
}
return arguments == null
@@ -1340,7 +1298,7 @@
}
class KernelReadOnlyAccessGenerator extends KernelGenerator
- with ReadOnlyAccessGenerator<Expression, Statement, Arguments> {
+ with ReadOnlyAccessGenerator {
@override
final String plainNameForRead;
@@ -1348,25 +1306,22 @@
VariableDeclaration value;
- KernelReadOnlyAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.expression,
- this.plainNameForRead)
+ KernelReadOnlyAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+ this.expression, this.plainNameForRead)
: super(helper, token);
@override
Expression _makeSimpleRead() => expression;
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
value ??= new VariableDeclaration.forValue(expression);
return new VariableGet(value);
}
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
var write = makeInvalidWrite(value);
complexAssignment?.write = write;
return write;
@@ -1374,7 +1329,7 @@
@override
Expression _finish(
- Expression body, ShadowComplexAssignment complexAssignment) =>
+ Expression body, ComplexAssignmentJudgment complexAssignment) =>
super._finish(makeLet(value, body), complexAssignment);
@override
@@ -1397,10 +1352,8 @@
}
class KernelLargeIntAccessGenerator extends KernelGenerator
- with LargeIntAccessGenerator<Expression, Statement, Arguments> {
- KernelLargeIntAccessGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token)
+ with LargeIntAccessGenerator {
+ KernelLargeIntAccessGenerator(ExpressionGeneratorHelper helper, Token token)
: super(helper, token);
@override
@@ -1408,43 +1361,39 @@
@override
Expression _makeSimpleWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
return buildError();
}
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
return buildError();
}
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
return buildError();
}
}
class KernelUnresolvedNameGenerator extends KernelGenerator
- with
- ErroneousExpressionGenerator<Expression, Statement, Arguments>,
- UnresolvedNameGenerator<Expression, Statement, Arguments> {
+ with ErroneousExpressionGenerator, UnresolvedNameGenerator {
@override
final Name name;
KernelUnresolvedNameGenerator(
- ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
- Token token,
- this.name)
+ ExpressionGeneratorHelper helper, Token token, this.name)
: super(helper, token);
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
return unsupported("_makeRead", offsetForToken(token), uri);
}
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
return unsupported("_makeWrite", offsetForToken(token), uri);
}
@@ -1455,8 +1404,7 @@
}
}
-class KernelUnlinkedGenerator extends KernelGenerator
- with UnlinkedGenerator<Expression, Statement, Arguments> {
+class KernelUnlinkedGenerator extends KernelGenerator with UnlinkedGenerator {
@override
final UnlinkedDeclaration declaration;
@@ -1465,22 +1413,20 @@
final Name name;
KernelUnlinkedGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.declaration)
+ ExpressionGeneratorHelper helper, Token token, this.declaration)
: name = new Name(declaration.name, helper.library.target),
receiver = new InvalidExpression(declaration.name)
..fileOffset = offsetForToken(token),
super(helper, token);
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
return unsupported("_makeRead", offsetForToken(token), uri);
}
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
return unsupported("_makeWrite", offsetForToken(token), uri);
}
@@ -1503,42 +1449,36 @@
}
abstract class KernelContextAwareGenerator extends KernelGenerator
- with ContextAwareGenerator<Expression, Statement, Arguments> {
+ with ContextAwareGenerator {
@override
- final Generator<Expression, Statement, Arguments> generator;
+ final Generator generator;
KernelContextAwareGenerator(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- this.generator)
+ ExpressionGeneratorHelper helper, Token token, this.generator)
: super(helper, token);
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
return unsupported("_makeRead", offsetForToken(token), uri);
}
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
return unsupported("_makeWrite", offsetForToken(token), uri);
}
}
class KernelDelayedAssignment extends KernelContextAwareGenerator
- with DelayedAssignment<Expression, Statement, Arguments> {
+ with DelayedAssignment {
@override
final Expression value;
@override
String assignmentOperator;
- KernelDelayedAssignment(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Generator<Expression, Statement, Arguments> generator,
- this.value,
- this.assignmentOperator)
+ KernelDelayedAssignment(ExpressionGeneratorHelper helper, Token token,
+ Generator generator, this.value, this.assignmentOperator)
: super(helper, token, generator);
@override
@@ -1551,19 +1491,15 @@
}
class KernelDelayedPostfixIncrement extends KernelContextAwareGenerator
- with DelayedPostfixIncrement<Expression, Statement, Arguments> {
+ with DelayedPostfixIncrement {
@override
final Name binaryOperator;
@override
final Procedure interfaceTarget;
- KernelDelayedPostfixIncrement(
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
- Token token,
- Generator<Expression, Statement, Arguments> generator,
- this.binaryOperator,
- this.interfaceTarget)
+ KernelDelayedPostfixIncrement(ExpressionGeneratorHelper helper, Token token,
+ Generator generator, this.binaryOperator, this.interfaceTarget)
: super(helper, token, generator);
}
@@ -1572,28 +1508,23 @@
return new Let(variable, body);
}
-Expression makeBinary(
- Expression left,
- Name operator,
- Procedure interfaceTarget,
- Expression right,
- ExpressionGeneratorHelper<Expression, Statement, Arguments> helper,
+Expression makeBinary(Expression left, Name operator, Procedure interfaceTarget,
+ Expression right, ExpressionGeneratorHelper helper,
{int offset: TreeNode.noOffset}) {
- return new ShadowMethodInvocation(
+ return new MethodInvocationJudgment(
left,
operator,
- helper.storeOffset(
- helper.forest.castArguments(
- helper.forest.arguments(<Expression>[right], null)),
- offset),
+ helper.forest
+ .castArguments(helper.forest.arguments(<Expression>[right], null))
+ ..fileOffset = offset,
interfaceTarget: interfaceTarget)
..fileOffset = offset;
}
-Expression buildIsNull(Expression value, int offset,
- ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper) {
+Expression buildIsNull(
+ Expression value, int offset, ExpressionGeneratorHelper helper) {
return makeBinary(value, equalsName, null,
- helper.storeOffset(helper.forest.literalNull(null), offset), helper,
+ helper.forest.literalNull(null)..fileOffset = offset, helper,
offset: offset);
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
index 1acf3cd..ea1c5b0 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
@@ -21,9 +21,7 @@
final bool isSuper;
ThisAccessGenerator(
- ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
- Token token,
- this.isInitializer,
+ ExpressionGeneratorHelper helper, Token token, this.isInitializer,
{this.isSuper: false})
: super(helper, token);
@@ -80,11 +78,11 @@
Member setter =
helper.lookupInstanceMember(name, isSuper: isSuper, isSetter: true);
if (isSuper) {
- return new SuperPropertyAccessGenerator<Expression, Statement,
- Arguments>(helper, send.token, name, getter, setter);
+ return new SuperPropertyAccessGenerator(
+ helper, send.token, name, getter, setter);
} else {
- return new ThisPropertyAccessGenerator<Expression, Statement,
- Arguments>(helper, send.token, name, getter, setter);
+ return new ThisPropertyAccessGenerator(
+ helper, send.token, name, getter, setter);
}
}
}
@@ -111,14 +109,12 @@
constructor.function, arguments, offset, <TypeParameter>[]);
}
if (constructor == null || argMessage != null) {
- return helper.buildInvalidInitializer(
- buildThrowNoSuchMethodError(
- storeOffset(forest.literalNull(null), offset), arguments,
- isSuper: isSuper,
- name: name.name,
- offset: offset,
- argMessage: argMessage),
- offset);
+ return helper.buildInvalidInitializer(buildThrowNoSuchMethodError(
+ forest.literalNull(null)..fileOffset = offset, arguments,
+ isSuper: isSuper,
+ name: name.name,
+ offset: offset,
+ argMessage: argMessage));
} else if (isSuper) {
return helper.buildSuperInitializer(
false, constructor, arguments, offset);
@@ -167,13 +163,13 @@
}
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
return unsupported("_makeRead", offsetForToken(token), uri);
}
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
return unsupported("_makeWrite", offsetForToken(token), uri);
}
@@ -190,9 +186,7 @@
final Name name;
IncompleteSendGenerator(
- ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
- Token token,
- this.name)
+ ExpressionGeneratorHelper helper, Token token, this.name)
: super(helper, token);
withReceiver(Object receiver, int operatorOffset, {bool isNullAware});
@@ -200,13 +194,13 @@
Arguments get arguments => null;
@override
- Expression _makeRead(ShadowComplexAssignment complexAssignment) {
+ Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
return unsupported("_makeRead", offsetForToken(token), uri);
}
@override
Expression _makeWrite(Expression value, bool voidContext,
- ShadowComplexAssignment complexAssignment) {
+ ComplexAssignmentJudgment complexAssignment) {
return unsupported("_makeWrite", offsetForToken(token), uri);
}
@@ -218,13 +212,11 @@
}
class IncompleteErrorGenerator extends IncompleteSendGenerator
- with ErroneousExpressionGenerator<Expression, Statement, Arguments> {
+ with ErroneousExpressionGenerator {
final Message message;
IncompleteErrorGenerator(
- ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
- Token token,
- this.message)
+ ExpressionGeneratorHelper helper, Token token, this.message)
: super(helper, token, null);
String get debugName => "IncompleteErrorGenerator";
@@ -266,10 +258,7 @@
final Arguments arguments;
SendAccessGenerator(
- ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
- Token token,
- Name name,
- this.arguments)
+ ExpressionGeneratorHelper helper, Token token, Name name, this.arguments)
: super(helper, token, name) {
assert(arguments != null);
}
@@ -353,9 +342,7 @@
class IncompletePropertyAccessGenerator extends IncompleteSendGenerator {
IncompletePropertyAccessGenerator(
- ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
- Token token,
- Name name)
+ ExpressionGeneratorHelper helper, Token token, Name name)
: super(helper, token, name);
String get plainNameForRead => name.name;
@@ -386,7 +373,7 @@
isQualified: true, prefix: prefix);
}
- return PropertyAccessGenerator.make<Expression, Statement, Arguments>(
+ return PropertyAccessGenerator.make(
helper, token, helper.toValue(receiver), name, null, null, isNullAware);
}
@@ -424,9 +411,7 @@
class ParenthesizedExpressionGenerator extends KernelReadOnlyAccessGenerator {
ParenthesizedExpressionGenerator(
- ExpressionGeneratorHelper<dynamic, dynamic, dynamic> helper,
- Token token,
- Expression expression)
+ ExpressionGeneratorHelper helper, Token token, Expression expression)
: super(helper, token, expression, null);
String get debugName => "ParenthesizedExpressionGenerator";
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
index 96f72a9..33c6f13 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
@@ -11,15 +11,22 @@
Expression,
FunctionType,
Initializer,
+ LabeledStatement,
Node,
- Statement;
+ Statement,
+ SwitchCase,
+ VariableDeclaration;
import 'package:kernel/type_algebra.dart' show Substitution;
import 'factory.dart' show Factory;
import 'kernel_shadow_ast.dart'
- show ExpressionJudgment, InitializerJudgment, StatementJudgment;
+ show
+ ExpressionJudgment,
+ InitializerJudgment,
+ StatementJudgment,
+ SwitchCaseJudgment;
/// Implementation of [Factory] that builds source code into a kernel
/// representation.
@@ -82,8 +89,13 @@
}
@override
- Statement breakStatement(StatementJudgment judgment, int fileOffset,
- Token breakKeyword, Expression label, Token semicolon) {
+ Statement breakStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token breakKeyword,
+ Expression label,
+ Token semicolon,
+ covariant LabeledStatement labelBinder) {
return judgment;
}
@@ -107,9 +119,9 @@
Token rightParenthesis,
Statement body,
DartType guardType,
- int exceptionOffset,
+ covariant VariableDeclaration exceptionBinder,
DartType exceptionType,
- int stackTraceOffset,
+ covariant VariableDeclaration stackTraceBinder,
DartType stackTraceType) {
return judgment;
}
@@ -134,14 +146,24 @@
}
@override
- Statement continueStatement(StatementJudgment judgment, int fileOffset,
- Token continueKeyword, Expression label, Token semicolon) {
+ Statement continueStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token continueKeyword,
+ Expression label,
+ Token semicolon,
+ covariant LabeledStatement labelBinder) {
return judgment;
}
@override
- Statement continueSwitchStatement(StatementJudgment judgment, int fileOffset,
- Token continueKeyword, Expression label, Token semicolon) {
+ Statement continueSwitchStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token continueKeyword,
+ Expression label,
+ Token semicolon,
+ covariant LabeledStatement labelBinder) {
return judgment;
}
@@ -172,6 +194,11 @@
}
@override
+ Statement emptyStatement(Token semicolon) {
+ return null;
+ }
+
+ @override
Statement expressionStatement(StatementJudgment judgment, int fileOffset,
Expression expression, Token semicolon) {
return judgment;
@@ -194,8 +221,17 @@
Statement forInStatement(
StatementJudgment judgment,
int fileOffset,
- int variableOffset,
- DartType variableType,
+ Token awaitKeyword,
+ Token forKeyword,
+ Token leftParenthesis,
+ Object loopVariable,
+ Token identifier,
+ Token inKeyword,
+ Expression iterator,
+ Token rightParenthesis,
+ Statement body,
+ covariant Object loopVariableBinder,
+ DartType loopVariableType,
int writeOffset,
DartType writeVariableType,
int writeVariableDeclarationOffset,
@@ -204,13 +240,31 @@
}
@override
- Statement forStatement(StatementJudgment judgment, int fileOffset) {
+ Statement forStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token forKeyword,
+ Token leftParenthesis,
+ Object variableDeclarationList,
+ Expression initialization,
+ Token leftSeparator,
+ Expression condition,
+ Token rightSeparator,
+ List<Expression> updaters,
+ Token rightParenthesis,
+ Statement body) {
return judgment;
}
@override
Statement functionDeclaration(
- StatementJudgment judgment, int fileOffset, FunctionType inferredType) {
+ covariant VariableDeclaration binder, FunctionType inferredType) {
+ return binder;
+ }
+
+ @override
+ Object binderForFunctionDeclaration(
+ StatementJudgment judgment, int fileOffset, String name) {
return judgment;
}
@@ -288,13 +342,31 @@
}
@override
- Statement labeledStatement(StatementJudgment judgment, int fileOffset) {
+ Statement labeledStatement(List<Object> labels, Statement statement) {
+ return labels[0];
+ }
+
+ Object statementLabel(
+ covariant StatementJudgment binder, Token label, Token colon) {
+ return binder;
+ }
+
+ @override
+ Object binderForStatementLabel(
+ StatementJudgment judgment, int fileOffset, String name) {
return judgment;
}
@override
Expression listLiteral(
- ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+ ExpressionJudgment judgment,
+ int fileOffset,
+ Token constKeyword,
+ Object typeArguments,
+ Token leftBracket,
+ List<Expression> elements,
+ Token rightBracket,
+ DartType inferredType) {
return judgment;
}
@@ -311,7 +383,20 @@
@override
Expression mapLiteral(
- ExpressionJudgment judgment, int fileOffset, DartType typeContext) {
+ ExpressionJudgment judgment,
+ int fileOffset,
+ Token constKeyword,
+ Object typeArguments,
+ Token leftBracket,
+ List<Object> entries,
+ Token rightBracket,
+ DartType inferredType) {
+ return judgment;
+ }
+
+ @override
+ Object mapLiteralEntry(Object judgment, int fileOffset, Expression key,
+ Token separator, Expression value) {
return judgment;
}
@@ -341,8 +426,8 @@
}
@override
- Expression namedFunctionExpression(
- ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
+ Expression namedFunctionExpression(ExpressionJudgment judgment,
+ covariant VariableDeclaration binder, DartType inferredType) {
return judgment;
}
@@ -469,8 +554,37 @@
return judgment;
}
+ SwitchCase switchCase(
+ SwitchCaseJudgment judgment,
+ List<Object> labels,
+ Token keyword,
+ Expression expression,
+ Token colon,
+ List<Statement> statements) {
+ return judgment;
+ }
+
+ SwitchCase switchLabel(
+ covariant SwitchCase binder, Token label, Token colon) {
+ return binder;
+ }
+
+ SwitchCase binderForSwitchLabel(
+ SwitchCaseJudgment judgment, int fileOffset, String name) {
+ return judgment;
+ }
+
@override
- Statement switchStatement(StatementJudgment judgment, int fileOffset) {
+ Statement switchStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token switchKeyword,
+ Token leftParenthesis,
+ Expression expression,
+ Token rightParenthesis,
+ Token leftBracket,
+ List<Object> members,
+ Token rightBracket) {
return judgment;
}
@@ -503,7 +617,14 @@
}
@override
- Statement tryFinally(StatementJudgment judgment, int fileOffset) {
+ Statement tryFinally(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token tryKeyword,
+ Statement body,
+ List<Object> catchClauses,
+ Token finallyKeyword,
+ Statement finallyBlock) {
return judgment;
}
@@ -525,8 +646,14 @@
}
@override
- Statement variableDeclaration(StatementJudgment judgment, int fileOffset,
+ Statement variableDeclaration(covariant VariableDeclaration binder,
DartType statementType, DartType inferredType) {
+ return binder;
+ }
+
+ @override
+ Object binderForVariableDeclaration(
+ StatementJudgment judgment, int fileOffset, String name) {
return judgment;
}
@@ -535,18 +662,12 @@
ExpressionJudgment judgment,
int fileOffset,
bool isInCascade,
- int expressionVariableDeclarationOffset,
+ covariant VariableDeclaration variableBinder,
DartType inferredType) {
return judgment;
}
@override
- Expression variableSet(
- ExpressionJudgment judgment, int fileOffset, DartType inferredType) {
- return judgment;
- }
-
- @override
Statement whileStatement(
StatementJudgment judgment,
int fileOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 1e5c95a..cc5a316 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -33,6 +33,7 @@
import '../fasta_codes.dart'
show
+ LocatedMessage,
Message,
messageConflictsWithTypeVariableCause,
messageTypeVariableDuplicatedName,
@@ -99,6 +100,7 @@
QualifiedName,
Scope,
TypeBuilder,
+ TypeDeclarationBuilder,
TypeVariableBuilder,
UnresolvedType,
VoidTypeBuilder,
@@ -107,7 +109,11 @@
import 'metadata_collector.dart';
-import 'type_algorithms.dart' show calculateBounds;
+import 'type_algorithms.dart'
+ show
+ calculateBounds,
+ getNonSimplicityIssuesForDeclaration,
+ getNonSimplicityIssuesForTypeVariables;
class KernelLibraryBuilder
extends SourceLibraryBuilder<KernelTypeBuilder, Library> {
@@ -180,6 +186,7 @@
List<TypeVariableBuilder> typeVariables,
KernelTypeBuilder supertype,
List<KernelTypeBuilder> interfaces,
+ int startCharOffset,
int charOffset,
int charEndOffset,
int supertypeOffset) {
@@ -211,6 +218,7 @@
constructorScope,
this,
new List<ConstructorReferenceBuilder>.from(constructorReferences),
+ startCharOffset,
charOffset,
charEndOffset);
loader.target.metadataCollector
@@ -441,6 +449,10 @@
}
}
}
+ final int startCharOffset =
+ (isNamedMixinApplication ? metadata : null) == null
+ ? charOffset
+ : metadata.first.charOffset;
SourceClassBuilder application = new SourceClassBuilder(
isNamedMixinApplication ? metadata : null,
isNamedMixinApplication
@@ -457,6 +469,7 @@
isModifiable: false),
this,
<ConstructorReferenceBuilder>[],
+ startCharOffset,
charOffset,
TreeNode.noOffset,
null,
@@ -527,6 +540,7 @@
String constructorName,
List<TypeVariableBuilder> typeVariables,
List<FormalParameterBuilder> formals,
+ int startCharOffset,
int charOffset,
int charOpenParenOffset,
int charEndOffset,
@@ -540,6 +554,7 @@
typeVariables,
formals,
this,
+ startCharOffset,
charOffset,
charOpenParenOffset,
charEndOffset,
@@ -563,6 +578,7 @@
List<TypeVariableBuilder> typeVariables,
List<FormalParameterBuilder> formals,
ProcedureKind kind,
+ int startCharOffset,
int charOffset,
int charOpenParenOffset,
int charEndOffset,
@@ -578,6 +594,7 @@
formals,
kind,
this,
+ startCharOffset,
charOffset,
charOpenParenOffset,
charEndOffset,
@@ -598,6 +615,7 @@
Object name,
List<FormalParameterBuilder> formals,
ConstructorReferenceBuilder redirectionTarget,
+ int startCharOffset,
int charOffset,
int charOpenParenOffset,
int charEndOffset,
@@ -630,6 +648,7 @@
factoryDeclaration),
formals,
this,
+ startCharOffset,
charOffset,
charOpenParenOffset,
charEndOffset,
@@ -647,6 +666,7 @@
formals,
ProcedureKind.Factory,
this,
+ startCharOffset,
charOffset,
charOpenParenOffset,
charEndOffset,
@@ -1023,32 +1043,79 @@
int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder bottomType,
ClassBuilder objectClass) {
int count = 0;
- bool strongMode = loader.target.strongMode;
- int computeDefaultTypesForVariables(List<TypeVariableBuilder> variables) {
+ int computeDefaultTypesForVariables(
+ List<TypeVariableBuilder<TypeBuilder, Object>> variables,
+ bool strongMode) {
if (variables == null) return 0;
- List<KernelTypeBuilder> calculatedBounds = strongMode
- ? calculateBounds(variables, dynamicType, bottomType, objectClass)
- : null;
- for (int i = 0; i < variables.length; ++i) {
- variables[i].defaultType =
- strongMode ? calculatedBounds[i] : dynamicType;
+
+ if (strongMode) {
+ List<KernelTypeBuilder> calculatedBounds =
+ calculateBounds(variables, dynamicType, bottomType, objectClass);
+ for (int i = 0; i < variables.length; ++i) {
+ variables[i].defaultType = calculatedBounds[i];
+ }
+ } else {
+ // In Dart 1, put `dynamic` everywhere.
+ for (int i = 0; i < variables.length; ++i) {
+ variables[i].defaultType = dynamicType;
+ }
}
+
return variables.length;
}
+ void reportIssues(List<Object> issues) {
+ for (int i = 0; i < issues.length; i += 3) {
+ TypeDeclarationBuilder<TypeBuilder, Object> declaration = issues[i];
+ Message message = issues[i + 1];
+ List<LocatedMessage> context = issues[i + 2];
+
+ addProblem(message, declaration.charOffset, declaration.name.length,
+ declaration.fileUri,
+ context: context);
+ }
+ }
+
+ bool strongMode = loader.target.strongMode;
for (var declaration in libraryDeclaration.members.values) {
if (declaration is KernelClassBuilder) {
- count += computeDefaultTypesForVariables(declaration.typeVariables);
+ {
+ List<Object> issues = strongMode
+ ? getNonSimplicityIssuesForDeclaration(declaration)
+ : const <Object>[];
+ reportIssues(issues);
+ // In case of issues, use non-strong mode for error recovery.
+ count += computeDefaultTypesForVariables(
+ declaration.typeVariables, strongMode && issues.length == 0);
+ }
declaration.forEach((String name, Declaration member) {
if (member is KernelProcedureBuilder) {
- count += computeDefaultTypesForVariables(member.typeVariables);
+ List<Object> issues = strongMode
+ ? getNonSimplicityIssuesForTypeVariables(member.typeVariables)
+ : const <Object>[];
+ reportIssues(issues);
+ // In case of issues, use non-strong mode for error recovery.
+ count += computeDefaultTypesForVariables(
+ member.typeVariables, strongMode && issues.length == 0);
}
});
} else if (declaration is KernelFunctionTypeAliasBuilder) {
- count += computeDefaultTypesForVariables(declaration.typeVariables);
+ List<Object> issues = strongMode
+ ? getNonSimplicityIssuesForDeclaration(declaration)
+ : const <Object>[];
+ reportIssues(issues);
+ // In case of issues, use non-strong mode for error recovery.
+ count += computeDefaultTypesForVariables(
+ declaration.typeVariables, strongMode && issues.length == 0);
} else if (declaration is KernelFunctionBuilder) {
- count += computeDefaultTypesForVariables(declaration.typeVariables);
+ List<Object> issues = strongMode
+ ? getNonSimplicityIssuesForTypeVariables(declaration.typeVariables)
+ : const <Object>[];
+ reportIssues(issues);
+ // In case of issues, use non-strong mode for error recovery.
+ count += computeDefaultTypesForVariables(
+ declaration.typeVariables, strongMode && issues.length == 0);
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
index b09e032..0115101 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
@@ -271,12 +271,14 @@
List<FormalParameterBuilder> formals,
ProcedureKind kind,
KernelLibraryBuilder compilationUnit,
+ int startCharOffset,
int charOffset,
this.charOpenParenOffset,
int charEndOffset,
[String nativeMethodName])
: procedure = new ShadowProcedure(null, kind, null, returnType == null,
fileUri: compilationUnit?.fileUri)
+ ..startFileOffset = startCharOffset
..fileOffset = charOffset
..fileEndOffset = charEndOffset,
super(metadata, modifiers, returnType, name, typeVariables, formals,
@@ -367,6 +369,7 @@
// TODO(ahe): restore file-offset once we track both origin and patch file
// URIs. See https://github.com/dart-lang/sdk/issues/31579
origin.procedure.fileUri = fileUri;
+ origin.procedure.startFileOffset = procedure.startFileOffset;
origin.procedure.fileOffset = procedure.fileOffset;
origin.procedure.fileEndOffset = procedure.fileEndOffset;
origin.procedure.annotations
@@ -420,11 +423,13 @@
List<TypeVariableBuilder> typeVariables,
List<FormalParameterBuilder> formals,
KernelLibraryBuilder compilationUnit,
+ int startCharOffset,
int charOffset,
this.charOpenParenOffset,
int charEndOffset,
[String nativeMethodName])
: constructor = new Constructor(null, fileUri: compilationUnit?.fileUri)
+ ..startFileOffset = startCharOffset
..fileOffset = charOffset
..fileEndOffset = charEndOffset,
super(metadata, modifiers, returnType, name, typeVariables, formals,
@@ -555,6 +560,7 @@
// TODO(ahe): restore file-offset once we track both origin and patch file
// URIs. See https://github.com/dart-lang/sdk/issues/31579
origin.constructor.fileUri = fileUri;
+ origin.constructor.startFileOffset = constructor.startFileOffset;
origin.constructor.fileOffset = constructor.fileOffset;
origin.constructor.fileEndOffset = constructor.fileEndOffset;
origin.constructor.annotations
@@ -598,6 +604,7 @@
List<TypeVariableBuilder> typeVariables,
List<FormalParameterBuilder> formals,
KernelLibraryBuilder compilationUnit,
+ int startCharOffset,
int charOffset,
int charOpenParenOffset,
int charEndOffset,
@@ -612,6 +619,7 @@
formals,
ProcedureKind.Factory,
compilationUnit,
+ startCharOffset,
charOffset,
charOpenParenOffset,
charEndOffset,
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 a9b13d6..c4b13df 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
@@ -20,6 +20,8 @@
import 'dart:core' hide MapEntry;
+import 'package:front_end/src/scanner/token.dart' show Token;
+
import 'package:kernel/ast.dart' as kernel show Expression, Initializer;
import 'package:kernel/ast.dart' hide InvalidExpression, InvalidInitializer;
@@ -59,7 +61,11 @@
TypeInferenceEngine;
import '../type_inference/type_inferrer.dart'
- show TypeInferrer, TypeInferrerDisabled, TypeInferrerImpl;
+ show
+ ExpressionInferenceResult,
+ TypeInferrer,
+ TypeInferrerDisabled,
+ TypeInferrerImpl;
import '../type_inference/type_inference_listener.dart'
show TypeInferenceListener;
@@ -157,28 +163,39 @@
/// Shadow object for [AsExpression].
class AsJudgment extends AsExpression implements ExpressionJudgment {
+ final Token asOperator;
+
DartType inferredType;
- AsJudgment(Expression operand, DartType type) : super(operand, type);
+ AsJudgment(Expression operand, this.asOperator, DartType type)
+ : super(operand, type);
ExpressionJudgment get judgment => operand;
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferrer.inferExpression(factory, judgment, const UnknownType(), false);
inferredType = type;
- inferrer.listener.asExpression(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.listener
+ .asExpression(this, fileOffset, null, asOperator, null, inferredType);
+ return null;
}
}
/// Concrete shadow object representing an assert initializer in kernel form.
class AssertInitializerJudgment extends AssertInitializer
implements InitializerJudgment {
- AssertInitializerJudgment(AssertStatement statement) : super(statement);
+ final Token assertKeyword;
+ final Token leftParenthesis;
+ final Token comma;
+ final Token rightParenthesis;
+
+ AssertInitializerJudgment(AssertStatement statement, this.assertKeyword,
+ this.leftParenthesis, this.comma, this.rightParenthesis)
+ : super(statement);
AssertStatementJudgment get judgment => statement;
@@ -187,14 +204,22 @@
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
inferrer.inferStatement(factory, judgment);
- inferrer.listener.assertInitializer(this, fileOffset);
+ inferrer.listener.assertInitializer(this, fileOffset, assertKeyword,
+ leftParenthesis, null, comma, null, rightParenthesis);
}
}
/// Concrete shadow object representing an assertion statement in kernel form.
class AssertStatementJudgment extends AssertStatement
implements StatementJudgment {
- AssertStatementJudgment(Expression condition,
+ final Token assertKeyword;
+ final Token leftParenthesis;
+ final Token comma;
+ final Token rightParenthesis;
+ final Token semicolon;
+
+ AssertStatementJudgment(this.assertKeyword, this.leftParenthesis,
+ Expression condition, this.comma, this.rightParenthesis, this.semicolon,
{Expression message, int conditionStartOffset, int conditionEndOffset})
: super(condition,
message: message,
@@ -220,20 +245,23 @@
inferrer.inferExpression(
factory, messageJudgment, const UnknownType(), false);
}
- inferrer.listener.assertStatement(this, fileOffset);
+ inferrer.listener.assertStatement(this, fileOffset, assertKeyword,
+ leftParenthesis, null, comma, null, rightParenthesis, semicolon);
}
}
/// Shadow object for [AwaitExpression].
class AwaitJudgment extends AwaitExpression implements ExpressionJudgment {
+ final Token awaitKeyword;
+
DartType inferredType;
- AwaitJudgment(Expression operand) : super(operand);
+ AwaitJudgment(this.awaitKeyword, Expression operand) : super(operand);
ExpressionJudgment get judgment => operand;
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -244,14 +272,19 @@
inferrer.inferExpression(factory, judgment, typeContext, true);
inferredType =
inferrer.typeSchemaEnvironment.unfutureType(judgment.inferredType);
- inferrer.listener.awaitExpression(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.listener
+ .awaitExpression(this, fileOffset, awaitKeyword, null, inferredType);
+ return null;
}
}
/// Concrete shadow object representing a statement block in kernel form.
class BlockJudgment extends Block implements StatementJudgment {
- BlockJudgment(List<Statement> statements) : super(statements);
+ final Token leftBracket;
+ final Token rightBracket;
+
+ BlockJudgment(this.leftBracket, List<Statement> statements, this.rightBracket)
+ : super(statements);
List<Statement> get judgments => statements;
@@ -262,49 +295,68 @@
for (var judgment in judgments) {
inferrer.inferStatement(factory, judgment);
}
- inferrer.listener.block(this, fileOffset);
+ inferrer.listener.block(this, fileOffset, leftBracket, null, rightBracket);
}
}
/// Concrete shadow object representing a boolean literal in kernel form.
class BoolJudgment extends BoolLiteral implements ExpressionJudgment {
+ final Token literal;
+
DartType inferredType;
- BoolJudgment(bool value) : super(value);
+ BoolJudgment(this.literal, bool value) : super(value);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.coreTypes.boolClass.rawType;
- inferrer.listener.boolLiteral(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.listener
+ .boolLiteral(this, fileOffset, literal, value, inferredType);
+ return null;
}
}
/// Concrete shadow object representing a break statement in kernel form.
class BreakJudgment extends BreakStatement implements StatementJudgment {
- BreakJudgment(LabeledStatement target) : super(target);
+ final Token breakKeyword;
+ final Token semicolon;
+
+ BreakJudgment(this.breakKeyword, LabeledStatement target, this.semicolon)
+ : super(target);
+
+ LabeledStatementJudgment get targetJudgment => target;
@override
void infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
// No inference needs to be done.
+ inferrer.listener.breakStatement(this, fileOffset, breakKeyword, null,
+ semicolon, targetJudgment?.createBinder(inferrer));
}
}
/// Concrete shadow object representing a continue statement in kernel form.
class ContinueJudgment extends BreakStatement implements StatementJudgment {
- ContinueJudgment(LabeledStatement target) : super(target);
+ final Token continueKeyword;
+ final Token semicolon;
+
+ ContinueJudgment(
+ this.continueKeyword, LabeledStatement target, this.semicolon)
+ : super(target);
+
+ LabeledStatementJudgment get targetJudgment => target;
@override
void infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
// No inference needs to be done.
- inferrer.listener.breakStatement(this, fileOffset);
+ inferrer.listener.continueStatement(this, fileOffset, continueKeyword, null,
+ semicolon, targetJudgment?.createBinder(inferrer));
}
}
@@ -322,21 +374,21 @@
/// variable"--this is the variable that remembers the value of the expression
/// preceding the first `..` while the cascades are being evaluated.
///
-/// After constructing a [ShadowCascadeExpression], the caller should
+/// After constructing a [CascadeJudgment], the caller should
/// call [finalize] with an expression representing the expression after the
/// `..`. If a further `..` follows that expression, the caller should call
/// [extend] followed by [finalize] for each subsequent cascade.
-class ShadowCascadeExpression extends Let implements ExpressionJudgment {
+class CascadeJudgment extends Let implements ExpressionJudgment {
DartType inferredType;
/// Pointer to the last "let" expression in the cascade.
Let nextCascade;
- /// Creates a [ShadowCascadeExpression] using [variable] as the cascade
+ /// Creates a [CascadeJudgment] using [variable] as the cascade
/// variable. Caller is responsible for ensuring that [variable]'s
/// initializer is the expression preceding the first `..` of the cascade
/// expression.
- ShadowCascadeExpression(VariableDeclarationJudgment variable)
+ CascadeJudgment(VariableDeclarationJudgment variable)
: super(
variable,
makeLet(new VariableDeclaration.forValue(new _UnfinishedCascade()),
@@ -344,6 +396,17 @@
nextCascade = body;
}
+ ExpressionJudgment get targetJudgment => variable.initializer;
+
+ Iterable<ExpressionJudgment> get cascadeJudgments sync* {
+ Let section = body;
+ while (true) {
+ yield section.variable.initializer;
+ if (section.body is! Let) break;
+ section = section.body;
+ }
+ }
+
/// Adds a new unfinalized section to the end of the cascade. Should be
/// called after the previous cascade section has been finalized.
void extend() {
@@ -364,24 +427,20 @@
}
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
- var lhsType = inferrer.inferExpression(
- factory, variable.initializer, typeContext, true);
+ inferredType =
+ inferrer.inferExpression(factory, targetJudgment, typeContext, true);
if (inferrer.strongMode) {
- variable.type = lhsType;
+ variable.type = inferredType;
}
- Let section = body;
- while (true) {
- inferrer.inferExpression(
- factory, section.variable.initializer, const UnknownType(), false);
- if (section.body is! Let) break;
- section = section.body;
+ for (var judgment in cascadeJudgments) {
+ inferrer.inferExpression(factory, judgment, const UnknownType(), false);
}
- inferrer.listener.cascadeExpression(this, fileOffset, lhsType);
- return lhsType;
+ inferrer.listener.cascadeExpression(this, fileOffset, inferredType);
+ return null;
}
}
@@ -445,13 +504,13 @@
///
/// TODO(paulberry): once we know exactly what constitutes a "complex
/// assignment", document it here.
-abstract class ShadowComplexAssignment extends ShadowSyntheticExpression {
+abstract class ComplexAssignmentJudgment extends SyntheticExpressionJudgment {
/// In a compound assignment, the expression that reads the old value, or
/// `null` if this is not a compound assignment.
Expression read;
/// The expression appearing on the RHS of the assignment.
- final Expression rhs;
+ final ExpressionJudgment rhs;
/// The expression that performs the write (e.g. `a.[]=(b, a.[](b) + 1)` in
/// `++a[b]`).
@@ -480,7 +539,7 @@
/// pre-decrement.
bool isPreIncDec = false;
- ShadowComplexAssignment(this.rhs) : super(null);
+ ComplexAssignmentJudgment(this.rhs) : super(null);
String toString() {
var parts = _getToStringParts();
@@ -535,8 +594,8 @@
assert(identical(combiner.arguments.positional.first, rhs));
// Analyzer uses a null context for the RHS here.
// TODO(paulberry): improve on this.
- rhsType =
- inferrer.inferExpression(factory, rhs, const UnknownType(), true);
+ inferrer.inferExpression(factory, rhs, const UnknownType(), true);
+ rhsType = rhs.inferredType;
// Do not use rhs after this point because it may be a Shadow node
// that has been replaced in the tree with its desugaring.
var expectedType = getPositionalParameterType(combinerType, 0);
@@ -566,8 +625,9 @@
}
_storeLetType(inferrer, replacedCombiner, combinedType);
} else {
- var rhsType = inferrer.inferExpression(
+ inferrer.inferExpression(
factory, rhs, writeContext ?? const UnknownType(), true);
+ var rhsType = rhs.inferredType;
var replacedRhs =
inferrer.ensureAssignable(writeContext, rhsType, rhs, writeOffset);
_storeLetType(inferrer, replacedRhs ?? rhs, rhsType);
@@ -588,28 +648,29 @@
combinedType = rhsType;
}
}
- if (this is ShadowIndexAssign) {
+ if (this is IndexAssignmentJudgment) {
_storeLetType(inferrer, write, const VoidType());
} else {
_storeLetType(inferrer, write, combinedType);
}
- return new _ComplexAssignmentInferenceResult(combinerMember,
- isPostIncDec ? (readType ?? const DynamicType()) : combinedType);
+ inferredType =
+ isPostIncDec ? (readType ?? const DynamicType()) : combinedType;
+ return new _ComplexAssignmentInferenceResult(combinerMember);
}
}
/// Abstract shadow object representing a complex assignment involving a
/// receiver.
-abstract class ShadowComplexAssignmentWithReceiver
- extends ShadowComplexAssignment {
+abstract class ComplexAssignmentJudgmentWithReceiver
+ extends ComplexAssignmentJudgment {
/// The receiver of the assignment target (e.g. `a` in `a[b] = c`).
- final Expression receiver;
+ final ExpressionJudgment receiver;
/// Indicates whether this assignment uses `super`.
final bool isSuper;
- ShadowComplexAssignmentWithReceiver(
- this.receiver, Expression rhs, this.isSuper)
+ ComplexAssignmentJudgmentWithReceiver(
+ this.receiver, ExpressionJudgment rhs, this.isSuper)
: super(rhs);
@override
@@ -624,8 +685,8 @@
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
if (receiver != null) {
- var receiverType = inferrer.inferExpression(
- factory, receiver, const UnknownType(), true);
+ inferrer.inferExpression(factory, receiver, const UnknownType(), true);
+ var receiverType = receiver.inferredType;
_storeLetType(inferrer, receiver, receiverType);
return receiverType;
} else if (isSuper) {
@@ -641,6 +702,9 @@
/// Shadow object for [ConditionalExpression].
class ConditionalJudgment extends ConditionalExpression
implements ExpressionJudgment {
+ final Token question;
+ final Token colon;
+
DartType inferredType;
ExpressionJudgment get conditionJudgment => condition;
@@ -649,12 +713,12 @@
ExpressionJudgment get otherwiseJudgment => otherwise;
- ConditionalJudgment(
- Expression condition, Expression then, Expression otherwise)
+ ConditionalJudgment(Expression condition, this.question, Expression then,
+ this.colon, Expression otherwise)
: super(condition, then, otherwise, null);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -676,13 +740,14 @@
if (inferrer.strongMode) {
staticType = inferredType;
}
- inferrer.listener.conditionalExpression(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.listener.conditionalExpression(
+ this, fileOffset, null, question, null, colon, null, inferredType);
+ return null;
}
}
/// Shadow object for [ConstructorInvocation].
-class ShadowConstructorInvocation extends ConstructorInvocation
+class ConstructorInvocationJudgment extends ConstructorInvocation
implements ExpressionJudgment {
DartType inferredType;
@@ -704,13 +769,15 @@
/// [targetTypeArguments] is a list containing the type `List<T>`.
final List<DartType> targetTypeArguments;
- ShadowConstructorInvocation(Constructor target, this.targetTypeArguments,
- this._initialTarget, Arguments arguments,
+ ConstructorInvocationJudgment(Constructor target, this.targetTypeArguments,
+ this._initialTarget, ArgumentsJudgment arguments,
{bool isConst: false})
: super(target, arguments, isConst: isConst);
+ ArgumentsJudgment get argumentJudgments => arguments;
+
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -744,14 +811,16 @@
}
inferrer.engine.beingInferred.remove(target);
}
- var inferredType = inferrer.inferInvocation(
+ var inferenceResult = inferrer.inferInvocation(
factory,
typeContext,
fileOffset,
_initialTarget.function.functionType,
computeConstructorReturnType(_initialTarget),
- arguments,
+ argumentJudgments,
isConst: isConst);
+ var inferredType = inferenceResult.type;
+ this.inferredType = inferredType;
if (inferrer.strongMode &&
!inferrer.isTopLevel &&
inferrer.typeSchemaEnvironment.isSuperBounded(inferredType)) {
@@ -788,15 +857,15 @@
}
}
- return inferredType;
+ return null;
}
- /// Determines whether the given [ShadowConstructorInvocation] represents an
+ /// Determines whether the given [ConstructorInvocationJudgment] represents an
/// invocation of a redirected factory constructor.
///
/// This is static to avoid introducing a method that would be visible to the
/// kernel.
- static bool isRedirected(ShadowConstructorInvocation expression) {
+ static bool isRedirected(ConstructorInvocationJudgment expression) {
return !identical(expression._initialTarget, expression.target);
}
}
@@ -805,41 +874,66 @@
/// statement, in kernel form.
class ContinueSwitchJudgment extends ContinueSwitchStatement
implements StatementJudgment {
- ContinueSwitchJudgment(SwitchCase target) : super(target);
+ final Token continueKeyword;
+ final Token semicolon;
+
+ ContinueSwitchJudgment(
+ this.continueKeyword, SwitchCase target, this.semicolon)
+ : super(target);
+
+ SwitchCaseJudgment get targetJudgment => target;
@override
void infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
// No inference needs to be done.
- inferrer.listener.continueSwitchStatement(this, fileOffset);
+ inferrer.listener.continueSwitchStatement(this, fileOffset, continueKeyword,
+ null, semicolon, targetJudgment?.createBinder(inferrer));
}
}
/// Shadow object representing a deferred check in kernel form.
-class ShadowDeferredCheck extends Let implements ExpressionJudgment {
+class DeferredCheckJudgment extends Let implements ExpressionJudgment {
DartType inferredType;
- ShadowDeferredCheck(VariableDeclaration variable, Expression body)
+ DeferredCheckJudgment(VariableDeclaration variable, Expression body)
: super(variable, body);
+ ExpressionJudgment get judgment => body;
+
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
// Since the variable is not used in the body we don't need to type infer
// it. We can just type infer the body.
- var inferredType =
- inferrer.inferExpression(factory, body, typeContext, true);
+ var judgment = this.judgment;
+ inferrer.inferExpression(factory, judgment, typeContext, true);
+ inferredType = judgment.inferredType;
inferrer.listener.deferredCheck(this, fileOffset, inferredType);
- return inferredType;
+ return null;
}
}
/// Concrete shadow object representing a do loop in kernel form.
class DoJudgment extends DoStatement implements StatementJudgment {
- DoJudgment(Statement body, Expression condition) : super(body, condition);
+ final Token doKeyword;
+ final Token whileKeyword;
+ final Token leftParenthesis;
+ final Token rightParenthesis;
+ final Token semicolon;
+
+ DoJudgment(
+ this.doKeyword,
+ Statement body,
+ this.whileKeyword,
+ this.leftParenthesis,
+ Expression condition,
+ this.rightParenthesis,
+ this.semicolon)
+ : super(body, condition);
StatementJudgment get bodyJudgment => body;
@@ -856,24 +950,28 @@
factory, conditionJudgment, boolType, !inferrer.isTopLevel);
inferrer.ensureAssignable(boolType, conditionJudgment.inferredType,
condition, condition.fileOffset);
- inferrer.listener.doStatement(this, fileOffset);
+ inferrer.listener.doStatement(this, fileOffset, doKeyword, null,
+ whileKeyword, leftParenthesis, null, rightParenthesis, semicolon);
}
}
/// Concrete shadow object representing a double literal in kernel form.
class DoubleJudgment extends DoubleLiteral implements ExpressionJudgment {
+ final Token literal;
+
DartType inferredType;
- DoubleJudgment(double value) : super(value);
+ DoubleJudgment(this.literal, double value) : super(value);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.coreTypes.doubleClass.rawType;
- inferrer.listener.doubleLiteral(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.listener
+ .doubleLiteral(this, fileOffset, literal, value, inferredType);
+ return null;
}
}
@@ -884,7 +982,7 @@
/// Calls back to [inferrer] to perform type inference for whatever concrete
/// type of [ExpressionJudgment] this is.
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext);
@@ -893,18 +991,26 @@
/// Concrete shadow object representing an empty statement in kernel form.
class EmptyStatementJudgment extends EmptyStatement
implements StatementJudgment {
+ final Token semicolon;
+
+ EmptyStatementJudgment(this.semicolon);
+
@override
void infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
// No inference needs to be done.
+ inferrer.listener.emptyStatement(semicolon);
}
}
/// Concrete shadow object representing an expression statement in kernel form.
class ExpressionStatementJudgment extends ExpressionStatement
implements StatementJudgment {
- ExpressionStatementJudgment(Expression expression) : super(expression);
+ final Token semicolon;
+
+ ExpressionStatementJudgment(Expression expression, this.semicolon)
+ : super(expression);
Expression get judgment => expression;
@@ -913,13 +1019,13 @@
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
inferrer.inferExpression(factory, judgment, const UnknownType(), false);
- inferrer.listener.expressionStatement(this, fileOffset);
+ inferrer.listener.expressionStatement(this, fileOffset, null, semicolon);
}
}
/// Shadow object for [StaticInvocation] when the procedure being invoked is a
/// factory constructor.
-class ShadowFactoryConstructorInvocation extends StaticInvocation
+class FactoryConstructorInvocationJudgment extends StaticInvocation
implements ExpressionJudgment {
DartType inferredType;
@@ -941,23 +1047,30 @@
/// [targetTypeArguments] is a list containing the type `List<T>`.
final List<DartType> targetTypeArguments;
- ShadowFactoryConstructorInvocation(Procedure target, this.targetTypeArguments,
- this._initialTarget, Arguments arguments,
+ FactoryConstructorInvocationJudgment(
+ Procedure target,
+ this.targetTypeArguments,
+ this._initialTarget,
+ ArgumentsJudgment arguments,
{bool isConst: false})
: super(target, arguments, isConst: isConst);
+ ArgumentsJudgment get argumentJudgments => arguments;
+
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
- var inferredType = inferrer.inferInvocation(
+ var inferenceResult = inferrer.inferInvocation(
factory,
typeContext,
fileOffset,
_initialTarget.function.functionType,
computeConstructorReturnType(_initialTarget),
- arguments);
+ argumentJudgments);
+ var inferredType = inferenceResult.type;
+ this.inferredType = inferredType;
inferrer.listener
.constructorInvocation(this, fileOffset, target, inferredType);
@@ -985,15 +1098,15 @@
}
}
- return inferredType;
+ return null;
}
- /// Determines whether the given [ShadowConstructorInvocation] represents an
+ /// Determines whether the given [ConstructorInvocationJudgment] represents an
/// invocation of a redirected factory constructor.
///
/// This is static to avoid introducing a method that would be visible to the
/// kernel.
- static bool isRedirected(ShadowFactoryConstructorInvocation expression) {
+ static bool isRedirected(FactoryConstructorInvocationJudgment expression) {
return !identical(expression._initialTarget, expression.target);
}
}
@@ -1039,21 +1152,43 @@
var initializerType =
inferrer.inferExpression(factory, value, field.type, true);
inferrer.ensureAssignable(field.type, initializerType, value, fileOffset);
- inferrer.listener.fieldInitializer(this, fileOffset, field);
+ inferrer.listener.fieldInitializer(
+ this, fileOffset, null, null, null, null, null, field);
}
}
/// Concrete shadow object representing a for-in loop in kernel form.
-class ShadowForInStatement extends ForInStatement implements StatementJudgment {
+class ForInJudgment extends ForInStatement implements StatementJudgment {
+ final Token awaitKeyword;
+ final Token forKeyword;
+ final Token leftParenthesis;
+ final Token inKeyword;
+ final Token rightParenthesis;
+
final bool _declaresVariable;
- final ShadowSyntheticExpression _syntheticAssignment;
+ final SyntheticExpressionJudgment _syntheticAssignment;
- ShadowForInStatement(VariableDeclaration variable, Expression iterable,
- Statement body, this._declaresVariable, this._syntheticAssignment,
+ ForInJudgment(
+ this.awaitKeyword,
+ this.forKeyword,
+ this.leftParenthesis,
+ VariableDeclaration variable,
+ this.inKeyword,
+ Expression iterable,
+ this.rightParenthesis,
+ Statement body,
+ this._declaresVariable,
+ this._syntheticAssignment,
{bool isAsync: false})
: super(variable, iterable, body, isAsync: isAsync);
+ VariableDeclarationJudgment get variableJudgment => variable;
+
+ ExpressionJudgment get iterableJudgment => iterable;
+
+ StatementJudgment get bodyJudgment => body;
+
@override
void infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
@@ -1069,14 +1204,14 @@
kernel.Expression syntheticWrite;
DartType syntheticWriteType;
if (_declaresVariable) {
- variable = this.variable;
+ variable = this.variableJudgment;
if (inferrer.strongMode && variable._implicitlyTyped) {
typeNeeded = true;
context = const UnknownType();
} else {
context = variable.type;
}
- } else if (syntheticAssignment is ShadowComplexAssignment) {
+ } else if (syntheticAssignment is ComplexAssignmentJudgment) {
syntheticWrite = syntheticAssignment.write;
syntheticWriteType =
context = syntheticAssignment._getWriteType(inferrer);
@@ -1084,14 +1219,18 @@
context = const UnknownType();
}
context = inferrer.wrapType(context, iterableClass);
- var inferredExpressionType = inferrer.resolveTypeParameter(
- inferrer.inferExpression(
- factory, iterable, context, typeNeeded || typeChecksNeeded));
+
+ var iterableJudgment = this.iterableJudgment;
+ inferrer.inferExpression(
+ factory, iterableJudgment, context, typeNeeded || typeChecksNeeded);
+ var inferredExpressionType =
+ inferrer.resolveTypeParameter(iterableJudgment.inferredType);
inferrer.ensureAssignable(
inferrer.wrapType(const DynamicType(), iterableClass),
inferredExpressionType,
iterable,
iterable.fileOffset);
+
DartType inferredType;
if (typeNeeded || typeChecksNeeded) {
inferredType = const DynamicType();
@@ -1111,7 +1250,12 @@
this.variable.type = inferredType;
}
}
- inferrer.inferStatement(factory, body);
+
+ inferrer.inferStatement(factory, bodyJudgment);
+ if (syntheticAssignment != null) {
+ var syntheticStatement = new ExpressionStatement(syntheticAssignment);
+ body = combineStatements(syntheticStatement, body)..parent = this;
+ }
if (_declaresVariable) {
inferrer.inferMetadataKeepingHelper(factory, variable.annotations);
var tempVar =
@@ -1125,14 +1269,14 @@
variable.initializer = implicitDowncast..parent = variable;
body = combineStatements(variable, body)..parent = this;
}
- } else if (syntheticAssignment is ShadowSyntheticExpression) {
- if (syntheticAssignment is ShadowComplexAssignment) {
+ } else if (syntheticAssignment is SyntheticExpressionJudgment) {
+ if (syntheticAssignment is ComplexAssignmentJudgment) {
inferrer.ensureAssignable(
greatestClosure(inferrer.coreTypes, syntheticWriteType),
this.variable.type,
syntheticAssignment.rhs,
syntheticAssignment.rhs.fileOffset);
- if (syntheticAssignment is ShadowPropertyAssign) {
+ if (syntheticAssignment is PropertyAssignmentJudgment) {
syntheticAssignment._handleWriteContravariance(
inferrer, inferrer.thisType);
}
@@ -1143,7 +1287,16 @@
inferrer.listener.forInStatement(
this,
fileOffset,
- variable?.fileOffset,
+ awaitKeyword,
+ forKeyword,
+ leftParenthesis,
+ null,
+ null,
+ inKeyword,
+ iterable,
+ rightParenthesis,
+ body,
+ variable?.createBinder(inferrer),
variable?.type,
syntheticWrite.fileOffset,
syntheticWrite.variable.type,
@@ -1153,7 +1306,16 @@
inferrer.listener.forInStatement(
this,
fileOffset,
- variable?.fileOffset,
+ awaitKeyword,
+ forKeyword,
+ leftParenthesis,
+ null,
+ null,
+ inKeyword,
+ iterable,
+ rightParenthesis,
+ body,
+ variable?.createBinder(inferrer),
variable?.type,
syntheticWrite.fileOffset,
syntheticWrite.interfaceTarget?.setterType,
@@ -1163,16 +1325,41 @@
inferrer.listener.forInStatement(
this,
fileOffset,
- variable?.fileOffset,
+ awaitKeyword,
+ forKeyword,
+ leftParenthesis,
+ null,
+ null,
+ inKeyword,
+ iterable,
+ rightParenthesis,
+ body,
+ variable?.createBinder(inferrer),
variable?.type,
syntheticWrite.fileOffset,
syntheticWrite.target.setterType,
null,
syntheticWrite.target);
} else if (syntheticWrite == null ||
- syntheticWrite is ShadowSyntheticExpression) {
- inferrer.listener.forInStatement(this, fileOffset, variable?.fileOffset,
- variable?.type, null, null, null, null);
+ syntheticWrite is SyntheticExpressionJudgment) {
+ inferrer.listener.forInStatement(
+ this,
+ fileOffset,
+ awaitKeyword,
+ forKeyword,
+ leftParenthesis,
+ null,
+ null,
+ inKeyword,
+ null,
+ rightParenthesis,
+ null,
+ variable?.createBinder(inferrer),
+ variable?.type,
+ null,
+ null,
+ null,
+ null);
} else {
throw new UnimplementedError(
'(${syntheticWrite.runtimeType}) $syntheticWrite');
@@ -1181,81 +1368,166 @@
}
/// Concrete shadow object representing a classic for loop in kernel form.
-class ShadowForStatement extends ForStatement implements StatementJudgment {
- ShadowForStatement(List<VariableDeclaration> variables, Expression condition,
- List<Expression> updates, Statement body)
- : super(variables, condition, updates, body);
+class ForJudgment extends ForStatement implements StatementJudgment {
+ final Token forKeyword;
+ final Token leftParenthesis;
+ final Token leftSeparator;
+ final Token rightSeparator;
+ final Token rightParenthesis;
+
+ final List<ExpressionJudgment> initializers;
+
+ ForJudgment(
+ this.forKeyword,
+ this.leftParenthesis,
+ List<VariableDeclaration> variables,
+ this.initializers,
+ this.leftSeparator,
+ ExpressionJudgment condition,
+ this.rightSeparator,
+ List<Expression> updates,
+ this.rightParenthesis,
+ Statement body)
+ : super(variables ?? [], condition, updates, body);
+
+ List<VariableDeclarationJudgment> get variableJudgments => variables.cast();
+
+ ExpressionJudgment get conditionJudgment => condition;
+
+ List<ExpressionJudgment> get updateJudgments => updates.cast();
+
+ StatementJudgment get bodyJudgment => body;
@override
void infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
- for (var variable in variables) {
- inferrer.inferStatement(factory, variable);
+ var initializers = this.initializers;
+ var conditionJudgment = this.conditionJudgment;
+ if (initializers != null) {
+ for (var initializer in initializers) {
+ variables
+ .add(new VariableDeclaration.forValue(initializer)..parent = this);
+ inferrer.inferExpression(
+ factory, initializer, const UnknownType(), false);
+ }
+ } else {
+ for (var variable in variableJudgments) {
+ inferrer.inferStatement(factory, variable);
+ }
}
- if (condition != null) {
+ if (conditionJudgment != null) {
var expectedType = inferrer.coreTypes.boolClass.rawType;
- var conditionType = inferrer.inferExpression(
- factory, condition, expectedType, !inferrer.isTopLevel);
- inferrer.ensureAssignable(
- expectedType, conditionType, condition, condition.fileOffset);
+ inferrer.inferExpression(
+ factory, conditionJudgment, expectedType, !inferrer.isTopLevel);
+ inferrer.ensureAssignable(expectedType, conditionJudgment.inferredType,
+ condition, condition.fileOffset);
}
- for (var update in updates) {
+ for (var update in updateJudgments) {
inferrer.inferExpression(factory, update, const UnknownType(), false);
}
- inferrer.inferStatement(factory, body);
- inferrer.listener.forStatement(this, fileOffset);
+ inferrer.inferStatement(factory, bodyJudgment);
+ inferrer.listener.forStatement(
+ this,
+ fileOffset,
+ forKeyword,
+ leftParenthesis,
+ null,
+ null,
+ leftSeparator,
+ condition,
+ rightSeparator,
+ updates,
+ rightParenthesis,
+ body);
+ }
+}
+
+/// Concrete shadow object representing a function expression in kernel form.
+class FunctionNodeJudgment extends FunctionNode {
+ FunctionNodeJudgment(Statement body,
+ {List<TypeParameter> typeParameters,
+ List<VariableDeclaration> positionalParameters,
+ List<VariableDeclaration> namedParameters,
+ int requiredParameterCount,
+ DartType returnType: const DynamicType(),
+ AsyncMarker asyncMarker: AsyncMarker.Sync,
+ AsyncMarker dartAsyncMarker})
+ : super(body,
+ typeParameters: typeParameters,
+ positionalParameters: positionalParameters,
+ namedParameters: namedParameters,
+ requiredParameterCount: requiredParameterCount,
+ returnType: returnType,
+ asyncMarker: asyncMarker,
+ dartAsyncMarker: dartAsyncMarker);
+
+ ExpressionInferenceResult infer<Expression, Statement, Initializer, Type>(
+ ShadowTypeInferrer inferrer,
+ Factory<Expression, Statement, Initializer, Type> factory,
+ DartType typeContext,
+ DartType returnContext,
+ int returnTypeInstrumentationOffset) {
+ return inferrer.inferLocalFunction(factory, this, typeContext,
+ returnTypeInstrumentationOffset, returnContext);
}
}
/// Concrete shadow object representing a local function declaration in kernel
/// form.
-class ShadowFunctionDeclaration extends FunctionDeclaration
+class FunctionDeclarationJudgment extends FunctionDeclaration
implements StatementJudgment {
bool _hasImplicitReturnType = false;
- ShadowFunctionDeclaration(VariableDeclaration variable, FunctionNode function)
+ FunctionDeclarationJudgment(
+ VariableDeclarationJudgment variable, FunctionNodeJudgment function)
: super(variable, function);
+ VariableDeclarationJudgment get variableJudgment => variable;
+
+ FunctionNodeJudgment get functionJudgment => function;
+
@override
void infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
inferrer.inferMetadataKeepingHelper(factory, variable.annotations);
- inferrer.inferLocalFunction(
- factory,
- function,
- null,
- fileOffset,
- _hasImplicitReturnType
- ? (inferrer.strongMode ? null : const DynamicType())
- : function.returnType);
- var inferredType = variable.type = function.functionType;
- inferrer.listener.functionDeclaration(this, fileOffset, inferredType);
+ DartType returnContext = _hasImplicitReturnType
+ ? (inferrer.strongMode ? null : const DynamicType())
+ : function.returnType;
+ var inferenceResult = functionJudgment.infer(
+ inferrer, factory, null, returnContext, fileOffset);
+ var inferredType = variable.type = inferenceResult.type;
+ inferrer.listener.functionDeclaration(
+ variableJudgment.createBinder(inferrer), inferredType);
}
static void setHasImplicitReturnType(
- ShadowFunctionDeclaration declaration, bool hasImplicitReturnType) {
+ FunctionDeclarationJudgment declaration, bool hasImplicitReturnType) {
declaration._hasImplicitReturnType = hasImplicitReturnType;
}
}
/// Concrete shadow object representing a function expression in kernel form.
-class ShadowFunctionExpression extends FunctionExpression
+class FunctionExpressionJudgment extends FunctionExpression
implements ExpressionJudgment {
DartType inferredType;
- ShadowFunctionExpression(FunctionNode function) : super(function);
+ FunctionExpressionJudgment(FunctionNodeJudgment function) : super(function);
+
+ FunctionNodeJudgment get judgment => function;
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
- var inferredType = inferrer.inferLocalFunction(
- factory, function, typeContext, fileOffset, null);
+ var judgment = this.judgment;
+ var inferenceResult =
+ judgment.infer(inferrer, factory, typeContext, null, fileOffset);
+ inferredType = inferenceResult.type;
inferrer.listener.functionExpression(this, fileOffset, inferredType);
- return inferredType;
+ return null;
}
}
@@ -1265,55 +1537,76 @@
/// expression:
///
/// let v = a in v == null ? b : v
-class ShadowIfNullExpression extends Let implements ExpressionJudgment {
+class IfNullJudgment extends Let implements ExpressionJudgment {
+ final Token operator;
+
DartType inferredType;
- ShadowIfNullExpression(VariableDeclaration variable, Expression body)
+ IfNullJudgment(VariableDeclaration variable, this.operator, Expression body)
: super(variable, body);
@override
ConditionalExpression get body => super.body;
/// Returns the expression to the left of `??`.
- Expression get _lhs => variable.initializer;
+ ExpressionJudgment get leftJudgment => variable.initializer;
/// Returns the expression to the right of `??`.
- Expression get _rhs => body.then;
+ ExpressionJudgment get rightJudgment => body.then;
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
+ var leftJudgment = this.leftJudgment;
+ var rightJudgment = this.rightJudgment;
// To infer `e0 ?? e1` in context K:
// - Infer e0 in context K to get T0
- var lhsType = inferrer.inferExpression(factory, _lhs, typeContext, true);
+ inferrer.inferExpression(factory, leftJudgment, typeContext, true);
+ var lhsType = leftJudgment.inferredType;
if (inferrer.strongMode) {
variable.type = lhsType;
}
// - Let J = T0 if K is `?` else K.
// - Infer e1 in context J to get T1
bool useLub = _forceLub || typeContext is UnknownType;
- var rhsType = typeContext is UnknownType
- ? inferrer.inferExpression(factory, _rhs, lhsType, true)
- : inferrer.inferExpression(factory, _rhs, typeContext, _forceLub);
+ if (typeContext is UnknownType) {
+ inferrer.inferExpression(factory, rightJudgment, lhsType, true);
+ } else {
+ inferrer.inferExpression(factory, rightJudgment, typeContext, _forceLub);
+ }
+ var rhsType = rightJudgment.inferredType;
// - Let T = greatest closure of K with respect to `?` if K is not `_`, else
// UP(t0, t1)
// - Then the inferred type is T.
- var inferredType = useLub
+ inferredType = useLub
? inferrer.typeSchemaEnvironment.getLeastUpperBound(lhsType, rhsType)
: greatestClosure(inferrer.coreTypes, typeContext);
if (inferrer.strongMode) {
body.staticType = inferredType;
}
- inferrer.listener.ifNull(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.listener
+ .ifNull(this, fileOffset, null, operator, null, inferredType);
+ return null;
}
}
/// Concrete shadow object representing an if statement in kernel form.
class IfJudgment extends IfStatement implements StatementJudgment {
- IfJudgment(Expression condition, Statement then, Statement otherwise)
+ final Token ifKeyword;
+ final Token leftParenthesis;
+ final Token rightParenthesis;
+ final Token elseKeyword;
+
+ IfJudgment(
+ this.ifKeyword,
+ this.leftParenthesis,
+ Expression condition,
+ this.rightParenthesis,
+ Statement then,
+ this.elseKeyword,
+ Statement otherwise)
: super(condition, then, otherwise);
ExpressionJudgment get conditionJudgment => condition;
@@ -1336,14 +1629,15 @@
if (otherwiseJudgment != null) {
inferrer.inferStatement(factory, otherwiseJudgment);
}
- inferrer.listener.ifStatement(this, fileOffset);
+ inferrer.listener.ifStatement(this, fileOffset, ifKeyword, leftParenthesis,
+ null, rightParenthesis, null, elseKeyword, null);
}
}
/// Concrete shadow object representing an assignment to a target for which
/// assignment is not allowed.
-class ShadowIllegalAssignment extends ShadowComplexAssignment {
- ShadowIllegalAssignment(Expression rhs) : super(rhs);
+class IllegalAssignmentJudgment extends ComplexAssignmentJudgment {
+ IllegalAssignmentJudgment(ExpressionJudgment rhs) : super(rhs);
@override
DartType _getWriteType(ShadowTypeInferrer inferrer) {
@@ -1351,7 +1645,7 @@
}
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -1359,17 +1653,19 @@
inferrer.inferExpression(factory, write, const UnknownType(), false);
}
_replaceWithDesugared();
- return const DynamicType();
+ inferredType = const DynamicType();
+ return null;
}
}
/// Concrete shadow object representing an assignment to a target of the form
/// `a[b]`.
-class ShadowIndexAssign extends ShadowComplexAssignmentWithReceiver {
+class IndexAssignmentJudgment extends ComplexAssignmentJudgmentWithReceiver {
/// In an assignment to an index expression, the index expression.
- Expression index;
+ final ExpressionJudgment index;
- ShadowIndexAssign(Expression receiver, this.index, Expression rhs,
+ IndexAssignmentJudgment(
+ ExpressionJudgment receiver, this.index, ExpressionJudgment rhs,
{bool isSuper: false})
: super(receiver, rhs, isSuper);
@@ -1393,7 +1689,7 @@
}
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -1414,8 +1710,8 @@
expectedIndexTypeForWrite = calleeType.positionalParameters[0];
writeContext = calleeType.positionalParameters[1];
}
- var indexType =
- inferrer.inferExpression(factory, index, indexContext, true);
+ inferrer.inferExpression(factory, index, indexContext, true);
+ var indexType = index.inferredType;
_storeLetType(inferrer, index, indexType);
if (writeContext is! UnknownType) {
inferrer.ensureAssignable(
@@ -1452,9 +1748,9 @@
}
var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
inferrer.listener.indexAssign(this, write.fileOffset, writeMember,
- inferredResult.combiner, inferredResult.type);
+ inferredResult.combiner, inferredType);
_replaceWithDesugared();
- return inferredResult.type;
+ return null;
}
}
@@ -1470,18 +1766,21 @@
/// Concrete shadow object representing an integer literal in kernel form.
class IntJudgment extends IntLiteral implements ExpressionJudgment {
+ final Token literal;
+
DartType inferredType;
- IntJudgment(int value) : super(value);
+ IntJudgment(this.literal, int value) : super(value);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.coreTypes.intClass.rawType;
- inferrer.listener.intLiteral(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.listener
+ .intLiteral(this, fileOffset, literal, value, inferredType);
+ return null;
}
}
@@ -1502,26 +1801,33 @@
/// Concrete shadow object representing a non-inverted "is" test in kernel form.
class IsJudgment extends IsExpression implements ExpressionJudgment {
+ final Token isOperator;
+
DartType inferredType;
ExpressionJudgment get judgment => operand;
- IsJudgment(Expression operand, DartType type) : super(operand, type);
+ IsJudgment(Expression operand, this.isOperator, DartType type)
+ : super(operand, type);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferrer.inferExpression(factory, judgment, const UnknownType(), false);
inferredType = inferrer.coreTypes.boolClass.rawType;
- inferrer.listener.isExpression(this, fileOffset, type, inferredType);
- return inferredType;
+ inferrer.listener.isExpression(
+ this, fileOffset, null, isOperator, null, type, inferredType);
+ return null;
}
}
/// Concrete shadow object representing an inverted "is" test in kernel form.
class IsNotJudgment extends Not implements ExpressionJudgment {
+ final Token isOperator;
+ final Token notOperator;
+
DartType inferredType;
@override
@@ -1529,11 +1835,12 @@
ExpressionJudgment get judgment => operand.operand;
- IsNotJudgment(Expression operand, DartType type, int charOffset)
+ IsNotJudgment(Expression operand, this.isOperator, this.notOperator,
+ DartType type, int charOffset)
: super(new IsExpression(operand, type)..fileOffset = charOffset);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -1541,9 +1848,9 @@
inferrer.inferExpression(factory, judgment, const UnknownType(), false);
inferredType = inferrer.coreTypes.boolClass.rawType;
- inferrer.listener
- .isNotExpression(this, fileOffset, isExpression.type, inferredType);
- return inferredType;
+ inferrer.listener.isNotExpression(this, fileOffset, null, isOperator,
+ notOperator, null, isExpression.type, inferredType);
+ return null;
}
}
@@ -1552,24 +1859,43 @@
implements StatementJudgment {
LabeledStatementJudgment(Statement body) : super(body);
+ Object binder;
+
StatementJudgment get judgment => body;
+ Object createBinder(ShadowTypeInferrer inferrer) {
+ // TODO(paulberry): we need one binder for each label
+ return binder ??=
+ inferrer.listener.binderForStatementLabel(this, fileOffset, null);
+ }
+
@override
void infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
inferrer.inferStatement(factory, judgment);
- inferrer.listener.labeledStatement(this, fileOffset);
+ // TODO(paulberry): support multiple labels.
+ List<Object> labels = <Object>[
+ inferrer.listener.statementLabel(createBinder(inferrer), null, null)
+ ];
+ inferrer.listener.labeledStatement(labels, null);
}
}
-/// Concrete shadow object representing a list literal in kernel form.
-class ShadowListLiteral extends ListLiteral implements ExpressionJudgment {
+/// Type inference derivation for [LiteralList].
+class ListLiteralJudgment extends ListLiteral implements ExpressionJudgment {
+ final Token constKeyword;
+ final Token leftBracket;
+ final Token rightBracket;
+
DartType inferredType;
+ List<Expression> get judgments => expressions;
+
final DartType _declaredTypeArgument;
- ShadowListLiteral(List<Expression> expressions,
+ ListLiteralJudgment(this.constKeyword, this.leftBracket,
+ List<Expression> expressions, this.rightBracket,
{DartType typeArgument, bool isConst: false})
: _declaredTypeArgument = typeArgument,
super(expressions,
@@ -1577,7 +1903,7 @@
isConst: isConst);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -1603,13 +1929,14 @@
inferredTypeArgument = _declaredTypeArgument ?? const DynamicType();
}
if (inferenceNeeded || typeChecksNeeded) {
- for (var expression in expressions) {
- var expressionType = inferrer.inferExpression(factory, expression,
- inferredTypeArgument, inferenceNeeded || typeChecksNeeded);
+ for (int i = 0; i < judgments.length; ++i) {
+ ExpressionJudgment judgment = judgments[i];
+ inferrer.inferExpression(factory, judgment, inferredTypeArgument,
+ inferenceNeeded || typeChecksNeeded);
if (inferenceNeeded) {
formalTypes.add(listType.typeArguments[0]);
}
- actualTypes.add(expressionType);
+ actualTypes.add(judgment.inferredType);
}
}
if (inferenceNeeded) {
@@ -1626,76 +1953,110 @@
typeArgument = inferredTypeArgument;
}
if (typeChecksNeeded) {
- for (int i = 0; i < expressions.length; i++) {
- inferrer.ensureAssignable(typeArgument, actualTypes[i], expressions[i],
- expressions[i].fileOffset);
+ for (int i = 0; i < judgments.length; i++) {
+ inferrer.ensureAssignable(typeArgument, actualTypes[i], judgments[i],
+ judgments[i].fileOffset);
}
}
var inferredType = new InterfaceType(listClass, [inferredTypeArgument]);
- inferrer.listener.listLiteral(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.listener.listLiteral(this, fileOffset, constKeyword, null,
+ leftBracket, expressions, rightBracket, inferredType);
+ this.inferredType = inferredType;
+ return null;
}
}
/// Shadow object for [LogicalExpression].
-class ShadowLogicalExpression extends LogicalExpression
- implements ExpressionJudgment {
+class LogicalJudgment extends LogicalExpression implements ExpressionJudgment {
+ final Token operatorToken;
+
DartType inferredType;
- ShadowLogicalExpression(Expression left, String operator, Expression right)
- : super(left, operator, right);
+ LogicalJudgment(Expression left, this.operatorToken, Expression right)
+ : super(left, operatorToken.stringValue, right);
+
+ ExpressionJudgment get leftJudgment => left;
+
+ ExpressionJudgment get rightJudgment => right;
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
var boolType = inferrer.coreTypes.boolClass.rawType;
- var leftType =
- inferrer.inferExpression(factory, left, boolType, !inferrer.isTopLevel);
- var rightType = inferrer.inferExpression(
- factory, right, boolType, !inferrer.isTopLevel);
- inferrer.ensureAssignable(boolType, leftType, left, left.fileOffset);
- inferrer.ensureAssignable(boolType, rightType, right, right.fileOffset);
- var inferredType = boolType;
- inferrer.listener.logicalExpression(this, fileOffset, inferredType);
- return inferredType;
+ var leftJudgment = this.leftJudgment;
+ var rightJudgment = this.rightJudgment;
+ inferrer.inferExpression(
+ factory, leftJudgment, boolType, !inferrer.isTopLevel);
+ inferrer.inferExpression(
+ factory, rightJudgment, boolType, !inferrer.isTopLevel);
+ inferrer.ensureAssignable(
+ boolType, leftJudgment.inferredType, left, left.fileOffset);
+ inferrer.ensureAssignable(
+ boolType, rightJudgment.inferredType, right, right.fileOffset);
+ inferredType = boolType;
+ inferrer.listener
+ .logicalExpression(this, fileOffset, null, null, null, inferredType);
+ return null;
}
}
-/// Shadow object for synthetic assignments added at the top of a for-in loop.
+/// Type inference derivation for [MapEntry].
///
-/// This covers the case where a for-in loop refers to a variable decleared
-/// elsewhere, so it is desugared into a for-in loop that assigns to the
-/// variable at the top of the loop body.
-class ShadowLoopAssignmentStatement extends ExpressionStatement
- implements StatementJudgment {
- ShadowLoopAssignmentStatement(Expression expression) : super(expression);
+/// This derivation is needed for uniformity.
+class MapEntryJudgment extends MapEntry {
+ DartType inferredKeyType;
+ DartType inferredValueType;
- @override
- void infer<Expression, Statement, Initializer, Type>(
+ ExpressionJudgment get keyJudgment => key;
+
+ ExpressionJudgment get valueJudgment => value;
+
+ MapEntryJudgment(Expression key, Expression value) : super(key, value);
+
+ MapEntry infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
- Factory<Expression, Statement, Initializer, Type> factory) {}
+ Factory<Expression, Statement, Initializer, Type> factory,
+ DartType keyTypeContext,
+ DartType valueTypeContext) {
+ ExpressionJudgment keyJudgment = this.keyJudgment;
+ inferrer.inferExpression(factory, keyJudgment, keyTypeContext, true);
+ inferredKeyType = keyJudgment.inferredType;
+
+ ExpressionJudgment valueJudgment = this.valueJudgment;
+ inferrer.inferExpression(factory, valueJudgment, valueTypeContext, true);
+ inferredValueType = valueJudgment.inferredType;
+
+ return null;
+ }
}
-/// Shadow object for [MapLiteral].
-class ShadowMapLiteral extends MapLiteral implements ExpressionJudgment {
+/// Type inference derivation for [MapLiteral].
+class MapLiteralJudgment extends MapLiteral implements ExpressionJudgment {
+ final Token constKeyword;
+ final Token leftBracket;
+ final Token rightBracket;
+
DartType inferredType;
+ List<MapEntryJudgment> get judgments => entries;
+
final DartType _declaredKeyType;
final DartType _declaredValueType;
- ShadowMapLiteral(List<MapEntry> entries,
+ MapLiteralJudgment(this.constKeyword, this.leftBracket,
+ List<MapEntryJudgment> judgments, this.rightBracket,
{DartType keyType, DartType valueType, bool isConst: false})
: _declaredKeyType = keyType,
_declaredValueType = valueType,
- super(entries,
+ super(judgments,
keyType: keyType ?? const DynamicType(),
valueType: valueType ?? const DynamicType(),
isConst: isConst);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -1724,17 +2085,18 @@
inferredKeyType = _declaredKeyType ?? const DynamicType();
inferredValueType = _declaredValueType ?? const DynamicType();
}
+ List<ExpressionJudgment> cachedKeyJudgments =
+ judgments.map((j) => j.keyJudgment).toList();
+ List<ExpressionJudgment> cachedValueJudgments =
+ judgments.map((j) => j.valueJudgment).toList();
if (inferenceNeeded || typeChecksNeeded) {
- for (var entry in entries) {
- var keyType = inferrer.inferExpression(factory, entry.key,
- inferredKeyType, inferenceNeeded || typeChecksNeeded);
- var valueType = inferrer.inferExpression(factory, entry.value,
- inferredValueType, inferenceNeeded || typeChecksNeeded);
+ for (MapEntryJudgment judgment in judgments) {
+ judgment.infer(inferrer, factory, inferredKeyType, inferredValueType);
if (inferenceNeeded) {
formalTypes.addAll(mapType.typeArguments);
}
- actualTypes.add(keyType);
- actualTypes.add(valueType);
+ actualTypes.add(judgment.inferredKeyType);
+ actualTypes.add(judgment.inferredValueType);
}
}
if (inferenceNeeded) {
@@ -1757,20 +2119,21 @@
valueType = inferredValueType;
}
if (typeChecksNeeded) {
- for (int i = 0; i < entries.length; i++) {
- var entry = entries[i];
- var key = entry.key;
+ for (int i = 0; i < judgments.length; ++i) {
+ ExpressionJudgment keyJudgment = cachedKeyJudgments[i];
inferrer.ensureAssignable(
- keyType, actualTypes[2 * i], key, key.fileOffset);
- var value = entry.value;
- inferrer.ensureAssignable(
- valueType, actualTypes[2 * i + 1], value, value.fileOffset);
+ keyType, actualTypes[2 * i], keyJudgment, keyJudgment.fileOffset);
+
+ ExpressionJudgment valueJudgment = cachedValueJudgments[i];
+ inferrer.ensureAssignable(valueType, actualTypes[2 * i + 1],
+ valueJudgment, valueJudgment.fileOffset);
}
}
- var inferredType =
+ inferredType =
new InterfaceType(mapClass, [inferredKeyType, inferredValueType]);
- inferrer.listener.mapLiteral(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.listener.mapLiteral(this, fileOffset, constKeyword, null,
+ leftBracket, entries, rightBracket, inferredType);
+ return null;
}
}
@@ -1796,7 +2159,7 @@
}
/// Shadow object for [MethodInvocation].
-class ShadowMethodInvocation extends MethodInvocation
+class MethodInvocationJudgment extends MethodInvocation
implements ExpressionJudgment {
DartType inferredType;
@@ -1804,19 +2167,24 @@
/// resulting from the invocation of a function expression.
final bool _isImplicitCall;
- ShadowMethodInvocation(Expression receiver, Name name, Arguments arguments,
+ MethodInvocationJudgment(
+ Expression receiver, Name name, ArgumentsJudgment arguments,
{bool isImplicitCall: false, Member interfaceTarget})
: _isImplicitCall = isImplicitCall,
super(receiver, name, arguments, interfaceTarget);
+ ArgumentsJudgment get argumentJudgments => arguments;
+
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
- return inferrer.inferMethodInvocation(
+ var inferenceResult = inferrer.inferMethodInvocation(
factory, this, receiver, fileOffset, _isImplicitCall, typeContext,
desugaredInvocation: this);
+ inferredType = inferenceResult.type;
+ return null;
}
}
@@ -1829,44 +2197,53 @@
/// kernel expression:
///
/// let f = () { ... } in f
-class ShadowNamedFunctionExpression extends Let implements ExpressionJudgment {
+class NamedFunctionExpressionJudgment extends Let
+ implements ExpressionJudgment {
DartType inferredType;
- ShadowNamedFunctionExpression(VariableDeclaration variable)
+ NamedFunctionExpressionJudgment(VariableDeclarationJudgment variable)
: super(variable, new VariableGet(variable));
+ VariableDeclarationJudgment get variableJudgment => variable;
+
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
- var inferredType = inferrer.inferExpression(
- factory, variable.initializer, typeContext, true);
+ ExpressionJudgment initializer = variableJudgment.initializer;
+ inferrer.inferExpression(factory, initializer, typeContext, true);
+ inferredType = initializer.inferredType;
if (inferrer.strongMode) variable.type = inferredType;
inferrer.listener.namedFunctionExpression(this, fileOffset, inferredType);
- return inferredType;
+ return null;
}
}
/// Shadow object for [Not].
-class ShadowNot extends Not implements ExpressionJudgment {
+class NotJudgment extends Not implements ExpressionJudgment {
+ final Token operator;
+
DartType inferredType;
- ShadowNot(Expression operand) : super(operand);
+ NotJudgment(this.operator, ExpressionJudgment operand) : super(operand);
+
+ ExpressionJudgment get judgment => operand;
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
+ var judgment = this.judgment;
// First infer the receiver so we can look up the method that was invoked.
var boolType = inferrer.coreTypes.boolClass.rawType;
- var actualType = inferrer.inferExpression(
- factory, operand, boolType, !inferrer.isTopLevel);
- inferrer.ensureAssignable(boolType, actualType, operand, fileOffset);
- DartType inferredType = boolType;
- inferrer.listener.not(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.inferExpression(factory, judgment, boolType, !inferrer.isTopLevel);
+ inferrer.ensureAssignable(
+ boolType, judgment.inferredType, operand, fileOffset);
+ inferredType = boolType;
+ inferrer.listener.not(this, fileOffset, operator, null, inferredType);
+ return null;
}
}
@@ -1876,11 +2253,12 @@
/// expression:
///
/// let v = a in v == null ? null : v.b(...)
-class ShadowNullAwareMethodInvocation extends Let
+class NullAwareMethodInvocationJudgment extends Let
implements ExpressionJudgment {
DartType inferredType;
- ShadowNullAwareMethodInvocation(VariableDeclaration variable, Expression body)
+ NullAwareMethodInvocationJudgment(
+ VariableDeclaration variable, Expression body)
: super(variable, body);
@override
@@ -1889,17 +2267,18 @@
MethodInvocation get _desugaredInvocation => body.otherwise;
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
- var inferredType = inferrer.inferMethodInvocation(
+ var inferenceResult = inferrer.inferMethodInvocation(
factory, this, variable.initializer, fileOffset, false, typeContext,
receiverVariable: variable, desugaredInvocation: _desugaredInvocation);
+ inferredType = inferenceResult.type;
if (inferrer.strongMode) {
body.staticType = inferredType;
}
- return inferredType;
+ return null;
}
}
@@ -1924,7 +2303,7 @@
ExpressionJudgment get receiverJudgment => variable.initializer;
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -1934,23 +2313,27 @@
if (inferrer.strongMode) {
body.staticType = inferredType;
}
- return inferredType;
+ return null;
}
}
/// Concrete shadow object representing a null literal in kernel form.
class NullJudgment extends NullLiteral implements ExpressionJudgment {
+ final Token literal;
+
DartType inferredType;
+ NullJudgment(this.literal);
+
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.coreTypes.nullClass.rawType;
inferrer.listener
- .nullLiteral(this, fileOffset, fileOffset == -1, inferredType);
- return inferredType;
+ .nullLiteral(this, fileOffset, literal, fileOffset == -1, inferredType);
+ return null;
}
}
@@ -1986,12 +2369,13 @@
}
/// Concrete shadow object representing an assignment to a property.
-class ShadowPropertyAssign extends ShadowComplexAssignmentWithReceiver {
+class PropertyAssignmentJudgment extends ComplexAssignmentJudgmentWithReceiver {
/// If this assignment uses null-aware access (`?.`), the conditional
/// expression that guards the access; otherwise `null`.
ConditionalExpression nullAwareGuard;
- ShadowPropertyAssign(Expression receiver, Expression rhs,
+ PropertyAssignmentJudgment(
+ ExpressionJudgment receiver, ExpressionJudgment rhs,
{bool isSuper: false})
: super(receiver, rhs, isSuper);
@@ -2016,7 +2400,7 @@
}
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -2040,16 +2424,16 @@
// doing compound assignment?
var writeContext = inferrer.getSetterType(writeMember, receiverType);
var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
- if (inferrer.strongMode) nullAwareGuard?.staticType = inferredResult.type;
+ if (inferrer.strongMode) nullAwareGuard?.staticType = inferredType;
inferrer.listener.propertyAssign(
this,
write.fileOffset,
inferrer.getRealTarget(writeMember),
writeContext,
inferredResult.combiner,
- inferredResult.type);
+ inferredType);
_replaceWithDesugared();
- return inferredResult.type;
+ return null;
}
}
@@ -2067,24 +2451,27 @@
ExpressionJudgment get receiverJudgment => receiver;
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferrer.inferPropertyGet(
factory, this, receiverJudgment, fileOffset, typeContext,
desugaredGet: this);
- return inferredType;
+ return null;
}
}
/// Concrete shadow object representing a redirecting initializer in kernel
/// form.
-class ShadowRedirectingInitializer extends RedirectingInitializer
+class RedirectingInitializerJudgment extends RedirectingInitializer
implements InitializerJudgment {
- ShadowRedirectingInitializer(Constructor target, Arguments arguments)
+ RedirectingInitializerJudgment(
+ Constructor target, ArgumentsJudgment arguments)
: super(target, arguments);
+ ArgumentsJudgment get argumentJudgments => arguments;
+
@override
infer<Expression, Statement, Initializer, Type>(ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
@@ -2096,32 +2483,46 @@
typeArguments[i] = new TypeParameterType(classTypeParameters[i]);
}
ArgumentsJudgment.setNonInferrableArgumentTypes(arguments, typeArguments);
- inferrer.inferInvocation(factory, null, fileOffset,
- target.function.functionType, target.enclosingClass.thisType, arguments,
+ inferrer.inferInvocation(
+ factory,
+ null,
+ fileOffset,
+ target.function.functionType,
+ target.enclosingClass.thisType,
+ argumentJudgments,
skipTypeArgumentInference: true);
ArgumentsJudgment.removeNonInferrableArgumentTypes(arguments);
- inferrer.listener.redirectingInitializer(this, fileOffset, target);
+ inferrer.listener.redirectingInitializer(
+ this, fileOffset, null, null, null, null, target);
}
}
/// Shadow object for [Rethrow].
-class ShadowRethrow extends Rethrow implements ExpressionJudgment {
+class RethrowJudgment extends Rethrow implements ExpressionJudgment {
+ final Token rethrowKeyword;
+
DartType inferredType;
+ RethrowJudgment(this.rethrowKeyword);
+
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
- var inferredType = const BottomType();
- inferrer.listener.rethrow_(this, fileOffset, inferredType);
- return inferredType;
+ inferredType = const BottomType();
+ inferrer.listener.rethrow_(this, fileOffset, rethrowKeyword, inferredType);
+ return null;
}
}
/// Concrete shadow object representing a return statement in kernel form.
class ReturnJudgment extends ReturnStatement implements StatementJudgment {
- ReturnJudgment([Expression expression]) : super(expression);
+ final Token returnKeyword;
+ final Token semicolon;
+
+ ReturnJudgment(this.returnKeyword, this.semicolon, [Expression expression])
+ : super(expression);
ExpressionJudgment get judgment => expression;
@@ -2148,7 +2549,8 @@
closureContext.handleReturn(
inferrer, inferredType, expression, fileOffset);
}
- inferrer.listener.returnStatement(this, fileOffset);
+ inferrer.listener
+ .returnStatement(this, fileOffset, returnKeyword, null, semicolon);
}
}
@@ -2163,8 +2565,8 @@
}
/// Concrete shadow object representing an assignment to a static variable.
-class ShadowStaticAssignment extends ShadowComplexAssignment {
- ShadowStaticAssignment(Expression rhs) : super(rhs);
+class StaticAssignmentJudgment extends ComplexAssignmentJudgment {
+ StaticAssignmentJudgment(ExpressionJudgment rhs) : super(rhs);
@override
DartType _getWriteType(ShadowTypeInferrer inferrer) {
@@ -2173,7 +2575,7 @@
}
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -2196,9 +2598,9 @@
}
var inferredResult = _inferRhs(inferrer, factory, readType, writeContext);
inferrer.listener.staticAssign(this, write?.fileOffset, writeMember,
- writeContext, inferredResult.combiner, inferredResult.type);
+ writeContext, inferredResult.combiner, inferredType);
_replaceWithDesugared();
- return inferredResult.type;
+ return null;
}
}
@@ -2210,7 +2612,7 @@
StaticGetJudgment(Member target) : super(target);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -2225,27 +2627,31 @@
}
inferredType = type;
inferrer.listener.staticGet(this, fileOffset, target, inferredType);
- return inferredType;
+ return null;
}
}
/// Shadow object for [StaticInvocation].
-class ShadowStaticInvocation extends StaticInvocation
+class StaticInvocationJudgment extends StaticInvocation
implements ExpressionJudgment {
DartType inferredType;
- ShadowStaticInvocation(Procedure target, Arguments arguments,
+ StaticInvocationJudgment(Procedure target, ArgumentsJudgment arguments,
{bool isConst: false})
: super(target, arguments, isConst: isConst);
+ ArgumentsJudgment get argumentJudgments => arguments;
+
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
var calleeType = target.function.functionType;
- var inferredType = inferrer.inferInvocation(factory, typeContext,
- fileOffset, calleeType, calleeType.returnType, arguments);
+ var inferenceResult = inferrer.inferInvocation(factory, typeContext,
+ fileOffset, calleeType, calleeType.returnType, argumentJudgments);
+ var inferredType = inferenceResult.type;
+ this.inferredType = inferredType;
inferrer.listener.staticInvocation(
this,
arguments.fileOffset,
@@ -2254,57 +2660,70 @@
inferrer.lastCalleeType,
inferrer.lastInferredSubstitution,
inferredType);
- return inferredType;
+ return null;
}
}
/// Concrete shadow object representing a string concatenation in kernel form.
-class ShadowStringConcatenation extends StringConcatenation
+class StringConcatenationJudgment extends StringConcatenation
implements ExpressionJudgment {
DartType inferredType;
- ShadowStringConcatenation(List<Expression> expressions) : super(expressions);
+ StringConcatenationJudgment(List<Expression> expressions)
+ : super(expressions);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
if (!inferrer.isTopLevel) {
- for (kernel.Expression expression in expressions) {
+ for (var expression in expressions) {
inferrer.inferExpression(
factory, expression, const UnknownType(), false);
}
}
- var inferredType = inferrer.coreTypes.stringClass.rawType;
+ inferredType = inferrer.coreTypes.stringClass.rawType;
inferrer.listener.stringConcatenation(this, fileOffset, inferredType);
- return inferredType;
+ return null;
}
}
-/// Concrete shadow object representing a string literal in kernel form.
-class ShadowStringLiteral extends StringLiteral implements ExpressionJudgment {
+/// Type inference derivation for [StringLiteral].
+class StringLiteralJudgment extends StringLiteral
+ implements ExpressionJudgment {
+ final Token literal;
+
DartType inferredType;
- ShadowStringLiteral(String value) : super(value);
+ StringLiteralJudgment(this.literal, String value) : super(value);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
var inferredType = inferrer.coreTypes.stringClass.rawType;
- inferrer.listener.stringLiteral(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.listener
+ .stringLiteral(this, fileOffset, literal, value, inferredType);
+ this.inferredType = inferredType;
+ return null;
}
}
/// Concrete shadow object representing a super initializer in kernel form.
-class ShadowSuperInitializer extends SuperInitializer
+class SuperInitializerJudgment extends SuperInitializer
implements InitializerJudgment {
- ShadowSuperInitializer(Constructor target, Arguments arguments)
+ final Token superKeyword;
+ final Token period;
+ final Token constructorName;
+
+ SuperInitializerJudgment(this.superKeyword, this.period, this.constructorName,
+ Constructor target, ArgumentsJudgment arguments)
: super(target, arguments);
+ ArgumentsJudgment get argumentJudgments => arguments;
+
@override
void infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
@@ -2319,23 +2738,26 @@
substitution
.substituteType(target.function.functionType.withoutTypeParameters),
inferrer.thisType,
- arguments,
+ argumentJudgments,
skipTypeArgumentInference: true);
- inferrer.listener.superInitializer(this, fileOffset);
+ inferrer.listener.superInitializer(
+ this, fileOffset, superKeyword, period, constructorName, null);
}
}
/// Shadow object for [SuperMethodInvocation].
-class ShadowSuperMethodInvocation extends SuperMethodInvocation
+class SuperMethodInvocationJudgment extends SuperMethodInvocation
implements ExpressionJudgment {
DartType inferredType;
- ShadowSuperMethodInvocation(Name name, Arguments arguments,
+ SuperMethodInvocationJudgment(Name name, ArgumentsJudgment arguments,
[Procedure interfaceTarget])
: super(name, arguments, interfaceTarget);
+ ArgumentsJudgment get argumentJudgments => arguments;
+
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -2343,11 +2765,13 @@
inferrer.instrumentation?.record(inferrer.uri, fileOffset, 'target',
new InstrumentationValueForMember(interfaceTarget));
}
- return inferrer.inferMethodInvocation(
+ var inferenceResult = inferrer.inferMethodInvocation(
factory, this, null, fileOffset, false, typeContext,
interfaceMember: interfaceTarget,
methodName: name,
arguments: arguments);
+ inferredType = inferenceResult.type;
+ return null;
}
}
@@ -2360,7 +2784,7 @@
: super(name, interfaceTarget);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -2370,30 +2794,58 @@
}
inferrer.inferPropertyGet(factory, this, null, fileOffset, typeContext,
interfaceMember: interfaceTarget, propertyName: name);
- return inferredType;
+ return null;
}
}
/// Concrete shadow object representing a switch case.
class SwitchCaseJudgment extends SwitchCase {
- SwitchCaseJudgment(
- List<Expression> expressions, List<int> expressionOffsets, Statement body,
+ final Token keyword;
+ final Token colon;
+
+ Object binder;
+
+ SwitchCaseJudgment(this.keyword, List<Expression> expressions,
+ List<int> expressionOffsets, this.colon, Statement body,
{bool isDefault: false})
: super(expressions, expressionOffsets, body, isDefault: isDefault);
- SwitchCaseJudgment.defaultCase(Statement body) : super.defaultCase(body);
+ SwitchCaseJudgment.defaultCase(this.keyword, this.colon, Statement body)
+ : super.defaultCase(body);
- SwitchCaseJudgment.empty() : super.empty();
+ SwitchCaseJudgment.empty()
+ : keyword = null,
+ colon = null,
+ super.empty();
List<ExpressionJudgment> get expressionJudgments => expressions.cast();
StatementJudgment get bodyJudgment => body;
+
+ Object createBinder(ShadowTypeInferrer inferrer) {
+ // TODO(paulberry): we need one binder for each label
+ return binder ??=
+ inferrer.listener.binderForSwitchLabel(this, fileOffset, null);
+ }
}
/// Concrete shadow object representing a switch statement in kernel form.
class SwitchStatementJudgment extends SwitchStatement
implements StatementJudgment {
- SwitchStatementJudgment(Expression expression, List<SwitchCase> cases)
+ final Token switchKeyword;
+ final Token leftParenthesis;
+ final Token rightParenthesis;
+ final Token leftBracket;
+ final Token rightBracket;
+
+ SwitchStatementJudgment(
+ this.switchKeyword,
+ this.leftParenthesis,
+ Expression expression,
+ this.rightParenthesis,
+ this.leftBracket,
+ List<SwitchCase> cases,
+ this.rightBracket)
: super(expression, cases);
ExpressionJudgment get expressionJudgment => expression;
@@ -2414,25 +2866,38 @@
factory, caseExpression, expressionType, false);
}
inferrer.inferStatement(factory, switchCase.bodyJudgment);
+ // TODO(paulberry): support labels.
+ inferrer.listener.switchCase(switchCase, null, null, null, null, null);
}
- inferrer.listener.switchStatement(this, fileOffset);
+ inferrer.listener.switchStatement(
+ this,
+ fileOffset,
+ switchKeyword,
+ leftParenthesis,
+ expression,
+ rightParenthesis,
+ leftBracket,
+ cases,
+ rightBracket);
}
}
/// Shadow object for [SymbolLiteral].
-class ShadowSymbolLiteral extends SymbolLiteral implements ExpressionJudgment {
+class SymbolLiteralJudgment extends SymbolLiteral
+ implements ExpressionJudgment {
DartType inferredType;
- ShadowSymbolLiteral(String value) : super(value);
+ SymbolLiteralJudgment(String value) : super(value);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
- var inferredType = inferrer.coreTypes.symbolClass.rawType;
- inferrer.listener.symbolLiteral(this, fileOffset, inferredType);
- return inferredType;
+ inferredType = inferrer.coreTypes.symbolClass.rawType;
+ inferrer.listener
+ .symbolLiteral(this, fileOffset, null, null, null, inferredType);
+ return null;
}
}
@@ -2441,10 +2906,10 @@
///
/// These expressions are removed by type inference and replaced with their
/// desugared equivalents.
-class ShadowSyntheticExpression extends Let implements ExpressionJudgment {
+class SyntheticExpressionJudgment extends Let implements ExpressionJudgment {
DartType inferredType;
- ShadowSyntheticExpression(Expression desugared)
+ SyntheticExpressionJudgment(Expression desugared)
: super(new VariableDeclaration('_', initializer: new NullLiteral()),
desugared);
@@ -2457,12 +2922,13 @@
}
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
_replaceWithDesugared();
- return const DynamicType();
+ inferredType = const DynamicType();
+ return null;
}
/// Removes this expression from the expression tree, replacing it with
@@ -2505,42 +2971,64 @@
}
class ThisJudgment extends ThisExpression implements ExpressionJudgment {
+ final Token thisKeyword;
+
DartType inferredType;
+ ThisJudgment(this.thisKeyword);
+
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.thisType ?? const DynamicType();
- inferrer.listener.thisExpression(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.listener
+ .thisExpression(this, fileOffset, thisKeyword, inferredType);
+ return null;
}
}
class ThrowJudgment extends Throw implements ExpressionJudgment {
+ final Token throwKeyword;
+
DartType inferredType;
ExpressionJudgment get judgment => expression;
- ThrowJudgment(Expression expression) : super(expression);
+ ThrowJudgment(this.throwKeyword, Expression expression) : super(expression);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferrer.inferExpression(factory, judgment, const UnknownType(), false);
inferredType = const BottomType();
- inferrer.listener.throw_(this, fileOffset, inferredType);
- return inferredType;
+ inferrer.listener
+ .throw_(this, fileOffset, throwKeyword, null, inferredType);
+ return null;
}
}
/// Concrete shadow object representing a catch clause.
class CatchJudgment extends Catch {
- CatchJudgment(VariableDeclaration exception, Statement body,
- {DartType guard: const DynamicType(), VariableDeclaration stackTrace})
+ final Token onKeyword;
+ final Token catchKeyword;
+ final Token leftParenthesis;
+ final Token comma;
+ final Token rightParenthesis;
+
+ CatchJudgment(
+ this.onKeyword,
+ this.catchKeyword,
+ this.leftParenthesis,
+ VariableDeclaration exception,
+ this.comma,
+ this.rightParenthesis,
+ Statement body,
+ {DartType guard: const DynamicType(),
+ VariableDeclaration stackTrace})
: super(exception, body, guard: guard, stackTrace: stackTrace);
VariableDeclarationJudgment get exceptionJudgment => exception;
@@ -2548,6 +3036,29 @@
VariableDeclarationJudgment get stackTraceJudgment => stackTrace;
StatementJudgment get bodyJudgment => body;
+
+ void infer<Expression, Statement, Initializer, Type>(
+ ShadowTypeInferrer inferrer,
+ Factory<Expression, Statement, Initializer, Type> factory) {
+ inferrer.inferStatement(factory, bodyJudgment);
+ inferrer.listener.catchStatement(
+ this,
+ fileOffset,
+ onKeyword,
+ null,
+ catchKeyword,
+ leftParenthesis,
+ null, // exception
+ comma,
+ null, // stackTrace
+ rightParenthesis,
+ null, // body
+ guard,
+ exceptionJudgment?.createBinder(inferrer),
+ exceptionJudgment?.type,
+ stackTraceJudgment?.createBinder(inferrer),
+ stackTraceJudgment?.type);
+ }
}
/// Concrete shadow object representing a try-catch block in kernel form.
@@ -2564,32 +3075,40 @@
Factory<Expression, Statement, Initializer, Type> factory) {
inferrer.inferStatement(factory, bodyJudgment);
for (var catch_ in catchJudgments) {
- inferrer.inferStatement(factory, catch_.bodyJudgment);
- inferrer.listener.catchStatement(
- catch_,
- catch_.fileOffset,
- catch_.guard,
- catch_.exceptionJudgment?.fileOffset,
- catch_.exceptionJudgment?.type,
- catch_.stackTraceJudgment?.fileOffset,
- catch_.stackTraceJudgment?.type);
+ catch_.infer(inferrer, factory);
}
inferrer.listener.tryCatch(this, fileOffset);
}
}
/// Concrete shadow object representing a try-finally block in kernel form.
-class ShadowTryFinally extends TryFinally implements StatementJudgment {
- ShadowTryFinally(Statement body, Statement finalizer)
+class TryFinallyJudgment extends TryFinally implements StatementJudgment {
+ final Token tryKeyword;
+ final List<Catch> catches;
+ final Token finallyKeyword;
+
+ TryFinallyJudgment(this.tryKeyword, Statement body, this.catches,
+ this.finallyKeyword, Statement finalizer)
: super(body, finalizer);
+ List<CatchJudgment> get catchJudgments => catches?.cast();
+
+ StatementJudgment get finalizerJudgment => finalizer;
+
@override
void infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
inferrer.inferStatement(factory, body);
- inferrer.inferStatement(factory, finalizer);
- inferrer.listener.tryFinally(this, fileOffset);
+ if (catchJudgments != null) {
+ for (var catch_ in catchJudgments) {
+ catch_.infer(inferrer, factory);
+ }
+ body = new TryCatch(body, catches)..parent = this;
+ }
+ inferrer.inferStatement(factory, finalizerJudgment);
+ inferrer.listener.tryFinally(
+ this, fileOffset, tryKeyword, body, catches, finallyKeyword, finalizer);
}
}
@@ -2679,8 +3198,8 @@
// TODO(paulberry): experiment to see if dynamic dispatch would be better,
// so that the type hierarchy will be simpler (which may speed up "is"
// checks).
- return expression.inferredType =
- expression.infer(this, factory, typeContext);
+ expression.infer(this, factory, typeContext);
+ return expression.inferredType;
} else {
// Encountered an expression type for which type inference is not yet
// implemented, so just infer dynamic for now.
@@ -2747,13 +3266,13 @@
TypeLiteralJudgment(DartType type) : super(type);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.coreTypes.typeClass.rawType;
inferrer.listener.typeLiteral(this, fileOffset, type, inferredType);
- return inferredType;
+ return null;
}
}
@@ -2826,8 +3345,8 @@
}
}
-class VariableAssignmentJudgment extends ShadowComplexAssignment {
- VariableAssignmentJudgment(Expression rhs) : super(rhs);
+class VariableAssignmentJudgment extends ComplexAssignmentJudgment {
+ VariableAssignmentJudgment(ExpressionJudgment rhs) : super(rhs);
@override
DartType _getWriteType(ShadowTypeInferrer inferrer) {
@@ -2836,7 +3355,7 @@
}
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -2860,9 +3379,9 @@
writeContext,
write is VariableSet ? write.variable.fileOffset : null,
inferredResult.combiner,
- inferredResult.type);
+ inferredType);
_replaceWithDesugared();
- return inferredType = inferredResult.type;
+ return null;
}
}
@@ -2879,6 +3398,8 @@
final bool _isLocalFunction;
+ Object binder;
+
VariableDeclarationJudgment(String name, this._functionNestingLevel,
{Expression initializer,
DartType type,
@@ -2964,9 +3485,16 @@
}
}
inferrer.listener.variableDeclaration(
- this, fileOffset, type, _implicitlyTyped ? inferredType : type);
+ createBinder(inferrer), type, _implicitlyTyped ? inferredType : type);
}
+ Object createBinder(ShadowTypeInferrer inferrer) =>
+ binder ??= _isLocalFunction
+ ? inferrer.listener
+ .binderForFunctionDeclaration(this, fileOffset, name)
+ : inferrer.listener
+ .binderForVariableDeclaration(this, fileOffset, name);
+
/// Determine whether the given [VariableDeclarationJudgment] had an implicit
/// type.
///
@@ -3000,7 +3528,7 @@
bool _isInCascade() {
TreeNode ancestor = variable.parent;
while (ancestor is Let) {
- if (ancestor is ShadowCascadeExpression) {
+ if (ancestor is CascadeJudgment) {
return true;
}
ancestor = ancestor.parent;
@@ -3009,7 +3537,7 @@
}
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
@@ -3029,15 +3557,21 @@
type = inferrer.instantiateTearOff(type, typeContext, this);
}
inferredType = type;
- inferrer.listener.variableGet(
- this, fileOffset, _isInCascade(), variable.fileOffset, inferredType);
- return inferredType;
+ inferrer.listener.variableGet(this, fileOffset, _isInCascade(),
+ variable.createBinder(inferrer), inferredType);
+ return null;
}
}
/// Concrete shadow object representing a while loop in kernel form.
class WhileJudgment extends WhileStatement implements StatementJudgment {
- WhileJudgment(Expression condition, Statement body) : super(condition, body);
+ final Token whileKeyword;
+ final Token leftParenthesis;
+ final Token rightParenthesis;
+
+ WhileJudgment(this.whileKeyword, this.leftParenthesis, Expression condition,
+ this.rightParenthesis, Statement body)
+ : super(condition, body);
ExpressionJudgment get conditionJudgment => condition;
@@ -3054,14 +3588,20 @@
inferrer.ensureAssignable(expectedType, conditionJudgment.inferredType,
condition, condition.fileOffset);
inferrer.inferStatement(factory, bodyJudgment);
- inferrer.listener.whileStatement(this, fileOffset);
+ inferrer.listener.whileStatement(this, fileOffset, whileKeyword,
+ leftParenthesis, null, rightParenthesis, null);
}
}
/// Concrete shadow object representing a yield statement in kernel form.
class YieldJudgment extends YieldStatement implements StatementJudgment {
- YieldJudgment(Expression expression, {bool isYieldStar: false})
- : super(expression, isYieldStar: isYieldStar);
+ final Token yieldKeyword;
+ final Token star;
+ final Token semicolon;
+
+ YieldJudgment(
+ this.yieldKeyword, this.star, Expression expression, this.semicolon)
+ : super(expression, isYieldStar: star != null);
ExpressionJudgment get judgment => expression;
@@ -3086,7 +3626,8 @@
}
closureContext.handleYield(
inferrer, isYieldStar, judgment.inferredType, expression, fileOffset);
- inferrer.listener.yieldStatement(this, fileOffset);
+ inferrer.listener
+ .yieldStatement(this, fileOffset, yieldKeyword, star, null, semicolon);
}
}
@@ -3097,12 +3638,13 @@
LoadLibraryJudgment(LibraryDependency import) : super(import);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
- return inferredType =
+ inferredType =
inferrer.typeSchemaEnvironment.futureType(const DynamicType());
+ return null;
}
}
@@ -3114,17 +3656,22 @@
CheckLibraryIsLoadedJudgment(LibraryDependency import) : super(import);
@override
- DartType infer<Expression, Statement, Initializer, Type>(
+ Expression infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
- return inferredType = inferrer.typeSchemaEnvironment.objectType;
+ inferredType = inferrer.typeSchemaEnvironment.objectType;
+ return null;
}
}
/// Concrete shadow object representing a named expression.
class NamedExpressionJudgment extends NamedExpression {
- NamedExpressionJudgment(String name, Expression value) : super(name, value);
+ final Token nameToken;
+ final Token colon;
+
+ NamedExpressionJudgment(this.nameToken, this.colon, Expression value)
+ : super(nameToken.lexeme, value);
ExpressionJudgment get judgment => value;
}
@@ -3135,10 +3682,7 @@
/// `null` if the assignment is not compound.
final Procedure combiner;
- /// The inferred type of the assignment expression.
- final DartType type;
-
- _ComplexAssignmentInferenceResult(this.combiner, this.type);
+ _ComplexAssignmentInferenceResult(this.combiner);
}
class _UnfinishedCascade extends Expression {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index c436163..2608d35 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -343,8 +343,19 @@
// method. Similarly considerations apply to separate compilation. It
// could also make sense to add a way to mark .dill files as having
// compile-time errors.
- KernelProcedureBuilder mainBuilder = new KernelProcedureBuilder(null, 0,
- null, "#main", null, null, ProcedureKind.Method, library, -1, -1, -1);
+ KernelProcedureBuilder mainBuilder = new KernelProcedureBuilder(
+ null,
+ 0,
+ null,
+ "#main",
+ null,
+ null,
+ ProcedureKind.Method,
+ library,
+ -1,
+ -1,
+ -1,
+ -1);
library.addBuilder(mainBuilder.name, mainBuilder, -1);
mainBuilder.body = new Block(new List<Statement>.from(errors.map(
(LocatedMessage message) => new ExpressionStatement(new Throw(
diff --git a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
index 571d7f9..8524f51 100644
--- a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
@@ -53,6 +53,7 @@
<DartType>[const DynamicType()])),
fileUri: parent.target.fileUri,
isStatic: true)
+ ..startFileOffset = charOffset
..fileOffset = charOffset;
return tearoff;
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart b/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
index e3aac90..ee0bbb2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
@@ -11,7 +11,11 @@
import 'factory.dart' show Factory;
import 'kernel_shadow_ast.dart'
- show ExpressionJudgment, InitializerJudgment, StatementJudgment;
+ show
+ ExpressionJudgment,
+ InitializerJudgment,
+ StatementJudgment,
+ SwitchCaseJudgment;
/// Implementation of [Factory] for use during top level type inference, when
/// no representation of the code semantics needs to be created (only the type
@@ -64,8 +68,13 @@
bool value, DartType inferredType) {}
@override
- void breakStatement(StatementJudgment judgment, int fileOffset,
- Token breakKeyword, void label, Token semicolon) {}
+ void breakStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token breakKeyword,
+ void label,
+ Token semicolon,
+ covariant void labelBinder) {}
@override
void cascadeExpression(
@@ -85,9 +94,9 @@
Token rightParenthesis,
void body,
DartType guardType,
- int exceptionOffset,
+ covariant void exceptionBinder,
DartType exceptionType,
- int stackTraceOffset,
+ covariant void stackTraceBinder,
DartType stackTraceType) {
return judgment;
}
@@ -108,12 +117,22 @@
Node expressionTarget, DartType inferredType) {}
@override
- void continueStatement(StatementJudgment judgment, int fileOffset,
- Token continueKeyword, void label, Token semicolon) {}
+ void continueStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token continueKeyword,
+ void label,
+ Token semicolon,
+ covariant void labelBinder) {}
@override
- void continueSwitchStatement(StatementJudgment judgment, int fileOffset,
- Token continueKeyword, void label, Token semicolon) {}
+ void continueSwitchStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token continueKeyword,
+ void label,
+ Token semicolon,
+ covariant void labelBinder) {}
@override
void deferredCheck(
@@ -136,6 +155,9 @@
double value, DartType inferredType) {}
@override
+ void emptyStatement(Token semicolon) {}
+
+ @override
void expressionStatement(StatementJudgment judgment, int fileOffset,
void expression, Token semicolon) {}
@@ -154,19 +176,43 @@
void forInStatement(
StatementJudgment judgment,
int fileOffset,
- int variableOffset,
- DartType variableType,
+ Token awaitKeyword,
+ Token forKeyword,
+ Token leftParenthesis,
+ Object loopVariable,
+ Token identifier,
+ Token inKeyword,
+ void iterator,
+ Token rightParenthesis,
+ void body,
+ covariant void loopVariableBinder,
+ DartType loopVariableType,
int writeOffset,
DartType writeVariableType,
int writeVariableDeclarationOffset,
Node writeTarget) {}
@override
- void forStatement(StatementJudgment judgment, int fileOffset) {}
+ void forStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token forKeyword,
+ Token leftParenthesis,
+ void variableDeclarationList,
+ void initialization,
+ Token leftSeparator,
+ void condition,
+ Token rightSeparator,
+ void updaters,
+ Token rightParenthesis,
+ void body) {}
@override
- void functionDeclaration(
- StatementJudgment judgment, int fileOffset, FunctionType inferredType) {}
+ void functionDeclaration(covariant void binder, FunctionType inferredType) {}
+
+ @override
+ void binderForFunctionDeclaration(
+ StatementJudgment judgment, int fileOffset, String name) {}
@override
void functionExpression(
@@ -221,11 +267,25 @@
DartType inferredType) {}
@override
- void labeledStatement(StatementJudgment judgment, int fileOffset) {}
+ void labeledStatement(List<Object> labels, void statement) {}
+
+ @override
+ void statementLabel(covariant void binder, Token label, Token colon) {}
+
+ @override
+ void binderForStatementLabel(
+ StatementJudgment judgment, int fileOffset, String name) {}
@override
void listLiteral(
- ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+ ExpressionJudgment judgment,
+ int fileOffset,
+ Token constKeyword,
+ Object typeArguments,
+ Token leftBracket,
+ void elements,
+ Token rightBracket,
+ DartType inferredType) {}
@override
void logicalExpression(
@@ -238,7 +298,18 @@
@override
void mapLiteral(
- ExpressionJudgment judgment, int fileOffset, DartType typeContext) {}
+ ExpressionJudgment judgment,
+ int fileOffset,
+ Token constKeyword,
+ void typeArguments,
+ Token leftBracket,
+ void entries,
+ Token rightBracket,
+ DartType inferredType) {}
+
+ @override
+ void mapLiteralEntry(
+ Object judgment, int fileOffset, void key, Token separator, void value) {}
@override
void methodInvocation(
@@ -262,8 +333,8 @@
DartType inferredType) {}
@override
- void namedFunctionExpression(
- ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+ void namedFunctionExpression(ExpressionJudgment judgment,
+ covariant void binder, DartType inferredType) {}
@override
void not(ExpressionJudgment judgment, int fileOffset, Token operator,
@@ -359,7 +430,27 @@
Object argumentList) {}
@override
- void switchStatement(StatementJudgment judgment, int fileOffset) {}
+ void switchCase(SwitchCaseJudgment judgment, List<Object> labels,
+ Token keyword, void expression, Token colon, List<void> statements) {}
+
+ @override
+ void switchLabel(covariant void binder, Token label, Token colon) {}
+
+ @override
+ void binderForSwitchLabel(
+ SwitchCaseJudgment judgment, int fileOffset, String name) {}
+
+ @override
+ void switchStatement(
+ StatementJudgment judgment,
+ int fileOffset,
+ Token switchKeyword,
+ Token leftParenthesis,
+ void expression,
+ Token rightParenthesis,
+ Token leftBracket,
+ void members,
+ Token rightBracket) {}
@override
void symbolLiteral(
@@ -382,7 +473,8 @@
void tryCatch(StatementJudgment judgment, int fileOffset) {}
@override
- void tryFinally(StatementJudgment judgment, int fileOffset) {}
+ void tryFinally(StatementJudgment judgment, int fileOffset, Token tryKeyword,
+ void body, void catchClauses, Token finallyKeyword, void finallyBlock) {}
@override
void typeLiteral(ExpressionJudgment judgment, int fileOffset,
@@ -398,20 +490,15 @@
DartType inferredType) {}
@override
- void variableDeclaration(StatementJudgment judgment, int fileOffset,
- DartType statementType, DartType inferredType) {}
+ void variableDeclaration(
+ covariant void binder, DartType statementType, DartType inferredType) {}
+
+ void binderForVariableDeclaration(
+ StatementJudgment judgment, int fileOffset, String name) {}
@override
- void variableGet(
- ExpressionJudgment judgment,
- int fileOffset,
- bool isInCascade,
- int expressionVariableDeclarationOffset,
- DartType inferredType) {}
-
- @override
- void variableSet(
- ExpressionJudgment judgment, int fileOffset, DartType inferredType) {}
+ void variableGet(ExpressionJudgment judgment, int fileOffset,
+ bool isInCascade, covariant void variableBinder, DartType inferredType) {}
@override
void whileStatement(
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 0f1081f..81b72d7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -2,22 +2,42 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE.md file.
-import 'kernel_builder.dart'
- show
- TypeBuilder,
- TypeVariableBuilder,
- KernelFormalParameterBuilder,
- KernelTypeBuilder,
- KernelNamedTypeBuilder,
- KernelTypeVariableBuilder,
- KernelClassBuilder,
- KernelFunctionTypeBuilder,
- NamedTypeBuilder,
- FormalParameterBuilder,
- FunctionTypeBuilder;
+import 'package:kernel/ast.dart' show TypeParameter;
+
+import 'package:kernel/type_algebra.dart' show containsTypeVariable;
import 'package:kernel/util/graph.dart' show Graph, computeStrongComponents;
+import 'kernel_builder.dart'
+ show
+ ClassBuilder,
+ FormalParameterBuilder,
+ FunctionTypeAliasBuilder,
+ FunctionTypeBuilder,
+ KernelClassBuilder,
+ KernelFormalParameterBuilder,
+ KernelFunctionTypeBuilder,
+ KernelNamedTypeBuilder,
+ KernelTypeBuilder,
+ KernelTypeVariableBuilder,
+ NamedTypeBuilder,
+ TypeBuilder,
+ TypeDeclarationBuilder,
+ TypeVariableBuilder;
+
+import '../dill/dill_class_builder.dart' show DillClassBuilder;
+
+import '../dill/dill_typedef_builder.dart' show DillFunctionTypeAliasBuilder;
+
+import '../fasta_codes.dart'
+ show
+ LocatedMessage,
+ templateBoundIssueViaCycleNonSimplicity,
+ templateBoundIssueViaLoopNonSimplicity,
+ templateBoundIssueViaRawTypeWithNonSimpleBounds,
+ templateNonSimpleBoundViaReference,
+ templateNonSimpleBoundViaVariable;
+
KernelTypeBuilder substituteRange(
KernelTypeBuilder type,
Map<TypeVariableBuilder, KernelTypeBuilder> upperSubstitution,
@@ -236,3 +256,440 @@
return edges[index];
}
}
+
+/// Finds all type builders for [variable] in [type].
+///
+/// Returns list of the found type builders.
+List<NamedTypeBuilder<TypeBuilder, Object>> findVariableUsesInType(
+ TypeVariableBuilder<TypeBuilder, Object> variable,
+ TypeBuilder type,
+) {
+ var uses = <NamedTypeBuilder<TypeBuilder, Object>>[];
+ if (type is NamedTypeBuilder) {
+ if (type.declaration == variable) {
+ uses.add(type);
+ } else {
+ if (type.arguments != null) {
+ for (TypeBuilder argument in type.arguments) {
+ uses.addAll(findVariableUsesInType(variable, argument));
+ }
+ }
+ }
+ } else if (type is FunctionTypeBuilder) {
+ uses.addAll(findVariableUsesInType(variable, type.returnType));
+ if (type.typeVariables != null) {
+ for (TypeVariableBuilder<TypeBuilder, Object> dependentVariable
+ in type.typeVariables) {
+ if (dependentVariable.bound != null) {
+ uses.addAll(
+ findVariableUsesInType(variable, dependentVariable.bound));
+ }
+ if (dependentVariable.defaultType != null) {
+ uses.addAll(
+ findVariableUsesInType(variable, dependentVariable.defaultType));
+ }
+ }
+ }
+ if (type.formals != null) {
+ for (FormalParameterBuilder<TypeBuilder> formal in type.formals) {
+ uses.addAll(findVariableUsesInType(variable, formal.type));
+ }
+ }
+ }
+ return uses;
+}
+
+/// Finds those of [variables] that reference other [variables] in their bounds.
+///
+/// Returns flattened list of pairs. The first element in the pair is the type
+/// variable builder from [variables] that references other [variables] in its
+/// bound. The second element in the pair is the list of found references
+/// represented as type builders.
+List<Object> findInboundReferences(
+ List<TypeVariableBuilder<TypeBuilder, Object>> variables) {
+ var variablesAndDependencies = <Object>[];
+ for (TypeVariableBuilder<TypeBuilder, Object> dependent in variables) {
+ var dependencies = <NamedTypeBuilder<TypeBuilder, Object>>[];
+ for (TypeVariableBuilder<TypeBuilder, Object> dependence in variables) {
+ List<NamedTypeBuilder<TypeBuilder, Object>> uses =
+ findVariableUsesInType(dependence, dependent.bound);
+ if (uses.length != 0) {
+ dependencies.addAll(uses);
+ }
+ }
+ if (dependencies.length != 0) {
+ variablesAndDependencies.add(dependent);
+ variablesAndDependencies.add(dependencies);
+ }
+ }
+ return variablesAndDependencies;
+}
+
+/// Finds raw generic types in [type] with inbound references in type variables.
+///
+/// Returns flattened list of pairs. The first element in the pair is the found
+/// raw generic type. The second element in the pair is the list of type
+/// variables of that type with inbound references in the format specified in
+/// [findInboundReferences].
+List<Object> findRawTypesWithInboundReferences(TypeBuilder type) {
+ var typesAndDependencies = <Object>[];
+ if (type is NamedTypeBuilder<TypeBuilder, Object>) {
+ if (type.arguments == null) {
+ TypeDeclarationBuilder<TypeBuilder, Object> declaration =
+ type.declaration;
+ if (declaration is DillClassBuilder) {
+ bool hasInbound = false;
+ List<TypeParameter> typeParameters = declaration.target.typeParameters;
+ for (int i = 0; i < typeParameters.length && !hasInbound; ++i) {
+ if (containsTypeVariable(
+ typeParameters[i].bound, typeParameters.toSet())) {
+ hasInbound = true;
+ }
+ }
+ if (hasInbound) {
+ typesAndDependencies.add(type);
+ typesAndDependencies.add(const <Object>[]);
+ }
+ } else if (declaration is DillFunctionTypeAliasBuilder) {
+ bool hasInbound = false;
+ List<TypeParameter> typeParameters = declaration.target.typeParameters;
+ for (int i = 0; i < typeParameters.length && !hasInbound; ++i) {
+ if (containsTypeVariable(
+ typeParameters[i].bound, typeParameters.toSet())) {
+ hasInbound = true;
+ }
+ }
+ if (hasInbound) {
+ typesAndDependencies.add(type);
+ typesAndDependencies.add(const <Object>[]);
+ }
+ } else if (declaration is ClassBuilder<TypeBuilder, Object> &&
+ declaration.typeVariables != null) {
+ List<Object> dependencies =
+ findInboundReferences(declaration.typeVariables);
+ if (dependencies.length != 0) {
+ typesAndDependencies.add(type);
+ typesAndDependencies.add(dependencies);
+ }
+ } else if (declaration is FunctionTypeAliasBuilder<TypeBuilder, Object> &&
+ declaration.typeVariables != null) {
+ List<Object> dependencies =
+ findInboundReferences(declaration.typeVariables);
+ if (dependencies.length != 0) {
+ typesAndDependencies.add(type);
+ typesAndDependencies.add(dependencies);
+ }
+ }
+ } else {
+ for (TypeBuilder argument in type.arguments) {
+ typesAndDependencies
+ .addAll(findRawTypesWithInboundReferences(argument));
+ }
+ }
+ } else if (type is FunctionTypeBuilder) {
+ typesAndDependencies
+ .addAll(findRawTypesWithInboundReferences(type.returnType));
+ if (type.typeVariables != null) {
+ for (TypeVariableBuilder<TypeBuilder, Object> variable
+ in type.typeVariables) {
+ if (variable.bound != null) {
+ typesAndDependencies
+ .addAll(findRawTypesWithInboundReferences(variable.bound));
+ }
+ if (variable.defaultType != null) {
+ typesAndDependencies
+ .addAll(findRawTypesWithInboundReferences(variable.defaultType));
+ }
+ }
+ }
+ if (type.formals != null) {
+ for (FormalParameterBuilder<TypeBuilder> formal in type.formals) {
+ typesAndDependencies
+ .addAll(findRawTypesWithInboundReferences(formal.type));
+ }
+ }
+ }
+ return typesAndDependencies;
+}
+
+/// Finds issues by raw generic types with inbound references in type variables.
+///
+/// Returns flattened list of triplets. The first element of the triplet is the
+/// [TypeDeclarationBuilder] for the type variable from [variables] that has raw
+/// generic types with inbound references in its bound. The second element of
+/// the triplet is the error message. The third element is the context.
+List<Object> getInboundReferenceIssues(
+ List<TypeVariableBuilder<TypeBuilder, Object>> variables) {
+ var issues = <Object>[];
+ for (TypeVariableBuilder<TypeBuilder, Object> variable in variables) {
+ if (variable.bound != null) {
+ List<Object> rawTypesAndMutualDependencies =
+ findRawTypesWithInboundReferences(variable.bound);
+ for (int i = 0; i < rawTypesAndMutualDependencies.length; i += 2) {
+ NamedTypeBuilder<TypeBuilder, Object> type =
+ rawTypesAndMutualDependencies[i];
+ List<Object> variablesAndDependencies =
+ rawTypesAndMutualDependencies[i + 1];
+ for (int j = 0; j < variablesAndDependencies.length; j += 2) {
+ TypeVariableBuilder<TypeBuilder, Object> dependent =
+ variablesAndDependencies[j];
+ List<NamedTypeBuilder<TypeBuilder, Object>> dependencies =
+ variablesAndDependencies[j + 1];
+ for (NamedTypeBuilder<TypeBuilder, Object> dependency
+ in dependencies) {
+ issues.add(variable);
+ issues.add(templateBoundIssueViaRawTypeWithNonSimpleBounds
+ .withArguments(type.declaration.name));
+ issues.add(<LocatedMessage>[
+ templateNonSimpleBoundViaVariable
+ .withArguments(dependency.declaration.name)
+ .withLocation(dependent.fileUri, dependent.charOffset,
+ dependent.name.length)
+ ]);
+ }
+ }
+ if (variablesAndDependencies.length == 0) {
+ // The inbound references are in a compiled declaration in a .dill.
+ issues.add(variable);
+ issues.add(templateBoundIssueViaRawTypeWithNonSimpleBounds
+ .withArguments(type.declaration.name));
+ issues.add(const <LocatedMessage>[]);
+ }
+ }
+ }
+ }
+ return issues;
+}
+
+/// Finds raw type paths starting from those in [start] and ending with [end].
+///
+/// Returns list of found paths. Each path is represented as a list of
+/// alternating builders of the raw generic types from the path and builders of
+/// type variables of the immediately preceding types that contain the reference
+/// to the next raw generic type in the path. The list ends with the type
+/// builder for [end].
+///
+/// The reason for putting the type variables into the paths as well as for
+/// using type for [start], and not the corresponding type declaration,
+/// is better error reporting.
+List<List<Object>> findRawTypePathsToDeclaration(
+ TypeBuilder start, TypeDeclarationBuilder<TypeBuilder, Object> end,
+ [Set<TypeDeclarationBuilder<TypeBuilder, Object>> visited]) {
+ visited ??= new Set<TypeDeclarationBuilder<TypeBuilder, Object>>.identity();
+ var paths = <List<Object>>[];
+ if (start is NamedTypeBuilder<TypeBuilder, Object>) {
+ TypeDeclarationBuilder<TypeBuilder, Object> declaration = start.declaration;
+ if (start.arguments == null) {
+ if (start.declaration == end) {
+ paths.add(<Object>[start]);
+ } else if (visited.add(start.declaration)) {
+ if (declaration is ClassBuilder<TypeBuilder, Object> &&
+ declaration.typeVariables != null) {
+ for (TypeVariableBuilder<TypeBuilder, Object> variable
+ in declaration.typeVariables) {
+ if (variable.bound != null) {
+ for (List<Object> path in findRawTypePathsToDeclaration(
+ variable.bound, end, visited)) {
+ paths.add(<Object>[start, variable]..addAll(path));
+ }
+ }
+ }
+ } else if (declaration
+ is FunctionTypeAliasBuilder<TypeBuilder, Object> &&
+ declaration.typeVariables != null) {
+ for (TypeVariableBuilder<TypeBuilder, Object> variable
+ in declaration.typeVariables) {
+ if (variable.bound != null) {
+ for (List<Object> dependencyPath in findRawTypePathsToDeclaration(
+ variable.bound, end, visited)) {
+ paths.add(<Object>[start, variable]..addAll(dependencyPath));
+ }
+ }
+ }
+ }
+ visited.remove(start.declaration);
+ }
+ } else {
+ for (TypeBuilder argument in start.arguments) {
+ paths.addAll(findRawTypePathsToDeclaration(argument, end, visited));
+ }
+ }
+ } else if (start is FunctionTypeBuilder) {
+ paths.addAll(findRawTypePathsToDeclaration(start.returnType, end, visited));
+ if (start.typeVariables != null) {
+ for (TypeVariableBuilder<TypeBuilder, Object> variable
+ in start.typeVariables) {
+ if (variable.bound != null) {
+ paths.addAll(
+ findRawTypePathsToDeclaration(variable.bound, end, visited));
+ }
+ if (variable.defaultType != null) {
+ paths.addAll(findRawTypePathsToDeclaration(
+ variable.defaultType, end, visited));
+ }
+ }
+ }
+ if (start.formals != null) {
+ for (FormalParameterBuilder<TypeBuilder> formal in start.formals) {
+ paths.addAll(findRawTypePathsToDeclaration(formal.type, end, visited));
+ }
+ }
+ }
+ return paths;
+}
+
+/// Finds raw generic type cycles ending and starting with [declaration].
+///
+/// Returns list of found cycles. Each cycle is represented as a list of
+/// alternating raw generic types from the cycle and type variables of the
+/// immediately preceding type that reference the next type in the cycle. The
+/// cycle starts with a type variable from [declaration] and ends with a type
+/// that has [declaration] as its declaration.
+///
+/// The reason for putting the type variables into the cycles is better error
+/// reporting.
+List<List<Object>> findRawTypeCycles(
+ TypeDeclarationBuilder<TypeBuilder, Object> declaration) {
+ var cycles = <List<Object>>[];
+ if (declaration is ClassBuilder<TypeBuilder, Object> &&
+ declaration.typeVariables != null) {
+ for (TypeVariableBuilder<TypeBuilder, Object> variable
+ in declaration.typeVariables) {
+ if (variable.bound != null) {
+ for (List<Object> path
+ in findRawTypePathsToDeclaration(variable.bound, declaration)) {
+ cycles.add(<Object>[variable]..addAll(path));
+ }
+ }
+ }
+ } else if (declaration is FunctionTypeAliasBuilder<TypeBuilder, Object> &&
+ declaration.typeVariables != null) {
+ for (TypeVariableBuilder<TypeBuilder, Object> variable
+ in declaration.typeVariables) {
+ if (variable.bound != null) {
+ for (List<Object> dependencyPath
+ in findRawTypePathsToDeclaration(variable.bound, declaration)) {
+ cycles.add(<Object>[variable]..addAll(dependencyPath));
+ }
+ }
+ }
+ }
+ return cycles;
+}
+
+/// Converts raw generic type [cycles] for [declaration] into reportable issues.
+///
+/// The [cycles] are expected to be in the format specified for the return value
+/// of [findRawTypeCycles].
+///
+/// Returns flattened list of triplets. The first element of the triplet is the
+/// [TypeDeclarationBuilder] for the type variable from [variables] that has raw
+/// generic types with inbound references in its bound. The second element of
+/// the triplet is the error message. The third element is the context.
+List<Object> convertRawTypeCyclesIntoIssues(
+ TypeDeclarationBuilder<TypeBuilder, Object> declaration,
+ List<List<Object>> cycles) {
+ List<Object> issues = <Object>[];
+ for (List<Object> cycle in cycles) {
+ if (cycle.length == 2) {
+ // Loop.
+ TypeVariableBuilder<TypeBuilder, Object> variable = cycle[0];
+ NamedTypeBuilder<TypeBuilder, Object> type = cycle[1];
+ issues.add(variable);
+ issues.add(templateBoundIssueViaLoopNonSimplicity
+ .withArguments(type.declaration.name));
+ issues.add(null); // Context.
+ } else {
+ var context = <LocatedMessage>[];
+ for (int i = 0; i < cycle.length; i += 2) {
+ TypeVariableBuilder<TypeBuilder, Object> variable = cycle[i];
+ NamedTypeBuilder<TypeBuilder, Object> type = cycle[i + 1];
+ context.add(templateNonSimpleBoundViaReference
+ .withArguments(type.declaration.name)
+ .withLocation(
+ variable.fileUri, variable.charOffset, variable.name.length));
+ }
+ NamedTypeBuilder<TypeBuilder, Object> firstEncounteredType = cycle[1];
+
+ issues.add(declaration);
+ issues.add(templateBoundIssueViaCycleNonSimplicity.withArguments(
+ declaration.name, firstEncounteredType.declaration.name));
+ issues.add(context);
+ }
+ }
+ return issues;
+}
+
+/// Finds issues by cycles of raw generic types containing [declaration].
+///
+/// Returns flattened list of triplets according to the format specified by
+/// [convertRawTypeCyclesIntoIssues].
+List<Object> getRawTypeCycleIssues(
+ TypeDeclarationBuilder<TypeBuilder, Object> declaration) {
+ return convertRawTypeCyclesIntoIssues(
+ declaration, findRawTypeCycles(declaration));
+}
+
+/// Finds non-simplicity issues for the given set of [variables].
+///
+/// The issues are those caused by raw types with inbound references in the
+/// bounds of their type variables.
+///
+/// Returns flattened list of triplets, each triplet representing an issue. The
+/// first element in the triplet is the type declaration that has the issue.
+/// The second element in the triplet is the error message. The third element
+/// in the triplet is the context.
+List<Object> getNonSimplicityIssuesForTypeVariables(
+ List<TypeVariableBuilder<TypeBuilder, Object>> variables) {
+ if (variables == null) return <Object>[];
+ return getInboundReferenceIssues(variables);
+}
+
+/// Finds non-simplicity issues for the given [declaration].
+///
+/// The issues are those caused by raw types with inbound references in the
+/// bounds of type variables from [declaration] and by cycles of raw types
+/// containing [declaration].
+///
+/// Returns flattened list of triplets, each triplet representing an issue. The
+/// first element in the triplet is the type declaration that has the issue.
+/// The second element in the triplet is the error message. The third element
+/// in the triplet is the context.
+List<Object> getNonSimplicityIssuesForDeclaration(
+ TypeDeclarationBuilder<TypeBuilder, Object> declaration) {
+ var issues = <Object>[];
+ if (declaration is ClassBuilder<TypeBuilder, Object> &&
+ declaration.typeVariables != null) {
+ issues.addAll(getInboundReferenceIssues(declaration.typeVariables));
+ } else if (declaration is FunctionTypeAliasBuilder<TypeBuilder, Object> &&
+ declaration.typeVariables != null) {
+ issues.addAll(getInboundReferenceIssues(declaration.typeVariables));
+ }
+ List<List<Object>> cyclesToReport = <List<Object>>[];
+ for (List<Object> cycle in findRawTypeCycles(declaration)) {
+ // To avoid reporting the same error for each element of the cycle, we only
+ // do so if it comes the first in the lexicographical order. Note that
+ // one-element cycles shouldn't be checked, as they are loops.
+ if (cycle.length == 2) {
+ cyclesToReport.add(cycle);
+ } else {
+ String declarationPathAndName =
+ "${declaration.fileUri}:${declaration.name}";
+ String lexMinPathAndName = null;
+ for (int i = 1; i < cycle.length; i += 2) {
+ NamedTypeBuilder<TypeBuilder, Object> type = cycle[i];
+ String pathAndName =
+ "${type.declaration.fileUri}:${type.declaration.name}";
+ if (lexMinPathAndName == null ||
+ lexMinPathAndName.compareTo(pathAndName) > 0) {
+ lexMinPathAndName = pathAndName;
+ }
+ }
+ if (declarationPathAndName == lexMinPathAndName) {
+ cyclesToReport.add(cycle);
+ }
+ }
+ }
+ issues.addAll(convertRawTypeCyclesIntoIssues(declaration, cyclesToReport));
+ return issues;
+}
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index 0abc7d3..a9d32fe 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -392,8 +392,8 @@
}
@override
- void beginTypeVariable(Token name) {
- listener?.beginTypeVariable(name);
+ void beginTypeVariable(Token token) {
+ listener?.beginTypeVariable(token);
}
@override
@@ -842,13 +842,13 @@
}
@override
- void endTypeVariable(Token token, Token extendsOrSuper) {
- listener?.endTypeVariable(token, extendsOrSuper);
+ void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+ listener?.endTypeVariable(token, index, extendsOrSuper);
}
@override
- void endTypeVariables(int count, Token beginToken, Token endToken) {
- listener?.endTypeVariables(count, beginToken, endToken);
+ void endTypeVariables(Token beginToken, Token endToken) {
+ listener?.endTypeVariables(beginToken, endToken);
}
@override
@@ -1285,6 +1285,11 @@
}
@override
+ void handleTypeVariablesDefined(Token token, int count) {
+ listener?.handleTypeVariablesDefined(token, count);
+ }
+
+ @override
void handleUnaryPostfixAssignmentExpression(Token token) {
listener?.handleUnaryPostfixAssignmentExpression(token);
}
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
index 601835b..43c121c 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import '../../scanner/token.dart' show Token;
+import '../../scanner/token.dart' show Token, TokenType;
import '../fasta_codes.dart' show Message, Template, templateExpectedIdentifier;
@@ -12,6 +12,8 @@
import 'parser.dart' show Parser;
+import 'util.dart' show isOneOfOrEof, optional;
+
/// Information about the parser state that is passed to the listener at the
/// time an identifier is encountered. It is also used by the parser for error
/// recovery when a recovery template is defined.
@@ -269,5 +271,45 @@
}
}
+/// Return `true` if the given [token] should be treated like the start of
+/// an expression for the purposes of recovery.
+bool looksLikeExpressionStart(Token next) =>
+ next.isIdentifier ||
+ next.isKeyword && !looksLikeStatementStart(next) ||
+ next.type == TokenType.DOUBLE ||
+ next.type == TokenType.HASH ||
+ next.type == TokenType.HEXADECIMAL ||
+ next.type == TokenType.IDENTIFIER ||
+ next.type == TokenType.INT ||
+ next.type == TokenType.STRING ||
+ optional('{', next) ||
+ optional('(', next) ||
+ optional('[', next) ||
+ optional('[]', next) ||
+ optional('<', next) ||
+ optional('!', next) ||
+ optional('-', next) ||
+ optional('~', next) ||
+ optional('++', next) ||
+ optional('--', next);
+
+/// Return `true` if the given [token] should be treated like the start of
+/// a new statement for the purposes of recovery.
+bool looksLikeStatementStart(Token token) => isOneOfOrEof(token, const [
+ 'assert',
+ 'break',
+ 'continue',
+ 'do',
+ 'final',
+ 'for',
+ 'if',
+ 'return',
+ 'switch',
+ 'try',
+ 'var',
+ 'void',
+ 'while'
+ ]);
+
// TODO(ahe): Remove when analyzer supports generalized function syntax.
typedef _MessageWithArgument<T> = Message Function(T);
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
index e8cab59..c79c8a4 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
@@ -31,7 +31,7 @@
// Recovery
parser.reportRecoverableError(identifier, fasta.messageCatchSyntax);
- if (looksLikeStartOfNextStatement(identifier) ||
+ if (looksLikeStatementStart(identifier) ||
isOneOfOrEof(identifier, const [',', ')'])) {
return parser.rewriter.insertSyntheticIdentifier(token);
} else if (!identifier.isKeywordOrIdentifier) {
@@ -291,16 +291,18 @@
// Recovery
parser.reportRecoverableErrorWithToken(
identifier, fasta.templateExpectedIdentifier);
- if (identifier.isKeywordOrIdentifier) {
- if (!isOneOfOrEof(identifier, const ['as', 'is'])) {
- return identifier;
+ if (!looksLikeStatementStart(identifier)) {
+ if (identifier.isKeywordOrIdentifier) {
+ if (!isOneOfOrEof(identifier, const ['as', 'is'])) {
+ return identifier;
+ }
+ } else if (!identifier.isOperator &&
+ !isOneOfOrEof(identifier,
+ const ['.', ',', '(', ')', '[', ']', '}', '?', ':', ';'])) {
+ // When in doubt, consume the token to ensure we make progress
+ token = identifier;
+ identifier = token.next;
}
- } else if (!identifier.isOperator &&
- !isOneOfOrEof(identifier,
- const ['.', ',', '(', ')', '[', ']', '}', '?', ':', ';'])) {
- // When in doubt, consume the token to ensure we make progress
- token = identifier;
- identifier = token.next;
}
// Insert a synthetic identifier to satisfy listeners.
return parser.rewriter.insertSyntheticIdentifier(token);
@@ -377,7 +379,7 @@
// Recovery
const followingValues = const [':', '=', ',', '(', ')', '[', ']', '{', '}'];
if (looksLikeStartOfNextClassMember(identifier) ||
- looksLikeStartOfNextStatement(identifier) ||
+ looksLikeStatementStart(identifier) ||
isOneOfOrEof(identifier, followingValues)) {
identifier = parser.insertSyntheticIdentifier(token, this,
message: fasta.templateExpectedIdentifier.withArguments(identifier));
@@ -474,7 +476,7 @@
// Recovery
if (isOneOfOrEof(identifier, const ['.', '(', '{', '=>']) ||
- looksLikeStartOfNextStatement(identifier)) {
+ looksLikeStatementStart(identifier)) {
identifier = parser.insertSyntheticIdentifier(token, this,
message: fasta.templateExpectedIdentifier.withArguments(identifier));
} else {
@@ -506,7 +508,7 @@
// Recovery
if (isOneOfOrEof(identifier, const [':']) ||
- looksLikeStartOfNextStatement(identifier)) {
+ looksLikeStatementStart(identifier)) {
identifier = parser.insertSyntheticIdentifier(token, this,
message: fasta.templateExpectedIdentifier.withArguments(identifier));
} else {
@@ -622,7 +624,7 @@
// Recovery
if (isOneOfOrEof(identifier, const [';', '=', ',', '{', '}']) ||
- looksLikeStartOfNextStatement(identifier)) {
+ looksLikeStatementStart(identifier)) {
identifier = parser.insertSyntheticIdentifier(token, this,
message: fasta.templateExpectedIdentifier.withArguments(identifier));
} else {
@@ -664,7 +666,7 @@
if (isOneOfOrEof(identifier, const ['{', '}', '(', ')', ']']) ||
looksLikeStartOfNextTopLevelDeclaration(identifier) ||
looksLikeStartOfNextClassMember(identifier) ||
- looksLikeStartOfNextStatement(identifier)) {
+ looksLikeStatementStart(identifier)) {
identifier = parser.insertSyntheticIdentifier(token, this,
message: fasta.templateExpectedIdentifier.withArguments(identifier));
} else {
@@ -908,7 +910,7 @@
const followingValues = const ['<', '>', ';', '}', 'extends', 'super'];
if (looksLikeStartOfNextTopLevelDeclaration(identifier) ||
looksLikeStartOfNextClassMember(identifier) ||
- looksLikeStartOfNextStatement(identifier) ||
+ looksLikeStatementStart(identifier) ||
isOneOfOrEof(identifier, followingValues)) {
parser.reportRecoverableErrorWithToken(
identifier, fasta.templateExpectedIdentifier);
@@ -944,23 +946,6 @@
bool looksLikeStartOfNextClassMember(Token token) =>
token.isModifier || isOneOfOrEof(token, const ['get', 'set', 'void']);
-bool looksLikeStartOfNextStatement(Token token) => isOneOfOrEof(token, const [
- 'assert',
- 'break',
- 'const',
- 'continue',
- 'do',
- 'final',
- 'for',
- 'if',
- 'return',
- 'switch',
- 'try',
- 'var',
- 'void',
- 'while'
- ]);
-
bool looksLikeStartOfNextTopLevelDeclaration(Token token) =>
token.isTopLevelKeyword ||
isOneOfOrEof(token, const ['const', 'get', 'final', 'set', 'var', 'void']);
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index b75076e..40995c9 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -904,20 +904,28 @@
/// Substructures:
/// - Metadata
/// - Name (identifier)
- void beginTypeVariable(Token name) {}
+ void beginTypeVariable(Token token) {}
- /// Handle the end of a type formal parameter (e.g. "X extends Y").
+ /// Called when [beginTypeVariable] has been called for all of the variables
+ /// in a group, and before [endTypeVariable] has been called for any of the
+ /// variables in that same group.
+ void handleTypeVariablesDefined(Token token, int count) {}
+
+ /// Handle the end of a type formal parameter (e.g. "X extends Y")
+ /// where [index] is the index of the type variable in the list of
+ /// type variables being declared.
+ ///
/// Substructures:
/// - Type bound
///
/// See [beginTypeVariable] for additional substructures.
- void endTypeVariable(Token token, Token extendsOrSuper) {
+ void endTypeVariable(Token token, int index, Token extendsOrSuper) {
logEvent("TypeVariable");
}
void beginTypeVariables(Token token) {}
- void endTypeVariables(int count, Token beginToken, Token endToken) {
+ void endTypeVariables(Token beginToken, Token endToken) {
logEvent("TypeVariables");
}
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index 4921416..6178e4b 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -49,8 +49,6 @@
STRING_INTERPOLATION_TOKEN,
STRING_TOKEN;
-import '../util/link.dart' show Link;
-
import 'assert.dart' show Assert;
import 'async_modifier.dart' show AsyncModifier;
@@ -65,7 +63,8 @@
import 'forwarding_listener.dart' show ForwardingListener;
-import 'identifier_context.dart' show IdentifierContext;
+import 'identifier_context.dart'
+ show IdentifierContext, looksLikeExpressionStart;
import 'listener.dart' show Listener;
@@ -80,8 +79,6 @@
import 'token_stream_rewriter.dart' show TokenStreamRewriter;
-import 'type_continuation.dart' show TypeContinuation;
-
import 'type_info.dart'
show
TypeInfo,
@@ -89,7 +86,6 @@
computeMethodTypeArguments,
computeType,
computeTypeParamOrArg,
- isGeneralizedFunctionType,
isValidTypeReference,
noType,
noTypeParamOrArg;
@@ -1908,27 +1904,6 @@
return identifier;
}
- /// Return `true` if the given [token] should be treated like the start of
- /// an expression for the purposes of recovery.
- bool isExpressionStartForRecovery(Token next) =>
- next.isKeywordOrIdentifier ||
- next.type == TokenType.DOUBLE ||
- next.type == TokenType.HASH ||
- next.type == TokenType.HEXADECIMAL ||
- next.type == TokenType.IDENTIFIER ||
- next.type == TokenType.INT ||
- next.type == TokenType.STRING ||
- optional('{', next) ||
- optional('(', next) ||
- optional('[', next) ||
- optional('[]', next) ||
- optional('<', next) ||
- optional('!', next) ||
- optional('-', next) ||
- optional('~', next) ||
- optional('++', next) ||
- optional('--', next);
-
Token expect(String string, Token token) {
// TODO(danrubel): update all uses of expect(';'...) to ensureSemicolon
// then add assert(!identical(';', string));
@@ -1940,295 +1915,13 @@
return token.next;
}
- /// ```
- /// typeVariable:
- /// metadata? identifier (('extends' | 'super') typeName)?
- /// ;
- /// ```
- Token parseTypeVariable(Token token) {
- token = parseMetadataStar(token);
- token = ensureIdentifier(token, IdentifierContext.typeVariableDeclaration);
- listener.beginTypeVariable(token);
- Token extendsOrSuper = null;
- Token next = token.next;
- if (optional('extends', next) || optional('super', next)) {
- extendsOrSuper = next;
- token = parseType(next);
- } else {
- listener.handleNoType(token);
- }
- listener.endTypeVariable(token.next, extendsOrSuper);
- return token;
- }
-
bool notEofOrValue(String value, Token token) {
return !identical(token.kind, EOF_TOKEN) &&
!identical(value, token.stringValue);
}
- /// Parse a type, if it is appropriate to do so.
- ///
- /// If this method can parse a type, it will return the next (non-null) token
- /// after the type. Otherwise, it returns null.
- Token parseType(Token token,
- [TypeContinuation continuation = TypeContinuation.Required,
- IdentifierContext continuationContext,
- MemberKind memberKind,
- Token varFinalOrConst]) {
- /// True if we've seen the `var` keyword.
- bool hasVar = false;
-
- /// The token before [token].
- Token beforeToken;
-
- /// The token before the `begin` token.
- Token beforeBegin;
-
- /// Where the type begins.
- Token begin;
-
- /// Non-null if 'void' is the first token.
- Token voidToken;
-
- /// True if the tokens at [begin] looks like a type.
- bool looksLikeType = false;
-
- /// True if a type that could be a return type for a generalized function
- /// type was seen during analysis.
- bool hasReturnType = false;
-
- /// The identifier context to use for parsing the type.
- IdentifierContext context = IdentifierContext.typeReference;
-
- /// Non-null if type arguments were seen during analysis.
- Token typeArguments;
-
- /// The number of function types seen during analysis.
- int functionTypes = 0;
-
- /// The tokens before the start of type variables of function types seen
- /// during analysis. Notice that the tokens in this list might precede
- /// either `'<'` or `'('` as not all function types have type parameters.
- /// Also, it is safe to assume that token.endGroup will return
- /// non-null for all of the tokens following these tokens.
- Link<Token> typeVariableStarters = const Link<Token>();
-
- {
- // Analyse the next tokens to see if they could be a type.
-
- beforeToken = beforeBegin = token;
- token = begin = token.next;
-
- if (optional("void", token)) {
- // `void` is a type.
- looksLikeType = true;
- beforeToken = voidToken = token;
- token = token.next;
- } else if (isValidTypeReference(token) &&
- !isGeneralizedFunctionType(token)) {
- // We're looking at an identifier that could be a type (or `dynamic`).
- looksLikeType = true;
- beforeToken = token;
- token = token.next;
- if (optional(".", token) && isValidTypeReference(token.next)) {
- // We're looking at `prefix '.' identifier`.
- context = IdentifierContext.prefixedTypeReference;
- beforeToken = token.next;
- token = beforeToken.next;
- }
- if (optional("<", token)) {
- Token close = token.endGroup;
- if (close != null &&
- (optional(">", close) || optional(">>", close))) {
- // We found some type arguments.
- typeArguments = token;
- beforeToken = close;
- token = close.next;
- }
- }
- } else if (token.isModifier && isValidTypeReference(token.next)) {
- // Recovery - report error and skip modifier
- reportRecoverableErrorWithToken(token, fasta.templateExpectedType);
- return parseType(token, continuation, continuationContext, memberKind);
- }
-
- // If what we have seen so far looks like a type, that could be a return
- // type for a generalized function type.
- hasReturnType = looksLikeType;
-
- while (optional("Function", token)) {
- Token typeVariableStart = token;
- if (optional("<", token.next)) {
- Token close = token.next.endGroup;
- if (close != null && optional(">", close)) {
- beforeToken = previousToken(token, close);
- token = close;
- } else {
- break; // Not a function type.
- }
- }
- if (optional("(", token.next)) {
- // This is a function type.
- Token close = token.next.endGroup;
- assert(optional(")", close));
- looksLikeType = true;
- functionTypes++;
- typeVariableStarters =
- typeVariableStarters.prepend(typeVariableStart);
- beforeToken = close;
- token = close.next;
- } else {
- break; // Not a function type.
- }
- }
- }
-
- /// Call this function when it's known that [begin] is a type. This
- /// function will call the appropriate event methods on [listener] to
- /// handle the type.
- Token commitType() {
- int count = 0;
- for (Token typeVariableStart in typeVariableStarters) {
- count++;
- parseTypeVariablesOpt(typeVariableStart);
- listener.beginFunctionType(begin);
- }
- assert(count == functionTypes);
-
- if (functionTypes > 0 && !hasReturnType) {
- // A function type without return type.
- // Push the non-existing return type first. The loop below will
- // generate the full type.
- listener.handleNoType(beforeBegin);
- token = beforeBegin;
- } else if (voidToken != null) {
- listener.handleVoidKeyword(voidToken);
- token = voidToken;
- } else {
- token = ensureIdentifier(beforeBegin, context);
- token = parseQualifiedRestOpt(
- token, IdentifierContext.typeReferenceContinuation);
- assert(typeArguments == null || typeArguments == token.next);
- token = parseTypeArgumentsOpt(token);
- listener.handleType(begin, token.next);
- }
-
- for (int i = 0; i < functionTypes; i++) {
- Token next = token.next;
- assert(optional('Function', next));
- Token functionToken = next;
- if (optional("<", next.next)) {
- // Skip type parameters, they were parsed above.
- next = next.next.endGroup;
- }
- token = parseFormalParametersRequiredOpt(
- next, MemberKind.GeneralizedFunctionType);
- listener.endFunctionType(functionToken, token.next);
- }
-
- if (hasVar) {
- reportRecoverableError(begin, fasta.messageTypeAfterVar);
- }
-
- return token;
- }
-
- switch (continuation) {
- case TypeContinuation.Required:
- // If the token after the type is not an identifier,
- // the report a missing type
- if (!token.isIdentifier) {
- if (memberKind == MemberKind.TopLevelField ||
- memberKind == MemberKind.NonStaticField ||
- memberKind == MemberKind.StaticField ||
- memberKind == MemberKind.Local) {
- reportRecoverableError(
- begin, fasta.messageMissingConstFinalVarOrType);
- listener.handleNoType(beforeBegin);
- return beforeBegin;
- }
- }
- return commitType();
-
- optional:
- case TypeContinuation.Optional:
- if (looksLikeType) {
- if (functionTypes > 0) {
- return commitType(); // Parse function type.
- }
- if (voidToken != null) {
- listener.handleVoidKeyword(voidToken);
- return voidToken;
- }
- if (token.isIdentifier || optional('this', token)) {
- return commitType(); // Parse type.
- }
- }
- listener.handleNoType(beforeBegin);
- return beforeBegin;
-
- case TypeContinuation.OptionalAfterVar:
- hasVar = true;
- continue optional;
- }
-
- throw "Internal error: Unhandled continuation '$continuation'.";
- }
-
- Token parseTypeArgumentsOpt(Token token) {
- Token next = token.next;
- if (optional('<', next)) {
- BeginToken begin = next;
- rewriteLtEndGroupOpt(begin);
- listener.beginTypeArguments(begin);
- int count = 0;
- do {
- token = parseType(next);
- next = token.next;
- ++count;
- } while (optional(',', next));
- if (next == begin.endToken) {
- token = next;
- } else if (begin.endToken != null) {
- reportRecoverableError(
- next, fasta.templateExpectedToken.withArguments('>'));
- token = begin.endToken;
- } else {
- token = begin.endToken = ensureGt(token);
- }
- listener.endTypeArguments(count, begin, token);
- } else {
- listener.handleNoTypeArguments(next);
- }
- return token;
- }
-
Token parseTypeVariablesOpt(Token token) {
- Token next = token.next;
- if (optional('<', next)) {
- BeginToken begin = next;
- rewriteLtEndGroupOpt(begin);
- listener.beginTypeVariables(begin);
- int count = 0;
- do {
- token = parseTypeVariable(next);
- next = token.next;
- ++count;
- } while (optional(',', next));
- if (next == begin.endToken) {
- token = next;
- } else if (begin.endToken != null) {
- reportRecoverableError(
- next, fasta.templateExpectedToken.withArguments('>'));
- token = begin.endToken;
- } else {
- token = begin.endToken = ensureGt(token);
- }
- listener.endTypeVariables(count, begin, token);
- } else {
- listener.handleNoTypeVariables(next);
- }
- return token;
+ return computeTypeParamOrArg(token, true).parseVariables(token, this);
}
/// Parse a top level field or function.
@@ -4297,7 +3990,7 @@
}
// Recovery
- if (!isExpressionStartForRecovery(next)) {
+ if (!looksLikeExpressionStart(next)) {
if (beginToken.endGroup.isSynthetic) {
// The scanner has already reported an error,
// but inserted `]` in the wrong place.
@@ -4357,7 +4050,7 @@
break;
}
// Recovery
- if (isExpressionStartForRecovery(next)) {
+ if (looksLikeExpressionStart(next)) {
// If this looks like the start of an expression,
// then report an error, insert the comma, and continue parsing.
next = rewriteAndRecover(
@@ -4774,7 +4467,7 @@
break;
}
// Recovery
- if (isExpressionStartForRecovery(next)) {
+ if (looksLikeExpressionStart(next)) {
// If this looks like the start of an expression,
// then report an error, insert the comma, and continue parsing.
next = rewriteAndRecover(
@@ -5761,31 +5454,35 @@
Token commaToken = null;
bool old = mayParseFunctionExpressions;
mayParseFunctionExpressions = true;
- token = parseExpression(token).next;
- if (optional(',', token)) {
- if (optional(')', token.next)) {
- token = token.next;
- } else {
+
+ token = parseExpression(token);
+ if (optional(',', token.next)) {
+ token = token.next;
+ if (!optional(')', token.next)) {
commaToken = token;
- token = parseExpression(token).next;
- }
- }
- if (optional(',', token)) {
- Token firstExtra = token.next;
- if (optional(')', firstExtra)) {
- token = firstExtra;
- } else {
- while (optional(',', token)) {
- Token begin = token.next;
- token = parseExpression(token).next;
- // TODO(danrubel): Consider removing the message argument.
- listener.handleExtraneousExpression(
- begin, fasta.messageAssertExtraneousArgument);
+ token = parseExpression(token);
+ if (optional(',', token.next)) {
+ // Trailing comma is ignored.
+ token = token.next;
}
- reportRecoverableError(
- firstExtra, fasta.messageAssertExtraneousArgument);
}
}
+
+ Token endGroup = leftParenthesis.endGroup;
+ if (token.next == endGroup) {
+ token = endGroup;
+ } else {
+ // Recovery
+ if (endGroup.isSynthetic) {
+ // The scanner did not place the synthetic ')' correctly, so move it.
+ token = rewriter.moveSynthetic(token, endGroup);
+ } else {
+ reportRecoverableErrorWithToken(
+ token.next, fasta.templateUnexpectedToken);
+ token = endGroup;
+ }
+ }
+
assert(optional(')', token));
mayParseFunctionExpressions = old;
if (kind == Assert.Expression) {
diff --git a/pkg/front_end/lib/src/fasta/parser/type_continuation.dart b/pkg/front_end/lib/src/fasta/parser/type_continuation.dart
deleted file mode 100644
index 32effd3..0000000
--- a/pkg/front_end/lib/src/fasta/parser/type_continuation.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library fasta.parser.type_continuation;
-
-/// Indication of how the parser should continue after (attempting) to parse a
-/// type.
-///
-/// Depending on the continuation, the parser may not parse a type at all.
-enum TypeContinuation {
- /// Indicates that a type is unconditionally expected.
- Required,
-
- /// Indicates that a type may follow. If the following matches one of these
- /// productions, it is parsed as a type:
- ///
- /// - `'void'`
- /// - `'Function' ( '(' | '<' )`
- /// - `identifier ('.' identifier)? ('<' ... '>')? identifer`
- ///
- /// Otherwise, do nothing.
- Optional,
-
- /// Same as [Optional], but we have seen `var`.
- OptionalAfterVar,
-}
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
index 1370d5a..9a1a945 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info_impl.dart
@@ -513,10 +513,11 @@
listener.endMetadataStar(0);
listener.handleIdentifier(token, IdentifierContext.typeVariableDeclaration);
listener.beginTypeVariable(token);
+ listener.handleTypeVariablesDefined(token, 1);
listener.handleNoType(token);
token = processEndGroup(token, start, parser);
- listener.endTypeVariable(token, null);
- listener.endTypeVariables(1, start, token);
+ listener.endTypeVariable(token, 0, null);
+ listener.endTypeVariables(start, token);
return token;
}
@@ -654,25 +655,32 @@
@override
Token parseVariables(Token token, Parser parser) {
Token next = start;
+ Listener listener = parser.listener;
+ listener.beginTypeVariables(start);
Token innerEndGroup = processBeginGroup(start, parser);
- parser.listener.beginTypeVariables(start);
int count = 0;
+
+ Link<Token> typeStarts = const Link<Token>();
+ Link<TypeInfo> superTypeInfos = const Link<TypeInfo>();
+
while (true) {
token = parser.parseMetadataStar(next);
token = parser.ensureIdentifier(
token, IdentifierContext.typeVariableDeclaration);
- parser.listener.beginTypeVariable(token);
- Token extendsOrSuper = null;
+ listener.beginTypeVariable(token);
+ typeStarts = typeStarts.prepend(token);
+
next = token.next;
if (optional('extends', next) || optional('super', next)) {
- extendsOrSuper = next;
- token = computeType(next, true, inDeclaration, innerEndGroup)
- .ensureTypeOrVoid(next, parser);
+ TypeInfo typeInfo =
+ computeType(next, true, inDeclaration, innerEndGroup);
+ token = typeInfo.skipType(next);
next = token.next;
+ superTypeInfos = superTypeInfos.prepend(typeInfo);
} else {
- parser.listener.handleNoType(token);
+ superTypeInfos = superTypeInfos.prepend(null);
}
- parser.listener.endTypeVariable(next, extendsOrSuper);
+
++count;
if (!optional(',', next)) {
if (!looksLikeTypeParamOrArg(inDeclaration, next)) {
@@ -688,8 +696,39 @@
.next;
}
}
+
+ assert(count > 0);
+ assert(typeStarts.slowLength() == count);
+ assert(superTypeInfos.slowLength() == count);
+ listener.handleTypeVariablesDefined(token, count);
+
+ token = null;
+ while (typeStarts.isNotEmpty) {
+ Token token2 = typeStarts.head;
+ TypeInfo typeInfo = superTypeInfos.head;
+
+ Token extendsOrSuper = null;
+ Token next2 = token2.next;
+ if (typeInfo != null) {
+ assert(optional('extends', next2) || optional('super', next2));
+ extendsOrSuper = next2;
+ token2 = typeInfo.ensureTypeOrVoid(next2, parser);
+ next2 = token2.next;
+ } else {
+ assert(!optional('extends', next2) && !optional('super', next2));
+ listener.handleNoType(token2);
+ }
+ // Type variables are "completed" in reverse order, so capture the last
+ // consumed token from the first "completed" type variable.
+ token ??= token2;
+ listener.endTypeVariable(next2, --count, extendsOrSuper);
+
+ typeStarts = typeStarts.tail;
+ superTypeInfos = superTypeInfos.tail;
+ }
+
end = processEndGroup(token, start, parser);
- parser.listener.endTypeVariables(count, start, end);
+ listener.endTypeVariables(start, end);
return end;
}
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index 961ebe3..722435f 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -447,13 +447,18 @@
}
@override
- void endTypeVariable(Token token, Token extendsOrSuper) {
- debugEvent("TypeVariable");
+ void beginTypeVariable(Token token) {
+ debugEvent("beginTypeVariable");
discard(2); // Name and metadata.
}
@override
- void endTypeVariables(int count, Token beginToken, Token endToken) {
+ void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+ debugEvent("endTypeVariable");
+ }
+
+ @override
+ void endTypeVariables(Token beginToken, Token endToken) {
debugEvent("TypeVariables");
}
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 3a98d19..5fe18f8 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -80,8 +80,7 @@
show
KernelFormalParameterBuilder,
KernelNamedTypeBuilder,
- KernelTypeBuilder,
- KernelTypeVariableBuilder;
+ KernelTypeBuilder;
enum MethodBody {
Abstract,
@@ -130,10 +129,10 @@
String postfix = popIfNotNull(periodBeforeName);
List<TypeBuilder> typeArguments = pop();
if (arguments == null) {
- int charOffset = pop();
+ pop(); // charOffset
Object expression = pop();
push(new MetadataBuilder.fromExpression(
- expression, postfix, library, charOffset));
+ expression, postfix, library, beginToken.charOffset));
} else {
int charOffset = pop();
Object typeName = pop();
@@ -465,6 +464,9 @@
}
List<MetadataBuilder> metadata = pop();
+ final int startCharOffset =
+ metadata == null ? beginToken.charOffset : metadata.first.charOffset;
+
library.addClass(
documentationComment,
metadata,
@@ -473,6 +475,7 @@
typeVariables,
supertype,
interfaces,
+ startCharOffset,
charOffset,
endToken.charOffset,
supertypeOffset);
@@ -521,6 +524,8 @@
library
.endNestedDeclaration("#method")
.resolveTypes(typeVariables, library);
+ final int startCharOffset =
+ metadata == null ? beginToken.charOffset : metadata.first.charOffset;
library.addProcedure(
documentationComment,
metadata,
@@ -530,6 +535,7 @@
typeVariables,
formals,
computeProcedureKind(getOrSet),
+ startCharOffset,
charOffset,
formalsOffset,
endToken.charOffset,
@@ -710,6 +716,8 @@
messageConstructorWithReturnType, beginToken, beginToken);
returnType = null;
}
+ final int startCharOffset =
+ metadata == null ? beginToken.charOffset : metadata.first.charOffset;
library.addConstructor(
documentationComment,
metadata,
@@ -719,6 +727,7 @@
constructorName,
typeVariables,
formals,
+ startCharOffset,
charOffset,
formalsOffset,
endToken.charOffset,
@@ -728,6 +737,8 @@
addCompileTimeError(messageConstMethod, varFinalOrConstOffset, 5);
modifiers &= ~constMask;
}
+ final int startCharOffset =
+ metadata == null ? beginToken.charOffset : metadata.first.charOffset;
library.addProcedure(
documentationComment,
metadata,
@@ -737,6 +748,7 @@
typeVariables,
formals,
kind,
+ startCharOffset,
charOffset,
formalsOffset,
endToken.charOffset,
@@ -806,21 +818,6 @@
}
@override
- void endTypeVariables(int count, Token beginToken, Token endToken) {
- debugEvent("TypeVariables");
- push(popList(
- count,
- new List<KernelTypeVariableBuilder>.filled(count, null,
- growable: true)) ??
- NullValue.TypeVariables);
- if (inConstructorName) {
- addProblem(messageConstructorWithTypeParameters,
- offsetForToken(beginToken), lengthOfSpan(beginToken, endToken));
- inConstructorName = false;
- }
- }
-
- @override
void handleNoTypeVariables(Token token) {
super.handleNoTypeVariables(token);
inConstructorName = false;
@@ -1109,18 +1106,41 @@
@override
void beginTypeVariable(Token token) {
debugEvent("beginTypeVariable");
- }
-
- @override
- void endTypeVariable(Token token, Token extendsOrSuper) {
- debugEvent("endTypeVariable");
- TypeBuilder bound = pop();
int charOffset = pop();
String name = pop();
// TODO(paulberry): type variable metadata should not be ignored. See
// dartbug.com/28981.
/* List<MetadataBuilder> metadata = */ pop();
- push(library.addTypeVariable(name, bound, charOffset));
+
+ push(library.addTypeVariable(name, null, charOffset));
+ }
+
+ @override
+ void handleTypeVariablesDefined(Token token, int count) {
+ debugEvent("TypeVariablesDefined");
+ assert(count > 0);
+ push(popList(count, new List<TypeVariableBuilder>(count)));
+ }
+
+ @override
+ void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+ debugEvent("endTypeVariable");
+ TypeBuilder bound = pop();
+ // Peek to leave type parameters on top of stack.
+ List typeParameters = peek();
+
+ typeParameters[index].bound = bound;
+ }
+
+ @override
+ void endTypeVariables(Token beginToken, Token endToken) {
+ debugEvent("endTypeVariables");
+
+ if (inConstructorName) {
+ addProblem(messageConstructorWithTypeParameters,
+ offsetForToken(beginToken), lengthOfSpan(beginToken, endToken));
+ inConstructorName = false;
+ }
}
@override
@@ -1183,6 +1203,7 @@
name,
formals,
redirectionTarget,
+ beginToken.charOffset,
charOffset,
formalsOffset,
endToken.charOffset,
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index ebb30da..041c161 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -47,10 +47,14 @@
List<TypeVariableBuilder> typeVariables,
String name,
KernelLibraryBuilder parent,
+ int startCharOffset,
int charOffset,
int charEndOffset) {
cls ??= new ShadowClass(name: name);
cls.fileUri ??= parent.fileUri;
+ if (cls.startFileOffset == TreeNode.noOffset) {
+ cls.startFileOffset = startCharOffset;
+ }
if (cls.fileOffset == TreeNode.noOffset) {
cls.fileOffset = charOffset;
}
@@ -87,12 +91,13 @@
Scope constructors,
LibraryBuilder parent,
this.constructorReferences,
+ int startCharOffset,
int charOffset,
int charEndOffset,
[ShadowClass cls,
this.mixedInType])
- : actualCls = initializeClass(
- cls, typeVariables, name, parent, charOffset, charEndOffset),
+ : actualCls = initializeClass(cls, typeVariables, name, parent,
+ startCharOffset, charOffset, charEndOffset),
super(metadata, modifiers, name, typeVariables, supertype, interfaces,
scope, constructors, parent, charOffset) {
ShadowClass.setBuilder(this.cls, this);
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index d6e591c..355804a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -338,6 +338,7 @@
List<TypeVariableBuilder> typeVariables,
T supertype,
List<T> interfaces,
+ int startCharOffset,
int charOffset,
int charEndOffset,
int supertypeOffset);
@@ -388,6 +389,7 @@
String constructorName,
List<TypeVariableBuilder> typeVariables,
List<FormalParameterBuilder> formals,
+ int startCharOffset,
int charOffset,
int charOpenParenOffset,
int charEndOffset,
@@ -402,6 +404,7 @@
List<TypeVariableBuilder> typeVariables,
List<FormalParameterBuilder> formals,
ProcedureKind kind,
+ int startCharOffset,
int charOffset,
int charOpenParenOffset,
int charEndOffset,
@@ -437,6 +440,7 @@
Object name,
List<FormalParameterBuilder> formals,
ConstructorReferenceBuilder redirectionTarget,
+ int startCharOffset,
int charOffset,
int charOpenParenOffset,
int charEndOffset,
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 5221c08..5398291 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -243,7 +243,7 @@
}
}
KernelProcedureBuilder builder = new KernelProcedureBuilder(null, 0, null,
- "debugExpr", null, null, ProcedureKind.Method, library, 0, -1, -1)
+ "debugExpr", null, null, ProcedureKind.Method, library, 0, 0, -1, -1)
..parent = parent;
BodyBuilder listener = dietListener.createListener(
builder, dietListener.memberScope, isInstanceMember);
diff --git a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
index 009b3e0..20febc0 100644
--- a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
+++ b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
@@ -289,7 +289,7 @@
return process.output;
}
-Future openWrite(Uri uri, f(IOSink sink)) async {
+Future<void> openWrite(Uri uri, f(IOSink sink)) async {
IOSink sink = new File.fromUri(uri).openWrite();
try {
await f(sink);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
index d7c29df..c85918e 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/inference_helper.dart
@@ -2,11 +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.
-import 'package:kernel/ast.dart' show FunctionType;
+import 'package:kernel/ast.dart' show Arguments, Expression, FunctionType;
import '../fasta_codes.dart' show LocatedMessage, Message;
-abstract class InferenceHelper<Expression, Statement, Arguments> {
+abstract class InferenceHelper {
Expression wrapInCompileTimeError(Expression expression, Message message);
Expression buildCompileTimeError(Message message, int charOffset, int length,
diff --git a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
index 0fc6eb5..e414ffe5 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/interface_resolver.dart
@@ -537,6 +537,7 @@
isForwardingStub: true,
fileUri: enclosingClass.fileUri,
forwardingStubInterfaceTarget: finalTarget)
+ ..startFileOffset = enclosingClass.fileOffset
..fileOffset = enclosingClass.fileOffset
..parent = enclosingClass;
}
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
index fcf385f..2440504 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
@@ -6,8 +6,14 @@
import 'package:kernel/type_algebra.dart' show Substitution;
+import '../../scanner/token.dart' show Token;
+
import '../kernel/kernel_shadow_ast.dart'
- show ExpressionJudgment, InitializerJudgment, StatementJudgment;
+ show
+ ExpressionJudgment,
+ InitializerJudgment,
+ StatementJudgment,
+ SwitchCaseJudgment;
/// Callback interface used by [TypeInferrer] to report the results of type
/// inference to a client.
@@ -24,21 +30,50 @@
abstract class TypeInferenceListener<Location, Declaration, Reference,
PrefixInfo> {
void asExpression(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ ExpressionJudgment judgment,
+ Location location,
+ void expression,
+ Token asOperator,
+ void literalType,
+ DartType inferredType);
- void assertInitializer(InitializerJudgment judgment, Location location);
+ void assertInitializer(
+ InitializerJudgment judgment,
+ Location location,
+ Token assertKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token comma,
+ void message,
+ Token rightParenthesis);
- void assertStatement(StatementJudgment judgment, Location location);
+ void assertStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token assertKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token comma,
+ void message,
+ Token rightParenthesis,
+ Token semicolon);
- void awaitExpression(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ void awaitExpression(ExpressionJudgment judgment, Location location,
+ Token awaitKeyword, void expression, DartType inferredType);
- void block(StatementJudgment judgment, Location location);
+ void block(StatementJudgment judgment, Location location, Token leftBracket,
+ List<void> statements, Token rightBracket);
- void boolLiteral(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ void boolLiteral(ExpressionJudgment judgment, Location location,
+ Token literal, bool value, DartType inferredType);
- void breakStatement(StatementJudgment judgment, Location location);
+ void breakStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token breakKeyword,
+ void label,
+ Token semicolon,
+ covariant Object labelBinder);
void cascadeExpression(
ExpressionJudgment judgment, Location location, DartType inferredType);
@@ -46,80 +81,201 @@
void catchStatement(
Catch judgment,
Location location,
+ Token onKeyword,
+ void type,
+ Token catchKeyword,
+ Token leftParenthesis,
+ Token exceptionParameter,
+ Token comma,
+ Token stackTraceParameter,
+ Token rightParenthesis,
+ void body,
DartType guardType,
- Location exceptionLocation,
+ covariant Object exceptionBinder,
DartType exceptionType,
- Location stackTraceLocation,
+ covariant Object stackTraceBinder,
DartType stackTraceType);
void conditionalExpression(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ ExpressionJudgment judgment,
+ Location location,
+ void condition,
+ Token question,
+ void thenExpression,
+ Token colon,
+ void elseExpression,
+ DartType inferredType);
void constructorInvocation(ExpressionJudgment judgment, Location location,
Reference expressionTarget, DartType inferredType);
- void continueSwitchStatement(StatementJudgment judgment, Location location);
+ void continueStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token continueKeyword,
+ void label,
+ Token semicolon,
+ covariant Object labelBinder);
+
+ void continueSwitchStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token continueKeyword,
+ void label,
+ Token semicolon,
+ covariant Object labelBinder);
void deferredCheck(
ExpressionJudgment judgment, Location location, DartType inferredType);
- void doStatement(StatementJudgment judgment, Location location);
+ void doStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token doKeyword,
+ void body,
+ Token whileKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token rightParenthesis,
+ Token semicolon);
- void doubleLiteral(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ void doubleLiteral(ExpressionJudgment judgment, Location location,
+ Token literal, double value, DartType inferredType);
- void expressionStatement(StatementJudgment judgment, Location location);
+ void emptyStatement(Token semicolon);
- void fieldInitializer(InitializerJudgment judgment, Location location,
+ void expressionStatement(StatementJudgment judgment, Location location,
+ void expression, Token semicolon);
+
+ void fieldInitializer(
+ InitializerJudgment judgment,
+ Location location,
+ Token thisKeyword,
+ Token period,
+ Token fieldName,
+ Token equals,
+ void expression,
Reference initializerField);
void forInStatement(
StatementJudgment judgment,
Location location,
- Location variableLocation,
- DartType variableType,
+ Token awaitKeyword,
+ Token forKeyword,
+ Token leftParenthesis,
+ Object loopVariable,
+ Token identifier,
+ Token inKeyword,
+ void iterator,
+ Token rightParenthesis,
+ void body,
+ covariant Object loopVariableBinder,
+ DartType loopVariableType,
Location writeLocation,
DartType writeVariableType,
Declaration writeVariable,
Reference writeTarget);
- void forStatement(StatementJudgment judgment, Location location);
+ void forStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token forKeyword,
+ Token leftParenthesis,
+ List<Object> variableList,
+ void initialization,
+ Token leftSeparator,
+ void condition,
+ Token rightSeparator,
+ void updaters,
+ Token rightParenthesis,
+ void body);
- void functionDeclaration(
- StatementJudgment judgment, Location location, FunctionType inferredType);
+ void functionDeclaration(covariant Object binder, FunctionType inferredType);
+
+ Object binderForFunctionDeclaration(
+ StatementJudgment judgment, Location location, String name);
void functionExpression(
ExpressionJudgment judgment, Location location, DartType inferredType);
- void ifNull(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ void ifNull(ExpressionJudgment judgment, Location location, void leftOperand,
+ Token operator, void rightOperand, DartType inferredType);
- void ifStatement(StatementJudgment judgment, Location location);
+ void ifStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token ifKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token rightParenthesis,
+ void thenStatement,
+ Token elseKeyword,
+ void elseStatement);
void indexAssign(ExpressionJudgment judgment, Location location,
Reference writeMember, Reference combiner, DartType inferredType);
- void intLiteral(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ void intLiteral(ExpressionJudgment judgment, Location location, Token literal,
+ num value, DartType inferredType);
void invalidInitializer(InitializerJudgment judgment, Location location);
- void isExpression(ExpressionJudgment judgment, Location location,
- DartType testedType, DartType inferredType);
+ void isExpression(
+ ExpressionJudgment judgment,
+ Location location,
+ void expression,
+ Token isOperator,
+ void literalType,
+ DartType testedType,
+ DartType inferredType);
- void isNotExpression(ExpressionJudgment judgment, Location location,
- DartType type, DartType inferredType);
+ void isNotExpression(
+ ExpressionJudgment judgment,
+ Location location,
+ void expression,
+ Token isOperator,
+ Token notOperator,
+ void literalType,
+ DartType type,
+ DartType inferredType);
- void labeledStatement(StatementJudgment judgment, Location location);
+ void labeledStatement(List<Object> labels, void statement);
+
+ Object statementLabel(covariant Object binder, Token label, Token colon);
+
+ Object binderForStatementLabel(
+ StatementJudgment judgment, int fileOffset, String name);
void listLiteral(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ ExpressionJudgment judgment,
+ Location location,
+ Token constKeyword,
+ covariant Object typeArguments,
+ Token leftBracket,
+ void elements,
+ Token rightBracket,
+ DartType inferredType);
void logicalExpression(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ ExpressionJudgment judgment,
+ Location location,
+ void leftOperand,
+ Token operator,
+ void rightOperand,
+ DartType inferredType);
void mapLiteral(
- ExpressionJudgment judgment, Location location, DartType typeContext);
+ ExpressionJudgment judgment,
+ Location location,
+ Token constKeyword,
+ covariant Object typeArguments,
+ Token leftBracket,
+ List<Object> entries,
+ Token rightBracket,
+ DartType inferredType);
+
+ void mapLiteralEntry(
+ Object judgment, int fileOffset, void key, Token separator, void value);
void methodInvocation(
ExpressionJudgment judgment,
@@ -140,14 +296,14 @@
Substitution substitution,
DartType inferredType);
- void namedFunctionExpression(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ void namedFunctionExpression(ExpressionJudgment judgment,
+ covariant Object binder, DartType inferredType);
- void not(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ void not(ExpressionJudgment judgment, Location location, Token operator,
+ void operand, DartType inferredType);
void nullLiteral(ExpressionJudgment judgment, Location location,
- bool isSynthetic, DartType inferredType);
+ Token literal, bool isSynthetic, DartType inferredType);
void propertyAssign(
ExpressionJudgment judgment,
@@ -166,13 +322,20 @@
void propertySet(
ExpressionJudgment judgment, Location location, DartType inferredType);
- void redirectingInitializer(InitializerJudgment judgment, Location location,
+ void redirectingInitializer(
+ InitializerJudgment judgment,
+ Location location,
+ Token thisKeyword,
+ Token period,
+ Token constructorName,
+ covariant Object argumentList,
Reference initializerTarget);
- void rethrow_(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ void rethrow_(ExpressionJudgment judgment, Location location,
+ Token rethrowKeyword, DartType inferredType);
- void returnStatement(StatementJudgment judgment, Location location);
+ void returnStatement(StatementJudgment judgment, Location location,
+ Token returnKeyword, void expression, Token semicolon);
void staticAssign(
ExpressionJudgment judgment,
@@ -197,25 +360,60 @@
void stringConcatenation(
ExpressionJudgment judgment, Location location, DartType inferredType);
- void stringLiteral(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ void stringLiteral(ExpressionJudgment judgment, Location location,
+ Token literal, String value, DartType inferredType);
- void superInitializer(InitializerJudgment judgment, Location location);
+ void superInitializer(
+ InitializerJudgment judgment,
+ Location location,
+ Token superKeyword,
+ Token period,
+ Token constructorName,
+ covariant Object argumentList);
- void switchStatement(StatementJudgment judgment, Location location);
+ Object switchCase(SwitchCaseJudgment switchCase, List<Object> labels,
+ Token keyword, void expression, Token colon, List<void> statements);
+
+ Object switchLabel(covariant Object binder, Token label, Token colon);
+
+ Object binderForSwitchLabel(
+ SwitchCaseJudgment judgment, int fileOffset, String name);
+
+ void switchStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token switchKeyword,
+ Token leftParenthesis,
+ void expression,
+ Token rightParenthesis,
+ Token leftBracket,
+ void members,
+ Token rightBracket);
void symbolLiteral(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ ExpressionJudgment judgment,
+ Location location,
+ Token poundSign,
+ List<Token> components,
+ String value,
+ DartType inferredType);
- void thisExpression(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ void thisExpression(ExpressionJudgment judgment, Location location,
+ Token thisKeyword, DartType inferredType);
- void throw_(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ void throw_(ExpressionJudgment judgment, Location location,
+ Token throwKeyword, void expression, DartType inferredType);
void tryCatch(StatementJudgment judgment, Location location);
- void tryFinally(StatementJudgment judgment, Location location);
+ void tryFinally(
+ StatementJudgment judgment,
+ Location location,
+ Token tryKeyword,
+ void body,
+ void catchClauses,
+ Token finallyKeyword,
+ void finallyBlock);
void typeLiteral(ExpressionJudgment judgment, Location location,
Reference expressionType, DartType inferredType);
@@ -228,18 +426,26 @@
Reference combiner,
DartType inferredType);
- void variableDeclaration(StatementJudgment judgment, Location location,
- DartType statementType, DartType inferredType);
+ void variableDeclaration(
+ covariant Object binder, DartType statementType, DartType inferredType);
+
+ Object binderForVariableDeclaration(
+ StatementJudgment judgment, int fileOffset, String name);
void variableGet(ExpressionJudgment judgment, Location location,
- bool isInCascade, Declaration expressionVariable, DartType inferredType);
+ bool isInCascade, covariant Object variableBinder, DartType inferredType);
- void variableSet(
- ExpressionJudgment judgment, Location location, DartType inferredType);
+ void whileStatement(
+ StatementJudgment judgment,
+ Location location,
+ Token whileKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token rightParenthesis,
+ void body);
- void whileStatement(StatementJudgment judgment, Location location);
-
- void yieldStatement(StatementJudgment judgment, Location location);
+ void yieldStatement(StatementJudgment judgment, Location location,
+ Token yieldKeyword, Token star, void expression, Token semicolon);
void storePrefixInfo(Location location, PrefixInfo prefixInfo);
@@ -253,28 +459,47 @@
class KernelTypeInferenceListener
implements TypeInferenceListener<int, int, Node, int> {
@override
- void asExpression(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ void asExpression(ExpressionJudgment judgment, location, void expression,
+ Token asOperator, void literalType, DartType inferredType) {}
@override
- void assertInitializer(InitializerJudgment judgment, location) {}
+ void assertInitializer(
+ InitializerJudgment judgment,
+ location,
+ Token assertKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token comma,
+ void message,
+ Token rightParenthesis) {}
@override
- void assertStatement(StatementJudgment judgment, location) {}
+ void assertStatement(
+ StatementJudgment judgment,
+ location,
+ Token assertKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token comma,
+ void message,
+ Token rightParenthesis,
+ Token semicolon) {}
@override
- void awaitExpression(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ void awaitExpression(ExpressionJudgment judgment, location,
+ Token awaitKeyword, void expression, DartType inferredType) {}
@override
- void block(StatementJudgment judgment, location) {}
+ void block(StatementJudgment judgment, location, Token leftBracket,
+ List<void> statements, Token rightBracket) {}
@override
- void boolLiteral(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ void boolLiteral(ExpressionJudgment judgment, location, Token literal,
+ bool value, DartType inferredType) {}
@override
- void breakStatement(StatementJudgment judgment, location) {}
+ void breakStatement(StatementJudgment judgment, location, Token breakKeyword,
+ void label, Token semicolon, covariant void labelBinder) {}
@override
void cascadeExpression(
@@ -284,102 +509,229 @@
void catchStatement(
Catch judgment,
location,
+ Token onKeyword,
+ void type,
+ Token catchKeyword,
+ Token leftParenthesis,
+ Token exceptionParameter,
+ Token comma,
+ Token stackTraceParameter,
+ Token rightParenthesis,
+ void body,
DartType guardType,
- exceptionLocation,
+ covariant void exceptionBinder,
DartType exceptionType,
- stackTraceLocation,
+ covariant void stackTraceBinder,
DartType stackTraceType) {}
@override
void conditionalExpression(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ ExpressionJudgment judgment,
+ location,
+ void condition,
+ Token question,
+ void thenExpression,
+ Token colon,
+ void elseExpression,
+ DartType inferredType) {}
@override
void constructorInvocation(ExpressionJudgment judgment, location,
expressionTarget, DartType inferredType) {}
@override
- void continueSwitchStatement(StatementJudgment judgment, location) {}
+ void continueStatement(
+ StatementJudgment judgment,
+ location,
+ Token continueKeyword,
+ void label,
+ Token semicolon,
+ covariant void labelBinder) {}
+
+ @override
+ void continueSwitchStatement(
+ StatementJudgment judgment,
+ location,
+ Token continueKeyword,
+ void label,
+ Token semicolon,
+ covariant void labelBinder) {}
@override
void deferredCheck(
ExpressionJudgment judgment, location, DartType inferredType) {}
@override
- void doStatement(StatementJudgment judgment, location) {}
+ void doStatement(
+ StatementJudgment judgment,
+ location,
+ Token doKeyword,
+ void body,
+ Token whileKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token rightParenthesis,
+ Token semicolon) {}
@override
- void doubleLiteral(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ void doubleLiteral(ExpressionJudgment judgment, location, Token literal,
+ double value, DartType inferredType) {}
@override
- void expressionStatement(StatementJudgment judgment, location) {}
+ void emptyStatement(Token semicolon) {}
+
+ @override
+ void expressionStatement(
+ StatementJudgment judgment, location, void expression, Token semicolon) {}
@override
void fieldInitializer(
- InitializerJudgment judgment, location, initializerField) {}
+ InitializerJudgment judgment,
+ location,
+ Token thisKeyword,
+ Token period,
+ Token fieldName,
+ Token equals,
+ void expression,
+ initializerField) {}
@override
void forInStatement(
StatementJudgment judgment,
location,
- variableLocation,
- DartType variableType,
+ Token awaitKeyword,
+ Token forKeyword,
+ Token leftParenthesis,
+ covariant Object loopVariable,
+ Token identifier,
+ Token inKeyword,
+ void iterator,
+ Token rightParenthesis,
+ void body,
+ covariant void loopVariableBinder,
+ DartType loopVariableType,
writeLocation,
DartType writeVariableType,
writeVariable,
writeTarget) {}
@override
- void forStatement(StatementJudgment judgment, location) {}
+ void forStatement(
+ StatementJudgment judgment,
+ location,
+ Token forKeyword,
+ Token leftParenthesis,
+ Object variableDeclarationList,
+ void initialization,
+ Token leftSeparator,
+ void condition,
+ Token rightSeparator,
+ void updaters,
+ Token rightParenthesis,
+ void body) {}
@override
- void functionDeclaration(
- StatementJudgment judgment, location, FunctionType inferredType) {}
+ void functionDeclaration(covariant void binder, FunctionType inferredType) {}
+
+ @override
+ void binderForFunctionDeclaration(
+ StatementJudgment judgment, location, String name) {}
@override
void functionExpression(
ExpressionJudgment judgment, location, DartType inferredType) {}
@override
- void ifNull(ExpressionJudgment judgment, location, DartType inferredType) {}
+ void ifNull(ExpressionJudgment judgment, location, void leftOperand,
+ Token operator, void rightOperand, DartType inferredType) {}
@override
- void ifStatement(StatementJudgment judgment, location) {}
+ void ifStatement(
+ StatementJudgment judgment,
+ location,
+ Token ifKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token rightParenthesis,
+ void thenStatement,
+ Token elseKeyword,
+ void elseStatement) {}
@override
void indexAssign(ExpressionJudgment judgment, location, writeMember, combiner,
DartType inferredType) {}
@override
- void intLiteral(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ void intLiteral(ExpressionJudgment judgment, location, Token literal,
+ num value, DartType inferredType) {}
@override
void invalidInitializer(InitializerJudgment judgment, location) {}
@override
- void isExpression(ExpressionJudgment judgment, location, DartType testedType,
+ void isExpression(
+ ExpressionJudgment judgment,
+ location,
+ void expression,
+ Token isOperator,
+ void literalType,
+ DartType testedType,
DartType inferredType) {}
@override
- void isNotExpression(ExpressionJudgment judgment, location, DartType type,
+ void isNotExpression(
+ ExpressionJudgment judgment,
+ location,
+ void expression,
+ Token isOperator,
+ Token notOperator,
+ void literalType,
+ DartType type,
DartType inferredType) {}
@override
- void labeledStatement(StatementJudgment judgment, location) {}
+ void labeledStatement(List<Object> labels, void statement) {}
+
+ @override
+ void statementLabel(covariant void binder, Token label, Token colon) {}
+
+ @override
+ void binderForStatementLabel(
+ StatementJudgment judgment, int fileOffset, String name) {}
@override
void listLiteral(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ ExpressionJudgment judgment,
+ location,
+ Token constKeyword,
+ covariant Object typeArguments,
+ Token leftBracket,
+ void elements,
+ Token rightBracket,
+ DartType inferredType) {}
@override
void logicalExpression(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ ExpressionJudgment judgment,
+ location,
+ void leftOperand,
+ Token operator,
+ void rightOperand,
+ DartType inferredType) {}
@override
void mapLiteral(
- ExpressionJudgment judgment, location, DartType typeContext) {}
+ ExpressionJudgment judgment,
+ location,
+ Token constKeyword,
+ Object typeArguments,
+ Token leftBracket,
+ List<Object> entries,
+ Token rightBracket,
+ DartType inferredType) {}
+
+ void mapLiteralEntry(
+ Object judgment, int fileOffset, void key, Token separator, void value) {}
@override
void methodInvocation(
@@ -403,17 +755,18 @@
DartType inferredType) {}
@override
- void namedFunctionExpression(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ void namedFunctionExpression(ExpressionJudgment judgment,
+ covariant void binder, DartType inferredType) {}
@override
- void not(ExpressionJudgment judgment, location, DartType inferredType) {}
-
- @override
- void nullLiteral(ExpressionJudgment judgment, location, bool isSynthetic,
+ void not(ExpressionJudgment judgment, location, Token operator, void operand,
DartType inferredType) {}
@override
+ void nullLiteral(ExpressionJudgment judgment, location, Token literal,
+ bool isSynthetic, DartType inferredType) {}
+
+ @override
void propertyAssign(ExpressionJudgment judgment, location, writeMember,
DartType writeContext, combiner, DartType inferredType) {}
@@ -431,13 +784,21 @@
@override
void redirectingInitializer(
- InitializerJudgment judgment, location, initializerTarget) {}
+ InitializerJudgment judgment,
+ location,
+ Token thisKeyword,
+ Token period,
+ Token constructorName,
+ covariant Object argumentList,
+ initializerTarget) {}
@override
- void rethrow_(ExpressionJudgment judgment, location, DartType inferredType) {}
+ void rethrow_(ExpressionJudgment judgment, location, Token rethrowKeyword,
+ DartType inferredType) {}
@override
- void returnStatement(StatementJudgment judgment, location) {}
+ void returnStatement(StatementJudgment judgment, location,
+ Token returnKeyword, void expression, Token semicolon) {}
@override
void staticAssign(ExpressionJudgment judgment, location, writeMember,
@@ -468,31 +829,59 @@
ExpressionJudgment judgment, location, DartType inferredType) {}
@override
- void stringLiteral(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ void stringLiteral(ExpressionJudgment judgment, location, Token literal,
+ String value, DartType inferredType) {}
@override
- void superInitializer(InitializerJudgment judgment, location) {}
+ void superInitializer(
+ InitializerJudgment judgment,
+ location,
+ Token superKeyword,
+ Token period,
+ Token constructorName,
+ covariant Object argumentList) {}
@override
- void switchStatement(StatementJudgment judgment, location) {}
+ void switchCase(SwitchCaseJudgment switchCase, covariant List<Object> labels,
+ Token keyword, void expression, Token colon, List<void> statements) {}
@override
- void symbolLiteral(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ void switchLabel(covariant void binder, Token label, Token colon) {}
@override
- void thisExpression(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ void binderForSwitchLabel(
+ SwitchCaseJudgment judgment, int fileOffset, String name) {}
@override
- void throw_(ExpressionJudgment judgment, location, DartType inferredType) {}
+ void switchStatement(
+ StatementJudgment judgment,
+ location,
+ Token switchKeyword,
+ Token leftParenthesis,
+ void expression,
+ Token rightParenthesis,
+ Token leftBracket,
+ void members,
+ Token rightBracket) {}
+
+ @override
+ void symbolLiteral(ExpressionJudgment judgment, location, Token poundSign,
+ List<Token> components, String value, DartType inferredType) {}
+
+ @override
+ void thisExpression(ExpressionJudgment judgment, location, Token thisKeyword,
+ DartType inferredType) {}
+
+ @override
+ void throw_(ExpressionJudgment judgment, location, Token throwKeyword,
+ void expression, DartType inferredType) {}
@override
void tryCatch(StatementJudgment judgment, location) {}
@override
- void tryFinally(StatementJudgment judgment, location) {}
+ void tryFinally(StatementJudgment judgment, location, Token tryKeyword,
+ void body, void catchClauses, Token finallyKeyword, void finallyBlock) {}
@override
void typeLiteral(ExpressionJudgment judgment, location, expressionType,
@@ -503,20 +892,28 @@
DartType writeContext, writeVariable, combiner, DartType inferredType) {}
@override
- void variableDeclaration(StatementJudgment judgment, location,
- DartType statementType, DartType inferredType) {}
+ void variableDeclaration(
+ covariant void binder, DartType statementType, DartType inferredType) {}
+
+ @override
+ void binderForVariableDeclaration(
+ StatementJudgment judgment, int fileOffset, String name) {}
@override
void variableGet(ExpressionJudgment judgment, location, bool isInCascade,
expressionVariable, DartType inferredType) {}
@override
- void variableSet(
- ExpressionJudgment judgment, location, DartType inferredType) {}
+ void whileStatement(
+ StatementJudgment judgment,
+ location,
+ Token whileKeyword,
+ Token leftParenthesis,
+ void condition,
+ Token rightParenthesis,
+ void body) {}
@override
- void whileStatement(StatementJudgment judgment, location) {}
-
- @override
- void yieldStatement(StatementJudgment judgment, location) {}
+ void yieldStatement(StatementJudgment judgment, location, Token yieldKeyword,
+ Token star, void expression, Token semicolon) {}
}
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 521c12f..962d38a 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
@@ -86,12 +86,13 @@
import '../kernel/kernel_shadow_ast.dart'
show
+ ArgumentsJudgment,
ExpressionJudgment,
+ NullJudgment,
ShadowClass,
- ShadowConstructorInvocation,
+ ConstructorInvocationJudgment,
ShadowField,
ShadowMember,
- NullJudgment,
VariableDeclarationJudgment,
getExplicitTypeArguments;
@@ -1090,17 +1091,18 @@
/// Performs the type inference steps that are shared by all kinds of
/// invocations (constructors, instance methods, and static methods).
- DartType inferInvocation<Expression, Statement, Initializer, Type>(
- Factory<Expression, Statement, Initializer, Type> factory,
- DartType typeContext,
- int offset,
- FunctionType calleeType,
- DartType returnType,
- Arguments arguments,
- {bool isOverloadedArithmeticOperator: false,
- DartType receiverType,
- bool skipTypeArgumentInference: false,
- bool isConst: false}) {
+ ExpressionInferenceResult
+ inferInvocation<Expression, Statement, Initializer, Type>(
+ Factory<Expression, Statement, Initializer, Type> factory,
+ DartType typeContext,
+ int offset,
+ FunctionType calleeType,
+ DartType returnType,
+ ArgumentsJudgment arguments,
+ {bool isOverloadedArithmeticOperator: false,
+ DartType receiverType,
+ bool skipTypeArgumentInference: false,
+ bool isConst: false}) {
lastInferredSubstitution = null;
lastCalleeType = null;
var calleeTypeParameters = calleeType.typeParameters;
@@ -1224,15 +1226,16 @@
inferredType = substitution == null
? returnType
: substitution.substituteType(returnType);
- return inferredType;
+ return new ExpressionInferenceResult(null, inferredType);
}
- DartType inferLocalFunction<Expression, Statement, Initializer, Type>(
- Factory<Expression, Statement, Initializer, Type> factory,
- FunctionNode function,
- DartType typeContext,
- int fileOffset,
- DartType returnContext) {
+ ExpressionInferenceResult
+ inferLocalFunction<Expression, Statement, Initializer, Type>(
+ Factory<Expression, Statement, Initializer, Type> factory,
+ FunctionNode function,
+ DartType typeContext,
+ int fileOffset,
+ DartType returnContext) {
bool hasImplicitReturnType = false;
if (returnContext == null) {
hasImplicitReturnType = true;
@@ -1245,7 +1248,7 @@
inferMetadataKeepingHelper(factory, parameter.annotations);
if (i >= function.requiredParameterCount &&
parameter.initializer == null) {
- parameter.initializer = new NullJudgment()..parent = parameter;
+ parameter.initializer = new NullJudgment(null)..parent = parameter;
}
if (parameter.initializer != null) {
inferExpression(
@@ -1255,7 +1258,7 @@
for (var parameter in function.namedParameters) {
inferMetadataKeepingHelper(factory, parameter.annotations);
if (parameter.initializer == null) {
- parameter.initializer = new NullJudgment()..parent = parameter;
+ parameter.initializer = new NullJudgment(null)..parent = parameter;
}
inferExpression(factory, parameter.initializer, parameter.type, false);
}
@@ -1377,7 +1380,7 @@
closureContext._wrapAsyncOrGenerator(this, const DynamicType());
}
this.closureContext = oldClosureContext;
- return function.functionType;
+ return new ExpressionInferenceResult(null, function.functionType);
}
@override
@@ -1413,18 +1416,19 @@
/// Performs the core type inference algorithm for method invocations (this
/// handles both null-aware and non-null-aware method invocations).
- DartType inferMethodInvocation<Expression, Statement, Initializer, Type>(
- Factory<Expression, Statement, Initializer, Type> factory,
- kernel.Expression expression,
- kernel.Expression receiver,
- int fileOffset,
- bool isImplicitCall,
- DartType typeContext,
- {VariableDeclaration receiverVariable,
- MethodInvocation desugaredInvocation,
- Object interfaceMember,
- Name methodName,
- Arguments arguments}) {
+ ExpressionInferenceResult
+ inferMethodInvocation<Expression, Statement, Initializer, Type>(
+ Factory<Expression, Statement, Initializer, Type> factory,
+ kernel.Expression expression,
+ kernel.Expression receiver,
+ int fileOffset,
+ bool isImplicitCall,
+ DartType typeContext,
+ {VariableDeclaration receiverVariable,
+ MethodInvocation desugaredInvocation,
+ Object interfaceMember,
+ Name methodName,
+ Arguments arguments}) {
// First infer the receiver so we can look up the method that was invoked.
var receiverType = receiver == null
? thisType
@@ -1447,10 +1451,11 @@
getCalleeFunctionType(interfaceMember, receiverType, !isImplicitCall);
var checkKind = preCheckInvocationContravariance(receiver, receiverType,
interfaceMember, desugaredInvocation, arguments, expression);
- var inferredType = inferInvocation(factory, typeContext, fileOffset,
+ var inferenceResult = inferInvocation(factory, typeContext, fileOffset,
calleeType, calleeType.returnType, arguments,
isOverloadedArithmeticOperator: isOverloadedArithmeticOperator,
receiverType: receiverType);
+ var inferredType = inferenceResult.type;
if (methodName.name == '==') {
inferredType = coreTypes.boolClass.rawType;
}
@@ -1491,7 +1496,7 @@
lastInferredSubstitution,
inferredType);
}
- return inferredType;
+ return new ExpressionInferenceResult(null, inferredType);
}
@override
@@ -1790,7 +1795,7 @@
return templateInvalidCastFunctionExpr;
}
if (expression is ConstructorInvocation) {
- if (ShadowConstructorInvocation.isRedirected(expression)) {
+ if (ConstructorInvocationJudgment.isRedirected(expression)) {
return null;
} else {
return templateInvalidCastNewExpr;
@@ -1977,3 +1982,11 @@
}
}
}
+
+/// The result of an expression inference.
+class ExpressionInferenceResult<Expression> {
+ final Expression expression;
+ final DartType type;
+
+ ExpressionInferenceResult(this.expression, this.type);
+}
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 7820263..c811a73 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -84,6 +84,8 @@
ConstEvalNegativeShift/example: Fail
ConstEvalNonConstantLiteral/dart2jsCode: Fail
ConstEvalNonConstantLiteral/example: Fail
+ConstEvalNonConstantVariableGet/dart2jsCode: Fail
+ConstEvalNonConstantVariableGet/example: Fail
ConstEvalZeroDivisor/example: Fail
ConstFieldWithoutInitializer/example: Fail
ConstructorNotFound/analyzerCode: Fail
@@ -409,5 +411,7 @@
UnterminatedString/script8: Fail
UnterminatedToken/analyzerCode: Fail
UnterminatedToken/example: Fail
+WebLiteralCannotBeRepresentedExactly/analyzerCode: Fail
+WebLiteralCannotBeRepresentedExactly/example: Fail
YieldAsIdentifier/example: Fail
YieldNotGenerator/example: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 7292c04..e51c39a 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -131,6 +131,10 @@
template: "This assertion failed with message: #string"
analyzerCode: CONST_EVAL_THROWS_EXCEPTION
+ConstEvalNonConstantVariableGet:
+ template: "The variable '#string' is not a constant, only constant expressions are allowed."
+ analyzerCode: NON_CONSTANT_VALUE_IN_INITIALIZER
+
NonAsciiIdentifier:
template: "The non-ASCII character '#character' (#unicode) can't be used in identifiers, only in strings and comments."
tip: "Try using an US-ASCII letter, a digit, '_' (an underscore), or '$' (a dollar sign)."
@@ -2332,3 +2336,46 @@
MissingExplicitTypeArguments:
template: "No type arguments provided, #count possible."
severity: IGNORED
+
+WebLiteralCannotBeRepresentedExactly:
+ template: "The integer literal #string can't be represented exactly in JavaScript."
+ tip: "Try changing the literal to something that can be represented in Javascript. In Javascript #string2 is the nearest value that can be represented exactly."
+ severity: ERROR
+ dart2jsCode: "*fatal*"
+
+BoundIssueViaRawTypeWithNonSimpleBounds:
+ template: "Generic type '#name' can't be used without type arguments in a type variable bound."
+ tip: "Try providing type arguments to '#name' here."
+ severity: ERROR
+ analyzerCode: STRONG_MODE_NOT_INSTANTIATED_BOUND
+ dart2jsCode: "*fatal*"
+ script: >
+ class Hest<X extends Hest<X>> {}
+ class Fisk<Y extends Hest> {}
+
+NonSimpleBoundViaVariable:
+ template: "Bound of this variable references variable '#name' from the same declaration."
+ severity: CONTEXT
+
+BoundIssueViaLoopNonSimplicity:
+ template: "Generic type '#name' can't be used without type arguments in the bounds of its own type variables."
+ tip: "Try providing type arguments to '#name' here."
+ severity: ERROR
+ analyzerCode: STRONG_MODE_NOT_INSTANTIATED_BOUND
+ dart2jsCode: "*fatal*"
+ script: >
+ class Hest<X extends Hest> {}
+
+BoundIssueViaCycleNonSimplicity:
+ template: "Generic type '#name' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through '#name2'."
+ tip: "Try providing type arguments to '#name2' here or to some other raw types in the bounds along the reference chain."
+ severity: ERROR
+ analyzerCode: STRONG_MODE_NOT_INSTANTIATED_BOUND
+ dart2jsCode: "*fatal*"
+ script: >
+ class Hest<X extends Fisk> {}
+ class Fisk<Y extends Hest> {}
+
+NonSimpleBoundViaReference:
+ template: "Bound of this variable references raw type '#name'."
+ severity: CONTEXT
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index 86c698f..dd18315 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -20,7 +20,8 @@
dev_dependencies:
analyzer: '>=0.31.0 <0.33.0'
args: '>=0.13.0 <2.0.0'
- build_integration: ^0.0.1
+ build_integration:
+ path: ../build_integration
dart_style: '^1.0.7'
json_rpc_2: ^2.0.4
mockito: ^2.0.2
diff --git a/pkg/front_end/test/fasta/expression_test.dart b/pkg/front_end/test/fasta/expression_test.dart
index 91f716e..b2b315c 100644
--- a/pkg/front_end/test/fasta/expression_test.dart
+++ b/pkg/front_end/test/fasta/expression_test.dart
@@ -298,6 +298,8 @@
File dillFile = new File.fromUri(dillFileUri);
if (!await dillFile.exists()) {
await writeComponentToFile(component, dillFileUri);
+ context.fileSystem.entityForUri(dillFileUri).writeAsBytesSync(
+ await new File.fromUri(dillFileUri).readAsBytes());
}
var dillCompiler =
diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart
index 08dfb3a..84af3a4 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -18,7 +18,6 @@
Name,
Procedure,
ProcedureKind,
- Statement,
StringLiteral,
TypeParameter,
VariableDeclaration,
@@ -80,8 +79,7 @@
import 'package:front_end/src/fasta/scanner.dart' show Token, scanString;
-void check(
- String expected, Generator<Expression, Statement, Arguments> generator) {
+void check(String expected, Generator generator) {
Expect.stringEquals(expected, "$generator");
}
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index 9889ccd..6cde453 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -4,7 +4,6 @@
import 'package:front_end/src/fasta/messages.dart';
import 'package:front_end/src/fasta/parser.dart';
-import 'package:front_end/src/fasta/parser/type_continuation.dart';
import 'package:front_end/src/fasta/parser/type_info.dart';
import 'package:front_end/src/fasta/parser/type_info_impl.dart';
import 'package:front_end/src/fasta/scanner.dart';
@@ -286,9 +285,10 @@
'endMetadataStar 0',
'handleIdentifier T typeVariableDeclaration',
'beginTypeVariable T',
+ 'handleTypeVariablesDefined T 1',
'handleNoType T',
- 'endTypeVariable > null',
- 'endTypeVariables 1 < >',
+ 'endTypeVariable > 0 null',
+ 'endTypeVariables < >',
'beginFunctionType Function',
'handleNoType ',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
@@ -308,7 +308,7 @@
'handleType int )',
'handleNoName )',
'handleFormalParameterWithoutValue )',
- 'beginTypeVariables null null ) FormalParameterKind.mandatory '
+ 'endFormalParameter null null ) FormalParameterKind.mandatory '
'MemberKind.GeneralizedFunctionType',
'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
'endFunctionType Function m',
@@ -319,9 +319,10 @@
'endMetadataStar 0',
'handleIdentifier T typeVariableDeclaration',
'beginTypeVariable T',
+ 'handleTypeVariablesDefined T 1',
'handleNoType T',
- 'endTypeVariable > null',
- 'endTypeVariables 1 < >',
+ 'endTypeVariable > 0 null',
+ 'endTypeVariables < >',
'beginFunctionType Function',
'handleNoType ',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
@@ -333,7 +334,7 @@
'handleType int )',
'handleNoName )',
'handleFormalParameterWithoutValue )',
- 'beginTypeVariables null null ) FormalParameterKind.mandatory'
+ 'endFormalParameter null null ) FormalParameterKind.mandatory'
' MemberKind.GeneralizedFunctionType',
'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
'endFunctionType Function m',
@@ -688,18 +689,20 @@
'endMetadataStar 0',
'handleIdentifier T typeVariableDeclaration',
'beginTypeVariable T',
+ 'handleTypeVariablesDefined T 1',
'handleNoType T',
- 'endTypeVariable > null',
- 'endTypeVariables 1 < >',
+ 'endTypeVariable > 0 null',
+ 'endTypeVariables < >',
'beginFunctionType C',
'beginTypeVariables <',
'beginMetadataStar T',
'endMetadataStar 0',
'handleIdentifier T typeVariableDeclaration',
'beginTypeVariable T',
+ 'handleTypeVariablesDefined T 1',
'handleNoType T',
- 'endTypeVariable > null',
- 'endTypeVariables 1 < >',
+ 'endTypeVariable > 0 null',
+ 'endTypeVariables < >',
'beginFunctionType C',
'handleIdentifier C prefixedTypeReference',
'handleIdentifier a typeReferenceContinuation',
@@ -719,7 +722,7 @@
'handleType int x',
'handleIdentifier x formalParameterDeclaration',
'handleFormalParameterWithoutValue )',
- 'beginTypeVariables null null x FormalParameterKind.mandatory '
+ 'endFormalParameter null null x FormalParameterKind.mandatory '
'MemberKind.GeneralizedFunctionType',
'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
'endFunctionType Function Function',
@@ -732,7 +735,7 @@
'handleType int x',
'handleIdentifier x formalParameterDeclaration',
'handleFormalParameterWithoutValue )',
- 'beginTypeVariables null null x FormalParameterKind.mandatory '
+ 'endFormalParameter null null x FormalParameterKind.mandatory '
'MemberKind.GeneralizedFunctionType',
'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
'endFunctionType Function ',
@@ -867,9 +870,10 @@
'endMetadataStar 0',
'handleIdentifier T typeVariableDeclaration',
'beginTypeVariable T',
+ 'handleTypeVariablesDefined T 1',
'handleNoType T',
- 'endTypeVariable > null',
- 'endTypeVariables 1 < >',
+ 'endTypeVariable > 0 null',
+ 'endTypeVariables < >',
]);
expect(listener.errors, isNull);
}
@@ -1045,15 +1049,16 @@
'endMetadataStar 0',
'handleIdentifier S typeVariableDeclaration',
'beginTypeVariable S',
- 'handleNoType S',
- 'endTypeVariable , null',
'beginMetadataStar T',
'endMetadataStar 0',
'handleIdentifier T typeVariableDeclaration',
'beginTypeVariable T',
+ 'handleTypeVariablesDefined T 2',
'handleNoType T',
- 'endTypeVariable > null',
- 'endTypeVariables 2 < >',
+ 'endTypeVariable > 1 null',
+ 'handleNoType S',
+ 'endTypeVariable , 0 null',
+ 'endTypeVariables < >',
]);
expectComplexTypeParam('<S extends T>', expectedCalls: [
'beginTypeVariables <',
@@ -1061,11 +1066,12 @@
'endMetadataStar 0',
'handleIdentifier S typeVariableDeclaration',
'beginTypeVariable S',
+ 'handleTypeVariablesDefined T 1',
'handleIdentifier T typeReference',
'handleNoTypeArguments >',
'handleType T >',
- 'endTypeVariable > extends',
- 'endTypeVariables 1 < >',
+ 'endTypeVariable > 0 extends',
+ 'endTypeVariables < >',
]);
expectComplexTypeParam('<S super T>', expectedCalls: [
'beginTypeVariables <',
@@ -1073,11 +1079,12 @@
'endMetadataStar 0',
'handleIdentifier S typeVariableDeclaration',
'beginTypeVariable S',
+ 'handleTypeVariablesDefined T 1',
'handleIdentifier T typeReference',
'handleNoTypeArguments >',
'handleType T >',
- 'endTypeVariable > super',
- 'endTypeVariables 1 < >',
+ 'endTypeVariable > 0 super',
+ 'endTypeVariables < >',
]);
expectComplexTypeParam('<S extends List<T>>', expectedCalls: [
'beginTypeVariables <',
@@ -1085,6 +1092,7 @@
'endMetadataStar 0',
'handleIdentifier S typeVariableDeclaration',
'beginTypeVariable S',
+ 'handleTypeVariablesDefined > 1',
'handleIdentifier List typeReference',
'beginTypeArguments <',
'handleIdentifier T typeReference',
@@ -1092,8 +1100,8 @@
'handleType T >',
'endTypeArguments 1 < >',
'handleType List >',
- 'endTypeVariable > extends',
- 'endTypeVariables 1 < >',
+ 'endTypeVariable > 0 extends',
+ 'endTypeVariables < >',
]);
expectComplexTypeParam('<R, S extends void Function()>', expectedCalls: [
'beginTypeVariables <',
@@ -1101,20 +1109,21 @@
'endMetadataStar 0',
'handleIdentifier R typeVariableDeclaration',
'beginTypeVariable R',
- 'handleNoType R',
- 'endTypeVariable , null',
'beginMetadataStar S',
'endMetadataStar 0',
'handleIdentifier S typeVariableDeclaration',
'beginTypeVariable S',
+ 'handleTypeVariablesDefined ) 2',
'handleNoTypeVariables (',
'beginFunctionType void',
'handleVoidKeyword void',
'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
'endFormalParameters 0 ( ) MemberKind.GeneralizedFunctionType',
'endFunctionType Function >',
- 'endTypeVariable > extends',
- 'endTypeVariables 2 < >',
+ 'endTypeVariable > 1 extends',
+ 'handleNoType R',
+ 'endTypeVariable , 0 null',
+ 'endTypeVariables < >',
]);
expectComplexTypeParam('<@A S,T>', expectedCalls: [
'beginTypeVariables <',
@@ -1127,15 +1136,16 @@
'endMetadataStar 1',
'handleIdentifier S typeVariableDeclaration',
'beginTypeVariable S',
- 'handleNoType S',
- 'endTypeVariable , null',
'beginMetadataStar T',
'endMetadataStar 0',
'handleIdentifier T typeVariableDeclaration',
'beginTypeVariable T',
+ 'handleTypeVariablesDefined T 2',
'handleNoType T',
- 'endTypeVariable > null',
- 'endTypeVariables 2 < >',
+ 'endTypeVariable > 1 null',
+ 'handleNoType S',
+ 'endTypeVariable , 0 null',
+ 'endTypeVariables < >',
]);
expectComplexTypeParam('<@A() S,T>', expectedCalls: [
'beginTypeVariables <',
@@ -1149,15 +1159,16 @@
'endMetadataStar 1',
'handleIdentifier S typeVariableDeclaration',
'beginTypeVariable S',
- 'handleNoType S',
- 'endTypeVariable , null',
'beginMetadataStar T',
'endMetadataStar 0',
'handleIdentifier T typeVariableDeclaration',
'beginTypeVariable T',
+ 'handleTypeVariablesDefined T 2',
'handleNoType T',
- 'endTypeVariable > null',
- 'endTypeVariables 2 < >',
+ 'endTypeVariable > 1 null',
+ 'handleNoType S',
+ 'endTypeVariable , 0 null',
+ 'endTypeVariables < >',
]);
expectComplexTypeParam('<@A() @B S,T>', expectedCalls: [
'beginTypeVariables <',
@@ -1176,15 +1187,16 @@
'endMetadataStar 2',
'handleIdentifier S typeVariableDeclaration',
'beginTypeVariable S',
- 'handleNoType S',
- 'endTypeVariable , null',
'beginMetadataStar T',
'endMetadataStar 0',
'handleIdentifier T typeVariableDeclaration',
'beginTypeVariable T',
+ 'handleTypeVariablesDefined T 2',
'handleNoType T',
- 'endTypeVariable > null',
- 'endTypeVariables 2 < >',
+ 'endTypeVariable > 1 null',
+ 'handleNoType S',
+ 'endTypeVariable , 0 null',
+ 'endTypeVariables < >',
]);
}
@@ -1197,9 +1209,10 @@
'endMetadataStar 0',
'handleIdentifier S typeVariableDeclaration',
'beginTypeVariable S',
+ 'handleTypeVariablesDefined S 1',
'handleNoType S',
- 'endTypeVariable Function null',
- 'endTypeVariables 1 < >',
+ 'endTypeVariable Function 0 null',
+ 'endTypeVariables < >',
]);
expectComplexTypeParam('<void Function()>', expectedErrors: [
error(codeExpectedIdentifier, 1, 4),
@@ -1210,9 +1223,10 @@
'endMetadataStar 0',
'handleIdentifier typeVariableDeclaration',
'beginTypeVariable ',
+ 'handleTypeVariablesDefined 1',
'handleNoType ',
- 'endTypeVariable void null',
- 'endTypeVariables 1 < >',
+ 'endTypeVariable void 0 null',
+ 'endTypeVariables < >',
]);
expectComplexTypeParam('<S<T>>', expectedErrors: [
error(codeUnexpectedToken, 2, 1),
@@ -1222,9 +1236,10 @@
'endMetadataStar 0',
'handleIdentifier S typeVariableDeclaration',
'beginTypeVariable S',
+ 'handleTypeVariablesDefined S 1',
'handleNoType S',
- 'endTypeVariable < null',
- 'endTypeVariables 1 < >',
+ 'endTypeVariable < 0 null',
+ 'endTypeVariables < >',
]);
expectComplexTypeParam('<S T>', inDeclaration: true, expectedErrors: [
error(codeExpectedButGot, 3, 1),
@@ -1235,6 +1250,95 @@
expectComplexTypeParam('<@Foo S',
inDeclaration: true, expectedErrors: [error(codeExpectedButGot, 7, 0)]);
}
+
+ void test_computeTypeParam_31846() {
+ expectComplexTypeParam('<T extends Comparable<T>>', expectedCalls: [
+ 'beginTypeVariables <',
+ 'beginMetadataStar T',
+ 'endMetadataStar 0',
+ 'handleIdentifier T typeVariableDeclaration',
+ 'beginTypeVariable T',
+ 'handleTypeVariablesDefined > 1',
+ 'handleIdentifier Comparable typeReference',
+ 'beginTypeArguments <',
+ 'handleIdentifier T typeReference',
+ 'handleNoTypeArguments >',
+ 'handleType T >',
+ 'endTypeArguments 1 < >',
+ 'handleType Comparable >',
+ 'endTypeVariable > 0 extends',
+ 'endTypeVariables < >',
+ ]);
+ expectComplexTypeParam('<T extends Comparable<S>, S>', expectedCalls: [
+ 'beginTypeVariables <',
+ 'beginMetadataStar T',
+ 'endMetadataStar 0',
+ 'handleIdentifier T typeVariableDeclaration',
+ 'beginTypeVariable T',
+ 'beginMetadataStar S',
+ 'endMetadataStar 0',
+ 'handleIdentifier S typeVariableDeclaration',
+ 'beginTypeVariable S',
+ 'handleTypeVariablesDefined S 2',
+ 'handleNoType S',
+ 'endTypeVariable > 1 null',
+ 'handleIdentifier Comparable typeReference',
+ 'beginTypeArguments <',
+ 'handleIdentifier S typeReference',
+ 'handleNoTypeArguments >',
+ 'handleType S >',
+ 'endTypeArguments 1 < >',
+ 'handleType Comparable ,',
+ 'endTypeVariable , 0 extends',
+ 'endTypeVariables < >'
+ ]);
+ expectComplexTypeParam('<T extends Function(T)>', expectedCalls: [
+ 'beginTypeVariables <',
+ 'beginMetadataStar T',
+ 'endMetadataStar 0',
+ 'handleIdentifier T typeVariableDeclaration',
+ 'beginTypeVariable T',
+ 'handleTypeVariablesDefined ) 1',
+ 'handleNoTypeVariables (',
+ 'beginFunctionType Function',
+ 'handleNoType extends',
+ 'beginFormalParameters ( MemberKind.GeneralizedFunctionType',
+ 'beginMetadataStar T',
+ 'endMetadataStar 0',
+ 'beginFormalParameter T MemberKind.GeneralizedFunctionType',
+ 'handleIdentifier T typeReference',
+ 'handleNoTypeArguments )',
+ 'handleType T )',
+ 'handleNoName )',
+ 'handleFormalParameterWithoutValue )',
+ 'endFormalParameter null null ) FormalParameterKind.mandatory MemberKind.GeneralizedFunctionType',
+ 'endFormalParameters 1 ( ) MemberKind.GeneralizedFunctionType',
+ 'endFunctionType Function >',
+ 'endTypeVariable > 0 extends',
+ 'endTypeVariables < >'
+ ]);
+ expectComplexTypeParam('<T extends List<List<T>>>', expectedCalls: [
+ 'beginTypeVariables <',
+ 'beginMetadataStar T',
+ 'endMetadataStar 0',
+ 'handleIdentifier T typeVariableDeclaration',
+ 'beginTypeVariable T',
+ 'handleTypeVariablesDefined >> 1',
+ 'handleIdentifier List typeReference',
+ 'beginTypeArguments <',
+ 'handleIdentifier List typeReference',
+ 'beginTypeArguments <',
+ 'handleIdentifier T typeReference',
+ 'handleNoTypeArguments >',
+ 'handleType T >',
+ 'endTypeArguments 1 < >',
+ 'handleType List >',
+ 'endTypeArguments 1 < >',
+ 'handleType List >',
+ 'endTypeVariable > 0 extends',
+ 'endTypeVariables < >'
+ ]);
+ }
}
void expectInfo(expectedInfo, String source, {bool required}) {
@@ -1314,18 +1418,7 @@
expectEnd(expectedAfter, actualEnd);
if (expectedCalls != null) {
- try {
- expect(listener.calls, expectedCalls, reason: source);
- } catch (e) {
- TypeInfoListener listener2 = new TypeInfoListener();
- new Parser(listener2).parseType(start, TypeContinuation.Required);
- print('[');
- for (String call in listener2.calls) {
- print("'$call',");
- }
- print(']');
- rethrow;
- }
+ expect(listener.calls, expectedCalls, reason: source);
}
expect(listener.errors, expectedErrors, reason: source);
return typeInfo;
@@ -1356,18 +1449,7 @@
expectEnd(expectedAfter, actualEnd);
if (expectedCalls != null) {
- try {
- expect(listener.calls, expectedCalls, reason: source);
- } catch (e) {
- TypeInfoListener listener2 = new TypeInfoListener();
- new Parser(listener2).parseTypeArgumentsOpt(start);
- print('Events from parseTypeArgumentsOpt: [');
- for (String call in listener2.calls) {
- print(" '$call',");
- }
- print(']');
- rethrow;
- }
+ expect(listener.calls, expectedCalls, reason: source);
}
expect(listener.errors, expectedErrors, reason: source);
}
@@ -1397,18 +1479,7 @@
expectEnd(expectedAfter, actualEnd);
if (expectedCalls != null) {
- try {
- expect(listener.calls, expectedCalls, reason: source);
- } catch (e) {
- TypeInfoListener listener2 = new TypeInfoListener(metadataAllowed: true);
- new Parser(listener2).parseTypeVariablesOpt(start);
- print('Events from parseTypeVariablesOpt: [');
- for (String call in listener2.calls) {
- print(" '$call',");
- }
- print(']');
- rethrow;
- }
+ expect(listener.calls, expectedCalls, reason: source);
}
expect(listener.errors, expectedErrors, reason: source);
}
@@ -1513,8 +1584,8 @@
}
@override
- void beginTypeVariable(Token name) {
- calls.add('beginTypeVariable $name');
+ void beginTypeVariable(Token token) {
+ calls.add('beginTypeVariable $token');
}
@override
@@ -1540,7 +1611,7 @@
@override
void endFormalParameter(Token thisKeyword, Token periodAfterThis,
Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
- calls.add('beginTypeVariables $thisKeyword $periodAfterThis '
+ calls.add('endFormalParameter $thisKeyword $periodAfterThis '
'$nameToken $kind $memberKind');
}
@@ -1569,13 +1640,13 @@
}
@override
- void endTypeVariable(Token token, Token extendsOrSuper) {
- calls.add('endTypeVariable $token $extendsOrSuper');
+ void endTypeVariable(Token token, int index, Token extendsOrSuper) {
+ calls.add('endTypeVariable $token $index $extendsOrSuper');
}
@override
- void endTypeVariables(int count, Token beginToken, Token endToken) {
- calls.add('endTypeVariables $count $beginToken $endToken');
+ void endTypeVariables(Token beginToken, Token endToken) {
+ calls.add('endTypeVariables $beginToken $endToken');
}
@override
@@ -1636,6 +1707,11 @@
}
@override
+ void handleTypeVariablesDefined(Token token, int count) {
+ calls.add('handleTypeVariablesDefined $token $count');
+ }
+
+ @override
void handleVoidKeyword(Token token) {
calls.add('handleVoidKeyword $token');
}
diff --git a/pkg/front_end/test/fasta/unlinked_scope_test.dart b/pkg/front_end/test/fasta/unlinked_scope_test.dart
index 1f6c28f..3b1fd5e 100644
--- a/pkg/front_end/test/fasta/unlinked_scope_test.dart
+++ b/pkg/front_end/test/fasta/unlinked_scope_test.dart
@@ -57,7 +57,7 @@
KernelProcedureBuilder mockProcedure(String name) {
return new KernelProcedureBuilder(null, 0, null, name, null, null,
- ProcedureKind.Getter, this, -1, -1, -1);
+ ProcedureKind.Getter, this, -1, -1, -1, -1);
}
}
diff --git a/pkg/front_end/test/incremental_load_from_dill_test.dart b/pkg/front_end/test/incremental_load_from_dill_test.dart
index 9e14f0e..45c3553 100644
--- a/pkg/front_end/test/incremental_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_test.dart
@@ -36,7 +36,7 @@
import "package:testing/testing.dart"
show Chain, ChainContext, Result, Step, TestDescription, runMe;
-import "package:yaml/yaml.dart" show YamlMap, loadYamlNode;
+import "package:yaml/yaml.dart" show YamlList, YamlMap, loadYamlNode;
import "incremental_utils.dart" as util;
@@ -115,10 +115,11 @@
}
}
-Future<Null> basicTest(Map<String, String> sourceFiles, String entryPoint,
- bool strong, List<String> invalidate, Directory outDir) async {
+Future<Null> basicTest(YamlMap sourceFiles, String entryPoint, bool strong,
+ YamlList invalidate, Directory outDir) async {
Uri entryPointUri = outDir.uri.resolve(entryPoint);
- Set<String> invalidateFilenames = invalidate?.toSet() ?? new Set<String>();
+ Set<String> invalidateFilenames =
+ invalidate == null ? new Set<String>() : new Set<String>.from(invalidate);
List<Uri> invalidateUris = <Uri>[];
Uri packagesUri;
for (String filename in sourceFiles.keys) {
@@ -191,7 +192,7 @@
Map<String, String> sourceFiles;
CompilerOptions options;
TestIncrementalCompiler compiler;
- for (Map<String, dynamic> world in worlds) {
+ for (YamlMap world in worlds) {
bool brandNewWorld = true;
if (world["worldType"] == "updated") {
brandNewWorld = false;
@@ -212,7 +213,7 @@
if (brandNewWorld) {
sourceFiles = new Map<String, String>.from(world["sources"]);
} else {
- sourceFiles.addAll(world["sources"]);
+ sourceFiles.addAll(new Map<String, String>.from(world["sources"]));
}
Uri packagesUri;
for (String filename in sourceFiles.keys) {
@@ -255,9 +256,12 @@
compiler = new TestIncrementalCompiler(options, entry, initializeFrom);
}
+ List<Uri> invalidated = new List<Uri>();
if (world["invalidate"] != null) {
for (String filename in world["invalidate"]) {
- compiler.invalidate(base.resolve(filename));
+ Uri uri = base.resolve(filename);
+ invalidated.add(uri);
+ compiler.invalidate(uri);
}
}
@@ -282,18 +286,20 @@
"$expectInitializeFromDill but was ${compiler.initializedFromDill}";
}
if (world["checkInvalidatedFiles"] != false) {
+ Set<Uri> filteredInvalidated =
+ compiler.getFilteredInvalidatedImportUrisForTesting(invalidated);
if (world["invalidate"] != null) {
- Expect.equals(world["invalidate"].length,
- compiler.invalidatedImportUrisForTesting?.length ?? 0);
+ Expect.equals(
+ world["invalidate"].length, filteredInvalidated?.length ?? 0);
List expectedInvalidatedUri = world["expectedInvalidatedUri"];
if (expectedInvalidatedUri != null) {
Expect.setEquals(
expectedInvalidatedUri
.map((s) => Uri.parse(substituteVariables(s, base))),
- compiler.invalidatedImportUrisForTesting);
+ filteredInvalidated);
}
} else {
- Expect.isNull(compiler.invalidatedImportUrisForTesting);
+ Expect.isNull(filteredInvalidated);
Expect.isNull(world["expectedInvalidatedUri"]);
}
}
@@ -313,7 +319,7 @@
}
void performErrorAndWarningCheck(
- Map<String, dynamic> world,
+ YamlMap world,
bool gotError,
List<String> formattedErrors,
bool gotWarning,
@@ -388,8 +394,10 @@
bool result = compiler.initializedFromDill;
new File.fromUri(output)
.writeAsBytesSync(util.postProcess(initializedComponent));
- int actuallyInvalidatedCount =
- compiler.invalidatedImportUrisForTesting?.length ?? 0;
+ int actuallyInvalidatedCount = compiler
+ .getFilteredInvalidatedImportUrisForTesting(invalidateUris)
+ ?.length ??
+ 0;
if (result && actuallyInvalidatedCount < invalidateUris.length) {
Expect.fail("Expected at least ${invalidateUris.length} invalidated uris, "
"got $actuallyInvalidatedCount");
@@ -409,8 +417,10 @@
Component partialComponent = await compiler.computeDelta();
util.throwOnEmptyMixinBodies(partialComponent);
- actuallyInvalidatedCount =
- (compiler.invalidatedImportUrisForTesting?.length ?? 0);
+ actuallyInvalidatedCount = (compiler
+ .getFilteredInvalidatedImportUrisForTesting(invalidateUris)
+ ?.length ??
+ 0);
if (actuallyInvalidatedCount < invalidateUris.length) {
Expect.fail("Expected at least ${invalidateUris.length} invalidated uris, "
"got $actuallyInvalidatedCount");
@@ -441,8 +451,28 @@
class TestIncrementalCompiler extends IncrementalCompiler {
Set<Uri> invalidatedImportUrisForTesting;
+ final Uri entryPoint;
- TestIncrementalCompiler(CompilerOptions options, Uri entryPoint,
+ /// Filter out the automatically added entryPoint, unless it's explicitly
+ /// specified as being invalidated.
+ /// This is not perfect, but works for what it's currently used for.
+ Set<Uri> getFilteredInvalidatedImportUrisForTesting(
+ List<Uri> invalidatedUris) {
+ if (invalidatedImportUrisForTesting == null) return null;
+ Set<String> invalidatedFilenames =
+ invalidatedUris.map((uri) => uri.pathSegments.last).toSet();
+ if (invalidatedFilenames.contains(entryPoint.pathSegments.last)) {
+ return invalidatedImportUrisForTesting;
+ }
+
+ Set<Uri> result = new Set<Uri>();
+ for (Uri uri in invalidatedImportUrisForTesting) {
+ if (invalidatedFilenames.contains(uri.pathSegments.last)) result.add(uri);
+ }
+ return result;
+ }
+
+ TestIncrementalCompiler(CompilerOptions options, this.entryPoint,
[Uri initializeFrom])
: super(new CompilerContext(new ProcessedOptions(options, [entryPoint])),
initializeFrom);
diff --git a/pkg/front_end/test/summary_generator_test.dart b/pkg/front_end/test/summary_generator_test.dart
index 3588ea8..e705c97 100644
--- a/pkg/front_end/test/summary_generator_test.dart
+++ b/pkg/front_end/test/summary_generator_test.dart
@@ -14,9 +14,12 @@
var summary = await summarize(['a.dart'], allSources);
var component = loadComponentFromBytes(summary);
- // Note: the kernel representation always has a null key in the map,
- // but otherwise no other data is included here.
- expect(component.uriToSource.keys.single, null);
+ // Note: the kernel representation always includes the Uri entries, but
+ // doesn't include the actual source here.
+ for (Source source in component.uriToSource.values) {
+ expect(source.source.length, 0);
+ expect(source.lineStarts.length, 0);
+ }
});
test('summary includes declarations, but no method bodies', () async {
diff --git a/pkg/front_end/testcases/compile.status b/pkg/front_end/testcases/compile.status
index 1623e1d..bdcce31 100644
--- a/pkg/front_end/testcases/compile.status
+++ b/pkg/front_end/testcases/compile.status
@@ -45,6 +45,10 @@
inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1: Fail
inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2: Fail
+instantiate_to_bound/body_typedef_super_bounded_type: Fail # Issue 33444
+instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # May be related to Issue 33479
+instantiate_to_bound/typedef_super_bounded_type: Fail # Issue 33444
+
rasta/abstract_constructor: Fail
rasta/bad_constructor_redirection: Fail
rasta/bad_continue: Fail
@@ -102,6 +106,7 @@
regress/issue_29976: RuntimeError # Issue 29976.
regress/issue_29982: Fail # Issue 29982.
regress/issue_30836: RuntimeError # Issue 30836.
+regress/issue_33452: RuntimeError # Test has an intentional error
runtime_checks/implicit_downcast_constructor_initializer: RuntimeError # Test exercises strong mode semantics
runtime_checks/implicit_downcast_do: RuntimeError # Test exercises strong mode semantics
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.expect
deleted file mode 100644
index 9471d94..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<U extends (U) → dynamic = dynamic> = (U) → dynamic;
-class C extends core::Object {
- synthetic constructor •() → void
- : super core::Object::•()
- ;
- method foo() → dynamic {
- (dynamic) → dynamic b;
- }
-}
-static method main() → dynamic {
- (dynamic) → dynamic b;
-}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.transformed.expect
deleted file mode 100644
index 9471d94..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.direct.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<U extends (U) → dynamic = dynamic> = (U) → dynamic;
-class C extends core::Object {
- synthetic constructor •() → void
- : super core::Object::•()
- ;
- method foo() → dynamic {
- (dynamic) → dynamic b;
- }
-}
-static method main() → dynamic {
- (dynamic) → dynamic b;
-}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect
deleted file mode 100644
index f49fc49..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.outline.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<U extends (U) → dynamic = dynamic> = (U) → dynamic;
-class C extends core::Object {
- synthetic constructor •() → void
- ;
- method foo() → dynamic
- ;
-}
-static method main() → dynamic
- ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect
deleted file mode 100644
index 4024856..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object> = (T) → dynamic;
-typedef B<U extends (U) → dynamic> = (U) → dynamic;
-class C extends core::Object {
- synthetic constructor •() → void
- : super core::Object::•()
- ;
- method foo() → dynamic {
- ((core::Null) → dynamic) → dynamic b;
- }
-}
-static method main() → dynamic {
- ((core::Null) → dynamic) → dynamic b;
-}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart
new file mode 100644
index 0000000..b63fbe0
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart
@@ -0,0 +1,18 @@
+// 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.
+
+// This test checks that a compile-time error is generated when instantaite to
+// bound can't be applied due to raw types with non-simple bounds. The
+// non-simplicity in this test is due to having another raw type in the bound
+// that in its turn has type variables with non-simple bounds.
+
+class A<TypeT, TypeS extends TypeT> {}
+
+class B<TypeU extends A> {}
+
+class C<TypeV extends B> {}
+
+C c;
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.expect
new file mode 100644
index 0000000..cc42cff
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class C<TypeV extends self::B<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static field self::C<dynamic> c;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.transformed.expect
new file mode 100644
index 0000000..cc42cff
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.direct.transformed.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class C<TypeV extends self::B<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static field self::C<dynamic> c;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect
new file mode 100644
index 0000000..0c77499
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+class C<TypeV extends self::B<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static field self::C<dynamic> c;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect
new file mode 100644
index 0000000..a4a2719
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class C<TypeV extends self::B<dynamic> = self::B<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static field self::C<self::B<dynamic>> c;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:12:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'A' here.
+class B<TypeU extends A> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect
new file mode 100644
index 0000000..a4a2719
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class C<TypeV extends self::B<dynamic> = self::B<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static field self::C<self::B<dynamic>> c;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart:12:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'A' here.
+class B<TypeU extends A> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart
new file mode 100644
index 0000000..6d25acd
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart
@@ -0,0 +1,15 @@
+// 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.
+
+// This test checks that a compile-time error is generated when instantiate to
+// bound can't be applied due to raw types with non-simple bounds. The
+// non-simplicity in this test is due to dependencies between type variables.
+
+class A<TypeT, TypeS extends TypeT> {}
+
+class B<TypeU extends A> {}
+
+B b;
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.expect
new file mode 100644
index 0000000..dfed3ee
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static field self::B<dynamic> b;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.transformed.expect
new file mode 100644
index 0000000..dfed3ee
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.direct.transformed.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static field self::B<dynamic> b;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect
new file mode 100644
index 0000000..0108401
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static field self::B<dynamic> b;
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect
new file mode 100644
index 0000000..02c4ed2
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static field self::B<dynamic> b;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:11:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'A' here.
+class B<TypeU extends A> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect
new file mode 100644
index 0000000..02c4ed2
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<TypeT extends core::Object = dynamic, TypeS extends self::A::TypeT = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static field self::B<dynamic> b;
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart:11:9: Error: Generic type 'A' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'A' here.
+class B<TypeU extends A> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart
new file mode 100644
index 0000000..d3acace
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart
@@ -0,0 +1,13 @@
+// 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.
+
+// This test checks that the cyclic non-simplicity issues are detected in case
+// when both class declaration and a parametrized typedef participate in the
+// cycle.
+
+class Hest<TypeX extends Fisk> {}
+
+typedef Fisk = void Function<TypeY extends Hest>();
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.expect
new file mode 100644
index 0000000..967b3da
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk = <TypeY extends self::Hest<dynamic> = dynamic>() → void;
+class Hest<TypeX extends <TypeY extends self::Hest<dynamic> = dynamic>() → void = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.transformed.expect
new file mode 100644
index 0000000..967b3da
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.direct.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk = <TypeY extends self::Hest<dynamic> = dynamic>() → void;
+class Hest<TypeX extends <TypeY extends self::Hest<dynamic> = dynamic>() → void = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
new file mode 100644
index 0000000..6ac4a79
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk = <TypeY extends self::Hest<dynamic> = dynamic>() → void;
+class Hest<TypeX extends <TypeY extends self::Hest<dynamic> = dynamic>() → void = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart
new file mode 100644
index 0000000..5aebdc0
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that the cyclic non-simplicity detection works in case when
+// both class declarations and typedefs participate in the cycle.
+
+class Hest<TypeX extends Fisk> {}
+
+typedef void Fisk<TypeY extends Hest>();
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.expect
new file mode 100644
index 0000000..8ff7174
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk<TypeY extends self::Hest<dynamic> = dynamic> = () → void;
+class Hest<TypeX extends () → void = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.transformed.expect
new file mode 100644
index 0000000..8ff7174
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.direct.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk<TypeY extends self::Hest<dynamic> = dynamic> = () → void;
+class Hest<TypeX extends () → void = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
new file mode 100644
index 0000000..57f4622
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk<TypeY extends self::Hest<dynamic> = dynamic> = () → void;
+class Hest<TypeX extends () → void = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect
new file mode 100644
index 0000000..152e48b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk<TypeY extends self::Hest<() → void> = dynamic> = () → void;
+class Hest<TypeX extends () → void = () → void> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+typedef void Fisk<TypeY extends Hest>();
+ ^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: The typedef 'Fisk' has a reference to itself.
+typedef void Fisk<TypeY extends Hest>();
+ ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect
new file mode 100644
index 0000000..152e48b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Fisk<TypeY extends self::Hest<() → void> = dynamic> = () → void;
+class Hest<TypeX extends () → void = () → void> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: Generic type 'Fisk' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+typedef void Fisk<TypeY extends Hest>();
+ ^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart:10:14: Error: The typedef 'Fisk' has a reference to itself.
+typedef void Fisk<TypeY extends Hest>();
+ ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart
new file mode 100644
index 0000000..5df69f7
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart
@@ -0,0 +1,10 @@
+// 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.
+
+// This test checks that the use of a raw generic type in the bounds of its own
+// type variables is recognized and reported as a compile-time error.
+
+class Hest<TypeX extends Hest> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.expect
new file mode 100644
index 0000000..246facc
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.transformed.expect
new file mode 100644
index 0000000..246facc
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.direct.transformed.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect
new file mode 100644
index 0000000..0db76ef
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.expect
new file mode 100644
index 0000000..192b8ba
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+Try providing type arguments to 'Hest' here.
+class Hest<TypeX extends Hest> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.transformed.expect
new file mode 100644
index 0000000..192b8ba
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+Try providing type arguments to 'Hest' here.
+class Hest<TypeX extends Hest> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart
new file mode 100644
index 0000000..2703630
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart
@@ -0,0 +1,10 @@
+// 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.
+
+// This test checks that the error is reported for all type variables that
+// reference the raw generic type they are defined on.
+
+class Hest<TypeX extends Hest, TypeY extends Hest> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.expect
new file mode 100644
index 0000000..e96669a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.transformed.expect
new file mode 100644
index 0000000..e96669a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.direct.transformed.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect
new file mode 100644
index 0000000..6e46804
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.expect
new file mode 100644
index 0000000..8499ca8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+Try providing type arguments to 'Hest' here.
+class Hest<TypeX extends Hest, TypeY extends Hest> {}
+ ^^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:32: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+Try providing type arguments to 'Hest' here.
+class Hest<TypeX extends Hest, TypeY extends Hest> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.transformed.expect
new file mode 100644
index 0000000..8499ca8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+Try providing type arguments to 'Hest' here.
+class Hest<TypeX extends Hest, TypeY extends Hest> {}
+ ^^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart:8:32: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+Try providing type arguments to 'Hest' here.
+class Hest<TypeX extends Hest, TypeY extends Hest> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart
new file mode 100644
index 0000000..a72f472
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart
@@ -0,0 +1,11 @@
+// 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.
+
+// This test checks that the error message is not duplicated in case when the
+// raw generic type is used more than once in the bound of its own type
+// variable.
+
+class Hest<TypeX extends Map<Hest, Hest>> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.expect
new file mode 100644
index 0000000..9d87952
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.transformed.expect
new file mode 100644
index 0000000..9d87952
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.direct.transformed.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect
new file mode 100644
index 0000000..5abeb79
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.expect
new file mode 100644
index 0000000..6760128
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart:9:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+Try providing type arguments to 'Hest' here.
+class Hest<TypeX extends Map<Hest, Hest>> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.transformed.expect
new file mode 100644
index 0000000..6760128
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.transformed.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart:9:12: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables.
+Try providing type arguments to 'Hest' here.
+class Hest<TypeX extends Map<Hest, Hest>> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart
new file mode 100644
index 0000000..91a3b2b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test checks that same generic type passed as a type argument to itself
+// doesn't cause issues in the mechanism for detection of non-simple bounds.
+
+class Hest<TypeX> {}
+
+class Fisk<TypeY extends Hest<Hest<Object>>> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.expect
new file mode 100644
index 0000000..cc9040b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.transformed.expect
new file mode 100644
index 0000000..cc9040b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.direct.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect
new file mode 100644
index 0000000..65514b1
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.expect
new file mode 100644
index 0000000..a2ec755
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = self::Hest<self::Hest<core::Object>>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.transformed.expect
new file mode 100644
index 0000000..a2ec755
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends core::Object = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = self::Hest<self::Hest<core::Object>>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart
new file mode 100644
index 0000000..e7415fe
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart
@@ -0,0 +1,13 @@
+// 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.
+
+// This test checks that an error is reported on all type variables that have a
+// raw generic type in their bounds in case this generic type has non-simple
+// bounds.
+
+class Hest<TypeX extends Hest<TypeX>> {}
+
+class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.expect
new file mode 100644
index 0000000..8b2d1c8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic, TypeZ extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.transformed.expect
new file mode 100644
index 0000000..8b2d1c8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.direct.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic, TypeZ extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect
new file mode 100644
index 0000000..731612d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic, TypeZ extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.expect
new file mode 100644
index 0000000..5ae9bde
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic, TypeZ extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Hest' here.
+class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+ ^^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:32: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Hest' here.
+class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.transformed.expect
new file mode 100644
index 0000000..5ae9bde
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic, TypeZ extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Hest' here.
+class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+ ^^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart:11:32: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Hest' here.
+class Fisk<TypeY extends Hest, TypeZ extends Hest> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart
new file mode 100644
index 0000000..696a47f
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart
@@ -0,0 +1,17 @@
+// 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.
+
+// This test checks that the use of a raw generic type with non-simple bounds in
+// a bound of a type variable is detected when that generic type comes from a
+// compiled .dill file.
+//
+// Note that the type variable of LinkedListEntry has non-simple bound because
+// it references itself.
+// https://api.dartlang.org/stable/1.24.3/dart-collection/LinkedListEntry-class.html
+
+import 'dart:collection';
+
+class Hest<X extends LinkedListEntry> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.expect
new file mode 100644
index 0000000..ae3f2f3
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+class Hest<X extends col::LinkedListEntry<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.transformed.expect
new file mode 100644
index 0000000..ae3f2f3
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.direct.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+class Hest<X extends col::LinkedListEntry<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect
new file mode 100644
index 0000000..910725d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+class Hest<X extends col::LinkedListEntry<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect
new file mode 100644
index 0000000..6b7a848
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+class Hest<X extends col::LinkedListEntry<col::LinkedListEntry<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Generic type 'LinkedListEntry' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'LinkedListEntry' here.
+class Hest<X extends LinkedListEntry> {}
+ ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect
new file mode 100644
index 0000000..6b7a848
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:collection" as col;
+import "dart:core" as core;
+
+class Hest<X extends col::LinkedListEntry<col::LinkedListEntry<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart:15:12: Error: Generic type 'LinkedListEntry' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'LinkedListEntry' here.
+class Hest<X extends LinkedListEntry> {}
+ ^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart
new file mode 100644
index 0000000..18d2e53
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart
@@ -0,0 +1,13 @@
+// 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.
+
+// This test checks that the use of generic function types in the bound of a
+// type variable is detected early and doesn't cause issues to the mechanism for
+// detection of non-simple bounds.
+
+class Hest<TypeX extends Hest<TypeX>> {}
+
+class Fisk<TypeY extends Function<TypeZ extends Hest<Null>>(TypeZ)> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.expect
new file mode 100644
index 0000000..a5a23c8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.transformed.expect
new file mode 100644
index 0000000..a5a23c8
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.direct.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
new file mode 100644
index 0000000..f5b927f
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
new file mode 100644
index 0000000..372b447
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
new file mode 100644
index 0000000..372b447
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart
new file mode 100644
index 0000000..496b166
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart
@@ -0,0 +1,14 @@
+// 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.
+
+// This test checks that an error is reported on all raw generic types with
+// non-simple bounds used in the bound of the same type variable.
+
+class Hest<TypeX extends Hest<TypeX>> {}
+
+class Fisk<TypeY extends Fisk<TypeY>> {}
+
+class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.expect
new file mode 100644
index 0000000..1ebf46d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>, self::Fisk<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.transformed.expect
new file mode 100644
index 0000000..1ebf46d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.direct.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>, self::Fisk<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect
new file mode 100644
index 0000000..037cda9
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>, self::Fisk<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.expect
new file mode 100644
index 0000000..1e2ebae
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = self::Fisk<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Naebdyr<TypeZ extends core::Map<self::Hest<self::Hest<dynamic>>, self::Fisk<self::Fisk<dynamic>>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Hest' here.
+class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+ ^^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Fisk' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Fisk' here.
+class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.transformed.expect
new file mode 100644
index 0000000..1e2ebae
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = self::Fisk<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Naebdyr<TypeZ extends core::Map<self::Hest<self::Hest<dynamic>>, self::Fisk<self::Fisk<dynamic>>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Hest' here.
+class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+ ^^^^^", "pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart:12:15: Error: Generic type 'Fisk' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Fisk' here.
+class Naebdyr<TypeZ extends Map<Hest, Fisk>> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart
new file mode 100644
index 0000000..e2c8f9c
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart
@@ -0,0 +1,13 @@
+// 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.
+
+// This test checks that a cyclic dependence is not reported twice in case the
+// class declarations from the cycle are in different libraries, but have the
+// same name within their respective libraries.
+
+import './non_simple_many_libs_same_name_cycle_lib.dart' as lib;
+
+class Hest<TypeX extends lib.Hest> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.expect
new file mode 100644
index 0000000..0bdaa11
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "dart:core" as core;
+
+class Hest<TypeX extends non::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.transformed.expect
new file mode 100644
index 0000000..0bdaa11
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.direct.transformed.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "dart:core" as core;
+
+class Hest<TypeX extends non::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
new file mode 100644
index 0000000..b2d8428
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "dart:core" as core;
+
+class Hest<TypeX extends non::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
new file mode 100644
index 0000000..aea6b8d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "dart:core" as core;
+
+class Hest<TypeX extends non::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:7: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+class Hest<TypeX extends lib.Hest> {}
+ ^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
new file mode 100644
index 0000000..aea6b8d
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "./non_simple_many_libs_same_name_cycle_lib.dart" as non;
+import "dart:core" as core;
+
+class Hest<TypeX extends non::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart:11:7: Error: Generic type 'Hest' can't be used without type arguments in the bounds of its own type variables. It is referenced indirectly through 'Hest'.
+Try providing type arguments to 'Hest' here or to some other raw types in the bounds along the reference chain.
+class Hest<TypeX extends lib.Hest> {}
+ ^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart
new file mode 100644
index 0000000..a716476
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle_lib.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// This test checks that a cyclic dependence is not reported twice in case the
+// class declarations from the cycle are in different libraries, but have the
+// same name within their respective libraries.
+//
+// This file is the supplement library for
+// 'non_simple_many_libs_same_name_cycle.dart'.
+
+library non_simple_many_libs_same_name_cycle_lib;
+
+import './non_simple_many_libs_same_name_cycle.dart' as lib;
+
+class Hest<TypeY extends lib.Hest> {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart
new file mode 100644
index 0000000..dbedd5a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart
@@ -0,0 +1,13 @@
+// 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.
+
+// This test checks that the error message is not duplicated in the case when
+// the same raw generic type with non-simple bounds is used in the bound of a
+// type variable.
+
+class Hest<TypeX extends Hest<TypeX>> {}
+
+class Fisk<TypeY extends Map<Hest, Hest>> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.expect
new file mode 100644
index 0000000..2cc8768
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.transformed.expect
new file mode 100644
index 0000000..2cc8768
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.direct.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect
new file mode 100644
index 0000000..a3d3fb5
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+class Fisk<TypeY extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.expect
new file mode 100644
index 0000000..bf31ea9
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends core::Map<self::Hest<self::Hest<dynamic>>, self::Hest<self::Hest<dynamic>>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Hest' here.
+class Fisk<TypeY extends Map<Hest, Hest>> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.transformed.expect
new file mode 100644
index 0000000..bf31ea9
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends core::Map<self::Hest<self::Hest<dynamic>>, self::Hest<self::Hest<dynamic>>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Hest' here.
+class Fisk<TypeY extends Map<Hest, Hest>> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart
new file mode 100644
index 0000000..9e41974
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart
@@ -0,0 +1,15 @@
+// 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.
+
+// This test checks that in the case of an error on a class related to
+// non-simple bounds, the implied errors on other classes that reference the
+// erronious one in the bounds of their type variables is not reported.
+
+class Hest<TypeX extends Hest<TypeX>> {}
+
+class Fisk<TypeY extends Hest> {}
+
+class Naebdyr<TypeZ extends Fisk> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.expect
new file mode 100644
index 0000000..a2c2f96
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Naebdyr<TypeZ extends self::Fisk<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.transformed.expect
new file mode 100644
index 0000000..a2c2f96
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.direct.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Naebdyr<TypeZ extends self::Fisk<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect
new file mode 100644
index 0000000..e70601a
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+class Naebdyr<TypeZ extends self::Fisk<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.expect
new file mode 100644
index 0000000..c1297fa
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Naebdyr<TypeZ extends self::Fisk<dynamic> = self::Fisk<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Hest' here.
+class Fisk<TypeY extends Hest> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.transformed.expect
new file mode 100644
index 0000000..c1297fa
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Naebdyr<TypeZ extends self::Fisk<dynamic> = self::Fisk<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart:11:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Hest' here.
+class Fisk<TypeY extends Hest> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart
new file mode 100644
index 0000000..8dc56a0
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart
@@ -0,0 +1,14 @@
+// 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.
+
+// This test checks that an attempt to use a raw generic type with non-simple
+// bounds is detected and reported as a compile-time error in case the
+// non-simple bound is due to the use of the type variable from the same
+// declaration.
+
+class Hest<TypeX extends Hest<TypeX>> {}
+
+class Fisk<TypeY extends Hest> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.expect
new file mode 100644
index 0000000..ccff566
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.transformed.expect
new file mode 100644
index 0000000..ccff566
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.direct.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect
new file mode 100644
index 0000000..082d2fd
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.expect
new file mode 100644
index 0000000..67f553b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:12:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Hest' here.
+class Fisk<TypeY extends Hest> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.transformed.expect
new file mode 100644
index 0000000..67f553b
--- /dev/null
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Hest<TypeX extends self::Hest<self::Hest::TypeX> = self::Hest<dynamic>> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart:12:12: Error: Generic type 'Hest' can't be used without type arguments in a type variable bound.
+Try providing type arguments to 'Hest' here.
+class Fisk<TypeY extends Hest> {}
+ ^^^^^"]/* from null */;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.expect
deleted file mode 100644
index caa1662..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<S extends (S) → dynamic = dynamic> = (S) → dynamic;
-static field (dynamic) → dynamic b;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.transformed.expect
deleted file mode 100644
index caa1662..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.direct.transformed.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<S extends (S) → dynamic = dynamic> = (S) → dynamic;
-static field (dynamic) → dynamic b;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect
deleted file mode 100644
index 68eb853..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.outline.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<S extends (S) → dynamic = dynamic> = (S) → dynamic;
-static field (dynamic) → dynamic b;
-static method main() → dynamic
- ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect
deleted file mode 100644
index 7f1e93d..0000000
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef A<T extends core::Object> = (T) → dynamic;
-typedef B<S extends (S) → dynamic> = (S) → dynamic;
-static field ((core::Null) → dynamic) → dynamic b;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index 9cdafa9..1159e1b 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -252,3 +252,6 @@
rasta/issue_000047: Fail
rasta/native_is_illegal: Pass # Issue 29763
rasta/type_with_parse_error: Fail
+
+instantiate_to_bound/body_typedef_super_bounded_type: Fail # Issue 33444
+instantiate_to_bound/typedef_super_bounded_type: Fail # Issue 33444
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart b/pkg/front_end/testcases/regress/issue_33452.dart
new file mode 100644
index 0000000..faffe5d
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart
@@ -0,0 +1,10 @@
+// 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 ExistingClass {}
+
+main() {
+ var x = new ExistingClass.nonExistingConstructor();
+ x = new NonExistingClass();
+}
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect b/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect
new file mode 100644
index 0000000..3d768b8
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.direct.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {
+ dynamic x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+ x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#NonExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.direct.transformed.expect b/pkg/front_end/testcases/regress/issue_33452.dart.direct.transformed.expect
new file mode 100644
index 0000000..3d768b8
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.direct.transformed.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static method main() → dynamic {
+ dynamic x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+ x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#NonExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.outline.expect b/pkg/front_end/testcases/regress/issue_33452.dart.outline.expect
new file mode 100644
index 0000000..da89296
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+ synthetic constructor •() → void
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect b/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
new file mode 100644
index 0000000..71970d1
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_33452.dart:8:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+ var x = new ExistingClass.nonExistingConstructor();
+ ^^^^^^^^^^^^^^^^^^^^^^", "pkg/front_end/testcases/regress/issue_33452.dart:9:11: Error: Method not found: 'NonExistingClass'.
+ x = new NonExistingClass();
+ ^^^^^^^^^^^^^^^^"]/* from null */;
+static method main() → dynamic {
+ dynamic x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+ x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#NonExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_33452.dart.strong.transformed.expect
new file mode 100644
index 0000000..71970d1
--- /dev/null
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.strong.transformed.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class ExistingClass extends core::Object {
+ synthetic constructor •() → void
+ : super core::Object::•()
+ ;
+}
+static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/regress/issue_33452.dart:8:29: Error: Method not found: 'ExistingClass.nonExistingConstructor'.
+ var x = new ExistingClass.nonExistingConstructor();
+ ^^^^^^^^^^^^^^^^^^^^^^", "pkg/front_end/testcases/regress/issue_33452.dart:9:11: Error: Method not found: 'NonExistingClass'.
+ x = new NonExistingClass();
+ ^^^^^^^^^^^^^^^^"]/* from null */;
+static method main() → dynamic {
+ dynamic x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+ x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#NonExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+}
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index b0858b9..d0d42f8 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -112,8 +112,9 @@
inference_new/infer_field_getter_setter_mismatch: TypeCheckError
inference_new/infer_field_override_getter_overrides_setter: TypeCheckError
-instantiate_to_bound/typedef_super_bounded_type: Fail
-instantiate_to_bound/body_typedef_super_bounded_type: Fail
+instantiate_to_bound/body_typedef_super_bounded_type: Fail # Issue 33444
+instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: Crash # Issue 33479
+instantiate_to_bound/typedef_super_bounded_type: Fail # Issue 33444
rasta/abstract_constructor: Fail
rasta/bad_constructor_redirection: Fail
@@ -200,6 +201,7 @@
regress/issue_30836: RuntimeError # Issue 30836.
regress/issue_31184: TypeCheckError
regress/issue_31299: TypeCheckError
+regress/issue_33452: RuntimeError # Test has an intentional error
runtime_checks/forwarding_stub_with_default_values: RuntimeError # Bug 31027
runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 3159a05..eff9f14 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -131,7 +131,7 @@
type ComponentFile {
UInt32 magic = 0x90ABCDEF;
- UInt32 formatVersion = 7;
+ UInt32 formatVersion = 8;
Library[] libraries;
UriSource sourceMap;
List<CanonicalName> canonicalNames;
@@ -284,7 +284,8 @@
CanonicalNameReference canonicalName;
// An absolute path URI to the .dart file from which the class was created.
UriReference fileUri;
- FileOffset fileOffset;
+ FileOffset startFileOffset; // Offset of the start of the class including any annotations.
+ FileOffset fileOffset; // Offset of the name of the class.
FileOffset fileEndOffset;
Byte flags (levelBit0, levelBit1, isAbstract, isEnum, isAnonymousMixin,
isEliminatedMixin); // Where level is index into ClassLevel
@@ -328,7 +329,8 @@
Byte tag = 5;
CanonicalNameReference canonicalName;
UriReference fileUri;
- FileOffset fileOffset;
+ FileOffset startFileOffset; // Offset of the start of the constructor including any annotations.
+ FileOffset fileOffset; // Offset of the constructor name.
FileOffset fileEndOffset;
Byte flags (isConst, isExternal, isSynthetic);
Name name;
@@ -352,7 +354,8 @@
CanonicalNameReference canonicalName;
// An absolute path URI to the .dart file from which the class was created.
UriReference fileUri;
- FileOffset fileOffset;
+ FileOffset startFileOffset; // Offset of the start of the procedure including any annotations.
+ FileOffset fileOffset; // Offset of the procedure name.
FileOffset fileEndOffset;
Byte kind; // Index into the ProcedureKind enum above.
Byte flags (isStatic, isAbstract, isExternal, isConst, isForwardingStub,
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index f55c28f..959a84b 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -672,6 +672,15 @@
/// transform a mixin application to become a regular class, and vice versa.
@coq
class Class extends NamedNode implements FileUriNode {
+ /// Start offset of the class in the source file it comes from.
+ ///
+ /// Note that this includes annotations if any.
+ ///
+ /// Valid values are from 0 and up, or -1 ([TreeNode.noOffset]) if the file
+ /// start offset is not available (this is the default if none is specifically
+ /// set).
+ int startFileOffset = TreeNode.noOffset;
+
/// End offset in the source file it comes from. Valid values are from 0 and
/// up, or -1 ([TreeNode.noOffset]) if the file end offset is not available
/// (this is the default if none is specifically set).
@@ -973,9 +982,11 @@
@coq
abstract class Member extends NamedNode implements FileUriNode {
- /// End offset in the source file it comes from. Valid values are from 0 and
- /// up, or -1 ([TreeNode.noOffset]) if the file end offset is not available
- /// (this is the default if none is specifically set).
+ /// End offset in the source file it comes from.
+ ///
+ /// Valid values are from 0 and up, or -1 ([TreeNode.noOffset]) if the file
+ /// end offset is not available (this is the default if none is specifically
+ /// set).
int fileEndOffset = TreeNode.noOffset;
/// List of metadata annotations on the member.
@@ -1224,6 +1235,15 @@
///
/// For unnamed constructors, the name is an empty string (in a [Name]).
class Constructor extends Member {
+ /// Start offset of the constructor in the source file it comes from.
+ ///
+ /// Note that this includes annotations if any.
+ ///
+ /// Valid values are from 0 and up, or -1 ([TreeNode.noOffset]) if the file
+ /// start offset is not available (this is the default if none is specifically
+ /// set).
+ int startFileOffset = TreeNode.noOffset;
+
int flags = 0;
FunctionNode function;
List<Initializer> initializers;
@@ -1450,6 +1470,15 @@
/// except for the unary minus operator, whose name is `unary-`.
@coq
class Procedure extends Member {
+ /// Start offset of the function in the source file it comes from.
+ ///
+ /// Note that this includes annotations if any.
+ ///
+ /// Valid values are from 0 and up, or -1 ([TreeNode.noOffset]) if the file
+ /// start offset is not available (this is the default if none is specifically
+ /// set).
+ int startFileOffset = TreeNode.noOffset;
+
ProcedureKind kind;
int flags = 0;
// function is null if and only if abstract, external.
@@ -3170,6 +3199,10 @@
}
class IntLiteral extends BasicLiteral {
+ /// Note that this value holds a uint64 value.
+ /// E.g. "0x8000000000000000" will be saved as "-9223372036854775808" despite
+ /// technically (on some platforms, particularly Javascript) being positive.
+ /// If the number is meant to be negative it will be wrapped in a "unary-".
int value;
IntLiteral(this.value);
@@ -5171,7 +5204,7 @@
PrimitiveConstant(this.value);
- String toString() => '${this.runtimeType}($value)';
+ String toString() => '$value';
int get hashCode => value.hashCode;
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 56555cc..c088723 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -904,6 +904,7 @@
}
var fileUri = readUriReference();
+ node.startFileOffset = readOffset();
node.fileOffset = readOffset();
node.fileEndOffset = readOffset();
int flags = readByte();
@@ -1013,6 +1014,7 @@
node = new Constructor(null, reference: reference);
}
var fileUri = readUriReference();
+ var startFileOffset = readOffset();
var fileOffset = readOffset();
var fileEndOffset = readOffset();
var flags = readByte();
@@ -1034,6 +1036,7 @@
var transformerFlags = getAndResetTransformerFlags();
assert(((_) => true)(debugPath.removeLast()));
if (shouldWriteData) {
+ node.startFileOffset = startFileOffset;
node.fileOffset = fileOffset;
node.fileEndOffset = fileEndOffset;
node.flags = flags;
@@ -1057,6 +1060,7 @@
node = new Procedure(null, null, null, reference: reference);
}
var fileUri = readUriReference();
+ var startFileOffset = readOffset();
var fileOffset = readOffset();
var fileEndOffset = readOffset();
int kindIndex = readByte();
@@ -1081,6 +1085,7 @@
var transformerFlags = getAndResetTransformerFlags();
assert(((_) => true)(debugPath.removeLast()));
if (shouldWriteData) {
+ node.startFileOffset = startFileOffset;
node.fileOffset = fileOffset;
node.fileEndOffset = fileEndOffset;
node.kind = kind;
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index ed89e92..84a6e59 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -220,16 +220,9 @@
// Returns the new active file uri.
Uri writeUriReference(Uri uri) {
- if (_knownSourceUri.contains(uri)) {
- final int index = _sourceUriIndexer.put(uri);
- writeUInt30(index);
- return uri;
- } else {
- // This is equivalent to `index = _sourceUriIndexer[null];`.
- final int index = 0;
- writeUInt30(index);
- return null;
- }
+ final int index = _sourceUriIndexer.put(uri);
+ writeUInt30(index);
+ return uri;
}
void writeList<T>(List<T> items, void writeItem(T x)) {
@@ -496,8 +489,9 @@
Utf8Encoder utf8Encoder = const Utf8Encoder();
for (Uri uri in _sourceUriIndexer.index.keys) {
index[i] = getBufferOffset();
-
- Source source = uriToSource[uri] ?? new Source(<int>[], const <int>[]);
+ Source source =
+ (_knownSourceUri.contains(uri) ? uriToSource[uri] : null) ??
+ new Source(<int>[], const <int>[]);
writeByteList(utf8Encoder.convert(uri == null ? "" : "$uri"));
writeByteList(source.source);
@@ -746,8 +740,10 @@
final Uri activeFileUriSaved = _activeFileUri;
_activeFileUri = writeUriReference(node.fileUri);
+ writeOffset(node.startFileOffset);
writeOffset(node.fileOffset);
writeOffset(node.fileEndOffset);
+
writeByte(flags);
writeStringReference(node.name ?? '');
@@ -788,8 +784,10 @@
final Uri activeFileUriSaved = _activeFileUri;
_activeFileUri = writeUriReference(node.fileUri);
+ writeOffset(node.startFileOffset);
writeOffset(node.fileOffset);
writeOffset(node.fileEndOffset);
+
writeByte(node.flags);
writeName(node.name ?? _emptyName);
@@ -820,6 +818,7 @@
final Uri activeFileUriSaved = _activeFileUri;
_activeFileUri = writeUriReference(node.fileUri);
+ writeOffset(node.startFileOffset);
writeOffset(node.fileOffset);
writeOffset(node.fileEndOffset);
writeByte(node.kind.index);
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 9bb574b0..44eb262 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -135,7 +135,7 @@
/// Internal version of kernel binary format.
/// Bump it when making incompatible changes in kernel binaries.
/// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
- static const int BinaryFormatVersion = 7;
+ static const int BinaryFormatVersion = 8;
}
abstract class ConstantTag {
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index ab527e5..604208a 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -949,8 +949,27 @@
void _buildDeclaredMembers(Class classNode, _ClassInfo info) {
if (classNode.mixedInType != null) {
_ClassInfo mixedInfo = _infoFor[classNode.mixedInType.classNode];
- info.declaredGettersAndCalls = mixedInfo.declaredGettersAndCalls;
- info.declaredSetters = mixedInfo.declaredSetters;
+
+ List<Member> declaredGettersAndCalls = <Member>[];
+ for (Member mixinMember in mixedInfo.declaredGettersAndCalls) {
+ if (mixinMember is! Procedure ||
+ (mixinMember is Procedure &&
+ !mixinMember.isNoSuchMethodForwarder)) {
+ declaredGettersAndCalls.add(mixinMember);
+ }
+ }
+
+ List<Member> declaredSetters = <Member>[];
+ for (Member mixinMember in mixedInfo.declaredSetters) {
+ if (mixinMember is! Procedure ||
+ (mixinMember is Procedure &&
+ !mixinMember.isNoSuchMethodForwarder)) {
+ declaredSetters.add(mixinMember);
+ }
+ }
+
+ info.declaredGettersAndCalls = declaredGettersAndCalls;
+ info.declaredSetters = declaredSetters;
} else {
var members = info.declaredGettersAndCalls = <Member>[];
var setters = info.declaredSetters = <Member>[];
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 91f5fd6..f26f83c 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -406,7 +406,8 @@
..annotations = cloneAnnotations && !node.annotations.isEmpty
? node.annotations.map(clone).toList()
: const <Expression>[]
- ..flags = node.flags;
+ ..flags = node.flags
+ ..fileEqualsOffset = _cloneFileOffset(node.fileEqualsOffset);
}
visitFunctionDeclaration(FunctionDeclaration node) {
@@ -440,6 +441,7 @@
..annotations = cloneAnnotations && !node.annotations.isEmpty
? node.annotations.map(clone).toList()
: const <Expression>[]
+ ..startFileOffset = _cloneFileOffset(node.startFileOffset)
..fileOffset = _cloneFileOffset(node.fileOffset)
..fileEndOffset = _cloneFileOffset(node.fileEndOffset)
..flags = node.flags;
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index 6b03c7e..76fb9ff 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -192,6 +192,13 @@
// we should at least unify the VM and non-VM variants.
bool get nativeExtensionExpectsString => false;
+ /// Whether integer literals that cannot be represented exactly on the web
+ /// (i.e. in Javascript) should cause an error to be issued.
+ /// An example of such a number is `2^53 + 1` where in Javascript - because
+ /// integers are represented as doubles
+ /// `Math.pow(2, 53) = Math.pow(2, 53) + 1`.
+ bool get errorOnUnexactWebIntLiterals => false;
+
/// Builds an expression that instantiates an [Invocation] that can be passed
/// to [noSuchMethod].
Expression instantiateInvocation(CoreTypes coreTypes, Expression receiver,
diff --git a/pkg/kernel/lib/transformations/constants.dart b/pkg/kernel/lib/transformations/constants.dart
index 4e62d58..54d62ed 100644
--- a/pkg/kernel/lib/transformations/constants.dart
+++ b/pkg/kernel/lib/transformations/constants.dart
@@ -413,6 +413,14 @@
}
}
+ Constant runInsideContextIfNoContext(TreeNode node, Constant fun()) {
+ if (contextChain.isEmpty) {
+ return runInsideContext(node, fun);
+ } else {
+ return fun();
+ }
+ }
+
pushContext(TreeNode contextNode) {
contextChain.add(contextNode);
}
@@ -533,11 +541,13 @@
// Start building a new instance.
return withNewInstanceBuilder(klass, typeArguments, () {
- // "Run" the constructor (and any super constructor calls), which will
- // initialize the fields of the new instance.
- handleConstructorInvocation(
- constructor, typeArguments, positionals, named);
- return canonicalize(instanceBuilder.buildInstance());
+ return runInsideContextIfNoContext(node, () {
+ // "Run" the constructor (and any super constructor calls), which will
+ // initialize the fields of the new instance.
+ handleConstructorInvocation(
+ constructor, typeArguments, positionals, named);
+ return canonicalize(instanceBuilder.buildInstance());
+ });
});
}
@@ -901,13 +911,19 @@
// TODO(kustermann): The heuristic of allowing all [VariableGet]s on [Let]
// variables might allow more than it should.
final VariableDeclaration variable = node.variable;
- if (!variable.isConst &&
- !_isFormalParameter(variable) &&
- variable.parent is! Let) {
- throw new Exception('The front-end should ensure we do not encounter a '
- 'variable get of a non-const variable.');
+ if (variable.parent is Let || _isFormalParameter(variable)) {
+ final Constant constant = env.lookupVariable(node.variable);
+ if (constant == null) {
+ errorReporter.nonConstantVariableGet(contextChain, node, variable.name);
+ throw const _AbortCurrentEvaluation();
+ }
+ return constant;
}
- return env.lookupVariable(node.variable);
+ if (variable.isConst) {
+ return evaluate(variable.initializer);
+ }
+ throw new Exception('The front-end should ensure we do not encounter a '
+ 'variable get of a non-const variable.');
}
visitStaticGet(StaticGet node) {
@@ -1224,9 +1240,7 @@
}
Constant lookupVariable(VariableDeclaration variable) {
- final Constant value = _variables[variable];
- assert(value != null);
- return value;
+ return _variables[variable];
}
DartType subsituteType(DartType type) {
@@ -1272,6 +1286,8 @@
nonConstLiteral(List<TreeNode> context, TreeNode node, String klass);
duplicateKey(List<TreeNode> context, TreeNode node, Constant key);
failedAssertion(List<TreeNode> context, TreeNode node, String message);
+ nonConstantVariableGet(
+ List<TreeNode> context, TreeNode node, String variableName);
}
abstract class ErrorReporterBase implements ErrorReporter {
@@ -1374,6 +1390,15 @@
'The assertion condition evaluated to "false" with message "$message"',
node);
}
+
+ nonConstantVariableGet(
+ List<TreeNode> context, TreeNode node, String variableName) {
+ report(
+ context,
+ 'The variable "$variableName" cannot be used inside a constant '
+ 'expression.',
+ node);
+ }
}
class _SimpleErrorReporter extends ErrorReporterBase {
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index db64098..ac6ca9c2 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -17,9 +17,6 @@
front_end: 0.1.1
test: ^0.12.15+6
stack_trace: ^1.6.6
- ansicolor: ^0.0.9
test_reflective_loader: ^0.1.0
testing:
- git:
- url: https://github.com/peter-ahe-google/testing.git
- ref: 2e196d5
+ path: ../testing
diff --git a/pkg/pkg.status b/pkg/pkg.status
index cc1fb23..cd5cb27 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -168,20 +168,13 @@
analysis_server/test/services/refactoring/extract_local_test: Fail
analyzer/test/generated/compile_time_error_code_driver_test: Fail
analyzer/test/generated/compile_time_error_code_test: Fail
-analyzer/test/generated/declaration_resolver_test: Fail
analyzer/test/generated/hint_code_driver_test: Fail
-analyzer/test/generated/hint_code_test: Fail
analyzer/test/generated/invalid_code_driver_test: Fail
analyzer/test/generated/non_error_resolver_driver_test: Fail
analyzer/test/generated/non_error_resolver_test: Fail
-analyzer/test/generated/parser_test: Fail
analyzer/test/generated/resolver_test: Fail
analyzer/test/generated/utilities_test: Fail
analyzer/test/src/context/context_test: Fail
-analyzer/test/src/dart/constant/evaluation_test: Fail
-analyzer/test/src/summary/prelinker_test: Fail
-analyzer/test/src/summary/summarize_ast_strong_test: Fail
-analyzer/test/src/summary/summarize_ast_test: Fail
analyzer_plugin/test/src/utilities/completion/completion_target_test: Fail
analyzer_plugin/test/src/utilities/completion/optype_test: Fail
analyzer_plugin/test/src/utilities/visitors/local_declaration_visitor_test: Fail
diff --git a/pkg/sourcemap_testing/lib/src/annotated_code_helper.dart b/pkg/sourcemap_testing/lib/src/annotated_code_helper.dart
index d6291b9..068fcca 100644
--- a/pkg/sourcemap_testing/lib/src/annotated_code_helper.dart
+++ b/pkg/sourcemap_testing/lib/src/annotated_code_helper.dart
@@ -186,30 +186,17 @@
for (String prefix in prefixes) {
map[prefix] = <Annotation>[];
}
+ outer:
for (Annotation annotation in annotatedCode.annotations) {
- String annotationText = annotation.text;
- String annotationPrefix;
- bool not = false;
- if (annotationText.startsWith('!')) {
- annotationText = annotationText.substring(1);
- not = true;
- }
for (String prefix in prefixes) {
- if (annotationText.startsWith(prefix)) {
- annotationPrefix = prefix;
- annotation = new Annotation(annotation.lineNo, annotation.columnNo,
- annotation.offset, annotationText.substring(prefix.length));
+ if (annotation.text.startsWith(prefix)) {
+ map[prefix].add(new Annotation(annotation.lineNo, annotation.columnNo,
+ annotation.offset, annotation.text.substring(prefix.length)));
+ continue outer;
}
}
-
for (String prefix in prefixes) {
- if (annotationPrefix == null) {
- map[prefix].add(annotation);
- } else if (annotationPrefix != prefix && not) {
- map[prefix].add(annotation);
- } else if (annotationPrefix == prefix && !not) {
- map[prefix].add(annotation);
- }
+ map[prefix].add(annotation);
}
}
Map<String, AnnotatedCode> split = <String, AnnotatedCode>{};
diff --git a/pkg/status_file/bin/lint.dart b/pkg/status_file/bin/lint.dart
index d7e985d..17b84f47 100644
--- a/pkg/status_file/bin/lint.dart
+++ b/pkg/status_file/bin/lint.dart
@@ -62,7 +62,7 @@
while (null != (readString = stdin.readLineSync())) {
strings.add(readString);
}
- } on StdinException catch (e) {
+ } on StdinException {
// I do not know why this happens.
}
if (!lintText(strings)) {
@@ -100,7 +100,7 @@
var statusFile = new StatusFile.parse("stdin", text);
return lintStatusFile(statusFile,
checkForDisjunctions: checkForDisjunctions);
- } on status_file.SyntaxError catch (error) {
+ } on status_file.SyntaxError {
stderr.writeln("Could not parse stdin.");
}
return false;
diff --git a/pkg/status_file/lib/status_file_linter.dart b/pkg/status_file/lib/status_file_linter.dart
index 43b407b..fa98680 100644
--- a/pkg/status_file/lib/status_file_linter.dart
+++ b/pkg/status_file/lib/status_file_linter.dart
@@ -132,8 +132,11 @@
/// Checks for duplicate section entries in the body of a section.
Iterable<LintingError> lintSectionEntryDuplicates(StatusSection section) {
var errors = <LintingError>[];
- List<StatusEntry> statusEntries =
- section.entries.where((entry) => entry is StatusEntry).toList();
+ // TODO(whereType): When whereType is supported, use that.
+ List<StatusEntry> statusEntries = section.entries
+ .where((entry) => entry is StatusEntry)
+ .cast<StatusEntry>()
+ .toList();
for (var i = 0; i < statusEntries.length; i++) {
var entry = statusEntries[i];
for (var j = i + 1; j < statusEntries.length; j++) {
diff --git a/pkg/status_file/pubspec.yaml b/pkg/status_file/pubspec.yaml
index ddcbc45..7d000ed 100644
--- a/pkg/status_file/pubspec.yaml
+++ b/pkg/status_file/pubspec.yaml
@@ -1,12 +1,11 @@
name: status_file
-author: Dart Team <misc@dartlang.org>
-description: Parses status files.
-homepage: http://www.dartlang.org
-#environment:
-# sdk: '>=1.0.0 <2.0.0'
+# This package is not intended to be published.
+publish_to: none
+
dependencies:
path: "^1.4.0"
args: "^0.13.7"
+
dev_dependencies:
expect:
path: ../expect
diff --git a/pkg/status_file/test/repo_status_files_test.dart b/pkg/status_file/test/repo_status_files_test.dart
index ce57c42..8aacb64 100644
--- a/pkg/status_file/test/repo_status_files_test.dart
+++ b/pkg/status_file/test/repo_status_files_test.dart
@@ -7,7 +7,6 @@
import 'dart:io';
import 'package:expect/expect.dart';
-import 'package:path/path.dart' as p;
import 'package:status_file/status_file.dart';
final Uri repoRoot = Platform.script.resolve("../../../");
diff --git a/pkg/vm/bin/frontend_server_starter.dart b/pkg/vm/bin/frontend_server_starter.dart
index f81d98b..dcbf63f 100644
--- a/pkg/vm/bin/frontend_server_starter.dart
+++ b/pkg/vm/bin/frontend_server_starter.dart
@@ -1,10 +1,9 @@
library frontend_server;
import 'dart:async';
-import 'dart:io';
import '../lib/frontend_server.dart';
Future<Null> main(List<String> args) async {
- exit(await starter(args));
+ starter(args);
}
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 7ec5b51..4d383d5 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -26,6 +26,7 @@
import 'dart:isolate';
import 'dart:typed_data' show Uint8List;
+import 'package:build_integration/file_system/multi_root.dart';
import 'package:front_end/src/api_prototype/file_system.dart';
import 'package:front_end/src/api_prototype/front_end.dart';
import 'package:front_end/src/api_prototype/memory_file_system.dart';
@@ -199,15 +200,16 @@
{bool strongMode: false,
bool suppressWarnings: false,
bool syncAsync: false,
- String packageConfig: null}) async {
+ String packageConfig: null,
+ String multirootFilepaths,
+ String multirootScheme}) async {
IncrementalCompilerWrapper compiler = lookupIncrementalCompiler(isolateId);
if (compiler != null) {
updateSources(compiler, sourceFiles);
invalidateSources(compiler, sourceFiles);
} else {
- final FileSystem fileSystem = sourceFiles.isEmpty && platformKernel == null
- ? StandardFileSystem.instance
- : _buildFileSystem(sourceFiles, platformKernel);
+ FileSystem fileSystem = _buildFileSystem(
+ sourceFiles, platformKernel, multirootFilepaths, multirootScheme);
// TODO(aam): IncrementalCompilerWrapper instance created below have to be
// destroyed when corresponding isolate is shut down. To achieve that kernel
@@ -384,6 +386,8 @@
final bool suppressWarnings = request[8];
final bool syncAsync = request[9];
final String packageConfig = request[10];
+ final String multirootFilepaths = request[11];
+ final String multirootScheme = request[12];
Uri platformKernelPath = null;
List<int> platformKernel = null;
@@ -436,11 +440,12 @@
strongMode: strong,
suppressWarnings: suppressWarnings,
syncAsync: syncAsync,
- packageConfig: packageConfig);
+ packageConfig: packageConfig,
+ multirootFilepaths: multirootFilepaths,
+ multirootScheme: multirootScheme);
} else {
- final FileSystem fileSystem = sourceFiles.isEmpty && platformKernel == null
- ? StandardFileSystem.instance
- : _buildFileSystem(sourceFiles, platformKernel);
+ FileSystem fileSystem = _buildFileSystem(
+ sourceFiles, platformKernel, multirootFilepaths, multirootScheme);
compiler = new SingleShotCompilerWrapper(fileSystem, platformKernelPath,
requireMain: sourceFiles.isEmpty,
strongMode: strong,
@@ -493,28 +498,46 @@
}
}
-/// Creates a file system containing the files specified in [namedSources] and
+/// Creates a file system containing the files specified in [sourceFiles] and
/// that delegates to the underlying file system for any other file request.
-/// The [namedSources] list interleaves file name string and
+/// The [sourceFiles] list interleaves file name string and
/// raw file content Uint8List.
///
/// The result can be used instead of StandardFileSystem.instance by the
/// frontend.
-FileSystem _buildFileSystem(List namedSources, List<int> platformKernel) {
- MemoryFileSystem fileSystem = new MemoryFileSystem(Uri.parse('file:///'));
- if (namedSources != null) {
- for (int i = 0; i < namedSources.length ~/ 2; i++) {
- fileSystem
- .entityForUri(Uri.parse(namedSources[i * 2]))
- .writeAsBytesSync(namedSources[i * 2 + 1]);
+FileSystem _buildFileSystem(List sourceFiles, List<int> platformKernel,
+ String multirootFilepaths, String multirootScheme) {
+ FileSystem fileSystem;
+
+ if (sourceFiles.isEmpty && platformKernel == null) {
+ fileSystem = StandardFileSystem.instance;
+ } else {
+ MemoryFileSystem memoryFileSystem =
+ new MemoryFileSystem(Uri.parse('file:///'));
+ if (sourceFiles != null) {
+ for (int i = 0; i < sourceFiles.length ~/ 2; i++) {
+ memoryFileSystem
+ .entityForUri(Uri.parse(sourceFiles[i * 2]))
+ .writeAsBytesSync(sourceFiles[i * 2 + 1]);
+ }
}
+ if (platformKernel != null) {
+ memoryFileSystem
+ .entityForUri(Uri.parse(platformKernelFile))
+ .writeAsBytesSync(platformKernel);
+ }
+ fileSystem = new HybridFileSystem(memoryFileSystem);
}
- if (platformKernel != null) {
- fileSystem
- .entityForUri(Uri.parse(platformKernelFile))
- .writeAsBytesSync(platformKernel);
+
+ if (multirootFilepaths != null) {
+ List<Uri> list = multirootFilepaths
+ .split(',')
+ .map((String s) => Uri.base.resolveUri(new Uri.file(s)))
+ .toList();
+ fileSystem = new MultiRootFileSystem(
+ multirootScheme ?? "org-dartlang-root", list, fileSystem);
}
- return new HybridFileSystem(fileSystem);
+ return fileSystem;
}
train(String scriptUri, String platformKernelPath) {
@@ -546,6 +569,8 @@
false /* suppress warnings */,
false /* synchronous async */,
null /* package_config */,
+ null /* multirootFilepaths */,
+ null /* multirootScheme */,
];
_processLoadRequest(request);
}
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 599d4c1..986874d 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -169,9 +169,7 @@
asm.emitNativeCall(nativeEntryCpIndex);
}
- LibraryIndex _libraryIndex;
- LibraryIndex get libraryIndex =>
- _libraryIndex ??= new LibraryIndex.coreLibraries(component);
+ LibraryIndex get libraryIndex => coreTypes.index;
Procedure _listFromLiteral;
Procedure get listFromLiteral => _listFromLiteral ??=
@@ -211,6 +209,11 @@
_closureFunctionTypeArguments ??= libraryIndex.getMember(
'dart:core', '_Closure', '_function_type_arguments');
+ Field _closureDelayedTypeArguments;
+ Field get closureDelayedTypeArguments =>
+ _closureDelayedTypeArguments ??= libraryIndex.getMember(
+ 'dart:core', '_Closure', '_delayed_type_arguments');
+
Field _closureFunction;
Field get closureFunction => _closureFunction ??=
libraryIndex.getMember('dart:core', '_Closure', '_function');
@@ -223,6 +226,10 @@
Procedure get prependTypeArguments => _prependTypeArguments ??=
libraryIndex.getTopLevelMember('dart:_internal', '_prependTypeArguments');
+ Procedure _futureValue;
+ Procedure get futureValue =>
+ _futureValue ??= libraryIndex.getMember('dart:async', 'Future', 'value');
+
void _genConstructorInitializers(Constructor node) {
bool isRedirecting =
node.initializers.any((init) => init is RedirectingInitializer);
@@ -1109,9 +1116,18 @@
asm.emitDrop1();
}
-// @override
-// visitDirectMethodInvocation(DirectMethodInvocation node) {
-// }
+ @override
+ visitDirectMethodInvocation(DirectMethodInvocation node) {
+ final args = node.arguments;
+ _genArguments(node.receiver, args);
+ final target = node.target;
+ if (target is Procedure && !target.isGetter && !target.isSetter) {
+ _genStaticCallWithArgs(target, args, hasReceiver: true);
+ } else {
+ throw new UnsupportedOperationError(
+ 'Unsupported DirectMethodInvocation with target ${target.runtimeType} $target');
+ }
+ }
@override
visitDirectPropertyGet(DirectPropertyGet node) {
@@ -1125,22 +1141,58 @@
}
}
-// @override
-// visitDirectPropertySet(DirectPropertySet node) {
-// }
+ @override
+ visitDirectPropertySet(DirectPropertySet node) {
+ node.receiver.accept(this);
+ node.value.accept(this);
+ final target = node.target;
+ if (target is Field || (target is Procedure && target.isSetter)) {
+ _genStaticCall(target, new ConstantArgDesc(2), 2, isSet: true);
+ } else {
+ throw new UnsupportedOperationError(
+ 'Unsupported DirectPropertySet with target ${target.runtimeType} $target');
+ }
+ }
@override
visitFunctionExpression(FunctionExpression node) {
_genClosure(node, '<anonymous closure>', node.function);
}
-// @override
-// visitInstantiation(Instantiation node) {
-// }
-//
-// @override
-// visitInvalidExpression(InvalidExpression node) {
-// }
+ @override
+ visitInstantiation(Instantiation node) {
+ final int oldClosure = locals.tempIndexInFrame(node, tempIndex: 0);
+ final int newClosure = locals.tempIndexInFrame(node, tempIndex: 1);
+
+ node.expression.accept(this);
+ asm.emitPopLocal(oldClosure);
+
+ assert(closureClass.typeParameters.isEmpty);
+ asm.emitAllocate(cp.add(new ConstantClass(closureClass)));
+ asm.emitStoreLocal(newClosure);
+
+ _genTypeArguments(node.typeArguments);
+ asm.emitStoreFieldTOS(
+ cp.add(new ConstantFieldOffset(closureDelayedTypeArguments)));
+
+ // Copy the rest of the fields from old closure to a new closure.
+ final fieldsToCopy = <Field>[
+ closureInstantiatorTypeArguments,
+ closureFunctionTypeArguments,
+ closureFunction,
+ closureContext,
+ ];
+
+ for (Field field in fieldsToCopy) {
+ final fieldOffsetCpIndex = cp.add(new ConstantFieldOffset(field));
+ asm.emitPush(newClosure);
+ asm.emitPush(oldClosure);
+ asm.emitLoadFieldTOS(fieldOffsetCpIndex);
+ asm.emitStoreFieldTOS(fieldOffsetCpIndex);
+ }
+
+ asm.emitPush(newClosure);
+ }
@override
visitIsExpression(IsExpression node) {
@@ -1322,7 +1374,7 @@
@override
visitSuperPropertyGet(SuperPropertyGet node) {
_genPushReceiver();
- Member target =
+ final Member target =
hierarchy.getDispatchTarget(enclosingClass.superclass, node.name);
if (target == null) {
throw new UnsupportedOperationError(
@@ -1336,9 +1388,23 @@
}
}
-// @override
-// visitSuperPropertySet(SuperPropertySet node) {
-// }
+ @override
+ visitSuperPropertySet(SuperPropertySet node) {
+ _genPushReceiver();
+ node.value.accept(this);
+ final Member target = hierarchy
+ .getDispatchTarget(enclosingClass.superclass, node.name, setter: true);
+ if (target == null) {
+ throw new UnsupportedOperationError(
+ 'Unsupported SuperPropertySet without target');
+ }
+ if (target is Field || (target is Procedure && target.isSetter)) {
+ _genStaticCall(target, new ConstantArgDesc(2), 2, isSet: true);
+ } else {
+ throw new UnsupportedOperationError(
+ 'Unsupported SuperPropertySet with target ${target.runtimeType} $target');
+ }
+ }
@override
visitNot(Not node) {
@@ -1528,33 +1594,20 @@
}
}
-// @override
-// visitLoadLibrary(LoadLibrary node) {
-// }
-//
-// @override
-// visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
-// }
-//
-// @override
-// visitVectorCreation(VectorCreation node) {
-// }
-//
-// @override
-// visitVectorGet(VectorGet node) {
-// }
-//
-// @override
-// visitVectorSet(VectorSet node) {
-// }
-//
-// @override
-// visitVectorCopy(VectorCopy node) {
-// }
-//
-// @override
-// visitClosureCreation(ClosureCreation node) {
-// }
+ void _genFutureNull() {
+ _genPushNull();
+ _genStaticCall(futureValue, new ConstantArgDesc(1), 1);
+ }
+
+ @override
+ visitLoadLibrary(LoadLibrary node) {
+ _genFutureNull();
+ }
+
+ @override
+ visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
+ _genFutureNull();
+ }
@override
visitAssertStatement(AssertStatement node) {
@@ -2163,16 +2216,15 @@
asm.emitDrop1();
}
-// @override
-// visitLocalInitializer(LocalInitializer node) {
-// }
-//
-// @override
-// visitAssertInitializer(AssertInitializer node) {
-// }
-//
-// @override
-// visitInvalidInitializer(InvalidInitializer node) {}
+ @override
+ visitLocalInitializer(LocalInitializer node) {
+ node.variable.accept(this);
+ }
+
+ @override
+ visitAssertInitializer(AssertInitializer node) {
+ node.statement.accept(this);
+ }
@override
visitConstantExpression(ConstantExpression node) {
@@ -2226,8 +2278,9 @@
int visitTearOffConstant(TearOffConstant node) =>
cp.add(new ConstantTearOff(node.procedure));
-// @override
-// int visitTypeLiteralConstant(TypeLiteralConstant node) => defaultConstant(node);
+ @override
+ int visitTypeLiteralConstant(TypeLiteralConstant node) =>
+ cp.add(new ConstantType(node.type));
}
class UnsupportedOperationError {
diff --git a/pkg/vm/lib/bytecode/local_vars.dart b/pkg/vm/lib/bytecode/local_vars.dart
index 5bea5f6..1c4edcd 100644
--- a/pkg/vm/lib/bytecode/local_vars.dart
+++ b/pkg/vm/lib/bytecode/local_vars.dart
@@ -994,4 +994,9 @@
visitTryFinally(TryFinally node) {
_visit(node, temps: 2);
}
+
+ @override
+ visitInstantiation(Instantiation node) {
+ _visit(node, temps: 2);
+ }
}
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index 9d5797b..5c69abf 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -668,7 +668,7 @@
/// processes user input.
/// `compiler` is an optional parameter so it can be replaced with mocked
/// version for testing.
-Future<int> starter(
+Future<void> starter(
List<String> args, {
CompilerInterface compiler,
Stream<List<int>> input,
@@ -682,7 +682,7 @@
} catch (error) {
print('ERROR: $error\n');
print(usage);
- return 1;
+ exit(1);
}
if (options['train']) {
@@ -726,14 +726,12 @@
);
if (options.rest.isNotEmpty) {
- return await compiler.compile(options.rest[0], options,
- generator: generator)
+ exit(await compiler.compile(options.rest[0], options, generator: generator)
? 0
- : 254;
+ : 254);
}
listenAndCompile(compiler, input ?? stdin, options, () {
exit(0);
}, generator: generator);
- return 0;
}
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 162890e..610f2a1 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -312,6 +312,13 @@
reportIt(context, message, node);
}
+ nonConstantVariableGet(
+ List<TreeNode> context, TreeNode node, String variableName) {
+ final message = codes.templateConstEvalNonConstantVariableGet
+ .withArguments(variableName);
+ reportIt(context, message, node);
+ }
+
reportIt(List<TreeNode> context, codes.Message message, TreeNode node) {
final Uri uri = getFileUri(node);
final int fileOffset = getFileOffset(node);
@@ -339,7 +346,7 @@
}
getFileOffset(TreeNode node) {
- while (node.fileOffset == TreeNode.noOffset) {
+ while (node?.fileOffset == TreeNode.noOffset) {
node = node.parent;
}
return node == null ? TreeNode.noOffset : node.fileOffset;
diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml
index c6632f8..eec95ba 100644
--- a/pkg/vm/pubspec.yaml
+++ b/pkg/vm/pubspec.yaml
@@ -1,13 +1,13 @@
+# This package is not intended to be published.
name: vm
-version: 0.1.0-alpha.1
-author: Dart Team <misc@dartlang.org>
+# version: do-not-upload
description: VM specific Dart code and helper scripts
-homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm
-environment:
- sdk: ">=1.8.0 <2.0.0"
+
dependencies:
- build_integration: 0.0.1
+ build_integration:
+ path: ../build_integration
front_end: 0.1.0-alpha.6
kernel: 0.3.0-alpha.3
+
dev_dependencies:
args: ^0.13.0
diff --git a/pkg/vm/test/frontend_server_test.dart b/pkg/vm/test/frontend_server_test.dart
index 7efa188..5ffff46 100644
--- a/pkg/vm/test/frontend_server_test.dart
+++ b/pkg/vm/test/frontend_server_test.dart
@@ -29,7 +29,7 @@
final CompilerInterface compiler = new _MockedCompiler();
test('train with mocked compiler completes', () async {
- expect(await starter(<String>['--train'], compiler: compiler), equals(0));
+ await starter(<String>['--train'], compiler: compiler);
});
});
@@ -44,8 +44,7 @@
'--sdk-root',
'sdkroot',
];
- final int exitcode = await starter(args, compiler: compiler);
- expect(exitcode, equals(0));
+ await starter(args, compiler: compiler);
final List<ArgResults> capturedArgs = verify(compiler.compile(
argThat(equals('server.dart')),
captureAny,
@@ -62,8 +61,7 @@
'sdkroot',
'--strong',
];
- final int exitcode = await starter(args, compiler: compiler);
- expect(exitcode, equals(0));
+ await starter(args, compiler: compiler);
final List<ArgResults> capturedArgs = verify(compiler.compile(
argThat(equals('server.dart')),
captureAny,
@@ -82,8 +80,7 @@
'--strong',
'--no-sync-async',
];
- final int exitcode = await starter(args, compiler: compiler);
- expect(exitcode, equals(0));
+ await starter(args, compiler: compiler);
final List<ArgResults> capturedArgs = verify(compiler.compile(
argThat(equals('server.dart')),
captureAny,
@@ -101,8 +98,7 @@
'sdkroot',
'--link-platform',
];
- final int exitcode = await starter(args, compiler: compiler);
- expect(exitcode, equals(0));
+ await starter(args, compiler: compiler);
final List<ArgResults> capturedArgs = verify(compiler.compile(
argThat(equals('server.dart')),
captureAny,
@@ -135,12 +131,11 @@
compileCalled.sendPort.send(true);
});
- final int exitcode = await starter(
+ await starter(
args,
compiler: compiler,
input: inputStreamController.stream,
);
- expect(exitcode, equals(0));
inputStreamController.add('compile server.dart\n'.codeUnits);
await compileCalled.first;
inputStreamController.close();
@@ -173,12 +168,11 @@
compileCalled.sendPort.send(true);
});
- final int exitcode = await starter(
+ await starter(
args,
compiler: compiler,
input: inputStreamController.stream,
);
- expect(exitcode, equals(0));
inputStreamController.add('compile server.dart\n'.codeUnits);
await compileCalled.first;
inputStreamController.close();
@@ -197,12 +191,11 @@
compileCalled.sendPort.send(true);
});
- final int exitcode = await starter(
+ await starter(
strongArgs,
compiler: compiler,
input: inputStreamController.stream,
);
- expect(exitcode, equals(0));
inputStreamController.add('compile server.dart\n'.codeUnits);
await compileCalled.first;
inputStreamController.close();
@@ -223,12 +216,11 @@
compileCalled.sendPort.send(true);
});
- final int exitcode = await starter(
+ await starter(
args,
compiler: compiler,
input: streamController.stream,
);
- expect(exitcode, equals(0));
streamController.add('compile server1.dart\n'.codeUnits);
streamController.add('compile server2.dart\n'.codeUnits);
await compileCalled.first;
@@ -256,12 +248,11 @@
.thenAnswer((Invocation invocation) {
recompileCalled.sendPort.send(true);
});
- final int exitcode = await starter(
+ await starter(
args,
compiler: compiler,
input: streamController.stream,
);
- expect(exitcode, equals(0));
streamController
.add('recompile abc\nfile1.dart\nfile2.dart\nabc\n'.codeUnits);
await recompileCalled.first;
@@ -283,12 +274,11 @@
.thenAnswer((Invocation invocation) {
recompileCalled.sendPort.send(true);
});
- final int exitcode = await starter(
+ await starter(
args,
compiler: compiler,
input: streamController.stream,
);
- expect(exitcode, equals(0));
streamController.add(
'recompile file2.dart abc\nfile1.dart\nfile2.dart\nabc\n'.codeUnits);
await recompileCalled.first;
@@ -308,12 +298,11 @@
when(compiler.acceptLastDelta()).thenAnswer((Invocation invocation) {
acceptCalled.sendPort.send(true);
});
- final int exitcode = await starter(
+ await starter(
args,
compiler: compiler,
input: inputStreamController.stream,
);
- expect(exitcode, equals(0));
inputStreamController.add('accept\n'.codeUnits);
await acceptCalled.first;
inputStreamController.close();
@@ -327,12 +316,11 @@
.thenAnswer((Invocation invocation) {
resetCalled.sendPort.send(true);
});
- final int exitcode = await starter(
+ await starter(
args,
compiler: compiler,
input: inputStreamController.stream,
);
- expect(exitcode, equals(0));
inputStreamController.add('reset\n'.codeUnits);
await resetCalled.first;
inputStreamController.close();
@@ -347,12 +335,11 @@
.thenAnswer((Invocation invocation) {
recompileCalled.sendPort.send(true);
});
- final int exitcode = await starter(
+ await starter(
args,
compiler: compiler,
input: streamController.stream,
);
- expect(exitcode, equals(0));
streamController.add('compile file1.dart\n'.codeUnits);
streamController.add('accept\n'.codeUnits);
streamController
@@ -413,7 +400,7 @@
new _MockedBinaryPrinterFactory();
when(printerFactory.newBinaryPrinter(any))
.thenReturn(new _MockedBinaryPrinter());
- final int exitcode = await starter(
+ await starter(
args,
compiler: null,
input: streamController.stream,
@@ -421,7 +408,6 @@
generator: generator,
binaryPrinterFactory: printerFactory,
);
- expect(exitcode, equals(0));
streamController.add('compile file1.dart\n'.codeUnits);
await receivedResult.first;
@@ -448,8 +434,7 @@
'--output-incremental-dill',
'/foo/bar/server.incremental.dart.dill',
];
- final int exitcode = await starter(args, compiler: compiler);
- expect(exitcode, equals(0));
+ await starter(args, compiler: compiler);
final List<ArgResults> capturedArgs = verify(compiler.compile(
argThat(equals('server.dart')),
captureAny,
@@ -516,9 +501,7 @@
}
});
- int exitcode =
- await starter(args, input: streamController.stream, output: ioSink);
- expect(exitcode, equals(0));
+ await starter(args, input: streamController.stream, output: ioSink);
streamController.add('compile ${file.path}\n'.codeUnits);
int count = 0;
Completer<bool> allDone = new Completer<bool>();
@@ -621,9 +604,7 @@
}
}
});
- int exitcode =
- await starter(args, input: streamController.stream, output: ioSink);
- expect(exitcode, equals(0));
+ await starter(args, input: streamController.stream, output: ioSink);
streamController.add('compile ${file.path}\n'.codeUnits);
int count = 0;
Completer<bool> allDone = new Completer<bool>();
@@ -694,9 +675,7 @@
}
}
});
- int exitcode =
- await starter(args, input: streamController.stream, output: ioSink);
- expect(exitcode, equals(0));
+ await starter(args, input: streamController.stream, output: ioSink);
streamController.add('compile ${file.path}\n'.codeUnits);
int count = 0;
Completer<bool> allDone = new Completer<bool>();
@@ -760,8 +739,7 @@
'--filesystem-scheme=test-scheme',
'test-scheme:///foo.dart'
];
- int exitcode = await starter(args);
- expect(exitcode, equals(0));
+ await starter(args);
});
test('compile and produce deps file', () async {
@@ -779,9 +757,7 @@
'--depfile=${depFile.path}',
file.path
];
- int exitcode = await starter(args);
- expect(exitcode, equals(0));
-
+ await starter(args);
expect(depFile.existsSync(), true);
var depContents = depFile.readAsStringSync();
var depContentsParsed = depContents.split(': ');
@@ -840,9 +816,7 @@
}
});
- int exitcode =
- await starter(args, input: streamController.stream, output: ioSink);
- expect(exitcode, equals(0));
+ await starter(args, input: streamController.stream, output: ioSink);
streamController.add('compile ${dart2js.path}\n'.codeUnits);
int count = 0;
Completer<bool> allDone = new Completer<bool>();
diff --git a/pkg/vm/testcases/bytecode/closures.dart b/pkg/vm/testcases/bytecode/closures.dart
index 102cb0f..ff1c650 100644
--- a/pkg/vm/testcases/bytecode/closures.dart
+++ b/pkg/vm/testcases/bytecode/closures.dart
@@ -131,4 +131,12 @@
}
}
+typedef IntFunc(int arg);
+
+IntFunc testPartialInstantiation() {
+ void foo<T>(T t) {}
+ IntFunc intFunc = foo;
+ return intFunc;
+}
+
main() {}
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 2080a18..2bece87 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -2,6 +2,7 @@
import self as self;
import "dart:core" as core;
+typedef IntFunc = (core::int) → dynamic;
class C1 extends core::Object {
[@vm.bytecode=
Bytecode {
@@ -1409,6 +1410,103 @@
}
[@vm.bytecode=
Bytecode {
+ Entry 6
+ CheckStack
+ Allocate CP#12
+ StoreLocal r3
+ Push r3
+ PushConstant CP#7
+ StoreFieldTOS CP#13
+ Push r3
+ PushConstant CP#7
+ StoreFieldTOS CP#2
+ Push r3
+ PushConstant CP#0
+ StoreFieldTOS CP#14
+ Push r3
+ Push r0
+ StoreFieldTOS CP#1
+ PopLocal r2
+ Push r2
+ PopLocal r3
+ Allocate CP#12
+ StoreLocal r5
+ PushConstant CP#15
+ StoreFieldTOS CP#16
+ Push r5
+ Push r3
+ LoadFieldTOS CP#13
+ StoreFieldTOS CP#13
+ Push r5
+ Push r3
+ LoadFieldTOS CP#2
+ StoreFieldTOS CP#2
+ Push r5
+ Push r3
+ LoadFieldTOS CP#14
+ StoreFieldTOS CP#14
+ Push r5
+ Push r3
+ LoadFieldTOS CP#1
+ StoreFieldTOS CP#1
+ Push r5
+ PopLocal r4
+ Push r4
+ ReturnTOS
+ PushConstant CP#7
+ ReturnTOS
+}
+ConstantPool {
+ [0] = ClosureFunction foo <T extends dart.core::Object = dynamic>(T t) → void;
+ [1] = FieldOffset dart.core::_Closure::_context
+ [2] = FieldOffset dart.core::_Closure::_function_type_arguments
+ [3] = Int 0
+ [4] = Int 1
+ [5] = ArgDesc num-args 4, num-type-args 0, names []
+ [6] = StaticICData target 'dart._internal::_prependTypeArguments', arg-desc CP#5
+ [7] = Null
+ [8] = Type T
+ [9] = String 't'
+ [10] = SubtypeTestCache
+ [11] = EndClosureFunctionScope
+ [12] = Class dart.core::_Closure
+ [13] = FieldOffset dart.core::_Closure::_instantiator_type_arguments
+ [14] = FieldOffset dart.core::_Closure::_function
+ [15] = TypeArgs [dart.core::int]
+ [16] = FieldOffset dart.core::_Closure::_delayed_type_arguments
+}
+Closure CP#0 {
+ Entry 2
+ CheckStack
+ Push FP[-6]
+ LoadFieldTOS CP#1
+ PopLocal r0
+ Push FP[-7]
+ Push FP[-6]
+ LoadFieldTOS CP#2
+ PushConstant CP#3
+ PushConstant CP#4
+ PushConstant CP#6
+ IndirectStaticCall 4, CP#5
+ PopLocal FP[-7]
+ Push FP[-5]
+ PushConstant CP#7
+ Push FP[-7]
+ PushConstant CP#8
+ PushConstant CP#9
+ AssertAssignable 0, CP#10
+ Drop1
+ PushConstant CP#7
+ ReturnTOS
+
+}
+]static method testPartialInstantiation() → (core::int) → dynamic {
+ function foo<T extends core::Object = dynamic>(T t) → void {}
+ (core::int) → dynamic intFunc = foo<core::int>;
+ return intFunc;
+}
+[@vm.bytecode=
+Bytecode {
Entry 0
CheckStack
PushConstant CP#0
diff --git a/pkg/vm/testcases/bytecode/deferred_lib.dart b/pkg/vm/testcases/bytecode/deferred_lib.dart
new file mode 100644
index 0000000..b93cc06
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/deferred_lib.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "hello.dart" deferred as lib;
+
+callDeferred() => lib.main();
+
+testLoadLibrary() => lib.loadLibrary();
+
+main() {}
diff --git a/pkg/vm/testcases/bytecode/deferred_lib.dart.expect b/pkg/vm/testcases/bytecode/deferred_lib.dart.expect
new file mode 100644
index 0000000..8d4cb94
--- /dev/null
+++ b/pkg/vm/testcases/bytecode/deferred_lib.dart.expect
@@ -0,0 +1,56 @@
+library #lib;
+import self as self;
+import "./hello.dart" as hel;
+
+[@vm.bytecode=
+Bytecode {
+ Entry 1
+ CheckStack
+ PushConstant CP#0
+ PushConstant CP#2
+ IndirectStaticCall 1, CP#1
+ PopLocal r0
+ PushConstant CP#4
+ IndirectStaticCall 0, CP#3
+ ReturnTOS
+ PushConstant CP#0
+ ReturnTOS
+}
+ConstantPool {
+ [0] = Null
+ [1] = ArgDesc num-args 1, num-type-args 0, names []
+ [2] = StaticICData target 'dart.async::Future::value', arg-desc CP#1
+ [3] = ArgDesc num-args 0, num-type-args 0, names []
+ [4] = StaticICData target '#lib1::main', arg-desc CP#3
+}
+]static method callDeferred() → dynamic
+ return let final dynamic #t1 = CheckLibraryIsLoaded(lib) in hel::main();
+[@vm.bytecode=
+Bytecode {
+ Entry 0
+ CheckStack
+ PushConstant CP#0
+ PushConstant CP#2
+ IndirectStaticCall 1, CP#1
+ ReturnTOS
+ PushConstant CP#0
+ ReturnTOS
+}
+ConstantPool {
+ [0] = Null
+ [1] = ArgDesc num-args 1, num-type-args 0, names []
+ [2] = StaticICData target 'dart.async::Future::value', arg-desc CP#1
+}
+]static method testLoadLibrary() → dynamic
+ return LoadLibrary(lib);
+[@vm.bytecode=
+Bytecode {
+ Entry 0
+ CheckStack
+ PushConstant CP#0
+ ReturnTOS
+}
+ConstantPool {
+ [0] = Null
+}
+]static method main() → dynamic {}
diff --git a/pkg/vm/testcases/bytecode/literals.dart b/pkg/vm/testcases/bytecode/literals.dart
index 69a0e85..0acd65b 100644
--- a/pkg/vm/testcases/bytecode/literals.dart
+++ b/pkg/vm/testcases/bytecode/literals.dart
@@ -45,7 +45,7 @@
print(42);
print('foo');
print(A.elem2);
- print(const [42, 'foo']);
+ print(const [42, 'foo', int]);
print(const <String, A>{'E2': A.elem2, 'E4': A.elem4});
print(
const D(const C(4, 5, 6), const {'foo': 42, 'bar': const B(c2.length)}));
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index a3c9ec2..7d6702f 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -360,19 +360,19 @@
PushConstant CP#9
IndirectStaticCall 1, CP#1
Drop1
- PushConstant CP#10
PushConstant CP#11
+ PushConstant CP#12
IndirectStaticCall 1, CP#1
Drop1
- PushConstant CP#19
PushConstant CP#20
+ PushConstant CP#21
IndirectStaticCall 1, CP#1
Drop1
- PushConstant CP#30
PushConstant CP#31
+ PushConstant CP#32
IndirectStaticCall 1, CP#1
Drop1
- PushConstant CP#32
+ PushConstant CP#33
ReturnTOS
}
ConstantPool {
@@ -386,35 +386,36 @@
[7] = String 'A.elem2'
[8] = Instance #lib::A type-args CP#5 {index: 6, _name: 7}
[9] = StaticICData target 'dart.core::print', arg-desc CP#1
- [10] = List type-arg dart.core::Object, entries CP# [0, 3]
- [11] = StaticICData target 'dart.core::print', arg-desc CP#1
- [12] = TypeArgs [dart.core::String, #lib::A]
- [13] = String 'E2'
- [14] = String 'E4'
- [15] = Int 3
- [16] = String 'A.elem4'
- [17] = Instance #lib::A type-args CP#5 {index: 15, _name: 16}
- [18] = List type-arg dynamic, entries CP# [13, 8, 14, 17]
- [19] = Instance dart.core::_ImmutableMap type-args CP#12 {_kvPairs: 18}
- [20] = StaticICData target 'dart.core::print', arg-desc CP#1
- [21] = Int 9
- [22] = Int 30
- [23] = Instance #lib::C type-args CP#5 {j: 21, i: 22}
- [24] = TypeArgs [dart.core::String, dart.core::Object]
- [25] = String 'bar'
- [26] = Int 6
- [27] = Instance #lib::B type-args CP#5 {i: 26}
- [28] = List type-arg dynamic, entries CP# [3, 0, 25, 27]
- [29] = Instance dart.core::_ImmutableMap type-args CP#24 {_kvPairs: 28}
- [30] = Instance #lib::D type-args CP#5 {x: 23, y: 29}
- [31] = StaticICData target 'dart.core::print', arg-desc CP#1
- [32] = Null
+ [10] = Type dart.core::int
+ [11] = List type-arg dart.core::Object, entries CP# [0, 3, 10]
+ [12] = StaticICData target 'dart.core::print', arg-desc CP#1
+ [13] = TypeArgs [dart.core::String, #lib::A]
+ [14] = String 'E2'
+ [15] = String 'E4'
+ [16] = Int 3
+ [17] = String 'A.elem4'
+ [18] = Instance #lib::A type-args CP#5 {index: 16, _name: 17}
+ [19] = List type-arg dynamic, entries CP# [14, 8, 15, 18]
+ [20] = Instance dart.core::_ImmutableMap type-args CP#13 {_kvPairs: 19}
+ [21] = StaticICData target 'dart.core::print', arg-desc CP#1
+ [22] = Int 9
+ [23] = Int 30
+ [24] = Instance #lib::C type-args CP#5 {j: 22, i: 23}
+ [25] = TypeArgs [dart.core::String, dart.core::Object]
+ [26] = String 'bar'
+ [27] = Int 6
+ [28] = Instance #lib::B type-args CP#5 {i: 27}
+ [29] = List type-arg dynamic, entries CP# [3, 0, 26, 28]
+ [30] = Instance dart.core::_ImmutableMap type-args CP#25 {_kvPairs: 29}
+ [31] = Instance #lib::D type-args CP#5 {x: 24, y: 30}
+ [32] = StaticICData target 'dart.core::print', arg-desc CP#1
+ [33] = Null
}
]static method test_constants2() → void {
core::print(42);
core::print("foo");
core::print(self::A::elem2);
- core::print(const <core::Object>[42, "foo"]);
+ core::print(const <core::Object>[42, "foo", core::int]);
core::print(const <core::String, self::A>{"E2": self::A::elem2, "E4": self::A::elem4});
core::print(const self::D::•(const self::C::•(4, 5, 6), const <core::String, core::Object>{"foo": 42, "bar": const self::B::•(self::c2.{core::String::length})}));
}
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index c53b8d1..5f1721d 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -61,20 +61,22 @@
static char* GetDirectoryPrefixFromExeName() {
const char* name = Platform::GetExecutableName();
const char* sep = File::PathSeparator();
- // Locate the last occurance of |sep| in |name|.
- intptr_t i;
- for (i = strlen(name) - 1; i >= 0; --i) {
+ const intptr_t sep_length = strlen(sep);
+
+ for (intptr_t i = strlen(name) - 1; i >= 0; --i) {
const char* str = name + i;
- if (strstr(str, sep) == str) {
- break;
+ if (strncmp(str, sep, sep_length) == 0
+#if defined(HOST_OS_WINDOWS)
+ // TODO(aam): GetExecutableName doesn't work reliably on Windows,
+ // the code below is a workaround for that (we would be using
+ // just single Platform::Separator instead of both slashes if it did).
+ || *str == '/'
+#endif
+ ) {
+ return Utils::StrNDup(name, i + 1);
}
}
-
- if (i < 0) {
- return strdup("");
- }
-
- return Utils::StrNDup(name, i + 1);
+ return strdup("");
}
DFE::DFE()
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 76dec67..38b59c3 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -251,6 +251,9 @@
}
auto isolate_data = new IsolateData(script_uri, NULL, NULL, NULL);
+ // Kernel buffer released by ~IsolateData during isolate shutdown.
+ isolate_data->set_kernel_buffer(payload, payload_length,
+ true /*take ownership*/);
// We bootstrap the isolate from the Kernel file (instead of using a
// potentially linked-in kernel file).
@@ -263,7 +266,6 @@
Dart_EnterScope();
Dart_Handle library = Dart_LoadScriptFromKernel(payload, payload_length);
- free(payload);
CHECK_RESULT(library);
Dart_Handle url = DartUtils::NewString("dart:_builtin");
CHECK_RESULT(url);
diff --git a/runtime/configs.gni b/runtime/configs.gni
index 648083d..be99ecd 100644
--- a/runtime/configs.gni
+++ b/runtime/configs.gni
@@ -206,12 +206,6 @@
if (defined(invoker.extra_deps)) {
extra_deps += invoker.extra_deps
}
- not_needed(invoker,
- [
- "snapshot_sources",
- "nosnapshot_sources",
- "nosnapshot_deps",
- ])
foreach(conf, _all_configs) {
target(invoker.target_type, "${target_name}${conf.suffix}") {
forward_variables_from(invoker,
@@ -231,11 +225,20 @@
}
deps = configured_deps + extra_deps
if (conf.snapshot) {
- if (defined(invoker.snapshot_sources)) {
+ if (defined(snapshot_sources)) {
sources += snapshot_sources
}
+ if (defined(nosnapshot_sources)) {
+ not_needed([ "nosnapshot_sources" ])
+ }
+ if (defined(nosnapshot_deps)) {
+ not_needed([ "nosnapshot_deps" ])
+ }
} else {
- if (defined(invoker.nosnapshot_sources)) {
+ if (defined(snapshot_sources)) {
+ not_needed([ "snapshot_sources" ])
+ }
+ if (defined(nosnapshot_sources)) {
sources += nosnapshot_sources
}
if (defined(nosnapshot_deps)) {
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 4d54a54..3934bda 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -753,9 +753,11 @@
* \param version Identifies the version of the struct used by the client.
* should be initialized to DART_INITIALIZE_PARAMS_CURRENT_VERSION.
* \param vm_isolate_snapshot A buffer containing a snapshot of the VM isolate
- * or NULL if no snapshot is provided.
+ * or NULL if no snapshot is provided. If provided, the buffer must remain
+ * valid until Dart_Cleanup returns.
* \param instructions_snapshot A buffer containing a snapshot of precompiled
- * instructions, or NULL if no snapshot is provided.
+ * instructions, or NULL if no snapshot is provided. If provided, the buffer
+ * must remain valid until Dart_Cleanup returns.
* \param create A function to be called during isolate creation.
* See Dart_IsolateCreateCallback.
* \param shutdown A function to be called when an isolate is shutdown.
@@ -846,7 +848,8 @@
* 'main' or the name of the function passed to Isolate.spawn.
* \param isolate_snapshot_data
* \param isolate_snapshot_instructions Buffers containing a snapshot of the
- * isolate or NULL if no snapshot is provided.
+ * isolate or NULL if no snapshot is provided. If provided, the buffers must
+ * remain valid until the isolate shuts down.
* \param flags Pointer to VM specific flags or NULL for default flags.
* \param callback_data Embedder data. This data will be passed to
* the Dart_IsolateCreateCallback when new isolates are spawned from
@@ -883,7 +886,9 @@
* \param main The name of the main entry point this isolate will run. Provided
* only for advisory purposes to improve debugging messages. Typically either
* 'main' or the name of the function passed to Isolate.spawn.
- * \param kernel_program The `dart::kernel::Program` object.
+ * \param kernel_buffer
+ * \param kernel_buffer_size A buffer which contains a kernel/DIL program. Must
+ * remain valid until isolate shutdown.
* \param flags Pointer to VM specific flags or NULL for default flags.
* \param callback_data Embedder data. This data will be passed to
* the Dart_IsolateCreateCallback when new isolates are spawned from
@@ -2990,7 +2995,8 @@
* snapshot must have been created by Dart_CreateScriptSnapshot from a VM with
* the same version.
*
- * \param buffer A buffer which contains a snapshot of the script.
+ * \param buffer A buffer which contains a snapshot of the script. May be
+ * released when this function returns.
* \param buffer_len Length of the passed in buffer.
*
* \return If no error occurs, the Library object corresponding to the root
@@ -3006,7 +3012,7 @@
* Requires there to be no current root library.
*
* \param buffer A buffer which contains a kernel binary (see
- * pkg/kernel/binary.md).
+ * pkg/kernel/binary.md). Must remain valid until isolate shutdown.
* \param buffer_size Length of the passed in buffer.
*
* \return A handle to the root library, or an error.
@@ -3128,7 +3134,7 @@
* library.
*
* \param buffer A buffer which contains a kernel binary (see
- * pkg/kernel/binary.md).
+ * pkg/kernel/binary.md). Must remain valid until isolate shutdown.
* \param buffer_size Length of the passed in buffer.
*
* \return A handle to the main library of the compilation unit, or an error.
@@ -3313,7 +3319,9 @@
int source_files_count,
Dart_SourceFile source_files[],
bool incremental_compile,
- const char* package_config);
+ const char* package_config,
+ const char* multiroot_filepaths,
+ const char* multiroot_scheme);
DART_EXPORT Dart_KernelCompilationResult Dart_KernelListDependencies();
diff --git a/runtime/observatory/.packages b/runtime/observatory/.packages
index 5cd569a..08b8b0b 100644
--- a/runtime/observatory/.packages
+++ b/runtime/observatory/.packages
@@ -1,42 +1,14 @@
-# Generated by pub on 2017-07-31 13:06:32.808969.
-analyzer:../../third_party/observatory_pub_packages/packages/analyzer/lib/
-args:../../third_party/observatory_pub_packages/packages/args/lib/
-async:../../third_party/observatory_pub_packages/packages/async/lib/
-barback:../../third_party/observatory_pub_packages/packages/barback/lib/
-browser:../../third_party/observatory_pub_packages/packages/browser/lib/
-charcode:../../third_party/observatory_pub_packages/packages/charcode/lib/
-charted:../../third_party/observatory_pub_packages/packages/charted/lib/
-cli_util:../../third_party/observatory_pub_packages/packages/cli_util/lib/
-code_transformers:../../third_party/observatory_pub_packages/packages/code_transformers/lib/
-collection:../../third_party/observatory_pub_packages/packages/collection/lib/
-convert:../../third_party/observatory_pub_packages/packages/convert/lib/
-crypto:../../third_party/observatory_pub_packages/packages/crypto/lib/
-csslib:../../third_party/observatory_pub_packages/packages/csslib/lib/
-dart_style:../../third_party/observatory_pub_packages/packages/dart_style/lib/
-dart_to_js_script_rewriter:../../third_party/observatory_pub_packages/packages/dart_to_js_script_rewriter/lib/
-glob:../../third_party/observatory_pub_packages/packages/glob/lib/
-html:../../third_party/observatory_pub_packages/packages/html/lib/
-initialize:../../third_party/observatory_pub_packages/packages/initialize/lib/
-intl:../../third_party/observatory_pub_packages/packages/intl/lib/
-isolate:../../third_party/observatory_pub_packages/packages/isolate/lib/
-logging:../../third_party/observatory_pub_packages/packages/logging/lib/
-matcher:../../third_party/observatory_pub_packages/packages/matcher/lib/
-meta:../../third_party/observatory_pub_packages/packages/meta/lib/
-observable:../../third_party/observatory_pub_packages/packages/observable/lib/
-package_config:../../third_party/observatory_pub_packages/packages/package_config/lib/
-path:../../third_party/observatory_pub_packages/packages/path/lib/
-plugin:../../third_party/observatory_pub_packages/packages/plugin/lib/
-pool:../../third_party/observatory_pub_packages/packages/pool/lib/
-quiver:../../third_party/observatory_pub_packages/packages/quiver/lib/
-source_maps:../../third_party/observatory_pub_packages/packages/source_maps/lib/
-source_span:../../third_party/observatory_pub_packages/packages/source_span/lib/
-stack_trace:../../third_party/observatory_pub_packages/packages/stack_trace/lib/
-string_scanner:../../third_party/observatory_pub_packages/packages/string_scanner/lib/
-typed_data:../../third_party/observatory_pub_packages/packages/typed_data/lib/
-unittest:../../third_party/observatory_pub_packages/packages/unittest/lib/
-usage:../../third_party/observatory_pub_packages/packages/usage/lib/
-utf:../../third_party/observatory_pub_packages/packages/utf/lib/
-watcher:../../third_party/observatory_pub_packages/packages/watcher/lib/
-web_components:../../third_party/observatory_pub_packages/packages/web_components/lib/
-yaml:../../third_party/observatory_pub_packages/packages/yaml/lib/
+browser:../../third_party/observatory_pub_packages/packages/browser/lib
+charted:../../third_party/observatory_pub_packages/packages/charted/lib
+collection:../../third_party/observatory_pub_packages/packages/collection/lib
+intl:../../third_party/observatory_pub_packages/packages/intl/lib
+logging:../../third_party/observatory_pub_packages/packages/logging/lib
+matcher:../../third_party/observatory_pub_packages/packages/matcher/lib
+meta:../../third_party/observatory_pub_packages/packages/meta/lib
+observable:../../third_party/observatory_pub_packages/packages/observable/lib
+path:../../third_party/observatory_pub_packages/packages/path/lib
+quiver:../../third_party/observatory_pub_packages/packages/quiver/lib
+stack_trace:../../third_party/observatory_pub_packages/packages/stack_trace/lib
+unittest:../../third_party/observatory_pub_packages/packages/unittest/lib
+usage:../../third_party/observatory_pub_packages/packages/usage/lib
observatory:lib/
diff --git a/runtime/observatory/BUILD.gn b/runtime/observatory/BUILD.gn
index af4db77..181a9cd 100644
--- a/runtime/observatory/BUILD.gn
+++ b/runtime/observatory/BUILD.gn
@@ -33,7 +33,7 @@
sources = rebase_path(observatory_sources, "", ".")
- inputs = sources + [ rebase_path("dart2js.packages") ]
+ inputs = sources + [ rebase_path(".packages") ]
script = "../../tools/observatory_tool.py"
args = build_args + [
@@ -44,7 +44,7 @@
"build",
rebase_path("web/main.dart"),
rebase_path("$target_gen_dir/observatory/web/main.dart.js"),
- rebase_path("dart2js.packages"),
+ rebase_path(".packages"),
]
outputs = [
diff --git a/runtime/observatory/dart2js.packages b/runtime/observatory/dart2js.packages
deleted file mode 100644
index b042c03..0000000
--- a/runtime/observatory/dart2js.packages
+++ /dev/null
@@ -1,24 +0,0 @@
-# Update if observatory dependencies change
-args:../../third_party/observatory_pub_packages/packages/args/lib
-async:../../third_party/observatory_pub_packages/packages/async/lib
-barback:../../third_party/observatory_pub_packages/packages/barback/lib
-browser:../../third_party/observatory_pub_packages/packages/browser/lib
-charcode:../../third_party/observatory_pub_packages/packages/charcode/lib
-charted:../../third_party/observatory_pub_packages/packages/charted/lib
-collection:../../third_party/observatory_pub_packages/packages/collection/lib
-csslib:../../third_party/observatory_pub_packages/packages/csslib/lib
-html:../../third_party/observatory_pub_packages/packages/html/lib
-intl:../../third_party/observatory_pub_packages/packages/intl/lib
-logging:../../third_party/observatory_pub_packages/packages/logging/lib
-matcher:../../third_party/observatory_pub_packages/packages/matcher/lib
-meta:../../third_party/observatory_pub_packages/packages/meta/lib
-observable:../../third_party/observatory_pub_packages/packages/observable/lib
-path:../../third_party/observatory_pub_packages/packages/path/lib
-pool:../../third_party/observatory_pub_packages/packages/pool/lib
-quiver:../../third_party/observatory_pub_packages/packages/quiver/lib
-source_span:../../third_party/observatory_pub_packages/packages/source_span/lib
-stack_trace:../../third_party/observatory_pub_packages/packages/stack_trace/lib
-unittest:../../third_party/observatory_pub_packages/packages/unittest/lib
-usage:../../third_party/observatory_pub_packages/packages/usage/lib
-utf:../../third_party/observatory_pub_packages/packages/utf/lib
-observatory:lib/
diff --git a/runtime/observatory/lib/src/app/analytics.dart b/runtime/observatory/lib/src/app/analytics.dart
index 8f09f61..484f7da 100644
--- a/runtime/observatory/lib/src/app/analytics.dart
+++ b/runtime/observatory/lib/src/app/analytics.dart
@@ -14,7 +14,7 @@
// We only send screen views. This is allowed without user permission.
// Note, before flipping this to be true we need a UI to allow users to
// control this.
- _googleAnalytics.optIn = false;
+ _googleAnalytics.analyticsOpt = AnalyticsOpt.optOut;
}
/// Called whenever an Observatory page is viewed.
diff --git a/runtime/observatory/lib/src/elements/function_view.dart b/runtime/observatory/lib/src/elements/function_view.dart
index 93cc57c..c3edda8 100644
--- a/runtime/observatory/lib/src/elements/function_view.dart
+++ b/runtime/observatory/lib/src/elements/function_view.dart
@@ -433,6 +433,8 @@
return 'tag';
case M.FunctionKind.signatureFunction:
return 'signature function';
+ case M.FunctionKind.dynamicInvocationForwarder:
+ return 'dynamic invocation forwarder';
}
throw new Exception('Unknown Functionkind ($kind)');
}
diff --git a/runtime/observatory/lib/src/models/objects/function.dart b/runtime/observatory/lib/src/models/objects/function.dart
index 904038d..e619f5e 100644
--- a/runtime/observatory/lib/src/models/objects/function.dart
+++ b/runtime/observatory/lib/src/models/objects/function.dart
@@ -23,7 +23,8 @@
native,
stub,
tag,
- signatureFunction
+ signatureFunction,
+ dynamicInvocationForwarder
}
bool isSyntheticFunction(FunctionKind kind) {
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index ace655c..768262c 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -3112,6 +3112,8 @@
return M.FunctionKind.tag;
case 'SignatureFunction':
return M.FunctionKind.signatureFunction;
+ case 'DynamicInvocationForwarder':
+ return M.FunctionKind.dynamicInvocationForwarder;
}
Logger.root.severe('Unrecognized function kind: $value');
throw new FallThroughError();
diff --git a/runtime/observatory/maintainers/.gitignore b/runtime/observatory/maintainers/.gitignore
deleted file mode 100644
index 21a2d71..0000000
--- a/runtime/observatory/maintainers/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-observatory_pub_packages
-packages
-pubspec.yaml
-pubspec.lock
diff --git a/runtime/observatory/maintainers/pubspec.template b/runtime/observatory/maintainers/pubspec.template
deleted file mode 100644
index 87154f3..0000000
--- a/runtime/observatory/maintainers/pubspec.template
+++ /dev/null
@@ -1,20 +0,0 @@
-name: observatory
-version: 1.6.0-dev.1
-transformers:
-- polymer:
- entry_points:
- - web/index.html
- inline_stylesheets:
- lib/src/elements/css/shared.css: false
-- $dart2js:
- $include: "**/*.polymer.bootstrap.dart"
- suppressWarnings: false
- commandLineOptions: [--show-package-warnings]
-dependencies:
- args: any
- charted: ^0.2.9
- polymer: any
- unittest: < 0.12.0
- usage: any
- code_transformers: 0.2.9
-
diff --git a/runtime/observatory/maintainers/snapshot_dependencies.sh b/runtime/observatory/maintainers/snapshot_dependencies.sh
deleted file mode 100755
index 68803cf..0000000
--- a/runtime/observatory/maintainers/snapshot_dependencies.sh
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/bin/sh
-
-# This script will create a deep snapshot of all Observatory package
-# dependencies. The output will be in observatory_pub_packages which
-# then should be committed to third_party/observatory_pub_packages.
-
-
-PUBSPEC_INPUT="pubspec.template"
-PUBSPEC_OUTPUT="pubspec.yaml"
-PACKAGES_INPUT="packages"
-PACKAGES_OUTPUT="observatory_pub_packages"
-
-if [ ! -d "../maintainers" ]; then
- echo "Please run this script from the maintainers directory"
- exit
-fi
-
-if [ ! -f $PUBSPEC_INPUT ]; then
- echo "Cannot find $PUBSPEC_INPUT"
- exit
-fi
-
-# Cleanup leftovers
-rm -f $PUBSPEC_OUTPUT
-rm -rf $PACKAGES_INPUT
-rm -rf $PACKAGES_OUTPUT
-
-# Setup for pub get run
-cp $PUBSPEC_INPUT $PUBSPEC_OUTPUT
-
-# Run pub get
-pub get
-
-# Prepare for output
-mkdir $PACKAGES_OUTPUT
-
-OUTPUT_BASE=`realpath $PACKAGES_OUTPUT`
-# Copy necessary files
-pushd $PACKAGES_INPUT > /dev/null
-for i in *; do
- ACTUAL_PATH=`realpath $i`
- mkdir $OUTPUT_BASE/$i
- mkdir $OUTPUT_BASE/$i/lib
- cp $ACTUAL_PATH/../pubspec.yaml $OUTPUT_BASE/$i/pubspec.yaml
- rsync -Lr $ACTUAL_PATH/* $OUTPUT_BASE/$i/lib
-done
-popd > /dev/null
-
-echo '***'
-echo 'Dumping package dependencies:':
-echo ''
-echo 'dependency_overrides:'
-pushd $PACKAGES_OUTPUT > /dev/null
-for i in *; do
- echo -e " $i:\n path: ../../third_party/$PACKAGES_OUTPUT/$i"
-done
-popd > /dev/null
-echo ''
-echo '***'
-echo -n 'Now run: rsync -a --delete observatory_pub_packages/ '
-echo '~/workspace/dart-third_party/observatory_pub_packages/'
-echo 'Then: '
-echo 'cd ~/workspace/dart-third_party/observatory_pub_packages/'
-echo "svn status | grep ^? | sed 's/? //' | xargs svn add"
-echo "svn st | grep ^! | sed 's/! //' | xargs svn rm"
-echo '***'
diff --git a/runtime/observatory/pubspec.lock b/runtime/observatory/pubspec.lock
deleted file mode 100644
index edcad95..0000000
--- a/runtime/observatory/pubspec.lock
+++ /dev/null
@@ -1,245 +0,0 @@
-# Generated by pub
-# See http://pub.dartlang.org/doc/glossary.html#lockfile
-packages:
- analyzer:
- description:
- path: "../../third_party/observatory_pub_packages/packages/analyzer"
- relative: true
- source: path
- version: "0.29.5"
- args:
- description:
- path: "../../third_party/observatory_pub_packages/packages/args"
- relative: true
- source: path
- version: "0.13.7"
- async:
- description:
- path: "../../third_party/observatory_pub_packages/packages/async"
- relative: true
- source: path
- version: "1.13.3"
- barback:
- description:
- path: "../../third_party/observatory_pub_packages/packages/barback"
- relative: true
- source: path
- version: "0.15.2+11"
- browser:
- description:
- path: "../../third_party/observatory_pub_packages/packages/browser"
- relative: true
- source: path
- version: "0.10.0+2"
- charcode:
- description:
- path: "../../third_party/observatory_pub_packages/packages/charcode"
- relative: true
- source: path
- version: "1.1.1"
- charted:
- description:
- path: "../../third_party/observatory_pub_packages/packages/charted"
- relative: true
- source: path
- version: "0.4.8"
- cli_util:
- description:
- path: "../../third_party/observatory_pub_packages/packages/cli_util"
- relative: true
- source: path
- version: "0.1.2"
- code_transformers:
- description:
- path: "../../third_party/observatory_pub_packages/packages/code_transformers"
- relative: true
- source: path
- version: "0.5.1+3"
- collection:
- description:
- path: "../../third_party/observatory_pub_packages/packages/collection"
- relative: true
- source: path
- version: "1.14.3"
- convert:
- description:
- path: "../../third_party/observatory_pub_packages/packages/convert"
- relative: true
- source: path
- version: "2.0.1"
- crypto:
- description:
- path: "../../third_party/observatory_pub_packages/packages/crypto"
- relative: true
- source: path
- version: "2.0.2"
- csslib:
- description:
- path: "../../third_party/observatory_pub_packages/packages/csslib"
- relative: true
- source: path
- version: "0.14.0"
- dart_style:
- description:
- path: "../../third_party/observatory_pub_packages/packages/dart_style"
- relative: true
- source: path
- version: "0.2.16"
- dart_to_js_script_rewriter:
- description:
- path: "../../third_party/observatory_pub_packages/packages/dart_to_js_script_rewriter"
- relative: true
- source: path
- version: "1.0.3"
- glob:
- description:
- path: "../../third_party/observatory_pub_packages/packages/glob"
- relative: true
- source: path
- version: "1.1.3"
- html:
- description:
- path: "../../third_party/observatory_pub_packages/packages/html"
- relative: true
- source: path
- version: "0.13.2"
- initialize:
- description:
- path: "../../third_party/observatory_pub_packages/packages/initialize"
- relative: true
- source: path
- version: "0.6.2+6"
- intl:
- description:
- path: "../../third_party/observatory_pub_packages/packages/intl"
- relative: true
- source: path
- version: "0.15.1"
- isolate:
- description:
- path: "../../third_party/observatory_pub_packages/packages/isolate"
- relative: true
- source: path
- version: "0.2.3"
- logging:
- description:
- path: "../../third_party/observatory_pub_packages/packages/logging"
- relative: true
- source: path
- version: "0.11.3+1"
- matcher:
- description:
- path: "../../third_party/observatory_pub_packages/packages/matcher"
- relative: true
- source: path
- version: "0.12.1+1"
- meta:
- description:
- path: "../../third_party/observatory_pub_packages/packages/meta"
- relative: true
- source: path
- version: "1.1.1"
- observable:
- description:
- path: "../../third_party/observatory_pub_packages/packages/observable"
- relative: true
- source: path
- version: "0.14.0+1"
- package_config:
- description:
- path: "../../third_party/observatory_pub_packages/packages/package_config"
- relative: true
- source: path
- version: "1.0.2"
- path:
- description:
- path: "../../third_party/observatory_pub_packages/packages/path"
- relative: true
- source: path
- version: "1.4.2"
- plugin:
- description:
- path: "../../third_party/observatory_pub_packages/packages/plugin"
- relative: true
- source: path
- version: "0.2.0+1"
- pool:
- description:
- path: "../../third_party/observatory_pub_packages/packages/pool"
- relative: true
- source: path
- version: "1.3.1"
- quiver:
- description:
- path: "../../third_party/observatory_pub_packages/packages/quiver"
- relative: true
- source: path
- version: "0.25.0"
- source_maps:
- description:
- path: "../../third_party/observatory_pub_packages/packages/source_maps"
- relative: true
- source: path
- version: "0.10.4"
- source_span:
- description:
- path: "../../third_party/observatory_pub_packages/packages/source_span"
- relative: true
- source: path
- version: "1.4.0"
- stack_trace:
- description:
- path: "../../third_party/observatory_pub_packages/packages/stack_trace"
- relative: true
- source: path
- version: "1.8.0"
- string_scanner:
- description:
- path: "../../third_party/observatory_pub_packages/packages/string_scanner"
- relative: true
- source: path
- version: "1.0.2"
- typed_data:
- description:
- path: "../../third_party/observatory_pub_packages/packages/typed_data"
- relative: true
- source: path
- version: "1.1.3"
- unittest:
- description:
- path: "../../third_party/observatory_pub_packages/packages/unittest"
- relative: true
- source: path
- version: "0.11.7"
- usage:
- description:
- path: "../../third_party/observatory_pub_packages/packages/usage"
- relative: true
- source: path
- version: "1.2.0"
- utf:
- description:
- path: "../../third_party/observatory_pub_packages/packages/utf"
- relative: true
- source: path
- version: "0.9.0+3"
- watcher:
- description:
- path: "../../third_party/observatory_pub_packages/packages/watcher"
- relative: true
- source: path
- version: "0.9.7+3"
- web_components:
- description:
- path: "../../third_party/observatory_pub_packages/packages/web_components"
- relative: true
- source: path
- version: "0.12.5"
- yaml:
- description:
- path: "../../third_party/observatory_pub_packages/packages/yaml"
- relative: true
- source: path
- version: "2.1.12"
-sdks:
- dart: any
diff --git a/runtime/observatory/tests/observatory_ui/allocation_profile/element_test.html b/runtime/observatory/tests/observatory_ui/allocation_profile/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/allocation_profile/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/allocation_profile/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/class_ref/element_test.html b/runtime/observatory/tests/observatory_ui/class_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/class_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/class_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/class_tree/element_test.html b/runtime/observatory/tests/observatory_ui/class_tree/element_test.html
index 8996ea9..bc26958 100644
--- a/runtime/observatory/tests/observatory_ui/class_tree/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/class_tree/element_test.html
@@ -15,7 +15,6 @@
padding-right: 10%;
}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/code_ref/element_test.html b/runtime/observatory/tests/observatory_ui/code_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/code_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/code_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/context_ref/element_test.html b/runtime/observatory/tests/observatory_ui/context_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/context_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/context_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/context_view/element_test.html b/runtime/observatory/tests/observatory_ui/context_view/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/context_view/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/context_view/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/cpu_profile/element_test.html b/runtime/observatory/tests/observatory_ui/cpu_profile/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/cpu_profile/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/cpu_profile/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/cpu_profile/virtual-tree/element_test.html b/runtime/observatory/tests/observatory_ui/cpu_profile/virtual-tree/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/cpu_profile/virtual-tree/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/cpu_profile/virtual-tree/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/cpu_profile_table/element_test.html b/runtime/observatory/tests/observatory_ui/cpu_profile_table/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/cpu_profile_table/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/cpu_profile_table/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/curly_block/element_test.html b/runtime/observatory/tests/observatory_ui/curly_block/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/curly_block/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/curly_block/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/error_ref/element_test.html b/runtime/observatory/tests/observatory_ui/error_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/error_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/error_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/error_view/element_test.html b/runtime/observatory/tests/observatory_ui/error_view/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/error_view/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/error_view/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/field_ref/element_test.html b/runtime/observatory/tests/observatory_ui/field_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/field_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/field_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/flag_list/element_test.html b/runtime/observatory/tests/observatory_ui/flag_list/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/flag_list/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/flag_list/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/function_ref/element_test.html b/runtime/observatory/tests/observatory_ui/function_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/function_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/function_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/general_error/element_test.html b/runtime/observatory/tests/observatory_ui/general_error/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/general_error/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/general_error/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/heap_snapshot/element_test.html b/runtime/observatory/tests/observatory_ui/heap_snapshot/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/heap_snapshot/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/heap_snapshot/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/icdata_ref/element_test.html b/runtime/observatory/tests/observatory_ui/icdata_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/icdata_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/icdata_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/icdata_view/element_test.html b/runtime/observatory/tests/observatory_ui/icdata_view/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/icdata_view/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/icdata_view/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/inbound_references/element_test.html b/runtime/observatory/tests/observatory_ui/inbound_references/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/inbound_references/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/inbound_references/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/instance_ref/element_test.html b/runtime/observatory/tests/observatory_ui/instance_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/instance_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/instance_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/isolate/counter_chart/element_test.html b/runtime/observatory/tests/observatory_ui/isolate/counter_chart/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/isolate/counter_chart/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/isolate/counter_chart/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/isolate/isolate-shared-summary/element_test.html b/runtime/observatory/tests/observatory_ui/isolate/isolate-shared-summary/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/isolate/isolate-shared-summary/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/isolate/isolate-shared-summary/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/isolate_reconnect/element_test.html b/runtime/observatory/tests/observatory_ui/isolate_reconnect/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/isolate_reconnect/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/isolate_reconnect/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/isolate_ref/element_test.html b/runtime/observatory/tests/observatory_ui/isolate_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/isolate_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/isolate_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/library_ref/element_test.html b/runtime/observatory/tests/observatory_ui/library_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/library_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/library_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/local_var_descriptor_ref/element_test.html b/runtime/observatory/tests/observatory_ui/local_var_descriptor_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/local_var_descriptor_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/local_var_descriptor_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/megamorphiccache_ref/element_test.html b/runtime/observatory/tests/observatory_ui/megamorphiccache_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/megamorphiccache_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/megamorphiccache_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/megamorphiccache_view/element_test.html b/runtime/observatory/tests/observatory_ui/megamorphiccache_view/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/megamorphiccache_view/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/megamorphiccache_view/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/class-menu/element_test.html b/runtime/observatory/tests/observatory_ui/nav/class-menu/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/class-menu/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/class-menu/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/isolate-menu/element_test.html b/runtime/observatory/tests/observatory_ui/nav/isolate-menu/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/isolate-menu/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/isolate-menu/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/library-menu/element_test.html b/runtime/observatory/tests/observatory_ui/nav/library-menu/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/library-menu/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/library-menu/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/menu-item/element_test.html b/runtime/observatory/tests/observatory_ui/nav/menu-item/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/menu-item/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/menu-item/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/notify/element_test.html b/runtime/observatory/tests/observatory_ui/nav/notify/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/notify/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/notify/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/notify_event/element_test.html b/runtime/observatory/tests/observatory_ui/nav/notify_event/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/notify_event/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/notify_event/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/notify_exception/connection_exception_test.html b/runtime/observatory/tests/observatory_ui/nav/notify_exception/connection_exception_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/notify_exception/connection_exception_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/notify_exception/connection_exception_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/notify_exception/exception_test.html b/runtime/observatory/tests/observatory_ui/nav/notify_exception/exception_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/notify_exception/exception_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/notify_exception/exception_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/refresh/element_test.html b/runtime/observatory/tests/observatory_ui/nav/refresh/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/refresh/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/refresh/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/top_menu/element_test.html b/runtime/observatory/tests/observatory_ui/nav/top_menu/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/top_menu/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/top_menu/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/nav/vm_menu/element_test.html b/runtime/observatory/tests/observatory_ui/nav/vm_menu/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/nav/vm_menu/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/nav/vm_menu/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/object_common/element_test.html b/runtime/observatory/tests/observatory_ui/object_common/element_test.html
index 4b01e65..39c5683 100644
--- a/runtime/observatory/tests/observatory_ui/object_common/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/object_common/element_test.html
@@ -10,7 +10,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/objectpool_ref/element_test.html b/runtime/observatory/tests/observatory_ui/objectpool_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/objectpool_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/objectpool_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/objectpool_view/element_test.html b/runtime/observatory/tests/observatory_ui/objectpool_view/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/objectpool_view/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/objectpool_view/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/objectstore_view/element_test.html b/runtime/observatory/tests/observatory_ui/objectstore_view/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/objectstore_view/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/objectstore_view/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/pc_descriptors_ref/element_test.html b/runtime/observatory/tests/observatory_ui/pc_descriptors_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/pc_descriptors_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/pc_descriptors_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/persistent_handles_page/element_test.html b/runtime/observatory/tests/observatory_ui/persistent_handles_page/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/persistent_handles_page/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/persistent_handles_page/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/ports/element_test.html b/runtime/observatory/tests/observatory_ui/ports/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/ports/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/ports/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/retaining_path/element_test.html b/runtime/observatory/tests/observatory_ui/retaining_path/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/retaining_path/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/retaining_path/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/sample_buffer_control/element_test.html b/runtime/observatory/tests/observatory_ui/sample_buffer_control/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/sample_buffer_control/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/sample_buffer_control/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/script_ref/element_test.html b/runtime/observatory/tests/observatory_ui/script_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/script_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/script_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/sentinel_value/element_test.html b/runtime/observatory/tests/observatory_ui/sentinel_value/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/sentinel_value/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/sentinel_value/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/source_link/element_test.html b/runtime/observatory/tests/observatory_ui/source_link/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/source_link/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/source_link/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/stack_trace_tree_config/element_test.html b/runtime/observatory/tests/observatory_ui/stack_trace_tree_config/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/stack_trace_tree_config/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/stack_trace_tree_config/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/token_stream_ref/element_test.html b/runtime/observatory/tests/observatory_ui/token_stream_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/token_stream_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/token_stream_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/unknown_ref/element_test.html b/runtime/observatory/tests/observatory_ui/unknown_ref/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/unknown_ref/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/unknown_ref/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/view_footer/element_test.html b/runtime/observatory/tests/observatory_ui/view_footer/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/view_footer/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/view_footer/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/virtual_tree/element_test.html b/runtime/observatory/tests/observatory_ui/virtual_tree/element_test.html
index 75fd7c6..92c3180 100644
--- a/runtime/observatory/tests/observatory_ui/virtual_tree/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/virtual_tree/element_test.html
@@ -19,7 +19,6 @@
height: 20px;
}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<div class="test_container">
diff --git a/runtime/observatory/tests/observatory_ui/vm_connect/element_test.html b/runtime/observatory/tests/observatory_ui/vm_connect/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/vm_connect/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/vm_connect/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/observatory_ui/vm_connect_target/element_test.html b/runtime/observatory/tests/observatory_ui/vm_connect_target/element_test.html
index 8195849..f548be4 100644
--- a/runtime/observatory/tests/observatory_ui/vm_connect_target/element_test.html
+++ b/runtime/observatory/tests/observatory_ui/vm_connect_target/element_test.html
@@ -9,7 +9,6 @@
.unittest-fail { background: #d55;}
.unittest-error { background: #a11;}
</style>
- <script src="/root_dart/runtime/observatory/packages/web_components/webcomponents-lite.min.js"></script>
</head>
<body>
<script type="text/javascript"
diff --git a/runtime/observatory/tests/service/coverage_leaf_function_test.dart b/runtime/observatory/tests/service/coverage_leaf_function_test.dart
index 51df112..4b70c13 100644
--- a/runtime/observatory/tests/service/coverage_leaf_function_test.dart
+++ b/runtime/observatory/tests/service/coverage_leaf_function_test.dart
@@ -45,12 +45,12 @@
var expectedRange = {
'scriptIndex': 0,
- 'startPos': ifKernel(456, 26),
+ 'startPos': ifKernel(449, 26),
'endPos': ifKernel(499, 38),
'compiled': true,
'coverage': {
'hits': ifKernel([], []),
- 'misses': ifKernel([456], [26])
+ 'misses': ifKernel([449], [26])
}
};
@@ -86,11 +86,11 @@
var expectedRange = {
'scriptIndex': 0,
- 'startPos': ifKernel(456, 26),
+ 'startPos': ifKernel(449, 26),
'endPos': ifKernel(499, 38),
'compiled': true,
'coverage': {
- 'hits': ifKernel([456], [26]),
+ 'hits': ifKernel([449], [26]),
'misses': ifKernel([], [])
}
};
diff --git a/runtime/observatory/tests/service/coverage_optimized_function_test.dart b/runtime/observatory/tests/service/coverage_optimized_function_test.dart
index f883e9a..e7a38e7 100644
--- a/runtime/observatory/tests/service/coverage_optimized_function_test.dart
+++ b/runtime/observatory/tests/service/coverage_optimized_function_test.dart
@@ -37,11 +37,11 @@
var expectedRange = {
'scriptIndex': 0,
- 'startPos': ifKernel(476, 26),
+ 'startPos': ifKernel(469, 26),
'endPos': ifKernel(536, 51),
'compiled': true,
'coverage': {
- 'hits': ifKernel([476, 509, 520, 524], [26, 37, 41, 45]),
+ 'hits': ifKernel([469, 509, 520, 524], [26, 37, 41, 45]),
'misses': ifKernel([], [])
}
};
diff --git a/runtime/observatory/tests/service/get_source_report_test.dart b/runtime/observatory/tests/service/get_source_report_test.dart
index d11c722..d1dda8d 100644
--- a/runtime/observatory/tests/service/get_source_report_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_test.dart
@@ -61,11 +61,11 @@
var expectedRange = {
'scriptIndex': 0,
- 'startPos': ifKernel(501, 40),
+ 'startPos': ifKernel(489, 40),
'endPos': ifKernel(633, 89),
'compiled': true,
'coverage': {
- 'hits': ifKernel([501, 539, 590, 619], [40, 55, 73, 83]),
+ 'hits': ifKernel([489, 539, 590, 619], [40, 55, 73, 83]),
'misses': ifKernel([552], [61])
}
};
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index 1786a6f..87f2e7f 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -101,6 +101,7 @@
step_through_function_2_test: RuntimeError
step_through_function_test: RuntimeError
step_through_getter_test: RuntimeError
+step_through_mixin_from_sdk_test: RuntimeError
step_through_property_get_test: RuntimeError
step_through_property_set_test: RuntimeError
step_through_setter_test: RuntimeError
diff --git a/runtime/observatory/tests/service/step_through_mixin_from_sdk_test.dart b/runtime/observatory/tests/service/step_through_mixin_from_sdk_test.dart
new file mode 100644
index 0000000..a38c966
--- /dev/null
+++ b/runtime/observatory/tests/service/step_through_mixin_from_sdk_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'test_helper.dart';
+import 'service_test_common.dart';
+import 'dart:collection';
+
+const int LINE = 13;
+const String file = "step_through_mixin_from_sdk_test.dart";
+
+code() {
+ Foo foo = new Foo();
+ if (foo.contains(43)) {
+ print("Contains 43!");
+ } else {
+ print("Doesn't contain 43!");
+ }
+}
+
+class Foo extends Object with ListMixin<int> {
+ @override
+ int length = 1;
+
+ @override
+ int operator [](int index) {
+ return 42;
+ }
+
+ @override
+ void operator []=(int index, int value) {}
+}
+
+List<String> stops = [];
+List<String> expected = [
+ "$file:${LINE+0}:17", // on "Foo" (in "new Foo()")
+ "$file:${LINE+1}:11", // on "="
+ "list.dart:105:24", // on parameter to "contains"
+ "list.dart:106:23", // on "length" in "this.length"
+ "list.dart:107:16", // on "=" in "i = 0"
+ "list.dart:107:23", // on "<" in "i < length"
+ "list.dart:108:15", // on "[" in "this[i]"
+ "$file:${LINE+13}:23", // on parameter in "operator []"
+ "$file:${LINE+14}:5", // on "return"
+ "list.dart:108:19", // on "=="
+ "list.dart:109:26", // on "length" in "this.length"
+ "list.dart:109:18", // on "!="
+ "list.dart:107:34", // on "++" in "i++"
+ "list.dart:107:23", // on "<" in "i < length"
+ "list.dart:113:5", // on "return"
+ "$file:${LINE+4}:5", // on "print"
+ "$file:${LINE+6}:1" // on ending '}'
+];
+
+var tests = <IsolateTest>[
+ hasPausedAtStart,
+ setBreakpointAtLine(LINE),
+ runStepIntoThroughProgramRecordingStops(stops),
+ checkRecordedStops(stops, expected, removeDuplicates: true)
+];
+
+main(args) {
+ runIsolateTestsSynchronous(args, tests,
+ testeeConcurrent: code, pause_on_start: true, pause_on_exit: true);
+}
diff --git a/runtime/observatory/web/index.html b/runtime/observatory/web/index.html
index 2662c85..6369746 100644
--- a/runtime/observatory/web/index.html
+++ b/runtime/observatory/web/index.html
@@ -5,7 +5,6 @@
<title>Dart VM Observatory</title>
<link rel="stylesheet" href="packages/charted/charts/themes/quantum_theme.css">
<link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
- <script src="packages/web_components/webcomponents-lite.min.js"></script>
<script defer src="main.dart.js"></script>
</head>
<body style="height: 100%">
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index 84d44b4..cf862ab 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -314,8 +314,17 @@
const uint8_t* kernel_buffer,
intptr_t kernel_buffer_size) {
Zone* zone = thread->zone();
- kernel::Program* program =
- kernel::Program::ReadFromBuffer(kernel_buffer, kernel_buffer_size, false);
+ const char* error = nullptr;
+ kernel::Program* program = kernel::Program::ReadFromBuffer(
+ kernel_buffer, kernel_buffer_size, &error);
+ if (program == nullptr) {
+ const intptr_t kMessageBufferSize = 512;
+ char message_buffer[kMessageBufferSize];
+ Utils::SNPrint(message_buffer, kMessageBufferSize,
+ "Can't load Kernel binary: %s.", error);
+ const String& msg = String::Handle(String::New(message_buffer, Heap::kOld));
+ return ApiError::New(msg, Heap::kOld);
+ }
kernel::KernelLoader loader(program);
Isolate* isolate = thread->isolate();
diff --git a/runtime/vm/bootstrap_nocore.cc b/runtime/vm/bootstrap_nocore.cc
index 9938296..2b3d6b5 100644
--- a/runtime/vm/bootstrap_nocore.cc
+++ b/runtime/vm/bootstrap_nocore.cc
@@ -74,8 +74,17 @@
const uint8_t* kernel_buffer,
intptr_t kernel_buffer_size) {
Zone* zone = thread->zone();
- kernel::Program* program =
- kernel::Program::ReadFromBuffer(kernel_buffer, kernel_buffer_size, false);
+ const char* error = nullptr;
+ kernel::Program* program = kernel::Program::ReadFromBuffer(
+ kernel_buffer, kernel_buffer_size, &error);
+ if (program == nullptr) {
+ const intptr_t kMessageBufferSize = 512;
+ char message_buffer[kMessageBufferSize];
+ Utils::SNPrint(message_buffer, kMessageBufferSize,
+ "Can't load Kernel binary: %s.", error);
+ const String& msg = String::Handle(String::New(message_buffer, Heap::kOld));
+ return ApiError::New(msg, Heap::kOld);
+ }
kernel::KernelLoader loader(program);
Isolate* isolate = thread->isolate();
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index 83f76d1..1b9b8e5 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -605,6 +605,20 @@
break;
}
+ case Token::kSHL:
+ case Token::kSHR: {
+ Value* left_value = instr->PushArgumentAt(receiver_index)->value();
+ Value* right_value = instr->PushArgumentAt(receiver_index + 1)->value();
+ CompileType* right_type = right_value->Type();
+ if (right_type->IsNullableInt()) {
+ left_value = PrepareReceiverOfDevirtualizedCall(left_value, kMintCid);
+ right_value = PrepareStaticOpInput(right_value, kMintCid, instr);
+ replacement = new (Z) ShiftInt64OpInstr(
+ op_kind, left_value, right_value, Thread::kNoDeoptId);
+ }
+ break;
+ }
+
default:
break;
}
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index 55fcc83..ab5b854 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -933,10 +933,6 @@
VisitBinaryIntegerOp(instr);
}
-void ConstantPropagator::VisitShiftUint32Op(ShiftUint32OpInstr* instr) {
- VisitBinaryIntegerOp(instr);
-}
-
void ConstantPropagator::VisitBinaryInt64Op(BinaryInt64OpInstr* instr) {
VisitBinaryIntegerOp(instr);
}
@@ -945,6 +941,20 @@
VisitBinaryIntegerOp(instr);
}
+void ConstantPropagator::VisitSpeculativeShiftInt64Op(
+ SpeculativeShiftInt64OpInstr* instr) {
+ VisitBinaryIntegerOp(instr);
+}
+
+void ConstantPropagator::VisitShiftUint32Op(ShiftUint32OpInstr* instr) {
+ VisitBinaryIntegerOp(instr);
+}
+
+void ConstantPropagator::VisitSpeculativeShiftUint32Op(
+ SpeculativeShiftUint32OpInstr* instr) {
+ VisitBinaryIntegerOp(instr);
+}
+
void ConstantPropagator::VisitBoxInt64(BoxInt64Instr* instr) {
// TODO(kmillikin): Handle box operation.
SetValue(instr, non_constant_);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 90112c2..4f48c7b 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -682,8 +682,7 @@
// See StackFrame::VisitObjectPointers for the details of how stack map is
// interpreted.
void FlowGraphCompiler::RecordSafepoint(LocationSummary* locs,
- intptr_t slow_path_argument_count,
- Environment* env) {
+ intptr_t slow_path_argument_count) {
if (is_optimizing() || locs->live_registers()->HasUntaggedValues()) {
const intptr_t spill_area_size =
is_optimizing() ? flow_graph_.graph_entry()->spill_slot_count() : 0;
@@ -2149,6 +2148,56 @@
}
#endif // defined(DEBUG) && !defined(TARGET_ARCH_DBC)
+#if !defined(TARGET_ARCH_DBC)
+#define __ compiler->assembler()->
+
+void ThrowErrorSlowPathCode::EmitNativeCode(FlowGraphCompiler* compiler) {
+ if (Assembler::EmittingComments()) {
+ __ Comment("slow path %s operation", name());
+ }
+ const bool use_shared_stub =
+ instruction()->UseSharedSlowPathStub(compiler->is_optimizing());
+ const bool live_fpu_registers =
+ instruction()->locs()->live_registers()->FpuRegisterCount() > 0;
+ ASSERT(!use_shared_stub || num_args_ == 0);
+ __ Bind(entry_label());
+ EmitCodeAtSlowPathEntry(compiler);
+ LocationSummary* locs = instruction()->locs();
+ // Save registers as they are needed for lazy deopt / exception handling.
+ if (!use_shared_stub) {
+ compiler->SaveLiveRegisters(locs);
+ }
+ for (intptr_t i = 0; i < num_args_; ++i) {
+ __ PushRegister(locs->in(i).reg());
+ }
+ if (use_shared_stub) {
+ EmitSharedStubCall(compiler->assembler(), live_fpu_registers);
+ } else {
+ __ CallRuntime(runtime_entry_, num_args_);
+ }
+ // Can't query deopt_id() without checking if instruction can deoptimize...
+ intptr_t deopt_id = Thread::kNoDeoptId;
+ if (instruction()->CanDeoptimize() ||
+ instruction()->CanBecomeDeoptimizationTarget()) {
+ deopt_id = instruction()->deopt_id();
+ }
+ compiler->AddDescriptor(RawPcDescriptors::kOther,
+ compiler->assembler()->CodeSize(), deopt_id,
+ instruction()->token_pos(), try_index_);
+ AddMetadataForRuntimeCall(compiler);
+ compiler->RecordSafepoint(locs, num_args_);
+ if ((try_index_ != CatchClauseNode::kInvalidTryIndex) ||
+ (compiler->CurrentTryIndex() != CatchClauseNode::kInvalidTryIndex)) {
+ Environment* env =
+ compiler->SlowPathEnvironmentFor(instruction(), num_args_);
+ compiler->EmitCatchEntryState(env, try_index_);
+ }
+ __ Breakpoint();
+}
+
+#undef __
+#endif // !defined(TARGET_ARCH_DBC)
+
#endif // !defined(DART_PRECOMPILED_RUNTIME)
} // namespace dart
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index 8e05c21..83f91fb 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -240,6 +240,42 @@
}
};
+#if !defined(TARGET_ARCH_DBC)
+
+// Slow path code which calls runtime entry to throw an exception.
+class ThrowErrorSlowPathCode : public TemplateSlowPathCode<Instruction> {
+ public:
+ ThrowErrorSlowPathCode(Instruction* instruction,
+ const RuntimeEntry& runtime_entry,
+ intptr_t num_args,
+ intptr_t try_index)
+ : TemplateSlowPathCode(instruction),
+ runtime_entry_(runtime_entry),
+ num_args_(num_args),
+ try_index_(try_index) {}
+
+ // This name appears in disassembly.
+ virtual const char* name() = 0;
+
+ // Subclasses can override these methods to customize slow path code.
+ virtual void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) {}
+ virtual void AddMetadataForRuntimeCall(FlowGraphCompiler* compiler) {}
+
+ virtual void EmitSharedStubCall(Assembler* assembler,
+ bool save_fpu_registers) {
+ UNREACHABLE();
+ }
+
+ virtual void EmitNativeCode(FlowGraphCompiler* compiler);
+
+ private:
+ const RuntimeEntry& runtime_entry_;
+ const intptr_t num_args_;
+ const intptr_t try_index_;
+};
+
+#endif // !defined(TARGET_ARCH_DBC)
+
class FlowGraphCompiler : public ValueObject {
private:
class BlockInfo : public ZoneAllocated {
@@ -583,10 +619,8 @@
TokenPosition token_pos,
intptr_t null_check_name_idx);
- // 'environment' is required if 'using_shared_stub'.
void RecordSafepoint(LocationSummary* locs,
- intptr_t slow_path_argument_count = 0,
- Environment* env = NULL);
+ intptr_t slow_path_argument_count = 0);
Label* AddDeoptStub(intptr_t deopt_id,
ICData::DeoptReasonId reason,
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index ca1dcbf..81e98f8 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -1569,8 +1569,8 @@
}
}
-bool ShiftInt64OpInstr::IsShiftCountInRange() const {
- return RangeUtils::IsWithin(shift_range(), 0, kMintShiftCountLimit);
+bool ShiftIntegerOpInstr::IsShiftCountInRange(int64_t max) const {
+ return RangeUtils::IsWithin(shift_range(), 0, max);
}
bool BinaryIntegerOpInstr::RightIsPowerOfTwoConstant() const {
@@ -1780,14 +1780,16 @@
return op;
}
-BinaryIntegerOpInstr* BinaryIntegerOpInstr::Make(Representation representation,
- Token::Kind op_kind,
- Value* left,
- Value* right,
- intptr_t deopt_id,
- bool can_overflow,
- bool is_truncating,
- Range* range) {
+BinaryIntegerOpInstr* BinaryIntegerOpInstr::Make(
+ Representation representation,
+ Token::Kind op_kind,
+ Value* left,
+ Value* right,
+ intptr_t deopt_id,
+ bool can_overflow,
+ bool is_truncating,
+ Range* range,
+ SpeculativeMode speculative_mode) {
BinaryIntegerOpInstr* op = NULL;
switch (representation) {
case kTagged:
@@ -1801,14 +1803,23 @@
break;
case kUnboxedUint32:
if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
- op = new ShiftUint32OpInstr(op_kind, left, right, deopt_id);
+ if (speculative_mode == kNotSpeculative) {
+ op = new ShiftUint32OpInstr(op_kind, left, right, deopt_id);
+ } else {
+ op =
+ new SpeculativeShiftUint32OpInstr(op_kind, left, right, deopt_id);
+ }
} else {
op = new BinaryUint32OpInstr(op_kind, left, right, deopt_id);
}
break;
case kUnboxedInt64:
if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
- op = new ShiftInt64OpInstr(op_kind, left, right, deopt_id);
+ if (speculative_mode == kNotSpeculative) {
+ op = new ShiftInt64OpInstr(op_kind, left, right, deopt_id);
+ } else {
+ op = new SpeculativeShiftInt64OpInstr(op_kind, left, right, deopt_id);
+ }
} else {
op = new BinaryInt64OpInstr(op_kind, left, right, deopt_id);
}
@@ -1884,7 +1895,12 @@
// specialized instructions that use this value under this assumption.
return Integer::null();
}
- result ^= result.CheckAndCanonicalize(thread, NULL);
+
+ const char* error_str = NULL;
+ result ^= result.CheckAndCanonicalize(thread, &error_str);
+ if (error_str != NULL) {
+ FATAL1("Failed to canonicalize: %s", error_str);
+ }
}
return result.raw();
@@ -1941,7 +1957,11 @@
// specialized instructions that use this value under this assumption.
return Integer::null();
}
- result ^= result.CheckAndCanonicalize(thread, NULL);
+ const char* error_str = NULL;
+ result ^= result.CheckAndCanonicalize(thread, &error_str);
+ if (error_str != NULL) {
+ FATAL1("Failed to canonicalize: %s", error_str);
+ }
}
return result.raw();
@@ -2085,7 +2105,7 @@
BinaryIntegerOpInstr* shift = BinaryIntegerOpInstr::Make(
representation(), Token::kSHL, left()->CopyWithType(),
new Value(constant_1), GetDeoptId(), can_overflow(),
- is_truncating(), range());
+ is_truncating(), range(), speculative_mode());
if (shift != NULL) {
flow_graph->InsertBefore(this, shift, env(), FlowGraph::kValue);
return shift;
@@ -3122,18 +3142,27 @@
}
}
}
+
// Spread class-ids to following classes where a lookup yields the same
// method.
+ const intptr_t max_cid = Isolate::Current()->class_table()->NumCids();
for (int idx = 0; idx < length; idx++) {
int upper_limit_cid =
- (idx == length - 1) ? 1000000000 : targets[idx + 1].cid_start;
+ (idx == length - 1) ? max_cid : targets[idx + 1].cid_start;
const Function& target = *targets.TargetAt(idx)->target;
if (MethodRecognizer::PolymorphicTarget(target)) continue;
+ // The code below makes attempt to avoid spreading class-id range
+ // into a suffix that consists purely of abstract classes to
+ // shorten the range.
+ // However such spreading is beneficial when it allows to
+ // merge to consequtive ranges.
+ intptr_t cid_end_including_abstract = targets[idx].cid_end;
for (int i = targets[idx].cid_end + 1; i < upper_limit_cid; i++) {
bool class_is_abstract = false;
if (FlowGraphCompiler::LookupMethodFor(i, name, args_desc, &fn,
&class_is_abstract) &&
fn.raw() == target.raw()) {
+ cid_end_including_abstract = i;
if (!class_is_abstract) {
targets[idx].cid_end = i;
}
@@ -3141,6 +3170,16 @@
break;
}
}
+
+ // Check if we have a suffix that consists of abstract classes
+ // and expand into it if that would allow us to merge this
+ // range with subsequent range.
+ if ((cid_end_including_abstract > targets[idx].cid_end) &&
+ (idx < length - 1) &&
+ ((cid_end_including_abstract + 1) == targets[idx + 1].cid_start) &&
+ (target.raw() == targets.TargetAt(idx + 1)->target->raw())) {
+ targets[idx].cid_end = cid_end_including_abstract;
+ }
}
targets.MergeIntoRanges();
return &targets;
@@ -3964,67 +4003,6 @@
return locs;
}
-class ThrowErrorSlowPathCode : public TemplateSlowPathCode<Instruction> {
- public:
- ThrowErrorSlowPathCode(Instruction* instruction,
- const RuntimeEntry& runtime_entry,
- intptr_t num_args,
- intptr_t try_index)
- : TemplateSlowPathCode(instruction),
- runtime_entry_(runtime_entry),
- num_args_(num_args),
- try_index_(try_index) {}
-
- virtual const char* name() = 0;
-
- virtual void AddMetadataForRuntimeCall(FlowGraphCompiler* compiler) {}
-
- virtual void EmitSharedStubCall(Assembler* assembler,
- bool save_fpu_registers) {
- UNREACHABLE();
- }
-
- virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
- if (Assembler::EmittingComments()) {
- __ Comment("slow path %s operation", name());
- }
- bool use_shared_stub =
- instruction()->UseSharedSlowPathStub(compiler->is_optimizing());
- bool live_fpu_registers =
- instruction()->locs()->live_registers()->FpuRegisterCount() > 0;
- ASSERT(!use_shared_stub || num_args_ == 0);
- __ Bind(entry_label());
- LocationSummary* locs = instruction()->locs();
- // Save registers as they are needed for lazy deopt / exception handling.
- if (!use_shared_stub) {
- compiler->SaveLiveRegisters(locs);
- }
- for (intptr_t i = 0; i < num_args_; ++i) {
- __ PushRegister(locs->in(i).reg());
- }
- if (use_shared_stub) {
- EmitSharedStubCall(compiler->assembler(), live_fpu_registers);
- } else {
- __ CallRuntime(runtime_entry_, num_args_);
- }
- compiler->AddDescriptor(
- RawPcDescriptors::kOther, compiler->assembler()->CodeSize(),
- instruction()->deopt_id(), instruction()->token_pos(), try_index_);
- AddMetadataForRuntimeCall(compiler);
- ASSERT(instruction()->env() != nullptr);
- compiler->RecordSafepoint(locs, num_args_, instruction()->env());
- Environment* env =
- compiler->SlowPathEnvironmentFor(instruction(), num_args_);
- compiler->EmitCatchEntryState(env, try_index_);
- __ Breakpoint();
- }
-
- private:
- const RuntimeEntry& runtime_entry_;
- const intptr_t num_args_;
- const intptr_t try_index_;
-};
-
class RangeErrorSlowPath : public ThrowErrorSlowPathCode {
public:
static const intptr_t kNumberOfArguments = 2;
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index bcafcbd..656e856 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -547,6 +547,7 @@
M(CaseInsensitiveCompareUC16) \
M(BinaryInt64Op) \
M(ShiftInt64Op) \
+ M(SpeculativeShiftInt64Op) \
M(UnaryInt64Op) \
M(CheckArrayBound) \
M(GenericCheckBound) \
@@ -565,6 +566,7 @@
M(ExtractNthOutput) \
M(BinaryUint32Op) \
M(ShiftUint32Op) \
+ M(SpeculativeShiftUint32Op) \
M(UnaryUint32Op) \
M(BoxUint32) \
M(UnboxUint32) \
@@ -580,7 +582,8 @@
M(UnboxInteger) \
M(Comparison) \
M(UnaryIntegerOp) \
- M(BinaryIntegerOp)
+ M(BinaryIntegerOp) \
+ M(ShiftIntegerOp)
#define FORWARD_DECLARATION(type) class type##Instr;
FOR_EACH_INSTRUCTION(FORWARD_DECLARATION)
@@ -1818,8 +1821,7 @@
bool HasType() const { return (type_ != NULL); }
- // Does this define a mint?
- inline bool IsMintDefinition();
+ inline bool IsInt64Definition();
bool IsInt32Definition() {
return IsBinaryInt32Op() || IsBoxInt32() || IsUnboxInt32() ||
@@ -5545,9 +5547,10 @@
DISALLOW_COPY_AND_ASSIGN(UnboxInt64Instr);
};
-bool Definition::IsMintDefinition() {
+bool Definition::IsInt64Definition() {
return (Type()->ToCid() == kMintCid) || IsBinaryInt64Op() ||
- IsUnaryInt64Op() || IsShiftInt64Op() || IsBoxInt64() || IsUnboxInt64();
+ IsUnaryInt64Op() || IsShiftInt64Op() || IsSpeculativeShiftInt64Op() ||
+ IsBoxInt64() || IsUnboxInt64();
}
class MathUnaryInstr : public TemplateDefinition<1, NoThrow, Pure> {
@@ -6018,14 +6021,16 @@
SetInputAt(1, right);
}
- static BinaryIntegerOpInstr* Make(Representation representation,
- Token::Kind op_kind,
- Value* left,
- Value* right,
- intptr_t deopt_id,
- bool can_overflow,
- bool is_truncating,
- Range* range);
+ static BinaryIntegerOpInstr* Make(
+ Representation representation,
+ Token::Kind op_kind,
+ Value* left,
+ Value* right,
+ intptr_t deopt_id,
+ bool can_overflow,
+ bool is_truncating,
+ Range* range,
+ SpeculativeMode speculative_mode = kGuardInputs);
Token::Kind op_kind() const { return op_kind_; }
Value* left() const { return inputs_[0]; }
@@ -6071,6 +6076,8 @@
bool can_overflow_;
bool is_truncating_;
+
+ DISALLOW_COPY_AND_ASSIGN(BinaryIntegerOpInstr);
};
class BinarySmiOpInstr : public BinaryIntegerOpInstr {
@@ -6180,33 +6187,6 @@
DISALLOW_COPY_AND_ASSIGN(BinaryUint32OpInstr);
};
-class ShiftUint32OpInstr : public BinaryIntegerOpInstr {
- public:
- ShiftUint32OpInstr(Token::Kind op_kind,
- Value* left,
- Value* right,
- intptr_t deopt_id)
- : BinaryIntegerOpInstr(op_kind, left, right, deopt_id) {
- ASSERT((op_kind == Token::kSHR) || (op_kind == Token::kSHL));
- }
-
- virtual bool ComputeCanDeoptimize() const { return true; }
-
- virtual Representation representation() const { return kUnboxedUint32; }
-
- virtual Representation RequiredInputRepresentation(intptr_t idx) const {
- ASSERT((idx == 0) || (idx == 1));
- return (idx == 0) ? kUnboxedUint32 : kTagged;
- }
-
- virtual CompileType ComputeType() const;
-
- DECLARE_INSTRUCTION(ShiftUint32Op)
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ShiftUint32OpInstr);
-};
-
class BinaryInt64OpInstr : public BinaryIntegerOpInstr {
public:
BinaryInt64OpInstr(Token::Kind op_kind,
@@ -6253,12 +6233,13 @@
DISALLOW_COPY_AND_ASSIGN(BinaryInt64OpInstr);
};
-class ShiftInt64OpInstr : public BinaryIntegerOpInstr {
+// Base class for integer shift operations.
+class ShiftIntegerOpInstr : public BinaryIntegerOpInstr {
public:
- ShiftInt64OpInstr(Token::Kind op_kind,
- Value* left,
- Value* right,
- intptr_t deopt_id)
+ ShiftIntegerOpInstr(Token::Kind op_kind,
+ Value* left,
+ Value* right,
+ intptr_t deopt_id)
: BinaryIntegerOpInstr(op_kind, left, right, deopt_id),
shift_range_(NULL) {
ASSERT((op_kind == Token::kSHR) || (op_kind == Token::kSHL));
@@ -6267,6 +6248,62 @@
Range* shift_range() const { return shift_range_; }
+ virtual void InferRange(RangeAnalysis* analysis, Range* range);
+
+ DEFINE_INSTRUCTION_TYPE_CHECK(ShiftIntegerOp)
+
+ protected:
+ static const intptr_t kShiftCountLimit = 63;
+
+ // Returns true if the shift amount is guaranteed to be in
+ // [0..max] range.
+ bool IsShiftCountInRange(int64_t max = kShiftCountLimit) const;
+
+ private:
+ Range* shift_range_;
+
+ DISALLOW_COPY_AND_ASSIGN(ShiftIntegerOpInstr);
+};
+
+// Non-speculative int64 shift. Takes 2 unboxed int64.
+// Throws if right operand is negative.
+class ShiftInt64OpInstr : public ShiftIntegerOpInstr {
+ public:
+ ShiftInt64OpInstr(Token::Kind op_kind,
+ Value* left,
+ Value* right,
+ intptr_t deopt_id)
+ : ShiftIntegerOpInstr(op_kind, left, right, deopt_id) {}
+
+ virtual SpeculativeMode speculative_mode() const { return kNotSpeculative; }
+ virtual bool ComputeCanDeoptimize() const { return false; }
+ virtual bool MayThrow() const { return true; }
+
+ virtual Representation representation() const { return kUnboxedInt64; }
+
+ virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+ ASSERT((idx == 0) || (idx == 1));
+ return kUnboxedInt64;
+ }
+
+ virtual CompileType ComputeType() const;
+
+ DECLARE_INSTRUCTION(ShiftInt64Op)
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ShiftInt64OpInstr);
+};
+
+// Speculative int64 shift. Takes unboxed int64 and smi.
+// Deoptimizes if right operand is negative or greater than kShiftCountLimit.
+class SpeculativeShiftInt64OpInstr : public ShiftIntegerOpInstr {
+ public:
+ SpeculativeShiftInt64OpInstr(Token::Kind op_kind,
+ Value* left,
+ Value* right,
+ intptr_t deopt_id)
+ : ShiftIntegerOpInstr(op_kind, left, right, deopt_id) {}
+
virtual bool ComputeCanDeoptimize() const {
ASSERT(!can_overflow());
return !IsShiftCountInRange();
@@ -6279,21 +6316,72 @@
return (idx == 0) ? kUnboxedInt64 : kTagged;
}
- virtual void InferRange(RangeAnalysis* analysis, Range* range);
virtual CompileType ComputeType() const;
- DECLARE_INSTRUCTION(ShiftInt64Op)
+ DECLARE_INSTRUCTION(SpeculativeShiftInt64Op)
private:
- static const intptr_t kMintShiftCountLimit = 63;
+ DISALLOW_COPY_AND_ASSIGN(SpeculativeShiftInt64OpInstr);
+};
- // Returns true if the shift amount is guranteed to be in
- // [0..kMintShiftCountLimit] range.
- bool IsShiftCountInRange() const;
+// Non-speculative uint32 shift. Takes unboxed uint32 and unboxed int64.
+// Throws if right operand is negative.
+class ShiftUint32OpInstr : public ShiftIntegerOpInstr {
+ public:
+ ShiftUint32OpInstr(Token::Kind op_kind,
+ Value* left,
+ Value* right,
+ intptr_t deopt_id)
+ : ShiftIntegerOpInstr(op_kind, left, right, deopt_id) {}
- Range* shift_range_;
+ virtual SpeculativeMode speculative_mode() const { return kNotSpeculative; }
+ virtual bool ComputeCanDeoptimize() const { return false; }
+ virtual bool MayThrow() const { return true; }
- DISALLOW_COPY_AND_ASSIGN(ShiftInt64OpInstr);
+ virtual Representation representation() const { return kUnboxedUint32; }
+
+ virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+ ASSERT((idx == 0) || (idx == 1));
+ return (idx == 0) ? kUnboxedUint32 : kUnboxedInt64;
+ }
+
+ virtual CompileType ComputeType() const;
+
+ DECLARE_INSTRUCTION(ShiftUint32Op)
+
+ private:
+ static const intptr_t kUint32ShiftCountLimit = 31;
+
+ DISALLOW_COPY_AND_ASSIGN(ShiftUint32OpInstr);
+};
+
+// Speculative uint32 shift. Takes unboxed uint32 and smi.
+// Deoptimizes if right operand is negative.
+class SpeculativeShiftUint32OpInstr : public ShiftIntegerOpInstr {
+ public:
+ SpeculativeShiftUint32OpInstr(Token::Kind op_kind,
+ Value* left,
+ Value* right,
+ intptr_t deopt_id)
+ : ShiftIntegerOpInstr(op_kind, left, right, deopt_id) {}
+
+ virtual bool ComputeCanDeoptimize() const { return !IsShiftCountInRange(); }
+
+ virtual Representation representation() const { return kUnboxedUint32; }
+
+ virtual Representation RequiredInputRepresentation(intptr_t idx) const {
+ ASSERT((idx == 0) || (idx == 1));
+ return (idx == 0) ? kUnboxedUint32 : kTagged;
+ }
+
+ DECLARE_INSTRUCTION(SpeculativeShiftUint32Op)
+
+ virtual CompileType ComputeType() const;
+
+ private:
+ static const intptr_t kUint32ShiftCountLimit = 31;
+
+ DISALLOW_COPY_AND_ASSIGN(SpeculativeShiftUint32OpInstr);
};
// Handles only NEGATE.
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 42daf66..8d16db6 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -5807,15 +5807,192 @@
}
}
+static void EmitShiftInt64ByConstant(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register out_lo,
+ Register out_hi,
+ Register left_lo,
+ Register left_hi,
+ const Object& right) {
+ const int64_t shift = Integer::Cast(right).AsInt64Value();
+ ASSERT(shift >= 0);
+
+ switch (op_kind) {
+ case Token::kSHR: {
+ if (shift < 32) {
+ __ Lsl(out_lo, left_hi, Operand(32 - shift));
+ __ orr(out_lo, out_lo, Operand(left_lo, LSR, shift));
+ __ Asr(out_hi, left_hi, Operand(shift));
+ } else {
+ if (shift == 32) {
+ __ mov(out_lo, Operand(left_hi));
+ } else if (shift < 64) {
+ __ Asr(out_lo, left_hi, Operand(shift - 32));
+ } else {
+ __ Asr(out_lo, left_hi, Operand(31));
+ }
+ __ Asr(out_hi, left_hi, Operand(31));
+ }
+ break;
+ }
+ case Token::kSHL: {
+ ASSERT(shift < 64);
+ if (shift < 32) {
+ __ Lsr(out_hi, left_lo, Operand(32 - shift));
+ __ orr(out_hi, out_hi, Operand(left_hi, LSL, shift));
+ __ Lsl(out_lo, left_lo, Operand(shift));
+ } else {
+ if (shift == 32) {
+ __ mov(out_hi, Operand(left_lo));
+ } else {
+ __ Lsl(out_hi, left_lo, Operand(shift - 32));
+ }
+ __ mov(out_lo, Operand(0));
+ }
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+}
+
+static void EmitShiftInt64ByRegister(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register out_lo,
+ Register out_hi,
+ Register left_lo,
+ Register left_hi,
+ Register right) {
+ switch (op_kind) {
+ case Token::kSHR: {
+ __ rsbs(IP, right, Operand(32));
+ __ sub(IP, right, Operand(32), MI);
+ __ mov(out_lo, Operand(left_hi, ASR, IP), MI);
+ __ mov(out_lo, Operand(left_lo, LSR, right), PL);
+ __ orr(out_lo, out_lo, Operand(left_hi, LSL, IP), PL);
+ __ mov(out_hi, Operand(left_hi, ASR, right));
+ break;
+ }
+ case Token::kSHL: {
+ __ rsbs(IP, right, Operand(32));
+ __ sub(IP, right, Operand(32), MI);
+ __ mov(out_hi, Operand(left_lo, LSL, IP), MI);
+ __ mov(out_hi, Operand(left_hi, LSL, right), PL);
+ __ orr(out_hi, out_hi, Operand(left_lo, LSR, IP), PL);
+ __ mov(out_lo, Operand(left_lo, LSL, right));
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+}
+
+static void EmitShiftUint32ByConstant(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register out,
+ Register left,
+ const Object& right) {
+ const int64_t shift = Integer::Cast(right).AsInt64Value();
+ ASSERT(shift >= 0);
+ if (shift >= 32) {
+ __ LoadImmediate(out, 0);
+ } else {
+ switch (op_kind) {
+ case Token::kSHR:
+ __ Lsr(out, left, Operand(shift));
+ break;
+ case Token::kSHL:
+ __ Lsl(out, left, Operand(shift));
+ break;
+ default:
+ UNREACHABLE();
+ }
+ }
+}
+
+static void EmitShiftUint32ByRegister(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register out,
+ Register left,
+ Register right) {
+ switch (op_kind) {
+ case Token::kSHR:
+ __ Lsr(out, left, right);
+ break;
+ case Token::kSHL:
+ __ Lsl(out, left, right);
+ break;
+ default:
+ UNREACHABLE();
+ }
+}
+
+class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+ static const intptr_t kNumberOfArguments = 0;
+
+ ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+ : ThrowErrorSlowPathCode(instruction,
+ kArgumentErrorUnboxedInt64RuntimeEntry,
+ kNumberOfArguments,
+ try_index) {}
+
+ const char* name() override { return "int64 shift"; }
+
+ void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+ PairLocation* left_pair = instruction()->locs()->in(0).AsPairLocation();
+ Register left_hi = left_pair->At(1).reg();
+ PairLocation* right_pair = instruction()->locs()->in(1).AsPairLocation();
+ Register right_lo = right_pair->At(0).reg();
+ Register right_hi = right_pair->At(1).reg();
+ PairLocation* out_pair = instruction()->locs()->out(0).AsPairLocation();
+ Register out_lo = out_pair->At(0).reg();
+ Register out_hi = out_pair->At(1).reg();
+
+ __ CompareImmediate(right_hi, 0);
+
+ switch (instruction()->AsShiftInt64Op()->op_kind()) {
+ case Token::kSHR:
+ __ Asr(out_hi, left_hi, Operand(kBitsPerWord - 1), GE);
+ __ mov(out_lo, Operand(out_hi), GE);
+ break;
+ case Token::kSHL: {
+ __ LoadImmediate(out_lo, 0, GE);
+ __ LoadImmediate(out_hi, 0, GE);
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+
+ __ b(exit_label(), GE);
+
+ // Can't pass unboxed int64 value directly to runtime call, as all
+ // arguments are expected to be tagged (boxed).
+ // The unboxed int64 argument is passed through a dedicated slot in Thread.
+ // TODO(dartbug.com/33549): Clean this up when unboxed values
+ // could be passed as arguments.
+ __ StoreToOffset(kWord, right_lo, THR,
+ Thread::unboxed_int64_runtime_arg_offset());
+ __ StoreToOffset(kWord, right_hi, THR,
+ Thread::unboxed_int64_runtime_arg_offset() + kWordSize);
+ }
+};
+
LocationSummary* ShiftInt64OpInstr::MakeLocationSummary(Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
- LocationSummary* summary = new (zone)
- LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ LocationSummary* summary = new (zone) LocationSummary(
+ zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
summary->set_in(0, Location::Pair(Location::RequiresRegister(),
Location::RequiresRegister()));
- summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
+ if (ConstantInstr* constant = right()->definition()->AsConstant()) {
+ summary->set_in(1, Location::Constant(constant));
+ } else {
+ summary->set_in(1, Location::Pair(Location::RequiresRegister(),
+ Location::RequiresRegister()));
+ }
summary->set_out(0, Location::Pair(Location::RequiresRegister(),
Location::RequiresRegister()));
return summary;
@@ -5830,86 +6007,216 @@
Register out_hi = out_pair->At(1).reg();
ASSERT(!can_overflow());
- Label* deopt = NULL;
- if (CanDeoptimize()) {
- deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
- }
if (locs()->in(1).IsConstant()) {
- // Code for a constant shift amount.
- ASSERT(locs()->in(1).constant().IsSmi());
- const int32_t shift = Smi::Cast(locs()->in(1).constant()).Value();
- ASSERT(shift >= 0);
- switch (op_kind()) {
- case Token::kSHR: {
- if (shift < 32) {
- __ Lsl(out_lo, left_hi, Operand(32 - shift));
- __ orr(out_lo, out_lo, Operand(left_lo, LSR, shift));
- __ Asr(out_hi, left_hi, Operand(shift));
- } else {
- if (shift == 32) {
- __ mov(out_lo, Operand(left_hi));
- } else if (shift < 64) {
- __ Asr(out_lo, left_hi, Operand(shift - 32));
- } else {
- __ Asr(out_lo, left_hi, Operand(31));
- }
- __ Asr(out_hi, left_hi, Operand(31));
- }
- break;
- }
- case Token::kSHL: {
- ASSERT(shift < 64);
- if (shift < 32) {
- __ Lsr(out_hi, left_lo, Operand(32 - shift));
- __ orr(out_hi, out_hi, Operand(left_hi, LSL, shift));
- __ Lsl(out_lo, left_lo, Operand(shift));
- } else {
- if (shift == 32) {
- __ mov(out_hi, Operand(left_lo));
- } else {
- __ Lsl(out_hi, left_lo, Operand(shift - 32));
- }
- __ mov(out_lo, Operand(0));
- }
- break;
- }
- default:
- UNREACHABLE();
+ EmitShiftInt64ByConstant(compiler, op_kind(), out_lo, out_hi, left_lo,
+ left_hi, locs()->in(1).constant());
+ } else {
+ // Code for a variable shift amount.
+ PairLocation* right_pair = locs()->in(1).AsPairLocation();
+ Register right_lo = right_pair->At(0).reg();
+ Register right_hi = right_pair->At(1).reg();
+
+ // Jump to a slow path if shift is larger than 63 or less than 0.
+ ShiftInt64OpSlowPath* slow_path = NULL;
+ if (!IsShiftCountInRange()) {
+ slow_path =
+ new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+ compiler->AddSlowPathCode(slow_path);
+ __ CompareImmediate(right_hi, 0);
+ __ b(slow_path->entry_label(), NE);
+ __ CompareImmediate(right_lo, kShiftCountLimit);
+ __ b(slow_path->entry_label(), HI);
}
+
+ EmitShiftInt64ByRegister(compiler, op_kind(), out_lo, out_hi, left_lo,
+ left_hi, right_lo);
+
+ if (slow_path != NULL) {
+ __ Bind(slow_path->exit_label());
+ }
+ }
+}
+
+LocationSummary* SpeculativeShiftInt64OpInstr::MakeLocationSummary(
+ Zone* zone,
+ bool opt) const {
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+ Location::RequiresRegister()));
+ summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
+ summary->set_out(0, Location::Pair(Location::RequiresRegister(),
+ Location::RequiresRegister()));
+ return summary;
+}
+
+void SpeculativeShiftInt64OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ PairLocation* left_pair = locs()->in(0).AsPairLocation();
+ Register left_lo = left_pair->At(0).reg();
+ Register left_hi = left_pair->At(1).reg();
+ PairLocation* out_pair = locs()->out(0).AsPairLocation();
+ Register out_lo = out_pair->At(0).reg();
+ Register out_hi = out_pair->At(1).reg();
+ ASSERT(!can_overflow());
+
+ if (locs()->in(1).IsConstant()) {
+ EmitShiftInt64ByConstant(compiler, op_kind(), out_lo, out_hi, left_lo,
+ left_hi, locs()->in(1).constant());
} else {
// Code for a variable shift amount.
Register shift = locs()->in(1).reg();
-
- // Untag shift count.
__ SmiUntag(shift);
// Deopt if shift is larger than 63 or less than 0.
if (!IsShiftCountInRange()) {
- __ CompareImmediate(shift, kMintShiftCountLimit);
+ ASSERT(CanDeoptimize());
+ Label* deopt =
+ compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+ __ CompareImmediate(shift, kShiftCountLimit);
__ b(deopt, HI);
}
- switch (op_kind()) {
- case Token::kSHR: {
- __ rsbs(IP, shift, Operand(32));
- __ sub(IP, shift, Operand(32), MI);
- __ mov(out_lo, Operand(left_hi, ASR, IP), MI);
- __ mov(out_lo, Operand(left_lo, LSR, shift), PL);
- __ orr(out_lo, out_lo, Operand(left_hi, LSL, IP), PL);
- __ mov(out_hi, Operand(left_hi, ASR, shift));
- break;
- }
- case Token::kSHL: {
- __ rsbs(IP, shift, Operand(32));
- __ sub(IP, shift, Operand(32), MI);
- __ mov(out_hi, Operand(left_lo, LSL, IP), MI);
- __ mov(out_hi, Operand(left_hi, LSL, shift), PL);
- __ orr(out_hi, out_hi, Operand(left_lo, LSR, IP), PL);
- __ mov(out_lo, Operand(left_lo, LSL, shift));
- break;
- }
- default:
- UNREACHABLE();
+ EmitShiftInt64ByRegister(compiler, op_kind(), out_lo, out_hi, left_lo,
+ left_hi, shift);
+ }
+}
+
+class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+ static const intptr_t kNumberOfArguments = 0;
+
+ ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+ : ThrowErrorSlowPathCode(instruction,
+ kArgumentErrorUnboxedInt64RuntimeEntry,
+ kNumberOfArguments,
+ try_index) {}
+
+ const char* name() override { return "uint32 shift"; }
+
+ void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+ PairLocation* right_pair = instruction()->locs()->in(1).AsPairLocation();
+ Register right_lo = right_pair->At(0).reg();
+ Register right_hi = right_pair->At(1).reg();
+ Register out = instruction()->locs()->out(0).reg();
+
+ __ CompareImmediate(right_hi, 0);
+ __ LoadImmediate(out, 0, GE);
+ __ b(exit_label(), GE);
+
+ // Can't pass unboxed int64 value directly to runtime call, as all
+ // arguments are expected to be tagged (boxed).
+ // The unboxed int64 argument is passed through a dedicated slot in Thread.
+ // TODO(dartbug.com/33549): Clean this up when unboxed values
+ // could be passed as arguments.
+ __ StoreToOffset(kWord, right_lo, THR,
+ Thread::unboxed_int64_runtime_arg_offset());
+ __ StoreToOffset(kWord, right_hi, THR,
+ Thread::unboxed_int64_runtime_arg_offset() + kWordSize);
+ }
+};
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
+ bool opt) const {
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone) LocationSummary(
+ zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+ summary->set_in(0, Location::RequiresRegister());
+ if (ConstantInstr* constant = right()->definition()->AsConstant()) {
+ summary->set_in(1, Location::Constant(constant));
+ } else {
+ summary->set_in(1, Location::Pair(Location::RequiresRegister(),
+ Location::RequiresRegister()));
+ }
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
+}
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ Register left = locs()->in(0).reg();
+ Register out = locs()->out(0).reg();
+
+ ASSERT(left != out);
+
+ if (locs()->in(1).IsConstant()) {
+ EmitShiftUint32ByConstant(compiler, op_kind(), out, left,
+ locs()->in(1).constant());
+ } else {
+ PairLocation* right_pair = locs()->in(1).AsPairLocation();
+ Register right_lo = right_pair->At(0).reg();
+ Register right_hi = right_pair->At(1).reg();
+
+ // Jump to a slow path if shift count is > 31 or negative.
+ ShiftUint32OpSlowPath* slow_path = NULL;
+ if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
+ slow_path =
+ new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+ compiler->AddSlowPathCode(slow_path);
+
+ __ CompareImmediate(right_hi, 0);
+ __ b(slow_path->entry_label(), NE);
+ __ CompareImmediate(right_lo, kUint32ShiftCountLimit);
+ __ b(slow_path->entry_label(), HI);
+ }
+
+ EmitShiftUint32ByRegister(compiler, op_kind(), out, left, right_lo);
+
+ if (slow_path != NULL) {
+ __ Bind(slow_path->exit_label());
+ }
+ }
+}
+
+LocationSummary* SpeculativeShiftUint32OpInstr::MakeLocationSummary(
+ Zone* zone,
+ bool opt) const {
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 1;
+ LocationSummary* summary = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+ summary->set_temp(0, Location::RequiresRegister());
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
+}
+
+void SpeculativeShiftUint32OpInstr::EmitNativeCode(
+ FlowGraphCompiler* compiler) {
+ Register left = locs()->in(0).reg();
+ Register out = locs()->out(0).reg();
+ Register temp = locs()->temp(0).reg();
+ ASSERT(left != out);
+
+ if (locs()->in(1).IsConstant()) {
+ EmitShiftUint32ByConstant(compiler, op_kind(), out, left,
+ locs()->in(1).constant());
+ } else {
+ Register right = locs()->in(1).reg();
+ const bool shift_count_in_range =
+ IsShiftCountInRange(kUint32ShiftCountLimit);
+
+ __ SmiUntag(temp, right);
+ right = temp;
+
+ // Deopt if shift count is negative.
+ if (!shift_count_in_range) {
+ ASSERT(CanDeoptimize());
+ Label* deopt =
+ compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+ __ CompareImmediate(right, 0);
+ __ b(deopt, LT);
+ }
+
+ EmitShiftUint32ByRegister(compiler, op_kind(), out, left, right);
+
+ if (!shift_count_in_range) {
+ __ CompareImmediate(right, kUint32ShiftCountLimit);
+ __ LoadImmediate(out, 0, HI);
}
}
}
@@ -5948,6 +6255,10 @@
return CompileType::Int();
}
+CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
+ return CompileType::Int();
+}
+
CompileType UnaryUint32OpInstr::ComputeType() const {
return CompileType::Int();
}
@@ -5993,75 +6304,6 @@
}
}
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
- bool opt) const {
- const intptr_t kNumInputs = 2;
- const intptr_t kNumTemps = 1;
- LocationSummary* summary = new (zone)
- LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
- summary->set_in(0, Location::RequiresRegister());
- summary->set_in(1, Location::RegisterOrSmiConstant(right()));
- summary->set_temp(0, Location::RequiresRegister());
- summary->set_out(0, Location::RequiresRegister());
- return summary;
-}
-
-void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- const intptr_t kShifterLimit = 31;
-
- Register left = locs()->in(0).reg();
- Register out = locs()->out(0).reg();
- Register temp = locs()->temp(0).reg();
-
- ASSERT(left != out);
-
- Label* deopt =
- compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-
- if (locs()->in(1).IsConstant()) {
- // Shifter is constant.
-
- const Object& constant = locs()->in(1).constant();
- ASSERT(constant.IsSmi());
- const intptr_t shift_value = Smi::Cast(constant).Value();
-
- // Do the shift: (shift_value > 0) && (shift_value <= kShifterLimit).
- switch (op_kind()) {
- case Token::kSHR:
- __ Lsr(out, left, Operand(shift_value));
- break;
- case Token::kSHL:
- __ Lsl(out, left, Operand(shift_value));
- break;
- default:
- UNREACHABLE();
- }
- return;
- }
-
- // Non constant shift value.
- Register shifter = locs()->in(1).reg();
-
- __ SmiUntag(temp, shifter);
- __ CompareImmediate(temp, 0);
- // If shift value is < 0, deoptimize.
- __ b(deopt, LT);
- __ CompareImmediate(temp, kShifterLimit);
- // > kShifterLimit, result is 0.
- __ eor(out, out, Operand(out), HI);
- // Do the shift.
- switch (op_kind()) {
- case Token::kSHR:
- __ Lsr(out, left, temp, LS);
- break;
- case Token::kSHL:
- __ Lsl(out, left, temp, LS);
- break;
- default:
- UNREACHABLE();
- }
-}
-
LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 1;
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 983914d..c6c8498 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -5078,14 +5078,140 @@
}
}
+static void EmitShiftInt64ByConstant(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register out,
+ Register left,
+ const Object& right) {
+ const int64_t shift = Integer::Cast(right).AsInt64Value();
+ ASSERT(shift >= 0);
+ switch (op_kind) {
+ case Token::kSHR: {
+ __ AsrImmediate(out, left,
+ Utils::Minimum<int64_t>(shift, kBitsPerWord - 1));
+ break;
+ }
+ case Token::kSHL: {
+ ASSERT(shift < 64);
+ __ LslImmediate(out, left, shift);
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+}
+
+static void EmitShiftInt64ByRegister(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register out,
+ Register left,
+ Register right) {
+ switch (op_kind) {
+ case Token::kSHR: {
+ __ asrv(out, left, right);
+ break;
+ }
+ case Token::kSHL: {
+ __ lslv(out, left, right);
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+}
+
+static void EmitShiftUint32ByConstant(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register out,
+ Register left,
+ const Object& right) {
+ const int64_t shift = Integer::Cast(right).AsInt64Value();
+ ASSERT(shift >= 0);
+ if (shift >= 32) {
+ __ LoadImmediate(out, 0);
+ } else {
+ switch (op_kind) {
+ case Token::kSHR:
+ __ LsrImmediate(out, left, shift, kWord);
+ break;
+ case Token::kSHL:
+ __ LslImmediate(out, left, shift, kWord);
+ break;
+ default:
+ UNREACHABLE();
+ }
+ }
+}
+
+static void EmitShiftUint32ByRegister(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register out,
+ Register left,
+ Register right) {
+ switch (op_kind) {
+ case Token::kSHR:
+ __ lsrvw(out, left, right);
+ break;
+ case Token::kSHL:
+ __ lslvw(out, left, right);
+ break;
+ default:
+ UNREACHABLE();
+ }
+}
+
+class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+ static const intptr_t kNumberOfArguments = 0;
+
+ ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+ : ThrowErrorSlowPathCode(instruction,
+ kArgumentErrorUnboxedInt64RuntimeEntry,
+ kNumberOfArguments,
+ try_index) {}
+
+ const char* name() override { return "int64 shift"; }
+
+ void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+ const Register left = instruction()->locs()->in(0).reg();
+ const Register right = instruction()->locs()->in(1).reg();
+ const Register out = instruction()->locs()->out(0).reg();
+ ASSERT((out != left) && (out != right));
+
+ Label throw_error;
+ __ tbnz(&throw_error, right, kBitsPerWord - 1);
+
+ switch (instruction()->AsShiftInt64Op()->op_kind()) {
+ case Token::kSHR:
+ __ AsrImmediate(out, left, kBitsPerWord - 1);
+ break;
+ case Token::kSHL:
+ __ mov(out, ZR);
+ break;
+ default:
+ UNREACHABLE();
+ }
+ __ b(exit_label());
+
+ __ Bind(&throw_error);
+
+ // Can't pass unboxed int64 value directly to runtime call, as all
+ // arguments are expected to be tagged (boxed).
+ // The unboxed int64 argument is passed through a dedicated slot in Thread.
+ // TODO(dartbug.com/33549): Clean this up when unboxed values
+ // could be passed as arguments.
+ __ str(right, Address(THR, Thread::unboxed_int64_runtime_arg_offset()));
+ }
+};
+
LocationSummary* ShiftInt64OpInstr::MakeLocationSummary(Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
- LocationSummary* summary = new (zone)
- LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ LocationSummary* summary = new (zone) LocationSummary(
+ zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
summary->set_in(0, Location::RequiresRegister());
- summary->set_in(1, Location::WritableRegisterOrSmiConstant(right()));
+ summary->set_in(1, Location::RegisterOrConstant(right()));
summary->set_out(0, Location::RequiresRegister());
return summary;
}
@@ -5095,52 +5221,186 @@
const Register out = locs()->out(0).reg();
ASSERT(!can_overflow());
- Label* deopt = NULL;
- if (CanDeoptimize()) {
- deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
- }
if (locs()->in(1).IsConstant()) {
- // Code for a constant shift amount.
- ASSERT(locs()->in(1).constant().IsSmi());
- const int32_t shift = Smi::Cast(locs()->in(1).constant()).Value();
- ASSERT(shift >= 0);
- switch (op_kind()) {
- case Token::kSHR: {
- __ AsrImmediate(out, left, Utils::Minimum(shift, kBitsPerWord - 1));
- break;
- }
- case Token::kSHL: {
- ASSERT(shift < 64);
- __ LslImmediate(out, left, shift);
- break;
- }
- default:
- UNREACHABLE();
+ EmitShiftInt64ByConstant(compiler, op_kind(), out, left,
+ locs()->in(1).constant());
+ } else {
+ // Code for a variable shift amount.
+ Register shift = locs()->in(1).reg();
+
+ // Jump to a slow path if shift is larger than 63 or less than 0.
+ ShiftInt64OpSlowPath* slow_path = NULL;
+ if (!IsShiftCountInRange()) {
+ slow_path =
+ new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+ compiler->AddSlowPathCode(slow_path);
+ __ CompareImmediate(shift, kShiftCountLimit);
+ __ b(slow_path->entry_label(), HI);
}
+
+ EmitShiftInt64ByRegister(compiler, op_kind(), out, left, shift);
+
+ if (slow_path != NULL) {
+ __ Bind(slow_path->exit_label());
+ }
+ }
+}
+
+LocationSummary* SpeculativeShiftInt64OpInstr::MakeLocationSummary(
+ Zone* zone,
+ bool opt) const {
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
+}
+
+void SpeculativeShiftInt64OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ const Register left = locs()->in(0).reg();
+ const Register out = locs()->out(0).reg();
+ ASSERT(!can_overflow());
+
+ if (locs()->in(1).IsConstant()) {
+ EmitShiftInt64ByConstant(compiler, op_kind(), out, left,
+ locs()->in(1).constant());
} else {
// Code for a variable shift amount.
Register shift = locs()->in(1).reg();
// Untag shift count.
__ SmiUntag(TMP, shift);
+ shift = TMP;
// Deopt if shift is larger than 63 or less than 0.
if (!IsShiftCountInRange()) {
- __ CompareImmediate(TMP, kMintShiftCountLimit);
+ ASSERT(CanDeoptimize());
+ Label* deopt =
+ compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+ __ CompareImmediate(shift, kShiftCountLimit);
__ b(deopt, HI);
}
- switch (op_kind()) {
- case Token::kSHR: {
- __ lsrv(out, left, TMP);
- break;
- }
- case Token::kSHL: {
- __ lslv(out, left, TMP);
- break;
- }
- default:
- UNREACHABLE();
+ EmitShiftInt64ByRegister(compiler, op_kind(), out, left, shift);
+ }
+}
+
+class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+ static const intptr_t kNumberOfArguments = 0;
+
+ ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+ : ThrowErrorSlowPathCode(instruction,
+ kArgumentErrorUnboxedInt64RuntimeEntry,
+ kNumberOfArguments,
+ try_index) {}
+
+ const char* name() override { return "uint32 shift"; }
+
+ void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+ const Register right = instruction()->locs()->in(1).reg();
+
+ // Can't pass unboxed int64 value directly to runtime call, as all
+ // arguments are expected to be tagged (boxed).
+ // The unboxed int64 argument is passed through a dedicated slot in Thread.
+ // TODO(dartbug.com/33549): Clean this up when unboxed values
+ // could be passed as arguments.
+ __ str(right, Address(THR, Thread::unboxed_int64_runtime_arg_offset()));
+ }
+};
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
+ bool opt) const {
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone) LocationSummary(
+ zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_in(1, Location::RegisterOrConstant(right()));
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
+}
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ Register left = locs()->in(0).reg();
+ Register out = locs()->out(0).reg();
+
+ if (locs()->in(1).IsConstant()) {
+ EmitShiftUint32ByConstant(compiler, op_kind(), out, left,
+ locs()->in(1).constant());
+ } else {
+ const Register right = locs()->in(1).reg();
+ const bool shift_count_in_range =
+ IsShiftCountInRange(kUint32ShiftCountLimit);
+
+ // Jump to a slow path if shift count is negative.
+ if (!shift_count_in_range) {
+ ShiftUint32OpSlowPath* slow_path =
+ new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+ compiler->AddSlowPathCode(slow_path);
+
+ __ tbnz(slow_path->entry_label(), right, kBitsPerWord - 1);
+ }
+
+ EmitShiftUint32ByRegister(compiler, op_kind(), out, left, right);
+
+ if (!shift_count_in_range) {
+ // If shift value is > 31, return zero.
+ __ CompareImmediate(right, 31);
+ __ csel(out, out, ZR, LE);
+ }
+ }
+}
+
+LocationSummary* SpeculativeShiftUint32OpInstr::MakeLocationSummary(
+ Zone* zone,
+ bool opt) const {
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_in(1, Location::RegisterOrSmiConstant(right()));
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
+}
+
+void SpeculativeShiftUint32OpInstr::EmitNativeCode(
+ FlowGraphCompiler* compiler) {
+ Register left = locs()->in(0).reg();
+ Register out = locs()->out(0).reg();
+
+ if (locs()->in(1).IsConstant()) {
+ EmitShiftUint32ByConstant(compiler, op_kind(), out, left,
+ locs()->in(1).constant());
+ } else {
+ Register right = locs()->in(1).reg();
+ const bool shift_count_in_range =
+ IsShiftCountInRange(kUint32ShiftCountLimit);
+
+ __ SmiUntag(TMP, right);
+ right = TMP;
+
+ // Jump to a slow path if shift count is negative.
+ if (!shift_count_in_range) {
+ // Deoptimize if shift count is negative.
+ ASSERT(CanDeoptimize());
+ Label* deopt =
+ compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+ __ tbnz(deopt, right, kBitsPerWord - 1);
+ }
+
+ EmitShiftUint32ByRegister(compiler, op_kind(), out, left, right);
+
+ if (!shift_count_in_range) {
+ // If shift value is > 31, return zero.
+ __ CompareImmediate(right, 31);
+ __ csel(out, out, ZR, LE);
}
}
}
@@ -5172,6 +5432,10 @@
return CompileType::FromCid(kSmiCid);
}
+CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
+ return CompileType::FromCid(kSmiCid);
+}
+
CompileType UnaryUint32OpInstr::ComputeType() const {
return CompileType::FromCid(kSmiCid);
}
@@ -5217,75 +5481,6 @@
}
}
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
- bool opt) const {
- const intptr_t kNumInputs = 2;
- const intptr_t kNumTemps = 0;
- LocationSummary* summary = new (zone)
- LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
- summary->set_in(0, Location::RequiresRegister());
- summary->set_in(1, Location::RegisterOrSmiConstant(right()));
- summary->set_out(0, Location::RequiresRegister());
- return summary;
-}
-
-void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- const intptr_t kShifterLimit = 31;
-
- Register left = locs()->in(0).reg();
- Register out = locs()->out(0).reg();
-
- Label* deopt =
- compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-
- if (locs()->in(1).IsConstant()) {
- // Shifter is constant.
-
- const Object& constant = locs()->in(1).constant();
- ASSERT(constant.IsSmi());
- const intptr_t shift_value = Smi::Cast(constant).Value();
-
- // Do the shift: (shift_value > 0) && (shift_value <= kShifterLimit).
- switch (op_kind()) {
- case Token::kSHR:
- __ LsrImmediate(out, left, shift_value, kWord);
- break;
- case Token::kSHL:
- __ LslImmediate(out, left, shift_value, kWord);
- break;
- default:
- UNREACHABLE();
- }
- return;
- }
-
- // Non constant shift value.
-
- Register shifter = locs()->in(1).reg();
-
- // TODO(johnmccutchan): Use range information to avoid these checks.
- __ SmiUntag(TMP, shifter);
- __ CompareImmediate(TMP, 0);
- // If shift value is < 0, deoptimize.
- __ b(deopt, LT);
-
- // Do the shift.
- switch (op_kind()) {
- case Token::kSHR:
- __ lsrv(out, left, TMP);
- break;
- case Token::kSHL:
- __ lslvw(out, left, TMP);
- break;
- default:
- UNREACHABLE();
- }
-
- __ CompareImmediate(TMP, kShifterLimit);
- // If shift value is > 31, return zero.
- __ csel(out, out, ZR, GT);
-}
-
LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 1;
diff --git a/runtime/vm/compiler/backend/il_dbc.cc b/runtime/vm/compiler/backend/il_dbc.cc
index 0451944..dae7f80 100644
--- a/runtime/vm/compiler/backend/il_dbc.cc
+++ b/runtime/vm/compiler/backend/il_dbc.cc
@@ -42,6 +42,7 @@
M(ExtractNthOutput) \
M(BinaryUint32Op) \
M(ShiftUint32Op) \
+ M(SpeculativeShiftUint32Op) \
M(UnaryUint32Op) \
M(UnboxedIntConverter)
@@ -59,6 +60,7 @@
M(Int64ToDouble) \
M(BinaryInt64Op) \
M(ShiftInt64Op) \
+ M(SpeculativeShiftInt64Op) \
M(UnaryInt64Op) \
M(CheckedSmiOp) \
M(CheckedSmiComparison) \
@@ -1278,6 +1280,10 @@
return CompileType::Int();
}
+CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
+ return CompileType::Int();
+}
+
CompileType UnaryUint32OpInstr::ComputeType() const {
return CompileType::Int();
}
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 97e7ac1..57f3b5d 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -5247,15 +5247,204 @@
}
}
+static void EmitShiftInt64ByConstant(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register left_lo,
+ Register left_hi,
+ const Object& right) {
+ const int64_t shift = Integer::Cast(right).AsInt64Value();
+ ASSERT(shift >= 0);
+ switch (op_kind) {
+ case Token::kSHR: {
+ if (shift > 31) {
+ __ movl(left_lo, left_hi); // Shift by 32.
+ __ sarl(left_hi, Immediate(31)); // Sign extend left hi.
+ if (shift > 32) {
+ __ sarl(left_lo, Immediate(shift > 63 ? 31 : shift - 32));
+ }
+ } else {
+ __ shrdl(left_lo, left_hi, Immediate(shift));
+ __ sarl(left_hi, Immediate(shift));
+ }
+ break;
+ }
+ case Token::kSHL: {
+ ASSERT(shift < 64);
+ if (shift > 31) {
+ __ movl(left_hi, left_lo); // Shift by 32.
+ __ xorl(left_lo, left_lo); // Zero left_lo.
+ if (shift > 32) {
+ __ shll(left_hi, Immediate(shift - 32));
+ }
+ } else {
+ __ shldl(left_hi, left_lo, Immediate(shift));
+ __ shll(left_lo, Immediate(shift));
+ }
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+}
+
+static void EmitShiftInt64ByECX(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register left_lo,
+ Register left_hi) {
+ // sarl operation masks the count to 5 bits and
+ // shrdl is undefined with count > operand size (32)
+ Label done, large_shift;
+ switch (op_kind) {
+ case Token::kSHR: {
+ __ cmpl(ECX, Immediate(31));
+ __ j(ABOVE, &large_shift);
+
+ __ shrdl(left_lo, left_hi, ECX); // Shift count in CL.
+ __ sarl(left_hi, ECX); // Shift count in CL.
+ __ jmp(&done, Assembler::kNearJump);
+
+ __ Bind(&large_shift);
+ // No need to subtract 32 from CL, only 5 bits used by sarl.
+ __ movl(left_lo, left_hi); // Shift by 32.
+ __ sarl(left_hi, Immediate(31)); // Sign extend left hi.
+ __ sarl(left_lo, ECX); // Shift count: CL % 32.
+ break;
+ }
+ case Token::kSHL: {
+ __ cmpl(ECX, Immediate(31));
+ __ j(ABOVE, &large_shift);
+
+ __ shldl(left_hi, left_lo, ECX); // Shift count in CL.
+ __ shll(left_lo, ECX); // Shift count in CL.
+ __ jmp(&done, Assembler::kNearJump);
+
+ __ Bind(&large_shift);
+ // No need to subtract 32 from CL, only 5 bits used by shll.
+ __ movl(left_hi, left_lo); // Shift by 32.
+ __ xorl(left_lo, left_lo); // Zero left_lo.
+ __ shll(left_hi, ECX); // Shift count: CL % 32.
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+ __ Bind(&done);
+}
+
+static void EmitShiftUint32ByConstant(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register left,
+ const Object& right) {
+ const int64_t shift = Integer::Cast(right).AsInt64Value();
+ if (shift >= 32) {
+ __ xorl(left, left);
+ } else {
+ switch (op_kind) {
+ case Token::kSHR: {
+ __ shrl(left, Immediate(shift));
+ break;
+ }
+ case Token::kSHL: {
+ __ shll(left, Immediate(shift));
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+ }
+}
+
+static void EmitShiftUint32ByECX(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register left) {
+ switch (op_kind) {
+ case Token::kSHR: {
+ __ shrl(left, ECX);
+ break;
+ }
+ case Token::kSHL: {
+ __ shll(left, ECX);
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+}
+
+class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+ static const intptr_t kNumberOfArguments = 0;
+
+ ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+ : ThrowErrorSlowPathCode(instruction,
+ kArgumentErrorUnboxedInt64RuntimeEntry,
+ kNumberOfArguments,
+ try_index) {}
+
+ const char* name() override { return "int64 shift"; }
+
+ void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+ PairLocation* right_pair = instruction()->locs()->in(1).AsPairLocation();
+ Register right_lo = right_pair->At(0).reg();
+ Register right_hi = right_pair->At(1).reg();
+ PairLocation* out_pair = instruction()->locs()->out(0).AsPairLocation();
+ Register out_lo = out_pair->At(0).reg();
+ Register out_hi = out_pair->At(1).reg();
+#if defined(DEBUG)
+ PairLocation* left_pair = instruction()->locs()->in(0).AsPairLocation();
+ Register left_lo = left_pair->At(0).reg();
+ Register left_hi = left_pair->At(1).reg();
+ ASSERT(out_lo == left_lo);
+ ASSERT(out_hi == left_hi);
+#endif // defined(DEBUG)
+
+ Label throw_error;
+ __ testl(right_hi, right_hi);
+ __ j(NEGATIVE, &throw_error);
+
+ switch (instruction()->AsShiftInt64Op()->op_kind()) {
+ case Token::kSHR:
+ __ sarl(out_hi, Immediate(31));
+ __ movl(out_lo, out_hi);
+ break;
+ case Token::kSHL: {
+ __ xorl(out_lo, out_lo);
+ __ xorl(out_hi, out_hi);
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+ __ jmp(exit_label());
+
+ __ Bind(&throw_error);
+
+ // Can't pass unboxed int64 value directly to runtime call, as all
+ // arguments are expected to be tagged (boxed).
+ // The unboxed int64 argument is passed through a dedicated slot in Thread.
+ // TODO(dartbug.com/33549): Clean this up when unboxed values
+ // could be passed as arguments.
+ __ movl(Address(THR, Thread::unboxed_int64_runtime_arg_offset()), right_lo);
+ __ movl(
+ Address(THR, Thread::unboxed_int64_runtime_arg_offset() + kWordSize),
+ right_hi);
+ }
+};
+
LocationSummary* ShiftInt64OpInstr::MakeLocationSummary(Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
- LocationSummary* summary = new (zone)
- LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ LocationSummary* summary = new (zone) LocationSummary(
+ zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
summary->set_in(0, Location::Pair(Location::RequiresRegister(),
Location::RequiresRegister()));
- summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+ if (ConstantInstr* constant = right()->definition()->AsConstant()) {
+ summary->set_in(1, Location::Constant(constant));
+ } else {
+ summary->set_in(1, Location::Pair(Location::RegisterLocation(ECX),
+ Location::RequiresRegister()));
+ }
summary->set_out(0, Location::SameAsFirstInput());
return summary;
}
@@ -5271,92 +5460,217 @@
ASSERT(out_hi == left_hi);
ASSERT(!can_overflow());
- Label* deopt = NULL;
- if (CanDeoptimize()) {
- deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
- }
if (locs()->in(1).IsConstant()) {
- // Code for a constant shift amount.
- ASSERT(locs()->in(1).constant().IsSmi());
- const int32_t shift = Smi::Cast(locs()->in(1).constant()).Value();
- ASSERT(shift >= 0);
- switch (op_kind()) {
- case Token::kSHR: {
- if (shift > 31) {
- __ movl(left_lo, left_hi); // Shift by 32.
- __ sarl(left_hi, Immediate(31)); // Sign extend left hi.
- if (shift > 32) {
- __ sarl(left_lo, Immediate(shift > 63 ? 31 : shift - 32));
- }
- } else {
- __ shrdl(left_lo, left_hi, Immediate(shift));
- __ sarl(left_hi, Immediate(shift));
- }
- break;
- }
- case Token::kSHL: {
- ASSERT(shift < 64);
- if (shift > 31) {
- __ movl(left_hi, left_lo); // Shift by 32.
- __ xorl(left_lo, left_lo); // Zero left_lo.
- if (shift > 32) {
- __ shll(left_hi, Immediate(shift - 32));
- }
- } else {
- __ shldl(left_hi, left_lo, Immediate(shift));
- __ shll(left_lo, Immediate(shift));
- }
- break;
- }
- default:
- UNREACHABLE();
- }
+ EmitShiftInt64ByConstant(compiler, op_kind(), left_lo, left_hi,
+ locs()->in(1).constant());
} else {
// Code for a variable shift amount.
- // Deoptimize if shift count is > 63.
- // sarl operation masks the count to 5 bits and
- // shrdl is undefined with count > operand size (32)
- __ SmiUntag(ECX);
+ ASSERT(locs()->in(1).AsPairLocation()->At(0).reg() == ECX);
+ Register right_hi = locs()->in(1).AsPairLocation()->At(1).reg();
+
+ // Jump to a slow path if shift count is > 63 or negative.
+ ShiftInt64OpSlowPath* slow_path = NULL;
if (!IsShiftCountInRange()) {
- __ cmpl(ECX, Immediate(kMintShiftCountLimit));
+ slow_path =
+ new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+ compiler->AddSlowPathCode(slow_path);
+ __ testl(right_hi, right_hi);
+ __ j(NOT_ZERO, slow_path->entry_label());
+ __ cmpl(ECX, Immediate(kShiftCountLimit));
+ __ j(ABOVE, slow_path->entry_label());
+ }
+
+ EmitShiftInt64ByECX(compiler, op_kind(), left_lo, left_hi);
+
+ if (slow_path != NULL) {
+ __ Bind(slow_path->exit_label());
+ }
+ }
+}
+
+LocationSummary* SpeculativeShiftInt64OpInstr::MakeLocationSummary(
+ Zone* zone,
+ bool opt) const {
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::Pair(Location::RequiresRegister(),
+ Location::RequiresRegister()));
+ summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+ summary->set_out(0, Location::SameAsFirstInput());
+ return summary;
+}
+
+void SpeculativeShiftInt64OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ PairLocation* left_pair = locs()->in(0).AsPairLocation();
+ Register left_lo = left_pair->At(0).reg();
+ Register left_hi = left_pair->At(1).reg();
+ PairLocation* out_pair = locs()->out(0).AsPairLocation();
+ Register out_lo = out_pair->At(0).reg();
+ Register out_hi = out_pair->At(1).reg();
+ ASSERT(out_lo == left_lo);
+ ASSERT(out_hi == left_hi);
+ ASSERT(!can_overflow());
+
+ if (locs()->in(1).IsConstant()) {
+ EmitShiftInt64ByConstant(compiler, op_kind(), left_lo, left_hi,
+ locs()->in(1).constant());
+ } else {
+ ASSERT(locs()->in(1).reg() == ECX);
+ __ SmiUntag(ECX);
+
+ // Deoptimize if shift count is > 63 or negative.
+ if (!IsShiftCountInRange()) {
+ ASSERT(CanDeoptimize());
+ Label* deopt =
+ compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+ __ cmpl(ECX, Immediate(kShiftCountLimit));
__ j(ABOVE, deopt);
}
- Label done, large_shift;
- switch (op_kind()) {
- case Token::kSHR: {
- __ cmpl(ECX, Immediate(31));
- __ j(ABOVE, &large_shift);
- __ shrdl(left_lo, left_hi, ECX); // Shift count in CL.
- __ sarl(left_hi, ECX); // Shift count in CL.
- __ jmp(&done, Assembler::kNearJump);
+ EmitShiftInt64ByECX(compiler, op_kind(), left_lo, left_hi);
+ }
+}
- __ Bind(&large_shift);
- // No need to subtract 32 from CL, only 5 bits used by sarl.
- __ movl(left_lo, left_hi); // Shift by 32.
- __ sarl(left_hi, Immediate(31)); // Sign extend left hi.
- __ sarl(left_lo, ECX); // Shift count: CL % 32.
- break;
- }
- case Token::kSHL: {
- __ cmpl(ECX, Immediate(31));
- __ j(ABOVE, &large_shift);
+class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+ static const intptr_t kNumberOfArguments = 0;
- __ shldl(left_hi, left_lo, ECX); // Shift count in CL.
- __ shll(left_lo, ECX); // Shift count in CL.
- __ jmp(&done, Assembler::kNearJump);
+ ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+ : ThrowErrorSlowPathCode(instruction,
+ kArgumentErrorUnboxedInt64RuntimeEntry,
+ kNumberOfArguments,
+ try_index) {}
- __ Bind(&large_shift);
- // No need to subtract 32 from CL, only 5 bits used by shll.
- __ movl(left_hi, left_lo); // Shift by 32.
- __ xorl(left_lo, left_lo); // Zero left_lo.
- __ shll(left_hi, ECX); // Shift count: CL % 32.
- break;
- }
- default:
- UNREACHABLE();
+ const char* name() override { return "uint32 shift"; }
+
+ void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+ PairLocation* right_pair = instruction()->locs()->in(1).AsPairLocation();
+ Register right_lo = right_pair->At(0).reg();
+ Register right_hi = right_pair->At(1).reg();
+ const Register out = instruction()->locs()->out(0).reg();
+ ASSERT(out == instruction()->locs()->in(0).reg());
+
+ Label throw_error;
+ __ testl(right_hi, right_hi);
+ __ j(NEGATIVE, &throw_error);
+
+ __ xorl(out, out);
+ __ jmp(exit_label());
+
+ __ Bind(&throw_error);
+
+ // Can't pass unboxed int64 value directly to runtime call, as all
+ // arguments are expected to be tagged (boxed).
+ // The unboxed int64 argument is passed through a dedicated slot in Thread.
+ // TODO(dartbug.com/33549): Clean this up when unboxed values
+ // could be passed as arguments.
+ __ movl(Address(THR, Thread::unboxed_int64_runtime_arg_offset()), right_lo);
+ __ movl(
+ Address(THR, Thread::unboxed_int64_runtime_arg_offset() + kWordSize),
+ right_hi);
+ }
+};
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
+ bool opt) const {
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone) LocationSummary(
+ zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+ summary->set_in(0, Location::RequiresRegister());
+ if (ConstantInstr* constant = right()->definition()->AsConstant()) {
+ summary->set_in(1, Location::Constant(constant));
+ } else {
+ summary->set_in(1, Location::Pair(Location::RegisterLocation(ECX),
+ Location::RequiresRegister()));
+ }
+ summary->set_out(0, Location::SameAsFirstInput());
+ return summary;
+}
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ Register left = locs()->in(0).reg();
+ Register out = locs()->out(0).reg();
+ ASSERT(left == out);
+
+ if (locs()->in(1).IsConstant()) {
+ EmitShiftUint32ByConstant(compiler, op_kind(), left,
+ locs()->in(1).constant());
+ } else {
+ // Code for a variable shift amount.
+ ASSERT(locs()->in(1).AsPairLocation()->At(0).reg() == ECX);
+ Register right_hi = locs()->in(1).AsPairLocation()->At(1).reg();
+
+ // Jump to a slow path if shift count is > 31 or negative.
+ ShiftUint32OpSlowPath* slow_path = NULL;
+ if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
+ slow_path =
+ new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+ compiler->AddSlowPathCode(slow_path);
+
+ __ testl(right_hi, right_hi);
+ __ j(NOT_ZERO, slow_path->entry_label());
+ __ cmpl(ECX, Immediate(kUint32ShiftCountLimit));
+ __ j(ABOVE, slow_path->entry_label());
}
- __ Bind(&done);
+
+ EmitShiftUint32ByECX(compiler, op_kind(), left);
+
+ if (slow_path != NULL) {
+ __ Bind(slow_path->exit_label());
+ }
+ }
+}
+
+LocationSummary* SpeculativeShiftUint32OpInstr::MakeLocationSummary(
+ Zone* zone,
+ bool opt) const {
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
+ summary->set_out(0, Location::SameAsFirstInput());
+ return summary;
+}
+
+void SpeculativeShiftUint32OpInstr::EmitNativeCode(
+ FlowGraphCompiler* compiler) {
+ Register left = locs()->in(0).reg();
+ Register out = locs()->out(0).reg();
+ ASSERT(left == out);
+
+ if (locs()->in(1).IsConstant()) {
+ EmitShiftUint32ByConstant(compiler, op_kind(), left,
+ locs()->in(1).constant());
+ } else {
+ ASSERT(locs()->in(1).reg() == ECX);
+ __ SmiUntag(ECX);
+
+ if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
+ if (!IsShiftCountInRange()) {
+ // Deoptimize if shift count is negative.
+ ASSERT(CanDeoptimize());
+ Label* deopt =
+ compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+ __ testl(ECX, ECX);
+ __ j(LESS, deopt);
+ }
+
+ Label cont;
+ __ cmpl(ECX, Immediate(kUint32ShiftCountLimit));
+ __ j(LESS_EQUAL, &cont);
+
+ __ xorl(left, left);
+
+ __ Bind(&cont);
+ }
+
+ EmitShiftUint32ByECX(compiler, op_kind(), left);
}
}
@@ -5394,90 +5708,12 @@
return CompileType::Int();
}
-CompileType UnaryUint32OpInstr::ComputeType() const {
+CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
return CompileType::Int();
}
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
- bool opt) const {
- const intptr_t kNumInputs = 2;
- const intptr_t kNumTemps = 0;
- LocationSummary* summary = new (zone)
- LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
- summary->set_in(0, Location::RequiresRegister());
- summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
- summary->set_out(0, Location::SameAsFirstInput());
- return summary;
-}
-
-void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- const intptr_t kShifterLimit = 31;
-
- Register left = locs()->in(0).reg();
- Register out = locs()->out(0).reg();
- ASSERT(left == out);
-
- Label* deopt =
- compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-
- if (locs()->in(1).IsConstant()) {
- // Shifter is constant.
-
- const Object& constant = locs()->in(1).constant();
- ASSERT(constant.IsSmi());
- const intptr_t shift_value = Smi::Cast(constant).Value();
-
- // Do the shift: (shift_value > 0) && (shift_value <= kShifterLimit).
- switch (op_kind()) {
- case Token::kSHR:
- __ shrl(left, Immediate(shift_value));
- break;
- case Token::kSHL:
- __ shll(left, Immediate(shift_value));
- break;
- default:
- UNREACHABLE();
- }
- return;
- }
-
- // Non constant shift value.
-
- Register shifter = locs()->in(1).reg();
- ASSERT(shifter == ECX);
-
- Label done;
- Label zero;
-
- // TODO(johnmccutchan): Use range information to avoid these checks.
- __ SmiUntag(shifter);
- __ cmpl(shifter, Immediate(0));
- // If shift value is < 0, deoptimize.
- __ j(NEGATIVE, deopt);
- __ cmpl(shifter, Immediate(kShifterLimit));
- // If shift value is >= 32, return zero.
- __ j(ABOVE, &zero);
-
- // Do the shift.
- switch (op_kind()) {
- case Token::kSHR:
- __ shrl(left, shifter);
- __ jmp(&done);
- break;
- case Token::kSHL:
- __ shll(left, shifter);
- __ jmp(&done);
- break;
- default:
- UNREACHABLE();
- }
-
- __ Bind(&zero);
- // Shift was greater than 31 bits, just return zero.
- __ xorl(left, left);
-
- // Exit path.
- __ Bind(&done);
+CompileType UnaryUint32OpInstr::ComputeType() const {
+ return CompileType::Int();
}
LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone,
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index f66d347..c520bfc 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -5237,14 +5237,136 @@
__ notq(left);
}
+static void EmitShiftInt64ByConstant(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register left,
+ const Object& right) {
+ const int64_t shift = Integer::Cast(right).AsInt64Value();
+ ASSERT(shift >= 0);
+ switch (op_kind) {
+ case Token::kSHR:
+ __ sarq(left,
+ Immediate(Utils::Minimum<int64_t>(shift, kBitsPerWord - 1)));
+ break;
+ case Token::kSHL: {
+ ASSERT(shift < 64);
+ __ shlq(left, Immediate(shift));
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+}
+
+static void EmitShiftInt64ByRCX(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register left) {
+ switch (op_kind) {
+ case Token::kSHR: {
+ __ sarq(left, RCX);
+ break;
+ }
+ case Token::kSHL: {
+ __ shlq(left, RCX);
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+}
+
+static void EmitShiftUint32ByConstant(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register left,
+ const Object& right) {
+ const int64_t shift = Integer::Cast(right).AsInt64Value();
+ ASSERT(shift >= 0);
+ if (shift >= 32) {
+ __ xorl(left, left);
+ } else {
+ switch (op_kind) {
+ case Token::kSHR: {
+ __ shrl(left, Immediate(shift));
+ break;
+ }
+ case Token::kSHL: {
+ __ shll(left, Immediate(shift));
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+ }
+}
+
+static void EmitShiftUint32ByRCX(FlowGraphCompiler* compiler,
+ Token::Kind op_kind,
+ Register left) {
+ switch (op_kind) {
+ case Token::kSHR: {
+ __ shrl(left, RCX);
+ break;
+ }
+ case Token::kSHL: {
+ __ shll(left, RCX);
+ break;
+ }
+ default:
+ UNREACHABLE();
+ }
+}
+
+class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+ static const intptr_t kNumberOfArguments = 0;
+
+ ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
+ : ThrowErrorSlowPathCode(instruction,
+ kArgumentErrorUnboxedInt64RuntimeEntry,
+ kNumberOfArguments,
+ try_index) {}
+
+ const char* name() override { return "int64 shift"; }
+
+ void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+ const Register out = instruction()->locs()->out(0).reg();
+ ASSERT(out == instruction()->locs()->in(0).reg());
+
+ Label throw_error;
+ __ testq(RCX, RCX);
+ __ j(LESS, &throw_error);
+
+ switch (instruction()->AsShiftInt64Op()->op_kind()) {
+ case Token::kSHR:
+ __ sarq(out, Immediate(kBitsPerInt64 - 1));
+ break;
+ case Token::kSHL:
+ __ xorq(out, out);
+ break;
+ default:
+ UNREACHABLE();
+ }
+ __ jmp(exit_label());
+
+ __ Bind(&throw_error);
+
+ // Can't pass unboxed int64 value directly to runtime call, as all
+ // arguments are expected to be tagged (boxed).
+ // The unboxed int64 argument is passed through a dedicated slot in Thread.
+ // TODO(dartbug.com/33549): Clean this up when unboxed values
+ // could be passed as arguments.
+ __ movq(Address(THR, Thread::unboxed_int64_runtime_arg_offset()), RCX);
+ }
+};
+
LocationSummary* ShiftInt64OpInstr::MakeLocationSummary(Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
- LocationSummary* summary = new (zone)
- LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ LocationSummary* summary = new (zone) LocationSummary(
+ zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
summary->set_in(0, Location::RequiresRegister());
- summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
+ summary->set_in(1, Location::FixedRegisterOrConstant(right(), RCX));
summary->set_out(0, Location::SameAsFirstInput());
return summary;
}
@@ -5255,50 +5377,195 @@
ASSERT(left == out);
ASSERT(!can_overflow());
- Label* deopt = NULL;
- if (CanDeoptimize()) {
- deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
- }
if (locs()->in(1).IsConstant()) {
- // Code for a constant shift amount.
- ASSERT(locs()->in(1).constant().IsSmi());
- const int64_t shift = Smi::Cast(locs()->in(1).constant()).Value();
- ASSERT(shift >= 0);
- switch (op_kind()) {
- case Token::kSHR:
- __ sarq(left,
- Immediate(Utils::Minimum<int64_t>(shift, kBitsPerWord - 1)));
- break;
- case Token::kSHL: {
- ASSERT(shift < 64);
- __ shlq(left, Immediate(shift));
- break;
- }
- default:
- UNREACHABLE();
- }
+ EmitShiftInt64ByConstant(compiler, op_kind(), left,
+ locs()->in(1).constant());
} else {
// Code for a variable shift amount.
- // Deoptimize if shift count is > 63 or negative.
- // Sarq and shlq instructions mask the count to 6 bits.
- __ SmiUntag(RCX);
+ ASSERT(locs()->in(1).reg() == RCX);
+
+ // Jump to a slow path if shift count is > 63 or negative.
+ ShiftInt64OpSlowPath* slow_path = NULL;
if (!IsShiftCountInRange()) {
- __ cmpq(RCX, Immediate(kMintShiftCountLimit));
+ slow_path =
+ new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
+ compiler->AddSlowPathCode(slow_path);
+
+ __ cmpq(RCX, Immediate(kShiftCountLimit));
+ __ j(ABOVE, slow_path->entry_label());
+ }
+
+ EmitShiftInt64ByRCX(compiler, op_kind(), left);
+
+ if (slow_path != NULL) {
+ __ Bind(slow_path->exit_label());
+ }
+ }
+}
+
+LocationSummary* SpeculativeShiftInt64OpInstr::MakeLocationSummary(
+ Zone* zone,
+ bool opt) const {
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
+ summary->set_out(0, Location::SameAsFirstInput());
+ return summary;
+}
+
+void SpeculativeShiftInt64OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ const Register left = locs()->in(0).reg();
+ const Register out = locs()->out(0).reg();
+ ASSERT(left == out);
+ ASSERT(!can_overflow());
+
+ if (locs()->in(1).IsConstant()) {
+ EmitShiftInt64ByConstant(compiler, op_kind(), left,
+ locs()->in(1).constant());
+ } else {
+ ASSERT(locs()->in(1).reg() == RCX);
+ __ SmiUntag(RCX);
+
+ // Deoptimize if shift count is > 63 or negative.
+ if (!IsShiftCountInRange()) {
+ ASSERT(CanDeoptimize());
+ Label* deopt =
+ compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+ __ cmpq(RCX, Immediate(kShiftCountLimit));
__ j(ABOVE, deopt);
}
- Label done, large_shift;
- switch (op_kind()) {
- case Token::kSHR: {
- __ sarq(left, RCX);
- break;
- }
- case Token::kSHL: {
- __ shlq(left, RCX);
- break;
- }
- default:
- UNREACHABLE();
+
+ EmitShiftInt64ByRCX(compiler, op_kind(), left);
+ }
+}
+
+class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
+ public:
+ static const intptr_t kNumberOfArguments = 0;
+
+ ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
+ : ThrowErrorSlowPathCode(instruction,
+ kArgumentErrorUnboxedInt64RuntimeEntry,
+ kNumberOfArguments,
+ try_index) {}
+
+ const char* name() override { return "uint32 shift"; }
+
+ void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) override {
+ const Register out = instruction()->locs()->out(0).reg();
+ ASSERT(out == instruction()->locs()->in(0).reg());
+
+ Label throw_error;
+ __ testq(RCX, RCX);
+ __ j(LESS, &throw_error);
+
+ __ xorl(out, out);
+ __ jmp(exit_label());
+
+ __ Bind(&throw_error);
+
+ // Can't pass unboxed int64 value directly to runtime call, as all
+ // arguments are expected to be tagged (boxed).
+ // The unboxed int64 argument is passed through a dedicated slot in Thread.
+ // TODO(dartbug.com/33549): Clean this up when unboxed values
+ // could be passed as arguments.
+ __ movq(Address(THR, Thread::unboxed_int64_runtime_arg_offset()), RCX);
+ }
+};
+
+LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
+ bool opt) const {
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone) LocationSummary(
+ zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_in(1, Location::FixedRegisterOrConstant(right(), RCX));
+ summary->set_out(0, Location::SameAsFirstInput());
+ return summary;
+}
+
+void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ Register left = locs()->in(0).reg();
+ Register out = locs()->out(0).reg();
+ ASSERT(left == out);
+
+ if (locs()->in(1).IsConstant()) {
+ EmitShiftUint32ByConstant(compiler, op_kind(), left,
+ locs()->in(1).constant());
+ } else {
+ ASSERT(locs()->in(1).reg() == RCX);
+
+ // Jump to a slow path if shift count is > 31 or negative.
+ ShiftUint32OpSlowPath* slow_path = NULL;
+ if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
+ slow_path =
+ new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
+ compiler->AddSlowPathCode(slow_path);
+
+ __ cmpq(RCX, Immediate(kUint32ShiftCountLimit));
+ __ j(ABOVE, slow_path->entry_label());
}
+
+ EmitShiftUint32ByRCX(compiler, op_kind(), left);
+
+ if (slow_path != NULL) {
+ __ Bind(slow_path->exit_label());
+ }
+ }
+}
+
+LocationSummary* SpeculativeShiftUint32OpInstr::MakeLocationSummary(
+ Zone* zone,
+ bool opt) const {
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
+ summary->set_out(0, Location::SameAsFirstInput());
+ return summary;
+}
+
+void SpeculativeShiftUint32OpInstr::EmitNativeCode(
+ FlowGraphCompiler* compiler) {
+ Register left = locs()->in(0).reg();
+ Register out = locs()->out(0).reg();
+ ASSERT(left == out);
+
+ if (locs()->in(1).IsConstant()) {
+ EmitShiftUint32ByConstant(compiler, op_kind(), left,
+ locs()->in(1).constant());
+ } else {
+ ASSERT(locs()->in(1).reg() == RCX);
+ __ SmiUntag(RCX);
+
+ if (!IsShiftCountInRange(kUint32ShiftCountLimit)) {
+ if (!IsShiftCountInRange()) {
+ // Deoptimize if shift count is negative.
+ ASSERT(CanDeoptimize());
+ Label* deopt =
+ compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
+
+ __ testq(RCX, RCX);
+ __ j(LESS, deopt);
+ }
+
+ Label cont;
+ __ cmpq(RCX, Immediate(kUint32ShiftCountLimit));
+ __ j(LESS_EQUAL, &cont);
+
+ __ xorl(left, left);
+
+ __ Bind(&cont);
+ }
+
+ EmitShiftUint32ByRCX(compiler, op_kind(), left);
}
}
@@ -5310,6 +5577,10 @@
return CompileType::FromCid(kSmiCid);
}
+CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
+ return CompileType::FromCid(kSmiCid);
+}
+
CompileType UnaryUint32OpInstr::ComputeType() const {
return CompileType::FromCid(kSmiCid);
}
@@ -5374,88 +5645,6 @@
}
}
-LocationSummary* ShiftUint32OpInstr::MakeLocationSummary(Zone* zone,
- bool opt) const {
- const intptr_t kNumInputs = 2;
- const intptr_t kNumTemps = 0;
- LocationSummary* summary = new (zone)
- LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
- summary->set_in(0, Location::RequiresRegister());
- summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
- summary->set_out(0, Location::SameAsFirstInput());
- return summary;
-}
-
-void ShiftUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- const intptr_t kShifterLimit = 31;
-
- Register left = locs()->in(0).reg();
- Register out = locs()->out(0).reg();
- ASSERT(left == out);
-
- Label* deopt =
- compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-
- if (locs()->in(1).IsConstant()) {
- // Shifter is constant.
-
- const Object& constant = locs()->in(1).constant();
- ASSERT(constant.IsSmi());
- const intptr_t shift_value = Smi::Cast(constant).Value();
-
- // Do the shift: (shift_value > 0) && (shift_value <= kShifterLimit).
- switch (op_kind()) {
- case Token::kSHR:
- __ shrl(left, Immediate(shift_value));
- break;
- case Token::kSHL:
- __ shll(left, Immediate(shift_value));
- break;
- default:
- UNREACHABLE();
- }
- return;
- }
-
- // Non constant shift value.
-
- Register shifter = locs()->in(1).reg();
- ASSERT(shifter == RCX);
-
- Label done;
- Label zero;
-
- // TODO(johnmccutchan): Use range information to avoid these checks.
- __ SmiUntag(shifter);
- __ cmpq(shifter, Immediate(0));
- // If shift value is < 0, deoptimize.
- __ j(NEGATIVE, deopt);
- __ cmpq(shifter, Immediate(kShifterLimit));
- // If shift value is >= 32, return zero.
- __ j(ABOVE, &zero);
-
- // Do the shift.
- switch (op_kind()) {
- case Token::kSHR:
- __ shrl(left, shifter);
- __ jmp(&done);
- break;
- case Token::kSHL:
- __ shll(left, shifter);
- __ jmp(&done);
- break;
- default:
- UNREACHABLE();
- }
-
- __ Bind(&zero);
- // Shift was greater than 31 bits, just return zero.
- __ xorq(left, left);
-
- // Exit path.
- __ Bind(&done);
-}
-
DEFINE_BACKEND(UnaryUint32Op, (SameAsFirstInput, Register value)) {
__ notl(value);
}
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index b39e2be..fd08f03 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -254,8 +254,9 @@
values_.Add(defn);
if (defn->IsBinaryInt64Op()) {
binary_int64_ops_.Add(defn->AsBinaryInt64Op());
- } else if (defn->IsShiftInt64Op()) {
- shift_int64_ops_.Add(defn->AsShiftInt64Op());
+ } else if (defn->IsShiftInt64Op() ||
+ defn->IsSpeculativeShiftInt64Op()) {
+ shift_int64_ops_.Add(defn->AsShiftIntegerOp());
}
}
} else if (current->IsCheckArrayBound()) {
@@ -1497,7 +1498,7 @@
}
}
-static void NarrowShiftInt64Op(ShiftInt64OpInstr* int64_op) {
+static void NarrowShiftInt64Op(ShiftIntegerOpInstr* int64_op) {
if (RangeUtils::Fits(int64_op->range(), RangeBoundary::kRangeBoundaryInt32) &&
RangeUtils::Fits(int64_op->left()->definition()->range(),
RangeBoundary::kRangeBoundaryInt32) &&
@@ -1552,7 +1553,8 @@
// & untagged of intermediate results.
// TODO(johnmccutchan): Consider phis.
return def->IsBoxInt64() || def->IsUnboxInt64() || def->IsBinaryInt64Op() ||
- def->IsShiftInt64Op() || def->IsUnaryInt64Op();
+ def->IsShiftInt64Op() || def->IsSpeculativeShiftInt64Op() ||
+ def->IsUnaryInt64Op();
}
void IntegerInstructionSelector::FindPotentialUint32Definitions() {
@@ -1625,6 +1627,13 @@
!selected_uint32_defs_->Contains(defn->ssa_temp_index())) {
return false;
}
+ // Right-hand side operand of ShiftInt64Op is not narrowing (all its bits
+ // should be taken into account).
+ if (ShiftIntegerOpInstr* shift = defn->AsShiftIntegerOp()) {
+ if (use == shift->right()) {
+ return false;
+ }
+ }
}
return true;
}
@@ -1638,8 +1647,8 @@
}
// A right shift with an input outside of Uint32 range cannot be converted
// because we need the high bits.
- if (def->IsShiftInt64Op()) {
- ShiftInt64OpInstr* op = def->AsShiftInt64Op();
+ if (def->IsShiftInt64Op() || def->IsSpeculativeShiftInt64Op()) {
+ ShiftIntegerOpInstr* op = def->AsShiftIntegerOp();
if (op->op_kind() == Token::kSHR) {
Definition* shift_input = op->left()->definition();
ASSERT(shift_input != NULL);
@@ -1699,13 +1708,22 @@
ASSERT(IsPotentialUint32Definition(def));
// Should not see constant instructions.
ASSERT(!def->IsConstant());
- if (def->IsBinaryInt64Op()) {
- BinaryInt64OpInstr* op = def->AsBinaryInt64Op();
+ if (def->IsBinaryIntegerOp()) {
+ BinaryIntegerOpInstr* op = def->AsBinaryIntegerOp();
Token::Kind op_kind = op->op_kind();
Value* left = op->left()->CopyWithType();
Value* right = op->right()->CopyWithType();
intptr_t deopt_id = op->DeoptimizationTarget();
- return new (Z) BinaryUint32OpInstr(op_kind, left, right, deopt_id);
+ if (def->IsBinaryInt64Op()) {
+ return new (Z) BinaryUint32OpInstr(op_kind, left, right, deopt_id);
+ } else if (def->IsShiftInt64Op()) {
+ return new (Z) ShiftUint32OpInstr(op_kind, left, right, deopt_id);
+ } else if (def->IsSpeculativeShiftInt64Op()) {
+ return new (Z)
+ SpeculativeShiftUint32OpInstr(op_kind, left, right, deopt_id);
+ } else {
+ UNREACHABLE();
+ }
} else if (def->IsBoxInt64()) {
Value* value = def->AsBoxInt64()->value()->CopyWithType();
return new (Z) BoxUint32Instr(value);
@@ -1720,13 +1738,6 @@
Value* value = op->value()->CopyWithType();
intptr_t deopt_id = op->DeoptimizationTarget();
return new (Z) UnaryUint32OpInstr(op_kind, value, deopt_id);
- } else if (def->IsShiftInt64Op()) {
- ShiftInt64OpInstr* op = def->AsShiftInt64Op();
- Token::Kind op_kind = op->op_kind();
- Value* left = op->left()->CopyWithType();
- Value* right = op->right()->CopyWithType();
- intptr_t deopt_id = op->DeoptimizationTarget();
- return new (Z) ShiftUint32OpInstr(op_kind, left, right, deopt_id);
}
UNREACHABLE();
return NULL;
@@ -2504,7 +2515,7 @@
void Definition::InferRange(RangeAnalysis* analysis, Range* range) {
if (Type()->ToCid() == kSmiCid) {
*range = Range::Full(RangeBoundary::kRangeBoundarySmi);
- } else if (IsMintDefinition()) {
+ } else if (IsInt64Definition()) {
*range = Range::Full(RangeBoundary::kRangeBoundaryInt64);
} else if (IsInt32Definition()) {
*range = Range::Full(RangeBoundary::kRangeBoundaryInt32);
@@ -2844,7 +2855,7 @@
right()->definition()->range(), range);
}
-void ShiftInt64OpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
+void ShiftIntegerOpInstr::InferRange(RangeAnalysis* analysis, Range* range) {
CacheRange(&shift_range_, right()->definition()->range(),
RangeBoundary::kRangeBoundaryInt64);
InferRangeHelper(left()->definition()->range(),
@@ -2903,7 +2914,7 @@
const Range* value_range = value()->definition()->range();
if (value_range != NULL) {
*range = *value_range;
- } else if (!value()->definition()->IsMintDefinition() &&
+ } else if (!value()->definition()->IsInt64Definition() &&
(value()->definition()->Type()->ToCid() != kSmiCid)) {
*range = Range::Full(RangeBoundary::kRangeBoundaryInt64);
}
diff --git a/runtime/vm/compiler/backend/range_analysis.h b/runtime/vm/compiler/backend/range_analysis.h
index e8140f8..0b25eaa 100644
--- a/runtime/vm/compiler/backend/range_analysis.h
+++ b/runtime/vm/compiler/backend/range_analysis.h
@@ -605,7 +605,7 @@
GrowableArray<BinaryInt64OpInstr*> binary_int64_ops_;
- GrowableArray<ShiftInt64OpInstr*> shift_int64_ops_;
+ GrowableArray<ShiftIntegerOpInstr*> shift_int64_ops_;
// All CheckArrayBound instructions.
GrowableArray<CheckArrayBoundInstr*> bounds_checks_;
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 1f0f476..e4f7d2e 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -1328,6 +1328,10 @@
return CompileType::Int();
}
+CompileType SpeculativeShiftInt64OpInstr::ComputeType() const {
+ return CompileType::Int();
+}
+
CompileType UnaryInt64OpInstr::ComputeType() const {
return CompileType::Int();
}
diff --git a/runtime/vm/compiler/call_specializer.cc b/runtime/vm/compiler/call_specializer.cc
index 41b3027..4faa42a 100644
--- a/runtime/vm/compiler/call_specializer.cc
+++ b/runtime/vm/compiler/call_specializer.cc
@@ -760,8 +760,9 @@
} else if (operands_type == kMintCid) {
if (!FlowGraphCompiler::SupportsUnboxedInt64()) return false;
if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
- ShiftInt64OpInstr* shift_op = new (Z) ShiftInt64OpInstr(
- op_kind, new (Z) Value(left), new (Z) Value(right), call->deopt_id());
+ SpeculativeShiftInt64OpInstr* shift_op = new (Z)
+ SpeculativeShiftInt64OpInstr(op_kind, new (Z) Value(left),
+ new (Z) Value(right), call->deopt_id());
ReplaceCall(call, shift_op);
} else {
BinaryInt64OpInstr* bin_op = new (Z) BinaryInt64OpInstr(
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 19a77d3..23b2002 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -38,6 +38,31 @@
.StartsWith(Symbols::InitPrefix());
}
+// Returns true if the given method can skip type checks for all arguments
+// that are not covariant or generic covariant in its implementation.
+static bool MethodCanSkipTypeChecksForNonCovariantArguments(
+ const Function& method,
+ const ProcedureAttributesMetadata& attrs) {
+ // Dart 2 type system at non-dynamic call sites statically guarantees that
+ // argument values match declarated parameter types for all non-covariant
+ // and non-generic-covariant parameters. The same applies to type parameters
+ // bounds for type parameters of generic functions.
+ // In JIT mode we dynamically generate trampolines (dynamic invocation
+ // forwarders) that perform type checks when arriving to a method from a
+ // dynamic call-site.
+ // In AOT mode we don't dynamically generate such trampolines but
+ // instead rely on a static analysis to discover which methods can
+ // be invoked dynamically.
+ if (method.name() == Symbols::Call().raw()) {
+ // Currently we consider all call methods to be invoked dynamically and
+ // don't mangle their names.
+ // TODO(vegorov) remove this once we also introduce special type checking
+ // entry point for closures.
+ return false;
+ }
+ return !FLAG_precompiled_mode || !attrs.has_dynamic_invocations;
+}
+
void FunctionNodeHelper::ReadUntilExcluding(Field field) {
if (field <= next_read_) return;
@@ -272,6 +297,11 @@
helper_->set_current_script_id(source_uri_index_);
if (++next_read_ == field) return;
/* Falls through */
+ case kStartPosition:
+ start_position_ = helper_->ReadPosition(false); // read position.
+ helper_->RecordTokenPosition(start_position_);
+ if (++next_read_ == field) return;
+ /* Falls through */
case kPosition:
position_ = helper_->ReadPosition(false); // read position.
helper_->RecordTokenPosition(position_);
@@ -345,6 +375,11 @@
helper_->set_current_script_id(source_uri_index_);
if (++next_read_ == field) return;
/* Falls through */
+ case kStartPosition:
+ start_position_ = helper_->ReadPosition(); // read position.
+ helper_->RecordTokenPosition(start_position_);
+ if (++next_read_ == field) return;
+ /* Falls through */
case kPosition:
position_ = helper_->ReadPosition(); // read position.
helper_->RecordTokenPosition(position_);
@@ -410,6 +445,11 @@
helper_->set_current_script_id(source_uri_index_);
if (++next_read_ == field) return;
/* Falls through */
+ case kStartPosition:
+ start_position_ = helper_->ReadPosition(false); // read position.
+ helper_->RecordTokenPosition(start_position_);
+ if (++next_read_ == field) return;
+ /* Falls through */
case kPosition:
position_ = helper_->ReadPosition(false); // read position.
helper_->RecordTokenPosition(position_);
@@ -1354,15 +1394,14 @@
}
RawCode* BytecodeMetadataHelper::ReadBytecode(const ObjectPool& pool) {
- // TODO(regis): Avoid copying bytecode from mapped kernel binary.
intptr_t size = builder_->reader_.ReadUInt();
intptr_t offset = builder_->reader_.offset();
- uint8_t* data =
- builder_->reader_.CopyDataIntoZone(builder_->zone_, offset, size);
+ const uint8_t* data = builder_->reader_.BufferAt(offset);
builder_->reader_.set_offset(offset + size);
// Create and return code object.
- return Code::FinalizeBytecode(reinterpret_cast<void*>(data), size, pool);
+ return Code::FinalizeBytecode(reinterpret_cast<const void*>(data), size,
+ pool);
}
void BytecodeMetadataHelper::ReadExceptionsTable(const Code& bytecode) {
@@ -1520,7 +1559,8 @@
&translation_helper_,
Script::Handle(Z, parsed_function->function().script()),
zone_,
- TypedData::Handle(Z, parsed_function->function().KernelData()),
+ ExternalTypedData::Handle(Z,
+ parsed_function->function().KernelData()),
parsed_function->function().KernelDataProgramOffset(),
&active_class_)),
type_translator_(builder_, /*finalize=*/true) {
@@ -1645,8 +1685,8 @@
for (intptr_t i = 0; i < class_fields.Length(); ++i) {
class_field ^= class_fields.At(i);
if (!class_field.is_static()) {
- TypedData& kernel_data =
- TypedData::Handle(Z, class_field.KernelData());
+ ExternalTypedData& kernel_data =
+ ExternalTypedData::Handle(Z, class_field.KernelData());
ASSERT(!kernel_data.IsNull());
intptr_t field_offset = class_field.kernel_offset();
AlternativeReadingScope alt(&builder_->reader_, &kernel_data,
@@ -1675,19 +1715,22 @@
if (function.IsNonImplicitClosureFunction()) {
type_check_mode = kTypeCheckAllParameters;
} else if (function.IsImplicitClosureFunction()) {
- if (!attrs.has_dynamic_invocations) {
+ if (MethodCanSkipTypeChecksForNonCovariantArguments(
+ Function::Handle(Z, function.parent_function()), attrs)) {
// This is a tear-off of an instance method that can not be reached
// from any dynamic invocation. The method would not check any
// parameters except covariant ones and those annotated with
// generic-covariant-impl. Which means that we have to check
- // the rest in the tear-off itself..
- type_check_mode = kTypeCheckForTearOffOfNonDynamicallyInvokedMethod;
+ // the rest in the tear-off itself.
+ type_check_mode =
+ kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod;
}
} else {
if (function.is_static()) {
// In static functions we don't check anything.
type_check_mode = kTypeCheckForStaticFunction;
- } else if (!attrs.has_dynamic_invocations) {
+ } else if (MethodCanSkipTypeChecksForNonCovariantArguments(function,
+ attrs)) {
// If the current function is never a target of a dynamic invocation
// and this parameter is not marked with generic-covariant-impl
// (which means that among all super-interfaces no type parameters
@@ -1754,7 +1797,8 @@
AbstractType::ZoneHandle(Z, function.ParameterTypeAt(pos)));
scope_->InsertParameterAt(pos++, result_->setter_value);
- if (is_method && !attrs.has_dynamic_invocations) {
+ if (is_method &&
+ MethodCanSkipTypeChecksForNonCovariantArguments(function, attrs)) {
FieldHelper field_helper(builder_);
field_helper.ReadUntilIncluding(FieldHelper::kFlags);
@@ -1768,6 +1812,47 @@
}
break;
}
+ case RawFunction::kDynamicInvocationForwarder: {
+ if (builder_->PeekTag() == kField) {
+#ifdef DEBUG
+ String& name = String::Handle(Z, function.name());
+ ASSERT(Function::IsDynamicInvocationForwaderName(name));
+ name = Function::DemangleDynamicInvocationForwarderName(name);
+ ASSERT(Field::IsSetterName(name));
+#endif
+ // Create [this] variable.
+ const Class& klass = Class::Handle(Z, function.Owner());
+ result_->this_variable =
+ MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+ Symbols::This(), H.GetCanonicalType(klass));
+ scope_->InsertParameterAt(0, result_->this_variable);
+
+ // Create setter value variable.
+ result_->setter_value = MakeVariable(
+ TokenPosition::kNoSource, TokenPosition::kNoSource,
+ Symbols::Value(),
+ AbstractType::ZoneHandle(Z, function.ParameterTypeAt(1)));
+ scope_->InsertParameterAt(1, result_->setter_value);
+ } else {
+ builder_->ReadUntilFunctionNode();
+ function_node_helper.ReadUntilExcluding(
+ FunctionNodeHelper::kPositionalParameters);
+
+ // Create [this] variable.
+ intptr_t pos = 0;
+ Class& klass = Class::Handle(Z, function.Owner());
+ result_->this_variable =
+ MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+ Symbols::This(), H.GetCanonicalType(klass));
+ scope_->InsertParameterAt(pos++, result_->this_variable);
+
+ // Create all positional and named parameters.
+ AddPositionalAndNamedParameters(
+ pos, kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod,
+ attrs);
+ }
+ break;
+ }
case RawFunction::kMethodExtractor: {
// Add a receiver parameter. Though it is captured, we emit code to
// explicitly copy it to a fixed offset in a freshly-allocated context
@@ -1848,7 +1933,8 @@
for (intptr_t i = 0; i < class_fields.Length(); ++i) {
class_field ^= class_fields.At(i);
if (!class_field.is_static()) {
- TypedData& kernel_data = TypedData::Handle(Z, class_field.KernelData());
+ ExternalTypedData& kernel_data =
+ ExternalTypedData::Handle(Z, class_field.KernelData());
ASSERT(!kernel_data.IsNull());
intptr_t field_offset = class_field.kernel_offset();
AlternativeReadingScope alt(&builder_->reader_, &kernel_data,
@@ -2847,7 +2933,7 @@
variable->set_is_forced_stack();
}
- const bool needs_covariant_checke_in_method =
+ const bool needs_covariant_check_in_method =
helper.IsCovariant() ||
(helper.IsGenericCovariantImpl() && attrs.has_non_this_uses);
@@ -2855,8 +2941,8 @@
case kTypeCheckAllParameters:
variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
break;
- case kTypeCheckForTearOffOfNonDynamicallyInvokedMethod:
- if (needs_covariant_checke_in_method) {
+ case kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod:
+ if (needs_covariant_check_in_method) {
// Don't type check covariant parameters - they will be checked by
// a function we forward to. Their types however are not known.
variable->set_type_check_mode(LocalVariable::kSkipTypeCheck);
@@ -2865,7 +2951,7 @@
}
break;
case kTypeCheckForNonDynamicallyInvokedMethod:
- if (needs_covariant_checke_in_method) {
+ if (needs_covariant_check_in_method) {
variable->set_type_check_mode(LocalVariable::kDoTypeCheck);
} else {
// Types of non-covariant parameters are guaranteed to match by
@@ -3500,10 +3586,10 @@
Tag tag = builder_->ReadTag(&payload); // read tag.
switch (tag) {
case kVariableGet:
- EvaluateVariableGet();
+ EvaluateVariableGet(/* is_specialized = */ false);
break;
case kSpecializedVariableGet:
- EvaluateVariableGet(payload);
+ EvaluateVariableGet(/* is_specialized = */ true);
break;
case kPropertyGet:
EvaluatePropertyGet();
@@ -3681,29 +3767,21 @@
!builder_->optimizing();
}
-void StreamingConstantEvaluator::EvaluateVariableGet() {
+void StreamingConstantEvaluator::EvaluateVariableGet(bool is_specialized) {
// When we see a [VariableGet] the corresponding [VariableDeclaration] must've
// been executed already. It therefore must have a constant object associated
// with it.
- builder_->ReadPosition(); // read position.
- intptr_t variable_kernel_position =
- builder_->ReadUInt(); // read kernel position.
- builder_->ReadUInt(); // read relative variable index.
- builder_->SkipOptionalDartType(); // read promoted type.
- LocalVariable* variable = builder_->LookupVariable(variable_kernel_position);
- ASSERT(variable->IsConst());
- result_ = variable->ConstValue()->raw();
-}
-
-void StreamingConstantEvaluator::EvaluateVariableGet(uint8_t payload) {
- // When we see a [VariableGet] the corresponding [VariableDeclaration] must've
- // been executed already. It therefore must have a constant object associated
- // with it.
- builder_->ReadPosition(); // read position.
- intptr_t variable_kernel_position =
+ const TokenPosition position = builder_->ReadPosition(); // read position.
+ const intptr_t variable_kernel_position =
builder_->ReadUInt(); // read kernel position.
+ if (!is_specialized) {
+ builder_->ReadUInt(); // read relative variable index.
+ builder_->SkipOptionalDartType(); // read promoted type.
+ }
LocalVariable* variable = builder_->LookupVariable(variable_kernel_position);
- ASSERT(variable->IsConst());
+ if (!variable->IsConst()) {
+ H.ReportError(script_, position, "Not a constant expression.");
+ }
result_ = variable->ConstValue()->raw();
}
@@ -4093,8 +4171,7 @@
}
void StreamingConstantEvaluator::EvaluateSymbolLiteral() {
- const Class& owner =
- Class::Handle(Z, builder_->parsed_function()->function().Owner());
+ const Class& owner = *builder_->active_class()->klass;
const Library& lib = Library::Handle(Z, owner.library());
String& symbol_value = H.DartIdentifier(lib, builder_->ReadStringReference());
const Class& symbol_class =
@@ -5205,7 +5282,8 @@
StringIndex StreamingFlowGraphBuilder::GetNameFromVariableDeclaration(
intptr_t kernel_offset,
const Function& function) {
- TypedData& kernel_data = TypedData::Handle(Z, function.KernelData());
+ ExternalTypedData& kernel_data =
+ ExternalTypedData::Handle(Z, function.KernelData());
ASSERT(!kernel_data.IsNull());
// Temporarily go to the variable declaration, read the name.
@@ -5258,8 +5336,13 @@
const Function& function = parsed_function()->function();
- bool is_setter = function.IsImplicitSetterFunction();
- bool is_method = !function.IsStaticFunction();
+ // Instead of building a dynamic invocation forwarder that checks argument
+ // type and then invokes original setter we simply generate the type check
+ // and inlined field store. Scope builder takes care of setting correct
+ // type check mode in this case.
+ const bool is_setter = function.IsDynamicInvocationForwader() ||
+ function.IsImplicitSetterFunction();
+ const bool is_method = !function.IsStaticFunction();
Field& field = Field::ZoneHandle(
Z, H.LookupFieldByKernelField(field_helper.canonical_name_));
@@ -5269,6 +5352,10 @@
Fragment body(normal_entry);
if (is_setter) {
+ // We only expect to generate a dynamic invocation forwarder if
+ // the value needs type check.
+ ASSERT(!function.IsDynamicInvocationForwader() ||
+ setter_value->needs_type_check());
if (is_method) {
body += LoadLocal(scopes()->this_variable);
}
@@ -5452,7 +5539,8 @@
for (intptr_t i = 0; i < class_fields.Length(); ++i) {
class_field ^= class_fields.At(i);
if (!class_field.is_static()) {
- TypedData& kernel_data = TypedData::Handle(Z, class_field.KernelData());
+ ExternalTypedData& kernel_data =
+ ExternalTypedData::Handle(Z, class_field.KernelData());
ASSERT(!kernel_data.IsNull());
intptr_t field_offset = class_field.kernel_offset();
AlternativeReadingScope alt(&reader_, &kernel_data, field_offset);
@@ -5686,18 +5774,17 @@
// Tearoffs of static methods needs to perform arguments checks since
// static methods they forward to don't do it themselves.
AlternativeReadingScope _(&reader_);
- body += BuildArgumentTypeChecks();
+ body += BuildArgumentTypeChecks(kCheckAllTypeParameterBounds);
} else {
// Check if parent function was annotated with no-dynamic-invocations.
const ProcedureAttributesMetadata attrs =
procedure_attributes_metadata_helper_.GetProcedureAttributes(
parent.kernel_offset());
- if (!attrs.has_dynamic_invocations) {
+ if (MethodCanSkipTypeChecksForNonCovariantArguments(parent, attrs)) {
// If it was then we might need to build some checks in the
// tear-off.
AlternativeReadingScope _(&reader_);
- body +=
- BuildArgumentTypeChecks(kTypeChecksForNoDynamicInvocationsTearOff);
+ body += BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds);
}
}
}
@@ -5804,7 +5891,7 @@
if (function.NeedsArgumentTypeChecks(I)) {
AlternativeReadingScope _(&reader_);
- body += BuildArgumentTypeChecks();
+ body += BuildArgumentTypeChecks(kCheckAllTypeParameterBounds);
}
function_node_helper.ReadUntilExcluding(
@@ -6053,8 +6140,84 @@
B->last_used_block_id_, prologue_info);
}
+bool StreamingFlowGraphBuilder::NeedsDynamicInvocationForwarder(
+ const Function& function) {
+ // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used
+ // e.g. for type translation.
+ const Class& klass = Class::Handle(zone_, function.Owner());
+ Function& outermost_function = Function::Handle(Z);
+ DiscoverEnclosingElements(Z, function, &outermost_function);
+
+ ActiveClassScope active_class_scope(active_class(), &klass);
+ ActiveMemberScope active_member(active_class(), &outermost_function);
+ ActiveTypeParametersScope active_type_params(active_class(), function, Z);
+
+ SetOffset(function.kernel_offset());
+
+ // Handle setters.
+ if (PeekTag() == kField) {
+ ASSERT(function.IsImplicitSetterFunction());
+ FieldHelper field_helper(this);
+ field_helper.ReadUntilIncluding(FieldHelper::kFlags);
+ return !(field_helper.IsCovariant() ||
+ field_helper.IsGenericCovariantImpl());
+ }
+
+ ReadUntilFunctionNode();
+
+ FunctionNodeHelper function_node_helper(this);
+ function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
+ intptr_t num_type_params = ReadListLength();
+
+ for (intptr_t i = 0; i < num_type_params; ++i) {
+ TypeParameterHelper helper(this);
+ helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
+ AbstractType& bound = T.BuildType(); // read bound
+ helper.Finish();
+
+ if (!bound.IsTopType() && !helper.IsGenericCovariantImpl()) {
+ return true;
+ }
+ }
+ function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+ function_node_helper.ReadUntilExcluding(
+ FunctionNodeHelper::kPositionalParameters);
+
+ // Positional.
+ const intptr_t num_positional_params = ReadListLength();
+ for (intptr_t i = 0; i < num_positional_params; ++i) {
+ VariableDeclarationHelper helper(this);
+ helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+ AbstractType& type = T.BuildType(); // read type.
+ helper.SetJustRead(VariableDeclarationHelper::kType);
+ helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
+
+ if (!type.IsTopType() && !helper.IsGenericCovariantImpl() &&
+ !helper.IsCovariant()) {
+ return true;
+ }
+ }
+
+ // Named.
+ const intptr_t num_named_params = ReadListLength();
+ for (intptr_t i = 0; i < num_named_params; ++i) {
+ VariableDeclarationHelper helper(this);
+ helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
+ AbstractType& type = T.BuildType(); // read type.
+ helper.SetJustRead(VariableDeclarationHelper::kType);
+ helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
+
+ if (!type.IsTopType() && !helper.IsGenericCovariantImpl() &&
+ !helper.IsCovariant()) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
Fragment StreamingFlowGraphBuilder::BuildArgumentTypeChecks(
- TypeChecksToBuild mode /*= kDefaultTypeChecks*/) {
+ TypeChecksToBuild mode) {
FunctionNodeHelper function_node_helper(this);
function_node_helper.SetNext(FunctionNodeHelper::kTypeParameters);
const Function& dart_function = parsed_function()->function();
@@ -6072,45 +6235,65 @@
ASSERT(!forwarding_target->IsNull());
}
- // Type parameters
- if (mode == kDefaultTypeChecks) {
- intptr_t num_type_params = ReadListLength();
- TypeArguments& forwarding_params = TypeArguments::Handle(Z);
- if (forwarding_target != NULL) {
- forwarding_params = forwarding_target->type_parameters();
- ASSERT(forwarding_params.Length() == num_type_params);
- }
- TypeParameter& forwarding_param = TypeParameter::Handle(Z);
- for (intptr_t i = 0; i < num_type_params; ++i) {
- TypeParameterHelper helper(this);
- helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
- String& name = H.DartSymbolObfuscate(helper.name_index_);
- AbstractType& bound = T.BuildType(); // read bound
- helper.Finish();
-
- if (forwarding_target != NULL) {
- forwarding_param ^= forwarding_params.TypeAt(i);
- bound = forwarding_param.bound();
- }
-
- if (I->strong() && !bound.IsObjectType() && !bound.IsDynamicType() &&
- (I->reify_generic_functions() || dart_function.IsFactory())) {
- TypeParameter& param = TypeParameter::Handle(Z);
- if (dart_function.IsFactory()) {
- param ^= TypeArguments::Handle(
- Class::Handle(dart_function.Owner()).type_parameters())
- .TypeAt(i);
- } else {
- param ^=
- TypeArguments::Handle(dart_function.type_parameters()).TypeAt(i);
- }
- ASSERT(param.IsFinalized());
- body += CheckTypeArgumentBound(param, bound, name);
- }
- }
- function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+ intptr_t num_type_params = ReadListLength();
+ TypeArguments& forwarding_params = TypeArguments::Handle(Z);
+ if (forwarding_target != NULL) {
+ forwarding_params = forwarding_target->type_parameters();
+ ASSERT(forwarding_params.Length() == num_type_params);
}
+ const bool has_reified_type_arguments =
+ I->strong() && I->reify_generic_functions();
+
+ TypeParameter& forwarding_param = TypeParameter::Handle(Z);
+ for (intptr_t i = 0; i < num_type_params; ++i) {
+ TypeParameterHelper helper(this);
+ helper.ReadUntilExcludingAndSetJustRead(TypeParameterHelper::kBound);
+ String& name = H.DartSymbolObfuscate(helper.name_index_);
+ AbstractType& bound = T.BuildType(); // read bound
+ helper.Finish();
+
+ if (!has_reified_type_arguments) {
+ continue;
+ }
+
+ if (forwarding_target != NULL) {
+ forwarding_param ^= forwarding_params.TypeAt(i);
+ bound = forwarding_param.bound();
+ }
+
+ if (bound.IsTopType()) {
+ continue;
+ }
+
+ switch (mode) {
+ case kCheckAllTypeParameterBounds:
+ break;
+ case kCheckCovariantTypeParameterBounds:
+ if (!helper.IsGenericCovariantImpl()) {
+ continue;
+ }
+ break;
+ case kCheckNonCovariantTypeParameterBounds:
+ if (helper.IsGenericCovariantImpl()) {
+ continue;
+ }
+ break;
+ }
+
+ TypeParameter& param = TypeParameter::Handle(Z);
+ if (dart_function.IsFactory()) {
+ param ^= TypeArguments::Handle(
+ Class::Handle(dart_function.Owner()).type_parameters())
+ .TypeAt(i);
+ } else {
+ param ^= TypeArguments::Handle(dart_function.type_parameters()).TypeAt(i);
+ }
+ ASSERT(param.IsFinalized());
+ body += CheckTypeArgumentBound(param, bound, name);
+ }
+
+ function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
function_node_helper.ReadUntilExcluding(
FunctionNodeHelper::kPositionalParameters);
@@ -6164,6 +6347,163 @@
return body;
}
+Fragment StreamingFlowGraphBuilder::PushAllArguments(PushedArguments* pushed) {
+ ASSERT(I->strong());
+
+ FunctionNodeHelper function_node_helper(this);
+ function_node_helper.SetNext(FunctionNodeHelper::kTypeParameters);
+
+ Fragment body;
+
+ const intptr_t num_type_params = ReadListLength();
+ if (num_type_params > 0) {
+ // Skip type arguments.
+ for (intptr_t i = 0; i < num_type_params; ++i) {
+ TypeParameterHelper helper(this);
+ helper.Finish();
+ }
+
+ if (I->reify_generic_functions()) {
+ body += LoadLocal(parsed_function()->function_type_arguments());
+ body += PushArgument();
+ pushed->type_args_len = num_type_params;
+ }
+ }
+ function_node_helper.SetJustRead(FunctionNodeHelper::kTypeParameters);
+ function_node_helper.ReadUntilExcluding(
+ FunctionNodeHelper::kPositionalParameters);
+
+ // Push receiver.
+ body += LoadLocal(scopes()->this_variable);
+ body += PushArgument();
+
+ // Push positional parameters.
+ const intptr_t num_positional_params = ReadListLength();
+ for (intptr_t i = 0; i < num_positional_params; ++i) {
+ // ith variable offset.
+ const intptr_t offset = ReaderOffset();
+ SkipVariableDeclaration();
+
+ LocalVariable* param = LookupVariable(offset + data_program_offset_);
+ body += LoadLocal(param);
+ body += PushArgument();
+ }
+
+ // Push named parameters.
+ const intptr_t num_named_params = ReadListLength();
+ pushed->argument_names = Array::New(num_named_params, Heap::kOld);
+ for (intptr_t i = 0; i < num_named_params; ++i) {
+ // ith variable offset.
+ const intptr_t offset = ReaderOffset();
+ SkipVariableDeclaration();
+
+ LocalVariable* param = LookupVariable(offset + data_program_offset_);
+ pushed->argument_names.SetAt(i, param->name());
+ body += LoadLocal(param);
+ body += PushArgument();
+ }
+
+ pushed->argument_count = num_positional_params + num_named_params + 1;
+
+ return body;
+}
+
+FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfDynamicInvocationForwarder() {
+ // The prologue builder needs the default parameter values.
+ SetupDefaultParameterValues();
+
+ const Function& dart_function = parsed_function()->function();
+ TargetEntryInstr* normal_entry = flow_graph_builder_->BuildTargetEntry();
+ PrologueInfo prologue_info(-1, -1);
+ BlockEntryInstr* instruction_cursor =
+ flow_graph_builder_->BuildPrologue(normal_entry, &prologue_info);
+
+ flow_graph_builder_->graph_entry_ = new (Z) GraphEntryInstr(
+ *parsed_function(), normal_entry, flow_graph_builder_->osr_id_);
+
+ Fragment body;
+ if (!dart_function.is_native()) {
+ body += flow_graph_builder_->CheckStackOverflowInPrologue(
+ dart_function.token_pos());
+ }
+
+ ASSERT(parsed_function()->node_sequence()->scope()->num_context_variables() ==
+ 0);
+
+ FunctionNodeHelper function_node_helper(this);
+ function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kTypeParameters);
+ const intptr_t type_parameters_offset = ReaderOffset();
+ function_node_helper.ReadUntilExcluding(
+ FunctionNodeHelper::kPositionalParameters);
+ intptr_t first_parameter_offset = -1;
+ {
+ AlternativeReadingScope alt(&reader_);
+ intptr_t list_length = ReadListLength(); // read number of positionals.
+ if (list_length > 0) {
+ first_parameter_offset = ReaderOffset() + data_program_offset_;
+ }
+ }
+ // Current position: About to read list of positionals.
+
+ // Should never build a dynamic invocation forwarder for equality
+ // operator.
+ ASSERT(dart_function.name() != Symbols::EqualOperator().raw());
+
+ // Even if the caller did not pass argument vector we would still
+ // call the target with instantiate-to-bounds type arguments.
+ body += BuildDefaultTypeHandling(dart_function, type_parameters_offset);
+
+ String& name = String::Handle(Z, dart_function.name());
+ name = Function::DemangleDynamicInvocationForwarderName(name);
+ const Class& owner = Class::Handle(Z, dart_function.Owner());
+ const Function& target =
+ Function::ZoneHandle(Z, owner.LookupDynamicFunction(name));
+ ASSERT(!target.IsNull());
+
+ // Build argument type checks that complement those that are emitted in the
+ // target.
+ {
+ AlternativeReadingScope alt(&reader_);
+ SetOffset(type_parameters_offset);
+ body += BuildArgumentTypeChecks(kCheckNonCovariantTypeParameterBounds);
+ }
+
+ // Push all arguments and invoke the original method.
+ PushedArguments pushed = {0, 0, Array::ZoneHandle(Z)};
+ {
+ AlternativeReadingScope alt(&reader_);
+ SetOffset(type_parameters_offset);
+ body += PushAllArguments(&pushed);
+ }
+ body += StaticCall(TokenPosition::kNoSource, target, pushed.argument_count,
+ pushed.argument_names, ICData::kNoRebind, nullptr,
+ pushed.type_args_len);
+
+ // Some IL optimization passes assume that result of operator []= invocation
+ // is never used, so we drop it and replace with an explicit null constant.
+ if (name.raw() == Symbols::AssignIndexToken().raw()) {
+ body += Drop();
+ body += NullConstant();
+ }
+
+ body += Return(TokenPosition::kNoSource);
+
+ instruction_cursor->LinkTo(body.entry);
+
+ GraphEntryInstr* graph_entry = flow_graph_builder_->graph_entry_;
+ // When compiling for OSR, use a depth first search to find the OSR
+ // entry and make graph entry jump to it instead of normal entry.
+ // Catch entries are always considered reachable, even if they
+ // become unreachable after OSR.
+ if (flow_graph_builder_->osr_id_ != Compiler::kNoOSRDeoptId) {
+ graph_entry->RelinkToOsrEntry(Z,
+ flow_graph_builder_->last_used_block_id_ + 1);
+ }
+ return new (Z)
+ FlowGraph(*parsed_function(), graph_entry,
+ flow_graph_builder_->last_used_block_id_, prologue_info);
+}
+
FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction(bool constructor) {
// The prologue builder needs the default parameter values.
SetupDefaultParameterValues();
@@ -6279,17 +6619,25 @@
body = Fragment(body.entry, non_null_entry);
}
- // If we run in checked mode or strong mode, we have to check the type of the
- // passed arguments.
+ // If we run in checked mode or strong mode, we have to check the type of
+ // the passed arguments.
if (dart_function.NeedsArgumentTypeChecks(I)) {
+ // Check if parent function was annotated with no-dynamic-invocations.
+ const ProcedureAttributesMetadata attrs =
+ procedure_attributes_metadata_helper_.GetProcedureAttributes(
+ dart_function.kernel_offset());
+
AlternativeReadingScope _(&reader_);
SetOffset(type_parameters_offset);
- body += BuildArgumentTypeChecks();
+ body += BuildArgumentTypeChecks(
+ MethodCanSkipTypeChecksForNonCovariantArguments(dart_function, attrs)
+ ? kCheckCovariantTypeParameterBounds
+ : kCheckAllTypeParameterBounds);
}
function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kBody);
- bool has_body = ReadTag() == kSomething; // read first part of body.
+ const bool has_body = ReadTag() == kSomething; // read first part of body.
if (dart_function.is_native()) {
body += flow_graph_builder_->NativeFunctionBody(first_parameter_offset,
@@ -6502,9 +6850,10 @@
flow_graph_builder_->last_used_block_id_, prologue_info);
}
-FlowGraph* StreamingFlowGraphBuilder::BuildGraph(intptr_t kernel_offset) {
+FlowGraph* StreamingFlowGraphBuilder::BuildGraph() {
ASSERT(Error::Handle(Z, H.thread()->sticky_error()).IsNull());
const Function& function = parsed_function()->function();
+ const intptr_t kernel_offset = function.kernel_offset();
// Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used
// e.g. for type translation.
@@ -6576,6 +6925,13 @@
? BuildGraphOfFieldInitializer()
: BuildGraphOfFieldAccessor(scopes()->setter_value);
}
+ case RawFunction::kDynamicInvocationForwarder:
+ if (PeekTag() == kField) {
+ return BuildGraphOfFieldAccessor(scopes()->setter_value);
+ } else {
+ ReadUntilFunctionNode(parsed_function());
+ return BuildGraphOfDynamicInvocationForwarder();
+ }
case RawFunction::kMethodExtractor:
return flow_graph_builder_->BuildGraphOfMethodExtractor(function);
case RawFunction::kNoSuchMethodDispatcher:
@@ -8253,8 +8609,15 @@
} else {
const intptr_t kTypeArgsLen = 0;
const intptr_t kNumArgsChecked = 1;
+
+ const String* mangled_name = &setter_name;
+ if (!FLAG_precompiled_mode && I->strong() && H.IsRoot(itarget_name)) {
+ mangled_name = &String::ZoneHandle(
+ Z, Function::CreateDynamicInvocationForwarderName(setter_name));
+ }
+
instructions +=
- InstanceCall(position, setter_name, Token::kSET, kTypeArgsLen, 2,
+ InstanceCall(position, *mangled_name, Token::kSET, kTypeArgsLen, 2,
Array::null_array(), kNumArgsChecked, *interface_target,
/* result_type = */ NULL);
}
@@ -8811,10 +9174,22 @@
argument_names, ICData::kNoRebind, &result_type,
type_args_len);
} else {
+ const String* mangled_name = &name;
+ // Do not mangle == or call:
+ // * operator == takes an Object so its either not checked or checked
+ // at the entry because the parameter is marked covariant, neither of
+ // those cases require a dynamic invocation forwarder;
+ // * we assume that all closures are entered in a checked way.
+ if (!FLAG_precompiled_mode && I->strong() &&
+ (name.raw() != Symbols::EqualOperator().raw()) &&
+ (name.raw() != Symbols::Call().raw()) && H.IsRoot(itarget_name)) {
+ mangled_name = &String::ZoneHandle(
+ Z, Function::CreateDynamicInvocationForwarderName(name));
+ }
instructions +=
- InstanceCall(position, name, token_kind, type_args_len, argument_count,
- argument_names, checked_argument_count, *interface_target,
- &result_type);
+ InstanceCall(position, *mangled_name, token_kind, type_args_len,
+ argument_count, argument_names, checked_argument_count,
+ *interface_target, &result_type);
}
// Drop temporaries preserving result on the top of the stack.
@@ -11311,8 +11686,7 @@
AlternativeReadingScope alt(&reader_);
SetOffset(GetOffsetForSourceInfo(index));
intptr_t size = ReadUInt(); // read uri List<byte> size.
- return H.DartString(reader_.CopyDataIntoZone(Z, ReaderOffset(), size), size,
- Heap::kOld);
+ return H.DartString(reader_.BufferAt(ReaderOffset()), size, Heap::kOld);
}
String& StreamingFlowGraphBuilder::GetSourceFor(intptr_t index) {
@@ -11320,8 +11694,7 @@
SetOffset(GetOffsetForSourceInfo(index));
SkipBytes(ReadUInt()); // skip uri.
intptr_t size = ReadUInt(); // read source List<byte> size.
- return H.DartString(reader_.CopyDataIntoZone(Z, ReaderOffset(), size), size,
- Heap::kOld);
+ return H.DartString(reader_.BufferAt(ReaderOffset()), size, Heap::kOld);
}
RawTypedData* StreamingFlowGraphBuilder::GetLineStartsFor(intptr_t index) {
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 7c2b7b5..5b1c7dd 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -115,6 +115,10 @@
void Finish() { ReadUntilExcluding(kEnd); }
+ bool IsGenericCovariantImpl() {
+ return (flags_ & kIsGenericCovariantImpl) != 0;
+ }
+
TokenPosition position_;
uint8_t flags_;
StringIndex name_index_;
@@ -275,6 +279,7 @@
kStart, // tag.
kCanonicalName,
kSourceUriIndex,
+ kStartPosition,
kPosition,
kEndPosition,
kKind,
@@ -329,6 +334,7 @@
}
NameIndex canonical_name_;
+ TokenPosition start_position_;
TokenPosition position_;
TokenPosition end_position_;
Kind kind_;
@@ -357,6 +363,7 @@
kStart, // tag.
kCanonicalName,
kSourceUriIndex,
+ kStartPosition,
kPosition,
kEndPosition,
kFlags,
@@ -390,6 +397,7 @@
bool IsSynthetic() { return (flags_ & kSynthetic) != 0; }
NameIndex canonical_name_;
+ TokenPosition start_position_;
TokenPosition position_;
TokenPosition end_position_;
uint8_t flags_;
@@ -414,6 +422,7 @@
kStart, // tag.
kCanonicalName,
kSourceUriIndex,
+ kStartPosition,
kPosition,
kEndPosition,
kFlags,
@@ -458,6 +467,7 @@
}
NameIndex canonical_name_;
+ TokenPosition start_position_;
TokenPosition position_;
TokenPosition end_position_;
StringIndex name_index_;
@@ -808,8 +818,8 @@
// Only parameters *not* marked as covariant or generic-covariant-impl will
// be checked. The rest would be checked in the method itself.
- // Inverse of kTypeCheckOnlyGenericCovariantImplParameters.
- kTypeCheckForTearOffOfNonDynamicallyInvokedMethod,
+ // Inverse of kTypeCheckForNonDynamicallyInvokedMethod.
+ kTypeCheckEverythingNotCheckedInNonDynamicallyInvokedMethod,
// No parameters will be checked.
kTypeCheckForStaticFunction,
@@ -937,8 +947,7 @@
private:
bool IsAllowedToEvaluate();
void EvaluateAsExpression();
- void EvaluateVariableGet();
- void EvaluateVariableGet(uint8_t payload);
+ void EvaluateVariableGet(bool is_specialized);
void EvaluatePropertyGet();
void EvaluateDirectPropertyGet();
void EvaluateStaticGet();
@@ -1015,7 +1024,7 @@
KernelReaderHelper(Zone* zone,
TranslationHelper* translation_helper,
const Script& script,
- const TypedData& data,
+ const ExternalTypedData& data,
intptr_t data_program_offset)
: zone_(zone),
translation_helper_(*translation_helper),
@@ -1143,7 +1152,7 @@
KernelFingerprintHelper(Zone* zone,
TranslationHelper* translation_helper,
const Script& script,
- const TypedData& data,
+ const ExternalTypedData& data,
intptr_t data_program_offset)
: KernelReaderHelper(zone,
translation_helper,
@@ -1192,7 +1201,7 @@
class StreamingFlowGraphBuilder : public KernelReaderHelper {
public:
StreamingFlowGraphBuilder(FlowGraphBuilder* flow_graph_builder,
- const TypedData& data,
+ const ExternalTypedData& data,
intptr_t data_program_offset)
: KernelReaderHelper(
flow_graph_builder->zone_,
@@ -1244,7 +1253,7 @@
StreamingFlowGraphBuilder(TranslationHelper* translation_helper,
const Script& script,
Zone* zone,
- const TypedData& data,
+ const ExternalTypedData& data,
intptr_t data_program_offset,
ActiveClass* active_class)
: KernelReaderHelper(zone,
@@ -1268,7 +1277,9 @@
virtual ~StreamingFlowGraphBuilder() {}
- FlowGraph* BuildGraph(intptr_t kernel_offset);
+ bool NeedsDynamicInvocationForwarder(const Function& function);
+
+ FlowGraph* BuildGraph();
void ReportUnexpectedTag(const char* variant, Tag tag) override;
@@ -1291,8 +1302,6 @@
// it crosses a procedure node for a concrete forwarding stub.
void ReadUntilFunctionNode(ParsedFunction* set_forwarding_stub = NULL);
- enum DispatchCategory { Interface, ViaThis, Closure, DynamicDispatch };
-
private:
void LoadAndSetupTypeParameters(ActiveClass* active_class,
const Object& set_on,
@@ -1315,6 +1324,7 @@
Fragment BuildInitializers(const Class& parent_class);
FlowGraph* BuildGraphOfImplicitClosureFunction(const Function& function);
FlowGraph* BuildGraphOfFunction(bool constructor);
+ FlowGraph* BuildGraphOfDynamicInvocationForwarder();
FlowGraph* BuildGraphOfNoSuchMethodForwarder(
const Function& function,
bool is_implicit_closure_function,
@@ -1413,15 +1423,23 @@
const InferredTypeMetadata* result_type = NULL);
enum TypeChecksToBuild {
- kDefaultTypeChecks,
- kTypeChecksForNoDynamicInvocationsTearOff
+ kCheckAllTypeParameterBounds,
+ kCheckNonCovariantTypeParameterBounds,
+ kCheckCovariantTypeParameterBounds,
};
// Does not move the cursor.
Fragment BuildDefaultTypeHandling(const Function& function,
intptr_t type_parameters_offset);
- Fragment BuildArgumentTypeChecks(TypeChecksToBuild mode = kDefaultTypeChecks);
+ struct PushedArguments {
+ intptr_t type_args_len;
+ intptr_t argument_count;
+ Array& argument_names;
+ };
+ Fragment PushAllArguments(PushedArguments* pushed);
+
+ Fragment BuildArgumentTypeChecks(TypeChecksToBuild mode);
Fragment ThrowException(TokenPosition position);
Fragment BooleanNegate();
@@ -1657,7 +1675,7 @@
}
AlternativeReadingScope(Reader* reader,
- const TypedData* new_typed_data,
+ const ExternalTypedData* new_typed_data,
intptr_t new_position)
: reader_(reader),
saved_size_(reader_->size()),
@@ -1690,7 +1708,7 @@
Reader* reader_;
intptr_t saved_size_;
const uint8_t* saved_raw_buffer_;
- const TypedData* saved_typed_data_;
+ const ExternalTypedData* saved_typed_data_;
intptr_t saved_offset_;
};
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 4d9b1c6..1bb584e 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -162,18 +162,18 @@
isolate_(thread->isolate()),
allocation_space_(thread->IsMutatorThread() ? Heap::kNew : Heap::kOld),
string_offsets_(TypedData::Handle(Z)),
- string_data_(TypedData::Handle(Z)),
+ string_data_(ExternalTypedData::Handle(Z)),
canonical_names_(TypedData::Handle(Z)),
- metadata_payloads_(TypedData::Handle(Z)),
- metadata_mappings_(TypedData::Handle(Z)),
+ metadata_payloads_(ExternalTypedData::Handle(Z)),
+ metadata_mappings_(ExternalTypedData::Handle(Z)),
constants_(Array::Handle(Z)) {}
void TranslationHelper::Reset() {
string_offsets_ = TypedData::null();
- string_data_ = TypedData::null();
+ string_data_ = ExternalTypedData::null();
canonical_names_ = TypedData::null();
- metadata_payloads_ = TypedData::null();
- metadata_mappings_ = TypedData::null();
+ metadata_payloads_ = ExternalTypedData::null();
+ metadata_mappings_ = ExternalTypedData::null();
constants_ = Array::null();
}
@@ -193,10 +193,10 @@
void TranslationHelper::InitFromKernelProgramInfo(
const KernelProgramInfo& info) {
SetStringOffsets(TypedData::Handle(Z, info.string_offsets()));
- SetStringData(TypedData::Handle(Z, info.string_data()));
+ SetStringData(ExternalTypedData::Handle(Z, info.string_data()));
SetCanonicalNames(TypedData::Handle(Z, info.canonical_names()));
- SetMetadataPayloads(TypedData::Handle(Z, info.metadata_payloads()));
- SetMetadataMappings(TypedData::Handle(Z, info.metadata_mappings()));
+ SetMetadataPayloads(ExternalTypedData::Handle(Z, info.metadata_payloads()));
+ SetMetadataMappings(ExternalTypedData::Handle(Z, info.metadata_mappings()));
SetConstants(Array::Handle(Z, info.constants()));
}
@@ -205,7 +205,7 @@
string_offsets_ = string_offsets.raw();
}
-void TranslationHelper::SetStringData(const TypedData& string_data) {
+void TranslationHelper::SetStringData(const ExternalTypedData& string_data) {
ASSERT(string_data_.IsNull());
string_data_ = string_data.raw();
}
@@ -216,13 +216,13 @@
}
void TranslationHelper::SetMetadataPayloads(
- const TypedData& metadata_payloads) {
+ const ExternalTypedData& metadata_payloads) {
ASSERT(metadata_payloads_.IsNull());
metadata_payloads_ = metadata_payloads.raw();
}
void TranslationHelper::SetMetadataMappings(
- const TypedData& metadata_mappings) {
+ const ExternalTypedData& metadata_mappings) {
ASSERT(metadata_mappings_.IsNull());
metadata_mappings_ = metadata_mappings.raw();
}
@@ -253,7 +253,7 @@
// expression will try to return the address that is one past the backing
// store of the string_data_ table. Though this is safe in C++ as long as the
// address is not dereferenced, it will trigger the assert in
- // TypedData::DataAddr.
+ // ExternalTypedData::DataAddr.
ASSERT(Thread::Current()->no_safepoint_scope_depth() > 0);
return reinterpret_cast<uint8_t*>(string_data_.DataAddr(0)) +
StringOffset(string_index);
@@ -2061,6 +2061,28 @@
}
}
+bool FlowGraphBuilder::NeedsDynamicInvocationForwarder(
+ const Function& function) {
+ ASSERT(Isolate::Current()->strong());
+
+ Thread* thread = Thread::Current();
+ Zone* zone_ = thread->zone();
+
+ TranslationHelper helper(thread);
+ Script& script = Script::Handle(Z, function.script());
+ helper.InitFromScript(script);
+
+ const Class& owner_class = Class::Handle(Z, function.Owner());
+ ActiveClass active_class;
+ ActiveClassScope active_class_scope(&active_class, &owner_class);
+
+ StreamingFlowGraphBuilder streaming_flow_graph_builder(
+ &helper, script, Z, ExternalTypedData::Handle(Z, function.KernelData()),
+ function.KernelDataProgramOffset(), &active_class);
+
+ return streaming_flow_graph_builder.NeedsDynamicInvocationForwarder(function);
+}
+
FlowGraph* FlowGraphBuilder::BuildGraph() {
const Function& function = parsed_function_->function();
@@ -2077,11 +2099,10 @@
#endif
StreamingFlowGraphBuilder streaming_flow_graph_builder(
- this, TypedData::Handle(Z, function.KernelData()),
+ this, ExternalTypedData::Handle(Z, function.KernelData()),
function.KernelDataProgramOffset());
streaming_flow_graph_builder_ = &streaming_flow_graph_builder;
- FlowGraph* result =
- streaming_flow_graph_builder_->BuildGraph(function.kernel_offset());
+ FlowGraph* result = streaming_flow_graph_builder_->BuildGraph();
streaming_flow_graph_builder_ = NULL;
return result;
}
@@ -2835,7 +2856,7 @@
StreamingFlowGraphBuilder streaming_flow_graph_builder(
&helper, Script::Handle(Z, metadata_field.Script()), Z,
- TypedData::Handle(Z, metadata_field.KernelData()),
+ ExternalTypedData::Handle(Z, metadata_field.KernelData()),
metadata_field.KernelDataProgramOffset(), &active_class);
return streaming_flow_graph_builder.EvaluateMetadata(
metadata_field.kernel_offset());
@@ -2859,7 +2880,7 @@
StreamingFlowGraphBuilder streaming_flow_graph_builder(
&helper, Script::Handle(Z, function.script()), Z,
- TypedData::Handle(Z, function.KernelData()),
+ ExternalTypedData::Handle(Z, function.KernelData()),
function.KernelDataProgramOffset(), /* active_class = */ NULL);
return streaming_flow_graph_builder.BuildParameterDescriptor(
function.kernel_offset());
@@ -2909,7 +2930,7 @@
}
static void ProcessTokenPositionsEntry(
- const TypedData& kernel_data,
+ const ExternalTypedData& kernel_data,
const Script& script,
const Script& entry_script,
intptr_t kernel_offset,
@@ -2945,7 +2966,7 @@
Library& lib = Library::Handle(Z);
Object& entry = Object::Handle(Z);
Script& entry_script = Script::Handle(Z);
- TypedData& data = TypedData::Handle(Z);
+ ExternalTypedData& data = ExternalTypedData::Handle(Z);
auto& temp_array = Array::Handle(Z);
auto& temp_field = Field::Handle(Z);
@@ -2955,7 +2976,7 @@
DictionaryIterator it(lib);
while (it.HasNext()) {
entry = it.GetNext();
- data = TypedData::null();
+ data = ExternalTypedData::null();
if (entry.IsClass()) {
const Class& klass = Class::Cast(entry);
if (klass.script() == interesting_script.raw()) {
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 1559f4f..9bb30e5 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -217,6 +217,7 @@
function_kind == RawFunction::kGetterFunction ||
function_kind == RawFunction::kSetterFunction ||
function_kind == RawFunction::kMethodExtractor ||
+ function_kind == RawFunction::kDynamicInvocationForwarder ||
member->IsFactory();
}
@@ -327,17 +328,17 @@
const TypedData& string_offsets() { return string_offsets_; }
void SetStringOffsets(const TypedData& string_offsets);
- const TypedData& string_data() { return string_data_; }
- void SetStringData(const TypedData& string_data);
+ const ExternalTypedData& string_data() { return string_data_; }
+ void SetStringData(const ExternalTypedData& string_data);
const TypedData& canonical_names() { return canonical_names_; }
void SetCanonicalNames(const TypedData& canonical_names);
- const TypedData& metadata_payloads() { return metadata_payloads_; }
- void SetMetadataPayloads(const TypedData& metadata_payloads);
+ const ExternalTypedData& metadata_payloads() { return metadata_payloads_; }
+ void SetMetadataPayloads(const ExternalTypedData& metadata_payloads);
- const TypedData& metadata_mappings() { return metadata_mappings_; }
- void SetMetadataMappings(const TypedData& metadata_mappings);
+ const ExternalTypedData& metadata_mappings() { return metadata_mappings_; }
+ void SetMetadataMappings(const ExternalTypedData& metadata_mappings);
const Array& constants() { return constants_; }
void SetConstants(const Array& constants);
@@ -466,10 +467,10 @@
Heap::Space allocation_space_;
TypedData& string_offsets_;
- TypedData& string_data_;
+ ExternalTypedData& string_data_;
TypedData& canonical_names_;
- TypedData& metadata_payloads_;
- TypedData& metadata_mappings_;
+ ExternalTypedData& metadata_payloads_;
+ ExternalTypedData& metadata_mappings_;
Array& constants_;
};
@@ -705,6 +706,12 @@
FlowGraph* BuildGraph();
+ // Returns true if the given function needs dynamic invocation forwarder:
+ // that is if any of the arguments require checking on the dynamic
+ // call-site: if function has no parameters or has only covariant parameters
+ // as such function already checks all of its parameters.
+ static bool NeedsDynamicInvocationForwarder(const Function& function);
+
private:
BlockEntryInstr* BuildPrologue(TargetEntryInstr* normal_entry,
PrologueInfo* prologue_info);
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index afedf3b..ddce593 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -91,7 +91,7 @@
// These offsets are embedded in precompiled instructions. We need simarm
// (compiler) and arm (runtime) to agree.
CHECK_OFFSET(Thread::stack_limit_offset(), 4);
- CHECK_OFFSET(Thread::object_null_offset(), 48);
+ CHECK_OFFSET(Thread::object_null_offset(), 56);
CHECK_OFFSET(SingleTargetCache::upper_limit_offset(), 14);
CHECK_OFFSET(Isolate::object_store_offset(), 28);
NOT_IN_PRODUCT(CHECK_OFFSET(sizeof(ClassHeapStats), 168));
@@ -100,7 +100,7 @@
// These offsets are embedded in precompiled instructions. We need simarm64
// (compiler) and arm64 (runtime) to agree.
CHECK_OFFSET(Thread::stack_limit_offset(), 8);
- CHECK_OFFSET(Thread::object_null_offset(), 96);
+ CHECK_OFFSET(Thread::object_null_offset(), 104);
CHECK_OFFSET(SingleTargetCache::upper_limit_offset(), 26);
CHECK_OFFSET(Isolate::object_store_offset(), 56);
NOT_IN_PRODUCT(CHECK_OFFSET(sizeof(ClassHeapStats), 288));
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 761e198..2ccdeca 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -5384,8 +5384,12 @@
CHECK_CALLBACK_STATE(T);
CHECK_COMPILATION_ALLOWED(I);
- kernel::Program* program = kernel::Program::ReadFromBuffer(
- buffer, buffer_size, /*take_buffer_ownership=*/false);
+ const char* error = nullptr;
+ kernel::Program* program =
+ kernel::Program::ReadFromBuffer(buffer, buffer_size, &error);
+ if (program == nullptr) {
+ return Api::NewError("Can't load Kernel binary: %s.", error);
+ }
const Object& tmp = kernel::KernelLoader::LoadEntireProgram(program);
delete program;
@@ -5681,8 +5685,12 @@
CHECK_CALLBACK_STATE(T);
CHECK_COMPILATION_ALLOWED(I);
- kernel::Program* program = kernel::Program::ReadFromBuffer(
- buffer, buffer_size, false /* take_buffer_ownership */);
+ const char* error = nullptr;
+ kernel::Program* program =
+ kernel::Program::ReadFromBuffer(buffer, buffer_size, &error);
+ if (program == nullptr) {
+ return Api::NewError("Can't load Kernel binary: %s.", error);
+ }
const Object& result =
kernel::KernelLoader::LoadEntireProgram(program, false);
delete program;
@@ -6067,7 +6075,9 @@
int source_files_count,
Dart_SourceFile sources[],
bool incremental_compile,
- const char* package_config) {
+ const char* package_config,
+ const char* multiroot_filepaths,
+ const char* multiroot_scheme) {
Dart_KernelCompilationResult result;
#if defined(DART_PRECOMPILED_RUNTIME)
result.status = Dart_KernelCompilationStatus_Unknown;
@@ -6075,7 +6085,8 @@
#else
result = KernelIsolate::CompileToKernel(
script_uri, platform_kernel, platform_kernel_size, source_files_count,
- sources, incremental_compile, package_config);
+ sources, incremental_compile, package_config, multiroot_filepaths,
+ multiroot_scheme);
if (result.status == Dart_KernelCompilationStatus_Ok) {
if (KernelIsolate::AcceptCompilation().status !=
Dart_KernelCompilationStatus_Ok) {
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 8b7fe6b..ef393a7 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -259,7 +259,7 @@
TEST_CASE(DartAPI_StackOverflowStackTraceInfoBraceFunction1) {
int line = 2;
- int col = FLAG_use_dart_frontend ? 10 : 3;
+ int col = 3;
VerifyStackOverflowStackTraceInfo(
"class C {\n"
" static foo(int i) { foo(i); }\n"
@@ -270,7 +270,7 @@
TEST_CASE(DartAPI_StackOverflowStackTraceInfoBraceFunction2) {
int line = 2;
- int col = FLAG_use_dart_frontend ? 10 : 3;
+ int col = 3;
VerifyStackOverflowStackTraceInfo(
"class C {\n"
" static foo(int i, int j) {\n"
@@ -283,7 +283,7 @@
TEST_CASE(DartAPI_StackOverflowStackTraceInfoArrowFunction) {
int line = 2;
- int col = FLAG_use_dart_frontend ? 10 : 3;
+ int col = 3;
VerifyStackOverflowStackTraceInfo(
"class C {\n"
" static foo(int i) => foo(i);\n"
@@ -6785,6 +6785,77 @@
EXPECT_VALID(result);
}
+TEST_CASE(DartAPI_Multiroot_Valid) {
+ const char* kScriptChars =
+ "import 'lib.dart';\n"
+ "void main() {}\n";
+ const char* kLibraryChars = "library lib.dart;\n";
+ Dart_Handle result;
+ Dart_Handle lib;
+
+ // This tests only makes sense when dart frontend is used
+ if (!FLAG_use_dart_frontend) {
+ return;
+ }
+
+ Dart_SourceFile sourcefiles[] = {
+ {"file:///bar/main.dart", kScriptChars},
+ {"file:///baz/lib.dart", kLibraryChars},
+ {"file:///bar/.packages", "untitled:/"},
+ };
+ int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile);
+ lib = TestCase::LoadTestScriptWithDFE(
+ sourcefiles_count, sourcefiles, NULL, /* finalize= */ true,
+ /* incrementally= */ true, /* allow_compile_errors= */ false,
+ "foo:///main.dart",
+ /* multiroot_filepaths= */ "/bar,/baz",
+ /* multiroot_scheme= */ "foo");
+ EXPECT_VALID(lib);
+ Library& lib_obj = Library::Handle();
+ lib_obj ^= Api::UnwrapHandle(lib);
+ EXPECT_STREQ("foo:///main.dart", String::Handle(lib_obj.url()).ToCString());
+ const Array& lib_scripts = Array::Handle(lib_obj.LoadedScripts());
+ Script& script = Script::Handle();
+ String& uri = String::Handle();
+ for (intptr_t i = 0; i < lib_scripts.Length(); i++) {
+ script ^= lib_scripts.At(i);
+ uri = script.url();
+ const char* uri_str = uri.ToCString();
+ EXPECT(strstr(uri_str, "foo:///") == uri_str);
+ }
+ result = Dart_FinalizeLoading(false);
+ EXPECT_VALID(result);
+ result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+ EXPECT_VALID(result);
+}
+
+TEST_CASE(DartAPI_Multiroot_FailWhenUriIsWrong) {
+ const char* kScriptChars =
+ "import 'lib.dart';\n"
+ "void main() {}\n";
+ const char* kLibraryChars = "library lib.dart;\n";
+ Dart_Handle lib;
+
+ // This tests only makes sense when dart frontend is used
+ if (!FLAG_use_dart_frontend) {
+ return;
+ }
+
+ Dart_SourceFile sourcefiles[] = {
+ {"file:///bar/main.dart", kScriptChars},
+ {"file:///baz/lib.dart", kLibraryChars},
+ {"file:///bar/.packages", "untitled:/"},
+ };
+ int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile);
+ lib = TestCase::LoadTestScriptWithDFE(
+ sourcefiles_count, sourcefiles, NULL, /* finalize= */ true,
+ /* incrementally= */ true, /* allow_compile_errors= */ false,
+ "foo1:///main.dart",
+ /* multiroot_filepaths= */ "/bar,/baz",
+ /* multiroot_scheme= */ "foo");
+ EXPECT_ERROR(lib, "Compilation failed foo1");
+}
+
void NewNativePort_send123(Dart_Port dest_port_id, Dart_CObject* message) {
// Gets a send port message.
EXPECT_NOTNULL(message);
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index aeb24be..790ff67 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -761,6 +761,13 @@
// Always return dynamic type (this is only a marker).
return &dynamic_type_marker;
}
+ if (object_id == kIntTypeArguments || object_id == kDoubleTypeArguments ||
+ object_id == kStringTypeArguments ||
+ object_id == kStringDynamicTypeArguments ||
+ object_id == kStringStringTypeArguments) {
+ return &type_arguments_marker;
+ }
+
intptr_t index = object_id - kMaxPredefinedObjectIds;
ASSERT((0 <= index) && (index < backward_references_.length()));
ASSERT(backward_references_[index]->reference() != NULL);
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 1ab87c0..5c97ead 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -414,7 +414,11 @@
// Share the immutable descriptor when possible by canonicalizing it.
descriptor.MakeImmutable();
- descriptor ^= descriptor.CheckAndCanonicalize(thread, NULL);
+ const char* error_str = NULL;
+ descriptor ^= descriptor.CheckAndCanonicalize(thread, &error_str);
+ if (error_str != NULL) {
+ FATAL1("Failed to canonicalize: %s", error_str);
+ }
ASSERT(!descriptor.IsNull());
return descriptor.raw();
}
@@ -459,7 +463,11 @@
// Share the immutable descriptor when possible by canonicalizing it.
descriptor.MakeImmutable();
if (canonicalize) {
- descriptor ^= descriptor.CheckAndCanonicalize(thread, NULL);
+ const char* error_str = NULL;
+ descriptor ^= descriptor.CheckAndCanonicalize(thread, &error_str);
+ if (error_str != NULL) {
+ FATAL1("Failed to canonicalize: %s", error_str);
+ }
}
ASSERT(!descriptor.IsNull());
return descriptor.raw();
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 7097f5a..974c447 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -687,6 +687,13 @@
isolate_flags_ = IsServiceIsolateBit::update(value, isolate_flags_);
}
+ bool is_kernel_isolate() const {
+ return IsKernelIsolateBit::decode(isolate_flags_);
+ }
+ void set_is_kernel_isolate(bool value) {
+ isolate_flags_ = IsKernelIsolateBit::update(value, isolate_flags_);
+ }
+
bool should_load_vmservice() const {
return ShouldLoadVmServiceBit::decode(isolate_flags_);
}
@@ -844,6 +851,7 @@
V(ErrorsFatal) \
V(IsRunnable) \
V(IsServiceIsolate) \
+ V(IsKernelIsolate) \
V(CompilationAllowed) \
V(AllClassesFinalized) \
V(RemappingCids) \
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 6f7c825..ff73002 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -525,10 +525,6 @@
~ResourceHolder() { delete (resource_); }
};
-static void ReleaseFetchedBytes(uint8_t* buffer) {
- free(buffer);
-}
-
static void AcceptCompilation(Thread* thread) {
TransitionVMToNative transition(thread);
if (KernelIsolate::AcceptCompilation().status !=
@@ -592,16 +588,19 @@
// compiled, so ReadKernelFromFile returns NULL.
kernel_program.set(kernel::Program::ReadFromFile(root_script_url));
if (kernel_program.get() == NULL) {
- TransitionVMToNative transition(thread);
Dart_SourceFile* modified_scripts = NULL;
intptr_t modified_scripts_count = 0;
FindModifiedSources(thread, force_reload, &modified_scripts,
&modified_scripts_count);
- Dart_KernelCompilationResult retval = KernelIsolate::CompileToKernel(
- root_lib_url.ToCString(), NULL, 0, modified_scripts_count,
- modified_scripts, true, NULL);
+ Dart_KernelCompilationResult retval;
+ {
+ TransitionVMToNative transition(thread);
+ retval = KernelIsolate::CompileToKernel(root_lib_url.ToCString(), NULL,
+ 0, modified_scripts_count,
+ modified_scripts, true, NULL);
+ }
if (retval.status != Dart_KernelCompilationStatus_Ok) {
TIR_Print("---- LOAD FAILED, ABORTING RELOAD\n");
@@ -614,11 +613,10 @@
return;
}
did_kernel_compilation = true;
- kernel_program.set(kernel::Program::ReadFromBuffer(
- retval.kernel, retval.kernel_size, true));
+ kernel_program.set(
+ kernel::Program::ReadFromBuffer(retval.kernel, retval.kernel_size));
}
- kernel_program.get()->set_release_buffer_callback(ReleaseFetchedBytes);
kernel::KernelLoader::FindModifiedLibraries(kernel_program.get(), I,
modified_libs_, force_reload);
} else {
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 7b7ac73..4fe6d44 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -19,11 +19,11 @@
TranslationHelper translation_helper(Thread::Current());
translation_helper.InitFromScript(script);
- StreamingFlowGraphBuilder builder(&translation_helper,
- Script::Handle(zone, field.Script()), zone,
- TypedData::Handle(zone, field.KernelData()),
- field.KernelDataProgramOffset(),
- /* active_class = */ NULL);
+ StreamingFlowGraphBuilder builder(
+ &translation_helper, Script::Handle(zone, field.Script()), zone,
+ ExternalTypedData::Handle(zone, field.KernelData()),
+ field.KernelDataProgramOffset(),
+ /* active_class = */ NULL);
builder.SetOffset(field.kernel_offset());
kernel::FieldHelper field_helper(&builder);
field_helper.ReadUntilExcluding(kernel::FieldHelper::kEnd, true);
@@ -96,9 +96,10 @@
TranslationHelper translation_helper(thread);
translation_helper.InitFromScript(script);
- KernelFingerprintHelper helper(zone, &translation_helper, script,
- TypedData::Handle(zone, field.KernelData()),
- field.KernelDataProgramOffset());
+ KernelFingerprintHelper helper(
+ zone, &translation_helper, script,
+ ExternalTypedData::Handle(zone, field.KernelData()),
+ field.KernelDataProgramOffset());
helper.SetOffset(field.kernel_offset());
return helper.CalculateFieldFingerprint();
}
@@ -112,9 +113,10 @@
TranslationHelper translation_helper(thread);
translation_helper.InitFromScript(script);
- KernelFingerprintHelper helper(zone, &translation_helper, script,
- TypedData::Handle(zone, func.KernelData()),
- func.KernelDataProgramOffset());
+ KernelFingerprintHelper helper(
+ zone, &translation_helper, script,
+ ExternalTypedData::Handle(zone, func.KernelData()),
+ func.KernelDataProgramOffset());
helper.SetOffset(func.kernel_offset());
return helper.CalculateFunctionFingerprint();
}
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index d297dda..5bcf919 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -55,36 +55,17 @@
enum LogicalOperator { kAnd, kOr };
-typedef void (*Dart_ReleaseBufferCallback)(uint8_t* buffer);
-
class Program {
public:
- ~Program() {
- if (buffer_ownership_ && kernel_data_ != NULL) {
- ASSERT(release_callback != NULL);
- release_callback(const_cast<uint8_t*>(kernel_data_));
- }
- kernel_data_ = NULL;
- }
-
- /**
- * Read a kernel Program from the given Reader. Note the returned Program
- * can potentially contain several "sub programs", though the library count
- * etc will reference the last "sub program" only.
- * @param reader
- * @param take_buffer_ownership if set to true, the release callback will be
- * called upon Program destruction, i.e. the data from reader will likely be
- * released. If set to false the data will not be released. This is for
- * instance useful for creating Programs out of "sub programs" where each
- * "sub program" should not try to release the buffer.
- * @return
- */
- static Program* ReadFrom(Reader* reader, bool take_buffer_ownership = false);
+ // Read a kernel Program from the given Reader. Note the returned Program
+ // can potentially contain several "sub programs", though the library count
+ // etc will reference the last "sub program" only.
+ static Program* ReadFrom(Reader* reader, const char** error = nullptr);
static Program* ReadFromFile(const char* script_uri);
static Program* ReadFromBuffer(const uint8_t* buffer,
intptr_t buffer_length,
- bool take_buffer_ownership = false);
+ const char** error = nullptr);
bool is_single_program() { return single_program_; }
NameIndex main_method() { return main_method_reference_; }
@@ -101,16 +82,11 @@
const uint8_t* kernel_data() { return kernel_data_; }
intptr_t kernel_data_size() { return kernel_data_size_; }
intptr_t library_count() { return library_count_; }
- void set_release_buffer_callback(Dart_ReleaseBufferCallback callback) {
- release_callback = callback;
- }
private:
- Program()
- : kernel_data_(NULL), kernel_data_size_(-1), release_callback(NULL) {}
+ Program() : kernel_data_(NULL), kernel_data_size_(-1) {}
bool single_program_;
- bool buffer_ownership_;
NameIndex main_method_reference_; // Procedure.
intptr_t library_count_;
@@ -134,7 +110,6 @@
const uint8_t* kernel_data_;
intptr_t kernel_data_size_;
- Dart_ReleaseBufferCallback release_callback;
DISALLOW_COPY_AND_ASSIGN(Program);
};
@@ -208,7 +183,6 @@
const dart::TypedData& line_starts_data_;
KernelLineStartsHelper* helper_;
- Dart_ReleaseBufferCallback release_callback;
DISALLOW_COPY_AND_ASSIGN(KernelLineStartsReader);
};
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index 9b97137..17128ce 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -29,20 +29,54 @@
return "Unknown";
}
-Program* Program::ReadFrom(Reader* reader, bool take_buffer_ownership) {
+const char* kKernelInvalidFilesize =
+ "File size is too small to a valid kernel file";
+const char* kKernelInvalidMagicIdentifier = "Invalid magic identifier";
+const char* kKernelInvalidBinaryFormatVersion =
+ "Invalid kernel binary format version";
+const char* kKernelInvalidSizeIndicated =
+ "Invalid kernel binary: Indicated size is invalid";
+
+Program* Program::ReadFrom(Reader* reader, const char** error) {
+ if (reader->size() < 59) {
+ // A kernel file currently contains at least the following:
+ // * Magic number (32)
+ // * Kernel version (32)
+ // * Length of source map (32)
+ // * Length of canonical name table (8)
+ // * Metadata length (32)
+ // * Length of string table (8)
+ // * Length of constant table (8)
+ // * Component index (10 * 32)
+ //
+ // so is at least 59 bytes.
+ // (Technically it will also contain an empty entry in both source map and
+ // string table, taking up another 8 bytes.)
+ if (error != nullptr) {
+ *error = kKernelInvalidFilesize;
+ }
+ return nullptr;
+ }
+
uint32_t magic = reader->ReadUInt32();
- if (magic != kMagicProgramFile) FATAL("Invalid magic identifier");
+ if (magic != kMagicProgramFile) {
+ if (error != nullptr) {
+ *error = kKernelInvalidMagicIdentifier;
+ }
+ return nullptr;
+ }
uint32_t formatVersion = reader->ReadUInt32();
if (formatVersion != kBinaryFormatVersion) {
- FATAL2("Invalid kernel binary format version (found %u, expected %u)",
- formatVersion, kBinaryFormatVersion);
+ if (error != nullptr) {
+ *error = kKernelInvalidBinaryFormatVersion;
+ }
+ return nullptr;
}
Program* program = new Program();
program->kernel_data_ = reader->buffer();
program->kernel_data_size_ = reader->size();
- program->buffer_ownership_ = take_buffer_ownership;
// Dill files can be concatenated (e.g. cat a.dill b.dill > c.dill). Find out
// if this dill contains more than one program.
@@ -52,7 +86,11 @@
intptr_t size = reader->ReadUInt32();
intptr_t start = reader->offset() - size;
if (start < 0) {
- FATAL("Invalid kernel binary: Indicated size is invalid.");
+ if (error != nullptr) {
+ *error = kKernelInvalidSizeIndicated;
+ }
+ delete program;
+ return nullptr;
}
++subprogram_count;
if (subprogram_count > 1) break;
@@ -118,9 +156,9 @@
Program* Program::ReadFromBuffer(const uint8_t* buffer,
intptr_t buffer_length,
- bool take_buffer_ownership) {
+ const char** error) {
kernel::Reader reader(buffer, buffer_length);
- return kernel::Program::ReadFrom(&reader, take_buffer_ownership);
+ return kernel::Program::ReadFrom(&reader, error);
}
} // namespace kernel
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 70a967b..68f3715 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,7 +20,7 @@
// package:kernel/binary.md.
static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
-static const uint32_t kBinaryFormatVersion = 7;
+static const uint32_t kBinaryFormatVersion = 8;
// Keep in sync with package:kernel/lib/binary/tag.dart
#define KERNEL_TAG_LIST(V) \
@@ -170,7 +170,7 @@
size_(size),
offset_(0) {}
- explicit Reader(const TypedData& typed_data)
+ explicit Reader(const ExternalTypedData& typed_data)
: thread_(Thread::Current()),
raw_buffer_(NULL),
typed_data_(&typed_data),
@@ -330,26 +330,23 @@
intptr_t size() const { return size_; }
void set_size(intptr_t size) { size_ = size; }
- const TypedData* typed_data() const { return typed_data_; }
- void set_typed_data(const TypedData* typed_data) { typed_data_ = typed_data; }
+ const ExternalTypedData* typed_data() const { return typed_data_; }
+ void set_typed_data(const ExternalTypedData* typed_data) {
+ typed_data_ = typed_data;
+ }
const uint8_t* raw_buffer() const { return raw_buffer_; }
void set_raw_buffer(const uint8_t* raw_buffer) { raw_buffer_ = raw_buffer; }
- void CopyDataToVMHeap(const TypedData& typed_data,
- intptr_t offset,
- intptr_t size) {
- NoSafepointScope no_safepoint(thread_);
- memmove(typed_data.DataAddr(0), buffer() + offset, size);
+ RawExternalTypedData* ExternalDataFromTo(intptr_t start, intptr_t end) {
+ return ExternalTypedData::New(kExternalTypedDataUint8ArrayCid,
+ const_cast<uint8_t*>(buffer() + start),
+ end - start, Heap::kOld);
}
- uint8_t* CopyDataIntoZone(Zone* zone, intptr_t offset, intptr_t length) {
- uint8_t* buffer_ = zone->Alloc<uint8_t>(length);
- {
- NoSafepointScope no_safepoint(thread_);
- memmove(buffer_, buffer() + offset, length);
- }
- return buffer_;
+ const uint8_t* BufferAt(intptr_t offset) {
+ ASSERT((offset >= 0) && (offset < size_));
+ return &buffer()[offset];
}
private:
@@ -363,7 +360,7 @@
Thread* thread_;
const uint8_t* raw_buffer_;
- const TypedData* typed_data_;
+ const ExternalTypedData* typed_data_;
intptr_t size_;
intptr_t offset_;
TokenPosition max_position_;
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index b5efb44..a841629 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -38,6 +38,16 @@
suppress_fe_warnings,
false,
"Suppress warnings from the FE.");
+DEFINE_FLAG(charp,
+ kernel_multiroot_filepaths,
+ NULL,
+ "Comma-separated list of file paths that should be treated as roots"
+ " by frontend compiler.");
+DEFINE_FLAG(charp,
+ kernel_multiroot_scheme,
+ NULL,
+ "URI scheme that replaces filepaths prefixes specified"
+ " by kernel_multiroot_filepaths option");
const char* KernelIsolate::kName = DART_KERNEL_ISOLATE_NAME;
@@ -265,6 +275,9 @@
void KernelIsolate::SetKernelIsolate(Isolate* isolate) {
MonitorLocker ml(monitor_);
+ if (isolate != nullptr) {
+ isolate->set_is_kernel_isolate(true);
+ }
isolate_ = isolate;
}
@@ -478,7 +491,9 @@
int source_files_count,
Dart_SourceFile source_files[],
bool incremental_compile,
- const char* package_config) {
+ const char* package_config,
+ const char* multiroot_filepaths,
+ const char* multiroot_scheme) {
// Build the [null, send_port, script_uri, platform_kernel,
// incremental_compile, isolate_id, [files]] message for the Kernel isolate.
// tag is used to specify which operation the frontend should perform.
@@ -560,6 +575,33 @@
package_config_uri.type = Dart_CObject_kNull;
}
+ Dart_CObject multiroot_filepaths_object;
+ {
+ const char* filepaths = multiroot_filepaths != NULL
+ ? multiroot_filepaths
+ : FLAG_kernel_multiroot_filepaths;
+ if (filepaths != NULL) {
+ multiroot_filepaths_object.type = Dart_CObject_kString;
+ multiroot_filepaths_object.value.as_string =
+ const_cast<char*>(filepaths);
+ } else {
+ multiroot_filepaths_object.type = Dart_CObject_kNull;
+ }
+ }
+
+ Dart_CObject multiroot_scheme_object;
+ {
+ const char* scheme = multiroot_scheme != NULL
+ ? multiroot_scheme
+ : FLAG_kernel_multiroot_scheme;
+ if (scheme != NULL) {
+ multiroot_scheme_object.type = Dart_CObject_kString;
+ multiroot_scheme_object.value.as_string = const_cast<char*>(scheme);
+ } else {
+ multiroot_scheme_object.type = Dart_CObject_kNull;
+ }
+ }
+
Dart_CObject* message_arr[] = {&tag,
&send_port,
&uri,
@@ -570,7 +612,9 @@
&files,
&suppress_warnings,
&dart_sync_async,
- &package_config_uri};
+ &package_config_uri,
+ &multiroot_filepaths_object,
+ &multiroot_scheme_object};
message.value.as_array.values = message_arr;
message.value.as_array.length = ARRAY_SIZE(message_arr);
// Send the message.
@@ -701,7 +745,9 @@
int source_file_count,
Dart_SourceFile source_files[],
bool incremental_compile,
- const char* package_config) {
+ const char* package_config,
+ const char* multiroot_filepaths,
+ const char* multiroot_scheme) {
// This must be the main script to be loaded. Wait for Kernel isolate
// to finish initialization.
Dart_Port kernel_port = WaitForKernelPort();
@@ -716,7 +762,8 @@
return request.SendAndWaitForResponse(kCompileTag, kernel_port, script_uri,
platform_kernel, platform_kernel_size,
source_file_count, source_files,
- incremental_compile, package_config);
+ incremental_compile, package_config,
+ multiroot_filepaths, multiroot_scheme);
}
Dart_KernelCompilationResult KernelIsolate::ListDependencies() {
@@ -730,7 +777,8 @@
KernelCompilationRequest request;
return request.SendAndWaitForResponse(kListDependenciesTag, kernel_port, NULL,
- NULL, 0, 0, NULL, false, NULL);
+ NULL, 0, 0, NULL, false, NULL, NULL,
+ NULL);
}
Dart_KernelCompilationResult KernelIsolate::AcceptCompilation() {
@@ -746,7 +794,7 @@
KernelCompilationRequest request;
return request.SendAndWaitForResponse(kAcceptTag, kernel_port, NULL, NULL, 0,
- 0, NULL, true, NULL);
+ 0, NULL, true, NULL, NULL, NULL);
}
Dart_KernelCompilationResult KernelIsolate::CompileExpressionToKernel(
@@ -786,7 +834,7 @@
KernelCompilationRequest request;
return request.SendAndWaitForResponse(kUpdateSourcesTag, kernel_port, NULL,
NULL, 0, source_files_count,
- source_files, true, NULL);
+ source_files, true, NULL, NULL, NULL);
}
void KernelIsolate::NotifyAboutIsolateShutdown(const Isolate* isolate) {
diff --git a/runtime/vm/kernel_isolate.h b/runtime/vm/kernel_isolate.h
index 5275308..3de2d9a 100644
--- a/runtime/vm/kernel_isolate.h
+++ b/runtime/vm/kernel_isolate.h
@@ -45,7 +45,9 @@
int source_files_count = 0,
Dart_SourceFile source_files[] = NULL,
bool incremental_compile = true,
- const char* package_config = NULL);
+ const char* package_config = NULL,
+ const char* multiroot_filepaths = NULL,
+ const char* multiroot_scheme = NULL);
static Dart_KernelCompilationResult AcceptCompilation();
static Dart_KernelCompilationResult UpdateInMemorySources(
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 5b5dfc4..3a554f4 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -127,7 +127,7 @@
return loader_->LookupClass(klass).raw();
}
-LibraryIndex::LibraryIndex(const TypedData& kernel_data)
+LibraryIndex::LibraryIndex(const ExternalTypedData& kernel_data)
: reader_(kernel_data) {
intptr_t data_size = reader_.size();
@@ -146,7 +146,7 @@
Init(class_offset, class_size);
}
-ClassIndex::ClassIndex(const TypedData& library_kernel_data,
+ClassIndex::ClassIndex(const ExternalTypedData& library_kernel_data,
intptr_t class_offset,
intptr_t class_size)
: reader_(library_kernel_data) {
@@ -168,7 +168,7 @@
library_kernel_offset_(-1), // Set to the correct value in LoadLibrary
correction_offset_(-1), // Set to the correct value in LoadLibrary
loading_native_wrappers_library_(false),
- library_kernel_data_(TypedData::ZoneHandle(zone_)),
+ library_kernel_data_(ExternalTypedData::ZoneHandle(zone_)),
kernel_program_info_(KernelProgramInfo::ZoneHandle(zone_)),
translation_helper_(this, thread_),
builder_(&translation_helper_,
@@ -189,7 +189,7 @@
ASSERT(T.active_class_ == &active_class_);
T.finalize_ = false;
- initialize_fields();
+ InitializeFields();
}
Object& KernelLoader::LoadEntireProgram(Program* program,
@@ -214,7 +214,7 @@
reader.set_raw_buffer(program->kernel_data() + subprogram_start);
reader.set_size(subprogram_end - subprogram_start);
reader.set_offset(0);
- Program* subprogram = Program::ReadFrom(&reader, false);
+ Program* subprogram = Program::ReadFrom(&reader);
ASSERT(subprogram->is_single_program());
KernelLoader loader(subprogram);
Object& load_result = Object::Handle(loader.LoadProgram(false));
@@ -259,7 +259,7 @@
subprogram_file_starts->Reverse();
}
-void KernelLoader::initialize_fields() {
+void KernelLoader::InitializeFields() {
const intptr_t source_table_size = builder_.SourceTableSize();
const Array& scripts =
Array::Handle(Z, Array::New(source_table_size, Heap::kOld));
@@ -279,10 +279,10 @@
offsets.SetUint32(i << 2, end_offset);
}
- // Copy the string data out of the binary and into the VM's heap.
- TypedData& data = TypedData::Handle(
- Z, TypedData::New(kTypedDataUint8ArrayCid, end_offset, Heap::kOld));
- reader.CopyDataToVMHeap(data, reader.offset(), end_offset);
+ // Create view of the string data.
+ const ExternalTypedData& data = ExternalTypedData::Handle(
+ Z,
+ reader.ExternalDataFromTo(reader.offset(), reader.offset() + end_offset));
// Copy the canonical names into the VM's heap. Encode them as unsigned, so
// the parent indexes are adjusted when extracted.
@@ -294,25 +294,15 @@
names.SetUint32(i << 2, reader.ReadUInt());
}
- // Copy metadata payloads into the VM's heap
- const intptr_t metadata_payloads_start = program_->metadata_payloads_offset();
- const intptr_t metadata_payloads_size =
- program_->metadata_mappings_offset() - metadata_payloads_start;
- TypedData& metadata_payloads =
- TypedData::Handle(Z, TypedData::New(kTypedDataUint8ArrayCid,
- metadata_payloads_size, Heap::kOld));
- reader.CopyDataToVMHeap(metadata_payloads, metadata_payloads_start,
- metadata_payloads_size);
+ // Create view of metadata payloads.
+ const ExternalTypedData& metadata_payloads = ExternalTypedData::Handle(
+ Z, reader.ExternalDataFromTo(program_->metadata_payloads_offset(),
+ program_->metadata_mappings_offset()));
- // Copy metadata mappings into the VM's heap
- const intptr_t metadata_mappings_start = program_->metadata_mappings_offset();
- const intptr_t metadata_mappings_size =
- program_->string_table_offset() - metadata_mappings_start;
- TypedData& metadata_mappings =
- TypedData::Handle(Z, TypedData::New(kTypedDataUint8ArrayCid,
- metadata_mappings_size, Heap::kOld));
- reader.CopyDataToVMHeap(metadata_mappings, metadata_mappings_start,
- metadata_mappings_size);
+ // Create view of metadata mappings.
+ const ExternalTypedData& metadata_mappings = ExternalTypedData::Handle(
+ Z, reader.ExternalDataFromTo(program_->metadata_mappings_offset(),
+ program_->string_table_offset()));
kernel_program_info_ = KernelProgramInfo::New(
offsets, data, names, metadata_payloads, metadata_mappings, scripts);
@@ -327,7 +317,7 @@
}
KernelLoader::KernelLoader(const Script& script,
- const TypedData& kernel_data,
+ const ExternalTypedData& kernel_data,
intptr_t data_program_offset)
: program_(NULL),
thread_(Thread::Current()),
@@ -337,7 +327,7 @@
library_kernel_offset_(data_program_offset),
correction_offset_(0),
loading_native_wrappers_library_(false),
- library_kernel_data_(TypedData::ZoneHandle(zone_)),
+ library_kernel_data_(ExternalTypedData::ZoneHandle(zone_)),
kernel_program_info_(
KernelProgramInfo::ZoneHandle(zone_, script.kernel_program_info())),
translation_helper_(this, thread_),
@@ -663,7 +653,7 @@
reader.set_raw_buffer(program->kernel_data() + subprogram_start);
reader.set_size(subprogram_end - subprogram_start);
reader.set_offset(0);
- Program* subprogram = Program::ReadFrom(&reader, false);
+ Program* subprogram = Program::ReadFrom(&reader);
ASSERT(subprogram->is_single_program());
KernelLoader loader(subprogram);
loader.walk_incremental_kernel(modified_libs);
@@ -742,10 +732,8 @@
ASSERT(!library_helper.IsExternal() || library.Loaded());
if (library.Loaded()) return library.raw();
- library_kernel_data_ =
- TypedData::New(kTypedDataUint8ArrayCid, library_size, Heap::kOld);
- builder_.reader_.CopyDataToVMHeap(library_kernel_data_,
- library_kernel_offset_, library_size);
+ library_kernel_data_ = builder_.reader_.ExternalDataFromTo(
+ library_kernel_offset_, library_kernel_offset_ + library_size);
library.set_kernel_data(library_kernel_data_);
library.set_kernel_offset(library_kernel_offset_);
@@ -1092,8 +1080,8 @@
FixCoreLibraryScriptUri(library, script);
}
if (klass.token_pos() == TokenPosition::kNoSource) {
- class_helper.ReadUntilIncluding(ClassHelper::kPosition);
- klass.set_token_pos(class_helper.position_);
+ class_helper.ReadUntilIncluding(ClassHelper::kStartPosition);
+ klass.set_token_pos(class_helper.start_position_);
}
class_helper.ReadUntilIncluding(ClassHelper::kFlags);
@@ -1237,7 +1225,7 @@
false, // is_abstract
constructor_helper.IsExternal(),
false, // is_native
- *owner, constructor_helper.position_));
+ *owner, constructor_helper.start_position_));
function.set_end_token_pos(constructor_helper.end_position_);
functions_.Add(&function);
function.set_kernel_offset(constructor_offset);
@@ -1289,8 +1277,8 @@
const Script& script = Script::Handle(zone, klass.script());
const Library& library = Library::Handle(zone, klass.library());
const Class& toplevel_class = Class::Handle(zone, library.toplevel_class());
- const TypedData& library_kernel_data =
- TypedData::Handle(zone, library.kernel_data());
+ const ExternalTypedData& library_kernel_data =
+ ExternalTypedData::Handle(zone, library.kernel_data());
ASSERT(!library_kernel_data.IsNull());
const intptr_t library_kernel_offset = library.kernel_offset();
ASSERT(library_kernel_offset > 0);
@@ -1449,7 +1437,7 @@
false, // is_const
is_abstract, is_external,
!native_name.IsNull(), // is_native
- script_class, procedure_helper.position_));
+ script_class, procedure_helper.start_position_));
function.set_has_pragma(has_pragma_annotation);
function.set_end_token_pos(procedure_helper.end_position_);
functions_.Add(&function);
@@ -1544,13 +1532,34 @@
RawScript* KernelLoader::LoadScriptAt(intptr_t index) {
const String& uri_string = builder_.SourceTableUriFor(index);
- const Script& script =
- Script::Handle(Z, Script::New(uri_string, builder_.GetSourceFor(index),
- RawScript::kKernelTag));
+ String& sources = builder_.GetSourceFor(index);
+ TypedData& line_starts =
+ TypedData::Handle(Z, builder_.GetLineStartsFor(index));
+ if (sources.Length() == 0 && line_starts.Length() == 0 &&
+ uri_string.Length() > 0) {
+ // Entry included only to provide URI - actual source should already exist
+ // in the VM, so try to find it.
+ Library& lib = Library::Handle(Z);
+ Script& script = Script::Handle(Z);
+ const GrowableObjectArray& libs =
+ GrowableObjectArray::Handle(isolate_->object_store()->libraries());
+ for (intptr_t i = 0; i < libs.Length(); i++) {
+ lib ^= libs.At(i);
+ script = lib.LookupScript(uri_string, /* useResolvedUri = */ true);
+ if (!script.IsNull() && script.kind() == RawScript::kKernelTag) {
+ sources ^= script.Source();
+ line_starts ^= script.line_starts();
+ break;
+ }
+ }
+ }
+
+ const Script& script = Script::Handle(
+ Z, Script::New(uri_string, sources, RawScript::kKernelTag));
+ String& script_url = String::Handle();
+ script_url = script.url();
script.set_kernel_script_index(index);
script.set_kernel_program_info(kernel_program_info_);
- const TypedData& line_starts =
- TypedData::Handle(Z, builder_.GetLineStartsFor(index));
script.set_line_starts(line_starts);
script.set_debug_positions(Array::Handle(Array::null()));
script.set_yield_positions(Array::Handle(Array::null()));
@@ -1758,7 +1767,7 @@
PatchClass::Handle(zone, PatchClass::New(field_owner, script));
const Library& lib = Library::Handle(zone, field_owner.library());
initializer_owner.set_library_kernel_data(
- TypedData::Handle(zone, lib.kernel_data()));
+ ExternalTypedData::Handle(zone, lib.kernel_data()));
initializer_owner.set_library_kernel_offset(lib.kernel_offset());
// Create a static initializer.
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index b8a70a9..2bc0bfc 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -55,7 +55,7 @@
class LibraryIndex {
public:
// |kernel_data| is the kernel data for one library alone.
- explicit LibraryIndex(const TypedData& kernel_data);
+ explicit LibraryIndex(const ExternalTypedData& kernel_data);
intptr_t class_count() const { return class_count_; }
intptr_t procedure_count() const { return procedure_count_; }
@@ -100,7 +100,7 @@
// |class_offset| is the offset of class' kernel data in |kernel_data|.
// The size of the class' kernel data is |class_size|.
- ClassIndex(const TypedData& kernel_data,
+ ClassIndex(const ExternalTypedData& kernel_data,
intptr_t class_offset,
intptr_t class_size);
@@ -199,10 +199,10 @@
friend class BuildingTranslationHelper;
KernelLoader(const Script& script,
- const TypedData& kernel_data,
+ const ExternalTypedData& kernel_data,
intptr_t data_program_offset);
- void initialize_fields();
+ void InitializeFields();
static void index_programs(kernel::Reader* reader,
GrowableArray<intptr_t>* subprogram_file_starts);
void walk_incremental_kernel(BitVector* modified_libs);
@@ -302,7 +302,7 @@
NameIndex skip_vmservice_library_;
- TypedData& library_kernel_data_;
+ ExternalTypedData& library_kernel_data_;
KernelProgramInfo& kernel_program_info_;
BuildingTranslationHelper translation_helper_;
StreamingFlowGraphBuilder builder_;
diff --git a/runtime/vm/log.cc b/runtime/vm/log.cc
index 06a4263..83b99b2 100644
--- a/runtime/vm/log.cc
+++ b/runtime/vm/log.cc
@@ -115,7 +115,7 @@
bool Log::ShouldLogForIsolate(const Isolate* isolate) {
if (FLAG_isolate_log_filter == NULL) {
- if (isolate->is_service_isolate()) {
+ if (isolate->is_service_isolate() || isolate->is_kernel_isolate()) {
// By default, do not log for the service isolate.
return false;
}
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index dac4c85..c1e7654 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1799,7 +1799,8 @@
type = object_store->object_type();
cls.set_super_type(type);
- // Create and cache commonly used type arguments <int> and <String>
+ // Create and cache commonly used type arguments <int>, <double>,
+ // <String>, <String, dynamic> and <String, String>.
type_args = TypeArguments::New(1);
type = object_store->int_type();
type_args.SetTypeAt(0, type);
@@ -1807,11 +1808,31 @@
object_store->set_type_argument_int(type_args);
type_args = TypeArguments::New(1);
+ type = object_store->double_type();
+ type_args.SetTypeAt(0, type);
+ type_args.Canonicalize();
+ object_store->set_type_argument_double(type_args);
+
+ type_args = TypeArguments::New(1);
type = object_store->string_type();
type_args.SetTypeAt(0, type);
type_args.Canonicalize();
object_store->set_type_argument_string(type_args);
+ type_args = TypeArguments::New(2);
+ type = object_store->string_type();
+ type_args.SetTypeAt(0, type);
+ type_args.SetTypeAt(1, Object::dynamic_type());
+ type_args.Canonicalize();
+ object_store->set_type_argument_string_dynamic(type_args);
+
+ type_args = TypeArguments::New(2);
+ type = object_store->string_type();
+ type_args.SetTypeAt(0, type);
+ type_args.SetTypeAt(1, type);
+ type_args.Canonicalize();
+ object_store->set_type_argument_string_string(type_args);
+
// Finish the initialization by compiling the bootstrap scripts containing
// the base interfaces and the implementation of the internal classes.
const Error& error = Error::Handle(
@@ -2693,27 +2714,54 @@
set_next_field_offset(offset);
}
+struct InvocationDispatcherCacheLayout {
+ enum { kNameIndex = 0, kArgsDescIndex, kFunctionIndex, kEntrySize };
+};
+
+void Class::AddInvocationDispatcher(const String& target_name,
+ const Array& args_desc,
+ const Function& dispatcher) const {
+ // Search for a free entry.
+ Array& cache = Array::Handle(invocation_dispatcher_cache());
+ intptr_t i = 0;
+ while (i < cache.Length() && cache.At(i) != Object::null()) {
+ i += InvocationDispatcherCacheLayout::kEntrySize;
+ }
+
+ if (i == cache.Length()) {
+ // Allocate new larger cache.
+ intptr_t new_len =
+ (cache.Length() == 0)
+ ? static_cast<intptr_t>(InvocationDispatcherCacheLayout::kEntrySize)
+ : cache.Length() * 2;
+ cache ^= Array::Grow(cache, new_len);
+ set_invocation_dispatcher_cache(cache);
+ }
+ cache.SetAt(i + InvocationDispatcherCacheLayout::kNameIndex, target_name);
+ cache.SetAt(i + InvocationDispatcherCacheLayout::kArgsDescIndex, args_desc);
+ cache.SetAt(i + InvocationDispatcherCacheLayout::kFunctionIndex, dispatcher);
+}
+
RawFunction* Class::GetInvocationDispatcher(const String& target_name,
const Array& args_desc,
RawFunction::Kind kind,
bool create_if_absent) const {
- enum { kNameIndex = 0, kArgsDescIndex, kFunctionIndex, kEntrySize };
-
ASSERT(kind == RawFunction::kNoSuchMethodDispatcher ||
- kind == RawFunction::kInvokeFieldDispatcher);
+ kind == RawFunction::kInvokeFieldDispatcher ||
+ kind == RawFunction::kDynamicInvocationForwarder);
Function& dispatcher = Function::Handle();
Array& cache = Array::Handle(invocation_dispatcher_cache());
ASSERT(!cache.IsNull());
String& name = String::Handle();
Array& desc = Array::Handle();
intptr_t i = 0;
- for (; i < cache.Length(); i += kEntrySize) {
- name ^= cache.At(i + kNameIndex);
+ for (; i < cache.Length(); i += InvocationDispatcherCacheLayout::kEntrySize) {
+ name ^= cache.At(i + InvocationDispatcherCacheLayout::kNameIndex);
if (name.IsNull()) break; // Reached last entry.
if (!name.Equals(target_name)) continue;
- desc ^= cache.At(i + kArgsDescIndex);
+ desc ^= cache.At(i + InvocationDispatcherCacheLayout::kArgsDescIndex);
if (desc.raw() != args_desc.raw()) continue;
- dispatcher ^= cache.At(i + kFunctionIndex);
+ dispatcher ^= cache.At(i + InvocationDispatcherCacheLayout::kFunctionIndex);
if (dispatcher.kind() == kind) {
// Found match.
ASSERT(dispatcher.IsFunction());
@@ -2722,18 +2770,8 @@
}
if (dispatcher.IsNull() && create_if_absent) {
- if (i == cache.Length()) {
- // Allocate new larger cache.
- intptr_t new_len = (cache.Length() == 0)
- ? static_cast<intptr_t>(kEntrySize)
- : cache.Length() * 2;
- cache ^= Array::Grow(cache, new_len);
- set_invocation_dispatcher_cache(cache);
- }
dispatcher ^= CreateInvocationDispatcher(target_name, args_desc, kind);
- cache.SetAt(i + kNameIndex, target_name);
- cache.SetAt(i + kArgsDescIndex, args_desc);
- cache.SetAt(i + kFunctionIndex, dispatcher);
+ AddInvocationDispatcher(target_name, args_desc, dispatcher);
}
return dispatcher.raw();
}
@@ -2853,6 +2891,81 @@
return result.raw();
}
+#if !defined(DART_PRECOMPILED_RUNTIME)
+RawFunction* Function::CreateDynamicInvocationForwarder(
+ const String& mangled_name) const {
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+
+ Function& forwarder = Function::Handle(zone);
+ forwarder ^= Object::Clone(*this, Heap::kOld);
+
+ forwarder.set_name(mangled_name);
+ forwarder.set_kind(RawFunction::kDynamicInvocationForwarder);
+ forwarder.set_is_debuggable(false);
+
+ // TODO(vegorov) for error reporting reasons it is better to make this
+ // function visible and instead use a TailCall to invoke the target.
+ // Our TailCall instruction is not ready for such usage though it
+ // blocks inlining and can't take Function-s only Code objects.
+ forwarder.set_is_visible(false);
+
+ forwarder.ClearICDataArray();
+ forwarder.ClearCode();
+ forwarder.set_usage_counter(0);
+ forwarder.set_deoptimization_counter(0);
+ forwarder.set_optimized_instruction_count(0);
+ forwarder.set_inlining_depth(0);
+ forwarder.set_optimized_call_site_count(0);
+ forwarder.set_kernel_offset(kernel_offset());
+
+ return forwarder.raw();
+}
+
+bool Function::IsDynamicInvocationForwaderName(const String& name) {
+ return name.StartsWith(Symbols::DynamicPrefix());
+}
+
+RawString* Function::CreateDynamicInvocationForwarderName(const String& name) {
+ return Symbols::FromConcat(Thread::Current(), Symbols::DynamicPrefix(), name);
+}
+
+RawString* Function::DemangleDynamicInvocationForwarderName(
+ const String& name) {
+ const intptr_t kDynamicPrefixLength = 4; // "dyn:"
+ ASSERT(Symbols::DynamicPrefix().Length() == kDynamicPrefixLength);
+ return Symbols::New(Thread::Current(), name, kDynamicPrefixLength,
+ name.Length() - kDynamicPrefixLength);
+}
+
+RawFunction* Function::GetDynamicInvocationForwarder(
+ const String& mangled_name,
+ bool allow_add /* = true */) const {
+ ASSERT(IsDynamicInvocationForwaderName(mangled_name));
+ const Class& owner = Class::Handle(Owner());
+ Function& result = Function::Handle(owner.GetInvocationDispatcher(
+ mangled_name, Array::null_array(),
+ RawFunction::kDynamicInvocationForwarder, /*create_if_absent=*/false));
+
+ if (!result.IsNull()) {
+ return result.raw();
+ }
+
+ // Check if function actually needs a dynamic invocation forwarder.
+ if (!kernel::FlowGraphBuilder::NeedsDynamicInvocationForwarder(*this)) {
+ result = raw();
+ } else if (allow_add) {
+ result = CreateDynamicInvocationForwarder(mangled_name);
+ }
+
+ if (allow_add) {
+ owner.AddInvocationDispatcher(mangled_name, Array::null_array(), result);
+ }
+
+ return result.raw();
+}
+#endif
+
bool AbstractType::InstantiateAndTestSubtype(
AbstractType* subtype,
AbstractType* supertype,
@@ -3219,12 +3332,6 @@
return func.raw();
}
-#if !defined(DART_PRECOMPILED_RUNTIME)
-static void ReleaseFetchedBytes(uint8_t* buffer) {
- free(buffer);
-}
-#endif
-
RawObject* Class::Evaluate(const String& expr,
const Array& param_names,
const Array& param_values) const {
@@ -3245,7 +3352,8 @@
return UnhandledException::New(exception, stacktrace);
}
- ASSERT(Library::Handle(library()).kernel_data() == TypedData::null() ||
+ ASSERT(Library::Handle(library()).kernel_data() ==
+ ExternalTypedData::null() ||
!FLAG_enable_kernel_expression_compilation);
const Function& eval_func = Function::Handle(
Function::EvaluateHelper(*this, expr, param_names, true));
@@ -3694,7 +3802,8 @@
if (scr.kind() == RawScript::kKernelTag) {
ASSERT(kernel_offset() > 0);
const Library& lib = Library::Handle(zone, library());
- const TypedData& kernel_data = TypedData::Handle(zone, lib.kernel_data());
+ const ExternalTypedData& kernel_data =
+ ExternalTypedData::Handle(zone, lib.kernel_data());
ASSERT(!kernel_data.IsNull());
const intptr_t library_kernel_offset = lib.kernel_offset();
ASSERT(library_kernel_offset > 0);
@@ -5553,7 +5662,7 @@
StorePointer(&raw_ptr()->script_, value.raw());
}
-void PatchClass::set_library_kernel_data(const TypedData& data) const {
+void PatchClass::set_library_kernel_data(const ExternalTypedData& data) const {
StorePointer(&raw_ptr()->library_kernel_data_, data.raw());
}
@@ -6025,6 +6134,8 @@
case RawFunction::kIrregexpFunction:
return "IrregexpFunction";
break;
+ case RawFunction::kDynamicInvocationForwarder:
+ return "DynamicInvocationForwarder";
default:
UNREACHABLE();
return NULL;
@@ -7111,7 +7222,6 @@
clone.set_optimized_instruction_count(0);
clone.set_inlining_depth(0);
clone.set_optimized_call_site_count(0);
- clone.set_kernel_offset(kernel_offset());
if (new_owner.NumTypeParameters() > 0) {
// Adjust uninstantiated types to refer to type parameters of the new owner.
@@ -7301,7 +7411,8 @@
kernel::TranslationHelper translation_helper(thread);
kernel::StreamingFlowGraphBuilder builder(
&translation_helper, function_script, zone,
- TypedData::Handle(zone, KernelData()), KernelDataProgramOffset(),
+ ExternalTypedData::Handle(zone, KernelData()),
+ KernelDataProgramOffset(),
/* active_class = */ NULL);
translation_helper.InitFromScript(function_script);
builder.SetOffset(kernel_offset());
@@ -7556,7 +7667,7 @@
}
void Function::SetKernelDataAndScript(const Script& script,
- const TypedData& data,
+ const ExternalTypedData& data,
intptr_t offset) {
Array& data_field = Array::Handle(Array::New(3));
data_field.SetAt(0, script);
@@ -7598,12 +7709,12 @@
return PatchClass::Cast(obj).script();
}
-RawTypedData* Function::KernelData() const {
+RawExternalTypedData* Function::KernelData() const {
Object& data = Object::Handle(raw_ptr()->data_);
if (data.IsArray()) {
Object& script = Object::Handle(Array::Cast(data).At(0));
if (script.IsScript()) {
- return TypedData::RawCast(Array::Cast(data).At(1));
+ return ExternalTypedData::RawCast(Array::Cast(data).At(1));
}
}
if (IsClosureFunction()) {
@@ -7713,6 +7824,38 @@
}
Zone* zone = Thread::Current()->zone();
const Script& func_script = Script::Handle(zone, script());
+
+ if (func_script.kind() == RawScript::kKernelTag) {
+ intptr_t from_line;
+ intptr_t from_col;
+ intptr_t to_line;
+ intptr_t to_col;
+ intptr_t to_length;
+ func_script.GetTokenLocation(token_pos(), &from_line, &from_col);
+ func_script.GetTokenLocation(end_token_pos(), &to_line, &to_col,
+ &to_length);
+
+ if (to_length == 1) {
+ // Handle special cases for end tokens of closures (where we exclude the
+ // last token):
+ // (1) "foo(() => null, bar);": End token is `,', but we don't print it.
+ // (2) "foo(() => null);": End token is ')`, but we don't print it.
+ // (3) "var foo = () => null;": End token is `;', but in this case the
+ // token semicolon belongs to the assignment so we skip it.
+ const String& src = String::Handle(func_script.Source());
+ uint16_t end_char = src.CharAt(end_token_pos().value());
+ if ((end_char == ',') || // Case 1.
+ (end_char == ')') || // Case 2.
+ (end_char == ';' && String::Handle(zone, name())
+ .Equals("<anonymous closure>"))) { // Case 3.
+ to_length = 0;
+ }
+ }
+
+ return func_script.GetSnippet(from_line, from_col, to_line,
+ to_col + to_length);
+ }
+
const TokenStream& stream = TokenStream::Handle(zone, func_script.tokens());
if (!func_script.HasSource()) {
// When source is not available, avoid printing the whole token stream and
@@ -7919,6 +8062,9 @@
case RawFunction::kNoSuchMethodDispatcher:
kind_str = " no-such-method-dispatcher";
break;
+ case RawFunction::kDynamicInvocationForwarder:
+ kind_str = " dynamic-invocation-forwader";
+ break;
case RawFunction::kInvokeFieldDispatcher:
kind_str = "invoke-field-dispatcher";
break;
@@ -8152,7 +8298,7 @@
return PatchClass::Cast(obj).script();
}
-RawTypedData* Field::KernelData() const {
+RawExternalTypedData* Field::KernelData() const {
const Object& obj = Object::Handle(this->raw_ptr()->owner_);
if (obj.IsClass()) {
Library& library = Library::Handle(Class::Cast(obj).library());
@@ -10227,7 +10373,7 @@
StorePointer(&raw_ptr()->url_, name.raw());
}
-void Library::set_kernel_data(const TypedData& data) const {
+void Library::set_kernel_data(const ExternalTypedData& data) const {
StorePointer(&raw_ptr()->kernel_data_, data.raw());
}
@@ -10951,7 +11097,8 @@
// TODO(hausner): we might want to add a script dictionary to the
// library class to make this lookup faster.
-RawScript* Library::LookupScript(const String& url) const {
+RawScript* Library::LookupScript(const String& url,
+ bool useResolvedUri /* = false */) const {
const intptr_t url_length = url.Length();
if (url_length == 0) {
return Script::null();
@@ -10962,7 +11109,11 @@
const intptr_t num_scripts = scripts.Length();
for (int i = 0; i < num_scripts; i++) {
script ^= scripts.At(i);
- script_url = script.url();
+ if (!useResolvedUri) {
+ script_url = script.url();
+ } else {
+ script_url = script.resolved_url();
+ }
const intptr_t start_idx = script_url.Length() - url_length;
if ((start_idx == 0) && url.Equals(script_url)) {
return script.raw();
@@ -11399,7 +11550,7 @@
const Array& param_values,
const Array& type_param_names,
const TypeArguments& type_param_values) const {
- ASSERT(kernel_data() == TypedData::null() ||
+ ASSERT(kernel_data() == ExternalTypedData::null() ||
!FLAG_enable_kernel_expression_compilation);
// Evaluate the expression as a static function of the toplevel class.
Class& top_level_class = Class::Handle(toplevel_class());
@@ -11489,15 +11640,13 @@
Thread* T = Thread::Current();
kernel::Program* kernel_pgm =
- kernel::Program::ReadFromBuffer(kernel_bytes, kernel_length, true);
+ kernel::Program::ReadFromBuffer(kernel_bytes, kernel_length);
if (kernel_pgm == NULL) {
return ApiError::New(String::Handle(
String::New("Kernel isolate returned ill-formed kernel.")));
}
- kernel_pgm->set_release_buffer_callback(ReleaseFetchedBytes);
-
Function& callee = Function::Handle();
intptr_t num_cids = I->class_table()->NumCids();
GrowableObjectArray& libraries =
@@ -11531,7 +11680,7 @@
// callee, so it doesn't require access it's parent library during
// compilation.
callee.SetKernelDataAndScript(Script::Handle(callee.script()),
- TypedData::Handle(loaded.kernel_data()),
+ ExternalTypedData::Handle(loaded.kernel_data()),
loaded.kernel_offset());
// Reparent the callee to the real enclosing class so we can remove the fake
@@ -12291,12 +12440,13 @@
return reinterpret_cast<RawKernelProgramInfo*>(raw);
}
-RawKernelProgramInfo* KernelProgramInfo::New(const TypedData& string_offsets,
- const TypedData& string_data,
- const TypedData& canonical_names,
- const TypedData& metadata_payloads,
- const TypedData& metadata_mappings,
- const Array& scripts) {
+RawKernelProgramInfo* KernelProgramInfo::New(
+ const TypedData& string_offsets,
+ const ExternalTypedData& string_data,
+ const TypedData& canonical_names,
+ const ExternalTypedData& metadata_payloads,
+ const ExternalTypedData& metadata_mappings,
+ const Array& scripts) {
const KernelProgramInfo& info =
KernelProgramInfo::Handle(KernelProgramInfo::New());
info.StorePointer(&info.raw_ptr()->string_offsets_, string_offsets.raw());
@@ -13645,8 +13795,18 @@
const String& name = String::Handle(target_name());
const Class& smi_class = Class::Handle(Smi::Class());
Zone* zone = Thread::Current()->zone();
- const Function& smi_op_target =
+ Function& smi_op_target =
Function::Handle(Resolver::ResolveDynamicAnyArgs(zone, smi_class, name));
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+ if (smi_op_target.IsNull() &&
+ Function::IsDynamicInvocationForwaderName(name)) {
+ const String& demangled =
+ String::Handle(Function::DemangleDynamicInvocationForwarderName(name));
+ smi_op_target = Resolver::ResolveDynamicAnyArgs(zone, smi_class, demangled);
+ }
+#endif
+
if (NumberOfChecksIs(0)) {
GrowableArray<intptr_t> class_ids(2);
class_ids.Add(kSmiCid);
@@ -13704,6 +13864,13 @@
}
bool ICData::ValidateInterceptor(const Function& target) const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+ const String& name = String::Handle(target_name());
+ if (Function::IsDynamicInvocationForwaderName(name)) {
+ return Function::DemangleDynamicInvocationForwarderName(name) ==
+ target.name();
+ }
+#endif
ObjectStore* store = Isolate::Current()->object_store();
ASSERT((target.raw() == store->simple_instance_of_true_function()) ||
(target.raw() == store->simple_instance_of_false_function()));
@@ -14779,7 +14946,7 @@
#endif // !defined(DART_PRECOMPILED_RUNTIME)
#if defined(DART_USE_INTERPRETER)
-RawCode* Code::FinalizeBytecode(void* bytecode_data,
+RawCode* Code::FinalizeBytecode(const void* bytecode_data,
intptr_t bytecode_size,
const ObjectPool& object_pool,
CodeStatistics* stats /* = nullptr */) {
@@ -14796,7 +14963,7 @@
// Copy the bytecode data into the instruction area. No fixups to apply.
MemoryRegion instrs_region(reinterpret_cast<void*>(instrs.PayloadStart()),
instrs.Size());
- MemoryRegion bytecode_region(bytecode_data, bytecode_size);
+ MemoryRegion bytecode_region(const_cast<void*>(bytecode_data), bytecode_size);
// TODO(regis): Avoid copying bytecode.
instrs_region.CopyFrom(0, bytecode_region);
@@ -15816,7 +15983,7 @@
}
const Library& library = Library::Handle(method_cls.library());
- ASSERT(library.kernel_data() == TypedData::null() ||
+ ASSERT(library.kernel_data() == ExternalTypedData::null() ||
!FLAG_enable_kernel_expression_compilation);
const Function& eval_func = Function::Handle(
Function::EvaluateHelper(method_cls, expr, param_names, false));
@@ -15929,6 +16096,8 @@
bool Instance::CheckAndCanonicalizeFields(Thread* thread,
const char** error_str) const {
+ ASSERT(error_str != NULL);
+ ASSERT(*error_str == NULL);
if (GetClassId() >= kNumPredefinedCids) {
// Iterate over all fields, canonicalize numbers and strings, expect all
// other instances to be canonical otherwise report error (return false).
@@ -15941,12 +16110,15 @@
obj = *this->FieldAddrAtOffset(offset);
if (obj.IsInstance() && !obj.IsSmi() && !obj.IsCanonical()) {
if (obj.IsNumber() || obj.IsString()) {
- obj = Instance::Cast(obj).CheckAndCanonicalize(thread, NULL);
+ obj = Instance::Cast(obj).CheckAndCanonicalize(thread, error_str);
+ if (*error_str != NULL) {
+ return false;
+ }
ASSERT(!obj.IsNull());
this->SetFieldAtOffset(offset, obj);
} else {
- ASSERT(error_str != NULL);
- char* chars = OS::SCreate(zone, "field: %s\n", obj.ToCString());
+ char* chars = OS::SCreate(zone, "field: %s, owner: %s\n",
+ obj.ToCString(), ToCString());
*error_str = chars;
return false;
}
@@ -15965,6 +16137,8 @@
RawInstance* Instance::CheckAndCanonicalize(Thread* thread,
const char** error_str) const {
+ ASSERT(error_str != NULL);
+ ASSERT(*error_str == NULL);
ASSERT(!IsNull());
if (this->IsCanonical()) {
return this->raw();
@@ -21247,6 +21421,8 @@
bool Array::CheckAndCanonicalizeFields(Thread* thread,
const char** error_str) const {
+ ASSERT(error_str != NULL);
+ ASSERT(*error_str == NULL);
intptr_t len = Length();
if (len > 0) {
Zone* zone = thread->zone();
@@ -21257,11 +21433,13 @@
obj = At(i);
if (obj.IsInstance() && !obj.IsSmi() && !obj.IsCanonical()) {
if (obj.IsNumber() || obj.IsString()) {
- obj = Instance::Cast(obj).CheckAndCanonicalize(thread, NULL);
+ obj = Instance::Cast(obj).CheckAndCanonicalize(thread, error_str);
+ if (*error_str != NULL) {
+ return false;
+ }
ASSERT(!obj.IsNull());
this->SetAt(i, obj);
} else {
- ASSERT(error_str != NULL);
char* chars = OS::SCreate(zone, "element at index %" Pd ": %s\n", i,
obj.ToCString());
*error_str = chars;
@@ -21771,6 +21949,9 @@
uint8_t* data,
intptr_t len,
Heap::Space space) {
+ if (len < 0 || len > ExternalTypedData::MaxElements(class_id)) {
+ FATAL1("Fatal error in ExternalTypedData::New: invalid len %" Pd "\n", len);
+ }
ExternalTypedData& result = ExternalTypedData::Handle();
{
RawObject* raw =
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 89513ea..8c69cb2 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1442,6 +1442,10 @@
void CheckReload(const Class& replacement,
IsolateReloadContext* context) const;
+ void AddInvocationDispatcher(const String& target_name,
+ const Array& args_desc,
+ const Function& dispatcher) const;
+
private:
bool CanReloadFinalized(const Class& replacement,
IsolateReloadContext* context) const;
@@ -1640,10 +1644,10 @@
RawClass* patched_class() const { return raw_ptr()->patched_class_; }
RawClass* origin_class() const { return raw_ptr()->origin_class_; }
RawScript* script() const { return raw_ptr()->script_; }
- RawTypedData* library_kernel_data() const {
+ RawExternalTypedData* library_kernel_data() const {
return raw_ptr()->library_kernel_data_;
}
- void set_library_kernel_data(const TypedData& data) const;
+ void set_library_kernel_data(const ExternalTypedData& data) const;
intptr_t library_kernel_offset() const {
#if !defined(DART_PRECOMPILED_RUNTIME)
@@ -2302,6 +2306,10 @@
return kind() == RawFunction::kInvokeFieldDispatcher;
}
+ bool IsDynamicInvocationForwader() const {
+ return kind() == RawFunction::kDynamicInvocationForwarder;
+ }
+
bool IsImplicitGetterOrSetter() const {
return kind() == RawFunction::kImplicitGetter ||
kind() == RawFunction::kImplicitSetter ||
@@ -2367,6 +2375,7 @@
case RawFunction::kMethodExtractor:
case RawFunction::kNoSuchMethodDispatcher:
case RawFunction::kInvokeFieldDispatcher:
+ case RawFunction::kDynamicInvocationForwarder:
return true;
case RawFunction::kClosureFunction:
case RawFunction::kImplicitClosureFunction:
@@ -2400,6 +2409,7 @@
case RawFunction::kMethodExtractor:
case RawFunction::kNoSuchMethodDispatcher:
case RawFunction::kInvokeFieldDispatcher:
+ case RawFunction::kDynamicInvocationForwarder:
return false;
default:
UNREACHABLE();
@@ -2523,12 +2533,12 @@
}
void SetKernelDataAndScript(const Script& script,
- const TypedData& data,
+ const ExternalTypedData& data,
intptr_t offset);
intptr_t KernelDataProgramOffset() const;
- RawTypedData* KernelData() const;
+ RawExternalTypedData* KernelData() const;
bool IsOptimizable() const;
void SetIsOptimizable(bool value) const;
@@ -2609,6 +2619,7 @@
case RawFunction::kImplicitSetter:
case RawFunction::kNoSuchMethodDispatcher:
case RawFunction::kInvokeFieldDispatcher:
+ case RawFunction::kDynamicInvocationForwarder:
return true;
default:
return false;
@@ -2770,6 +2781,17 @@
RawFunction* CreateMethodExtractor(const String& getter_name) const;
RawFunction* GetMethodExtractor(const String& getter_name) const;
+#if !defined(DART_PRECOMPILED_RUNTIME)
+ static bool IsDynamicInvocationForwaderName(const String& name);
+ static RawString* DemangleDynamicInvocationForwarderName(const String& name);
+ static RawString* CreateDynamicInvocationForwarderName(const String& name);
+
+ RawFunction* CreateDynamicInvocationForwarder(
+ const String& mangled_name) const;
+ RawFunction* GetDynamicInvocationForwarder(const String& mangled_name,
+ bool allow_add = true) const;
+#endif
+
// Allocate new function object, clone values from this function. The
// owner of the clone is new_owner.
RawFunction* Clone(const Class& new_owner) const;
@@ -3137,7 +3159,7 @@
#endif
}
- RawTypedData* KernelData() const;
+ RawExternalTypedData* KernelData() const;
intptr_t KernelDataProgramOffset() const;
@@ -3578,6 +3600,8 @@
return raw_ptr()->tokens_;
}
+ RawTypedData* line_starts() const;
+
void set_line_starts(const TypedData& value) const;
void set_debug_positions(const Array& value) const;
@@ -3635,7 +3659,6 @@
void set_kind(RawScript::Kind value) const;
void set_load_timestamp(int64_t value) const;
void set_tokens(const TokenStream& value) const;
- RawTypedData* line_starts() const;
RawArray* debug_positions() const;
static RawScript* New();
@@ -3785,7 +3808,7 @@
RawFunction* LookupFunctionAllowPrivate(const String& name) const;
RawFunction* LookupLocalFunction(const String& name) const;
RawLibraryPrefix* LookupLocalLibraryPrefix(const String& name) const;
- RawScript* LookupScript(const String& url) const;
+ RawScript* LookupScript(const String& url, bool useResolvedUri = false) const;
RawArray* LoadedScripts() const;
// Resolve name in the scope of this library. First check the cache
@@ -3886,8 +3909,8 @@
inline intptr_t UrlHash() const;
- RawTypedData* kernel_data() const { return raw_ptr()->kernel_data_; }
- void set_kernel_data(const TypedData& data) const;
+ RawExternalTypedData* kernel_data() const { return raw_ptr()->kernel_data_; }
+ void set_kernel_data(const ExternalTypedData& data) const;
intptr_t kernel_offset() const {
#if !defined(DART_PRECOMPILED_RUNTIME)
@@ -4057,10 +4080,10 @@
class KernelProgramInfo : public Object {
public:
static RawKernelProgramInfo* New(const TypedData& string_offsets,
- const TypedData& string_data,
+ const ExternalTypedData& string_data,
const TypedData& canonical_names,
- const TypedData& metadata_payload,
- const TypedData& metadata_mappings,
+ const ExternalTypedData& metadata_payload,
+ const ExternalTypedData& metadata_mappings,
const Array& scripts);
static intptr_t InstanceSize() {
@@ -4069,15 +4092,15 @@
RawTypedData* string_offsets() const { return raw_ptr()->string_offsets_; }
- RawTypedData* string_data() const { return raw_ptr()->string_data_; }
+ RawExternalTypedData* string_data() const { return raw_ptr()->string_data_; }
RawTypedData* canonical_names() const { return raw_ptr()->canonical_names_; }
- RawTypedData* metadata_payloads() const {
+ RawExternalTypedData* metadata_payloads() const {
return raw_ptr()->metadata_payloads_;
}
- RawTypedData* metadata_mappings() const {
+ RawExternalTypedData* metadata_mappings() const {
return raw_ptr()->metadata_mappings_;
}
@@ -4990,7 +5013,7 @@
bool optimized,
CodeStatistics* stats = nullptr);
#if defined(DART_USE_INTERPRETER)
- static RawCode* FinalizeBytecode(void* bytecode_data,
+ static RawCode* FinalizeBytecode(const void* bytecode_data,
intptr_t bytecode_size,
const ObjectPool& object_pool,
CodeStatistics* stats = nullptr);
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index aecf5ef..d2197e3 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -345,7 +345,7 @@
PatchClass::Handle(PatchClass::New(*this, Script::Handle(script())));
ASSERT(!patch.IsNull());
const Library& lib = Library::Handle(library());
- patch.set_library_kernel_data(TypedData::Handle(lib.kernel_data()));
+ patch.set_library_kernel_data(ExternalTypedData::Handle(lib.kernel_data()));
patch.set_library_kernel_offset(lib.kernel_offset());
const Array& funcs = Array::Handle(functions());
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index cf0f807..0470f1a 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -52,8 +52,11 @@
RW(Type, int32x4_type) \
RW(Type, float64x2_type) \
RW(Type, string_type) \
- RW(TypeArguments, type_argument_string) \
RW(TypeArguments, type_argument_int) \
+ RW(TypeArguments, type_argument_double) \
+ RW(TypeArguments, type_argument_string) \
+ RW(TypeArguments, type_argument_string_dynamic) \
+ RW(TypeArguments, type_argument_string_string) \
RW(Class, compiletime_error_class) \
RW(Class, pragma_class) \
RW(Class, future_class) \
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index bf7d68f..5d7a7f0 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -824,7 +824,7 @@
RawClass* patched_class_;
RawClass* origin_class_;
RawScript* script_;
- RawTypedData* library_kernel_data_;
+ RawExternalTypedData* library_kernel_data_;
VISIT_TO(RawObject*, library_kernel_data_);
RawObject** to_snapshot(Snapshot::Kind kind) {
@@ -867,6 +867,9 @@
kNoSuchMethodDispatcher, // invokes noSuchMethod.
kInvokeFieldDispatcher, // invokes a field as a closure.
kIrregexpFunction, // represents a generated irregexp matcher function.
+ kDynamicInvocationForwarder, // represents forwarder which performs type
+ // checks for arguments of a dynamic
+ // invocation.
};
enum AsyncModifier {
@@ -1168,7 +1171,7 @@
RawArray* imports_; // List of Namespaces imported without prefix.
RawArray* exports_; // List of re-exported Namespaces.
RawInstance* load_error_; // Error iff load_state_ == kLoadError.
- RawTypedData* kernel_data_;
+ RawExternalTypedData* kernel_data_;
RawObject** to_snapshot(Snapshot::Kind kind) {
switch (kind) {
case Snapshot::kFullAOT:
@@ -1224,10 +1227,10 @@
VISIT_FROM(RawObject*, string_offsets_);
RawTypedData* string_offsets_;
- RawTypedData* string_data_;
+ RawExternalTypedData* string_data_;
RawTypedData* canonical_names_;
- RawTypedData* metadata_payloads_;
- RawTypedData* metadata_mappings_;
+ RawExternalTypedData* metadata_payloads_;
+ RawExternalTypedData* metadata_mappings_;
RawArray* scripts_;
RawArray* constants_;
RawGrowableObjectArray* potential_natives_;
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index fce31ee..435e697 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1868,7 +1868,11 @@
obj ^= Object::Allocate(kInstanceCid, Instance::InstanceSize(),
HEAP_SPACE(kind));
if (RawObject::IsCanonical(tags)) {
- obj = obj.CheckAndCanonicalize(reader->thread(), NULL);
+ const char* error_str = NULL;
+ obj = obj.CheckAndCanonicalize(reader->thread(), &error_str);
+ if (error_str != NULL) {
+ FATAL1("Failed to canonicalize: %s", error_str);
+ }
}
reader->AddBackRef(object_id, &obj, kIsDeserialized);
@@ -2226,7 +2230,11 @@
// Read all the individual elements for inlined objects.
reader->ArrayReadFrom(object_id, *array, len, tags);
if (RawObject::IsCanonical(tags)) {
- *array ^= array->CheckAndCanonicalize(reader->thread(), NULL);
+ const char* error_str = NULL;
+ *array ^= array->CheckAndCanonicalize(reader->thread(), &error_str);
+ if (error_str != NULL) {
+ FATAL1("Failed to canonicalize: %s", error_str);
+ }
}
}
return raw(*array);
@@ -2552,7 +2560,11 @@
// When reading a script snapshot or a message snapshot we always have
// to canonicalize the object.
if (RawObject::IsCanonical(tags)) {
- result ^= result.CheckAndCanonicalize(reader->thread(), NULL);
+ const char* error_str = NULL;
+ result ^= result.CheckAndCanonicalize(reader->thread(), &error_str);
+ if (error_str != NULL) {
+ FATAL1("Failed to canonicalize: %s", error_str);
+ }
ASSERT(!result.IsNull());
ASSERT(result.IsCanonical());
}
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index b0238ad..abb9130 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -69,16 +69,30 @@
THR_Print("ResolveDynamic '%s' for class %s\n", function_name.ToCString(),
String::Handle(zone, cls.Name()).ToCString());
}
+ Function& function = Function::Handle(zone);
+
+ String& demangled = String::Handle(zone);
const bool is_getter = Field::IsGetterName(function_name);
- String& field_name = String::Handle(zone);
if (is_getter) {
- field_name ^= Field::NameFromGetter(function_name);
+ demangled ^= Field::NameFromGetter(function_name);
}
+#if !defined(DART_PRECOMPILED_RUNTIME)
+ if (Function::IsDynamicInvocationForwaderName(function_name)) {
+ ASSERT(!FLAG_precompiled_mode);
+ demangled ^=
+ Function::DemangleDynamicInvocationForwarderName(function_name);
+ function =
+ ResolveDynamicAnyArgs(zone, receiver_class, demangled, allow_add);
+ return function.IsNull() ? function.raw()
+ : function.GetDynamicInvocationForwarder(
+ function_name, allow_add);
+ }
+#endif
+
// Now look for an instance function whose name matches function_name
// in the class.
- Function& function = Function::Handle(zone);
while (!cls.IsNull()) {
function ^= cls.LookupDynamicFunction(function_name);
if (!function.IsNull()) {
@@ -87,7 +101,7 @@
// Getter invocation might actually be a method extraction.
if (FLAG_lazy_dispatchers) {
if (is_getter && function.IsNull()) {
- function ^= cls.LookupDynamicFunction(field_name);
+ function ^= cls.LookupDynamicFunction(demangled);
if (!function.IsNull() && allow_add) {
// We were looking for the getter but found a method with the same
// name. Create a method extractor and return it.
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 9a87566..38d5fa1 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -218,6 +218,13 @@
Exceptions::ThrowByType(Exceptions::kNoSuchMethod, args);
}
+DEFINE_RUNTIME_ENTRY(ArgumentErrorUnboxedInt64, 0) {
+ // Unboxed value is passed through a dedicated slot in Thread.
+ int64_t unboxed_value = arguments.thread()->unboxed_int64_runtime_arg();
+ const Integer& value = Integer::Handle(zone, Integer::New(unboxed_value));
+ Exceptions::ThrowArgumentError(value);
+}
+
// Allocation of a fixed length array of given element type.
// This runtime entry is never called for allocating a List of a generic type,
// because a prior run time call instantiates the element type if necessary.
@@ -1017,6 +1024,16 @@
const String& target_name) {
const Class& receiver_class = Class::Handle(receiver.clazz());
+#if !defined(DART_PRECOMPILED_RUNTIME)
+ // Handle noSuchMethod for dyn:methodName by getting a noSuchMethod dispatcher
+ // (or a call-through getter for methodName).
+ if (Function::IsDynamicInvocationForwaderName(target_name)) {
+ const String& demangled = String::Handle(
+ Function::DemangleDynamicInvocationForwarderName(target_name));
+ return InlineCacheMissHelper(receiver, args_descriptor, demangled);
+ }
+#endif
+
Function& result = Function::Handle();
if (!ResolveCallThroughGetter(receiver, receiver_class, target_name,
args_descriptor, &result)) {
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index 2c5f7f5..65c2c0a 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -35,6 +35,7 @@
V(PatchStaticCall) \
V(RangeError) \
V(NullError) \
+ V(ArgumentErrorUnboxedInt64) \
V(ReThrow) \
V(StackOverflow) \
V(Throw) \
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 26fe952..424ca0d 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -50,7 +50,7 @@
static bool IsObjectStoreTypeId(intptr_t index) {
// Check if this is a type which is stored in the object store.
- return (index >= kObjectType && index <= kArrayType);
+ return (index >= kObjectType && index <= kStringStringTypeArguments);
}
static bool IsSplitClassId(intptr_t class_id) {
@@ -74,7 +74,7 @@
return (class_id + kClassIdsOffset);
}
-static RawType* GetType(ObjectStore* object_store, intptr_t index) {
+static RawObject* GetType(ObjectStore* object_store, intptr_t index) {
switch (index) {
case kObjectType:
return object_store->object_type();
@@ -98,6 +98,16 @@
return object_store->string_type();
case kArrayType:
return object_store->array_type();
+ case kIntTypeArguments:
+ return object_store->type_argument_int();
+ case kDoubleTypeArguments:
+ return object_store->type_argument_double();
+ case kStringTypeArguments:
+ return object_store->type_argument_string();
+ case kStringDynamicTypeArguments:
+ return object_store->type_argument_string_dynamic();
+ case kStringStringTypeArguments:
+ return object_store->type_argument_string_string();
default:
break;
}
@@ -106,8 +116,7 @@
}
static intptr_t GetTypeIndex(ObjectStore* object_store,
- const RawType* raw_type) {
- ASSERT(raw_type->IsHeapObject());
+ const RawObject* raw_type) {
if (raw_type == object_store->object_type()) {
return kObjectType;
} else if (raw_type == object_store->null_type()) {
@@ -130,6 +139,16 @@
return kStringType;
} else if (raw_type == object_store->array_type()) {
return kArrayType;
+ } else if (raw_type == object_store->type_argument_int()) {
+ return kIntTypeArguments;
+ } else if (raw_type == object_store->type_argument_double()) {
+ return kDoubleTypeArguments;
+ } else if (raw_type == object_store->type_argument_string()) {
+ return kStringTypeArguments;
+ } else if (raw_type == object_store->type_argument_string_dynamic()) {
+ return kStringDynamicTypeArguments;
+ } else if (raw_type == object_store->type_argument_string_string()) {
+ return kStringStringTypeArguments;
}
return kInvalidIndex;
}
@@ -579,7 +598,11 @@
offset += kWordSize;
}
if (RawObject::IsCanonical(tags)) {
- *result = result->CheckAndCanonicalize(thread(), NULL);
+ const char* error_str = NULL;
+ *result = result->CheckAndCanonicalize(thread(), &error_str);
+ if (error_str != NULL) {
+ FATAL1("Failed to canonicalize %s\n", error_str);
+ }
ASSERT(!result->IsNull());
}
}
@@ -1186,8 +1209,7 @@
}
// Now check it is a preinitialized type object.
- RawType* raw_type = reinterpret_cast<RawType*>(rawobj);
- intptr_t index = GetTypeIndex(object_store(), raw_type);
+ intptr_t index = GetTypeIndex(object_store(), rawobj);
if (index != kInvalidIndex) {
WriteIndexedObject(index);
return true;
diff --git a/runtime/vm/snapshot_ids.h b/runtime/vm/snapshot_ids.h
index d767648..c4fa6b7 100644
--- a/runtime/vm/snapshot_ids.h
+++ b/runtime/vm/snapshot_ids.h
@@ -42,6 +42,11 @@
kBoolType,
kStringType,
kArrayType,
+ kIntTypeArguments,
+ kDoubleTypeArguments,
+ kStringTypeArguments,
+ kStringDynamicTypeArguments,
+ kStringStringTypeArguments,
kEmptyTypeArguments,
kExtractorParameterTypes,
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 50e5b36..d901830 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -367,6 +367,7 @@
V(GetterPrefix, "get:") \
V(SetterPrefix, "set:") \
V(InitPrefix, "init:") \
+ V(DynamicPrefix, "dyn:") \
V(Index, "index") \
V(DartScheme, "dart:") \
V(DartSchemePrivate, "dart:_") \
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 5d62829..c04d527 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -69,6 +69,7 @@
vm_tag_(0),
task_kind_(kUnknownTask),
async_stack_trace_(StackTrace::null()),
+ unboxed_int64_runtime_arg_(0),
dart_stream_(NULL),
os_thread_(NULL),
thread_lock_(new Monitor()),
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index eb81ca54..d8f2792 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -564,6 +564,16 @@
void set_vm_tag(uword tag) { vm_tag_ = tag; }
static intptr_t vm_tag_offset() { return OFFSET_OF(Thread, vm_tag_); }
+ int64_t unboxed_int64_runtime_arg() const {
+ return unboxed_int64_runtime_arg_;
+ }
+ void set_unboxed_int64_runtime_arg(int64_t value) {
+ unboxed_int64_runtime_arg_ = value;
+ }
+ static intptr_t unboxed_int64_runtime_arg_offset() {
+ return OFFSET_OF(Thread, unboxed_int64_runtime_arg_);
+ }
+
RawGrowableObjectArray* pending_functions();
void clear_pending_functions();
@@ -788,6 +798,12 @@
uword vm_tag_;
TaskKind task_kind_;
RawStackTrace* async_stack_trace_;
+ // Memory location dedicated for passing unboxed int64 values from
+ // generated code to runtime.
+ // TODO(dartbug.com/33549): Clean this up when unboxed values
+ // could be passed as arguments.
+ int64_t unboxed_int64_runtime_arg_;
+
// State that is cached in the TLS for fast access in generated code.
#define DECLARE_MEMBERS(type_name, member_name, expr, default_init_value) \
type_name member_name;
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index 836fa3f..c065f34 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -233,7 +233,9 @@
const uint8_t** kernel_buffer,
intptr_t* kernel_buffer_size,
bool incrementally,
- bool allow_compile_errors) {
+ bool allow_compile_errors,
+ const char* multiroot_filepaths,
+ const char* multiroot_scheme) {
// clang-format off
Dart_SourceFile sourcefiles[] = {
{
@@ -245,7 +247,8 @@
// clang-format on
return CompileTestScriptWithDFE(
url, sizeof(sourcefiles) / sizeof(Dart_SourceFile), sourcefiles,
- kernel_buffer, kernel_buffer_size, incrementally, allow_compile_errors);
+ kernel_buffer, kernel_buffer_size, incrementally, allow_compile_errors,
+ multiroot_filepaths, multiroot_scheme);
}
#if 0
@@ -303,12 +306,15 @@
const uint8_t** kernel_buffer,
intptr_t* kernel_buffer_size,
bool incrementally,
- bool allow_compile_errors) {
+ bool allow_compile_errors,
+ const char* multiroot_filepaths,
+ const char* multiroot_scheme) {
Zone* zone = Thread::Current()->zone();
Dart_KernelCompilationResult compilation_result = Dart_CompileSourcesToKernel(
url, FLAG_strong ? platform_strong_dill : platform_dill,
FLAG_strong ? platform_strong_dill_size : platform_dill_size,
- sourcefiles_count, sourcefiles, incrementally, NULL);
+ sourcefiles_count, sourcefiles, incrementally, NULL, multiroot_filepaths,
+ multiroot_scheme);
return ValidateCompilationResult(zone, compilation_result, kernel_buffer,
kernel_buffer_size, allow_compile_errors);
}
@@ -546,15 +552,20 @@
Dart_NativeEntryResolver resolver,
bool finalize,
bool incrementally,
- bool allow_compile_errors) {
+ bool allow_compile_errors,
+ const char* entry_script_uri,
+ const char* multiroot_filepaths,
+ const char* multiroot_scheme) {
// First script is the main script.
Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler);
EXPECT_VALID(result);
const uint8_t* kernel_buffer = NULL;
intptr_t kernel_buffer_size = 0;
char* error = TestCase::CompileTestScriptWithDFE(
- sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_buffer,
- &kernel_buffer_size, incrementally, allow_compile_errors);
+ entry_script_uri != NULL ? entry_script_uri : sourcefiles[0].uri,
+ sourcefiles_count, sourcefiles, &kernel_buffer, &kernel_buffer_size,
+ incrementally, allow_compile_errors, multiroot_filepaths,
+ multiroot_scheme);
if ((kernel_buffer == NULL) && error != NULL) {
return Dart_NewApiError(error);
}
@@ -564,7 +575,8 @@
DART_CHECK_VALID(lib);
// BOGUS: Kernel doesn't correctly represent the root library.
- lib = Dart_LookupLibrary(Dart_NewStringFromCString(sourcefiles[0].uri));
+ lib = Dart_LookupLibrary(Dart_NewStringFromCString(
+ entry_script_uri != NULL ? entry_script_uri : sourcefiles[0].uri));
DART_CHECK_VALID(lib);
result = Dart_SetRootLibrary(lib);
DART_CHECK_VALID(result);
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 5dd5122..7f41d26 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -319,14 +319,18 @@
const uint8_t** kernel_buffer,
intptr_t* kernel_buffer_size,
bool incrementally = true,
- bool allow_compile_errors = false);
+ bool allow_compile_errors = false,
+ const char* multiroot_filepaths = NULL,
+ const char* multiroot_scheme = NULL);
static char* CompileTestScriptWithDFE(const char* url,
int sourcefiles_count,
Dart_SourceFile sourcefiles[],
const uint8_t** kernel_buffer,
intptr_t* kernel_buffer_size,
bool incrementally = true,
- bool allow_compile_errors = false);
+ bool allow_compile_errors = false,
+ const char* multiroot_filepaths = NULL,
+ const char* multiroot_scheme = NULL);
static Dart_Handle LoadTestScript(const char* script,
Dart_NativeEntryResolver resolver,
const char* lib_uri = USER_TEST_URI,
@@ -346,7 +350,10 @@
Dart_NativeEntryResolver resolver = NULL,
bool finalize = true,
bool incrementally = true,
- bool allow_compile_errors = false);
+ bool allow_compile_errors = false,
+ const char* entry_script_uri = NULL,
+ const char* multiroot_filepaths = NULL,
+ const char* multiroot_scheme = NULL);
static Dart_Handle LoadCoreTestScript(const char* script,
Dart_NativeEntryResolver resolver);
diff --git a/runtime/vm/virtual_memory_fuchsia.cc b/runtime/vm/virtual_memory_fuchsia.cc
index 0b676c2..5bc755d 100644
--- a/runtime/vm/virtual_memory_fuchsia.cc
+++ b/runtime/vm/virtual_memory_fuchsia.cc
@@ -60,14 +60,14 @@
const uint32_t flags = ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE |
(is_executable ? ZX_VM_FLAG_PERM_EXECUTE : 0);
uword address;
- status = zx_vmar_map(zx_vmar_root_self(), 0, vmo, 0, size, flags, &address);
+ status = zx_vmar_map_old(zx_vmar_root_self(), 0, vmo, 0, size, flags, &address);
zx_handle_close(vmo);
if (status != ZX_OK) {
- LOG_ERR("zx_vmar_map(%ld, %u) failed: %s\n", size, flags,
+ LOG_ERR("zx_vmar_map_old(%ld, %u) failed: %s\n", size, flags,
zx_status_get_string(status));
return NULL;
}
- LOG_INFO("zx_vmar_map(%ld, %u) success\n", size, flags);
+ LOG_INFO("zx_vmar_map_old(%ld, %u) success\n", size, flags);
MemoryRegion region(reinterpret_cast<void*>(address), size);
return new VirtualMemory(region, region);
@@ -97,10 +97,10 @@
const uint32_t flags = ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE |
(is_executable ? ZX_VM_FLAG_PERM_EXECUTE : 0);
uword base;
- status = zx_vmar_map(vmar, 0u, vmo, 0u, allocated_size, flags, &base);
+ status = zx_vmar_map_old(vmar, 0u, vmo, 0u, allocated_size, flags, &base);
zx_handle_close(vmo);
if (status != ZX_OK) {
- LOG_ERR("zx_vmar_map(%ld, %u) failed: %s\n", size, flags,
+ LOG_ERR("zx_vmar_map_old(%ld, %u) failed: %s\n", size, flags,
zx_status_get_string(status));
return NULL;
}
@@ -180,13 +180,13 @@
ZX_VM_FLAG_PERM_EXECUTE;
break;
}
- zx_status_t status = zx_vmar_protect(zx_vmar_root_self(), page_address,
+ zx_status_t status = zx_vmar_protect_old(zx_vmar_root_self(), page_address,
end_address - page_address, prot);
if (status != ZX_OK) {
- FATAL3("zx_vmar_protect(%lx, %lx) failed: %s\n", page_address,
+ FATAL3("zx_vmar_protect_old(%lx, %lx) failed: %s\n", page_address,
end_address - page_address, zx_status_get_string(status));
}
- LOG_INFO("zx_vmar_protect(%lx, %lx, %x) success\n", page_address,
+ LOG_INFO("zx_vmar_protect_old(%lx, %lx, %x) success\n", page_address,
end_address - page_address, prot);
}
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index c84f526..226f959 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -46,7 +46,6 @@
# ........dartdevk.dart.snapshot
# ........kernel_worker.dart.snapshot
# ........pub.dart.snapshot
-# ........pub2.dart.snapshot
#.........resources/
#...........dartdoc/
#..............packages
@@ -134,10 +133,6 @@
"pub",
"../utils/pub",
],
- [
- "pub2",
- "../utils/pub:pub2",
- ],
]
_full_sdk_snapshots = [
@@ -178,10 +173,6 @@
"../utils/pub",
],
[
- "pub2",
- "../utils/pub:pub2",
- ],
- [
"kernel-service",
"../utils/kernel-service",
],
diff --git a/sdk/bin/pub_sdk b/sdk/bin/pub_sdk
index 85d3b97..4d29878 100755
--- a/sdk/bin/pub_sdk
+++ b/sdk/bin/pub_sdk
@@ -42,9 +42,9 @@
# Run the pub snapshot.
DART="$BIN_DIR/dart"
if array_contains "--no-preview-dart-2" "${VM_OPTIONS[@]}"; then
- SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
- exec "$DART" "${VM_OPTIONS[@]}" "$SNAPSHOT" "$@"
+ echo "Pub no longer supports Dart 1"
+ exit -1
else
- SNAPSHOT="$BIN_DIR/snapshots/pub2.dart.snapshot"
+ SNAPSHOT="$BIN_DIR/snapshots/pub.dart.snapshot"
exec "$DART" "${VM_OPTIONS[@]}" "$SNAPSHOT" "$@"
fi
diff --git a/sdk/bin/pub_sdk.bat b/sdk/bin/pub_sdk.bat
index 564e512..bde0e4a 100644
--- a/sdk/bin/pub_sdk.bat
+++ b/sdk/bin/pub_sdk.bat
@@ -29,9 +29,9 @@
)
if defined USING_DART_1 (
- "%BIN_DIR%\dart" %VM_OPTIONS% "%BIN_DIR%\snapshots\pub.dart.snapshot" %*
+ echo "Pub no longer supports Dart 1"
) else (
- "%BIN_DIR%\dart" %VM_OPTIONS% "%BIN_DIR%\snapshots\pub2.dart.snapshot" %*
+ "%BIN_DIR%\dart" %VM_OPTIONS% "%BIN_DIR%\snapshots\pub.dart.snapshot" %*
)
endlocal
diff --git a/sdk/lib/_http/websocket.dart b/sdk/lib/_http/websocket.dart
index 35f4690..64dbeb1 100644
--- a/sdk/lib/_http/websocket.dart
+++ b/sdk/lib/_http/websocket.dart
@@ -55,50 +55,38 @@
* the options of WebSocket compression.
*/
class CompressionOptions {
- /**
- * Default WebSocket Compression options.
- * Compression will be enabled with the following options:
- * clientNoContextTakeover: false
- * serverNoContextTakeover: false
- * clientMaxWindowBits: 15
- * serverMaxWindowBits: 15
- */
+ /// Default WebSocket Compression options.
+ ///
+ /// Compression will be enabled with the following options:
+ ///
+ /// * `clientNoContextTakeover`: false
+ /// * `serverNoContextTakeover`: false
+ /// * `clientMaxWindowBits`: 15
+ /// * `serverMaxWindowBits`: 15
static const CompressionOptions compressionDefault =
const CompressionOptions();
@Deprecated("Use compressionDefault instead")
static const CompressionOptions DEFAULT = compressionDefault;
- /**
- * Disables WebSocket Compression.
- */
+ /// Disables WebSocket Compression.
static const CompressionOptions compressionOff =
const CompressionOptions(enabled: false);
@Deprecated("Use compressionOff instead")
static const CompressionOptions OFF = compressionOff;
- /**
- * Control whether the client will reuse it's compression instances.
- */
+ /// Controls whether the client will reuse its compression instances.
final bool clientNoContextTakeover;
- /**
- * Control whether the server will reuse it's compression instances.
- */
+ /// Controls whether the server will reuse its compression instances.
final bool serverNoContextTakeover;
- /**
- * Sets the Max Window Bits for the Client.
- */
+ /// Determines the max window bits for the client.
final int clientMaxWindowBits;
- /**
- * Sets the Max Window Bits for the Server.
- */
+ /// Determines the max window bits for the server.
final int serverMaxWindowBits;
- /**
- * Enables or disables WebSocket compression.
- */
+ /// Enables or disables WebSocket compression.
final bool enabled;
const CompressionOptions(
@@ -109,10 +97,12 @@
this.enabled: true});
/// Parses list of requested server headers to return server compression
- /// response headers. Uses [serverMaxWindowBits] value if set, otherwise will
- /// attempt to use value from headers. Defaults to
- /// [WebSocket.DEFAULT_WINDOW_BITS]. Returns a [_CompressionMaxWindowBits]
- /// object which contains the response headers and negotiated max window bits.
+ /// response headers.
+ ///
+ /// Uses [serverMaxWindowBits] value if set, otherwise will attempt to use
+ /// value from headers. Defaults to [WebSocket.DEFAULT_WINDOW_BITS]. Returns a
+ /// [_CompressionMaxWindowBits] object which contains the response headers and
+ /// negotiated max window bits.
_CompressionMaxWindowBits _createServerResponseHeader(HeaderValue requested) {
var info = new _CompressionMaxWindowBits();
@@ -161,14 +151,16 @@
return info;
}
- /// Create a Compression Header. If [requested] is null or contains
- /// client request headers, returns Client compression request headers with
- /// default settings for `client_max_window_bits` header value.
- /// If [requested] contains server response headers this method returns
- /// a Server compression response header negotiating the max window bits
- /// for both client and server as requested server_max_window_bits value.
- /// This method returns a [_CompressionMaxWindowBits] object with the
- /// response headers and negotiated maxWindowBits value.
+ /// Create a Compression Header.
+ ///
+ /// If [requested] is null or contains client request headers, returns Client
+ /// compression request headers with default settings for
+ /// `client_max_window_bits` header value. If [requested] contains server
+ /// response headers this method returns a Server compression response header
+ /// negotiating the max window bits for both client and server as requested
+ /// `server_max_window_bits` value. This method returns a
+ /// [_CompressionMaxWindowBits] object with the response headers and
+ /// negotiated `maxWindowBits` value.
_CompressionMaxWindowBits _createHeader([HeaderValue requested]) {
var info = new _CompressionMaxWindowBits("", 0);
if (!enabled) {
diff --git a/sdk/lib/async/zone.dart b/sdk/lib/async/zone.dart
index f875f0c..dad3151 100644
--- a/sdk/lib/async/zone.dart
+++ b/sdk/lib/async/zone.dart
@@ -1466,10 +1466,10 @@
}
void Function(Object) unaryOnError;
void Function(Object, StackTrace) binaryOnError;
- if (onError is void Function(Object)) {
- unaryOnError = onError;
- } else if (onError is void Function(Object, StackTrace)) {
+ if (onError is void Function(Object, StackTrace)) {
binaryOnError = onError;
+ } else if (onError is void Function(Object)) {
+ unaryOnError = onError;
} else {
throw new ArgumentError("onError callback must take either an Object "
"(the error), or both an Object (the error) and a StackTrace.");
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index e7fe7d4..97735c9 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -11641,7 +11641,10 @@
implements ElementList<E>, NodeListWrapper {
final List<Node> _nodeList;
- _FrozenElementList._wrap(this._nodeList);
+ _FrozenElementList._wrap(this._nodeList) {
+ assert(this._nodeList.every((element) => element is E),
+ "Query expects only HTML elements of type $E but found ${this._nodeList.firstWhere((e) => e is! E)}");
+ }
int get length => _nodeList.length;
@@ -13958,8 +13961,6 @@
@JSName('removeAttributeNS')
void _removeAttributeNS(String namespaceURI, String localName) native;
- void requestFullscreen() native;
-
void requestPointerLock() native;
void scroll([options_OR_x, num y]) {
@@ -14052,6 +14053,21 @@
void setPointerCapture(int pointerId) native;
+ @JSName('webkitRequestFullscreen')
+ /**
+ * Displays this element fullscreen.
+ *
+ * ## Other resources
+ *
+ * * [Using the fullscreen
+ * API](http://docs.webplatform.org/wiki/tutorials/using_the_full-screen_api)
+ * tutorial from WebPlatform.org.
+ * * [Fullscreen specification](http://www.w3.org/TR/fullscreen/) from W3C.
+ */
+ @SupportedBrowser(SupportedBrowser.CHROME)
+ @SupportedBrowser(SupportedBrowser.SAFARI)
+ void requestFullscreen() native;
+
// From ChildNode
void after(Object nodes) native;
@@ -25674,7 +25690,8 @@
List<RtcRtpSender> getSenders() native;
- Future getStats() => promiseToFuture<dynamic>(JS("", "#.getStats()", this));
+ Future<RtcStatsReport> getStats() =>
+ promiseToFuture<RtcStatsReport>(JS("", "#.getStats()", this));
void removeStream(MediaStream stream) native;
@@ -27346,8 +27363,6 @@
@Native("SpeechSynthesis")
class SpeechSynthesis extends EventTarget {
- @DomName('SpeechSynthesis.getVoices')
- @DocsEditable()
List<SpeechSynthesisVoice> getVoices() {
List<SpeechSynthesisVoice> voices = _getVoices();
if (voices.length > 0) applyExtension('SpeechSynthesisVoice', voices[0]);
diff --git a/sdk/lib/io/common.dart b/sdk/lib/io/common.dart
index 852a267..10f3c39 100644
--- a/sdk/lib/io/common.dart
+++ b/sdk/lib/io/common.dart
@@ -53,16 +53,14 @@
/** Constant used to indicate that no OS error code is available. */
static const int noErrorCode = -1;
- /**
- * Error message supplied by the operating system. null if no message is
- * associated with the error.
- */
+ /// Error message supplied by the operating system. This may be `null` or
+ /// empty if no message is associated with the error.
final String message;
- /**
- * Error code supplied by the operating system. Will have the value
- * [noErrorCode] if there is no error code associated with the error.
- */
+ /// Error code supplied by the operating system.
+ ///
+ /// Will have the value [OSError.noErrorCode] if there is no error code
+ /// associated with the error.
final int errorCode;
/** Creates an OSError object from a message and an errorCode. */
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index 236aa2b..08995da 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -365,8 +365,8 @@
/**
* Get the last-accessed time of the file.
*
- * Returns the date and time when the file was last accessed, if the
- * information is available.
+ * Returns a `Future<DateTime>` that completes with the date and time when the
+ * file was last accessed, if the information is available.
*
* Throws a [FileSystemException] if the operation fails.
*/
@@ -386,6 +386,8 @@
/**
* Modifies the time the file was last accessed.
*
+ * Returns a [Future] that completes once the operation has completed.
+ *
* Throws a [FileSystemException] if the time cannot be set.
*/
Future setLastAccessed(DateTime time);
@@ -400,8 +402,8 @@
/**
* Get the last-modified time of the file.
*
- * Returns the date and time when the file was last modified, if the
- * information is available.
+ * Returns a `Future<DateTime>` that completes with the date and time when the
+ * file was last modified, if the information is available.
*
* Throws a [FileSystemException] if the operation fails.
*/
@@ -421,6 +423,8 @@
/**
* Modifies the time the file was last modified.
*
+ * Returns a [Future] that completes once the operation has completed.
+ *
* Throws a [FileSystemException] if the time cannot be set.
*/
Future setLastModified(DateTime time);
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index bc7e88a..6131c0e 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -107,32 +107,27 @@
* For example, here's a mini server that listens for 'ws' data
* on a WebSocket:
*
- * runZoned(() {
- * HttpServer.bind('127.0.0.1', 4040).then((server) {
- * server.listen((HttpRequest req) {
- * if (req.uri.path == '/ws') {
- * WebSocketTransformer.upgrade(req).then((socket) {
- * socket.listen(handleMsg);
- * });
- * }
- * });
+ * runZoned(() async {
+ * var server = await HttpServer.bind('127.0.0.1', 4040);
+ * server.listen((HttpRequest req) async {
+ * if (req.uri.path == '/ws') {
+ * var socket = await WebSocketTransformer.upgrade(req);
+ * socket.listen(handleMsg);
+ * }
* });
- * },
- * onError: (e) => print("An error occurred."));
+ * }, onError: (e) => print("An error occurred."));
*
* The client connects to the WebSocket using the `connect()` method
* and a URI that uses the Web Socket protocol.
* The client can write to the WebSocket with the `add()` method.
* For example,
*
- * WebSocket.connect('ws://127.0.0.1:4040/ws').then((socket) {
- * socket.add('Hello, World!');
- * });
+ * var socket = await WebSocket.connect('ws://127.0.0.1:4040/ws');
+ * socket.add('Hello, World!');
*
* Check out the
- * [dartiverse_search](https://github.com/dart-lang/sample-dartiverse-search)
- * sample for a client/server pair that uses
- * WebSockets to communicate.
+ * [websocket_sample](https://github.com/dart-lang/dart-samples/tree/master/html5/web/websockets/basics)
+ * app, which uses WebSockets to communicate with a server.
*
* ## Socket and ServerSocket
*
diff --git a/sdk/lib/math/random.dart b/sdk/lib/math/random.dart
index 47c5582..99906cd 100644
--- a/sdk/lib/math/random.dart
+++ b/sdk/lib/math/random.dart
@@ -4,15 +4,12 @@
part of dart.math;
-/**
- * A generator of random bool, int, or double values.
- *
- * The default implementation supplies a stream of
- * pseudo-random bits that are not suitable for cryptographic purposes.
- *
- * Use the Random.secure() constructor for cryptographic
- * purposes.
- */
+/// A generator of random bool, int, or double values.
+///
+/// The default implementation supplies a stream of pseudo-random bits that are
+/// not suitable for cryptographic purposes.
+///
+/// Use the [Random.secure]() constructor for cryptographic purposes.
abstract class Random {
/**
* Creates a random number generator.
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 750ea6a..60298fa 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -7044,13 +7044,28 @@
Language/Types/Type_Void/syntax_t09: MissingCompileTimeError
LayoutTests/fast/canvas/gradient-addColorStop-with-invalid-color_t01: Pass, RuntimeError
LayoutTests/fast/canvas/rgba-parsing_t01: Pass, RuntimeError
+LayoutTests/fast/files/blob-parts-slice-test_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LayoutTests/fast/files/blob-slice-overflow_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LayoutTests/fast/files/blob-slice-test_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/Duration_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/Duration_A02_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/inDays_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/inHours_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/inMilliseconds_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/inMinutes_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/Duration/inSeconds_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
LibTest/core/Invocation/namedArguments_A01_t01: RuntimeError
LibTest/core/double/isInfinite_A01_t03: CompileTimeError # Larger than 64 bit int
+LibTest/core/double/operator_GE_A01_t02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/double/operator_GT_A01_t02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/double/operator_LE_A01_t02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+LibTest/core/double/operator_LT_A01_t02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
LibTest/core/int/abs_A01_t01: CompileTimeError # Larger than 64 bit int
LibTest/core/int/ceilToDouble_A01_t01: CompileTimeError # Larger than 64 bit int
LibTest/core/int/ceil_A01_t01: CompileTimeError # Larger than 64 bit int
LibTest/core/int/floorToDouble_A01_t01: CompileTimeError # Larger than 64 bit int
LibTest/core/int/floor_A01_t01: CompileTimeError # Larger than 64 bit int
+LibTest/core/int/hashCode_A01_t01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
LibTest/core/int/isInfinite_A01_t01: CompileTimeError # Larger than 64 bit int
LibTest/core/int/isNaN_A01_t01: CompileTimeError # Larger than 64 bit int
LibTest/core/int/isNegative_A01_t01: CompileTimeError # Larger than 64 bit int
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 4f64cd4..7eabb3c 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -73,6 +73,8 @@
Language/Expressions/Constants/no_other_constant_expressions_t11: MissingCompileTimeError
Language/Expressions/Constants/ternary_operator_t02: MissingCompileTimeError
Language/Expressions/Instance_Creation/Const/exception_t01: MissingCompileTimeError
+Language/Generics/syntax_t02: CompileTimeError
+Language/Generics/syntax_t03: CompileTimeError
Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_members_t01: CompileTimeError
Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t01: CompileTimeError
Language/Interfaces/Superinterfaces/Inheritance_and_Overriding/same_name_method_and_getter_t02: CompileTimeError
@@ -1107,8 +1109,6 @@
Language/Types/Static_Types/malformed_type_t04: CompileTimeError
Language/Types/Static_Types/malformed_type_t05: CompileTimeError
Language/Types/Static_Types/malformed_type_t06: CompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t08: Crash
-Language/Types/Type_Declarations/Typedef/self_reference_t09: Crash
Language/Types/Type_Declarations/Typedef/syntax_t01: CompileTimeError
Language/Types/Type_Void/syntax_t08: MissingCompileTimeError
Language/Types/Type_Void/syntax_t09: MissingCompileTimeError
diff --git a/tests/compiler/dart2js/closure/data/instantiation2.dart b/tests/compiler/dart2js/closure/data/instantiation2.dart
index 4fd81d1..dc0c408 100644
--- a/tests/compiler/dart2js/closure/data/instantiation2.dart
+++ b/tests/compiler/dart2js/closure/data/instantiation2.dart
@@ -12,7 +12,8 @@
method() {
return
/*kernel.hasThis*/
- /*!kernel.fields=[this],free=[this],hasThis*/
+ /*strong.fields=[this],free=[this],hasThis*/
+ /*omit.fields=[this],free=[this],hasThis*/
() {
F<S> c = f;
return c;
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart
index 52788fc..5d3b976 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_strong_trust.dart
@@ -6,7 +6,8 @@
@NoInline()
method<T>() {
- /*!strong.*/
+ /*kernel.*/
+ /*omit.*/
/*strong.fields=[T],free=[T]*/
dynamic local() => <T>[];
return local;
diff --git a/tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart b/tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart
index 89fe422..a89aa0e 100644
--- a/tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart
+++ b/tests/compiler/dart2js/closure/data/list_literal_untested_trust.dart
@@ -9,7 +9,8 @@
/*element: A.method:hasThis*/
@NoInline()
method() {
- /*!strong.hasThis*/
+ /*kernel.hasThis*/
+ /*omit.hasThis*/
/*strong.fields=[this],free=[this],hasThis*/
dynamic local() => <T>[];
return local;
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart
index 6cfb9e9..db1a485 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_strong_trust.dart
@@ -6,7 +6,8 @@
@NoInline()
method<T>() {
- /*!strong.*/
+ /*kernel.*/
+ /*omit.*/
/*strong.fields=[T],free=[T]*/
dynamic local() => <T, int>{};
return local;
diff --git a/tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart b/tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart
index 146de88..dfc0fa5 100644
--- a/tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart
+++ b/tests/compiler/dart2js/closure/data/map_literal_untested_trust.dart
@@ -9,7 +9,8 @@
/*element: A.method:hasThis*/
@NoInline()
method() {
- /*!strong.hasThis*/
+ /*kernel.hasThis*/
+ /*omit.hasThis*/
/*strong.fields=[this],free=[this],hasThis*/
dynamic local() => <T, int>{};
return local;
diff --git a/tests/compiler/dart2js/closure/data/test_type.dart b/tests/compiler/dart2js/closure/data/test_type.dart
index 1cd8aef..63cd76b 100644
--- a/tests/compiler/dart2js/closure/data/test_type.dart
+++ b/tests/compiler/dart2js/closure/data/test_type.dart
@@ -38,7 +38,8 @@
class Class3<T> {
/*element: Class3.method3:hasThis*/
method3(dynamic o) {
- /*!strong.fields=[o],free=[o],hasThis*/
+ /*kernel.fields=[o],free=[o],hasThis*/
+ /*omit.fields=[o],free=[o],hasThis*/
/*strong.fields=[o,this],free=[o,this],hasThis*/
T local() => o;
return local;
diff --git a/tests/compiler/dart2js/closure/data/type_annotations.dart b/tests/compiler/dart2js/closure/data/type_annotations.dart
index a891048..cf9d582 100644
--- a/tests/compiler/dart2js/closure/data/type_annotations.dart
+++ b/tests/compiler/dart2js/closure/data/type_annotations.dart
@@ -48,7 +48,8 @@
class Class2<T> {
/*element: Class2.method2:hasThis*/
method2() {
- /*!strong.hasThis*/
+ /*kernel.hasThis*/
+ /*omit.hasThis*/
/*strong.fields=[this],free=[this],hasThis*/
dynamic local(T t) => t;
return local;
@@ -63,7 +64,8 @@
class Class3<T> {
/*element: Class3.method3:hasThis*/
method3(dynamic o) {
- /*!strong.fields=[o],free=[o],hasThis*/
+ /*kernel.fields=[o],free=[o],hasThis*/
+ /*omit.fields=[o],free=[o],hasThis*/
/*strong.fields=[o,this],free=[o,this],hasThis*/
T local() => o;
return local;
@@ -106,7 +108,8 @@
class Class6<T> {
/*element: Class6.method6:hasThis*/
method6() {
- /*!strong.hasThis*/
+ /*kernel.hasThis*/
+ /*omit.hasThis*/
/*strong.fields=[this],free=[this],hasThis*/
dynamic local(T t) {
/*fields=[t],free=[t],hasThis*/
@@ -126,7 +129,8 @@
class Class7<T> {
/*element: Class7.method7:hasThis*/
method7(dynamic o) {
- /*!strong.fields=[o],free=[o],hasThis*/
+ /*kernel.fields=[o],free=[o],hasThis*/
+ /*omit.fields=[o],free=[o],hasThis*/
/*strong.fields=[o,this],free=[o,this],hasThis*/
T local() {
/*fields=[o],free=[o],hasThis*/
diff --git a/tests/compiler/dart2js/codegen/expect_annotations_test.dart b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
index 40bbeb5..d4323ed 100644
--- a/tests/compiler/dart2js/codegen/expect_annotations_test.dart
+++ b/tests/compiler/dart2js/codegen/expect_annotations_test.dart
@@ -14,7 +14,7 @@
import '../inference/type_mask_test_helper.dart';
import '../memory_compiler.dart';
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
'main.dart': r"""
import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/codegen/minify_many_locals_test.dart b/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
index b69a0fd..598996d 100644
--- a/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
+++ b/tests/compiler/dart2js/codegen/minify_many_locals_test.dart
@@ -47,6 +47,6 @@
asyncTest(() async {
// The [numberOfParameters] value is somewhat arbitrary.
print('--test from kernel------------------------------------------------');
- await runTests(numberOfParameters: 2000);
+ await runTests(numberOfParameters: 1000);
});
}
diff --git a/tests/compiler/dart2js/deferred/closures_test.dart b/tests/compiler/dart2js/deferred/closures_test.dart
index f8d7dcc..ea6148b 100644
--- a/tests/compiler/dart2js/deferred/closures_test.dart
+++ b/tests/compiler/dart2js/deferred/closures_test.dart
@@ -36,7 +36,7 @@
}
// Make sure that deferred constants are not inlined into the main hunk.
-const Map sources = const {
+const Map<String, String> sources = const {
"main.dart": """
import 'lib.dart' deferred as lib;
diff --git a/tests/compiler/dart2js/deferred/custom_element_test.dart b/tests/compiler/dart2js/deferred/custom_element_test.dart
index d2e6236..3b39cfd 100644
--- a/tests/compiler/dart2js/deferred/custom_element_test.dart
+++ b/tests/compiler/dart2js/deferred/custom_element_test.dart
@@ -38,7 +38,7 @@
// The main library imports a file defining a custom element.
// Registering this class implicitly causes the constructors to be
// live. Check that this is handled.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
"main.dart": """
import "lib.dart" deferred as a;
import 'dart:html';
diff --git a/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
index e65d0c2..e4d9e05 100644
--- a/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_constants_test.dart
@@ -91,7 +91,7 @@
}
// Make sure that deferred constants are not inlined into the main hunk.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
"main.dart": """
import "dart:async";
diff --git a/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart b/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
index 25c48e3..4c3db2a 100644
--- a/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
+++ b/tests/compiler/dart2js/deferred/dont_inline_deferred_globals_test.dart
@@ -51,7 +51,7 @@
}
// Make sure that deferred constants are not inlined into the main hunk.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
"main.dart": """
import "dart:async";
diff --git a/tests/compiler/dart2js/deferred/emit_type_checks_test.dart b/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
index 6b38487..f016ac2 100644
--- a/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
+++ b/tests/compiler/dart2js/deferred/emit_type_checks_test.dart
@@ -39,7 +39,7 @@
// We force additional runtime type support to be output for A by instantiating
// it with a type argument, and testing for the type. The extra support should
// go to the deferred hunk.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
"main.dart": """
import 'lib.dart' deferred as lib show f, A, instance;
diff --git a/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart b/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
index 4ed0b6d..4e72c4c 100644
--- a/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
+++ b/tests/compiler/dart2js/deferred/follow_constant_dependencies_test.dart
@@ -59,7 +59,7 @@
// lib1 and lib2 also import lib4 deferred, but lib1 uses lib4.bar1 and lib2
// uses lib4.bar2. So two output units should be created for lib4, one for each
// import.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
"main.dart": """
import 'lib.dart' deferred as lib;
diff --git a/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart b/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
index f3aecaa..1a67951 100644
--- a/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
+++ b/tests/compiler/dart2js/deferred/follow_implicit_super_regression_test.dart
@@ -41,7 +41,7 @@
// Make sure that the implicit references to supers are found by the deferred
// loading dependency mechanism.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
"main.dart": """
import "lib.dart" deferred as lib;
diff --git a/tests/compiler/dart2js/deferred/inline_restrictions_test.dart b/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
index 6c53fcf..789baf0 100644
--- a/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
+++ b/tests/compiler/dart2js/deferred/inline_restrictions_test.dart
@@ -64,7 +64,7 @@
// Make sure that empty functions are inlined and that functions from
// main also are inlined (assuming normal heuristics).
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
"main.dart": """
import "dart:async";
diff --git a/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart b/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
index 985ad2a..e953c59 100644
--- a/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
+++ b/tests/compiler/dart2js/deferred/load_graph_segmentation2_test.dart
@@ -38,7 +38,7 @@
// lib1 and lib2 also import lib4 deferred, but lib1 uses lib4.bar1 and lib2
// uses lib4.bar2. So two output units should be created for lib4, one for each
// import.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
"main.dart": """
import "dart:async";
diff --git a/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart b/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
index f20cef3..8c34df7 100644
--- a/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
+++ b/tests/compiler/dart2js/deferred/load_graph_segmentation_test.dart
@@ -82,7 +82,7 @@
// lib1 and lib2 also import lib4 deferred, but lib1 uses lib4.bar1 and lib2
// uses lib4.bar2. So two output units should be created for lib4, one for each
// import.
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
"main.dart": """
import "dart:async";
import 'lib1.dart' deferred as lib1;
diff --git a/tests/compiler/dart2js/deferred/load_mapping_test.dart b/tests/compiler/dart2js/deferred/load_mapping_test.dart
index c5de70f..6efef69 100644
--- a/tests/compiler/dart2js/deferred/load_mapping_test.dart
+++ b/tests/compiler/dart2js/deferred/load_mapping_test.dart
@@ -31,7 +31,7 @@
});
}
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
"main.dart": """
import 'dart:convert' deferred as convert;
import 'lib1.dart' deferred as lib1;
diff --git a/tests/compiler/dart2js/deferred/not_in_main_test.dart b/tests/compiler/dart2js/deferred/not_in_main_test.dart
index a259716..93c9c27 100644
--- a/tests/compiler/dart2js/deferred/not_in_main_test.dart
+++ b/tests/compiler/dart2js/deferred/not_in_main_test.dart
@@ -52,7 +52,7 @@
// lib1 imports lib2 deferred. But mainlib never uses DeferredLibrary.
// Test that this case works.
-const Map TEST1 = const {
+const Map<String, String> TEST1 = const {
"main.dart": """
library mainlib;
@@ -80,7 +80,7 @@
// main indirectly uses class A from shared. A should still be included in the
// main fragment.
-const Map TEST2 = const {
+const Map<String, String> TEST2 = const {
"main.dart": """
import 'def.dart' deferred as def;
import 'shared.dart';
diff --git a/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart b/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
index 67b8c44..6741047 100644
--- a/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
+++ b/tests/compiler/dart2js/deferred/unneeded_part_js_test.dart
@@ -27,7 +27,7 @@
});
}
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
'main.dart': """
class Greeting {
final message;
diff --git a/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart b/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
index 9cfb6cb..39bbc85 100644
--- a/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
+++ b/tests/compiler/dart2js/end_to_end/async_compiler_input_provider_test.dart
@@ -11,7 +11,7 @@
import 'package:compiler/compiler.dart' as compiler;
import 'package:compiler/src/filenames.dart';
-const SOURCES = const {
+const Map<String, String> SOURCES = const {
"/main.dart": """
import "foo.dart";
main() => foo();
diff --git a/tests/compiler/dart2js/end_to_end/exit_code_test.dart b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
index 5b10bee..7d543c7 100644
--- a/tests/compiler/dart2js/end_to_end/exit_code_test.dart
+++ b/tests/compiler/dart2js/end_to_end/exit_code_test.dart
@@ -91,7 +91,8 @@
break;
case 'NoSuchMethodError':
onTest(testMarker, testType);
- null.foo;
+ dynamic n;
+ n.foo;
break;
case '':
onTest(testMarker, testType);
@@ -209,7 +210,8 @@
entry.enableWriteString = false;
- Map _expectedExitCode({bool beforeRun: false, bool fatalWarnings: false}) {
+ Map<String, int> _expectedExitCode(
+ {bool beforeRun: false, bool fatalWarnings: false}) {
if (beforeRun) {
return {
'': 0,
diff --git a/tests/compiler/dart2js/end_to_end/library_env_test.dart b/tests/compiler/dart2js/end_to_end/library_env_test.dart
index 85a4498..fc9b41e 100644
--- a/tests/compiler/dart2js/end_to_end/library_env_test.dart
+++ b/tests/compiler/dart2js/end_to_end/library_env_test.dart
@@ -79,7 +79,7 @@
final platformDir = Uri.parse(Platform.resolvedExecutable).resolve('.');
class CustomCompiler extends CompilerImpl {
- CustomCompiler(options, environment)
+ CustomCompiler(List<String> options, Map<String, String> environment)
: super(
const DummyCompilerInput(),
const NullCompilerOutput(),
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index a077442..15dd004 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -452,6 +452,31 @@
}
return _computedDataForEachFile[file];
}
+
+ String toString() {
+ StringBuffer sb = new StringBuffer();
+ sb.write('MemberAnnotations(');
+ String comma = '';
+ if (_computedDataForEachFile.isNotEmpty &&
+ (_computedDataForEachFile.length > 1 ||
+ _computedDataForEachFile.values.single.isNotEmpty)) {
+ sb.write('data:{');
+ _computedDataForEachFile.forEach((Uri uri, Map<Id, DataType> data) {
+ sb.write(comma);
+ sb.write('$uri:');
+ sb.write(data);
+ comma = ',';
+ });
+ sb.write('}');
+ }
+ if (globalData.isNotEmpty) {
+ sb.write(comma);
+ sb.write('global:');
+ sb.write(globalData);
+ }
+ sb.write(')');
+ return sb.toString();
+ }
}
typedef void Callback();
@@ -501,10 +526,12 @@
int end = entities.length * (shardIndex + 1) ~/ shards;
entities = entities.sublist(start, end);
}
+ int testCount = 0;
for (FileSystemEntity entity in entities) {
String name = entity.uri.pathSegments.last;
if (args.isNotEmpty && !args.contains(name) && !continued) continue;
if (shouldContinue) continued = true;
+ testCount++;
List<String> testOptions = options.toList();
bool strongModeOnlyTest = false;
bool trustTypeAnnotations = false;
@@ -652,6 +679,7 @@
}
}
Expect.isFalse(hasFailures, 'Errors found.');
+ Expect.isTrue(testCount > 0, "No files were tested.");
}
final Set<String> userFiles = new Set<String>();
diff --git a/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart b/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart
new file mode 100644
index 0000000..8b629ec
--- /dev/null
+++ b/tests/compiler/dart2js/inference/inference_data/called_in_loop.dart
@@ -0,0 +1,117 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+ staticCalledInForLoop();
+ staticCalledInForInLoop();
+ staticCalledInWhileLoop();
+ staticCalledInDoLoop();
+ instanceCalledInForLoop();
+ staticCalledIndirectlyInForLoop();
+}
+
+/*element: _staticCalledInForLoop:loop*/
+_staticCalledInForLoop() {}
+
+/*element: _staticNotCalledInForLoop:*/
+_staticNotCalledInForLoop() {}
+
+/*element: staticCalledInForLoop:*/
+staticCalledInForLoop() {
+ _staticNotCalledInForLoop();
+ for (int i = 0; i < 10; i++) {
+ _staticCalledInForLoop();
+ }
+ _staticNotCalledInForLoop();
+}
+
+/*element: _staticCalledInForInLoop:loop*/
+_staticCalledInForInLoop() {}
+
+/*element: _staticNotCalledInForInLoop:*/
+_staticNotCalledInForInLoop() {}
+
+/*element: staticCalledInForInLoop:*/
+staticCalledInForInLoop() {
+ _staticNotCalledInForInLoop();
+ // ignore: unused_local_variable
+ for (int i in [1, 2, 3]) {
+ _staticCalledInForInLoop();
+ }
+ _staticNotCalledInForInLoop();
+}
+
+/*element: _staticCalledInWhileLoop:loop*/
+_staticCalledInWhileLoop() {}
+
+/*element: _staticNotCalledInWhileLoop:*/
+_staticNotCalledInWhileLoop() {}
+
+/*element: staticCalledInWhileLoop:*/
+staticCalledInWhileLoop() {
+ int i = 0;
+ _staticNotCalledInWhileLoop();
+ while (i < 10) {
+ _staticCalledInWhileLoop();
+ i++;
+ }
+ _staticNotCalledInWhileLoop();
+}
+
+/*element: _staticCalledInDoLoop:loop*/
+_staticCalledInDoLoop() {}
+
+/*element: _staticNotCalledInDoLoop:*/
+_staticNotCalledInDoLoop() {}
+
+/*element: staticCalledInDoLoop:*/
+staticCalledInDoLoop() {
+ int i = 0;
+ _staticNotCalledInDoLoop();
+ do {
+ _staticCalledInDoLoop();
+ i++;
+ } while (i <= 10);
+ _staticNotCalledInDoLoop();
+}
+
+class Class {
+ /*element: Class.constructorCalledInForLoop:loop*/
+ Class.constructorCalledInForLoop();
+
+ /*element: Class.constructorNotCalledInForLoop:*/
+ Class.constructorNotCalledInForLoop();
+
+ // TODO(johnniwinther): Should we track instance calls in loops?
+ /*element: Class.instanceCalledInForLoop:*/
+ instanceCalledInForLoop() {}
+
+ /*element: Class.instanceNotCalledInForLoop:*/
+ instanceNotCalledInForLoop() {}
+}
+
+/*element: instanceCalledInForLoop:*/
+instanceCalledInForLoop() {
+ var c = new Class.constructorNotCalledInForLoop();
+ c.instanceNotCalledInForLoop();
+ for (int i = 0; i < 10; i++) {
+ new Class.constructorCalledInForLoop();
+ c.instanceCalledInForLoop();
+ }
+ c.instanceNotCalledInForLoop();
+}
+
+// TODO(johnniwinther): Should we track indirect calls in loops?
+/*element: _staticCalledIndirectlyInForLoop:*/
+_staticCalledIndirectlyInForLoop() {}
+
+/*element: _staticCalledIndirectlyInForLoopHelper:loop*/
+_staticCalledIndirectlyInForLoopHelper() => _staticCalledIndirectlyInForLoop();
+
+/*element: staticCalledIndirectlyInForLoop:*/
+staticCalledIndirectlyInForLoop() {
+ for (int i = 0; i < 10; i++) {
+ _staticCalledIndirectlyInForLoopHelper();
+ }
+}
diff --git a/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart b/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart
new file mode 100644
index 0000000..4d24402
--- /dev/null
+++ b/tests/compiler/dart2js/inference/inference_data/cannot_throw.dart
@@ -0,0 +1,27 @@
+// 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.
+
+// ignore: import_internal_library
+import 'dart:_js_helper';
+
+main() {
+ noThrows();
+ noInline();
+ throws();
+}
+
+// We trust the annotation.
+/*element: noThrows:no-throw*/
+@NoThrows()
+@NoInline() // Required for the @NoThrows() annotation.
+noThrows() => throw '';
+
+// Check that the @NoInline() annotation has no impact on its own.
+/*element: noInline:*/
+@NoInline()
+noInline() {}
+
+// TODO(johnniwinther): Should we infer this?
+/*element: throws:*/
+throws() => 0;
diff --git a/tests/compiler/dart2js/inference/inference_data/function_apply.dart b/tests/compiler/dart2js/inference/inference_data/function_apply.dart
new file mode 100644
index 0000000..b02d84a
--- /dev/null
+++ b/tests/compiler/dart2js/inference/inference_data/function_apply.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+ directCall();
+ indirectCall();
+ instanceTearOff();
+ localCall();
+ instantiatedCall();
+}
+
+/*element: _directCall:apply*/
+_directCall() {}
+
+/*element: directCall:*/
+void directCall() {
+ Function.apply(_directCall, []);
+}
+
+/*element: _indirectCall:apply*/
+_indirectCall() {}
+
+/*element: _indirectCallHelper:*/
+_indirectCallHelper(f) => Function.apply(f, []);
+
+/*element: indirectCall:*/
+void indirectCall() {
+ _indirectCallHelper(_indirectCall);
+}
+
+/*element: Class.:*/
+class Class {
+ /*element: Class.instanceTearOff1:apply*/
+ instanceTearOff1() {}
+
+ /*element: Class.instanceTearOff2:*/
+ instanceTearOff2() {}
+}
+
+/*element: _instanceTearOffHelper:*/
+_instanceTearOffHelper(f) => Function.apply(f, []);
+
+instanceTearOff() {
+ var c = new Class();
+ _instanceTearOffHelper(c.instanceTearOff1);
+ return c.instanceTearOff2;
+}
+
+localCall() {
+ /*apply*/ local1() {}
+ local2() {}
+ local3() {}
+
+ Function.apply(local1, []);
+ local2();
+ return local3;
+}
+
+instantiatedCall() {
+ /*apply*/ local1<T>(T t) {}
+ local2<T>(T t) {}
+ local3<T>(T t) {}
+
+ Function(int) f1 = local1;
+ Function(int) f2 = local2;
+ Function(int) f3 = local3;
+
+ Function.apply(f1, [0]);
+ f2(0);
+ return f3;
+}
diff --git a/tests/compiler/dart2js/inference/inference_data_test.dart b/tests/compiler/dart2js/inference/inference_data_test.dart
new file mode 100644
index 0000000..ac4a410
--- /dev/null
+++ b/tests/compiler/dart2js/inference/inference_data_test.dart
@@ -0,0 +1,104 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/closure.dart';
+import 'package:compiler/src/common.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/js_backend/inferred_data.dart';
+import 'package:compiler/src/kernel/element_map.dart';
+import 'package:compiler/src/kernel/kernel_backend_strategy.dart';
+import 'package:compiler/src/world.dart';
+import 'package:kernel/ast.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+
+main(List<String> args) {
+ asyncTest(() async {
+ Directory dataDir =
+ new Directory.fromUri(Platform.script.resolve('inference_data'));
+ await checkTests(dataDir, computeMemberIrInferredData,
+ args: args, options: [stopAfterTypeInference]);
+ });
+}
+
+class Tags {
+ static const String functionApply = 'apply';
+ static const String calledInLoop = 'loop';
+ static const String cannotThrow = 'no-throw';
+}
+
+abstract class ComputeValueMixin<T> {
+ InferredData get inferredData;
+
+ String getMemberValue(MemberEntity member) {
+ Features features = new Features();
+ if (member is FunctionEntity) {
+ if (inferredData.getMightBePassedToApply(member)) {
+ features.add(Tags.functionApply);
+ }
+ if (inferredData.getCannotThrow(member)) {
+ features.add(Tags.cannotThrow);
+ }
+ }
+ if (inferredData.isCalledInLoop(member)) {
+ features.add(Tags.calledInLoop);
+ }
+ return features.getText();
+ }
+}
+
+/// Compute side effects data for [member] from kernel based inference.
+///
+/// Fills [actualMap] with the data.
+void computeMemberIrInferredData(
+ Compiler compiler, MemberEntity member, Map<Id, ActualData> actualMap,
+ {bool verbose: false}) {
+ KernelBackendStrategy backendStrategy = compiler.backendStrategy;
+ KernelToElementMapForBuilding elementMap = backendStrategy.elementMap;
+ MemberDefinition definition = elementMap.getMemberDefinition(member);
+ new InferredDataIrComputer(
+ compiler.reporter,
+ actualMap,
+ elementMap,
+ compiler.backendClosedWorldForTesting,
+ backendStrategy.closureDataLookup as ClosureDataLookup<ir.Node>,
+ compiler.globalInference.inferredData)
+ .run(definition.node);
+}
+
+/// AST visitor for computing side effects data for a member.
+class InferredDataIrComputer extends IrDataExtractor
+ with ComputeValueMixin<ir.Node> {
+ final JClosedWorld closedWorld;
+ final KernelToElementMapForBuilding _elementMap;
+ final ClosureDataLookup<ir.Node> _closureDataLookup;
+ final InferredData inferredData;
+
+ InferredDataIrComputer(
+ DiagnosticReporter reporter,
+ Map<Id, ActualData> actualMap,
+ this._elementMap,
+ this.closedWorld,
+ this._closureDataLookup,
+ this.inferredData)
+ : super(reporter, actualMap);
+
+ @override
+ String computeMemberValue(Id id, ir.Member node) {
+ return getMemberValue(_elementMap.getMember(node));
+ }
+
+ @override
+ String computeNodeValue(Id id, ir.TreeNode node) {
+ if (node is ir.FunctionExpression || node is ir.FunctionDeclaration) {
+ ClosureRepresentationInfo info = _closureDataLookup.getClosureInfo(node);
+ return getMemberValue(info.callMethod);
+ }
+ return null;
+ }
+}
diff --git a/tests/compiler/dart2js/inlining/meta_annotations_test.dart b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
index 9ee5314..a820afe 100644
--- a/tests/compiler/dart2js/inlining/meta_annotations_test.dart
+++ b/tests/compiler/dart2js/inlining/meta_annotations_test.dart
@@ -11,7 +11,7 @@
import 'package:compiler/src/world.dart' show KClosedWorld;
import '../memory_compiler.dart';
-const Map MEMORY_SOURCE_FILES = const {
+const Map<String, String> MEMORY_SOURCE_FILES = const {
'main.dart': r"""
import 'package:meta/dart2js.dart';
diff --git a/tests/compiler/dart2js/instantiated_classes_test.dart b/tests/compiler/dart2js/instantiated_classes_test.dart
index 4c1aab1..b51bee2 100644
--- a/tests/compiler/dart2js/instantiated_classes_test.dart
+++ b/tests/compiler/dart2js/instantiated_classes_test.dart
@@ -26,7 +26,9 @@
LibraryEntity mainLibrary =
env.compiler.frontendStrategy.elementEnvironment.mainLibrary;
Iterable<ClassEntity> expectedClasses =
- directlyInstantiatedClasses.map(env.getElement);
+ directlyInstantiatedClasses.map((String name) {
+ return env.getElement(name);
+ });
Iterable<ClassEntity> actualClasses = env
.compiler.resolutionWorldBuilder.directlyInstantiatedClasses
.where((c) => c.library == mainLibrary);
diff --git a/tests/compiler/dart2js/jsinterop/world_test.dart b/tests/compiler/dart2js/jsinterop/world_test.dart
index cb9cf2c..25377d5 100644
--- a/tests/compiler/dart2js/jsinterop/world_test.dart
+++ b/tests/compiler/dart2js/jsinterop/world_test.dart
@@ -11,6 +11,7 @@
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/entities.dart' show ClassEntity;
import 'package:compiler/src/elements/names.dart';
+import 'package:compiler/src/universe/class_hierarchy.dart';
import 'package:compiler/src/universe/selector.dart';
import 'package:compiler/src/world.dart';
import '../helpers/element_lookup.dart';
diff --git a/tests/compiler/dart2js/model/class_set_test.dart b/tests/compiler/dart2js/model/class_set_test.dart
index f91acf6..833334f 100644
--- a/tests/compiler/dart2js/model/class_set_test.dart
+++ b/tests/compiler/dart2js/model/class_set_test.dart
@@ -68,7 +68,7 @@
void checkClass(ClassEntity cls,
{bool directlyInstantiated: false, bool indirectlyInstantiated: false}) {
- ClassHierarchyNode node = world.getClassHierarchyNode(cls);
+ ClassHierarchyNode node = world.classHierarchy.getClassHierarchyNode(cls);
Expect.isNotNull(node, "Expected ClassHierarchyNode for $cls.");
Expect.equals(
directlyInstantiated || indirectlyInstantiated,
@@ -139,7 +139,7 @@
}
iterator = new ClassHierarchyNodeIterable(
- world.getClassHierarchyNode(G), ClassHierarchyNode.ALL)
+ world.classHierarchy.getClassHierarchyNode(G), ClassHierarchyNode.ALL)
.iterator;
checkState(G, currentNode: null, stack: null);
Expect.isNull(iterator.current);
@@ -151,7 +151,7 @@
Expect.isNull(iterator.current);
iterator = new ClassHierarchyNodeIterable(
- world.getClassHierarchyNode(G), ClassHierarchyNode.ALL,
+ world.classHierarchy.getClassHierarchyNode(G), ClassHierarchyNode.ALL,
includeRoot: false)
.iterator;
checkState(G, currentNode: null, stack: null);
@@ -161,7 +161,7 @@
Expect.isNull(iterator.current);
iterator = new ClassHierarchyNodeIterable(
- world.getClassHierarchyNode(C), ClassHierarchyNode.ALL)
+ world.classHierarchy.getClassHierarchyNode(C), ClassHierarchyNode.ALL)
.iterator;
checkState(C, currentNode: null, stack: null);
Expect.isNull(iterator.current);
@@ -182,7 +182,7 @@
Expect.isNull(iterator.current);
iterator = new ClassHierarchyNodeIterable(
- world.getClassHierarchyNode(D), ClassHierarchyNode.ALL)
+ world.classHierarchy.getClassHierarchyNode(D), ClassHierarchyNode.ALL)
.iterator;
checkState(D, currentNode: null, stack: null);
Expect.isNull(iterator.current);
@@ -194,7 +194,7 @@
Expect.isNull(iterator.current);
iterator = new ClassHierarchyNodeIterable(
- world.getClassHierarchyNode(B), ClassHierarchyNode.ALL)
+ world.classHierarchy.getClassHierarchyNode(B), ClassHierarchyNode.ALL)
.iterator;
checkState(B, currentNode: null, stack: null);
Expect.isNull(iterator.current);
@@ -209,7 +209,7 @@
Expect.isNull(iterator.current);
iterator = new ClassHierarchyNodeIterable(
- world.getClassHierarchyNode(B), ClassHierarchyNode.ALL,
+ world.classHierarchy.getClassHierarchyNode(B), ClassHierarchyNode.ALL,
includeRoot: false)
.iterator;
checkState(B, currentNode: null, stack: null);
@@ -222,7 +222,7 @@
Expect.isNull(iterator.current);
iterator = new ClassHierarchyNodeIterable(
- world.getClassHierarchyNode(B),
+ world.classHierarchy.getClassHierarchyNode(B),
new EnumSet<Instantiation>.fromValues(<Instantiation>[
Instantiation.DIRECTLY_INSTANTIATED,
Instantiation.UNINSTANTIATED
@@ -237,7 +237,7 @@
Expect.isNull(iterator.current);
iterator = new ClassHierarchyNodeIterable(
- world.getClassHierarchyNode(A), ClassHierarchyNode.ALL)
+ world.classHierarchy.getClassHierarchyNode(A), ClassHierarchyNode.ALL)
.iterator;
checkState(A, currentNode: null, stack: null);
Expect.isNull(iterator.current);
@@ -267,7 +267,7 @@
Expect.isNull(iterator.current);
iterator = new ClassHierarchyNodeIterable(
- world.getClassHierarchyNode(A), ClassHierarchyNode.ALL,
+ world.classHierarchy.getClassHierarchyNode(A), ClassHierarchyNode.ALL,
includeRoot: false)
.iterator;
checkState(A, currentNode: null, stack: null);
@@ -295,7 +295,7 @@
Expect.isNull(iterator.current);
iterator = new ClassHierarchyNodeIterable(
- world.getClassHierarchyNode(A),
+ world.classHierarchy.getClassHierarchyNode(A),
new EnumSet<Instantiation>.fromValues(<Instantiation>[
Instantiation.DIRECTLY_INSTANTIATED,
Instantiation.UNINSTANTIATED
@@ -325,7 +325,7 @@
Expect.isNull(iterator.current);
iterator = new ClassHierarchyNodeIterable(
- world.getClassHierarchyNode(A),
+ world.classHierarchy.getClassHierarchyNode(A),
new EnumSet<Instantiation>.fromValues(<Instantiation>[
Instantiation.DIRECTLY_INSTANTIATED,
Instantiation.UNINSTANTIATED
@@ -400,7 +400,7 @@
ClassEntity X = env.getClass("X");
void checkForEachSubclass(ClassEntity cls, List<ClassEntity> expected) {
- ClassSet classSet = world.getClassSet(cls);
+ ClassSet classSet = world.classHierarchy.getClassSet(cls);
List<ClassEntity> visited = <ClassEntity>[];
classSet.forEachSubclass((cls) {
visited.add(cls);
@@ -437,7 +437,7 @@
checkForEachSubclass(X, [X]);
void checkForEachSubtype(ClassEntity cls, List<ClassEntity> expected) {
- ClassSet classSet = world.getClassSet(cls);
+ ClassSet classSet = world.classHierarchy.getClassSet(cls);
List<ClassEntity> visited = <ClassEntity>[];
classSet.forEachSubtype((cls) {
visited.add(cls);
@@ -482,7 +482,7 @@
mask = ClassHierarchyNode.ALL;
}
- ClassSet classSet = world.getClassSet(cls);
+ ClassSet classSet = world.classHierarchy.getClassSet(cls);
List<ClassEntity> visited = <ClassEntity>[];
IterationStep visit(_cls) {
@@ -539,7 +539,7 @@
void checkAny(ClassEntity cls, List<ClassEntity> expected,
{ClassEntity find, bool expectedResult, bool anySubtype: false}) {
- ClassSet classSet = world.getClassSet(cls);
+ ClassSet classSet = world.classHierarchy.getClassSet(cls);
List<ClassEntity> visited = <ClassEntity>[];
bool visit(cls) {
diff --git a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
index 885bb45..d5af387 100644
--- a/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
+++ b/tests/compiler/dart2js/model/constant_expression_evaluate_test.dart
@@ -187,20 +187,23 @@
'MapConstant(<int, int>{IntConstant(0): IntConstant(2)})',
expectedErrors: MessageKind.EQUAL_MAP_ENTRY_KEY),
const ConstantData(
- 'const bool.fromEnvironment("foo", defaultValue: false)', const {
- const {}: 'BoolConstant(false)',
- const {'foo': 'true'}: 'BoolConstant(true)'
- }),
+ 'const bool.fromEnvironment("foo", defaultValue: false)',
+ const <Map<String, String>, String>{
+ const {}: 'BoolConstant(false)',
+ const {'foo': 'true'}: 'BoolConstant(true)'
+ }),
const ConstantData(
- 'const int.fromEnvironment("foo", defaultValue: 42)', const {
- const {}: 'IntConstant(42)',
- const {'foo': '87'}: 'IntConstant(87)'
- }),
+ 'const int.fromEnvironment("foo", defaultValue: 42)',
+ const <Map<String, String>, String>{
+ const {}: 'IntConstant(42)',
+ const {'foo': '87'}: 'IntConstant(87)'
+ }),
const ConstantData(
- 'const String.fromEnvironment("foo", defaultValue: "bar")', const {
- const {}: 'StringConstant("bar")',
- const {'foo': 'foo'}: 'StringConstant("foo")'
- }),
+ 'const String.fromEnvironment("foo", defaultValue: "bar")',
+ const <Map<String, String>, String>{
+ const {}: 'StringConstant("bar")',
+ const {'foo': 'foo'}: 'StringConstant("foo")'
+ }),
]),
const TestData('env', '''
const a = const bool.fromEnvironment("foo", defaultValue: true);
@@ -249,7 +252,8 @@
'const C.named(87)',
'ConstructedConstant(C(field1=IntConstant(87),'
'field2=IntConstant(87)))'),
- const ConstantData('const C(field1: a, field2: b)', const {
+ const ConstantData(
+ 'const C(field1: a, field2: b)', const <Map<String, String>, String>{
const {}: 'ConstructedConstant(C(field1=BoolConstant(true),'
'field2=IntConstant(42)))',
const {'foo': 'false', 'bar': '87'}:
@@ -303,12 +307,12 @@
const B(a) : super(a, a * 2);
}
''', const [
- const ConstantData('const A(c, d)', const {
+ const ConstantData('const A(c, d)', const <Map<String, String>, String>{
const {}: 'ConstructedConstant(A(field=IntConstant(15)))',
const {'foo': '7', 'bar': '11'}:
'ConstructedConstant(A(field=IntConstant(18)))',
}),
- const ConstantData('const B(d)', const {
+ const ConstantData('const B(d)', const <Map<String, String>, String>{
const {}: 'ConstructedConstant(B(field=IntConstant(30)))',
const {'bar': '42'}: 'ConstructedConstant(B(field=IntConstant(126)))',
}),
@@ -616,7 +620,9 @@
var expectedResults =
strongMode ? data.strongModeResults : data.expectedResults;
if (expectedResults is String) {
- expectedResults = {const <String, String>{}: expectedResults};
+ expectedResults = <Map<String, String>, String>{
+ const <String, String>{}: expectedResults
+ };
}
expectedResults.forEach((Map<String, String> env, String expectedText) {
MemoryEnvironment environment =
diff --git a/tests/compiler/dart2js/model/subtypeset_test.dart b/tests/compiler/dart2js/model/subtypeset_test.dart
index fd5e963..fac2f27 100644
--- a/tests/compiler/dart2js/model/subtypeset_test.dart
+++ b/tests/compiler/dart2js/model/subtypeset_test.dart
@@ -67,7 +67,7 @@
void checkClass(ClassEntity cls, List<ClassEntity> expectedSubtypes,
{bool checkSubset: false}) {
- ClassSet node = world.getClassSet(cls);
+ ClassSet node = world.classHierarchy.getClassSet(cls);
Set<ClassEntity> actualSubtypes = node.subtypes().toSet();
if (checkSubset) {
for (ClassEntity subtype in expectedSubtypes) {
diff --git a/tests/compiler/dart2js/model/type_substitution_test.dart b/tests/compiler/dart2js/model/type_substitution_test.dart
index a00a701..2844a00 100644
--- a/tests/compiler/dart2js/model/type_substitution_test.dart
+++ b/tests/compiler/dart2js/model/type_substitution_test.dart
@@ -108,10 +108,8 @@
ElementEnvironment elementEnvironment,
List<DartType> arguments,
List<DartType> parameters,
- String name1,
- String name2) {
- DartType type1 = getType(elementEnvironment, name1);
- DartType type2 = getType(elementEnvironment, name2);
+ DartType type1,
+ DartType type2) {
DartType subst = type1.subst(arguments, parameters);
Expect.equals(
type2, subst, "$type1.subst($arguments,$parameters)=$subst != $type2");
@@ -119,57 +117,7 @@
testTypeSubstitution() async {
var env = await TypeEnvironment.create(r"""
- typedef void Typedef1<X,Y>(X x1, Y y2);
- typedef void Typedef2<Z>(Z z1);
-
- class Class<T,S> {
- void void1() {}
- void void2() {}
- void dynamic1(dynamic a) {}
- void dynamic2(dynamic b) {}
- void int1(int a) {}
- void int2(int a) {}
- void String1(String a) {}
- void String2(String a) {}
- void ListInt1(List<int> a) {}
- void ListInt2(List<int> b) {}
- void ListT1(List<T> a) {}
- void ListT2(List<int> b) {}
- void ListS1(List<S> a) {}
- void ListS2(List<String> b) {}
- void ListListT1(List<List<T>> a) {}
- void ListListT2(List<List<int>> b) {}
- void ListRaw1(List a) {}
- void ListRaw2(List b) {}
- void ListDynamic1(List<dynamic> a) {}
- void ListDynamic2(List<dynamic> b) {}
- void MapIntString1(Map<T,S> a) {}
- void MapIntString2(Map<int,String> b) {}
- void MapTString1(Map<T,String> a) {}
- void MapTString2(Map<int,String> b) {}
- void MapDynamicString1(Map<dynamic,String> a) {}
- void MapDynamicString2(Map<dynamic,String> b) {}
- void TypeVarT1(T t1) {}
- void TypeVarT2(int t2) {}
- void TypeVarS1(S s1) {}
- void TypeVarS2(String s2) {}
- void Function1a(int a(String s1)) {}
- void Function2a(int b(String s2)) {}
- void Function1b(void a(T t1, S s1)) {}
- void Function2b(void b(int t2, String s2)) {}
- void Function1c(void a(dynamic t1, dynamic s1)) {}
- void Function2c(void b(dynamic t2, dynamic s2)) {}
- void Typedef1a(Typedef1<T,S> a) {}
- void Typedef2a(Typedef1<int,String> b) {}
- void Typedef1b(Typedef1<dynamic,dynamic> a) {}
- void Typedef2b(Typedef1<dynamic,dynamic> b) {}
- void Typedef1c(Typedef1 a) {}
- void Typedef2c(Typedef1 b) {}
- void Typedef1d(Typedef2<T> a) {}
- void Typedef2d(Typedef2<int> b) {}
- void Typedef1e(Typedef2<S> a) {}
- void Typedef2e(Typedef2<String> b) {}
- }
+ class Class<T,S> {}
""");
InterfaceType Class_T_S = env["Class"];
Expect.isNotNull(Class_T_S);
@@ -184,82 +132,89 @@
Expect.isNotNull(S);
Expect.isTrue(S.isTypeVariable);
- DartType intType = env['int']; //getType(compiler, "int1");
+ DartType intType = env['int'];
Expect.isNotNull(intType);
Expect.isTrue(intType.isInterfaceType);
- DartType StringType = env['String']; //getType(compiler, "String1");
+ DartType StringType = env['String'];
Expect.isNotNull(StringType);
Expect.isTrue(StringType.isInterfaceType);
+ ClassEntity ListClass = env.getElement('List');
+ ClassEntity MapClass = env.getElement('Map');
+
List<DartType> parameters = <DartType>[T, S];
List<DartType> arguments = <DartType>[intType, StringType];
- // TODO(johnniwinther): Create types directly from strings to improve
- // test readability.
-
- testSubstitution(
- env.elementEnvironment, arguments, parameters, "void1", "void2");
- testSubstitution(
- env.elementEnvironment, arguments, parameters, "dynamic1", "dynamic2");
- testSubstitution(
- env.elementEnvironment, arguments, parameters, "int1", "int2");
- testSubstitution(
- env.elementEnvironment, arguments, parameters, "String1", "String2");
- testSubstitution(
- env.elementEnvironment, arguments, parameters, "ListInt1", "ListInt2");
- testSubstitution(
- env.elementEnvironment, arguments, parameters, "ListT1", "ListT2");
- testSubstitution(
- env.elementEnvironment, arguments, parameters, "ListS1", "ListS2");
- testSubstitution(env.elementEnvironment, arguments, parameters, "ListListT1",
- "ListListT2");
- testSubstitution(
- env.elementEnvironment, arguments, parameters, "ListRaw1", "ListRaw2");
testSubstitution(env.elementEnvironment, arguments, parameters,
- "ListDynamic1", "ListDynamic2");
+ const VoidType(), const VoidType());
testSubstitution(env.elementEnvironment, arguments, parameters,
- "MapIntString1", "MapIntString2");
- testSubstitution(env.elementEnvironment, arguments, parameters, "MapTString1",
- "MapTString2");
+ const DynamicType(), const DynamicType());
+ testSubstitution(
+ env.elementEnvironment, arguments, parameters, intType, intType);
+ testSubstitution(
+ env.elementEnvironment, arguments, parameters, StringType, StringType);
testSubstitution(env.elementEnvironment, arguments, parameters,
- "MapDynamicString1", "MapDynamicString2");
+ instantiate(ListClass, [intType]), instantiate(ListClass, [intType]));
+ testSubstitution(env.elementEnvironment, arguments, parameters,
+ instantiate(ListClass, [T]), instantiate(ListClass, [intType]));
+ testSubstitution(env.elementEnvironment, arguments, parameters,
+ instantiate(ListClass, [S]), instantiate(ListClass, [StringType]));
testSubstitution(
- env.elementEnvironment, arguments, parameters, "TypeVarT1", "TypeVarT2");
+ env.elementEnvironment,
+ arguments,
+ parameters,
+ instantiate(ListClass, [
+ instantiate(ListClass, [T])
+ ]),
+ instantiate(ListClass, [
+ instantiate(ListClass, [intType])
+ ]));
testSubstitution(
- env.elementEnvironment, arguments, parameters, "TypeVarS1", "TypeVarS2");
- testSubstitution(env.elementEnvironment, arguments, parameters, "Function1a",
- "Function2a");
- testSubstitution(env.elementEnvironment, arguments, parameters, "Function1b",
- "Function2b");
- testSubstitution(env.elementEnvironment, arguments, parameters, "Function1c",
- "Function2c");
+ env.elementEnvironment,
+ arguments,
+ parameters,
+ instantiate(ListClass, [const DynamicType()]),
+ instantiate(ListClass, [const DynamicType()]));
testSubstitution(
- env.elementEnvironment, arguments, parameters, "Typedef1a", "Typedef2a");
+ env.elementEnvironment,
+ arguments,
+ parameters,
+ instantiate(MapClass, [intType, StringType]),
+ instantiate(MapClass, [intType, StringType]));
testSubstitution(
- env.elementEnvironment, arguments, parameters, "Typedef1b", "Typedef2b");
+ env.elementEnvironment,
+ arguments,
+ parameters,
+ instantiate(MapClass, [T, StringType]),
+ instantiate(MapClass, [intType, StringType]));
testSubstitution(
- env.elementEnvironment, arguments, parameters, "Typedef1c", "Typedef2c");
+ env.elementEnvironment,
+ arguments,
+ parameters,
+ instantiate(MapClass, [const DynamicType(), StringType]),
+ instantiate(MapClass, [const DynamicType(), StringType]));
+ testSubstitution(env.elementEnvironment, arguments, parameters, T, intType);
testSubstitution(
- env.elementEnvironment, arguments, parameters, "Typedef1d", "Typedef2d");
+ env.elementEnvironment, arguments, parameters, S, StringType);
testSubstitution(
- env.elementEnvironment, arguments, parameters, "Typedef1e", "Typedef2e");
-
- // Substitution in unalias.
- DartType Typedef2_int_String = getType(env.elementEnvironment, "Typedef2a");
- Expect.isNotNull(Typedef2_int_String);
- DartType Function_int_String = getType(env.elementEnvironment, "Function2b");
- Expect.isNotNull(Function_int_String);
- DartType unalias1 = Typedef2_int_String.unaliased;
- Expect.equals(Function_int_String, unalias1,
- '$Typedef2_int_String.unalias=$unalias1 != $Function_int_String');
-
- DartType Typedef1 = getType(env.elementEnvironment, "Typedef1c");
- Expect.isNotNull(Typedef1);
- DartType Function_dynamic_dynamic =
- getType(env.elementEnvironment, "Function1c");
- Expect.isNotNull(Function_dynamic_dynamic);
- DartType unalias2 = Typedef1.unaliased;
- Expect.equals(Function_dynamic_dynamic, unalias2,
- '$Typedef1.unalias=$unalias2 != $Function_dynamic_dynamic');
+ env.elementEnvironment,
+ arguments,
+ parameters,
+ new FunctionType(intType, [StringType], [], [], [], []),
+ new FunctionType(intType, [StringType], [], [], [], []));
+ testSubstitution(
+ env.elementEnvironment,
+ arguments,
+ parameters,
+ new FunctionType(const VoidType(), [T, S], [], [], [], []),
+ new FunctionType(
+ const VoidType(), [intType, StringType], [], [], [], []));
+ testSubstitution(
+ env.elementEnvironment,
+ arguments,
+ parameters,
+ new FunctionType(const VoidType(), [const DynamicType()], [], [], [], []),
+ new FunctionType(
+ const VoidType(), [const DynamicType()], [], [], [], []));
}
diff --git a/tests/compiler/dart2js/model/world_test.dart b/tests/compiler/dart2js/model/world_test.dart
index 3abdd5d..78e93f1 100644
--- a/tests/compiler/dart2js/model/world_test.dart
+++ b/tests/compiler/dart2js/model/world_test.dart
@@ -9,8 +9,9 @@
import 'package:compiler/src/common/names.dart';
import 'package:compiler/src/common_elements.dart';
import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/universe/class_hierarchy.dart';
import 'package:compiler/src/universe/class_set.dart';
-import 'package:compiler/src/world.dart' show ClassQuery, JClosedWorld;
+import 'package:compiler/src/world.dart' show JClosedWorld;
import '../type_test_helper.dart';
void main() {
@@ -550,65 +551,106 @@
ClassEntity A = env.getElement("A");
ClassEntity B = env.getElement("B");
ClassEntity C = env.getElement("C");
- ClassEntity D = env.getElement("D");
ClassEntity F = env.getElement("F");
ClassEntity G = env.getElement("G");
- ClassEntity H = env.getElement("H");
ClassEntity I = env.getElement("I");
ClassEntity J = env.getElement("J");
void check(ClassEntity cls1, ClassQuery query1, ClassEntity cls2,
- ClassQuery query2, List<ClassEntity> expectedResult) {
- Iterable<ClassEntity> result1 =
- closedWorld.commonSubclasses(cls1, query1, cls2, query2);
- Iterable<ClassEntity> result2 =
- closedWorld.commonSubclasses(cls2, query2, cls1, query1);
- Expect.setEquals(
- result1,
- result2,
+ ClassQuery query2, SubclassResult expectedResult) {
+ SubclassResult result1 =
+ closedWorld.classHierarchy.commonSubclasses(cls1, query1, cls2, query2);
+ SubclassResult result2 =
+ closedWorld.classHierarchy.commonSubclasses(cls2, query2, cls1, query1);
+ Expect.equals(
+ result1.query,
+ result2.query,
"Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
"\n a vs b: $result1\n b vs a: $result2");
Expect.setEquals(
- expectedResult,
- result1,
+ result1.classes,
+ result2.classes,
+ "Asymmetric results for ($cls1,$query1) vs ($cls2,$query2):"
+ "\n a vs b: $result1\n b vs a: $result2");
+ Expect.equals(
+ expectedResult.query,
+ result1.query,
+ "Unexpected results for ($cls1,$query1) vs ($cls2,$query2):"
+ "\n expected: $expectedResult\n actual: $result1");
+ Expect.setEquals(
+ expectedResult.classes,
+ result1.classes,
"Unexpected results for ($cls1,$query1) vs ($cls2,$query2):"
"\n expected: $expectedResult\n actual: $result1");
}
- check(A, ClassQuery.EXACT, A, ClassQuery.EXACT, []);
- check(A, ClassQuery.EXACT, A, ClassQuery.SUBCLASS, []);
- check(A, ClassQuery.EXACT, A, ClassQuery.SUBTYPE, []);
- check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBCLASS, [C]);
- check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBTYPE, [C]);
- check(A, ClassQuery.SUBTYPE, A, ClassQuery.SUBTYPE, [C, D]);
+ check(A, ClassQuery.EXACT, A, ClassQuery.EXACT,
+ new SubclassResult.internal(ClassQuery.EXACT, [A]));
+ check(A, ClassQuery.EXACT, A, ClassQuery.SUBCLASS,
+ new SubclassResult.internal(ClassQuery.EXACT, [A]));
+ check(A, ClassQuery.EXACT, A, ClassQuery.SUBTYPE,
+ new SubclassResult.internal(ClassQuery.EXACT, [A]));
+ check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBCLASS,
+ new SubclassResult.internal(ClassQuery.SUBCLASS, [A]));
+ check(A, ClassQuery.SUBCLASS, A, ClassQuery.SUBTYPE,
+ new SubclassResult.internal(ClassQuery.SUBCLASS, [A]));
+ check(A, ClassQuery.SUBTYPE, A, ClassQuery.SUBTYPE,
+ new SubclassResult.internal(ClassQuery.SUBTYPE, [A]));
- check(A, ClassQuery.EXACT, B, ClassQuery.EXACT, []);
- check(A, ClassQuery.EXACT, B, ClassQuery.SUBCLASS, []);
- check(A, ClassQuery.SUBCLASS, B, ClassQuery.EXACT, []);
- check(A, ClassQuery.EXACT, B, ClassQuery.SUBTYPE, []);
- check(A, ClassQuery.SUBTYPE, B, ClassQuery.EXACT, []);
- check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBCLASS, []);
- check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBTYPE, [G]);
- check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBCLASS, [J]);
- check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE, [F, G, I, J]);
+ check(A, ClassQuery.EXACT, B, ClassQuery.EXACT,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(A, ClassQuery.EXACT, B, ClassQuery.SUBCLASS,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(A, ClassQuery.SUBCLASS, B, ClassQuery.EXACT,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(A, ClassQuery.EXACT, B, ClassQuery.SUBTYPE,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(A, ClassQuery.SUBTYPE, B, ClassQuery.EXACT,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBCLASS,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(A, ClassQuery.SUBCLASS, B, ClassQuery.SUBTYPE,
+ new SubclassResult.internal(ClassQuery.SUBCLASS, [G]));
+ check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBCLASS,
+ new SubclassResult.internal(ClassQuery.SUBCLASS, [J]));
+ check(A, ClassQuery.SUBTYPE, B, ClassQuery.SUBTYPE,
+ new SubclassResult.internal(ClassQuery.SUBCLASS, [F, G, I, J]));
- check(A, ClassQuery.EXACT, C, ClassQuery.EXACT, []);
- check(A, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []);
- check(A, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []);
- check(A, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []);
- check(A, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []);
- check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, [G]);
- check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, [G]);
- check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]);
- check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G, H]);
+ check(A, ClassQuery.EXACT, C, ClassQuery.EXACT,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(A, ClassQuery.EXACT, C, ClassQuery.SUBCLASS,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(A, ClassQuery.SUBCLASS, C, ClassQuery.EXACT,
+ new SubclassResult.internal(ClassQuery.EXACT, [C]));
+ check(A, ClassQuery.EXACT, C, ClassQuery.SUBTYPE,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(A, ClassQuery.SUBTYPE, C, ClassQuery.EXACT,
+ new SubclassResult.internal(ClassQuery.EXACT, [C]));
+ check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS,
+ new SubclassResult.internal(ClassQuery.SUBCLASS, [C]));
+ check(A, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE,
+ new SubclassResult.internal(ClassQuery.SUBCLASS, [C]));
+ check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS,
+ new SubclassResult.internal(ClassQuery.SUBCLASS, [C]));
+ check(A, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE,
+ new SubclassResult.internal(ClassQuery.SUBTYPE, [C]));
- check(B, ClassQuery.EXACT, C, ClassQuery.EXACT, []);
- check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS, []);
- check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT, []);
- check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE, []);
- check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT, []);
- check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS, []);
- check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE, []);
- check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS, [G]);
- check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE, [F, G]);
+ check(B, ClassQuery.EXACT, C, ClassQuery.EXACT,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(B, ClassQuery.EXACT, C, ClassQuery.SUBCLASS,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(B, ClassQuery.SUBCLASS, C, ClassQuery.EXACT,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(B, ClassQuery.EXACT, C, ClassQuery.SUBTYPE,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(B, ClassQuery.SUBTYPE, C, ClassQuery.EXACT,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBCLASS,
+ new SubclassResult.internal(ClassQuery.EXACT, []));
+ check(B, ClassQuery.SUBCLASS, C, ClassQuery.SUBTYPE,
+ new SubclassResult.internal(ClassQuery.SUBCLASS, []));
+ check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBCLASS,
+ new SubclassResult.internal(ClassQuery.SUBCLASS, [G]));
+ check(B, ClassQuery.SUBTYPE, C, ClassQuery.SUBTYPE,
+ new SubclassResult.internal(ClassQuery.SUBCLASS, [F, G]));
}
diff --git a/tests/compiler/dart2js/needs_no_such_method_test.dart b/tests/compiler/dart2js/needs_no_such_method_test.dart
index 5cd35d2..735e390 100644
--- a/tests/compiler/dart2js/needs_no_such_method_test.dart
+++ b/tests/compiler/dart2js/needs_no_such_method_test.dart
@@ -9,8 +9,9 @@
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/elements/names.dart';
import 'package:compiler/src/universe/call_structure.dart';
+import 'package:compiler/src/universe/class_hierarchy.dart';
import 'package:compiler/src/universe/selector.dart';
-import 'package:compiler/src/world.dart' show JClosedWorld, ClassQuery;
+import 'package:compiler/src/world.dart' show JClosedWorld;
import 'type_test_helper.dart';
void main() {
diff --git a/tests/compiler/dart2js/rti/data/async_foreach.dart b/tests/compiler/dart2js/rti/data/async_foreach.dart
new file mode 100644
index 0000000..775cdbe
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/async_foreach.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*kernel.class: Class:*/
+/*strong.class: Class:direct,explicit=[Class.T],implicit=[Class.T],needsArgs*/
+/*omit.class: Class:needsArgs*/
+class Class<T> {
+ method() {
+ var list = <T>[];
+ // With the `is dynamic Function(Object)` test in the async implementation
+ // the closure, with type `dynamic Function(T)`, needs its signature,
+ // requiring the need for type arguments on `Class`.
+ //
+ // This happens because the closure is thought as possibly going to the
+ // async.errorHandler callback.
+ list.forEach(
+ /*strong.needsSignature*/
+ /*omit.needsSignature*/
+ (x) => print(x));
+ }
+}
+
+main() async {
+ new Class<int>().method();
+}
diff --git a/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart b/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
new file mode 100644
index 0000000..2e390bf
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/async_foreach_nonasync.dart
@@ -0,0 +1,22 @@
+// 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.
+
+/*kernel.class: Class:*/
+/*strong.class: Class:direct,explicit=[Class.T],implicit=[Class.T],needsArgs*/
+/*omit.class: Class:*/
+class Class<T> {
+ method() {
+ var list = <T>[];
+ // If any method was `async`, this would have triggered the need for type
+ // arguments on `Class`. See the 'async_foreach.dart' test.
+ list.forEach(
+ /*strong.needsSignature*/
+ /*omit.*/
+ (x) => print(x));
+ }
+}
+
+main() {
+ new Class<int>().method();
+}
diff --git a/tests/compiler/dart2js/rti/data/async_local.dart b/tests/compiler/dart2js/rti/data/async_local.dart
new file mode 100644
index 0000000..45f0a91
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/async_local.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() async {
+ // With the `is dynamic Function(Object,StackTrace)` test in the async
+ // implementation the closure, with type `dynamic Function(dynamic, dynamic)`,
+ // needs its signature.
+ //
+ // This happens because the closure is thought as possibly going to the
+ // async.errorHandler callback.
+ /*kernel.*/
+ /*strong.needsSignature*/
+ /*omit.needsSignature*/
+ local(object, stacktrace) => null;
+
+ return local;
+}
diff --git a/tests/compiler/dart2js/rti/data/async_local_nonasync.dart b/tests/compiler/dart2js/rti/data/async_local_nonasync.dart
new file mode 100644
index 0000000..4651639
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/async_local_nonasync.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+ // If any method was `async`, this would have triggered the need for the
+ // signature on this closure. See the 'async_local.dart' test.
+ /*kernel.*/
+ /*strong.*/
+ /*omit.*/
+ local(object, stacktrace) => null;
+
+ return local;
+}
diff --git a/tests/compiler/dart2js/rti/data/async_local_typed.dart b/tests/compiler/dart2js/rti/data/async_local_typed.dart
new file mode 100644
index 0000000..40de910
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/async_local_typed.dart
@@ -0,0 +1,21 @@
+// 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.
+
+/*kernel.class: Class:*/
+/*strong.class: Class:explicit=[Class<int>],needsArgs*/
+/*omit.class: Class:*/
+class Class<T> {}
+
+main() async {
+ // Despite the `is dynamic Function(Object,StackTrace)` test in the async
+ // implementation the closure, with type
+ // `dynamic Function(dynamic, Class<int>)`, is not a potential subtype and
+ // therefore doesn't need its signature.
+ /*kernel.*/
+ /*strong.needsSignature*/
+ /*omit.*/
+ local(object, Class<int> stacktrace) => null;
+
+ return local;
+}
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic.dart b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
index 2db2947..69a082c1 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic.dart
@@ -5,10 +5,13 @@
import 'package:expect/expect.dart';
import 'package:meta/dart2js.dart';
-/*!strong.class: A:needsArgs*/
+/*kernel.class: A:needsArgs*/
/*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*omit.class: A:*/
class A<T> {
- /*element: A.call:needsSignature*/
+ /*kernel.element: A.call:needsSignature*/
+ /*strong.element: A.call:*/
+ /*omit.element: A.call:*/
call(T t) {}
}
diff --git a/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart b/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
index 6678ce8..cb5b8c4 100644
--- a/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
+++ b/tests/compiler/dart2js/rti/data/call_typed_generic_strong.dart
@@ -5,10 +5,13 @@
import 'package:expect/expect.dart';
import 'package:meta/dart2js.dart';
-/*!strong.class: A:needsArgs*/
+/*kernel.class: A:needsArgs*/
/*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*omit.class: A:*/
class A<T> {
- /*element: A.call:needsSignature*/
+ /*kernel.element: A.call:needsSignature*/
+ /*strong.element: A.call:*/
+ /*omit.element: A.call:*/
call(T t) {}
}
diff --git a/tests/compiler/dart2js/rti/data/closure.dart b/tests/compiler/dart2js/rti/data/closure.dart
index df64b7e..eb55472 100644
--- a/tests/compiler/dart2js/rti/data/closure.dart
+++ b/tests/compiler/dart2js/rti/data/closure.dart
@@ -2,7 +2,8 @@
// 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.
-/*!strong.class: A:needsArgs*/
+/*kernel.class: A:needsArgs*/
+/*omit.class: A:needsArgs*/
/*strong.class: A:direct,explicit=[A.T],needsArgs*/
class A<T> {
m() {
diff --git a/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart b/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
index 0b26509f..f14aa06 100644
--- a/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
+++ b/tests/compiler/dart2js/rti/data/closure_generic_unneeded_strong.dart
@@ -4,7 +4,8 @@
import 'package:expect/expect.dart';
-/*!strong.class: A:*/
+/*kernel.class: A:*/
+/*omit.class: A:*/
/*strong.class: A:direct,explicit=[A.T],needsArgs*/
class A<T> {
@NoInline()
diff --git a/tests/compiler/dart2js/rti/data/closure_unneeded.dart b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
index 0b26509f..f14aa06 100644
--- a/tests/compiler/dart2js/rti/data/closure_unneeded.dart
+++ b/tests/compiler/dart2js/rti/data/closure_unneeded.dart
@@ -4,7 +4,8 @@
import 'package:expect/expect.dart';
-/*!strong.class: A:*/
+/*kernel.class: A:*/
+/*omit.class: A:*/
/*strong.class: A:direct,explicit=[A.T],needsArgs*/
class A<T> {
@NoInline()
diff --git a/tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart
index e928292..aed8273 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_is2_strong.dart
@@ -2,7 +2,8 @@
// 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.
-/*!strong.class: A:*/
+/*kernel.class: A:*/
+/*omit.class: A:*/
/*strong.class: A:explicit=[A]*/
class A {
/*element: A.instanceMethod:deps=[B.instanceMethod],direct,explicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
diff --git a/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart b/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart
index ba29c64..7dffcff 100644
--- a/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart
+++ b/tests/compiler/dart2js/rti/data/dynamic_tear_off3_strong.dart
@@ -2,7 +2,8 @@
// 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.
-/*!strong.class: A:*/
+/*kernel.class: A:*/
+/*omit.class: A:*/
/*strong.class: A:explicit=[A]*/
class A {
/*element: A.instanceMethod:deps=[staticMethod],direct,explicit=[instanceMethod.T],needsArgs,selectors=[Selector(call, instanceMethod, arity=1, types=1)]*/
diff --git a/tests/compiler/dart2js/rti/data/generic_class_is2.dart b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
index 4a84003..acef47b 100644
--- a/tests/compiler/dart2js/rti/data/generic_class_is2.dart
+++ b/tests/compiler/dart2js/rti/data/generic_class_is2.dart
@@ -8,7 +8,8 @@
/*class: A:implicit=[List<A<C2>>,List<A<C>>]*/
class A<T> {}
-/*!strong.class: A1:*/
+/*kernel.class: A1:*/
+/*omit.class: A1:*/
/*strong.class: A1:implicit=[A1]*/
class A1 implements A<C1> {}
diff --git a/tests/compiler/dart2js/rti/data/generic_creation.dart b/tests/compiler/dart2js/rti/data/generic_creation.dart
index d2bb3be..25b4a20 100644
--- a/tests/compiler/dart2js/rti/data/generic_creation.dart
+++ b/tests/compiler/dart2js/rti/data/generic_creation.dart
@@ -6,41 +6,50 @@
/*class: A:needsArgs*/
/*kernel.element: A.:needsSignature*/
-/*!kernel.element: A.:*/
+/*strong.element: A.:*/
+/*omit.element: A.:*/
class A<X, Y, Z> {
/*kernel.element: A.shift:needsSignature*/
- /*!kernel.element: A.shift:*/
+ /*strong.element: A.shift:*/
+ /*omit.element: A.shift:*/
shift() => new A<Z, X, Y>();
/*kernel.element: A.swap:needsSignature*/
- /*!kernel.element: A.swap:*/
+ /*strong.element: A.swap:*/
+ /*omit.element: A.swap:*/
swap() => new A<Z, Y, X>();
/*kernel.element: A.first:needsSignature*/
- /*!kernel.element: A.first:*/
+ /*strong.element: A.first:*/
+ /*omit.element: A.first:*/
first() => new A<X, X, X>();
/*kernel.element: A.last:needsSignature*/
- /*!kernel.element: A.last:*/
+ /*strong.element: A.last:*/
+ /*omit.element: A.last:*/
last() => new A<Z, Z, Z>();
/*kernel.element: A.wrap:needsSignature*/
- /*!kernel.element: A.wrap:*/
+ /*strong.element: A.wrap:*/
+ /*omit.element: A.wrap:*/
wrap() => new A<A<X, X, X>, A<Y, Y, Y>, A<Z, Z, Z>>();
}
/*kernel.element: B.:needsSignature*/
-/*!kernel.element: B.:*/
+/*strong.element: B.:*/
+/*omit.element: B.:*/
class B extends A<U, V, W> {}
/*class: C:needsArgs*/
/*kernel.element: C.:needsSignature*/
-/*!kernel.element: C.:*/
+/*strong.element: C.:*/
+/*omit.element: C.:*/
class C<T> extends A<U, T, W> {}
/*class: D:needsArgs*/
/*kernel.element: D.:needsSignature*/
-/*!kernel.element: D.:*/
+/*strong.element: D.:*/
+/*omit.element: D.:*/
class D<X, Y, Z> extends A<Y, Z, X> {}
class U {}
@@ -50,11 +59,13 @@
class W {}
/*kernel.element: sameType:needsSignature*/
-/*!kernel.element: sameType:*/
+/*strong.element: sameType:*/
+/*omit.element: sameType:*/
sameType(a, b) => Expect.equals(a.runtimeType, b.runtimeType);
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
A a = new A<U, V, W>();
sameType(new A<W, U, V>(), a.shift());
diff --git a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart
index f438d3f..957e2cd 100644
--- a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart
+++ b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05_strong.dart
@@ -4,22 +4,26 @@
// Test derived from language_2/generic_methods_dynamic_test/05
-/*!strong.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SubListIterable],explicit=[JSArray],needsArgs*/
+/*kernel.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SubListIterable],explicit=[JSArray],needsArgs*/
+/*omit.class: global#JSArray:deps=[EmptyIterable,List,ListIterable,SubListIterable],explicit=[JSArray],needsArgs*/
/*strong.class: global#JSArray:deps=[ArrayIterator,EmptyIterable,List,ListIterable,SubListIterable],direct,explicit=[Iterable<JSArray.E>,JSArray,JSArray.E,JSArray<ArrayIterator.E>,List<JSArray.E>],implicit=[JSArray.E],needsArgs*/
-/*!strong.class: global#List:deps=[C.bar,EmptyIterable,Iterable,JSArray,ListIterable],explicit=[List,List<B>],needsArgs*/
+/*kernel.class: global#List:deps=[C.bar,EmptyIterable,Iterable,JSArray,ListIterable],explicit=[List,List<B>],needsArgs*/
+/*omit.class: global#List:deps=[C.bar,EmptyIterable,Iterable,JSArray,ListIterable],explicit=[List,List<B>],needsArgs*/
/*strong.class: global#List:deps=[C.bar,EmptyIterable,Iterable,JSArray,ListIterable,makeListFixedLength],direct,explicit=[List,List.E,List<B>,List<JSArray.E>,List<String>,List<makeListFixedLength.T>],implicit=[List.E],needsArgs*/
import "package:expect/expect.dart";
class A {}
-/*!strong.class: B:explicit=[List<B>]*/
+/*kernel.class: B:explicit=[List<B>]*/
+/*omit.class: B:explicit=[List<B>]*/
/*strong.class: B:explicit=[List<B>],implicit=[B]*/
class B {}
class C {
- /*!strong.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+ /*kernel.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+ /*omit.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
/*strong.element: C.bar:direct,explicit=[Iterable<bar.T>],implicit=[bar.T],needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
List<T> bar<T>(Iterable<T> t) => <T>[t.first];
}
diff --git a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart
index e7b8007..c6a1e97 100644
--- a/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart
+++ b/tests/compiler/dart2js/rti/data/generic_methods_dynamic_05a_strong.dart
@@ -6,7 +6,8 @@
import "package:expect/expect.dart";
-/*!strong.class: A:deps=[C.bar],explicit=[A<B>],needsArgs*/
+/*kernel.class: A:deps=[C.bar],explicit=[A<B>],needsArgs*/
+/*omit.class: A:deps=[C.bar],explicit=[A<B>],needsArgs*/
/*strong.class: A:deps=[C.bar],direct,explicit=[A.T,A<B>,A<bar.T>],needsArgs*/
class A<T> {
final T field;
@@ -14,12 +15,14 @@
A(this.field);
}
-/*!strong.class: B:explicit=[A<B>]*/
+/*kernel.class: B:explicit=[A<B>]*/
+/*omit.class: B:explicit=[A<B>]*/
/*strong.class: B:explicit=[A<B>],implicit=[B]*/
class B {}
class C {
- /*!strong.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+ /*kernel.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
+ /*omit.element: C.bar:needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
/*strong.element: C.bar:explicit=[A<bar.T>],implicit=[bar.T],indirect,needsArgs,selectors=[Selector(call, bar, arity=1, types=1)]*/
A<T> bar<T>(A<T> t) => new A<T>(t.field);
}
diff --git a/tests/compiler/dart2js/rti/data/indirect_through_static.dart b/tests/compiler/dart2js/rti/data/indirect_through_static.dart
index 6359003..f8c9344 100644
--- a/tests/compiler/dart2js/rti/data/indirect_through_static.dart
+++ b/tests/compiler/dart2js/rti/data/indirect_through_static.dart
@@ -3,7 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
/*kernel.class: A:*/
-/*!kernel.class: A:implicit=[A]*/
+/*strong.class: A:implicit=[A]*/
+/*omit.class: A:implicit=[A]*/
abstract class A {}
class B implements A {}
@@ -31,7 +32,8 @@
}
/*kernel.element: lookup:direct,explicit=[C<lookup.T>]*/
-/*!kernel.element: lookup:direct,explicit=[C<lookup.T>],needsArgs*/
+/*strong.element: lookup:direct,explicit=[C<lookup.T>],needsArgs*/
+/*omit.element: lookup:direct,explicit=[C<lookup.T>],needsArgs*/
C<T> lookup<T>(String key) {
final value = map[key];
if (value != null && value is C<T>) {
diff --git a/tests/compiler/dart2js/rti/data/instantiation2.dart b/tests/compiler/dart2js/rti/data/instantiation2.dart
index fd7022c..5fc92bb 100644
--- a/tests/compiler/dart2js/rti/data/instantiation2.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation2.dart
@@ -3,7 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
/*kernel.element: f:direct,explicit=[f.T]*/
-/*!kernel.element: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
+/*strong.element: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
+/*omit.element: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
bool f<T>(T a) => a is T;
typedef bool F<R>(R a);
diff --git a/tests/compiler/dart2js/rti/data/instantiation4.dart b/tests/compiler/dart2js/rti/data/instantiation4.dart
index b9f1a78..35f00d4 100644
--- a/tests/compiler/dart2js/rti/data/instantiation4.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation4.dart
@@ -3,7 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
/*kernel.element: f:direct,explicit=[f.T]*/
-/*!kernel.element: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
+/*strong.element: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
+/*omit.element: f:deps=[B],direct,explicit=[f.T],needsArgs,needsInst=[<B.S>]*/
bool f<T>(T a) => a is T;
typedef bool F<R>(R a);
diff --git a/tests/compiler/dart2js/rti/data/instantiation6.dart b/tests/compiler/dart2js/rti/data/instantiation6.dart
index feb9e52..86b3684 100644
--- a/tests/compiler/dart2js/rti/data/instantiation6.dart
+++ b/tests/compiler/dart2js/rti/data/instantiation6.dart
@@ -3,12 +3,14 @@
// BSD-style license that can be found in the LICENSE file.
/*kernel.element: f:direct,explicit=[f.T]*/
-/*!kernel.element: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
+/*strong.element: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
+/*omit.element: f:deps=[method],direct,explicit=[f.T],needsArgs,needsInst=[<method.S>]*/
bool f<T>(T a) => a is T;
typedef bool F<R>(R a);
-/*!kernel.element: method:indirect,needsArgs*/
+/*strong.element: method:indirect,needsArgs*/
+/*omit.element: method:indirect,needsArgs*/
method<S>() {
F<S> c;
diff --git a/tests/compiler/dart2js/rti/data/local_function_signatures.dart b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
index b7c851c..1704785 100644
--- a/tests/compiler/dart2js/rti/data/local_function_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/local_function_signatures.dart
@@ -24,7 +24,8 @@
}
}
-/*!strong.class: Class2:needsArgs*/
+/*kernel.class: Class2:needsArgs*/
+/*omit.class: Class2:needsArgs*/
/*strong.class: Class2:direct,explicit=[Class2.T],needsArgs*/
class Class2<T> {
method4() {
@@ -43,7 +44,8 @@
}
}
-/*!strong.class: Class4:*/
+/*kernel.class: Class4:*/
+/*omit.class: Class4:*/
/*strong.class: Class4:direct,explicit=[Class4.T],needsArgs*/
class Class4<T> {
method6() {
diff --git a/tests/compiler/dart2js/rti/data/map_literal.dart b/tests/compiler/dart2js/rti/data/map_literal.dart
index 8376333..1bda5e6 100644
--- a/tests/compiler/dart2js/rti/data/map_literal.dart
+++ b/tests/compiler/dart2js/rti/data/map_literal.dart
@@ -2,16 +2,20 @@
// 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.
-/*!strong.class: global#Map:*/
+/*kernel.class: global#Map:*/
+/*omit.class: global#Map:*/
/*strong.class: global#Map:explicit=[Map],indirect,needsArgs*/
-/*!strong.class: global#LinkedHashMap:deps=[Map]*/
+/*kernel.class: global#LinkedHashMap:deps=[Map]*/
+/*omit.class: global#LinkedHashMap:deps=[Map]*/
/*strong.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
-/*!strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
+/*kernel.class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
+/*omit.class: global#JsLinkedHashMap:deps=[LinkedHashMap]*/
/*strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],direct,explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],needsArgs*/
-/*!strong.class: global#double:explicit=[double]*/
+/*kernel.class: global#double:explicit=[double]*/
+/*omit.class: global#double:explicit=[double]*/
/*strong.class: global#double:explicit=[double],implicit=[double]*/
/*class: global#JSDouble:*/
diff --git a/tests/compiler/dart2js/rti/data/map_to_set.dart b/tests/compiler/dart2js/rti/data/map_to_set.dart
index 073f358..b883fe0 100644
--- a/tests/compiler/dart2js/rti/data/map_to_set.dart
+++ b/tests/compiler/dart2js/rti/data/map_to_set.dart
@@ -2,16 +2,20 @@
// 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.
-/*!strong.class: global#Map:deps=[Class],needsArgs*/
+/*kernel.class: global#Map:deps=[Class],needsArgs*/
+/*omit.class: global#Map:deps=[Class],needsArgs*/
/*strong.class: global#Map:deps=[Class,JsLinkedHashMap,MapMixin],explicit=[Map,Map<JsLinkedHashMap.K,JsLinkedHashMap.V>,Map<MapMixin.K,MapMixin.V>],indirect,needsArgs*/
-/*!strong.class: global#LinkedHashMap:deps=[Map],needsArgs*/
+/*kernel.class: global#LinkedHashMap:deps=[Map],needsArgs*/
+/*omit.class: global#LinkedHashMap:deps=[Map],needsArgs*/
/*strong.class: global#LinkedHashMap:deps=[Map],direct,explicit=[LinkedHashMap<LinkedHashMap.K,LinkedHashMap.V>],implicit=[LinkedHashMap.K,LinkedHashMap.V],needsArgs*/
-/*!strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
+/*kernel.class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
+/*omit.class: global#JsLinkedHashMap:deps=[LinkedHashMap],implicit=[JsLinkedHashMap.K],needsArgs*/
/*strong.class: global#JsLinkedHashMap:deps=[LinkedHashMap],explicit=[JsLinkedHashMap.K,JsLinkedHashMap.V,Map<JsLinkedHashMap.K,JsLinkedHashMap.V>,void Function(JsLinkedHashMap.K,JsLinkedHashMap.V)],implicit=[JsLinkedHashMap.K,JsLinkedHashMap.V],indirect,needsArgs*/
-/*!strong.class: global#double:explicit=[double]*/
+/*kernel.class: global#double:explicit=[double]*/
+/*omit.class: global#double:explicit=[double]*/
/*strong.class: global#double:explicit=[double],implicit=[double]*/
/*class: global#JSDouble:*/
@@ -23,7 +27,8 @@
set is Set<String>;
}
-/*!strong.class: Class:needsArgs*/
+/*kernel.class: Class:needsArgs*/
+/*omit.class: Class:needsArgs*/
/*strong.class: Class:implicit=[Class.S,Class.T],indirect,needsArgs*/
class Class<T, S> {
m() {
diff --git a/tests/compiler/dart2js/rti/data/method_signatures.dart b/tests/compiler/dart2js/rti/data/method_signatures.dart
index 7c24e036..b76455a 100644
--- a/tests/compiler/dart2js/rti/data/method_signatures.dart
+++ b/tests/compiler/dart2js/rti/data/method_signatures.dart
@@ -15,10 +15,13 @@
Object method3(num n) => null;
}
-/*!strong.class: Class2:needsArgs*/
+/*kernel.class: Class2:needsArgs*/
/*strong.class: Class2:direct,explicit=[Class2.T],needsArgs*/
+/*omit.class: Class2:*/
class Class2<T> {
- /*element: Class2.method4:needsSignature*/
+ /*kernel.element: Class2.method4:needsSignature*/
+ /*strong.element: Class2.method4:*/
+ /*omit.element: Class2.method4:*/
num method4(T n) => null;
}
@@ -28,7 +31,8 @@
T method5(num n) => null;
}
-/*!strong.class: Class4:*/
+/*kernel.class: Class4:*/
+/*omit.class: Class4:*/
/*strong.class: Class4:direct,explicit=[Class4.T],needsArgs*/
class Class4<T> {
/*element: Class4.method6:*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
index a591ef6..3fb3610 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals1.dart
@@ -5,15 +5,18 @@
import 'package:expect/expect.dart';
/*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
class Class<T> {
/*kernel.element: Class.:needsSignature*/
- /*!kernel.element: Class.:*/
+ /*strong.element: Class.:*/
+ /*omit.element: Class.:*/
Class();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
/*needsSignature*/
local1a() {}
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
index 5958d4a..a573e8b 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals2.dart
@@ -5,22 +5,27 @@
import 'package:expect/expect.dart';
/*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
class Class<T> {
/*kernel.element: Class.:needsSignature*/
- /*!kernel.element: Class.:*/
+ /*strong.element: Class.:*/
+ /*omit.element: Class.:*/
Class();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
/*kernel.needsSignature*/
- /*!kernel.needsArgs,needsSignature*/
+ /*strong.needsArgs,needsSignature*/
+ /*omit.needsArgs,needsSignature*/
T local1a<T>() => null;
/*kernel.needsSignature*/
- /*!kernel.needsArgs,needsSignature*/
+ /*strong.needsArgs,needsSignature*/
+ /*omit.needsArgs,needsSignature*/
T local1b<T>() => null;
/*kernel.needsSignature*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
index 74d0adb..c32e678 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals3.dart
@@ -6,15 +6,18 @@
String method() => null;
-/*!strong.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*omit.class: Class1:needsArgs*/
/*strong.class: Class1:direct,explicit=[Class1.T],needsArgs*/
class Class1<T> {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
/*kernel.element: Class1.method:needsSignature*/
- /*!kernel.element: Class1.method:*/
+ /*strong.element: Class1.method:*/
+ /*omit.element: Class1.method:*/
method() {
/*needsSignature*/
T local1a() => null;
@@ -32,15 +35,18 @@
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
new Class1<int>().method();
new Class2<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
index 456b5db..91267c0 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals4.dart
@@ -5,38 +5,46 @@
import 'package:expect/expect.dart';
/*kernel.class: Class1:needsArgs*/
-/*!kernel.class: Class1:*/
+/*strong.class: Class1:*/
+/*omit.class: Class1:*/
class Class1<T> {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
// TODO(johnniwinther): Currently only methods that use class type variables
// in their signature are marked as 'needs signature'. Change this to mark
// all methods that need to support access to their function type at runtime.
/*kernel.element: Class1.method1a:needsSignature*/
- /*!kernel.element: Class1.method1a:*/
+ /*strong.element: Class1.method1a:*/
+ /*omit.element: Class1.method1a:*/
method1a() => null;
/*kernel.element: Class1.method1b:needsSignature*/
- /*!kernel.element: Class1.method1b:*/
+ /*strong.element: Class1.method1b:*/
+ /*omit.element: Class1.method1b:*/
method1b() => null;
/*kernel.element: Class1.method2:needsSignature*/
- /*!kernel.element: Class1.method2:*/
+ /*strong.element: Class1.method2:*/
+ /*omit.element: Class1.method2:*/
method2(t, s) => t;
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
var c = new Class1<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
index 28c000f..e2aa421 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals5.dart
@@ -4,36 +4,44 @@
import 'package:expect/expect.dart';
-/*!strong.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*omit.class: Class1:needsArgs*/
/*strong.class: Class1:direct,explicit=[Class1.T],needsArgs*/
class Class1<T> {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
/*kernel.element: Class1.method1a:needsSignature*/
- /*!kernel.element: Class1.method1a:needsSignature*/
+ /*strong.element: Class1.method1a:needsSignature*/
+ /*omit.element: Class1.method1a:needsSignature*/
T method1a() => null;
/*kernel.element: Class1.method1b:needsSignature*/
- /*!kernel.element: Class1.method1b:needsSignature*/
+ /*strong.element: Class1.method1b:needsSignature*/
+ /*omit.element: Class1.method1b:needsSignature*/
T method1b() => null;
/*kernel.element: Class1.method2:needsSignature*/
- /*!kernel.element: Class1.method2:needsSignature*/
+ /*strong.element: Class1.method2:needsSignature*/
+ /*omit.element: Class1.method2:needsSignature*/
T method2(T t, String s) => t;
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
var c = new Class1<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
index b8771d8..af2cce5 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals6.dart
@@ -5,27 +5,33 @@
import 'package:expect/expect.dart';
/*kernel.element: method1a:needsSignature*/
-/*!kernel.element: method1a:*/
+/*strong.element: method1a:*/
+/*omit.element: method1a:*/
method1a() => null;
/*kernel.element: method1b:needsSignature*/
-/*!kernel.element: method1b:*/
+/*strong.element: method1b:*/
+/*omit.element: method1b:*/
method1b() => null;
/*kernel.element: method2:needsSignature*/
-/*!kernel.element: method2:*/
+/*strong.element: method2:*/
+/*omit.element: method2:*/
method2(t, s) => t;
/*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
class Class<T> {
/*kernel.element: Class.:needsSignature*/
- /*!kernel.element: Class.:*/
+ /*strong.element: Class.:*/
+ /*omit.element: Class.:*/
Class();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Expect.isTrue(method1a.runtimeType == method1b.runtimeType);
Expect.isFalse(method1a.runtimeType == method2.runtimeType);
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
index b3ff672..23d1a3b 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals7.dart
@@ -5,11 +5,13 @@
import 'package:expect/expect.dart';
/*kernel.element: method1a:needsSignature*/
-/*!kernel.element: method1a:needsArgs*/
+/*strong.element: method1a:needsArgs*/
+/*omit.element: method1a:needsArgs*/
T method1a<T>() => null;
/*kernel.element: method1b:needsSignature*/
-/*!kernel.element: method1b:needsArgs*/
+/*strong.element: method1b:needsArgs*/
+/*omit.element: method1b:needsArgs*/
T method1b<T>() => null;
/*kernel.element: method2:needsSignature*/
@@ -18,15 +20,18 @@
T method2<T>(T t, String s) => t;
/*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
class Class<T> {
/*kernel.element: Class.:needsSignature*/
- /*!kernel.element: Class.:*/
+ /*strong.element: Class.:*/
+ /*omit.element: Class.:*/
Class();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Expect.isTrue(method1a.runtimeType == method1b.runtimeType);
Expect.isFalse(method1a.runtimeType == method2.runtimeType);
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
index 9c4ebae..4f871d6 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_equals8.dart
@@ -5,18 +5,22 @@
import 'package:expect/expect.dart';
/*kernel.class: Class1:needsArgs*/
-/*!kernel.class: Class1:*/
+/*strong.class: Class1:*/
+/*omit.class: Class1:*/
class Class1<S> {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
/*kernel.element: Class1.method1a:needsSignature*/
- /*!kernel.element: Class1.method1a:needsArgs*/
+ /*strong.element: Class1.method1a:needsArgs*/
+ /*omit.element: Class1.method1a:needsArgs*/
T method1a<T>() => null;
/*kernel.element: Class1.method1b:needsSignature*/
- /*!kernel.element: Class1.method1b:needsArgs*/
+ /*strong.element: Class1.method1b:needsArgs*/
+ /*omit.element: Class1.method1b:needsArgs*/
T method1b<T>() => null;
/*kernel.element: Class1.method2:needsSignature*/
@@ -26,15 +30,18 @@
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
var c = new Class1<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
index 9d67301..4eb0481 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string1.dart
@@ -3,21 +3,26 @@
// BSD-style license that can be found in the LICENSE file.
/*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
class Class<T> {
/*kernel.element: Class.:needsSignature*/
- /*!kernel.element: Class.:*/
+ /*strong.element: Class.:*/
+ /*omit.element: Class.:*/
Class();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
- /*!omit.needsSignature*/
+ /*kernel.needsSignature*/
+ /*strong.needsSignature*/
/*omit.*/
local1() {}
- /*!omit.needsSignature*/
+ /*kernel.needsSignature*/
+ /*strong.needsSignature*/
/*omit.*/
local2(int i, String s) => i;
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
index 034011c..c2d9ef4 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string2.dart
@@ -3,15 +3,18 @@
// BSD-style license that can be found in the LICENSE file.
/*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
class Class<T> {
/*kernel.element: Class.:needsSignature*/
- /*!kernel.element: Class.:*/
+ /*strong.element: Class.:*/
+ /*omit.element: Class.:*/
Class();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
/*kernel.needsSignature*/
/*strong.needsArgs,needsSignature*/
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
index 69f305d..fbc1805 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string3.dart
@@ -2,28 +2,34 @@
// 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.
-/*!omit.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*strong.class: Class1:needsArgs*/
/*omit.class: Class1:*/
class Class1<T> {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
- /*!omit.element: Class1.method:needsSignature*/
+ /*kernel.element: Class1.method:needsSignature*/
+ /*strong.element: Class1.method:needsSignature*/
/*omit.element: Class1.method:*/
T method() => null;
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Class1<int> cls1 = new Class1<int>();
print(cls1.method.runtimeType.toString());
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
index ca9f34b..72d9834 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string4.dart
@@ -5,7 +5,8 @@
/*class: Class1:*/
class Class1 {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
/*kernel.element: Class1.method:needsSignature*/
@@ -15,15 +16,18 @@
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Class1 cls1 = new Class1();
print(cls1.method.runtimeType.toString());
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
index 25274f4..86081c3 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string5.dart
@@ -3,23 +3,28 @@
// BSD-style license that can be found in the LICENSE file.
/*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
class Class<T> {
/*kernel.element: Class.:needsSignature*/
- /*!kernel.element: Class.:*/
+ /*strong.element: Class.:*/
+ /*omit.element: Class.:*/
Class();
}
/*kernel.element: method1:needsSignature*/
-/*!kernel.element: method1:*/
+/*strong.element: method1:*/
+/*omit.element: method1:*/
method1() {}
/*kernel.element: method2:needsSignature*/
-/*!kernel.element: method2:*/
+/*strong.element: method2:*/
+/*omit.element: method2:*/
method2(int i, String s) => i;
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
print('${method1.runtimeType}');
method2(0, '');
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
index 6a1ae66..f64f35f 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_closure_to_string6.dart
@@ -3,10 +3,12 @@
// BSD-style license that can be found in the LICENSE file.
/*kernel.class: Class:needsArgs*/
-/*!kernel.class: Class:*/
+/*strong.class: Class:*/
+/*omit.class: Class:*/
class Class<T> {
/*kernel.element: Class.:needsSignature*/
- /*!kernel.element: Class.:*/
+ /*strong.element: Class.:*/
+ /*omit.element: Class.:*/
Class();
}
@@ -21,7 +23,8 @@
method2<T>(t, s) => t;
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
print('${method1.runtimeType}');
method2(0, '');
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
index 06a762f..3c7aed7 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals1.dart
@@ -7,11 +7,13 @@
/*class: Class1a:needsArgs*/
class Class1a<T> {
/*kernel.element: Class1a.:needsSignature*/
- /*!kernel.element: Class1a.:*/
+ /*strong.element: Class1a.:*/
+ /*omit.element: Class1a.:*/
Class1a();
/*kernel.element: Class1a.==:needsSignature*/
- /*!kernel.element: Class1a.==:*/
+ /*strong.element: Class1a.==:*/
+ /*omit.element: Class1a.==:*/
bool operator ==(other) {
if (identical(this, other)) return true;
return runtimeType == other.runtimeType;
@@ -21,7 +23,8 @@
/*class: Class1b:needsArgs*/
class Class1b<T> extends Class1a<T> {
/*kernel.element: Class1b.:needsSignature*/
- /*!kernel.element: Class1b.:*/
+ /*strong.element: Class1b.:*/
+ /*omit.element: Class1b.:*/
Class1b();
}
@@ -30,20 +33,24 @@
/*class: Class1c:needsArgs*/
class Class1c<T> implements Class1a<T> {
/*kernel.element: Class1c.:needsSignature*/
- /*!kernel.element: Class1c.:*/
+ /*strong.element: Class1c.:*/
+ /*omit.element: Class1c.:*/
Class1c();
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Class1a<int> cls1a = new Class1a<int>();
Class1a<int> cls1b1 = new Class1b<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
index 19554c5..72fb155 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals2.dart
@@ -7,11 +7,13 @@
/*class: Class1a:needsArgs*/
class Class1a<T> {
/*kernel.element: Class1a.:needsSignature*/
- /*!kernel.element: Class1a.:*/
+ /*strong.element: Class1a.:*/
+ /*omit.element: Class1a.:*/
Class1a();
/*kernel.element: Class1a.==:needsSignature*/
- /*!kernel.element: Class1a.==:*/
+ /*strong.element: Class1a.==:*/
+ /*omit.element: Class1a.==:*/
bool operator ==(other) {
if (identical(this, other)) return true;
return other.runtimeType == runtimeType;
@@ -21,7 +23,8 @@
/*class: Class1b:needsArgs*/
class Class1b<T> extends Class1a<T> {
/*kernel.element: Class1b.:needsSignature*/
- /*!kernel.element: Class1b.:*/
+ /*strong.element: Class1b.:*/
+ /*omit.element: Class1b.:*/
Class1b();
}
@@ -30,20 +33,24 @@
/*class: Class1c:needsArgs*/
class Class1c<T> implements Class1a<T> {
/*kernel.element: Class1c.:needsSignature*/
- /*!kernel.element: Class1c.:*/
+ /*strong.element: Class1c.:*/
+ /*omit.element: Class1c.:*/
Class1c();
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Class1a<int> cls1a = new Class1a<int>();
Class1a<int> cls1b1 = new Class1b<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
index 913cc57..4994e58 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals3.dart
@@ -7,11 +7,13 @@
/*class: Class1a:needsArgs*/
class Class1a<T> {
/*kernel.element: Class1a.:needsSignature*/
- /*!kernel.element: Class1a.:*/
+ /*strong.element: Class1a.:*/
+ /*omit.element: Class1a.:*/
Class1a();
/*kernel.element: Class1a.==:needsSignature*/
- /*!kernel.element: Class1a.==:*/
+ /*strong.element: Class1a.==:*/
+ /*omit.element: Class1a.==:*/
bool operator ==(other) {
if (identical(this, other)) return true;
return runtimeType == other?.runtimeType;
@@ -21,7 +23,8 @@
/*class: Class1b:needsArgs*/
class Class1b<T> extends Class1a<T> {
/*kernel.element: Class1b.:needsSignature*/
- /*!kernel.element: Class1b.:*/
+ /*strong.element: Class1b.:*/
+ /*omit.element: Class1b.:*/
Class1b();
}
@@ -30,20 +33,24 @@
/*class: Class1c:needsArgs*/
class Class1c<T> implements Class1a<T> {
/*kernel.element: Class1c.:needsSignature*/
- /*!kernel.element: Class1c.:*/
+ /*strong.element: Class1c.:*/
+ /*omit.element: Class1c.:*/
Class1c();
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Class1a<int> cls1a = new Class1a<int>();
Class1a<int> cls1b1 = new Class1b<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart b/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
index 7993bcd..3eb953a 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_equals4.dart
@@ -7,11 +7,13 @@
/*class: Class1a:needsArgs*/
class Class1a<T> {
/*kernel.element: Class1a.:needsSignature*/
- /*!kernel.element: Class1a.:*/
+ /*strong.element: Class1a.:*/
+ /*omit.element: Class1a.:*/
Class1a();
/*kernel.element: Class1a.==:needsSignature*/
- /*!kernel.element: Class1a.==:*/
+ /*strong.element: Class1a.==:*/
+ /*omit.element: Class1a.==:*/
bool operator ==(other) {
if (identical(this, other)) return true;
return other?.runtimeType == runtimeType;
@@ -21,7 +23,8 @@
/*class: Class1b:needsArgs*/
class Class1b<T> extends Class1a<T> {
/*kernel.element: Class1b.:needsSignature*/
- /*!kernel.element: Class1b.:*/
+ /*strong.element: Class1b.:*/
+ /*omit.element: Class1b.:*/
Class1b();
}
@@ -30,20 +33,24 @@
/*class: Class1c:needsArgs*/
class Class1c<T> implements Class1a<T> {
/*kernel.element: Class1c.:needsSignature*/
- /*!kernel.element: Class1c.:*/
+ /*strong.element: Class1c.:*/
+ /*omit.element: Class1c.:*/
Class1c();
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Class1a<int> cls1a = new Class1a<int>();
Class1a<int> cls1b1 = new Class1b<int>();
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
index edf0fb3..5275254 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string1.dart
@@ -2,32 +2,39 @@
// 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.
-/*!omit.class: Class1:*/
+/*kernel.class: Class1:*/
+/*strong.class: Class1:*/
/*omit.class: Class1:*/
class Class1 {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
-/*!omit.class: Class3:needsArgs*/
+/*kernel.class: Class3:needsArgs*/
+/*strong.class: Class3:needsArgs*/
/*omit.class: Class3:*/
class Class3<T> implements Class1 {
/*kernel.element: Class3.:needsSignature*/
- /*!kernel.element: Class3.:*/
+ /*strong.element: Class3.:*/
+ /*omit.element: Class3.:*/
Class3();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Class1 cls1 = new Class1();
print(cls1.runtimeType.toString());
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
index 7c3ca11..6124657 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string2.dart
@@ -2,24 +2,29 @@
// 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.
-/*!omit.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*strong.class: Class1:needsArgs*/
/*omit.class: Class1:*/
class Class1<T> {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Class1<int> cls1 = new Class1<int>();
print('${cls1.runtimeType}');
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
index 02503de..fdff124 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string3.dart
@@ -2,24 +2,29 @@
// 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.
-/*!omit.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*strong.class: Class1:needsArgs*/
/*omit.class: Class1:*/
class Class1<T> {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Class1<int> cls1 = new Class1<int>();
print(cls1.runtimeType?.toString());
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
index 221554c..ba06a77 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string4.dart
@@ -2,24 +2,29 @@
// 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.
-/*!omit.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*strong.class: Class1:needsArgs*/
/*omit.class: Class1:*/
class Class1<T> {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Class1<int> cls1 = new Class1<int>();
print(cls1?.runtimeType?.toString());
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
index f68c923..79f159b 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string5.dart
@@ -2,24 +2,29 @@
// 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.
-/*!omit.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*strong.class: Class1:needsArgs*/
/*omit.class: Class1:*/
class Class1<T> {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Class1<int> cls1 = new Class1<int>();
print('${cls1?.runtimeType}');
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
index 6ca7b43..5d18fbe 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string6.dart
@@ -2,24 +2,29 @@
// 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.
-/*!omit.class: Class1:needsArgs*/
+/*kernel.class: Class1:needsArgs*/
+/*strong.class: Class1:needsArgs*/
/*omit.class: Class1:*/
class Class1<T> {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
}
-/*!omit.class: Class2:needsArgs*/
+/*kernel.class: Class2:needsArgs*/
+/*strong.class: Class2:needsArgs*/
/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
dynamic cls1 = new Class1<int>();
print('${cls1.runtimeType}');
diff --git a/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart b/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
index edf0fb3..5275254 100644
--- a/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
+++ b/tests/compiler/dart2js/rti/data/runtime_type_to_string7.dart
@@ -2,32 +2,39 @@
// 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.
-/*!omit.class: Class1:*/
+/*kernel.class: Class1:*/
+/*strong.class: Class1:*/
/*omit.class: Class1:*/
class Class1 {
/*kernel.element: Class1.:needsSignature*/
- /*!kernel.element: Class1.:*/
+ /*strong.element: Class1.:*/
+ /*omit.element: Class1.:*/
Class1();
}
/*kernel.class: Class2:needsArgs*/
-/*!kernel.class: Class2:*/
+/*strong.class: Class2:*/
+/*omit.class: Class2:*/
class Class2<T> {
/*kernel.element: Class2.:needsSignature*/
- /*!kernel.element: Class2.:*/
+ /*strong.element: Class2.:*/
+ /*omit.element: Class2.:*/
Class2();
}
-/*!omit.class: Class3:needsArgs*/
+/*kernel.class: Class3:needsArgs*/
+/*strong.class: Class3:needsArgs*/
/*omit.class: Class3:*/
class Class3<T> implements Class1 {
/*kernel.element: Class3.:needsSignature*/
- /*!kernel.element: Class3.:*/
+ /*strong.element: Class3.:*/
+ /*omit.element: Class3.:*/
Class3();
}
/*kernel.element: main:needsSignature*/
-/*!kernel.element: main:*/
+/*strong.element: main:*/
+/*omit.element: main:*/
main() {
Class1 cls1 = new Class1();
print(cls1.runtimeType.toString());
diff --git a/tests/compiler/dart2js/rti/data/tear_off_generic.dart b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
index 2579700..c8263c4 100644
--- a/tests/compiler/dart2js/rti/data/tear_off_generic.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off_generic.dart
@@ -2,10 +2,13 @@
// 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.
-/*!strong.class: A:needsArgs*/
+/*kernel.class: A:needsArgs*/
/*strong.class: A:direct,explicit=[A.T],needsArgs*/
+/*omit.class: A:*/
class A<T> {
- /*element: A.m:needsSignature*/
+ /*kernel.element: A.m:needsSignature*/
+ /*strong.element: A.m:*/
+ /*omit.element: A.m:*/
void m(T t) {}
/*element: A.f:*/
diff --git a/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart b/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
index 887e55f..7437085 100644
--- a/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
+++ b/tests/compiler/dart2js/rti/data/tear_off_generic_strong.dart
@@ -3,9 +3,11 @@
// BSD-style license that can be found in the LICENSE file.
/*strong.class: A:direct,explicit=[A.T],needsArgs*/
-/*omit.class: A:needsArgs*/
+/*omit.class: A:*/
class A<T> {
- /*element: A.m:needsSignature*/
+ /*kernel.element: A.m:needsSignature*/
+ /*strong.element: A.m:*/
+ /*omit.element: A.m:*/
void m(T t) {}
/*element: A.f:*/
diff --git a/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02_strong.dart b/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02_strong.dart
new file mode 100644
index 0000000..ccc9db9
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/generic_methods_dynamic_02_strong.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Based on language/generic_methods_dynamic_test/02
+
+library generic_methods_dynamic_test;
+
+/*class: A:checkedInstance,checks=[],typeArgument*/
+class A {}
+
+/*class: B:checks=[],instance*/
+class B {}
+
+/*class: C:*/
+class C {
+ T foo<T>(T t) => t;
+ List<T> bar<T>(Iterable<T> t) => <T>[t.first];
+}
+
+main() {
+ B b = new B();
+ C c = new C();
+ dynamic obj = c;
+ obj.foo<A>(b);
+}
diff --git a/tests/compiler/dart2js/rti/emission/indirect_through_static.dart b/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
index a80da25..2813753 100644
--- a/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
+++ b/tests/compiler/dart2js/rti/emission/indirect_through_static.dart
@@ -3,15 +3,18 @@
// BSD-style license that can be found in the LICENSE file.
/*kernel.class: A:*/
-/*!kernel.class: A:checkedInstance,checks=[],typeArgument*/
+/*strong.class: A:checkedInstance,checks=[],typeArgument*/
+/*omit.class: A:checkedInstance,checks=[],typeArgument*/
abstract class A {}
/*kernel.class: B:checks=[],typeArgument*/
-/*!kernel.class: B:checks=[$isA],typeArgument*/
+/*strong.class: B:checks=[$isA],typeArgument*/
+/*omit.class: B:checks=[$isA],typeArgument*/
class B implements A {}
/*kernel.class: C:checks=[],instance*/
-/*!kernel.class: C:checkedInstance,checks=[],instance,typeArgument*/
+/*strong.class: C:checkedInstance,checks=[],instance,typeArgument*/
+/*omit.class: C:checkedInstance,checks=[],instance,typeArgument*/
class C<T> {}
final Map<String, C> map = {};
diff --git a/tests/compiler/dart2js/sha1_short_test_vectors.dart b/tests/compiler/dart2js/sha1_short_test_vectors.dart
index a4d8b51..e41844a 100644
--- a/tests/compiler/dart2js/sha1_short_test_vectors.dart
+++ b/tests/compiler/dart2js/sha1_short_test_vectors.dart
@@ -7,7 +7,7 @@
// Standard test vectors from:
// http://csrc.nist.gov/groups/STM/cavp/documents/shs/shabytetestvectors.zip
-const sha1_short_inputs = const [
+const List<List<int>> sha1_short_inputs = const [
const [],
const [0x36],
const [0x19, 0x5a],
diff --git a/tests/compiler/dart2js/sha1_test.dart b/tests/compiler/dart2js/sha1_test.dart
index c2002c9..f431fa6 100644
--- a/tests/compiler/dart2js/sha1_test.dart
+++ b/tests/compiler/dart2js/sha1_test.dart
@@ -569,7 +569,7 @@
expect(digest, sha.close());
}
-void _testStandardVectors(inputs, mds) {
+void _testStandardVectors(List<List<int>> inputs, mds) {
for (var i = 0; i < inputs.length; i++) {
var hash = new SHA1();
hash.add(inputs[i]);
diff --git a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
index 88372a5..6b3a329 100644
--- a/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
+++ b/tests/compiler/dart2js/sourcemaps/helpers/sourcemap_helper.dart
@@ -19,6 +19,7 @@
import 'package:compiler/src/js/js_source_mapping.dart';
import 'package:compiler/src/js_backend/js_backend.dart';
import 'package:compiler/src/source_file_provider.dart';
+import 'package:kernel/ast.dart' as ir;
import '../../memory_compiler.dart';
import '../../output_collector.dart';
@@ -187,7 +188,7 @@
/// A wrapper of [JavaScriptSourceInformationStrategy] that records
/// [RecordedSourceInformationProcess].
class RecordingSourceInformationStrategy
- extends JavaScriptSourceInformationStrategy {
+ extends JavaScriptSourceInformationStrategy<ir.Node> {
final JavaScriptSourceInformationStrategy strategy;
final Map<RecordedSourceInformationProcess, js.Node> processMap =
<RecordedSourceInformationProcess, js.Node>{};
@@ -197,7 +198,8 @@
RecordingSourceInformationStrategy(this.strategy);
@override
- SourceInformationBuilder createBuilderForContext(MemberEntity member) {
+ SourceInformationBuilder<ir.Node> createBuilderForContext(
+ MemberEntity member) {
return strategy.createBuilderForContext(member);
}
diff --git a/tests/compiler/dart2js/sourcemaps/location_collector_test.dart b/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
index f044fba..375f5b2 100644
--- a/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
+++ b/tests/compiler/dart2js/sourcemaps/location_collector_test.dart
@@ -13,9 +13,9 @@
test(List events, Map<int, List<int>> expectedPositions) {
BufferedOutputSink sink = new BufferedOutputSink();
- LocationProvider locationProvider = new LocationCollector();
- // ignore: LIST_ELEMENT_TYPE_NOT_ASSIGNABLE
- CodeOutput output = new StreamCodeOutput(sink, [locationProvider]);
+ LocationCollector locationProvider = new LocationCollector();
+ CodeOutput output =
+ new StreamCodeOutput(sink, <CodeOutputListener>[locationProvider]);
for (var event in events) {
if (event is String) {
output.add(event);
@@ -78,7 +78,7 @@
3: null
});
- Map positions = {
+ Map<int, List<int>> positions = {
0: [0, 0],
1: [0, 1],
2: [1, 0],
diff --git a/tests/compiler/dart2js/uri_retention_test.dart b/tests/compiler/dart2js/uri_retention_test.dart
index eaa6b35..1654612 100644
--- a/tests/compiler/dart2js/uri_retention_test.dart
+++ b/tests/compiler/dart2js/uri_retention_test.dart
@@ -13,7 +13,7 @@
import 'memory_compiler.dart' show runCompiler, OutputCollector;
Future<String> compileSources(sources, {bool minify}) async {
- var options = [];
+ var options = <String>[];
if (minify) options.add(Flags.minify);
OutputCollector outputCollector = new OutputCollector();
await runCompiler(
diff --git a/tests/compiler/dart2js_extra/33572_test.dart b/tests/compiler/dart2js_extra/33572_test.dart
new file mode 100644
index 0000000..b8d475f
--- /dev/null
+++ b/tests/compiler/dart2js_extra/33572_test.dart
@@ -0,0 +1,27 @@
+// 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.
+
+// Regression test for issue 32853.
+
+import "package:expect/expect.dart";
+import "package:meta/dart2js.dart" show noInline;
+
+class A {
+ final x = null;
+ final y;
+ const A(this.y);
+}
+
+main() {
+ var a1 = new A(1);
+ var a2 = const A(2);
+ test(a1, null, 1);
+ test(a2, null, 2);
+}
+
+@noInline
+test(a, expectedX, expectedY) {
+ Expect.equals(expectedX, a.x);
+ Expect.equals(expectedY, a.y);
+}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 1cb40c4..f457fda 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -191,11 +191,13 @@
bit_twiddling_bigint_test: CompileTimeError #Large integer literal. Not representable in JS.
bit_twiddling_test: CompileTimeError # Large integer literal. Not representable in JS.
compare_to2_test: RuntimeError
+date_time_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
double_ceil_test: CompileTimeError # Large integer literal. Not representable in JS.
double_floor_test: CompileTimeError # Large integer literal. Not representable in JS.
double_parse_test/01: RuntimeError
double_round_test: CompileTimeError # Large integer literal. Not representable in JS.
double_truncate_test: CompileTimeError # Large integer literal. Not representable in JS.
+growable_list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
hash_set_test/01: RuntimeError
int_ceil_test: CompileTimeError # Large integer literal. Not representable in JS.
int_ceil_to_double_test: CompileTimeError # Large integer literal. Not representable in JS.
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index d09fc30..1683b0a 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -31,9 +31,37 @@
[ $compiler == dartdevk ]
bigint_from_test: RuntimeError # Issue 32589
+bigint_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_twiddling_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
bool_from_environment2_test/03: Crash
+compare_to2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+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
+growable_list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_ceil_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_ceil_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_floor_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_floor_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+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/modPow: RuntimeError
int_modulo_arith_test/none: RuntimeError
+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_round_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_round_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_to_int_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_truncate_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_truncate_to_double_test: 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
+num_parse_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+num_parse_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+num_sign_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
string_from_environment3_test/03: Crash
[ $compiler == precompiler ]
@@ -212,7 +240,6 @@
symbol_reserved_word_test/03: RuntimeError # Issue 19972, new Symbol('void') should be allowed.
[ $compiler == dart2js && $fast_startup && $fasta && $strong ]
-cast_test: RuntimeError
error_stack_trace1_test: RuntimeError
growable_list_test: RuntimeError
integer_to_radix_string_test/01: RuntimeError
@@ -227,11 +254,37 @@
uri_base_test: Crash # RangeError (index): Invalid value: Valid value range is empty: 0
[ $compiler == dart2js && $fasta ]
-int_parse_radix_int64_test/02: RuntimeError # WontFix: Int not precisely representable in JS
+bigint_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+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
+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
+growable_list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_ceil_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_ceil_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_floor_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_floor_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+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
int_parse_radix_test/01: RuntimeError
+int_round_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_round_to_double_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_to_int_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_truncate_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int_truncate_to_double_test: 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
+num_parse_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+num_parse_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+num_sign_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
[ $compiler == dart2js && $fasta && $host_checked && $strong ]
-cast_test: RuntimeError
error_stack_trace1_test: RuntimeError # Issue 12399
growable_list_test: RuntimeError # Concurrent modifications test always runs
integer_to_radix_string_test/01: RuntimeError
@@ -248,7 +301,6 @@
uri_base_test: RuntimeError
[ $compiler == dart2js && $fasta && $minified && $strong ]
-cast_test: RuntimeError
dynamic_nosuchmethod_test: RuntimeError
error_stack_trace1_test: RuntimeError # Issue 12399
growable_list_test: RuntimeError # Concurrent modifications test always runs
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index ac10795..4c6c2c1 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -335,6 +335,7 @@
deferred_not_loaded_check_test: RuntimeError
deferred_redirecting_factory_test: RuntimeError
deopt_inlined_function_lazy_test: CompileTimeError # Int larger than 64 bits.
+deopt_smi_op_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
double_int_to_string_test: RuntimeError
duplicate_export_negative_test: Fail
duplicate_implements_test/01: MissingCompileTimeError
@@ -387,6 +388,7 @@
left_shift_test: RuntimeError
library_env_test/has_mirror_support: RuntimeError, OK
list_literal4_test: RuntimeError
+list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
main_not_a_function_test/01: CompileTimeError
many_overridden_no_such_method_test: RuntimeError
method_override5_test: RuntimeError
@@ -395,6 +397,7 @@
method_override7_test/02: MissingCompileTimeError
method_override8_test/00: MissingCompileTimeError
method_override8_test/01: MissingCompileTimeError
+mint_arithmetic_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
mint_arithmetic_test: RuntimeError
mint_compares_test: CompileTimeError # Int larger than 64 bits
mixin_forwarding_constructor4_test/01: MissingCompileTimeError
diff --git a/tests/language_2/cascade_test.dart b/tests/language_2/cascade_test.dart
index dca880d..7208093 100644
--- a/tests/language_2/cascade_test.dart
+++ b/tests/language_2/cascade_test.dart
@@ -40,7 +40,7 @@
return null;
}
- int operator []=(int i, int value) {
+ operator []=(int i, int value) {
if (i == 0) {
x = value;
} else if (i == 1) {
diff --git a/tests/language_2/const_constructor_nonconst_param_test.dart b/tests/language_2/const_constructor_nonconst_param_test.dart
new file mode 100644
index 0000000..aae46a6
--- /dev/null
+++ b/tests/language_2/const_constructor_nonconst_param_test.dart
@@ -0,0 +1,18 @@
+// 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 A {
+ const A(int a);
+}
+
+class B {
+ final a; // //# 01: compile-time error
+ const B(dynamic v) //
+ : a = A(v) //# 01: continued
+ ;
+}
+
+void main() {
+ const B("");
+}
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index a8deafd..8ad3271 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -10,7 +10,6 @@
bad_initializer2_negative_test: Fail # Issue 14880
built_in_identifier_prefix_test: CompileTimeError
built_in_identifier_type_annotation_test/dynamic-gen: MissingCompileTimeError # Issue 28813
-cascade_test/none: Fail # Issue 11577
config_import_corelib_test: StaticWarning, OK
conflicting_type_variable_and_setter_test: CompileTimeError # Issue 25525
const_cast2_test/01: CompileTimeError
@@ -34,7 +33,6 @@
final_syntax_test/04: Fail # Issue 11124
function_type_parameter2_negative_test: CompileTimeError
function_type_parameter_negative_test: CompileTimeError
-generic_function_type_as_type_argument_test/01: MissingCompileTimeError # Issue 30929
generic_function_type_as_type_argument_test/02: MissingCompileTimeError # Issue 30929
generic_local_functions_test: CompileTimeError # Issue 28515
generic_methods_generic_function_parameter_test: CompileTimeError # Issue 28515
@@ -237,6 +235,30 @@
void_type_usage_test/paren_literal_map_value_init: MissingCompileTimeError
void_type_usage_test/paren_return: MissingCompileTimeError
void_type_usage_test/paren_void_init: MissingCompileTimeError
+web_int_literals_test/01: MissingCompileTimeError
+web_int_literals_test/02: MissingCompileTimeError
+web_int_literals_test/03: MissingCompileTimeError
+web_int_literals_test/10: MissingCompileTimeError
+web_int_literals_test/11: MissingCompileTimeError
+web_int_literals_test/12: MissingCompileTimeError
+web_int_literals_test/13: MissingCompileTimeError
+web_int_literals_test/14: MissingCompileTimeError
+web_int_literals_test/20: MissingCompileTimeError
+web_int_literals_test/21: MissingCompileTimeError
+web_int_literals_test/22: MissingCompileTimeError
+web_int_literals_test/23: MissingCompileTimeError
+web_int_literals_test/24: MissingCompileTimeError
+web_int_literals_test/25: MissingCompileTimeError
+web_int_literals_test/26: MissingCompileTimeError
+web_int_literals_test/27: MissingCompileTimeError
+web_int_literals_test/28: MissingCompileTimeError
+web_int_literals_test/29: MissingCompileTimeError
+web_int_literals_test/61: MissingCompileTimeError
+web_int_literals_test/62: MissingCompileTimeError
+web_int_literals_test/63: MissingCompileTimeError
+web_int_literals_test/64: MissingCompileTimeError
+web_int_literals_test/65: MissingCompileTimeError
+web_int_literals_test/70: MissingCompileTimeError
[ $compiler == dart2analyzer && $runtime == none ]
error_stacktrace_test/00: MissingCompileTimeError
@@ -1170,6 +1192,8 @@
string_unicode3_negative_test: CompileTimeError
string_unicode4_negative_test: CompileTimeError
super_bound_closure_test/none: CompileTimeError
+super_no_such_method4_test/01: MissingCompileTimeError # Issue 33553
+super_no_such_method5_test/01: MissingCompileTimeError # Issue 33553
super_setter_test: StaticWarning # Issue 28823
switch_case_test/none: CompileTimeError
syntax_test/60: MissingCompileTimeError
@@ -1353,7 +1377,6 @@
generic_constructor_mixin_test/01: MissingCompileTimeError
generic_field_mixin6_test/01: MissingCompileTimeError
generic_function_typedef2_test/04: MissingCompileTimeError
-generic_methods_generic_function_result_test/01: MissingCompileTimeError # Issue #30207
generic_methods_overriding_test/01: MissingCompileTimeError
generic_test/01: MissingCompileTimeError
identical_const_test/01: MissingCompileTimeError
@@ -1628,6 +1651,8 @@
string_test/01: MissingCompileTimeError
substring_test/01: MissingCompileTimeError
super_assign_test/01: MissingCompileTimeError
+super_no_such_method4_test/01: MissingCompileTimeError # Requires Dart 2 semantics, related to issue 33553.
+super_no_such_method5_test/01: MissingCompileTimeError # Requires Dart 2 semantics, related to issue 33553.
symbol_literal_test/01: MissingCompileTimeError
sync_generator1_test/01: MissingCompileTimeError
syntax_test/59: MissingCompileTimeError
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index ef32963..a79000f 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -58,17 +58,8 @@
field_type_check2_test/01: MissingRuntimeError
regress_23996_test: RuntimeError # Jsshell does not provide non-zero timers, Issue 7728
-[ $compiler == dart2js && $runtime != none ]
-covariant_tear_off_type_test: RuntimeError
-
[ $compiler == dart2js && $runtime != none && $checked ]
assert_with_message_test: RuntimeError
-function_subtype_bound_closure3_test: RuntimeError
-function_subtype_bound_closure4_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast1_test: RuntimeError
-function_subtype_not1_test: RuntimeError
function_type/function_type0_test: RuntimeError # Issue 30476
function_type/function_type10_test: RuntimeError # Issue 30476
function_type/function_type12_test: RuntimeError # Issue 30476
@@ -140,8 +131,6 @@
function_type/function_type90_test: RuntimeError # Issue 30476
function_type/function_type96_test: RuntimeError # Issue 30476
function_type/function_type9_test: RuntimeError # Issue 30476
-function_type_alias2_test: RuntimeError
-function_type_alias4_test: RuntimeError
syncstar_covariant_type_test: RuntimeError # dart2js misplaces check in Iterator, not Iterable.
syncstar_dcall_type_test: RuntimeError # dart2js misplaces check in Iterator, not Iterable.
@@ -319,8 +308,6 @@
full_stacktrace2_test: RuntimeError # Issue 12698
full_stacktrace3_test: RuntimeError # Issue 12698
generalized_void_syntax_test: CompileTimeError # Issue #30176.
-generic_closure_test/01: RuntimeError
-generic_closure_test/none: RuntimeError
generic_function_dcall_test: Crash # Unsupported operation: Unsupported type parameter type node T.
generic_tearoff_test: Crash # Unsupported operation: Unsupported type parameter type node T.
generic_typedef_test: RuntimeError
@@ -516,13 +503,9 @@
[ $compiler == dart2js && !$checked && $fasta ]
bool_check_test: RuntimeError
bool_condition_check_test: RuntimeError
-forwarding_stub_tearoff_generic_test: RuntimeError
-forwarding_stub_tearoff_test: RuntimeError
-issue31596_implement_covariant_test: RuntimeError
issue31596_super_test/02: MissingCompileTimeError
issue31596_super_test/04: MissingCompileTimeError
issue31596_super_test/05: RuntimeError
-issue31596_test: RuntimeError
[ $compiler == dart2js && $fast_startup ]
library_env_test/has_mirror_support: Fail # mirrors not supported
@@ -570,15 +553,12 @@
constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
covariance_type_parameter_test/02: RuntimeError
-covariant_override/tear_off_type_test: RuntimeError
covariant_subtyping_test: Crash # Unsupported operation: Unsupported type parameter type node E.
cyclic_constructor_test/01: Crash # Stack Overflow
cyclic_type_test/00: RuntimeError
cyclic_type_test/02: RuntimeError
cyclic_type_test/03: RuntimeError
cyclic_type_test/04: RuntimeError
-cyclic_typedef_test/10: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/out/ReleaseX64/generated_tests/language_2/cyclic_typedef_test_10.dart,
-cyclic_typedef_test/11: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/out/ReleaseX64/generated_tests/language_2/cyclic_typedef_test_11.dart,
deferred_inheritance_constraints_test/extends: MissingCompileTimeError
deferred_inheritance_constraints_test/implements: MissingCompileTimeError
deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
@@ -614,30 +594,15 @@
full_stacktrace1_test: RuntimeError # Issue 12698
full_stacktrace2_test: RuntimeError # Issue 12698
full_stacktrace3_test: RuntimeError # Issue 12698
-function_subtype3_test: RuntimeError
-function_subtype_bound_closure3_test: RuntimeError
-function_subtype_bound_closure4_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast1_test: RuntimeError
function_subtype_inline2_test: RuntimeError
-function_subtype_not1_test: RuntimeError
function_subtype_setter0_test: RuntimeError
-function_type_alias2_test: RuntimeError
-function_type_alias4_test: RuntimeError
-generic_closure_test/01: RuntimeError
-generic_closure_test/none: RuntimeError
generic_function_bounds_test: RuntimeError
generic_function_dcall_test: RuntimeError
generic_function_type_as_type_argument_test/01: MissingCompileTimeError
generic_function_type_as_type_argument_test/02: MissingCompileTimeError
generic_instanceof2_test: RuntimeError
generic_is_check_test: RuntimeError
-generic_method_types_test/02: RuntimeError
generic_methods_bounds_test/02: MissingRuntimeError
-generic_methods_dynamic_test/02: MissingRuntimeError
-generic_methods_dynamic_test/04: MissingRuntimeError
-generic_methods_generic_class_tearoff_test: RuntimeError
generic_methods_generic_function_result_test/01: MissingCompileTimeError
generic_methods_unused_parameter_test: RuntimeError
generic_no_such_method_dispatcher_simple_test: CompileTimeError
@@ -759,7 +724,6 @@
nested_generic_closure_test: RuntimeError
no_main_test/01: CompileTimeError
no_such_method_mock_test: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_arguments_test: RuntimeError
null_no_such_method_test: CompileTimeError
number_identity2_test: RuntimeError
numbers_test: RuntimeError, OK # non JS number semantics
@@ -775,7 +739,6 @@
redirecting_factory_default_values_test/01: MissingCompileTimeError
redirecting_factory_default_values_test/02: MissingCompileTimeError
redirecting_factory_reflection_test: RuntimeError
-regress_23089_test: Crash # Crash when compiling file:///usr/local/google/home/sra/Dart/sdk/tests/language_2/regress_23089_test.dart,
regress_23408_test: CompileTimeError
regress_24283_test: RuntimeError # non JS number semantics
regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
@@ -785,7 +748,6 @@
regress_29784_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in () for j:constructor(A.ok).
regress_29784_test/02: MissingCompileTimeError # Issue 29784
regress_30339_test: CompileTimeError
-runtime_type_function_test: RuntimeError
setter_no_getter_test/01: CompileTimeError
setter_override_test/00: MissingCompileTimeError
setter_override_test/03: MissingCompileTimeError
@@ -799,9 +761,6 @@
string_supertype_checked_test: CompileTimeError
super_bound_closure_test/none: CompileTimeError
super_call4_test/01: MissingCompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
super_test: RuntimeError
switch_bad_case_test/01: MissingCompileTimeError
switch_bad_case_test/02: MissingCompileTimeError
@@ -832,6 +791,10 @@
type_variable_promotion_test: RuntimeError
[ $compiler == dart2js && $fasta ]
+arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_operations_test/03: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_operations_test/04: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_operations_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
call_method_as_cast_test/06: RuntimeError
call_method_implicit_tear_off_implements_function_test/05: RuntimeError
call_method_implicit_tear_off_implements_function_test/06: RuntimeError
@@ -840,13 +803,31 @@
call_method_must_not_be_getter_test/03: RuntimeError # Issue 32155
checked_setter2_test: RuntimeError # Issue 31128
checked_setter_test: RuntimeError # Issue 31128
+const_constructor_nonconst_param_test/01: MissingCompileTimeError
const_dynamic_type_literal_test/03: Pass # but it shouldn't until we fix issue 17207
constructor_redirect_cycle_test/01: Crash # Stack Overflow
constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
+deopt_inlined_function_lazy_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+deopt_smi_op_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
duplicate_interface_implements_test/01: MissingCompileTimeError
function_propagation_test: RuntimeError
generic_test/01: MissingCompileTimeError # front end does not validate `extends`
+guess_cid_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+identical_closure2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
instantiate_tearoff_of_call_test: RuntimeError
+int2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/02: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/04: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/05: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/10: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/20: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/40: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+int64_literal_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+mint_arithmetic_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+mint_compares_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+mint_identical_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
mixin_type_parameter_inference_error_test/none: CompileTimeError
mixin_type_parameter_inference_previous_mixin_test/01: CompileTimeError
mixin_type_parameter_inference_previous_mixin_test/02: CompileTimeError
@@ -862,6 +843,7 @@
mixin_type_parameter_inference_test/13: CompileTimeError
mixin_type_parameter_inference_test/16: CompileTimeError
mixin_type_parameter_inference_test/none: CompileTimeError
+number_identity_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
partial_tearoff_instantiation_test/05: Pass # for the wrong reason.
partial_tearoff_instantiation_test/06: Pass # for the wrong reason.
partial_tearoff_instantiation_test/07: Pass # for the wrong reason.
@@ -935,7 +917,6 @@
constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
covariance_type_parameter_test/02: RuntimeError
-covariant_override/tear_off_type_test: RuntimeError
covariant_subtyping_test: RuntimeError
cyclic_constructor_test/01: Crash # Issue 30856
cyclic_type_test/00: RuntimeError
@@ -946,8 +927,6 @@
cyclic_type_variable_test/02: MissingCompileTimeError
cyclic_type_variable_test/03: MissingCompileTimeError
cyclic_type_variable_test/04: MissingCompileTimeError
-cyclic_typedef_test/10: Crash # Stack Overflow
-cyclic_typedef_test/11: Crash # Stack Overflow
default_factory2_test/01: MissingCompileTimeError
default_factory_test/01: MissingCompileTimeError
deferred_inheritance_constraints_test/extends: MissingCompileTimeError
@@ -992,31 +971,16 @@
full_stacktrace1_test: RuntimeError # Issue 12698
full_stacktrace2_test: RuntimeError # Issue 12698
full_stacktrace3_test: RuntimeError # Issue 12698
-function_subtype3_test: RuntimeError
-function_subtype_bound_closure3_test: RuntimeError
-function_subtype_bound_closure4_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast1_test: RuntimeError
function_subtype_inline2_test: RuntimeError
-function_subtype_not1_test: RuntimeError
function_subtype_setter0_test: RuntimeError
-function_type_alias2_test: RuntimeError
-function_type_alias4_test: RuntimeError
-generic_closure_test/01: RuntimeError
-generic_closure_test/none: RuntimeError
generic_function_bounds_test: RuntimeError
generic_function_dcall_test: RuntimeError
generic_function_type_as_type_argument_test/01: MissingCompileTimeError
generic_function_type_as_type_argument_test/02: MissingCompileTimeError
generic_instanceof2_test: RuntimeError
generic_is_check_test: RuntimeError
-generic_method_types_test/02: RuntimeError
generic_methods_bounds_test/01: MissingCompileTimeError
generic_methods_bounds_test/02: MissingRuntimeError
-generic_methods_dynamic_test/02: MissingRuntimeError
-generic_methods_dynamic_test/04: MissingRuntimeError
-generic_methods_generic_class_tearoff_test: RuntimeError
generic_methods_generic_function_result_test/01: MissingCompileTimeError
generic_methods_overriding_test/01: MissingCompileTimeError
generic_methods_recursive_bound_test/02: MissingCompileTimeError
@@ -1198,7 +1162,6 @@
nested_generic_closure_test: RuntimeError
no_main_test/01: CompileTimeError
no_such_method_mock_test: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_arguments_test: RuntimeError
null_no_such_method_test: CompileTimeError
number_identity2_test: RuntimeError
numbers_test: RuntimeError, OK # non JS number semantics
@@ -1229,7 +1192,6 @@
redirecting_factory_reflection_test: RuntimeError
regress_13462_1_test: RuntimeError
regress_18535_test: RuntimeError
-regress_23089_test: Crash # Stack Overflow
regress_23408_test: CompileTimeError
regress_24283_test: RuntimeError # non JS number semantics
regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
@@ -1239,7 +1201,6 @@
regress_29784_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in () for j:constructor(A.ok).
regress_29784_test/02: MissingCompileTimeError # Issue 29784
regress_30339_test: CompileTimeError
-runtime_type_function_test: RuntimeError
setter4_test: MissingCompileTimeError
setter_no_getter_test/01: CompileTimeError
setter_override_test/00: MissingCompileTimeError
@@ -1256,9 +1217,6 @@
string_supertype_checked_test: CompileTimeError
super_bound_closure_test/none: CompileTimeError
super_call4_test/01: MissingCompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
super_test: RuntimeError
switch_bad_case_test/01: MissingCompileTimeError
switch_bad_case_test/02: MissingCompileTimeError
@@ -1441,15 +1399,12 @@
constructor_redirect_indirect_cycle_test/01: Crash # Stack Overflow
constructor_redirect_test/01: Crash # Assertion failure: Cannot find value Instance of 'ThisLocal' in (local(A.named2#x), local(A.named2#y), local(A.named2#z)) for j:constructor(A.named2).
covariance_type_parameter_test/02: RuntimeError
-covariant_override/tear_off_type_test: RuntimeError
covariant_subtyping_test: RuntimeError
cyclic_constructor_test/01: Crash # Issue 30856
cyclic_type_variable_test/01: MissingCompileTimeError
cyclic_type_variable_test/02: MissingCompileTimeError
cyclic_type_variable_test/03: MissingCompileTimeError
cyclic_type_variable_test/04: MissingCompileTimeError
-cyclic_typedef_test/10: Crash # Stack Overflow
-cyclic_typedef_test/11: Crash # Stack Overflow
default_factory2_test/01: MissingCompileTimeError
default_factory_test/01: MissingCompileTimeError
deferred_inheritance_constraints_test/extends: MissingCompileTimeError
@@ -1494,29 +1449,16 @@
full_stacktrace1_test: RuntimeError # Issue 12698
full_stacktrace2_test: RuntimeError # Issue 12698
full_stacktrace3_test: RuntimeError # Issue 12698
-function_subtype3_test: RuntimeError
-function_subtype_bound_closure3_test: RuntimeError
-function_subtype_bound_closure4_test: RuntimeError
-function_subtype_call1_test: RuntimeError
-function_subtype_call2_test: RuntimeError
-function_subtype_cast1_test: RuntimeError
function_subtype_inline2_test: RuntimeError
-function_subtype_not1_test: RuntimeError
function_subtype_setter0_test: RuntimeError
-function_type_alias2_test: RuntimeError
-function_type_alias4_test: RuntimeError
generic_function_bounds_test: RuntimeError
generic_function_dcall_test: RuntimeError
generic_function_type_as_type_argument_test/01: MissingCompileTimeError
generic_function_type_as_type_argument_test/02: MissingCompileTimeError
generic_instanceof2_test: RuntimeError
generic_is_check_test: RuntimeError
-generic_method_types_test/02: RuntimeError
generic_methods_bounds_test/01: MissingCompileTimeError
generic_methods_bounds_test/02: MissingRuntimeError
-generic_methods_dynamic_test/02: MissingRuntimeError
-generic_methods_dynamic_test/04: MissingRuntimeError
-generic_methods_generic_class_tearoff_test: RuntimeError
generic_methods_generic_function_result_test/01: MissingCompileTimeError
generic_methods_overriding_test/01: MissingCompileTimeError
generic_methods_recursive_bound_test/02: MissingCompileTimeError
@@ -1706,7 +1648,6 @@
no_such_method_mock_test: RuntimeError
no_such_method_native_test: RuntimeError
no_such_method_test: RuntimeError
-nosuchmethod_forwarding/nosuchmethod_forwarding_arguments_test: RuntimeError
null_no_such_method_test: CompileTimeError
number_identity2_test: RuntimeError
numbers_test: RuntimeError, OK # non JS number semantics
@@ -1736,7 +1677,6 @@
regress_13462_1_test: RuntimeError
regress_18535_test: RuntimeError
regress_21795_test: RuntimeError # Issue 12605
-regress_23089_test: Crash # Stack Overflow
regress_23408_test: CompileTimeError
regress_24283_test: RuntimeError, OK # Requires 64 bit numbers.
regress_27617_test/1: Crash # Assertion failure: Unexpected constructor j:constructor(Foo._) in ConstructorDataImpl._getConstructorConstant
@@ -1746,7 +1686,6 @@
regress_29784_test/01: Crash # Issue 29784
regress_29784_test/02: MissingCompileTimeError # Issue 29784
regress_30339_test: CompileTimeError
-runtime_type_function_test: RuntimeError
setter4_test: MissingCompileTimeError
setter_no_getter_test/01: CompileTimeError
setter_override_test/00: MissingCompileTimeError
@@ -1764,9 +1703,6 @@
string_supertype_checked_test: CompileTimeError
super_bound_closure_test/none: CompileTimeError
super_call4_test/01: MissingCompileTimeError
-super_operator_index6_test: CompileTimeError
-super_operator_index7_test: CompileTimeError
-super_operator_index8_test: CompileTimeError
super_test: RuntimeError
switch_bad_case_test/01: MissingCompileTimeError
switch_bad_case_test/02: MissingCompileTimeError
@@ -1861,7 +1797,7 @@
cyclic_type2_test: RuntimeError # Issue 31054
cyclic_type_test/0*: RuntimeError # Issue 31054
f_bounded_quantification5_test: RuntimeError # Issue 31054
-generic_closure_test: RuntimeError # Issue 31054
+generic_closure_test/01: RuntimeError # Uses runtimeType.toString()
mixin_mixin2_test: RuntimeError # Issue 31054
mixin_mixin3_test: RuntimeError # Issue 31054
mixin_mixin4_test: RuntimeError # Issue 31054
@@ -1870,3 +1806,4 @@
mixin_mixin_bound2_test: RuntimeError # Issue 31054
mixin_mixin_bound_test: RuntimeError # Issue 31054
mixin_mixin_type_arguments_test: RuntimeError # Issue 31054
+runtime_type_function_test: RuntimeError # Uses runtimeType.toString()
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index dccaa3a..7160089 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -162,6 +162,8 @@
string_supertype_checked_test: CompileTimeError
super_bound_closure_test/none: CompileTimeError
super_call4_test/01: MissingCompileTimeError
+super_no_such_method4_test/01: MissingCompileTimeError # Requires Dart 2 semantics. See http://dartbug.com/33380.
+super_no_such_method5_test/01: MissingCompileTimeError # Requires Dart 2 semantics. See http://dartbug.com/33380.
super_operator_index5_test: RuntimeError # 33470
super_operator_index7_test: RuntimeError # 33470
super_operator_index8_test: RuntimeError # 33470
@@ -282,10 +284,35 @@
void_type_usage_test/paren_literal_map_value_init: MissingCompileTimeError
void_type_usage_test/paren_return: MissingCompileTimeError
void_type_usage_test/paren_void_init: MissingCompileTimeError
+web_int_literals_test/01: MissingCompileTimeError
+web_int_literals_test/02: MissingCompileTimeError
+web_int_literals_test/03: MissingCompileTimeError
+web_int_literals_test/10: MissingCompileTimeError
+web_int_literals_test/11: MissingCompileTimeError
+web_int_literals_test/12: MissingCompileTimeError
+web_int_literals_test/13: MissingCompileTimeError
+web_int_literals_test/14: MissingCompileTimeError
+web_int_literals_test/20: MissingCompileTimeError
+web_int_literals_test/21: MissingCompileTimeError
+web_int_literals_test/22: MissingCompileTimeError
+web_int_literals_test/23: MissingCompileTimeError
+web_int_literals_test/24: MissingCompileTimeError
+web_int_literals_test/25: MissingCompileTimeError
+web_int_literals_test/26: MissingCompileTimeError
+web_int_literals_test/27: MissingCompileTimeError
+web_int_literals_test/28: MissingCompileTimeError
+web_int_literals_test/29: MissingCompileTimeError
+web_int_literals_test/61: MissingCompileTimeError
+web_int_literals_test/62: MissingCompileTimeError
+web_int_literals_test/63: MissingCompileTimeError
+web_int_literals_test/64: MissingCompileTimeError
+web_int_literals_test/65: MissingCompileTimeError
+web_int_literals_test/70: MissingCompileTimeError
[ $compiler == dartdevk ]
additional_interface_adds_optional_args_concrete_subclass_test: MissingCompileTimeError
additional_interface_adds_optional_args_concrete_test: MissingCompileTimeError
+arithmetic_int64_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
async_or_generator_return_type_stacktrace_test/01: MissingCompileTimeError
async_or_generator_return_type_stacktrace_test/02: MissingCompileTimeError
async_or_generator_return_type_stacktrace_test/03: MissingCompileTimeError
@@ -294,6 +321,9 @@
bad_override_test/01: MissingCompileTimeError
bad_override_test/02: MissingCompileTimeError
bad_override_test/03: MissingCompileTimeError
+bit_operations_test/03: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_operations_test/04: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+bit_operations_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
built_in_identifier_type_annotation_test/dynamic-funarg: RuntimeError # Issue 30450, test name contains hyphen
built_in_identifier_type_annotation_test/dynamic-funret: RuntimeError # Issue 30450, test name contains hyphen
built_in_identifier_type_annotation_test/dynamic-list: RuntimeError # Issue 30450, test name contains hyphen
@@ -326,6 +356,7 @@
const_cast1_test/02: MissingCompileTimeError
const_constructor3_test/04: MissingCompileTimeError
const_constructor_nonconst_field_test/01: MissingCompileTimeError
+const_constructor_nonconst_param_test/01: MissingCompileTimeError
const_dynamic_type_literal_test/02: MissingCompileTimeError
const_instance_field_test/01: MissingCompileTimeError
const_map2_test/00: MissingCompileTimeError
@@ -343,8 +374,6 @@
cyclic_type_variable_test/02: MissingCompileTimeError
cyclic_type_variable_test/03: MissingCompileTimeError
cyclic_type_variable_test/04: MissingCompileTimeError
-cyclic_typedef_test/10: Crash
-cyclic_typedef_test/11: Crash
default_factory2_test/01: MissingCompileTimeError
default_factory_test/01: MissingCompileTimeError
deferred_inheritance_constraints_test/extends: MissingCompileTimeError
@@ -352,6 +381,8 @@
deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError
deferred_load_library_wrong_args_test/01: CompileTimeError
+deopt_inlined_function_lazy_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+deopt_smi_op_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
double_identical_test: RuntimeError # Negative and positive zero are distinct, but not in ddk
duplicate_implements_test/01: MissingCompileTimeError
duplicate_implements_test/02: MissingCompileTimeError
@@ -377,6 +408,7 @@
function_type_parameter2_negative_test: Fail
function_type_parameter_negative_test: Fail
generic_function_bounds_test: RuntimeError
+generic_function_type_as_type_argument_test/01: MissingCompileTimeError # Issue 29920
generic_methods_generic_function_result_test/01: MissingCompileTimeError
generic_methods_overriding_test/01: MissingCompileTimeError # Issue 29920
generic_methods_recursive_bound_test/02: MissingCompileTimeError
@@ -387,6 +419,8 @@
getter_override_test/01: MissingCompileTimeError
getter_override_test/02: MissingCompileTimeError
getter_override_test/03: MissingCompileTimeError
+guess_cid_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+identical_closure2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
identical_const_test/01: MissingCompileTimeError
identical_const_test/02: MissingCompileTimeError
identical_const_test/03: MissingCompileTimeError
@@ -403,6 +437,7 @@
implicit_creation/implicit_const_not_default_values_test/e6: Pass
implicit_creation/implicit_const_not_default_values_test/e9: Pass
instantiate_tearoff_of_call_test: CompileTimeError
+int2_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
issue18628_2_test/01: MissingCompileTimeError
issue31596_override_test/07: MissingCompileTimeError
issue31596_override_test/08: MissingCompileTimeError
@@ -411,6 +446,7 @@
issue31596_super_test/03: CompileTimeError
issue31596_super_test/04: MissingCompileTimeError
issue31596_super_test/05: RuntimeError
+list_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
malbounded_instantiation_test/01: MissingCompileTimeError
malbounded_instantiation_test/02: MissingCompileTimeError
malbounded_instantiation_test/03: MissingCompileTimeError
@@ -434,6 +470,9 @@
method_override7_test/01: MissingCompileTimeError
method_override7_test/02: MissingCompileTimeError
method_override_test: CompileTimeError # Issue 31616
+mint_arithmetic_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+mint_compares_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+mint_identical_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
mixin_forwarding_constructor4_test/01: MissingCompileTimeError
mixin_forwarding_constructor4_test/02: MissingCompileTimeError
mixin_forwarding_constructor4_test/03: MissingCompileTimeError
@@ -515,6 +554,7 @@
named_parameters_default_eq_test/02: MissingCompileTimeError
no_such_method_mock_test: RuntimeError # Issue 31426 - Kernel does not introduce nSM for implemented fields.
null_no_such_method_test: CompileTimeError # Issue 31533
+number_identity_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
override_field_test/01: MissingCompileTimeError
override_field_test/02: MissingCompileTimeError
override_inheritance_field_test/04: CompileTimeError # Issue 31616
@@ -534,15 +574,14 @@
redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
redirecting_factory_malbounded_test/01: MissingCompileTimeError
redirecting_factory_reflection_test: RuntimeError # UnimplementedError: node <InvalidExpression> `invalid-expression`
-regress_23089_test: Crash # Crashes in KernelClassBuilder.buildTypeArguments
regress_23408_test: CompileTimeError # Issue 31533
regress_24283_test: RuntimeError # Expect.equals(expected: <-1>, actual: <4294967295>) fails.
regress_29025_test: CompileTimeError
regress_29405_test: CompileTimeError # Issue 31402 Error: A value of type '#lib2::Foo' can't be assigned to a variable of type '(#lib2::Foo) → void'.
regress_29784_test/01: MissingCompileTimeError
regress_29784_test/02: MissingCompileTimeError
-regress_30339_test: CompileTimeError
regress_30339_test: RuntimeError # Uncaught Expect.isTrue(false) fails.
+regress_30339_test: CompileTimeError
setter4_test: MissingCompileTimeError
setter_no_getter_test/01: CompileTimeError
setter_override_test/00: MissingCompileTimeError
@@ -553,9 +592,6 @@
string_supertype_checked_test: CompileTimeError # Issue 31616
super_bound_closure_test/none: CompileTimeError # Issue 31533
super_call4_test/01: MissingCompileTimeError
-super_operator_index6_test: CompileTimeError # Issue 33498
-super_operator_index7_test: CompileTimeError # Issue 33498
-super_operator_index8_test: CompileTimeError # Issue 33498
switch_bad_case_test/01: MissingCompileTimeError
switch_bad_case_test/02: MissingCompileTimeError
switch_case_test/00: MissingCompileTimeError
@@ -655,7 +691,6 @@
flatten_test/12: MissingRuntimeError # Issue 29920
for_variable_capture_test: RuntimeError # Issue 29920; Expect.equals(expected: <1>, actual: <0>) fails.
function_subtype_inline2_test: RuntimeError # Expect.fail('Missing type error: 'new C.c1(m2)'.')
-generic_function_type_as_type_argument_test/01: MissingCompileTimeError # Issue 29920
generic_function_type_as_type_argument_test/02: MissingCompileTimeError # Issue 29920
generic_instanceof2_test: RuntimeError # Issue 29920; ReferenceError: FooOfK$String is not defined
generic_is_check_test: RuntimeError # Issue 29920; Expect.isTrue(false) fails.
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index cca8c17..533ae5ff 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -48,8 +48,6 @@
cyclic_type2_test: CompileTimeError
cyclic_type_test/02: CompileTimeError
cyclic_type_test/04: CompileTimeError
-cyclic_typedef_test/10: DartkCrash
-cyclic_typedef_test/11: DartkCrash
deferred_call_empty_before_load_test: RuntimeError
deferred_load_constants_test/none: RuntimeError
deferred_not_loaded_check_test: RuntimeError
@@ -141,7 +139,6 @@
override_inheritance_method_test/29: CompileTimeError
parser_quirks_test: CompileTimeError
regress_22443_test: RuntimeError
-regress_23089_test: DartkCrash
regress_23408_test: CompileTimeError
regress_29025_test: CompileTimeError
regress_29405_test: CompileTimeError
@@ -167,6 +164,7 @@
type_promotion_functions_test/none: CompileTimeError
type_promotion_more_specific_test/04: CompileTimeError
vm/type_cast_vm_test: RuntimeError
+web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
[ $compiler == dartkp ]
class_cycle_test/02: MissingCompileTimeError
@@ -176,6 +174,7 @@
duplicate_implements_test/02: MissingCompileTimeError
generic_methods_generic_function_result_test/01: MissingCompileTimeError
generic_no_such_method_dispatcher_test: RuntimeError # Issue 31424
+web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
[ $compiler == fasta ]
assertion_initializer_const_error2_test/cc01: MissingCompileTimeError
@@ -189,6 +188,7 @@
assertion_initializer_const_error2_test/cc09: MissingCompileTimeError
assertion_initializer_const_error2_test/cc10: MissingCompileTimeError
const_cast1_test/02: MissingCompileTimeError
+const_constructor_nonconst_param_test/01: MissingCompileTimeError
generic_test/01: MissingCompileTimeError
implicit_creation/implicit_const_not_default_values_test/e1: MissingCompileTimeError
implicit_creation/implicit_const_not_default_values_test/e10: MissingCompileTimeError
@@ -214,6 +214,7 @@
vm/regress_33469_test/02: MissingCompileTimeError
vm/regress_33469_test/03: MissingCompileTimeError
vm/regress_33469_test/04: MissingCompileTimeError
+web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
[ $fasta ]
abstract_override_adds_optional_args_concrete_subclass_test: MissingCompileTimeError # Issue 32014.
@@ -740,8 +741,6 @@
cyclic_type2_test: RuntimeError, CompileTimeError
cyclic_type_test/02: RuntimeError, CompileTimeError
cyclic_type_test/04: RuntimeError, CompileTimeError
-cyclic_typedef_test/10: Crash # Issue 32416.
-cyclic_typedef_test/11: Crash # Issue 32416.
deferred_call_empty_before_load_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
deferred_load_constants_test/none: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
@@ -817,7 +816,6 @@
redirecting_factory_infinite_steps_test/01: MissingCompileTimeError
redirecting_factory_malbounded_test/01: MissingCompileTimeError
regress_22443_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
-regress_23089_test: Crash # Issue 32417.
regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
regress_23408_test: RuntimeError
regress_29025_test: CompileTimeError # Issue 31402 (Variable declaration)
@@ -848,6 +846,7 @@
void_type_usage_test/conditional2_return_to_void: MissingCompileTimeError
void_type_usage_test/conditional3_return_to_void: MissingCompileTimeError
void_type_usage_test/conditional_return_to_void: MissingCompileTimeError
+web_int_literals_test/*: SkipByDesign # Test applies only to JavaScript targets
wrong_number_type_arguments_test/01: MissingCompileTimeError
wrong_number_type_arguments_test/none: Pass
@@ -905,7 +904,6 @@
vm/type_vm_test/36: MissingRuntimeError
[ $compiler == dartkp && $runtime == dart_precompiled ]
-super_no_such_method5_test: RuntimeError # Issue 33517
type_alias_equality_test/02: RuntimeError # Issue 31359
type_alias_equality_test/03: RuntimeError # Issue 31359
type_alias_equality_test/04: RuntimeError # Issue 31359
@@ -1038,8 +1036,6 @@
cyclic_type2_test: Fail, OK
cyclic_type_test/02: Fail, OK # Non-contractive types are not supported in the vm.
cyclic_type_test/04: Fail, OK
-cyclic_typedef_test/10: Crash # Issue 32416.
-cyclic_typedef_test/11: Crash # Issue 32416.
deferred_call_empty_before_load_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273.
deferred_load_constants_test/none: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273.
@@ -1168,7 +1164,6 @@
regress_13462_1_test: SkipByDesign
regress_18535_test: SkipByDesign
regress_22443_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
-regress_23089_test: Crash # Issue 32417.
regress_23408_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
regress_23408_test: RuntimeError
regress_28255_test: SkipByDesign
@@ -1281,8 +1276,6 @@
config_import_test: Crash
const_constructor3_test/04: MissingCompileTimeError
constants_test/05: MissingCompileTimeError
-cyclic_typedef_test/10: Crash
-cyclic_typedef_test/11: Crash
deferred_load_library_wrong_args_test/01: CompileTimeError
duplicate_implements_test/01: MissingCompileTimeError
duplicate_implements_test/02: MissingCompileTimeError
@@ -1365,7 +1358,6 @@
override_inheritance_method_test/28: CompileTimeError
override_inheritance_method_test/29: CompileTimeError
parser_quirks_test: CompileTimeError
-regress_23089_test: Crash
regress_23408_test: CompileTimeError
regress_29025_test: CompileTimeError
regress_29405_test: CompileTimeError
@@ -1376,9 +1368,6 @@
string_split_test: CompileTimeError
string_supertype_checked_test: CompileTimeError
super_bound_closure_test/none: CompileTimeError
-super_operator_index6_test: CompileTimeError # Issue 33498
-super_operator_index7_test: CompileTimeError # Issue 33498
-super_operator_index8_test: CompileTimeError # Issue 33498
try_catch_test/01: MissingCompileTimeError
type_promotion_functions_test/02: CompileTimeError
type_promotion_functions_test/03: CompileTimeError
@@ -1446,7 +1435,10 @@
prefix_transitive_import_prefix_test/03: MissingCompileTimeError
prefix_transitive_import_test/01: MissingCompileTimeError
prefix_transitive_import_test/02: MissingCompileTimeError
+regress_23089_test: MissingCompileTimeError
setter_override2_test/02: MissingCompileTimeError
+super_no_such_method4_test/01: MissingCompileTimeError # Requires Dart 2 semantics. See http://dartbug.com/33380.
+super_no_such_method5_test/01: MissingCompileTimeError # Requires Dart 2 semantics. See http://dartbug.com/33380.
variable_shadow_class_test/01: MissingCompileTimeError
[ $mode == debug && $runtime == vm && $strong && ($compiler == app_jitk || $compiler == dartk) ]
@@ -2079,7 +2071,6 @@
regress_21912_test/02: MissingCompileTimeError
regress_22438_test: MissingCompileTimeError
regress_22936_test: MissingCompileTimeError
-regress_23089_test: MissingCompileTimeError
regress_26133_test: MissingCompileTimeError
regress_27572_test: MissingCompileTimeError
regress_28217_test/01: MissingCompileTimeError
@@ -2244,10 +2235,6 @@
*: SkipByDesign # language_2 is only supported in strong mode.
[ ($compiler == app_jitk || $compiler == dartk || $compiler == dartkp) && ($runtime == dart_precompiled || $runtime == vm) ]
-super_no_such_method4_test: RuntimeError # Issue 33517
-super_operator_index6_test: CompileTimeError # Issue 33498
-super_operator_index7_test: CompileTimeError # Issue 33498
-super_operator_index8_test: CompileTimeError # Issue 33498
type_alias_equality_test/02: RuntimeError # Issue 31359
type_alias_equality_test/03: RuntimeError # Issue 31359
type_alias_equality_test/04: RuntimeError # Issue 31359
diff --git a/tests/language_2/super_no_such_method4_test.dart b/tests/language_2/super_no_such_method4_test.dart
index 88dd2d7..e63f790 100644
--- a/tests/language_2/super_no_such_method4_test.dart
+++ b/tests/language_2/super_no_such_method4_test.dart
@@ -13,7 +13,7 @@
class B extends Object with A {
noSuchMethod(im) => 87;
- foo() => super.foo();
+ foo() => super.foo(); //# 01: compile-time error
}
main() {
diff --git a/tests/language_2/super_no_such_method5_test.dart b/tests/language_2/super_no_such_method5_test.dart
index e798e79..07a6e46 100644
--- a/tests/language_2/super_no_such_method5_test.dart
+++ b/tests/language_2/super_no_such_method5_test.dart
@@ -11,7 +11,7 @@
}
class B extends Object with A {
- foo() => super.foo();
+ foo() => super.foo(); //# 01: compile-time error
}
main() {
diff --git a/tests/language_2/super_operator_index6_test.dart b/tests/language_2/super_operator_index6_test.dart
index 830e490..41bffa4 100644
--- a/tests/language_2/super_operator_index6_test.dart
+++ b/tests/language_2/super_operator_index6_test.dart
@@ -6,7 +6,7 @@
import "package:expect/expect.dart";
-abstract class A {
+class A {
var indexField = new List(2);
operator []=(index, value) {
indexField[index] = value;
diff --git a/tests/language_2/super_operator_index7_test.dart b/tests/language_2/super_operator_index7_test.dart
index af5606e..b64fef6 100644
--- a/tests/language_2/super_operator_index7_test.dart
+++ b/tests/language_2/super_operator_index7_test.dart
@@ -6,7 +6,7 @@
import "package:expect/expect.dart";
-abstract class A {
+class A {
var indexField = new List(2);
operator []=(index, value);
diff --git a/tests/language_2/super_operator_index8_test.dart b/tests/language_2/super_operator_index8_test.dart
index f4ad7d6..558c5a4 100644
--- a/tests/language_2/super_operator_index8_test.dart
+++ b/tests/language_2/super_operator_index8_test.dart
@@ -6,7 +6,7 @@
import "package:expect/expect.dart";
-abstract class A {
+class A {
var indexField = new List(2);
operator []=(index, value);
diff --git a/tests/language_2/vm/shift_special_cases_test.dart b/tests/language_2/vm/shift_special_cases_test.dart
new file mode 100644
index 0000000..604a0a3
--- /dev/null
+++ b/tests/language_2/vm/shift_special_cases_test.dart
@@ -0,0 +1,345 @@
+// 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.
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
+
+// Test for special cases of << and >> integer operations with int64.
+
+import "package:expect/expect.dart";
+
+// int64 value, does not fit to smi
+int v1 = 0x778899aabbccddee;
+int v2 = 0x6000000000000000;
+int v3 = -0x778899aabbccddee;
+int negativeInt64 = -0x7000000000000000;
+int smi = 128;
+int negativeSmi = -3;
+
+int shl(int a, int b) => a << b;
+int shr(int a, int b) => a >> b;
+
+int shlUint32(int a, int b) => ((a & 0xffff) << b) & 0xffff;
+int shrUint32(int a, int b) => (a & 0xffff) >> b;
+
+int testInt64ShlByNegative1(int a, int b) {
+ int x = a + 1;
+ int y = a - 2;
+ try {
+ x = a << b;
+ Expect.fail('Shift by negative count should throw an error');
+ } on ArgumentError {
+ Expect.equals(0x778899aabbccddef, x);
+ Expect.equals(0x778899aabbccddec, y);
+ }
+}
+
+int testInt64ShlByNegative2(int a, int b) {
+ int x = a + 1;
+ int y = a - 2;
+ try {
+ x = shl(a, b);
+ Expect.fail('Shift by negative count should throw an error');
+ } on ArgumentError {
+ Expect.equals(0x778899aabbccddef, x);
+ Expect.equals(0x778899aabbccddec, y);
+ }
+}
+
+int testInt64ShlByNegative3(int a) {
+ int x = a + 1;
+ int y = a - 2;
+ try {
+ int i = -64;
+ x = a << i;
+ Expect.fail('Shift by negative count should throw an error');
+ } on ArgumentError {
+ Expect.equals(0x778899aabbccddef, x);
+ Expect.equals(0x778899aabbccddec, y);
+ }
+}
+
+int testInt64ShrByNegative1(int a, int b) {
+ int x = a + 1;
+ int y = a - 2;
+ try {
+ x = a >> b;
+ Expect.fail('Shift by negative count should throw an error');
+ } on ArgumentError {
+ Expect.equals(0x778899aabbccddef, x);
+ Expect.equals(0x778899aabbccddec, y);
+ }
+}
+
+int testInt64ShrByNegative2(int a, int b) {
+ int x = a + 1;
+ int y = a - 2;
+ try {
+ x = shr(a, b);
+ Expect.fail('Shift by negative count should throw an error');
+ } on ArgumentError {
+ Expect.equals(0x778899aabbccddef, x);
+ Expect.equals(0x778899aabbccddec, y);
+ }
+}
+
+int testInt64ShrByNegative3(int a) {
+ int x = a + 1;
+ int y = a - 2;
+ try {
+ int i = -64;
+ x = a >> i;
+ Expect.fail('Shift by negative count should throw an error');
+ } on ArgumentError {
+ Expect.equals(0x778899aabbccddef, x);
+ Expect.equals(0x778899aabbccddec, y);
+ }
+}
+
+int testInt64ShlByLarge1(int a, int b) {
+ int x = a << b;
+ Expect.equals(0, x);
+}
+
+int testInt64ShlByLarge2(int a) {
+ int i = 64;
+ int x = a << i;
+ Expect.equals(0, x);
+}
+
+int testInt64ShlByLarge3(int a) {
+ int i = 0x7fffffffffffffff;
+ int x = a << i;
+ Expect.equals(0, x);
+}
+
+int testInt64ShrByLarge1a(int a, int b) {
+ int x = a >> b;
+ Expect.equals(0, x);
+}
+
+int testInt64ShrByLarge1b(int a, int b) {
+ int x = a >> b;
+ Expect.equals(-1, x);
+}
+
+int testInt64ShrByLarge2a(int a) {
+ int i = 64;
+ int x = a >> i;
+ Expect.equals(0, x);
+}
+
+int testInt64ShrByLarge2b(int a) {
+ int i = 64;
+ int x = a >> i;
+ Expect.equals(-1, x);
+}
+
+int testInt64ShrByLarge3a(int a) {
+ int i = 0x7fffffffffffffff;
+ int x = a >> i;
+ Expect.equals(0, x);
+}
+
+int testInt64ShrByLarge3b(int a) {
+ int i = 0x7fffffffffffffff;
+ int x = a >> i;
+ Expect.equals(-1, x);
+}
+
+int testUint32ShlByNegative1(int a, int b) {
+ int x = (a & 0xfff) + 1;
+ int y = (a & 0xfff) - 2;
+ try {
+ x = ((a & 0xffff) << b) & 0xffff;
+ Expect.fail('Shift by negative count should throw an error');
+ } on ArgumentError {
+ Expect.equals(0xdef, x);
+ Expect.equals(0xdec, y);
+ }
+ return x;
+}
+
+int testUint32ShlByNegative2(int a, int b) {
+ int x = (a & 0xfff) + 1;
+ int y = (a & 0xfff) - 2;
+ try {
+ x = shlUint32(a, b);
+ Expect.fail('Shift by negative count should throw an error');
+ } on ArgumentError {
+ Expect.equals(0xdef, x);
+ Expect.equals(0xdec, y);
+ }
+}
+
+int testUint32ShlByNegative3(int a) {
+ int x = (a & 0xfff) + 1;
+ int y = (a & 0xfff) - 2;
+ try {
+ int i = -64;
+ x = ((a & 0xffff) << i) & 0xffff;
+ Expect.fail('Shift by negative count should throw an error');
+ } on ArgumentError {
+ Expect.equals(0xdef, x);
+ Expect.equals(0xdec, y);
+ }
+}
+
+int testUint32ShrByNegative1(int a, int b) {
+ int x = (a & 0xfff) + 1;
+ int y = (a & 0xfff) - 2;
+ try {
+ x = ((a & 0xffff) >> b) & 0xffff;
+ Expect.fail('Shift by negative count should throw an error');
+ } on ArgumentError {
+ Expect.equals(0xdef, x);
+ Expect.equals(0xdec, y);
+ }
+}
+
+int testUint32ShrByNegative2(int a, int b) {
+ int x = (a & 0xfff) + 1;
+ int y = (a & 0xfff) - 2;
+ try {
+ x = shrUint32(a, b);
+ Expect.fail('Shift by negative count should throw an error');
+ } on ArgumentError {
+ Expect.equals(0xdef, x);
+ Expect.equals(0xdec, y);
+ }
+}
+
+int testUint32ShrByNegative3(int a) {
+ int x = (a & 0xfff) + 1;
+ int y = (a & 0xfff) - 2;
+ try {
+ int i = -64;
+ x = ((a & 0xffff) >> i) & 0xffff;
+ Expect.fail('Shift by negative count should throw an error');
+ } on ArgumentError {
+ Expect.equals(0xdef, x);
+ Expect.equals(0xdec, y);
+ }
+}
+
+int testUint32ShlByLarge1(int a, int b) {
+ int x = ((a & 0xffff) << b) & 0xffff;
+ Expect.equals(0, x);
+}
+
+int testUint32ShlByLarge2(int a) {
+ int i = 64;
+ int x = ((a & 0xffff) << i) & 0xffff;
+ Expect.equals(0, x);
+}
+
+int testUint32ShlByLarge3(int a) {
+ int i = 0x7fffffffffffffff;
+ int x = ((a & 0xffff) << i) & 0xffff;
+ Expect.equals(0, x);
+}
+
+int testUint32ShrByLarge1(int a, int b) {
+ int x = ((a & 0xffff) >> b) & 0xffff;
+ Expect.equals(0, x);
+}
+
+int testUint32ShrByLarge2(int a) {
+ int i = 64;
+ int x = ((a & 0xffff) >> i) & 0xffff;
+ Expect.equals(0, x);
+}
+
+int testUint32ShrByLarge3(int a) {
+ int i = 0x7fffffffffffffff;
+ int x = ((a & 0xffff) >> i) & 0xffff;
+ Expect.equals(0, x);
+}
+
+doTests1() {
+ testInt64ShlByNegative1(v1, negativeSmi);
+ testInt64ShlByNegative2(v1, negativeSmi);
+ testInt64ShlByNegative3(v1);
+
+ testInt64ShrByNegative1(v1, negativeSmi);
+ testInt64ShrByNegative2(v1, negativeSmi);
+ testInt64ShrByNegative3(v1);
+
+ testInt64ShlByLarge1(v1, smi);
+ testInt64ShlByLarge1(v3, smi);
+
+ testInt64ShlByLarge2(v1);
+ testInt64ShlByLarge2(v3);
+
+ testInt64ShlByLarge3(v1);
+ testInt64ShlByLarge3(v3);
+
+ testInt64ShrByLarge1a(v1, smi);
+ testInt64ShrByLarge1b(v3, smi);
+
+ testInt64ShrByLarge2a(v1);
+ testInt64ShrByLarge2b(v3);
+
+ testInt64ShrByLarge3a(v1);
+ testInt64ShrByLarge3b(v3);
+
+ testUint32ShlByNegative1(v1, negativeSmi);
+ testUint32ShlByNegative2(v1, negativeSmi);
+ testUint32ShlByNegative3(v1);
+
+ testUint32ShrByNegative1(v1, negativeSmi);
+ testUint32ShrByNegative2(v1, negativeSmi);
+ testUint32ShrByNegative3(v1);
+
+ testUint32ShlByLarge1(v1, smi);
+ testUint32ShlByLarge1(v3, smi);
+
+ testUint32ShlByLarge2(v1);
+ testUint32ShlByLarge2(v3);
+
+ testUint32ShlByLarge3(v1);
+ testUint32ShlByLarge3(v3);
+
+ testUint32ShrByLarge1(v1, smi);
+ testUint32ShrByLarge1(v3, smi);
+
+ testUint32ShrByLarge2(v1);
+ testUint32ShrByLarge2(v3);
+
+ testUint32ShrByLarge3(v1);
+ testUint32ShrByLarge3(v3);
+}
+
+doTests2() {
+ testInt64ShlByNegative1(v1, negativeInt64);
+ testInt64ShlByNegative2(v1, negativeInt64);
+
+ testInt64ShrByNegative1(v1, negativeInt64);
+ testInt64ShrByNegative2(v1, negativeInt64);
+
+ testInt64ShlByLarge1(v1, v2);
+ testInt64ShlByLarge1(v3, v2);
+
+ testInt64ShrByLarge1a(v1, v2);
+ testInt64ShrByLarge1b(v3, v2);
+
+ testUint32ShlByNegative1(v1, negativeInt64);
+ testUint32ShlByNegative2(v1, negativeInt64);
+
+ testUint32ShrByNegative1(v1, negativeInt64);
+ testUint32ShrByNegative2(v1, negativeInt64);
+
+ testUint32ShlByLarge1(v1, v2);
+ testUint32ShlByLarge1(v3, v2);
+
+ testUint32ShrByLarge1(v1, v2);
+ testUint32ShrByLarge1(v3, v2);
+}
+
+main() {
+ for (var i = 0; i < 20; ++i) {
+ doTests1();
+ }
+ for (var i = 0; i < 50; ++i) {
+ doTests2();
+ }
+}
diff --git a/tests/language_2/web_int_literals_test.dart b/tests/language_2/web_int_literals_test.dart
new file mode 100644
index 0000000..a85c49a
--- /dev/null
+++ b/tests/language_2/web_int_literals_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+main() {
+ check(0x8000000000000000);
+
+ check(0x7FFF00001111F000);
+ check(0x7FFF00001111FC00);
+ check(0x7FFF00001111FE00); // //# 01: compile-time error
+ check(0x7FFF00001111FF00); // //# 02: compile-time error
+ check(0x7FFF00001111FFFF); // //# 03: compile-time error
+
+ check(0xFFFF00001111F000);
+ check(0xFFFF00001111F800);
+ check(0xFFFF00001111FC00); // //# 10: compile-time error
+ check(0xFFFF00001111FE00); // //# 11: compile-time error
+ check(0xFFFF00001111FF00); // //# 12: compile-time error
+ check(0xFFFF00001111FFFF); // //# 13: compile-time error
+
+ // Test all runs of 53 and 54 bits.
+ check(0x000FFFFFFFFFFFFF);
+ check(0x001FFFFFFFFFFFFF);
+ check(0x003FFFFFFFFFFFFF); // //# 20: compile-time error
+ check(0x003FFFFFFFFFFFFE);
+ check(0x007FFFFFFFFFFFFE); // //# 21: compile-time error
+ check(0x007FFFFFFFFFFFFC);
+ check(0x00FFFFFFFFFFFFFC); // //# 22: compile-time error
+ check(0x00FFFFFFFFFFFFF8);
+ check(0x01FFFFFFFFFFFFF8); // //# 23: compile-time error
+ check(0x01FFFFFFFFFFFFF0);
+ check(0x03FFFFFFFFFFFFF0); // //# 22: compile-time error
+ check(0x03FFFFFFFFFFFFE0);
+ check(0x07FFFFFFFFFFFFE0); // //# 24: compile-time error
+ check(0x07FFFFFFFFFFFFC0);
+ check(0x0FFFFFFFFFFFFFC0); // //# 25: compile-time error
+ check(0x0FFFFFFFFFFFFF80);
+ check(0x1FFFFFFFFFFFFF80); // //# 26: compile-time error
+ check(0x1FFFFFFFFFFFFF00);
+ check(0x3FFFFFFFFFFFFF00); // //# 27: compile-time error
+ check(0x3FFFFFFFFFFFFE00);
+ check(0x7FFFFFFFFFFFFE00); // //# 28: compile-time error
+ check(0x7FFFFFFFFFFFFC00);
+ check(0xFFFFFFFFFFFFFC00); // //# 29: compile-time error
+ check(0xFFFFFFFFFFFFF800);
+
+ // Too big, even on VM.
+ check(9223372036854775808); // //# 60: compile-time error
+ check(9223372036854775807); // //# 61: compile-time error
+ check(9223372036854775806); // //# 62: compile-time error
+ // 9223372036854775808 - 512 is rounded.
+ check(9223372036854775296); // //# 63: compile-time error
+ // 9223372036854775808 - 1024 is exact.
+ check(9223372036854774784);
+
+ check(-9223372036854775808);
+ check(-9223372036854775807); // //# 64: compile-time error
+ check(-9223372036854775296); // //# 65: compile-time error
+ check(-9223372036854774784);
+
+ check(1000000000000000001); // //# 70: compile-time error
+}
+
+check(int n) {}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 116c44e..9dd0262 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -278,6 +278,7 @@
[ $compiler == dart2js && $fasta ]
mirrors/*: SkipByDesign # mirrors not supported
+typed_data/int64_list_load_store_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
[ $compiler == dart2js && $fasta && $host_checked ]
async/stream_controller_async_test: Crash
diff --git a/tests/lib_2/async/run_zoned8_test.dart b/tests/lib_2/async/run_zoned8_test.dart
index 450eff6..fca3989 100644
--- a/tests/lib_2/async/run_zoned8_test.dart
+++ b/tests/lib_2/async/run_zoned8_test.dart
@@ -24,8 +24,9 @@
events.add(counter);
throw counter;
});
- }, onError: (e) {
+ }, onError: (e, [s]) {
events.add("error: $e");
+ Expect.isNotNull(s); // Regression test for http://dartbug.com/33589
});
done.future.whenComplete(() {
diff --git a/tests/lib_2/html/element_classes_svg_test.dart b/tests/lib_2/html/element_classes_svg_test.dart
index e7214a5..23a6de0 100644
--- a/tests/lib_2/html/element_classes_svg_test.dart
+++ b/tests/lib_2/html/element_classes_svg_test.dart
@@ -34,12 +34,9 @@
expect(noElementsTop.length, 0);
expect(noElementsTop is List, true);
- var varWeird = querySelectorAll<svg.CircleElement>('path');
- expect(varWeird.length, 1);
- expect(varWeird is List, true);
- expect(varWeird is List<svg.CircleElement>, true);
- // Runtime error expected 'PathElement' is not a subtype of expected type 'CircleElement'.'
- Expect.throwsTypeError(() => varWeird[0] is svg.CircleElement);
+ // Expect runtime error all elements in the list are not the proper type.
+ Expect.throwsAssertionError(() => querySelectorAll<svg.CircleElement>('path'),
+ 'All elements not of type CircleElement');
var simpleElems = querySelectorAll('circle');
expect(simpleElems.length, 1);
diff --git a/tests/lib_2/lib_2_dart2js.status b/tests/lib_2/lib_2_dart2js.status
index fed5352..ac52cb5 100644
--- a/tests/lib_2/lib_2_dart2js.status
+++ b/tests/lib_2/lib_2_dart2js.status
@@ -683,6 +683,10 @@
html/indexeddb_5_test: RuntimeError
html/js_typed_interop_default_arg_test/explicit_argument: RuntimeError
html/js_typed_interop_test: RuntimeError
+math/double_pow_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int32x4_arithmetic_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int32x4_arithmetic_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int64_list_load_store_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
[ $compiler == dart2js && $fasta && $host_checked ]
html/custom/mirrors_2_test: Crash # 'file:*/pkg/compiler/lib/src/common_elements.dart': Failed assertion: line 405 pos 12: 'element.name == '=='': is not true.
diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status
index 2fdab77..5a926e1 100644
--- a/tests/lib_2/lib_2_dartdevc.status
+++ b/tests/lib_2/lib_2_dartdevc.status
@@ -14,6 +14,10 @@
convert/chunked_conversion_utf87_test: RuntimeError
convert/utf82_test: RuntimeError
html/debugger_test: CompileTimeError
+math/double_pow_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int32x4_arithmetic_test/int64: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int32x4_arithmetic_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
+typed_data/int64_list_load_store_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
[ $runtime == chrome && ($compiler == dartdevc || $compiler == dartdevk) ]
html/element_animate_test/timing_dict: RuntimeError # Issue 29922
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index e8a160c..6ea3848 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -145,8 +145,8 @@
mirrors/metadata_allowed_values_test/16: Skip # Flaky, crashes.
mirrors/metadata_scope_test/none: RuntimeError
mirrors/method_mirror_location_test: RuntimeError
-mirrors/method_mirror_source_line_ending_test: Crash
-mirrors/method_mirror_source_test: Crash
+mirrors/method_mirror_source_line_ending_test: RuntimeError # Issue 33478
+mirrors/method_mirror_source_test: RuntimeError # Issue 33041
mirrors/mirrors_nsm_mismatch_test: CompileTimeError # Issue 31533
mirrors/mirrors_nsm_test/dart2js: CompileTimeError # Issue 31533
mirrors/mirrors_nsm_test/none: CompileTimeError # Issue 31533
diff --git a/tests/lib_2/mirrors/metadata_symbol_literal_test.dart b/tests/lib_2/mirrors/metadata_symbol_literal_test.dart
new file mode 100644
index 0000000..e632d68
--- /dev/null
+++ b/tests/lib_2/mirrors/metadata_symbol_literal_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+class T {
+ const T(this.symbol);
+ final Symbol symbol;
+}
+
+class U {
+ @T(#x)
+ int field;
+}
+
+main() {
+ final metadata = reflectClass(U).declarations[#field].metadata;
+ Expect.identical((metadata.first.reflectee as T).symbol, const Symbol('x'));
+}
diff --git a/tests/standalone_2/io/non_utf8_directory_test.dart b/tests/standalone_2/io/non_utf8_directory_test.dart
index 1ebe6b9..1c58f3f 100644
--- a/tests/standalone_2/io/non_utf8_directory_test.dart
+++ b/tests/standalone_2/io/non_utf8_directory_test.dart
@@ -13,76 +13,80 @@
var syncDir;
test('Non-UTF8 Directory Listing', () async {
- Directory.current = await Directory.systemTemp.createTemp();
- final rawPath = new Uint8List.fromList([182]);
- asyncDir = new Directory.fromRawPath(rawPath);
- if (Platform.isMacOS || Platform.isIOS) {
- try {
- await asyncDir.create();
- } on FileSystemException catch (e) {
- // Macos doesn't support non-UTF-8 paths.
- return;
- }
- } else {
- await asyncDir.create();
- }
- expect(await asyncDir.exists(), isTrue);
-
- await for (final e in Directory.current.list()) {
- // FIXME(bkonyi): reenable when rawPath is exposed.
- /*
- if (Platform.isWindows) {
- // Windows replaces invalid characters with � when creating file system
- // entities.
- final raw = e.rawPath;
- expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+ Directory tmp;
+ try {
+ tmp = await Directory.systemTemp
+ .createTemp('non_utf8_directory_test_async');
+ final rawPath = new Uint8List.fromList([182]);
+ asyncDir = new Directory.fromRawPath(rawPath);
+ if (Platform.isMacOS || Platform.isIOS) {
+ try {
+ await asyncDir.create();
+ } on FileSystemException catch (e) {
+ // Macos doesn't support non-UTF-8 paths.
+ await tmp.delete(recursive: true);
+ return;
+ }
} else {
- expect(e.rawPath.last, 182);
+ await asyncDir.create();
}
- */
+ expect(await asyncDir.exists(), isTrue);
+
+ await for (final e in tmp.list()) {
+ // FIXME(bkonyi): reenable when rawPath is exposed.
+ /*
+ if (Platform.isWindows) {
+ // Windows replaces invalid characters with � when creating file system
+ // entities.
+ final raw = e.rawPath;
+ expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+ } else {
+ expect(e.rawPath.last, 182);
+ }
+ */
+ }
+ await asyncDir.delete(recursive: true);
+ } finally {
+ await tmp.delete(recursive: true);
}
- await asyncDir.delete(recursive: true);
});
test('Non-UTF8 Directory Sync Listing', () {
- Directory.current = Directory.systemTemp.createTempSync();
- final rawPath = new Uint8List.fromList([182]);
- syncDir = new Directory.fromRawPath(rawPath);
+ Directory tmp;
+ try {
+ tmp = Directory.systemTemp.createTempSync('non_utf8_directory_test_sync');
+ final rawPath = new Uint8List.fromList([182]);
+ syncDir = new Directory.fromRawPath(rawPath);
- if (Platform.isMacOS || Platform.isIOS) {
- try {
- syncDir.createSync();
- } on FileSystemException catch (e) {
- // Macos doesn't support non-UTF-8 paths.
- return;
- }
- } else {
- syncDir.createSync();
- }
- expect(syncDir.existsSync(), isTrue);
-
- for (final e in Directory.current.listSync()) {
- // FIXME(bkonyi): reenable when rawPath is exposed.
- /*
- if (Platform.isWindows) {
- // Windows replaces invalid characters with � when creating file system
- // entities.
- final raw = e.rawPath;
- expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+ if (Platform.isMacOS || Platform.isIOS) {
+ try {
+ syncDir.createSync();
+ } on FileSystemException catch (e) {
+ // Macos doesn't support non-UTF-8 paths.
+ tmp.deleteSync(recursive: true);
+ return;
+ }
} else {
- expect(e.rawPath.last, 182);
+ syncDir.createSync();
}
- */
- }
- syncDir.deleteSync(recursive: true);
- });
+ expect(syncDir.existsSync(), isTrue);
- tearDown(() {
- if ((asyncDir != null) && asyncDir.existsSync()) {
- asyncDir.deleteSync(recursive: true);
- }
- if ((syncDir != null) && syncDir.existsSync()) {
+ for (final e in tmp.listSync()) {
+ // FIXME(bkonyi): reenable when rawPath is exposed.
+ /*
+ if (Platform.isWindows) {
+ // Windows replaces invalid characters with � when creating file system
+ // entities.
+ final raw = e.rawPath;
+ expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+ } else {
+ expect(e.rawPath.last, 182);
+ }
+ */
+ }
syncDir.deleteSync(recursive: true);
+ } finally {
+ tmp.deleteSync(recursive: true);
}
});
}
diff --git a/tests/standalone_2/io/non_utf8_file_test.dart b/tests/standalone_2/io/non_utf8_file_test.dart
index df35c06..3bdafa1 100644
--- a/tests/standalone_2/io/non_utf8_file_test.dart
+++ b/tests/standalone_2/io/non_utf8_file_test.dart
@@ -13,84 +13,87 @@
var syncFile;
test('Non-UTF8 Filename', () async {
- Directory.current = await Directory.systemTemp.createTemp();
- final rawPath = new Uint8List.fromList([182]);
- asyncFile = new File.fromRawPath(rawPath);
- if (Platform.isMacOS || Platform.isIOS) {
- try {
- await asyncFile.create();
- } on FileSystemException catch (e) {
- // Macos doesn't support non-UTF-8 paths.
- return;
- }
- } else {
- await asyncFile.create();
- }
- expect(await asyncFile.exists(), isTrue);
-
- for (final file in Directory.current.listSync()) {
- // FIXME(bkonyi): reenable when rawPath is exposed.
- /*
- if (Platform.isWindows) {
- // Windows replaces invalid characters with � when creating file system
- // entities.
- final raw = file.rawPath;
- expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+ Directory tmp;
+ try {
+ tmp = await Directory.systemTemp.createTemp('non_utf8_file_test_async');
+ final rawPath = new Uint8List.fromList([182]);
+ asyncFile = new File.fromRawPath(rawPath);
+ if (Platform.isMacOS || Platform.isIOS) {
+ try {
+ await asyncFile.create();
+ } on FileSystemException catch (e) {
+ // Macos doesn't support non-UTF-8 paths.
+ await tmp.delete(recursive: true);
+ return;
+ }
} else {
- expect(file.rawPath.last, 182);
+ await asyncFile.create();
}
- */
- // FIXME(bkonyi): this isn't true on some versions of MacOS. Why?
- if (!Platform.isMacOS && !Platform.isIOS) {
- expect(file.path.endsWith('�'), isTrue);
+ expect(await asyncFile.exists(), isTrue);
+
+ for (final file in tmp.listSync()) {
+ // FIXME(bkonyi): reenable when rawPath is exposed.
+ /*
+ if (Platform.isWindows) {
+ // Windows replaces invalid characters with � when creating file system
+ // entities.
+ final raw = file.rawPath;
+ expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+ } else {
+ expect(file.rawPath.last, 182);
+ }
+ */
+ // FIXME(bkonyi): this isn't true on some versions of MacOS. Why?
+ if (!Platform.isMacOS && !Platform.isIOS) {
+ expect(file.path.endsWith('�'), isTrue);
+ }
}
+ await asyncFile.delete();
+ } finally {
+ await tmp.delete(recursive: true);
}
- await asyncFile.delete();
});
test('Non-UTF8 Filename Sync', () {
- Directory.current = Directory.systemTemp.createTempSync();
- final rawPath = new Uint8List.fromList([182]);
- syncFile = new File.fromRawPath(rawPath);
+ Directory tmp;
+ try {
+ tmp = Directory.systemTemp.createTempSync('non_utf8_file_test_sync');
+ final rawPath = new Uint8List.fromList([182]);
+ syncFile = new File.fromRawPath(rawPath);
- if (Platform.isMacOS || Platform.isIOS) {
- try {
- syncFile.createSync();
- } on FileSystemException catch (e) {
- // Macos doesn't support non-UTF-8 paths.
- return;
- }
- } else {
- syncFile.createSync();
- }
- expect(syncFile.existsSync(), isTrue);
-
- for (final file in Directory.current.listSync()) {
- // FIXME(bkonyi): reenable when rawPath is exposed.
- /*
- if (Platform.isWindows) {
- // Windows replaces invalid characters with � when creating file system
- // entities.
- final raw = file.rawPath;
- expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+ if (Platform.isMacOS || Platform.isIOS) {
+ try {
+ syncFile.createSync();
+ } on FileSystemException catch (e) {
+ // Macos doesn't support non-UTF-8 paths.
+ tmp.deleteSync(recursive: true);
+ return;
+ }
} else {
- expect(file.rawPath.last, 182);
+ syncFile.createSync();
}
- */
- // FIXME(bkonyi): this isn't true on some versions of MacOS. Why?
- if (!Platform.isMacOS && !Platform.isIOS) {
- expect(file.path.endsWith('�'), isTrue);
- }
- }
- syncFile.deleteSync();
- });
+ expect(syncFile.existsSync(), isTrue);
- tearDown(() {
- if ((asyncFile != null) && asyncFile.existsSync()) {
- asyncFile.deleteSync();
- }
- if ((syncFile != null) && syncFile.existsSync()) {
+ for (final file in tmp.listSync()) {
+ // FIXME(bkonyi): reenable when rawPath is exposed.
+ /*
+ if (Platform.isWindows) {
+ // Windows replaces invalid characters with � when creating file system
+ // entities.
+ final raw = file.rawPath;
+ expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+ } else {
+ expect(file.rawPath.last, 182);
+ }
+ */
+ // FIXME(bkonyi): this isn't true on some versions of MacOS. Why?
+ if (!Platform.isMacOS && !Platform.isIOS) {
+ expect(file.path.endsWith('�'), isTrue);
+ }
+ }
syncFile.deleteSync();
+ } finally {
+ tmp.deleteSync(recursive: true);
}
});
}
diff --git a/tests/standalone_2/io/non_utf8_link_test.dart b/tests/standalone_2/io/non_utf8_link_test.dart
index 4527412..aadd30a 100644
--- a/tests/standalone_2/io/non_utf8_link_test.dart
+++ b/tests/standalone_2/io/non_utf8_link_test.dart
@@ -16,114 +16,117 @@
const dirName = 'foobar';
test('Non-UTF8 Link', () async {
- Directory tmp = await Directory.systemTemp.createTemp();
- Directory.current = await tmp.resolveSymbolicLinks();
- final path = join(Directory.current.path, dirName);
- final rawPath =
- utf8.encode(path).sublist(0, path.length - dirName.length).toList();
- rawPath.add(47);
- rawPath.add(182);
+ Directory tmp =
+ await Directory.systemTemp.createTemp('non_utf8_link_test_async');
+ try {
+ tmp = new Directory(await tmp.resolveSymbolicLinks());
+ final path = join(tmp.path, dirName);
+ final rawPath =
+ utf8.encode(path).sublist(0, path.length - dirName.length).toList();
+ rawPath.add(47);
+ rawPath.add(182);
- final f = new Directory(path);
- await f.create();
- expect(await f.exists(), isTrue);
+ final f = new Directory(path);
+ await f.create();
+ expect(await f.exists(), isTrue);
- final rawName = new Uint8List.fromList(rawPath);
- asyncLink = new Link.fromRawPath(rawName);
+ final rawName = new Uint8List.fromList(rawPath);
+ asyncLink = new Link.fromRawPath(rawName);
- if (Platform.isMacOS || Platform.isIOS) {
- try {
- asyncLink = await asyncLink.create(path);
- } on FileSystemException catch (e) {
- // Macos doesn't support non-UTF-8 paths.
- return;
- }
- } else {
- asyncLink = await asyncLink.create(path);
- }
- expect(await asyncLink.exists(), isTrue);
-
- await for (final e in Directory.current.list()) {
- if (e is Link) {
- // FIXME(bkonyi): reenable when rawPath is exposed.
- /*
- if (Platform.isWindows) {
- // Windows replaces invalid characters with � when creating file system
- // entities.
- final raw = e.rawPath;
- expect(raw.sublist(raw.length - 3), [239, 191, 189]);
- } else {
- expect(e.rawPath.last, 182);
+ if (Platform.isMacOS || Platform.isIOS) {
+ try {
+ asyncLink = await asyncLink.create(path);
+ } on FileSystemException catch (e) {
+ // Macos doesn't support non-UTF-8 paths.
+ await tmp.delete(recursive: true);
+ return;
}
- */
- expect(e.path, path);
+ } else {
+ asyncLink = await asyncLink.create(path);
}
- }
+ expect(await asyncLink.exists(), isTrue);
- // FIXME(bkonyi): reenable when rawPath is exposed.
- // expect(asyncLink.absolute.rawPath, rawPath);
- expect(await asyncLink.resolveSymbolicLinks(), path);
- expect(await asyncLink.target(), path);
- await asyncLink.delete();
+ await for (final e in tmp.list()) {
+ if (e is Link) {
+ // FIXME(bkonyi): reenable when rawPath is exposed.
+ /*
+ if (Platform.isWindows) {
+ // Windows replaces invalid characters with � when creating file system
+ // entities.
+ final raw = e.rawPath;
+ expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+ } else {
+ expect(e.rawPath.last, 182);
+ }
+ */
+ expect(e.path, path);
+ }
+ }
+
+ // FIXME(bkonyi): reenable when rawPath is exposed.
+ // expect(asyncLink.absolute.rawPath, rawPath);
+ expect(await asyncLink.resolveSymbolicLinks(), path);
+ expect(await asyncLink.target(), path);
+ await asyncLink.delete();
+ } finally {
+ await tmp.delete(recursive: true);
+ }
});
test('Non-UTF8 Link Sync', () {
- Directory tmp = Directory.systemTemp.createTempSync();
- Directory.current = tmp.resolveSymbolicLinksSync();
- final path = join(Directory.current.path, dirName);
- final rawPath =
- utf8.encode(path).sublist(0, path.length - dirName.length).toList();
- rawPath.add(47); // '/'
- rawPath.add(182); // invalid UTF-8 character.
+ Directory tmp =
+ Directory.systemTemp.createTempSync('non_utf8_link_test_sync');
+ try {
+ tmp = new Directory(tmp.resolveSymbolicLinksSync());
+ final path = join(tmp.path, dirName);
+ final rawPath =
+ utf8.encode(path).sublist(0, path.length - dirName.length).toList();
+ rawPath.add(47); // '/'
+ rawPath.add(182); // invalid UTF-8 character.
- final f = new Directory(path);
- f.createSync();
- expect(f.existsSync(), isTrue);
+ final f = new Directory(path);
+ f.createSync();
+ expect(f.existsSync(), isTrue);
- final rawName = new Uint8List.fromList(rawPath);
- syncLink = new Link.fromRawPath(rawName);
+ final rawName = new Uint8List.fromList(rawPath);
+ syncLink = new Link.fromRawPath(rawName);
- if (Platform.isMacOS || Platform.isIOS) {
- try {
- syncLink.createSync(path);
- } on FileSystemException catch (e) {
- // Macos doesn't support non-UTF-8 paths.
- return;
- }
- } else {
- syncLink.createSync(path);
- }
- expect(syncLink.existsSync(), isTrue);
-
- for (final e in Directory.current.listSync()) {
- if (e is Link) {
- // FIXME(bkonyi): reenable when rawPath is exposed.
- /*
- if (Platform.isWindows) {
- // Windows replaces invalid characters with � when creating file system
- // entities.
- final raw = e.rawPath;
- expect(raw.sublist(raw.length - 3), [239, 191, 189]);
- } else {
- expect(e.rawPath.last, 182);
+ if (Platform.isMacOS || Platform.isIOS) {
+ try {
+ syncLink.createSync(path);
+ } on FileSystemException catch (e) {
+ // Macos doesn't support non-UTF-8 paths.
+ tmp.deleteSync(recursive: true);
+ return;
}
- */
- expect(e.path, path);
+ } else {
+ syncLink.createSync(path);
}
- }
- // FIXME(bkonyi): reenable when rawPath is exposed.
- // expect(syncLink.absolute.rawPath, rawPath);
- expect(syncLink.resolveSymbolicLinksSync(), path);
- expect(syncLink.targetSync(), path);
- syncLink.deleteSync();
- });
+ expect(syncLink.existsSync(), isTrue);
- tearDown(() {
- if ((asyncLink != null) && asyncLink.existsSync()) {
- asyncLink.deleteSync();
- }
- if ((syncLink != null) && syncLink.existsSync()) {
+ for (final e in tmp.listSync()) {
+ if (e is Link) {
+ // FIXME(bkonyi): reenable when rawPath is exposed.
+ /*
+ if (Platform.isWindows) {
+ // Windows replaces invalid characters with � when creating file system
+ // entities.
+ final raw = e.rawPath;
+ expect(raw.sublist(raw.length - 3), [239, 191, 189]);
+ } else {
+ expect(e.rawPath.last, 182);
+ }
+ */
+ expect(e.path, path);
+ }
+ }
+ // FIXME(bkonyi): reenable when rawPath is exposed.
+ // expect(syncLink.absolute.rawPath, rawPath);
+ expect(syncLink.resolveSymbolicLinksSync(), path);
+ expect(syncLink.targetSync(), path);
syncLink.deleteSync();
+ } finally {
+ tmp.deleteSync(recursive: true);
}
});
}
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index 77fcc36..be289b1 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -176,10 +176,6 @@
deferred_transitive_import_error_test: Crash
fragmentation_test: Pass, Crash # Issue 31421
io/addlatexhash_test: Pass, Crash # Issue 31252
-io/non_utf8_directory_test: Skip # Issue 33519
-io/non_utf8_file_test: Skip # Issue 33519
-io/non_utf8_link_test: Skip # Issue 33519
-io/non_utf8_output_test: Skip # Issue 33519
io/raw_datagram_read_all_test: Pass, Fail # Timing dependent.
io/skipping_dart2js_compilations_test: Pass, Slow # Slow.
io/test_runner_test: Pass, Slow # Slow.
diff --git a/tools/VERSION b/tools/VERSION
index c3f1dcf..bbc4468 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 0
PATCH 0
-PRERELEASE 64
-PRERELEASE_PATCH 1
+PRERELEASE 65
+PRERELEASE_PATCH 0
diff --git a/tools/apps/update_homebrew/lib/update_homebrew.dart b/tools/apps/update_homebrew/lib/update_homebrew.dart
index 2e251bb..521e35d 100644
--- a/tools/apps/update_homebrew/lib/update_homebrew.dart
+++ b/tools/apps/update_homebrew/lib/update_homebrew.dart
@@ -50,7 +50,8 @@
'dart-archive', 'channels/$channel/release/$revision/VERSION',
downloadOptions: DownloadOptions.FullMedia);
- var versionObject = await json.fuse(ascii).decoder.bind(media.stream).first;
+ var versionObject =
+ await json.fuse(ascii).decoder.bind(media.stream).first as Map;
return versionObject['version'];
} finally {
client.close();
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 3e2549b..786a339 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -393,7 +393,7 @@
"arguments": ["--timeout=240", "--no-preview-dart-2"],
"environment": {
"ASAN_OPTIONS": "handle_segv=0:detect_stack_use_after_return=0",
- "ASAN_SYMBOLIZER_PATH": "buildtools/toolchain/clang+llvm-x86_64-linux/bin/llvm-symbolizer"
+ "ASAN_SYMBOLIZER_PATH": "buildtools/linux-x64/clang/bin/llvm-symbolizer"
}
},
{
@@ -401,7 +401,7 @@
"arguments": ["--checked", "--no-preview-dart-2", "--timeout=240"],
"environment": {
"ASAN_OPTIONS": "handle_segv=0:detect_stack_use_after_return=0",
- "ASAN_SYMBOLIZER_PATH": "buildtools/toolchain/clang+llvm-x86_64-linux/bin/llvm-symbolizer"
+ "ASAN_SYMBOLIZER_PATH": "buildtools/linux-x64/clang/bin/llvm-symbolizer"
}
}
]
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index a713b78..d5ee488 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -512,11 +512,10 @@
[DartName=start2] void start(optional double when);
};
-// Remove operations webkitRequestFullscreen replaced w/ requestFullscreen.
+// Remove operation requestFullscreen only use webKitRequestFullscreen.
[DartSupplemental]
interface Element : Node {
- [DartSuppress] void webkitRequestFullScreen([Default=Undefined] optional unsigned short flags);
- [DartSuppress] void webkitRequestFullscreen();
+ [DartSuppress] void requestFullscreen();
};
[DartSupplemental]
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 1f74820..7b7dabf 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -817,7 +817,7 @@
"PaymentRequestEvent.openWindow": { "type": "WindowClient" },
"RTCPeerConnection.createOffer": { "type": "RtcSessionDescription" },
"RTCPeerConnection.createAnswer": { "type": "RtcSessionDescription" },
- "RTCPeerConnection.getStats": { "type": "dictionary", "maplike": "RTCStatsReport"},
+ "RTCPeerConnection.getStats": { "type": "RtcStatsReport", "maplike": "RTCStatsReport"},
"RTCPeerConnection.generateCertificate": { "type": "RtcCertificate" },
"Permissions.query": { "type": "PermissionStatus" },
"Permissions.request": { "type": "PermissionStatus" },
@@ -1328,15 +1328,19 @@
promiseType = 'Future'
promiseCall = 'promiseToFuture'
if promiseFound is not(None):
+ paramType = promiseFound['type']
if 'maplike' in promiseFound:
- promiseCall = 'promiseToFuture<dynamic>'
- promiseType = 'Future'
- elif promiseFound['type'] == 'dictionary':
+ if paramType == 'dictionary':
+ promiseCall = 'promiseToFuture<dynamic>'
+ promiseType = 'Future'
+ else:
+ promiseCall = 'promiseToFuture<%s>' % paramType
+ promiseType = 'Future<%s>' % paramType
+ elif paramType == 'dictionary':
# It's a dictionary so return as a Map.
promiseCall = 'promiseToFutureAsMap'
promiseType = 'Future<Map<String, dynamic>>'
else:
- paramType = promiseFound['type']
promiseCall = 'promiseToFuture<%s>' % paramType
promiseType = 'Future<%s>' % paramType
diff --git a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
index 2b6bdf6..1b0f7a7 100644
--- a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
@@ -58,7 +58,6 @@
ElementList<T> querySelectorAll<T extends Element>(String selectors) =>
new _FrozenElementList<T>._wrap(_querySelectorAll(selectors));
-
String get innerHtml {
final e = new DivElement();
e.append(this.clone(true));
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index f8f956e..0b740f3 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -263,7 +263,10 @@
implements ElementList<E>, NodeListWrapper {
final List<Node> _nodeList;
- _FrozenElementList._wrap(this._nodeList);
+ _FrozenElementList._wrap(this._nodeList) {
+ assert(this._nodeList.every((element) => element is E),
+ "Query expects only HTML elements of type $E but found ${this._nodeList.firstWhere((e) => e is! E)}");
+ }
int get length => _nodeList.length;
diff --git a/tools/dom/templates/html/impl/impl_SpeechSynthesis.darttemplate b/tools/dom/templates/html/impl/impl_SpeechSynthesis.darttemplate
index 20e19cf..98b15e5 100644
--- a/tools/dom/templates/html/impl/impl_SpeechSynthesis.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SpeechSynthesis.darttemplate
@@ -6,8 +6,6 @@
$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS
{
- @DomName('SpeechSynthesis.getVoices')
- @DocsEditable()
List<SpeechSynthesisVoice> getVoices() {
List<SpeechSynthesisVoice> voices = _getVoices();
if (voices.length > 0)
diff --git a/tools/observatory_tool.py b/tools/observatory_tool.py
index 28be29b..42028b7 100755
--- a/tools/observatory_tool.py
+++ b/tools/observatory_tool.py
@@ -179,6 +179,7 @@
if not silent:
DisplayBootstrapWarning()
command = [dart_executable, DART2JS_PATH]
+ command += ['--no-preview-dart-2']
command += ['-DOBS_VER=' + utils.GetVersion(no_git_hash=True)]
command += [script_path, '-o', output_path, '--packages=%s' % packages_path]
# Add the defaults pub used
diff --git a/tools/sdks/linux/dart-sdk.tar.gz.sha1 b/tools/sdks/linux/dart-sdk.tar.gz.sha1
index 445af50..e12fb60 100644
--- a/tools/sdks/linux/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/linux/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-2abdfae6bf237e3d10e7d6e7680e62653c59f167
\ No newline at end of file
+cb26a440fbe1a3cef64c580ee9055a746278ea82
\ No newline at end of file
diff --git a/tools/sdks/mac/dart-sdk.tar.gz.sha1 b/tools/sdks/mac/dart-sdk.tar.gz.sha1
index 355c7c2..03cf63f 100644
--- a/tools/sdks/mac/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/mac/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-e2d609d355ce8e8a0de9dc107818055fead5c6c1
\ No newline at end of file
+c66ec04f2b2e00c30b307eb2275a2bd91fa97287
\ No newline at end of file
diff --git a/tools/sdks/win/dart-sdk.tar.gz.sha1 b/tools/sdks/win/dart-sdk.tar.gz.sha1
index 9cd92de..361bfca 100644
--- a/tools/sdks/win/dart-sdk.tar.gz.sha1
+++ b/tools/sdks/win/dart-sdk.tar.gz.sha1
@@ -1 +1 @@
-c5cca53d8fa715c6409eca288cd5560d55d50bdc
\ No newline at end of file
+26a6441397eea6cf00c7b3e565de4aa40c43a9c6
\ No newline at end of file
diff --git a/tools/test.py b/tools/test.py
index 3b45606..48df925 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -16,8 +16,7 @@
tools_dir = os.path.dirname(os.path.realpath(__file__))
dart_test_script = string.join(
[tools_dir, 'testing', 'dart', 'main.dart'], os.sep)
- command = [utils.CheckedInSdkExecutable(),
- '--checked', dart_test_script] + args
+ command = [utils.CheckedInSdkExecutable(), dart_test_script] + args
# The testing script potentially needs the android platform tools in PATH so
# we do that in ./tools/test.py (a similar logic exists in ./tools/build.py).
diff --git a/tools/testing/dart/options.dart b/tools/testing/dart/options.dart
index 5493852..5296bd1 100644
--- a/tools/testing/dart/options.dart
+++ b/tools/testing/dart/options.dart
@@ -465,7 +465,8 @@
}
}
- if (configuration['no_preview_dart_2'] && configuration['preview_dart_2']) {
+ if (configuration['no_preview_dart_2'] == true &&
+ configuration['preview_dart_2'] == true) {
_fail('"--no-preview-dart-2" and "--preview-dart-2" specified,');
}
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index 84594c8..3da5f0d 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -1468,7 +1468,7 @@
for (var match in matches) {
result.add(wordSplit(match[1]));
}
- if (result.isEmpty) result.add([]);
+ if (result.isEmpty) result.add(<String>[]);
dartOptions = singleListOfOptions('DartOptions');
sharedOptions = singleListOfOptions('SharedOptions');
@@ -1660,7 +1660,7 @@
bool isMultitest = multiTestRegExp.hasMatch(contents);
return {
- "vmOptions": <List>[[]],
+ "vmOptions": <List<String>>[[]],
"sharedOptions": <String>[],
"dart2jsOptions": <String>[],
"dartOptions": null,
diff --git a/utils/bazel/BUILD.gn b/utils/bazel/BUILD.gn
index 6f6d3da..eb754ab 100644
--- a/utils/bazel/BUILD.gn
+++ b/utils/bazel/BUILD.gn
@@ -7,4 +7,5 @@
application_snapshot("kernel_worker") {
main_dart = "kernel_worker.dart"
training_args = [ "--help" ]
+ dart_version = 2
}
diff --git a/utils/bazel/kernel_worker.dart b/utils/bazel/kernel_worker.dart
index 27bfd22..f069fcb 100644
--- a/utils/bazel/kernel_worker.dart
+++ b/utils/bazel/kernel_worker.dart
@@ -128,7 +128,7 @@
if (multiRoots.isEmpty) multiRoots.add(Uri.base);
var fileSystem = new MultiRootFileSystem(parsedArgs['multi-root-scheme'],
multiRoots, fe.StandardFileSystem.instance);
- var sources = parsedArgs['source'].map(Uri.parse).toList();
+ var sources = (parsedArgs['source'] as List<String>).map(Uri.parse).toList();
Target target;
var summaryOnly = parsedArgs['summary-only'] as bool;
var excludeNonSources = parsedArgs['exclude-non-sources'] as bool;
@@ -143,8 +143,12 @@
null,
Uri.base.resolve(parsedArgs['dart-sdk-summary']),
Uri.base.resolve(parsedArgs['packages-file']),
- parsedArgs['input-summary'].map(Uri.base.resolve).toList(),
- parsedArgs['input-linked'].map(Uri.base.resolve).toList(),
+ (parsedArgs['input-summary'] as List<String>)
+ .map(Uri.base.resolve)
+ .toList(),
+ (parsedArgs['input-linked'] as List<String>)
+ .map(Uri.base.resolve)
+ .toList(),
target,
fileSystem);
diff --git a/utils/compiler/BUILD.gn b/utils/compiler/BUILD.gn
index c94d732..53197d5 100644
--- a/utils/compiler/BUILD.gn
+++ b/utils/compiler/BUILD.gn
@@ -29,6 +29,11 @@
":runtime_lib_files_stamp",
]
+ # dart_action() needs kernel service snapshot to run in Dart 2 mode.
+ # This can't be added as a dependency to dart_action() itself as it will
+ # create a circular dependency.
+ deps += [ "../../utils/kernel-service:copy_kernel_service_snapshot" ]
+
output_dir = rebase_path(target_gen_dir)
script = "create_snapshot_entry.dart"
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index d3e0c7b..ab80bcc 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -89,6 +89,12 @@
"../compiler:compile_dart2js_platform",
"../compiler:compile_dart2js_platform_strong",
]
+
+ # dart_action() needs kernel service snapshot to run in Dart 2 mode.
+ # This can't be added as a dependency to dart_action() itself as it will
+ # create a circular dependency.
+ deps += [ "../../utils/kernel-service:copy_kernel_service_snapshot" ]
+
inputs = sdk_lib_files + compiler_files + dev_compiler_files + [
"$root_out_dir/dart2js_platform.dill",
"$root_out_dir/dart2js_outline.dill",
@@ -124,8 +130,6 @@
# Apply dev_compiler's patch files to create the Dart version of the dartdevc
# SDK.
prebuilt_dart_action("dartdevc_patch_sdk") {
- vm_args = ["--preview-dart-2"]
-
# TODO(rnystrom): Unfork DDC's patch_sdk.dart script with the
# tools/patch_sdk.dart and then change this to use generate_patch_sdk().
deps = [
@@ -167,8 +171,6 @@
# Compiles the Dart core libraries and DDC runtime to an analyzer summary and
# JS.
prebuilt_dart_action("dartdevc_sdk") {
- vm_args = ["--preview-dart-2"]
-
deps = [
":dartdevc_files_stamp",
":dartdevc_patch_sdk",
@@ -265,8 +267,6 @@
# Compiles the packages used by the tests to JS with dartdevc so that they are
# available for loading by the tests.
prebuilt_dart_action("dartdevc_test_pkg") {
- vm_args = ["--preview-dart-2"]
-
deps = [
":dartdevc_files_stamp",
":dartdevc_sdk",
@@ -328,8 +328,6 @@
# Compiles the DDC SDK's kernel summary and JS code.
prebuilt_dart_action("dartdevk_sdk") {
- vm_args = ["--preview-dart-2"]
-
deps = [
"../../pkg:pkg_files_stamp",
":dartdevc_files_stamp",
diff --git a/utils/pub/BUILD.gn b/utils/pub/BUILD.gn
index 0adf27a..a87616b 100644
--- a/utils/pub/BUILD.gn
+++ b/utils/pub/BUILD.gn
@@ -5,11 +5,6 @@
import("../application_snapshot.gni")
application_snapshot("pub") {
- main_dart = "../../third_party/pkg/pub/bin/pub.dart"
- training_args = [ "--help" ]
-}
-
-application_snapshot("pub2") {
dart_version = 2
main_dart = "../../third_party/pkg/pub/bin/pub.dart"
training_args = [ "--help" ]