Skip to content

Commit 6d70657

Browse files
johnniwintherCommit Queue
authored andcommitted
[kernel] Add RedirectingFactoryInvocation
This adds an internal wrapper expression for redirecting factory invocations. This holds a reference to the original redirecting factory constructor along with the resulting invocation of the generative or factory constructor. The node is removed during constant evaluation and only available to backends through the pre-modular transformations. TEST=existing Change-Id: I35c19766117ab2942aefddb4ccebcd2df66babf3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/454820 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Chloe Stefantsova <[email protected]> Reviewed-by: Alexander Markov <[email protected]>
1 parent a9c91a1 commit 6d70657

File tree

49 files changed

+485
-213
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+485
-213
lines changed

pkg/front_end/lib/src/kernel/constant_evaluator.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2360,6 +2360,16 @@ class ConstantsTransformer extends RemovingTransformer {
23602360
return super.visitConstructorInvocation(node, removalSentinel);
23612361
}
23622362

2363+
@override
2364+
TreeNode visitRedirectingFactoryInvocation(
2365+
RedirectingFactoryInvocation node,
2366+
TreeNode? removalSentinel,
2367+
) {
2368+
return transformOrRemove(node.expression, removalSentinel) ??
2369+
// Coverage-ignore(suite): Not run.
2370+
node.expression;
2371+
}
2372+
23632373
@override
23642374
TreeNode visitStaticInvocation(
23652375
StaticInvocation node,
@@ -5930,6 +5940,13 @@ class ConstantEvaluator
59305940
"Unsupported auxiliary expression ${node} (${node.runtimeType}).",
59315941
);
59325942
}
5943+
5944+
@override
5945+
Constant visitRedirectingFactoryInvocation(
5946+
RedirectingFactoryInvocation node,
5947+
) {
5948+
return node.expression.accept(this);
5949+
}
59335950
}
59345951

59355952
class StatementConstantEvaluator

