[cfe] Report compile time error on evaluation of const external constructors
Closes #46123
Change-Id: I91e9b789683b2bd6acb3b4f559ecce6e70f18afc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/207001
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 5be60d4..2ccb299 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -1328,6 +1328,25 @@
r"""Extension operations can't be used in constant expressions.""");
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstEvalExternalConstructor =
+ messageConstEvalExternalConstructor;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstEvalExternalConstructor = const MessageCode(
+ "ConstEvalExternalConstructor",
+ message:
+ r"""External constructors can't be evaluated in constant expressions.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstEvalExternalFactory = messageConstEvalExternalFactory;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstEvalExternalFactory = const MessageCode(
+ "ConstEvalExternalFactory",
+ message:
+ r"""External factory constructors can't be evaluated in constant expressions.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Code<Null> codeConstEvalFailedAssertion = messageConstEvalFailedAssertion;
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/compute_platform_binaries_location.dart b/pkg/front_end/lib/src/compute_platform_binaries_location.dart
index 0ecacc07..96039c4 100644
--- a/pkg/front_end/lib/src/compute_platform_binaries_location.dart
+++ b/pkg/front_end/lib/src/compute_platform_binaries_location.dart
@@ -23,9 +23,17 @@
case 'dartdevc':
switch (nnbdMode) {
case NnbdMode.Strong:
- return 'ddc_platform_sound.dill';
+ // DDC is always compiled against the outline so we use it here by
+ // default.
+ return 'ddc_outline_sound.dill';
+ //TODO(johnniwinther): Support using the full dill.
+ //return 'ddc_platform_sound.dill';
case NnbdMode.Weak:
- return 'ddc_platform.dill';
+ // DDC is always compiled against the outline so we use it here by
+ // default.
+ return 'ddc_outline.dill';
+ //TODO(johnniwinther): Support using the full dill.
+ //return 'ddc_platform.dill';
case NnbdMode.Agnostic:
break;
}
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
index 98068cb..4d0f32a 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
@@ -247,12 +247,19 @@
}
}
+ bool _hasBuiltOutlines = false;
+
@override
void buildOutlineExpressions(
SourceLibraryBuilder library,
CoreTypes coreTypes,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
+ if (_hasBuiltOutlines) return;
+ if (isConst && isPatch) {
+ origin.buildOutlineExpressions(library, coreTypes,
+ delayedActionPerformers, synthesizedFunctionNodes);
+ }
super.buildOutlineExpressions(
library, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
@@ -267,6 +274,10 @@
bodyBuilder.resolveRedirectingFactoryTargets();
}
beginInitializers = null;
+ if (isConst && isPatch) {
+ _finishPatch();
+ }
+ _hasBuiltOutlines = true;
}
@override
@@ -388,10 +399,7 @@
return null;
}
- @override
- int finishPatch() {
- if (!isPatch) return 0;
-
+ void _finishPatch() {
// 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;
@@ -406,6 +414,12 @@
origin.constructor.function.parent = origin.constructor;
origin.constructor.initializers = _constructor.initializers;
setParents(origin.constructor.initializers, origin.constructor);
+ }
+
+ @override
+ int finishPatch() {
+ if (!isPatch) return 0;
+ _finishPatch();
return 1;
}
@@ -438,7 +452,7 @@
// compile), and so we also clear them.
// Note: this method clears both initializers from the target Kernel node
// and internal state associated with parsing initializers.
- _constructor.initializers.length = 0;
+ _constructor.initializers = [];
redirectingInitializer = null;
superInitializer = null;
hasMovedSuperInitializer = false;
diff --git a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
index 8b6c13e..22e54cb 100644
--- a/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/factory_builder.dart
@@ -160,6 +160,20 @@
return _procedureInternal;
}
+ bool _hasBuiltOutlines = false;
+
+ @override
+ void buildOutlineExpressions(
+ SourceLibraryBuilder library,
+ CoreTypes coreTypes,
+ List<DelayedActionPerformer> delayedActionPerformers,
+ List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
+ if (_hasBuiltOutlines) return;
+ super.buildOutlineExpressions(
+ library, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
+ _hasBuiltOutlines = true;
+ }
+
@override
VariableDeclaration? getTearOffParameter(int index) {
if (_factoryTearOff != null) {
@@ -213,10 +227,7 @@
}
}
- @override
- int finishPatch() {
- if (!isPatch) return 0;
-
+ void _finishPatch() {
// 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;
@@ -232,6 +243,12 @@
origin._procedure.function.parent = origin._procedure;
origin._procedure.isRedirectingFactory =
_procedureInternal.isRedirectingFactory;
+ }
+
+ @override
+ int finishPatch() {
+ if (!isPatch) return 0;
+ _finishPatch();
return 1;
}
}
@@ -347,16 +364,23 @@
return _procedureInternal;
}
+ bool _hasBuiltOutlines = false;
+
@override
void buildOutlineExpressions(
SourceLibraryBuilder library,
CoreTypes coreTypes,
List<DelayedActionPerformer> delayedActionPerformers,
List<SynthesizedFunctionNode> synthesizedFunctionNodes) {
+ if (_hasBuiltOutlines) return;
+ if (isConst && isPatch) {
+ origin.buildOutlineExpressions(library, coreTypes,
+ delayedActionPerformers, synthesizedFunctionNodes);
+ }
super.buildOutlineExpressions(
library, coreTypes, delayedActionPerformers, synthesizedFunctionNodes);
RedirectingFactoryBody redirectingFactoryBody =
- _procedure.function.body as RedirectingFactoryBody;
+ _procedureInternal.function.body as RedirectingFactoryBody;
List<DartType>? typeArguments = redirectingFactoryBody.typeArguments;
Member? target = redirectingFactoryBody.target;
if (typeArguments != null && typeArguments.any((t) => t is UnknownType)) {
@@ -422,20 +446,19 @@
typeArguments ?? [],
_tearOffTypeParameters!));
}
+ if (isConst && isPatch) {
+ _finishPatch();
+ }
+ _hasBuiltOutlines = true;
}
- @override
- int finishPatch() {
- if (!isPatch) return 0;
-
- super.finishPatch();
+ void _finishPatch() {
+ super._finishPatch();
SourceFactoryBuilder redirectingOrigin = origin;
if (redirectingOrigin is RedirectingFactoryBuilder) {
redirectingOrigin.typeArguments = typeArguments;
}
-
- return 1;
}
List<DartType>? getTypeArguments() {
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index cb1f2a1..48bbed7 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -1918,7 +1918,7 @@
if (cls == null) return null;
}
- userCode!.loader.seenMessages.clear();
+ userCode!.loader.resetSeenMessages();
for (TypeParameter typeParam in typeDefinitions) {
if (!isLegalIdentifier(typeParam.name!)) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 12ee6bb..d365898 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -41,6 +41,8 @@
messageConstEvalCircularity,
messageConstEvalContext,
messageConstEvalExtension,
+ messageConstEvalExternalConstructor,
+ messageConstEvalExternalFactory,
messageConstEvalFailedAssertion,
messageConstEvalNotListOrSetInSpread,
messageConstEvalNotMapInSpread,
@@ -1652,6 +1654,8 @@
node,
'Constructor "$node" has non-trivial body '
'"${constructor.function.body.runtimeType}".');
+ } else if (constructor.isExternal) {
+ return createErrorConstant(node, messageConstEvalExternalConstructor);
}
return null;
}
@@ -3012,30 +3016,33 @@
isConst: true));
}
if (target.kind == ProcedureKind.Factory) {
- if (target.isConst &&
- target.enclosingLibrary == coreTypes.coreLibrary &&
- positionals.length == 1 &&
- (target.name.text == "fromEnvironment" ||
- target.name.text == "hasEnvironment")) {
- if (environmentDefines != null) {
- // Evaluate environment constant.
- Constant name = positionals.single;
- if (name is StringConstant) {
- if (target.name.text == "fromEnvironment") {
- return _handleFromEnvironment(target, name, named);
- } else {
- return _handleHasEnvironment(name);
+ if (target.isConst) {
+ if (target.enclosingLibrary == coreTypes.coreLibrary &&
+ positionals.length == 1 &&
+ (target.name.text == "fromEnvironment" ||
+ target.name.text == "hasEnvironment")) {
+ if (environmentDefines != null) {
+ // Evaluate environment constant.
+ Constant name = positionals.single;
+ if (name is StringConstant) {
+ if (target.name.text == "fromEnvironment") {
+ return _handleFromEnvironment(target, name, named);
+ } else {
+ return _handleHasEnvironment(name);
+ }
+ } else if (name is NullConstant) {
+ return createErrorConstant(node, messageConstEvalNullValue);
}
- } else if (name is NullConstant) {
- return createErrorConstant(node, messageConstEvalNullValue);
+ } else {
+ // Leave environment constant unevaluated.
+ return unevaluated(
+ node,
+ new StaticInvocation(target,
+ unevaluatedArguments(positionals, named, arguments.types),
+ isConst: true));
}
- } else {
- // Leave environment constant unevaluated.
- return unevaluated(
- node,
- new StaticInvocation(target,
- unevaluatedArguments(positionals, named, arguments.types),
- isConst: true));
+ } else if (target.isExternal) {
+ return createErrorConstant(node, messageConstEvalExternalFactory);
}
}
} else if (target.name.text == 'identical') {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
index 6868aa7..d0033fa 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
@@ -46,6 +46,17 @@
@override
void reportInvalidExpression(InvalidExpression node) {
+ // TODO(johnniwinther): Improve the precision of this assertion. Do we
+ // for instance allow warnings only to have been reported in previous
+ // compilations.
+ assert(
+ // Either we have already reported an error
+ loader.hasSeenError ||
+ // or we have reported an error in a previous compilation.
+ loader.builders.values.any((builder) =>
+ builder.library.problemsAsJson?.isNotEmpty ?? false),
+ "No error reported before seeing: "
+ "${node.message}");
// Assumed to be already reported.
}
}
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index 31aea33..7dedab8 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -81,6 +81,15 @@
final List<FormattedMessage> allComponentProblems = <FormattedMessage>[];
final Set<String> seenMessages = new Set<String>();
+ bool _hasSeenError = false;
+
+ void resetSeenMessages() {
+ seenMessages.clear();
+ _hasSeenError = false;
+ }
+
+ /// Returns `true` if a compile time error has been reported.
+ bool get hasSeenError => _hasSeenError;
LibraryBuilder? _coreLibrary;
LibraryBuilder? typedDataLibrary;
@@ -362,6 +371,9 @@
severity: $severity
""";
if (!seenMessages.add(trace)) return null;
+ if (message.code.severity == Severity.error) {
+ _hasSeenError = true;
+ }
if (message.code.severity == Severity.context) {
internalProblem(
templateInternalProblemContextSeverity
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index b201a4c..ba2bc55 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -103,6 +103,10 @@
ConstEvalDuplicateKey/example: Fail
ConstEvalElementImplementsEqual/example: Fail
ConstEvalExtension/example: Fail
+ConstEvalExternalConstructor/analyzerCode: Fail
+ConstEvalExternalConstructor/example: Fail
+ConstEvalExternalFactory/analyzerCode: Fail
+ConstEvalExternalFactory/example: Fail
ConstEvalFailedAssertion/example: Fail
ConstEvalFailedAssertionWithMessage/example: Fail
ConstEvalFreeTypeParameter/analyzerCode: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index f0cb719..0873cba 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -219,6 +219,12 @@
template: "Extension operations can't be used in constant expressions."
analyzerCode: NOT_CONSTANT_EXPRESSION
+ConstEvalExternalConstructor:
+ template: "External constructors can't be evaluated in constant expressions."
+
+ConstEvalExternalFactory:
+ template: "External factory constructors can't be evaluated in constant expressions."
+
ConstEvalUnevaluated:
template: "Couldn't evaluate constant expression."
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index ec72c29..b0e58b2 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -221,6 +221,7 @@
combiner
compared
compares
+compilations
completes
complicating
component's
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index ad13d98..bb193c9 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -702,6 +702,7 @@
pack
paging
paint
+parallax
parameterized
party
pause
diff --git a/pkg/front_end/testcases/dartdevc/symbol.dart b/pkg/front_end/testcases/dartdevc/symbol.dart
new file mode 100644
index 0000000..e899102
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/symbol.dart
@@ -0,0 +1,5 @@
+// Copyright (c) 2021, 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() => const Symbol('a');
\ No newline at end of file
diff --git a/pkg/front_end/testcases/dartdevc/symbol.dart.strong.expect b/pkg/front_end/testcases/dartdevc/symbol.dart.strong.expect
new file mode 100644
index 0000000..d827f5b
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/symbol.dart.strong.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:_internal" as _in;
+
+static method main() → dynamic
+ return #C1;
+
+constants {
+ #C1 = #a
+}
diff --git a/pkg/front_end/testcases/dartdevc/symbol.dart.strong.transformed.expect b/pkg/front_end/testcases/dartdevc/symbol.dart.strong.transformed.expect
new file mode 100644
index 0000000..d827f5b
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/symbol.dart.strong.transformed.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:_internal" as _in;
+
+static method main() → dynamic
+ return #C1;
+
+constants {
+ #C1 = #a
+}
diff --git a/pkg/front_end/testcases/dartdevc/symbol.dart.textual_outline.expect b/pkg/front_end/testcases/dartdevc/symbol.dart.textual_outline.expect
new file mode 100644
index 0000000..3aa6646
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/symbol.dart.textual_outline.expect
@@ -0,0 +1 @@
+main() => const Symbol('a');
diff --git a/pkg/front_end/testcases/dartdevc/symbol.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/dartdevc/symbol.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..3aa6646
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/symbol.dart.textual_outline_modelled.expect
@@ -0,0 +1 @@
+main() => const Symbol('a');
diff --git a/pkg/front_end/testcases/dartdevc/symbol.dart.weak.expect b/pkg/front_end/testcases/dartdevc/symbol.dart.weak.expect
new file mode 100644
index 0000000..d827f5b
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/symbol.dart.weak.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:_internal" as _in;
+
+static method main() → dynamic
+ return #C1;
+
+constants {
+ #C1 = #a
+}
diff --git a/pkg/front_end/testcases/dartdevc/symbol.dart.weak.outline.expect b/pkg/front_end/testcases/dartdevc/symbol.dart.weak.outline.expect
new file mode 100644
index 0000000..e2cba6b
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/symbol.dart.weak.outline.expect
@@ -0,0 +1,5 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/dartdevc/symbol.dart.weak.transformed.expect b/pkg/front_end/testcases/dartdevc/symbol.dart.weak.transformed.expect
new file mode 100644
index 0000000..d827f5b
--- /dev/null
+++ b/pkg/front_end/testcases/dartdevc/symbol.dart.weak.transformed.expect
@@ -0,0 +1,10 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:_internal" as _in;
+
+static method main() → dynamic
+ return #C1;
+
+constants {
+ #C1 = #a
+}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart
new file mode 100644
index 0000000..0210c32
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, 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:js/js.dart';
+
+@JS()
+@anonymous
+class ParallaxOptions {
+ external const factory ParallaxOptions();
+}
+
+test() => const ParallaxOptions();
+
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.textual_outline.expect
new file mode 100644
index 0000000..8b3f432
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+import 'package:js/js.dart';
+
+@JS()
+@anonymous
+class ParallaxOptions {
+ external const factory ParallaxOptions();
+}
+
+test() => const ParallaxOptions();
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..bef2d3d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+import 'package:js/js.dart';
+
+@JS()
+@anonymous
+class ParallaxOptions {
+ external const factory ParallaxOptions();
+}
+
+main() {}
+test() => const ParallaxOptions();
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.expect
new file mode 100644
index 0000000..c1c307d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart:13:17: Error: Constant evaluation error:
+// test() => const ParallaxOptions();
+// ^
+// pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart:13:17: Context: External factory constructors can't be evaluated in constant expressions.
+// test() => const ParallaxOptions();
+// ^
+//
+import self as self;
+import "package:js/js.dart" as js;
+import "dart:core" as core;
+
+import "package:js/js.dart";
+
+@#C2
+@#C3
+class ParallaxOptions extends core::Object {
+ external static factory •() → self::ParallaxOptions;
+}
+static method test() → dynamic
+ return invalid-expression "External factory constructors can't be evaluated in constant expressions.";
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+ #C2 = js::JS {name:#C1}
+ #C3 = js::_Anonymous {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue46123.dart:
+- JS. (from org-dartlang-testcase-sdk:///pkg/js/lib/js.dart:21:9)
+- Object. (from org-dartlang-sdk:///lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.outline.expect
new file mode 100644
index 0000000..d5602f8
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.outline.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "package:js/js.dart" as js;
+import "dart:core" as core;
+
+import "package:js/js.dart";
+
+@js::JS::•()
+@js::anonymous
+class ParallaxOptions extends core::Object {
+ external static factory •() → self::ParallaxOptions;
+}
+static method test() → dynamic
+ ;
+static method main() → dynamic
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue46123.dart:7:2 -> InstanceConstant(const JS{JS.name: null})
+Evaluated: StaticGet @ org-dartlang-testcase:///issue46123.dart:8:2 -> InstanceConstant(const _Anonymous{})
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.transformed.expect
new file mode 100644
index 0000000..c1c307d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart.weak.transformed.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart:13:17: Error: Constant evaluation error:
+// test() => const ParallaxOptions();
+// ^
+// pkg/front_end/testcases/general/constants/js_semantics/issue46123.dart:13:17: Context: External factory constructors can't be evaluated in constant expressions.
+// test() => const ParallaxOptions();
+// ^
+//
+import self as self;
+import "package:js/js.dart" as js;
+import "dart:core" as core;
+
+import "package:js/js.dart";
+
+@#C2
+@#C3
+class ParallaxOptions extends core::Object {
+ external static factory •() → self::ParallaxOptions;
+}
+static method test() → dynamic
+ return invalid-expression "External factory constructors can't be evaluated in constant expressions.";
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+ #C2 = js::JS {name:#C1}
+ #C3 = js::_Anonymous {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue46123.dart:
+- JS. (from org-dartlang-testcase-sdk:///pkg/js/lib/js.dart:21:9)
+- Object. (from org-dartlang-sdk:///lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart
new file mode 100644
index 0000000..ecc1c05
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2020, 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:js/js.dart';
+
+@JS()
+@anonymous
+class ParallaxOptions {
+ external const ParallaxOptions();
+}
+
+test() => const ParallaxOptions();
+
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.textual_outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.textual_outline.expect
new file mode 100644
index 0000000..2d26ea3
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.textual_outline.expect
@@ -0,0 +1,10 @@
+import 'package:js/js.dart';
+
+@JS()
+@anonymous
+class ParallaxOptions {
+ external const ParallaxOptions();
+}
+
+test() => const ParallaxOptions();
+main() {}
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..0c3a93a
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.textual_outline_modelled.expect
@@ -0,0 +1,10 @@
+import 'package:js/js.dart';
+
+@JS()
+@anonymous
+class ParallaxOptions {
+ external const ParallaxOptions();
+}
+
+main() {}
+test() => const ParallaxOptions();
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.expect
new file mode 100644
index 0000000..29f09a1
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart:13:17: Error: Constant evaluation error:
+// test() => const ParallaxOptions();
+// ^
+// pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart:13:17: Context: External constructors can't be evaluated in constant expressions.
+// test() => const ParallaxOptions();
+// ^
+//
+import self as self;
+import "package:js/js.dart" as js;
+import "dart:core" as core;
+
+import "package:js/js.dart";
+
+@#C2
+@#C3
+class ParallaxOptions extends core::Object /*hasConstConstructor*/ {
+ external const constructor •() → self::ParallaxOptions
+ : super core::Object::•()
+ ;
+}
+static method test() → dynamic
+ return invalid-expression "External constructors can't be evaluated in constant expressions.";
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+ #C2 = js::JS {name:#C1}
+ #C3 = js::_Anonymous {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue46123b.dart:
+- JS. (from org-dartlang-testcase-sdk:///pkg/js/lib/js.dart:21:9)
+- Object. (from org-dartlang-sdk:///lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.outline.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.outline.expect
new file mode 100644
index 0000000..78273bc
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.outline.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "package:js/js.dart" as js;
+import "dart:core" as core;
+
+import "package:js/js.dart";
+
+@js::JS::•()
+@js::anonymous
+class ParallaxOptions extends core::Object /*hasConstConstructor*/ {
+ external const constructor •() → self::ParallaxOptions
+ : super core::Object::•()
+ ;
+}
+static method test() → dynamic
+ ;
+static method main() → dynamic
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue46123b.dart:7:2 -> InstanceConstant(const JS{JS.name: null})
+Evaluated: StaticGet @ org-dartlang-testcase:///issue46123b.dart:8:2 -> InstanceConstant(const _Anonymous{})
+Extra constant evaluation: evaluated: 2, effectively constant: 2
diff --git a/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.transformed.expect
new file mode 100644
index 0000000..29f09a1
--- /dev/null
+++ b/pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart.weak.transformed.expect
@@ -0,0 +1,39 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart:13:17: Error: Constant evaluation error:
+// test() => const ParallaxOptions();
+// ^
+// pkg/front_end/testcases/general/constants/js_semantics/issue46123b.dart:13:17: Context: External constructors can't be evaluated in constant expressions.
+// test() => const ParallaxOptions();
+// ^
+//
+import self as self;
+import "package:js/js.dart" as js;
+import "dart:core" as core;
+
+import "package:js/js.dart";
+
+@#C2
+@#C3
+class ParallaxOptions extends core::Object /*hasConstConstructor*/ {
+ external const constructor •() → self::ParallaxOptions
+ : super core::Object::•()
+ ;
+}
+static method test() → dynamic
+ return invalid-expression "External constructors can't be evaluated in constant expressions.";
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+ #C2 = js::JS {name:#C1}
+ #C3 = js::_Anonymous {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue46123b.dart:
+- JS. (from org-dartlang-testcase-sdk:///pkg/js/lib/js.dart:21:9)
+- Object. (from org-dartlang-sdk:///lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constructor_patch/libraries.json b/pkg/front_end/testcases/general/constructor_patch/libraries.json
new file mode 100644
index 0000000..154c73c
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_patch/libraries.json
@@ -0,0 +1,12 @@
+{
+ "none": {
+ "libraries": {
+ "test": {
+ "patches": [
+ "patch_lib.dart"
+ ],
+ "uri": "origin_lib.dart"
+ }
+ }
+ }
+}
diff --git a/pkg/front_end/testcases/general/constructor_patch/main.dart b/pkg/front_end/testcases/general/constructor_patch/main.dart
new file mode 100644
index 0000000..dd2a110
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_patch/main.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2020, 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:test';
+
+main() {
+ new Class.generative();
+ const Class.constGenerative();
+}
diff --git a/pkg/front_end/testcases/general/constructor_patch/main.dart.textual_outline.expect b/pkg/front_end/testcases/general/constructor_patch/main.dart.textual_outline.expect
new file mode 100644
index 0000000..3c9c90e
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_patch/main.dart.textual_outline.expect
@@ -0,0 +1,3 @@
+import 'dart:test';
+
+main() {}
diff --git a/pkg/front_end/testcases/general/constructor_patch/main.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/constructor_patch/main.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..3c9c90e
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_patch/main.dart.textual_outline_modelled.expect
@@ -0,0 +1,3 @@
+import 'dart:test';
+
+main() {}
diff --git a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.expect b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.expect
new file mode 100644
index 0000000..40f37f3
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:test" as test;
+
+import "dart:test";
+
+static method main() → dynamic {
+ new test::Class::generative();
+ #C2;
+}
+
+library /*isNonNullableByDefault*/;
+import self as test;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C3
+class Class extends core::Object /*hasConstConstructor*/ {
+ final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
+ @#C3
+ constructor generative({core::bool defaultValue = #C1}) → test::Class
+ : test::Class::defaultValue = defaultValue, super core::Object::•()
+ ;
+ @#C3
+ const constructor constGenerative({core::bool defaultValue = #C1}) → test::Class
+ : test::Class::defaultValue = defaultValue, super core::Object::•()
+ ;
+}
+
+constants {
+ #C1 = true
+ #C2 = test::Class {defaultValue:#C1}
+ #C3 = _in::_Patch {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main.dart:
+- Class.constGenerative (from org-dartlang-testcase:///patch_lib.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.outline.expect
new file mode 100644
index 0000000..d5e5658
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.outline.expect
@@ -0,0 +1,33 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+
+import "dart:test";
+
+static method main() → dynamic
+ ;
+
+library /*isNonNullableByDefault*/;
+import self as self2;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@_in::patch
+class Class extends core::Object /*hasConstConstructor*/ {
+ final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
+ @_in::patch
+ external constructor generative({core::bool defaultValue}) → self2::Class
+ ;
+ @_in::patch
+ const constructor constGenerative({core::bool defaultValue = true}) → self2::Class
+ : self2::Class::defaultValue = defaultValue, super core::Object::•()
+ ;
+}
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:6:49 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:7:44 -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:16:9 -> InstanceConstant(const _Patch{})
+Extra constant evaluation: evaluated: 4, effectively constant: 3
diff --git a/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.transformed.expect
new file mode 100644
index 0000000..40f37f3
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_patch/main.dart.weak.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:test" as test;
+
+import "dart:test";
+
+static method main() → dynamic {
+ new test::Class::generative();
+ #C2;
+}
+
+library /*isNonNullableByDefault*/;
+import self as test;
+import "dart:_internal" as _in;
+import "dart:core" as core;
+
+import "dart:_internal";
+
+@#C3
+class Class extends core::Object /*hasConstConstructor*/ {
+ final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
+ @#C3
+ constructor generative({core::bool defaultValue = #C1}) → test::Class
+ : test::Class::defaultValue = defaultValue, super core::Object::•()
+ ;
+ @#C3
+ const constructor constGenerative({core::bool defaultValue = #C1}) → test::Class
+ : test::Class::defaultValue = defaultValue, super core::Object::•()
+ ;
+}
+
+constants {
+ #C1 = true
+ #C2 = test::Class {defaultValue:#C1}
+ #C3 = _in::_Patch {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///main.dart:
+- Class.constGenerative (from org-dartlang-testcase:///patch_lib.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constructor_patch/origin_lib.dart b/pkg/front_end/testcases/general/constructor_patch/origin_lib.dart
new file mode 100644
index 0000000..2906fbf
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_patch/origin_lib.dart
@@ -0,0 +1,8 @@
+// Copyright (c) 2020, 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 Class {
+ external Class.generative({bool defaultValue: true});
+ external const Class.constGenerative({bool defaultValue: true});
+}
diff --git a/pkg/front_end/testcases/general/constructor_patch/patch_lib.dart b/pkg/front_end/testcases/general/constructor_patch/patch_lib.dart
new file mode 100644
index 0000000..0c4899c
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_patch/patch_lib.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// ignore: import_internal_library
+import 'dart:_internal';
+
+@patch
+class Class {
+ final bool defaultValue;
+
+ @patch
+ Class.generative({this.defaultValue: true});
+
+ @patch
+ const Class.constGenerative({this.defaultValue: true});
+}
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect
index f739cd9..3cddf53 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.expect
@@ -9,6 +9,14 @@
}
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/factory_patch/patch_lib.dart:22:52: Error: Can't have a default value here because any default values of 'Class._internal' would be used instead.
+// Try removing the default value.
+// const factory Class.redirect({bool defaultValue: true}) = Class._internal;
+// ^
+//
import self as test;
import "dart:_internal" as _in;
import "dart:core" as core;
@@ -18,6 +26,7 @@
@#C1
class Class extends core::Object {
final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
+ static final field dynamic _redirecting# = <dynamic>[test::Class::redirect]/*isLegacy*/;
const constructor _internal({core::bool defaultValue = #C2}) → test::Class
: test::Class::defaultValue = defaultValue, super core::Object::•()
;
@@ -27,6 +36,9 @@
@#C1
static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = #C3}) → test::Class
return throw "unsupported";
+ @#C1
+ static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C3}) → test::Class
+ let dynamic #redirecting_factory = test::Class::_internal in invalid-expression;
}
constants {
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect
index 25c2ffa..62a00f1 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.outline.expect
@@ -16,6 +16,7 @@
@_in::patch
class Class extends core::Object {
final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
+ static final field dynamic _redirecting# = <dynamic>[self2::Class::redirect]/*isLegacy*/;
const constructor _internal({core::bool defaultValue = false}) → self2::Class
: self2::Class::defaultValue = defaultValue, super core::Object::•()
;
@@ -23,6 +24,9 @@
external static factory fact({core::bool defaultValue}) → self2::Class;
@_in::patch
external static factory constFact({core::bool defaultValue = true}) → self2::Class;
+ @_in::patch
+ static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = true}) → self2::Class
+ let dynamic #redirecting_factory = self2::Class::_internal in invalid-expression;
}
@@ -30,4 +34,5 @@
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:6:49 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:8:27 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
-Extra constant evaluation: evaluated: 4, effectively constant: 3
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:22:17 -> InstanceConstant(const _Patch{})
+Extra constant evaluation: evaluated: 9, effectively constant: 4
diff --git a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect
index f739cd9..3cddf53 100644
--- a/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/factory_patch/main.dart.weak.transformed.expect
@@ -9,6 +9,14 @@
}
library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/factory_patch/patch_lib.dart:22:52: Error: Can't have a default value here because any default values of 'Class._internal' would be used instead.
+// Try removing the default value.
+// const factory Class.redirect({bool defaultValue: true}) = Class._internal;
+// ^
+//
import self as test;
import "dart:_internal" as _in;
import "dart:core" as core;
@@ -18,6 +26,7 @@
@#C1
class Class extends core::Object {
final field core::bool defaultValue /* from org-dartlang-testcase:///patch_lib.dart */;
+ static final field dynamic _redirecting# = <dynamic>[test::Class::redirect]/*isLegacy*/;
const constructor _internal({core::bool defaultValue = #C2}) → test::Class
: test::Class::defaultValue = defaultValue, super core::Object::•()
;
@@ -27,6 +36,9 @@
@#C1
static factory /* from org-dartlang-testcase:///patch_lib.dart */ constFact({core::bool defaultValue = #C3}) → test::Class
return throw "unsupported";
+ @#C1
+ static factory /* from org-dartlang-testcase:///patch_lib.dart */ redirect({core::bool defaultValue = #C3}) → test::Class
+ let dynamic #redirecting_factory = test::Class::_internal in invalid-expression;
}
constants {
diff --git a/pkg/front_end/testcases/general/factory_patch/origin_lib.dart b/pkg/front_end/testcases/general/factory_patch/origin_lib.dart
index e7895f2..300b31e 100644
--- a/pkg/front_end/testcases/general/factory_patch/origin_lib.dart
+++ b/pkg/front_end/testcases/general/factory_patch/origin_lib.dart
@@ -5,5 +5,5 @@
class Class {
external factory Class.fact({bool defaultValue: true});
external const factory Class.constFact({bool defaultValue: true});
- //external const factory Class.redirect({bool defaultValue: true});
+ external const factory Class.redirect({bool defaultValue: true});
}
diff --git a/pkg/front_end/testcases/general/factory_patch/patch_lib.dart b/pkg/front_end/testcases/general/factory_patch/patch_lib.dart
index cfc2278..e1fe3fd 100644
--- a/pkg/front_end/testcases/general/factory_patch/patch_lib.dart
+++ b/pkg/front_end/testcases/general/factory_patch/patch_lib.dart
@@ -18,7 +18,6 @@
@patch
factory Class.constFact({bool defaultValue: true}) => throw 'unsupported';
- /*@patch
- const factory Class.redirect({bool defaultValue: true}) =
- this._internal(defaultValue: defaultValue);*/
+ @patch
+ const factory Class.redirect({bool defaultValue: true}) = Class._internal;
}
diff --git a/pkg/front_end/testcases/general/issue45101/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue45101/main.dart.weak.outline.expect
index c56c375..68f366e 100644
--- a/pkg/front_end/testcases/general/issue45101/main.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue45101/main.dart.weak.outline.expect
@@ -34,7 +34,7 @@
class Array<T extends core::Object* = dynamic> extends core::Object {
static final field dynamic _redirecting# = <dynamic>[self2::Array::•];
@_in::patch
- external static factory •<T extends core::Object* = dynamic>(core::int* foo) → self2::Array<self2::Array::•::T*>*
+ static factory /* from org-dartlang-testcase:///patch_lib.dart */ •<T extends core::Object* = dynamic>(core::int* foo) → self2::Array<self2::Array::•::T*>*
let dynamic #redirecting_factory = self2::_ArraySize::• in let self2::Array::•::T* #typeArg0 = null in invalid-expression;
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -52,5 +52,5 @@
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:10:1 -> InstanceConstant(const _Patch{})
Evaluated: ConstructorInvocation @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const pragma{pragma.name: "vm:entry-point", pragma.options: null})
-Evaluated: StaticGet @ (unknown position in org-dartlang-testcase:///origin_lib.dart) -> InstanceConstant(const _Patch{})
+Evaluated: StaticGet @ org-dartlang-testcase:///patch_lib.dart:14:17 -> InstanceConstant(const _Patch{})
Extra constant evaluation: evaluated: 9, effectively constant: 3
diff --git a/pkg/front_end/tool/dart_doctest_impl.dart b/pkg/front_end/tool/dart_doctest_impl.dart
index 3051c00e..38e9a55 100644
--- a/pkg/front_end/tool/dart_doctest_impl.dart
+++ b/pkg/front_end/tool/dart_doctest_impl.dart
@@ -789,7 +789,7 @@
LibraryBuilder libraryBuilder = userCode!.loader
.read(libraryUri, -1, accessor: userCode!.loader.first);
- userCode!.loader.seenMessages.clear();
+ userCode!.loader.resetSeenMessages();
_dartDocTestLibraryBuilder = libraryBuilder;
_dartDocTestCode = dartDocTestCode;