Reland "[dart2js] Address some feedback on constraints API."
This is a reland of 851d821556a7cbb1097336a4b5895f31360de904
Original change's description:
> [dart2js] Address some feedback on constraints API.
>
> * Changes default namer to use the always unique uri#prefix of a
> deferred import.
> * Changes builder api for combiner nodes to take sets.
>
> Change-Id: Iab23db94a166560682a8c2bd4a78ebfd3e734353
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/218880
> Reviewed-by: Sigmund Cherem <sigmund@google.com>
> Commit-Queue: Joshua Litt <joshualitt@google.com>
Change-Id: I6394166be1f3ddebe19cc71f70fa5f5b26e05231
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/219128
Commit-Queue: Joshua Litt <joshualitt@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart b/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart
index 9f10c18..dc1ec97 100644
--- a/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart
+++ b/pkg/compiler/lib/src/deferred_load/program_split_constraints/nodes.dart
@@ -44,8 +44,7 @@
Uri get uri => _uriAndPrefix.uri;
String get prefix => _uriAndPrefix.prefix;
- ReferenceNode(this._uriAndPrefix, {name})
- : super(name ?? _uriAndPrefix.prefix);
+ ReferenceNode(String name, this._uriAndPrefix) : super(name);
@override
Map<String, dynamic> toJson() {
@@ -60,8 +59,8 @@
if (nodeJson['type'] != 'reference') {
throw 'Unrecognized type for reference node: ${nodeJson['type']}.';
}
- return ReferenceNode(UriAndPrefix.fromJson(nodeJson['import']),
- name: nodeJson['name']);
+ return ReferenceNode(
+ nodeJson['name'], UriAndPrefix.fromJson(nodeJson['import']));
}
@override
@@ -193,9 +192,10 @@
final Map<String, NamedNode> namedNodes = {};
ReferenceNodeNamer _referenceNodeNamer;
- /// The prefix in the 'uri#prefix' string will become a key to reference this
- /// node in other builder calls.
- String _prefixNamer(UriAndPrefix uriAndPrefix) => uriAndPrefix.prefix;
+ /// 'uri#prefix' will become a key to reference this node in other builder
+ /// calls.
+ String _uriAndPrefixNamer(UriAndPrefix uriAndPrefix) =>
+ uriAndPrefix.toString();
/// Override the default reference node namer.
set referenceNodeNamer(ReferenceNodeNamer namer) =>
@@ -203,7 +203,16 @@
/// Returns the [ReferenceNodeNamer] to use for naming.
ReferenceNodeNamer get referenceNodeNamer =>
- _referenceNodeNamer ?? _prefixNamer;
+ _referenceNodeNamer ?? _uriAndPrefixNamer;
+
+ NamedNode _addNamedNode(NamedNode node) {
+ if (namedNodes.containsKey(node.name)) {
+ throw 'Node with name ${node.name} already exists: '
+ '${namedNodes[node.name]}';
+ }
+ namedNodes[node.name] = node;
+ return node;
+ }
/// Returns a [ReferenceNode] referencing [importUriAndPrefix].
/// [ReferenceNode]s are typically created in bulk, by mapping over a list of
@@ -212,10 +221,8 @@
/// [referenceNodeNamer] per [ReferenceNode].
ReferenceNode referenceNode(String importUriAndPrefix) {
var uriAndPrefix = UriAndPrefix.fromJson(importUriAndPrefix);
- var referenceNode = ReferenceNode(uriAndPrefix);
var name = referenceNodeNamer(uriAndPrefix);
- namedNodes[name] = referenceNode;
- return referenceNode;
+ return _addNamedNode(ReferenceNode(name, uriAndPrefix));
}
/// Creates an unnamed [RelativeOrderNode] referencing two [NamedNode]s.
@@ -226,29 +233,37 @@
/// Creates a [CombinerNode] which can be referenced by [name] in further
/// calls to the builder.
- CombinerNode combinerNode(
- String name, List<String> nodes, CombinerType type) {
- var combinerNode = CombinerNode(name, type,
- nodes.map((name) => namedNodes[name] as ReferenceNode).toSet());
- namedNodes[name] = combinerNode;
- return combinerNode;
+ CombinerNode combinerNode(String name, Set<String> nodes, CombinerType type) {
+ ReferenceNode _lookup(String nodeName) {
+ if (!namedNodes.containsKey(nodeName)) {
+ throw 'Missing reference node for $nodeName';
+ }
+ var node = namedNodes[nodeName];
+ if (node is! ReferenceNode) {
+ // TODO(joshualitt): Implement nested combiners.
+ throw '$name references node $nodeName which is not a ReferenceNode.';
+ }
+ return node as ReferenceNode;
+ }
+
+ return _addNamedNode(CombinerNode(name, type, nodes.map(_lookup).toSet()));
}
/// Creates an 'and' [CombinerNode] which can be referenced by [name] in
/// further calls to the builder.
- CombinerNode andNode(String name, List<String> nodes) {
+ CombinerNode andNode(String name, Set<String> nodes) {
return combinerNode(name, nodes, CombinerType.and);
}
/// Creates a 'fuse' [CombinerNode] which can be referenced by [name] in
/// further calls to the builder.
- CombinerNode fuseNode(String name, List<String> nodes) {
+ CombinerNode fuseNode(String name, Set<String> nodes) {
return combinerNode(name, nodes, CombinerType.fuse);
}
/// Creates an 'or' [CombinerNode] which can be referenced by [name] in
/// further calls to the builder.
- CombinerNode orNode(String name, List<String> nodes) {
+ CombinerNode orNode(String name, Set<String> nodes) {
return combinerNode(name, nodes, CombinerType.or);
}
}
diff --git a/pkg/compiler/test/custom_split/custom_split_test.dart b/pkg/compiler/test/custom_split/custom_split_test.dart
index fb0968a..f1e4fd4 100644
--- a/pkg/compiler/test/custom_split/custom_split_test.dart
+++ b/pkg/compiler/test/custom_split/custom_split_test.dart
@@ -83,17 +83,30 @@
return json;
}
+Uri getFileInTestFolder(String test, String file) =>
+ Platform.script.resolve('data/$test/$file');
+
+Future<String> compileConstraintsToJson(String test, Compiler compiler) async {
+ var constraints = getFileInTestFolder(test, 'constraints.dart');
+ var component = compiler.componentForTesting;
+ return constraintsToJson(component, constraints);
+}
+
+File getConstraintsJsonFile(String test) {
+ var constraintsJsonUri = getFileInTestFolder(test, 'constraints.json');
+ return File(constraintsJsonUri.toFilePath());
+}
+
/// Verifies the programmatic API produces the expected JSON.
Future<void> verifyCompiler(String test, Compiler compiler) async {
- var constraints = Platform.script.resolve('data/$test/constraints.dart');
- var constraintsJsonUri =
- Platform.script.resolve('data/$test/constraints.json');
- var component = compiler.componentForTesting;
- var json = await constraintsToJson(component, constraints);
- var constraintsJson =
- File(constraintsJsonUri.toFilePath()).readAsStringSync();
- constraintsJson = constraintsJson.substring(0, constraintsJson.length - 1);
- Expect.equals(json, constraintsJson);
+ var json = await compileConstraintsToJson(test, compiler);
+ Expect.equals(getConstraintsJsonFile(test).readAsStringSync(), json);
+}
+
+/// Generates constraint JSON.
+Future<void> generateJSON(String test, Compiler compiler) async {
+ var json = await compileConstraintsToJson(test, compiler);
+ getConstraintsJsonFile(test).writeAsStringSync(json);
}
/// Compute the [OutputUnit]s for all source files involved in the test, and
@@ -102,6 +115,7 @@
/// or all supporting libraries to be in the `libs` folder, starting with the
/// same name as the original file in `data`.
main(List<String> args) {
+ bool generateGoldens = args.contains('-g');
asyncTest(() async {
Directory dataDir = Directory.fromUri(Platform.script.resolve('data'));
await checkTests(dataDir, const OutputUnitDataComputer(),
@@ -109,6 +123,8 @@
perTestOptions: createPerTestOptions(),
args: args, setUpFunction: () {
importPrefixes.clear();
- }, testedConfigs: allSpecConfigs, verifyCompiler: verifyCompiler);
+ },
+ testedConfigs: allSpecConfigs,
+ verifyCompiler: generateGoldens ? generateJSON : verifyCompiler);
});
}
diff --git a/pkg/compiler/test/custom_split/data/diamond/constraints.dart b/pkg/compiler/test/custom_split/data/diamond/constraints.dart
index 92a7665..88ccb84 100644
--- a/pkg/compiler/test/custom_split/data/diamond/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/diamond/constraints.dart
@@ -12,12 +12,16 @@
}
List<Node> processDeferredImports(List<String> imports) {
+ var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+ var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+ var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
+ var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
var builder = ProgramSplitBuilder();
return [
...imports.map(builder.referenceNode),
- builder.orderNode('step1', 'step2a'),
- builder.orderNode('step1', 'step2b'),
- builder.orderNode('step2a', 'step3'),
- builder.orderNode('step2b', 'step3'),
+ builder.orderNode(step1, step2a),
+ builder.orderNode(step1, step2b),
+ builder.orderNode(step2a, step3),
+ builder.orderNode(step2b, step3),
];
}
diff --git a/pkg/compiler/test/custom_split/data/diamond/constraints.json b/pkg/compiler/test/custom_split/data/diamond/constraints.json
index 83dfe0a..21b8afa 100644
--- a/pkg/compiler/test/custom_split/data/diamond/constraints.json
+++ b/pkg/compiler/test/custom_split/data/diamond/constraints.json
@@ -1,42 +1,42 @@
[
{
"type": "reference",
- "name": "step1",
+ "name": "memory:sdk/tests/web/native/main.dart#step1",
"import": "memory:sdk/tests/web/native/main.dart#step1"
},
{
"type": "reference",
- "name": "step2a",
+ "name": "memory:sdk/tests/web/native/main.dart#step2a",
"import": "memory:sdk/tests/web/native/main.dart#step2a"
},
{
"type": "reference",
- "name": "step2b",
+ "name": "memory:sdk/tests/web/native/main.dart#step2b",
"import": "memory:sdk/tests/web/native/main.dart#step2b"
},
{
"type": "reference",
- "name": "step3",
+ "name": "memory:sdk/tests/web/native/main.dart#step3",
"import": "memory:sdk/tests/web/native/main.dart#step3"
},
{
"type": "order",
- "predecessor": "step1",
- "successor": "step2a"
+ "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+ "successor": "memory:sdk/tests/web/native/main.dart#step2a"
},
{
"type": "order",
- "predecessor": "step1",
- "successor": "step2b"
+ "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+ "successor": "memory:sdk/tests/web/native/main.dart#step2b"
},
{
"type": "order",
- "predecessor": "step2a",
- "successor": "step3"
+ "predecessor": "memory:sdk/tests/web/native/main.dart#step2a",
+ "successor": "memory:sdk/tests/web/native/main.dart#step3"
},
{
"type": "order",
- "predecessor": "step2b",
- "successor": "step3"
+ "predecessor": "memory:sdk/tests/web/native/main.dart#step2b",
+ "successor": "memory:sdk/tests/web/native/main.dart#step3"
}
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/diamond_and/constraints.dart b/pkg/compiler/test/custom_split/data/diamond_and/constraints.dart
index b3a40ca..a333016 100644
--- a/pkg/compiler/test/custom_split/data/diamond_and/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/diamond_and/constraints.dart
@@ -12,11 +12,15 @@
}
List<Node> processDeferredImports(List<String> imports) {
+ var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+ var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+ var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
+ var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
var builder = ProgramSplitBuilder();
return [
...imports.map(builder.referenceNode),
- builder.andNode('step2', ['step2a', 'step2b']),
- builder.orderNode('step1', 'step2'),
- builder.orderNode('step2', 'step3'),
+ builder.andNode('step2', {step2a, step2b}),
+ builder.orderNode(step1, 'step2'),
+ builder.orderNode('step2', step3),
];
}
diff --git a/pkg/compiler/test/custom_split/data/diamond_and/constraints.json b/pkg/compiler/test/custom_split/data/diamond_and/constraints.json
index 931a910..85344e7 100644
--- a/pkg/compiler/test/custom_split/data/diamond_and/constraints.json
+++ b/pkg/compiler/test/custom_split/data/diamond_and/constraints.json
@@ -1,40 +1,40 @@
[
{
"type": "reference",
- "name": "step1",
+ "name": "memory:sdk/tests/web/native/main.dart#step1",
"import": "memory:sdk/tests/web/native/main.dart#step1"
},
{
"type": "reference",
- "name": "step2a",
+ "name": "memory:sdk/tests/web/native/main.dart#step2a",
"import": "memory:sdk/tests/web/native/main.dart#step2a"
},
{
"type": "reference",
- "name": "step2b",
+ "name": "memory:sdk/tests/web/native/main.dart#step2b",
"import": "memory:sdk/tests/web/native/main.dart#step2b"
},
{
"type": "reference",
- "name": "step3",
+ "name": "memory:sdk/tests/web/native/main.dart#step3",
"import": "memory:sdk/tests/web/native/main.dart#step3"
},
{
"type": "and",
"name": "step2",
"nodes": [
- "step2a",
- "step2b"
+ "memory:sdk/tests/web/native/main.dart#step2a",
+ "memory:sdk/tests/web/native/main.dart#step2b"
]
},
{
"type": "order",
- "predecessor": "step1",
+ "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
"successor": "step2"
},
{
"type": "order",
"predecessor": "step2",
- "successor": "step3"
+ "successor": "memory:sdk/tests/web/native/main.dart#step3"
}
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.dart b/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.dart
index 6fdf62e..145cbd1 100644
--- a/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.dart
@@ -12,11 +12,15 @@
}
List<Node> processDeferredImports(List<String> imports) {
+ var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+ var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+ var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
+ var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
var builder = ProgramSplitBuilder();
return [
...imports.map(builder.referenceNode),
- builder.fuseNode('step2', ['step2a', 'step2b']),
- builder.orderNode('step1', 'step2'),
- builder.orderNode('step2', 'step3'),
+ builder.fuseNode('step2', {step2a, step2b}),
+ builder.orderNode(step1, 'step2'),
+ builder.orderNode('step2', step3),
];
}
diff --git a/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.json b/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.json
index f170d18..dccfe20 100644
--- a/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.json
+++ b/pkg/compiler/test/custom_split/data/diamond_fuse/constraints.json
@@ -1,40 +1,40 @@
[
{
"type": "reference",
- "name": "step1",
+ "name": "memory:sdk/tests/web/native/main.dart#step1",
"import": "memory:sdk/tests/web/native/main.dart#step1"
},
{
"type": "reference",
- "name": "step2a",
+ "name": "memory:sdk/tests/web/native/main.dart#step2a",
"import": "memory:sdk/tests/web/native/main.dart#step2a"
},
{
"type": "reference",
- "name": "step2b",
+ "name": "memory:sdk/tests/web/native/main.dart#step2b",
"import": "memory:sdk/tests/web/native/main.dart#step2b"
},
{
"type": "reference",
- "name": "step3",
+ "name": "memory:sdk/tests/web/native/main.dart#step3",
"import": "memory:sdk/tests/web/native/main.dart#step3"
},
{
"type": "fuse",
"name": "step2",
"nodes": [
- "step2a",
- "step2b"
+ "memory:sdk/tests/web/native/main.dart#step2a",
+ "memory:sdk/tests/web/native/main.dart#step2b"
]
},
{
"type": "order",
- "predecessor": "step1",
+ "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
"successor": "step2"
},
{
"type": "order",
"predecessor": "step2",
- "successor": "step3"
+ "successor": "memory:sdk/tests/web/native/main.dart#step3"
}
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/diamond_or/constraints.dart b/pkg/compiler/test/custom_split/data/diamond_or/constraints.dart
index 659bf73..bdc5e1f 100644
--- a/pkg/compiler/test/custom_split/data/diamond_or/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/diamond_or/constraints.dart
@@ -12,11 +12,15 @@
}
List<Node> processDeferredImports(List<String> imports) {
+ var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+ var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+ var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
+ var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
var builder = ProgramSplitBuilder();
return [
...imports.map(builder.referenceNode),
- builder.orNode('step2', ['step2a', 'step2b']),
- builder.orderNode('step1', 'step2'),
- builder.orderNode('step2', 'step3'),
+ builder.orNode('step2', {step2a, step2b}),
+ builder.orderNode(step1, 'step2'),
+ builder.orderNode('step2', step3),
];
}
diff --git a/pkg/compiler/test/custom_split/data/diamond_or/constraints.json b/pkg/compiler/test/custom_split/data/diamond_or/constraints.json
index 5fcc300..c4091f4 100644
--- a/pkg/compiler/test/custom_split/data/diamond_or/constraints.json
+++ b/pkg/compiler/test/custom_split/data/diamond_or/constraints.json
@@ -1,40 +1,40 @@
[
{
"type": "reference",
- "name": "step1",
+ "name": "memory:sdk/tests/web/native/main.dart#step1",
"import": "memory:sdk/tests/web/native/main.dart#step1"
},
{
"type": "reference",
- "name": "step2a",
+ "name": "memory:sdk/tests/web/native/main.dart#step2a",
"import": "memory:sdk/tests/web/native/main.dart#step2a"
},
{
"type": "reference",
- "name": "step2b",
+ "name": "memory:sdk/tests/web/native/main.dart#step2b",
"import": "memory:sdk/tests/web/native/main.dart#step2b"
},
{
"type": "reference",
- "name": "step3",
+ "name": "memory:sdk/tests/web/native/main.dart#step3",
"import": "memory:sdk/tests/web/native/main.dart#step3"
},
{
"type": "or",
"name": "step2",
"nodes": [
- "step2a",
- "step2b"
+ "memory:sdk/tests/web/native/main.dart#step2a",
+ "memory:sdk/tests/web/native/main.dart#step2b"
]
},
{
"type": "order",
- "predecessor": "step1",
+ "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
"successor": "step2"
},
{
"type": "order",
"predecessor": "step2",
- "successor": "step3"
+ "successor": "memory:sdk/tests/web/native/main.dart#step3"
}
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/two_branch/constraints.dart b/pkg/compiler/test/custom_split/data/two_branch/constraints.dart
index 1e6ad05..27a00ab 100644
--- a/pkg/compiler/test/custom_split/data/two_branch/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/two_branch/constraints.dart
@@ -12,10 +12,13 @@
}
List<Node> processDeferredImports(List<String> imports) {
+ var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+ var step2a = 'memory:sdk/tests/web/native/main.dart#step2a';
+ var step2b = 'memory:sdk/tests/web/native/main.dart#step2b';
var builder = ProgramSplitBuilder();
return [
...imports.map(builder.referenceNode),
- builder.orderNode('step1', 'step2a'),
- builder.orderNode('step1', 'step2b'),
+ builder.orderNode(step1, step2a),
+ builder.orderNode(step1, step2b),
];
}
diff --git a/pkg/compiler/test/custom_split/data/two_branch/constraints.json b/pkg/compiler/test/custom_split/data/two_branch/constraints.json
index 8b86071..1a29d7b 100644
--- a/pkg/compiler/test/custom_split/data/two_branch/constraints.json
+++ b/pkg/compiler/test/custom_split/data/two_branch/constraints.json
@@ -1,27 +1,27 @@
[
{
"type": "reference",
- "name": "step1",
+ "name": "memory:sdk/tests/web/native/main.dart#step1",
"import": "memory:sdk/tests/web/native/main.dart#step1"
},
{
"type": "reference",
- "name": "step2a",
+ "name": "memory:sdk/tests/web/native/main.dart#step2a",
"import": "memory:sdk/tests/web/native/main.dart#step2a"
},
{
"type": "reference",
- "name": "step2b",
+ "name": "memory:sdk/tests/web/native/main.dart#step2b",
"import": "memory:sdk/tests/web/native/main.dart#step2b"
},
{
"type": "order",
- "predecessor": "step1",
- "successor": "step2a"
+ "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+ "successor": "memory:sdk/tests/web/native/main.dart#step2a"
},
{
"type": "order",
- "predecessor": "step1",
- "successor": "step2b"
+ "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+ "successor": "memory:sdk/tests/web/native/main.dart#step2b"
}
-]
+]
\ No newline at end of file
diff --git a/pkg/compiler/test/custom_split/data/two_step/constraints.dart b/pkg/compiler/test/custom_split/data/two_step/constraints.dart
index 9089c5c..fe0d8a5 100644
--- a/pkg/compiler/test/custom_split/data/two_step/constraints.dart
+++ b/pkg/compiler/test/custom_split/data/two_step/constraints.dart
@@ -12,10 +12,13 @@
}
List<Node> processDeferredImports(List<String> imports) {
+ var step1 = 'memory:sdk/tests/web/native/main.dart#step1';
+ var step2 = 'memory:sdk/tests/web/native/main.dart#step2';
+ var step3 = 'memory:sdk/tests/web/native/main.dart#step3';
var builder = ProgramSplitBuilder();
return [
...imports.map(builder.referenceNode),
- builder.orderNode('step1', 'step2'),
- builder.orderNode('step2', 'step3'),
+ builder.orderNode(step1, step2),
+ builder.orderNode(step2, step3),
];
}
diff --git a/pkg/compiler/test/custom_split/data/two_step/constraints.json b/pkg/compiler/test/custom_split/data/two_step/constraints.json
index b72db44..77a02de 100644
--- a/pkg/compiler/test/custom_split/data/two_step/constraints.json
+++ b/pkg/compiler/test/custom_split/data/two_step/constraints.json
@@ -1,27 +1,27 @@
[
{
"type": "reference",
- "name": "step1",
+ "name": "memory:sdk/tests/web/native/main.dart#step1",
"import": "memory:sdk/tests/web/native/main.dart#step1"
},
{
"type": "reference",
- "name": "step2",
+ "name": "memory:sdk/tests/web/native/main.dart#step2",
"import": "memory:sdk/tests/web/native/main.dart#step2"
},
{
"type": "reference",
- "name": "step3",
+ "name": "memory:sdk/tests/web/native/main.dart#step3",
"import": "memory:sdk/tests/web/native/main.dart#step3"
},
{
"type": "order",
- "predecessor": "step1",
- "successor": "step2"
+ "predecessor": "memory:sdk/tests/web/native/main.dart#step1",
+ "successor": "memory:sdk/tests/web/native/main.dart#step2"
},
{
"type": "order",
- "predecessor": "step2",
- "successor": "step3"
+ "predecessor": "memory:sdk/tests/web/native/main.dart#step2",
+ "successor": "memory:sdk/tests/web/native/main.dart#step3"
}
-]
+]
\ No newline at end of file