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:
committed by
commit-bot@chromium.org
parent
6d7df88fa3
commit
ff24a5ee6b
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user