fasta: make strong-mode inference aware of the type of LoadLibrary and CheckLibraryIsLoaded

Closes https://github.com/dart-lang/sdk/issues/32841

Change-Id: I270b11b33460b66cd400fa8145ce5e968096a2bf
Reviewed-on: https://dart-review.googlesource.com/50622
Commit-Queue: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
This commit is contained in:
Sigmund Cherem
2018-04-12 19:44:51 +00:00
committed by commit-bot@chromium.org
parent 6d7df88fa3
commit ff24a5ee6b
8 changed files with 51 additions and 8 deletions
@@ -3933,7 +3933,7 @@ class BodyBuilder<Arguments> extends ScopeListener<JumpTarget>
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);
}
@@ -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<Expression, Statement, Token, Arguments> {
@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);
}
}
@@ -50,6 +50,10 @@ abstract class Forest<Expression, Statement, Location, Arguments> {
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;
@@ -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
@@ -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() {
+2 -2
View File
@@ -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
@@ -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<dynamic>' can't be assigned to a variable of type 'dart.core::Iterable<dart.async::Future<dynamic>>'.
double_identical_test: RuntimeError # Negative and positive zero are distinct, but not in ddk
duplicate_export_negative_test: Fail
duplicate_implements_test/01: MissingCompileTimeError
@@ -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