pkg/front_end/lib/src/type_inference/inference_results.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,11 @@ class SuccessfulInferenceResult implements InvocationInferenceResult {
171171
List<VariableDeclaration>? hoistedArguments = this.hoistedArguments;
172172
if (hoistedArguments == null || hoistedArguments.isEmpty) {
173173
return expression;
174+
} else if (expression is RedirectingFactoryInvocation) {
175+
return InvocationInferenceResult._insertHoistedExpressions(
176+
expression,
177+
hoistedArguments,
178+
);
174179
} else {
175180
assert(
176181
expression is InvocationExpression || expression is InvalidExpression,

pkg/front_end/lib/src/type_inference/inference_visitor.dart

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,15 @@ class InferenceVisitorImpl extends InferenceVisitorBase
769769
return ensureAssignableResult(typeContext, inferredResult);
770770
}
771771

772+
@override
773+
// Coverage-ignore(suite): Not run.
774+
ExpressionInferenceResult visitRedirectingFactoryInvocation(
775+
RedirectingFactoryInvocation node,
776+
DartType typeContext,
777+
) {
778+
return _unhandledExpression(node, typeContext);
779+
}
780+
772781
@override
773782
// Coverage-ignore(suite): Not run.
774783
ExpressionInferenceResult visitListConcatenation(
@@ -2558,10 +2567,9 @@ class InferenceVisitorImpl extends InferenceVisitorBase
25582567
required bool isConst,
25592568
required bool hasInferredTypeArguments,
25602569
}) {
2561-
Procedure initialTarget = target;
25622570
Expression replacementNode;
25632571

2564-
_RedirectionTarget redirectionTarget = _getRedirectionTarget(initialTarget);
2572+
_RedirectionTarget redirectionTarget = _getRedirectionTarget(target);
25652573
Member resolvedTarget = redirectionTarget.target;
25662574
if (redirectionTarget.typeArguments.any((type) => type is UnknownType)) {
25672575
return null;
@@ -2578,7 +2586,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
25782586
..fileOffset = fileOffset;
25792587
} else {
25802588
Substitution substitution = Substitution.fromPairs(
2581-
initialTarget.function.typeParameters,
2589+
target.function.typeParameters,
25822590
arguments.types,
25832591
);
25842592
for (int i = 0; i < redirectionTarget.typeArguments.length; i++) {
@@ -2594,8 +2602,11 @@ class InferenceVisitorImpl extends InferenceVisitorBase
25942602
arguments.types.length = redirectionTarget.typeArguments.length;
25952603

25962604
replacementNode = _buildRedirectingFactoryTargetInvocation(
2597-
resolvedTarget,
2598-
new Arguments(
2605+
redirectingFactoryTarget: target.reference != resolvedTarget.reference
2606+
? target
2607+
: null,
2608+
effectiveTarget: resolvedTarget,
2609+
arguments: new Arguments(
25992610
arguments.positional,
26002611
types: arguments.types,
26012612
named: arguments.named,
@@ -2608,25 +2619,26 @@ class InferenceVisitorImpl extends InferenceVisitorBase
26082619
return replacementNode;
26092620
}
26102621

2611-
Expression _buildRedirectingFactoryTargetInvocation(
2612-
Member target,
2613-
Arguments arguments, {
2622+
Expression _buildRedirectingFactoryTargetInvocation({
2623+
required Procedure? redirectingFactoryTarget,
2624+
required Member effectiveTarget,
2625+
required Arguments arguments,
26142626
required bool isConst,
26152627
required int fileOffset,
26162628
required bool hasInferredTypeArguments,
26172629
}) {
26182630
Expression? result = problemReporting.checkStaticArguments(
26192631
compilerContext: compilerContext,
2620-
target: target,
2632+
target: effectiveTarget,
26212633
arguments: arguments,
26222634
fileOffset: fileOffset,
26232635
fileUri: fileUri,
26242636
);
26252637
if (result != null) {
26262638
return result;
26272639
}
2628-
if (target is Constructor) {
2629-
if (isConst && !target.isConst) {
2640+
if (effectiveTarget is Constructor) {
2641+
if (isConst && !effectiveTarget.isConst) {
26302642
// Coverage-ignore-block(suite): Not run.
26312643
return problemReporting.buildProblem(
26322644
compilerContext: compilerContext,
@@ -2638,16 +2650,27 @@ class InferenceVisitorImpl extends InferenceVisitorBase
26382650
}
26392651
problemReporting.checkBoundsInConstructorInvocation(
26402652
libraryFeatures: libraryFeatures,
2641-
constructor: target,
2653+
constructor: effectiveTarget,
26422654
typeArguments: arguments.types,
26432655
typeEnvironment: typeSchemaEnvironment,
26442656
fileUri: fileUri,
26452657
fileOffset: fileOffset,
26462658
);
2647-
return new ConstructorInvocation(target, arguments, isConst: isConst)
2648-
..fileOffset = fileOffset;
2659+
ConstructorInvocation constructorInvocation = new ConstructorInvocation(
2660+
effectiveTarget,
2661+
arguments,
2662+
isConst: isConst,
2663+
)..fileOffset = fileOffset;
2664+
if (redirectingFactoryTarget != null) {
2665+
return new RedirectingFactoryInvocation(
2666+
redirectingFactoryTarget,
2667+
constructorInvocation,
2668+
)..fileOffset = fileOffset;
2669+
} else {
2670+
return constructorInvocation;
2671+
}
26492672
} else {
2650-
Procedure procedure = target as Procedure;
2673+
Procedure procedure = effectiveTarget as Procedure;
26512674
if (isConst && !procedure.isConst) {
26522675
// Coverage-ignore-block(suite): Not run.
26532676
if (procedure.isExtensionTypeMember) {
@@ -2673,15 +2696,26 @@ class InferenceVisitorImpl extends InferenceVisitorBase
26732696
}
26742697
problemReporting.checkBoundsInFactoryInvocation(
26752698
libraryFeatures: libraryFeatures,
2676-
factory: target,
2699+
factory: effectiveTarget,
26772700
typeArguments: arguments.types,
26782701
typeEnvironment: typeSchemaEnvironment,
26792702
fileUri: fileUri,
26802703
fileOffset: fileOffset,
26812704
inferred: hasInferredTypeArguments,
26822705
);
2683-
return new StaticInvocation(target, arguments, isConst: isConst)
2684-
..fileOffset = fileOffset;
2706+
StaticInvocation factoryInvocation = new StaticInvocation(
2707+
effectiveTarget,
2708+
arguments,
2709+
isConst: isConst,
2710+
)..fileOffset = fileOffset;
2711+
if (redirectingFactoryTarget != null) {
2712+
return new RedirectingFactoryInvocation(
2713+
redirectingFactoryTarget,
2714+
factoryInvocation,
2715+
)..fileOffset = fileOffset;
2716+
} else {
2717+
return factoryInvocation;
2718+
}
26852719
}
26862720
}
26872721

pkg/front_end/testcases/constructor_tearoffs/lowering/const_redirect.dart.strong.outline.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ typedef Alias = self::Const;
2525
typedef ImplAlias<T extends core::num> = self::_ConstImpl<T>;
2626
class Class extends core::Object /*hasConstConstructor*/ {
2727
final field core::List<self::Const> constants;
28-
constructor •({core::List<self::Const> constants = const <self::Const>[const self::_ConstImpl::•<dynamic>(), const self::_ConstImpl::•<dynamic>(), const self::_ConstImpl::•<core::String>()]}) → self::Class
28+
constructor •({core::List<self::Const> constants = const <self::Const>[/*original=self::Const::impl*/ const self::_ConstImpl::•<dynamic>(), /*original=self::Const::impl*/ const self::_ConstImpl::•<dynamic>(), const self::_ConstImpl::•<core::String>()]}) → self::Class
2929
;
30-
const constructor named({core::List<self::Const> constants = const <self::Const>[const self::_ConstImpl::•<dynamic>(), const self::_ConstImpl::•<dynamic>(), const self::_ConstImpl::•<core::String>()]}) → self::Class
30+
const constructor named({core::List<self::Const> constants = const <self::Const>[/*original=self::Const::impl*/ const self::_ConstImpl::•<dynamic>(), /*original=self::Const::impl*/ const self::_ConstImpl::•<dynamic>(), const self::_ConstImpl::•<core::String>()]}) → self::Class
3131
: self::Class::constants = constants, super core::Object::•()
3232
;
3333
static synthetic method _#new#tearOff({has-declared-initializer core::List<self::Const> constants}) → self::Class

pkg/front_end/testcases/dart2js/extension_types/external_with_annotations.dart.strong.outline.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ extension type B(js_::JSObject /* erasure=_interceptors::JSObject */ a) implemen
7474
static factory namedParams = self::B|constructor#namedParams;
7575
static factory tearoff namedParams = self::B|constructor#_#namedParams#tearOff;
7676
}
77-
static const field core::pragma annotation = const core::pragma::_("a pragma");
77+
static const field core::pragma annotation = /*original=core::pragma::•*/ const core::pragma::_("a pragma");
7878
static extension-type-member synthetic method B|constructor#_#_#tearOff(js_::JSObject /* erasure=_interceptors::JSObject */ a) → self::B /* erasure=_interceptors::JSObject */
7979
return self::B|constructor#_(a);
8080
static extension-type-member method B|constructor#_(js_::JSObject /* erasure=_interceptors::JSObject */ a) → self::B /* erasure=_interceptors::JSObject */
@@ -322,5 +322,5 @@ Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_with_annota
322322
Evaluated: StaticGet @ org-dartlang-testcase:///external_with_annotations.dart:171:4 -> InstanceConstant(const pragma{pragma.name: "a pragma", pragma.options: null})
323323
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_with_annotations.dart:174:4 -> InstanceConstant(const JS{JS.name: "renamedSS1.SS2.SS3"})
324324
Evaluated: StaticGet @ org-dartlang-testcase:///external_with_annotations.dart:175:4 -> InstanceConstant(const pragma{pragma.name: "a pragma", pragma.options: null})
325-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///external_with_annotations.dart:239:20 -> InstanceConstant(const pragma{pragma.name: "a pragma", pragma.options: null})
325+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///external_with_annotations.dart:239:20 -> InstanceConstant(const pragma{pragma.name: "a pragma", pragma.options: null})
326326
Extra constant evaluation: evaluated: 115, effectively constant: 85

pkg/front_end/testcases/dart2js/issue53804.dart.strong.outline.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class A extends core::Object {
77
field core::double? f2;
88
synthetic constructor •() → self::A
99
;
10-
@core::pragma::_("vm:never-inline")
10+
@/*original=core::pragma::•*/ const core::pragma::_("vm:never-inline")
1111
method foo() → core::String
1212
;
1313
static synthetic method _#new#tearOff() → self::A
@@ -18,5 +18,5 @@ static method main() → void
1818

1919

2020
Extra constant evaluation status:
21-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue53804.dart:9:4 -> InstanceConstant(const pragma{pragma.name: "vm:never-inline", pragma.options: null})
21+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///issue53804.dart:9:4 -> InstanceConstant(const pragma{pragma.name: "vm:never-inline", pragma.options: null})
2222
Extra constant evaluation: evaluated: 2, effectively constant: 1

pkg/front_end/testcases/dart2js/issue54115.dart.strong.outline.expect

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@ class C extends core::Object {
88
;
99
static synthetic method _#new#tearOff(core::int? _x) → self::C
1010
return new self::C::•(_x);
11-
@core::pragma::_("dart2js:never-inline")
11+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:never-inline")
1212
method manual() → void
1313
;
14-
@core::pragma::_("dart2js:never-inline")
14+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:never-inline")
1515
method pattern() → void
1616
;
17-
@core::pragma::_("dart2js:never-inline")
17+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:never-inline")
1818
method promote() → void
1919
;
2020
}
2121

2222

2323
Extra constant evaluation status:
24-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue54115.dart:9:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:never-inline", pragma.options: null})
25-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue54115.dart:18:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:never-inline", pragma.options: null})
26-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue54115.dart:26:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:never-inline", pragma.options: null})
24+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///issue54115.dart:9:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:never-inline", pragma.options: null})
25+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///issue54115.dart:18:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:never-inline", pragma.options: null})
26+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///issue54115.dart:26:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:never-inline", pragma.options: null})
2727
Extra constant evaluation: evaluated: 5, effectively constant: 3

pkg/front_end/testcases/dart2js/late_fields_with_annotation.dart.strong.outline.expect

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ import self as self;
33
import "dart:core" as core;
44

55
class C extends core::Object {
6-
@core::pragma::_("dart2js:late:trust")
6+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:late:trust")
77
late field core::int a;
8-
@core::pragma::_("dart2js:late:check")
8+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:late:check")
99
late final [setter] field core::int b;
10-
@core::pragma::_("dart2js:late:trust")
11-
@core::pragma::_("dart2js:tryInline")
10+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:late:trust")
11+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:tryInline")
1212
late field core::int c;
13-
@core::pragma::_("dart2js:late:check")
14-
@core::pragma::_("dart2js:noInline")
13+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:late:check")
14+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:noInline")
1515
late final field core::int d;
1616
synthetic constructor •() → self::C
1717
;
@@ -32,10 +32,10 @@ static method testInitializedFinalInstanceField() → void
3232

3333

3434
Extra constant evaluation status:
35-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_fields_with_annotation.dart:13:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:late:trust", pragma.options: null})
36-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_fields_with_annotation.dart:16:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:late:check", pragma.options: null})
37-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_fields_with_annotation.dart:19:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:late:trust", pragma.options: null})
38-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_fields_with_annotation.dart:20:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:tryInline", pragma.options: null})
39-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_fields_with_annotation.dart:23:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:late:check", pragma.options: null})
40-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///late_fields_with_annotation.dart:24:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
35+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///late_fields_with_annotation.dart:13:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:late:trust", pragma.options: null})
36+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///late_fields_with_annotation.dart:16:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:late:check", pragma.options: null})
37+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///late_fields_with_annotation.dart:19:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:late:trust", pragma.options: null})
38+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///late_fields_with_annotation.dart:20:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:tryInline", pragma.options: null})
39+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///late_fields_with_annotation.dart:23:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:late:check", pragma.options: null})
40+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///late_fields_with_annotation.dart:24:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
4141
Extra constant evaluation: evaluated: 7, effectively constant: 6

pkg/front_end/testcases/enhanced_enums/issue49429.dart.strong.outline.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class A extends core::Object /*hasConstConstructor*/ {
1010
return new self::A::•();
1111
}
1212
class E extends core::_Enum /*isEnum*/ {
13-
enum-element static const field self::E element = const self::E::•(0, "element", const self::A::•());
13+
enum-element static const field self::E element = const self::E::•(0, "element", /*original=self::A::redir*/ const self::A::•());
1414
static const field core::List<self::E> values = const <self::E>[self::E::element];
1515
const constructor •(core::int #index, core::String #name, self::A a) → self::E
1616
: super core::_Enum::•(#index, #name)

pkg/front_end/testcases/extensions/annotations.dart.strong.outline.expect

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import "dart:core" as core;
55
class Class extends core::Object {
66
synthetic constructor •() → self::Class
77
;
8-
@core::pragma::_("dart2js:noInline")
8+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:noInline")
99
method instanceMethod() → dynamic
1010
;
11-
@core::pragma::_("dart2js:noInline")
11+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:noInline")
1212
static method staticMethod() → dynamic
1313
;
1414
}
@@ -17,25 +17,25 @@ extension Extension on self::Class {
1717
method tearoff extensionInstanceMethod = self::Extension|get#extensionInstanceMethod;
1818
static method extensionStaticMethod = self::Extension|extensionStaticMethod;
1919
}
20-
@core::pragma::_("dart2js:noInline")
20+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:noInline")
2121
static extension-member method Extension|extensionInstanceMethod(lowered final self::Class #this) → dynamic
2222
;
2323
static extension-member method Extension|get#extensionInstanceMethod(lowered final self::Class #this) → () → dynamic
2424
return () → dynamic => self::Extension|extensionInstanceMethod(#this);
25-
@core::pragma::_("dart2js:noInline")
25+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:noInline")
2626
static extension-member method Extension|extensionStaticMethod() → dynamic
2727
;
28-
@core::pragma::_("dart2js:noInline")
28+
@/*original=core::pragma::•*/ const core::pragma::_("dart2js:noInline")
2929
static method topLevelMethod() → dynamic
3030
;
3131
static method main() → dynamic
3232
;
3333

3434

3535
Extra constant evaluation status:
36-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:6:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
37-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:9:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
38-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:14:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
39-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:17:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
40-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///annotations.dart:21:2 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
36+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///annotations.dart:6:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
37+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///annotations.dart:9:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
38+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///annotations.dart:14:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
39+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///annotations.dart:17:4 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
40+
Evaluated: RedirectingFactoryInvocation @ org-dartlang-testcase:///annotations.dart:21:2 -> InstanceConstant(const pragma{pragma.name: "dart2js:noInline", pragma.options: null})
4141
Extra constant evaluation: evaluated: 8, effectively constant: 5

0 commit comments

Comments
 (0)