From ff24a5ee6b6fbb805cbe02bc1815c286abb41b63 Mon Sep 17 00:00:00 2001 From: Sigmund Cherem Date: Thu, 12 Apr 2018 19:44:51 +0000 Subject: [PATCH] fasta: make strong-mode inference aware of the type of LoadLibrary and CheckLibraryIsLoaded MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://github.com/dart-lang/sdk/issues/32841 Change-Id: I270b11b33460b66cd400fa8145ce5e968096a2bf Reviewed-on: https://dart-review.googlesource.com/50622 Commit-Queue: Sigmund Cherem Reviewed-by: Peter von der Ahé --- .../lib/src/fasta/kernel/body_builder.dart | 2 +- .../lib/src/fasta/kernel/fangorn.dart | 13 ++++++++++++ .../lib/src/fasta/kernel/forest.dart | 4 ++++ .../src/fasta/kernel/kernel_shadow_ast.dart | 21 +++++++++++++++++++ .../fasta/kernel/load_library_builder.dart | 11 +++++++++- tests/language_2/language_2_dart2js.status | 4 ++-- tests/language_2/language_2_dartdevc.status | 1 - tests/language_2/language_2_kernel.status | 3 --- 8 files changed, 51 insertions(+), 8 deletions(-) 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 d4463408d8a..da6e2adc024 100644 --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart @@ -3933,7 +3933,7 @@ class BodyBuilder extends ScopeListener Expression wrapInDeferredCheck( Expression expression, KernelPrefixBuilder prefix, int charOffset) { var check = new VariableDeclaration.forValue( - new CheckLibraryIsLoaded(prefix.dependency)) + forest.checkLibraryIsLoaded(prefix.dependency)) ..fileOffset = charOffset; return new ShadowDeferredCheck(check, expression); } diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart index 6aff6edacec..bdd01685b2a 100644 --- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart +++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart @@ -11,6 +11,7 @@ import 'package:kernel/ast.dart' Arguments, DartType, Expression, + LibraryDependency, MapEntry, NamedExpression, Statement, @@ -24,9 +25,11 @@ import 'kernel_shadow_ast.dart' show ShadowArguments, ShadowBoolLiteral, + ShadowCheckLibraryIsLoaded, ShadowDoubleLiteral, ShadowIntLiteral, ShadowListLiteral, + ShadowLoadLibrary, ShadowMapLiteral, ShadowNullLiteral, ShadowStringLiteral, @@ -135,4 +138,14 @@ class Fangorn extends Forest { @override int readOffset(TreeNode node) => node.fileOffset; + + @override + Expression loadLibrary(LibraryDependency dependency) { + return new ShadowLoadLibrary(dependency); + } + + @override + Expression checkLibraryIsLoaded(LibraryDependency dependency) { + return new ShadowCheckLibraryIsLoaded(dependency); + } } diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart index 0656e8cc818..123d16e6eef 100644 --- a/pkg/front_end/lib/src/fasta/kernel/forest.dart +++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart @@ -50,6 +50,10 @@ abstract class Forest { int readOffset(covariant node); + Expression loadLibrary(covariant dependency); + + Expression checkLibraryIsLoaded(covariant dependency); + // TODO(ahe): Remove this method when all users are moved here. kernel.Arguments castArguments(Arguments arguments) { dynamic a = arguments; 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 ecd17f96149..36c7523024a 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 @@ -2382,6 +2382,27 @@ class ShadowYieldStatement extends YieldStatement implements ShadowStatement { } } +/// Concrete shadow object representing a deferred load library call. +class ShadowLoadLibrary extends LoadLibrary implements ShadowExpression { + ShadowLoadLibrary(LibraryDependency import) : super(import); + + @override + DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) { + return super.getStaticType(inferrer.typeSchemaEnvironment); + } +} + +/// Concrete shadow object representing a deferred library-is-loaded check. +class ShadowCheckLibraryIsLoaded extends CheckLibraryIsLoaded + implements ShadowExpression { + ShadowCheckLibraryIsLoaded(LibraryDependency import) : super(import); + + @override + DartType _inferExpression(ShadowTypeInferrer inferrer, DartType typeContext) { + return super.getStaticType(inferrer.typeSchemaEnvironment); + } +} + /// The result of inference for a RHS of an assignment. class _ComplexAssignmentInferenceResult { /// The resolved combiner [Procedure], e.g. `operator+` for `a += 2`, or 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 57eace49ad2..20a7e260a30 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 @@ -20,6 +20,13 @@ import '../builder/builder.dart' show Builder; import 'kernel_library_builder.dart' show KernelLibraryBuilder; +import 'forest.dart' show Forest; + +import 'fangorn.dart' show Fangorn; + +// TODO(ahe): create a single forest and plumb it here instead. +final Forest _forest = new Fangorn(); + /// Builder to represent the `deferLibrary.loadLibrary` calls and tear-offs. class LoadLibraryBuilder extends Builder { final KernelLibraryBuilder parent; @@ -33,11 +40,13 @@ class LoadLibraryBuilder extends Builder { /// null, no tear-offs were seen in the code and no method is generated. Member tearoff; + Forest get forest => _forest; + LoadLibraryBuilder(this.parent, this.importDependency, this.charOffset) : super(parent, charOffset, parent.fileUri); LoadLibrary createLoadLibrary(int charOffset) { - return new LoadLibrary(importDependency)..fileOffset = charOffset; + return forest.loadLibrary(importDependency)..fileOffset = charOffset; } Procedure createTearoffMethod() { diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status index 6aeabf7037c..681e8a94e20 100644 --- a/tests/language_2/language_2_dart2js.status +++ b/tests/language_2/language_2_dart2js.status @@ -1177,7 +1177,7 @@ deferred_redirecting_factory_test: RuntimeError deferred_regression_22995_test: RuntimeError deferred_regression_28678_test: RuntimeError deferred_shadow_load_library_test: RuntimeError -deferred_shared_and_unshared_classes_test: CompileTimeError +deferred_shared_and_unshared_classes_test: RuntimeError deferred_static_seperate_test: RuntimeError deferred_type_dependency_test/as: RuntimeError deferred_type_dependency_test/is: RuntimeError @@ -1846,7 +1846,7 @@ deferred_redirecting_factory_test: RuntimeError deferred_regression_22995_test: RuntimeError deferred_regression_28678_test: RuntimeError deferred_shadow_load_library_test: RuntimeError -deferred_shared_and_unshared_classes_test: CompileTimeError +deferred_shared_and_unshared_classes_test: RuntimeError deferred_static_seperate_test: RuntimeError deferred_type_dependency_test/as: RuntimeError deferred_type_dependency_test/is: RuntimeError diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status index 97c9e8d36a1..eeecf79f713 100644 --- a/tests/language_2/language_2_dartdevc.status +++ b/tests/language_2/language_2_dartdevc.status @@ -375,7 +375,6 @@ deferred_inheritance_constraints_test/implements: MissingCompileTimeError deferred_inheritance_constraints_test/mixin: MissingCompileTimeError deferred_inheritance_constraints_test/redirecting_constructor: MissingCompileTimeError deferred_load_library_wrong_args_test/01: CompileTimeError -deferred_shared_and_unshared_classes_test: CompileTimeError # Issue 31402 Error: A value of type 'dart.core::List' can't be assigned to a variable of type 'dart.core::Iterable>'. double_identical_test: RuntimeError # Negative and positive zero are distinct, but not in ddk duplicate_export_negative_test: Fail duplicate_implements_test/01: MissingCompileTimeError diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status index 3c1f1a33f88..ea83e687a68 100644 --- a/tests/language_2/language_2_kernel.status +++ b/tests/language_2/language_2_kernel.status @@ -636,7 +636,6 @@ deferred_load_constants_test/none: RuntimeError # KernelVM bug: Deferred loading deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273. deferred_not_loaded_check_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273. deferred_redirecting_factory_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273. -deferred_shared_and_unshared_classes_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273. deferred_static_seperate_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273. disassemble_test: Pass, Slow dynamic_prefix_core_test/none: CompileTimeError @@ -958,7 +957,6 @@ deferred_load_constants_test/none: RuntimeError # KernelVM bug: Deferred loading deferred_load_library_wrong_args_test/01: Pass # Passes by mistake. KernelVM bug: Deferred loading kernel issue 30273. deferred_not_loaded_check_test: RuntimeError # Fasta/KernelVM bug: Deferred loading kernel issue 30273. deferred_redirecting_factory_test: CompileTimeError, Fail, Crash # Issue 23408, KernelVM bug: Deferred loading kernel issue 30273. -deferred_shared_and_unshared_classes_test: CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273. deferred_static_seperate_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273. deopt_inlined_function_lazy_test: Skip # Incompatible flag: --deoptimize-alot dynamic_prefix_core_test/none: CompileTimeError @@ -1209,7 +1207,6 @@ constants_test/05: MissingCompileTimeError cyclic_typedef_test/10: Crash cyclic_typedef_test/11: Crash deferred_load_library_wrong_args_test/01: CompileTimeError -deferred_shared_and_unshared_classes_test: CompileTimeError duplicate_implements_test/01: MissingCompileTimeError duplicate_implements_test/02: MissingCompileTimeError dynamic_prefix_core_test/none: CompileTimeError