[syntax] CML syntax highlighting
* Syntax definition for cml blocks: include, program, children,
collections, environments, capabilities, use, expose, offer, facets,
config.
* Identify comments
* Blocks can be multi-line or a single line
* Snap tests to detect unexpected changes.
* Identify double comma as mistake (illegal marker)
* Identify invalid keys.
* Identify invalid values for a given key.
* Try its best not to propagate errors to other sections/blocks (divide
blocks using '[]', '{}')
* Allow any valid type value for an invalid key to give a more pleasant
user experience.
* Update snapshot testing documentation
Fixed: 105649
Change-Id: I9d616b3024711eea9fda89393f182609d168eb5b
Reviewed-on: https://fuchsia-review.googlesource.com/c/vscode-plugins/+/706990
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Clayton Wilkinson <wilkinsonclay@google.com>
Reviewed-by: Shai Barack <shayba@google.com>
Reviewed-by: Solly Ross <sollyross@google.com>
Reviewed-by: Yaneury Fermin <yaneury@google.com>
diff --git a/package.json b/package.json
index 9dd86e2..a8bb1b2 100644
--- a/package.json
+++ b/package.json
@@ -320,6 +320,11 @@
"language": "fidl",
"scopeName": "source.fidl",
"path": "./dist/resources/fidl.tmLanguage.json"
+ },
+ {
+ "language": "cml",
+ "scopeName": "source.cml",
+ "path": "./dist/resources/cml.tmLanguage.json"
}
],
"languages": [
@@ -334,6 +339,17 @@
".fidl"
],
"configuration": "./resources/language_configs/fidl.json"
+ },
+ {
+ "id": "cml",
+ "aliases": [
+ "CML",
+ "Cml",
+ "cml"
+ ],
+ "extensions": [
+ ".cml"
+ ]
}
],
"viewsContainers": {
@@ -360,7 +376,8 @@
"build": "node build.mjs",
"watch": "node build.mjs watch",
"clean": "rm -rf dist && rm -rf test-dist",
- "update-syntax-snapshot": "npx vscode-tmgrammar-snap --updateSnapshot 'src/test/suite/snap/**/*.test.fidl'",
+ "preupdate-syntax-snapshot": "npm run build",
+ "update-syntax-snapshot": "npx vscode-tmgrammar-snap --updateSnapshot 'src/test/suite/snap/**/*.test.*[!p]'",
"pretest": "node build.mjs && git clean -Xdf ./testdata/",
"test": "npm run typecheck && npm run lint && node ./test-dist/src/test/run_test.js",
"lint": "npx eslint \"{src,webviews}/**/*.ts\"",
diff --git a/src/test/suite/snap.test.ts b/src/test/suite/snap.test.ts
index df8ea82..6c095df 100644
--- a/src/test/suite/snap.test.ts
+++ b/src/test/suite/snap.test.ts
@@ -176,7 +176,7 @@
const setupTests = (async () => {
const grammarDir = path.join(__dirname, '..', 'dist', 'resources');
const rootSnapDir = path.join(__dirname, '..', 'src', 'test', 'suite', 'snap');
- const kinds = ['fidl'];
+ const kinds = ['fidl', 'cml'];
const snapFiles: Map<string, [string, string][]> = new Map();
diff --git a/src/test/suite/snap/SNAPSHOT_TESTING.md b/src/test/suite/snap/SNAPSHOT_TESTING.md
index e1471df..d5a2f1e 100644
--- a/src/test/suite/snap/SNAPSHOT_TESTING.md
+++ b/src/test/suite/snap/SNAPSHOT_TESTING.md
@@ -19,6 +19,5 @@
## Commands
- Test everything: `npm run test`
-- Test syntax only: `npm run test-syntax`
- Update snapshot: `npm run update-syntax-snapshot`
diff --git a/src/test/suite/snap/cml/capabilities.test.cml b/src/test/suite/snap/cml/capabilities.test.cml
new file mode 100644
index 0000000..e43d13e
--- /dev/null
+++ b/src/test/suite/snap/cml/capabilities.test.cml
@@ -0,0 +1,25 @@
+{
+ capabilities: [
+ {
+ service: "str",
+ service: [ "str"],
+ protocol: "str",
+ protocol: ["str"],
+ directory: "/tmp/",
+ storage: "str",
+ runner: "st",
+ resolver: "str",
+ event: "str",
+ event_stream: "str",
+ path: "str",
+ rights: "rx*",
+ from: "str",
+ backing_dir: "str",
+ subdir: "str",
+ subdir: true, //Invalid type
+ storage_id: "static_instance_id",
+ storage_id: "invalid_str", //Invalid string value
+ invalid_keyword: "str", //Invalid keyword
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/capabilities.test.cml.snap b/src/test/suite/snap/cml/capabilities.test.cml.snap
new file mode 100644
index 0000000..3bd033e
--- /dev/null
+++ b/src/test/suite/snap/cml/capabilities.test.cml.snap
@@ -0,0 +1,163 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> capabilities: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> service: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+> service: [ "str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+> protocol: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+> protocol: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+> directory: "/tmp/",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml punctuation.separator
+> storage: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml punctuation.separator
+> runner: "st",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+> resolver: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml punctuation.separator
+> event: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml punctuation.separator
+> event_stream: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+> path: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml punctuation.separator
+> rights: "rx*",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml punctuation.separator
+> from: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> backing_dir: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-backing_dir-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-backing_dir-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-backing_dir-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-backing_dir-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-backing_dir-block.cml punctuation.separator
+> subdir: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml punctuation.separator
+> subdir: true, //Invalid type
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml punctuation.separator
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+> storage_id: "static_instance_id",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml
+# ^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml punctuation.separator
+> storage_id: "invalid_str", //Invalid string value
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml
+# ^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage_id-block.cml punctuation.separator
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+> invalid_keyword: "str", //Invalid keyword
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-invalid-key-value-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-invalid-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-invalid-key-value-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-invalid-key-value-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-invalid-key-value-block.cml punctuation.separator
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+> }
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+> ]
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-capabilities-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/children.test.cml b/src/test/suite/snap/cml/children.test.cml
new file mode 100644
index 0000000..d7c83cf
--- /dev/null
+++ b/src/test/suite/snap/cml/children.test.cml
@@ -0,0 +1,19 @@
+{
+ children: [
+ {
+ name: "valid",
+ name: "Invalid",
+ name: "invalid$",
+ url: "pkg://t#test.cm",
+ },
+ {
+ startup: "eager",
+ startup: "lazy",
+ startup: "invalid",
+ on_terminate: "none",
+ on_terminate: "reboot",
+ on_terminate: "invalid",
+ environment: "str"
+ }
+ ]
+}
diff --git a/src/test/suite/snap/cml/children.test.cml.snap b/src/test/suite/snap/cml/children.test.cml.snap
new file mode 100644
index 0000000..b83cb0b
--- /dev/null
+++ b/src/test/suite/snap/cml/children.test.cml.snap
@@ -0,0 +1,103 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> children: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> name: "valid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml punctuation.separator
+> name: "Invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml punctuation.separator
+> name: "invalid$",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml punctuation.separator
+> url: "pkg://t#test.cm",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-url-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-url-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-url-block.cml
+# ^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-url-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-url-block.cml punctuation.separator
+> },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml punctuation.separator
+> {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> startup: "eager",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml punctuation.separator
+> startup: "lazy",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml punctuation.separator
+> startup: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-startup-block.cml punctuation.separator
+> on_terminate: "none",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml punctuation.separator
+> on_terminate: "reboot",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml punctuation.separator
+> on_terminate: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-on_terminate-block.cml punctuation.separator
+> environment: "str"
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml string.quoted.double
+> }
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+> ]
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-children-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/collections.test.cml b/src/test/suite/snap/cml/collections.test.cml
new file mode 100644
index 0000000..98728fa
--- /dev/null
+++ b/src/test/suite/snap/cml/collections.test.cml
@@ -0,0 +1,16 @@
+{
+ collections: [
+ {
+ name: "test",
+ durability: "transient",
+ durability: "single_run",
+ durability: "invalid",
+ environment: "str",
+ allowed_offers: "static_only",
+ allowed_offers: "static_and_dynamic",
+ allowed_offers: "invalid",
+ allow_long_names: true,
+ persistent_storage: false,
+ },
+ ],
+}
diff --git a/src/test/suite/snap/cml/collections.test.cml.snap b/src/test/suite/snap/cml/collections.test.cml.snap
new file mode 100644
index 0000000..b9f4313
--- /dev/null
+++ b/src/test/suite/snap/cml/collections.test.cml.snap
@@ -0,0 +1,92 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> collections: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> name: "test",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml punctuation.separator
+> durability: "transient",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml
+# ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml punctuation.separator
+> durability: "single_run",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml punctuation.separator
+> durability: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-durability-block.cml punctuation.separator
+> environment: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-environment-block.cml punctuation.separator
+> allowed_offers: "static_only",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml
+# ^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml punctuation.separator
+> allowed_offers: "static_and_dynamic",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml
+# ^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml punctuation.separator
+> allowed_offers: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allowed_offers-block.cml punctuation.separator
+> allow_long_names: true,
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allow_long_names-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allow_long_names-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allow_long_names-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allow_long_names-block.cml constant.language.true
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-allow_long_names-block.cml punctuation.separator
+> persistent_storage: false,
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-persistent_storage-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-persistent_storage-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-persistent_storage-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-persistent_storage-block.cml constant.language.false
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-persistent_storage-block.cml punctuation.separator
+> },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml punctuation.separator
+> ],
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-collections-block.cml punctuation.separator
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/config.test.cml b/src/test/suite/snap/cml/config.test.cml
new file mode 100644
index 0000000..2b27486
--- /dev/null
+++ b/src/test/suite/snap/cml/config.test.cml
@@ -0,0 +1,23 @@
+{
+ config: {
+ tags: {
+ type: "vector",
+ max_count: 20,
+ element: {
+ type: "string",
+ max_size: 50,
+ }
+ },
+ //Accept any key-value pair
+ a: true,
+ b: "str",
+ c: [ "str" ],
+ d: [
+ {
+ a: "b",
+ b: invalidValue,
+ c: "str",
+ }
+ ]
+ }
+}
diff --git a/src/test/suite/snap/cml/config.test.cml.snap b/src/test/suite/snap/cml/config.test.cml.snap
new file mode 100644
index 0000000..aef8833
--- /dev/null
+++ b/src/test/suite/snap/cml/config.test.cml.snap
@@ -0,0 +1,125 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> config: {
+#^^^^ source.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> tags: {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> type: "vector",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> max_count: 20,
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml storage.type.int
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> element: {
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> type: "string",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> max_size: 50,
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml storage.type.int
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> }
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+> },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> //Accept any key-value pair
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+> a: true,
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml constant.language.true
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> b: "str",
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> c: [ "str" ],
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> d: [
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> {
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> a: "b",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> b: invalidValue,
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> c: "str",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> }
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+> ]
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+> }
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-config-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/environments.test.cml b/src/test/suite/snap/cml/environments.test.cml
new file mode 100644
index 0000000..8db5b6d
--- /dev/null
+++ b/src/test/suite/snap/cml/environments.test.cml
@@ -0,0 +1,33 @@
+{
+ environments: [
+ {
+ name: "test-env.0",
+ extends: "realm",
+ extends: "none",
+ extends: "invalid",
+ runners: [
+ {
+ runner: "runner",
+ from: "#test",
+ as: "str",
+ },
+ ],
+ resolvers: [
+ {
+ resolver: "str",
+ from: "str",
+ scheme: "str",
+ },
+ ],
+ debug: [
+ {
+ protocol: "str",
+ protocol: ["str"],
+ from: "str",
+ as: "str",
+ },
+ ],
+ stop_timeout_ms: 500,
+ },
+ ],
+}
diff --git a/src/test/suite/snap/cml/environments.test.cml.snap b/src/test/suite/snap/cml/environments.test.cml.snap
new file mode 100644
index 0000000..38cc9fc
--- /dev/null
+++ b/src/test/suite/snap/cml/environments.test.cml.snap
@@ -0,0 +1,180 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> environments: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> name: "test-env.0",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-name-block.cml punctuation.separator
+> extends: "realm",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml punctuation.separator
+> extends: "none",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml punctuation.separator
+> extends: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-extends-block.cml punctuation.separator
+> runners: [
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> {
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> runner: "runner",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+> from: "#test",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> as: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml punctuation.separator
+> },
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml punctuation.separator
+> ],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runners-block.cml punctuation.separator
+> resolvers: [
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> {
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> resolver: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml punctuation.separator
+> from: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> scheme: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scheme-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scheme-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scheme-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scheme-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scheme-block.cml punctuation.separator
+> },
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml punctuation.separator
+> ],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolvers-block.cml punctuation.separator
+> debug: [
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> {
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> protocol: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+> protocol: ["str"],
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+> from: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> as: "str",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml punctuation.separator
+> },
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml punctuation.separator
+> ],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-debug-block.cml punctuation.separator
+> stop_timeout_ms: 500,
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-stop_timeout_ms-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-stop_timeout_ms-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-stop_timeout_ms-block.cml
+# ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-stop_timeout_ms-block.cml storage.type.int
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-stop_timeout_ms-block.cml punctuation.separator
+> },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml punctuation.separator
+> ],
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-environments-block.cml punctuation.separator
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/expose.test.cml b/src/test/suite/snap/cml/expose.test.cml
new file mode 100644
index 0000000..0e6a4d0
--- /dev/null
+++ b/src/test/suite/snap/cml/expose.test.cml
@@ -0,0 +1,30 @@
+{
+ expose: [
+ {
+ service: "str",
+ service: ["str"],
+ protocol: "str",
+ protocol: ["str"],
+ directory: "str",
+ directory: ["str"],
+ runner: "str",
+ runner: ["str"],
+ resolver: "str",
+ resolver: ["str"],
+ from: "self",
+ from: "framework",
+ from: "#test",
+ from: "invalid",
+ as: "str",
+ to: "parent",
+ to: "framework",
+ to: "invalid",
+ rights: "str",
+ subdir: "dir",
+ event_stream: "str",
+ event_stream: ["str"],
+ scope: "str",
+ scope: ["str"],
+ },
+ ],
+}
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/expose.test.cml.snap b/src/test/suite/snap/cml/expose.test.cml.snap
new file mode 100644
index 0000000..d20ca7d
--- /dev/null
+++ b/src/test/suite/snap/cml/expose.test.cml.snap
@@ -0,0 +1,203 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> expose: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> service: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+> service: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+> protocol: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+> protocol: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+> directory: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml punctuation.separator
+> directory: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml punctuation.separator
+> runner: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+> runner: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+> resolver: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml punctuation.separator
+> resolver: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml punctuation.separator
+> from: "self",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "framework",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "#test",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> as: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml punctuation.separator
+> to: "parent",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml punctuation.separator
+> to: "framework",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+# ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml punctuation.separator
+> to: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml punctuation.separator
+> rights: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml punctuation.separator
+> subdir: "dir",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml punctuation.separator
+> event_stream: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+> event_stream: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+> scope: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml punctuation.separator
+> scope: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml punctuation.separator
+> },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml punctuation.separator
+> ],
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-expose-block.cml punctuation.separator
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/facets.test.cml b/src/test/suite/snap/cml/facets.test.cml
new file mode 100644
index 0000000..6c8633e
--- /dev/null
+++ b/src/test/suite/snap/cml/facets.test.cml
@@ -0,0 +1,18 @@
+//Test of facets
+{
+ facets : {
+ //Key-value pairs
+ a: "a",
+ "b": "b",
+ c: [ "c" ],
+ d: [
+ {
+ f: "f",
+ a: [
+ "a",
+ "b"
+ ]
+ }
+ ]
+ }
+}
diff --git a/src/test/suite/snap/cml/facets.test.cml.snap b/src/test/suite/snap/cml/facets.test.cml.snap
new file mode 100644
index 0000000..22b264a
--- /dev/null
+++ b/src/test/suite/snap/cml/facets.test.cml.snap
@@ -0,0 +1,82 @@
+>//Test of facets
+#^^^^^^^^^^^^^^^^^ source.cml comment.line.double-slash.cml
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> facets : {
+#^^^^ source.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml keyword.control
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> //Key-value pairs
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+> a: "a",
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> "b": "b",
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml
+# ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> c: [ "c" ],
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+# ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> d: [
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> {
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> f: "f",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> a: [
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> "a",
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+# ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.separator
+> "b"
+#^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+# ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml string.quoted.double
+> ]
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+> }
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+> ]
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+> }
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-facets-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/include.test.cml b/src/test/suite/snap/cml/include.test.cml
new file mode 100644
index 0000000..acdf58f
--- /dev/null
+++ b/src/test/suite/snap/cml/include.test.cml
@@ -0,0 +1,3 @@
+{
+ include: [ "src/test.cml" ]
+}
diff --git a/src/test/suite/snap/cml/include.test.cml.snap b/src/test/suite/snap/cml/include.test.cml.snap
new file mode 100644
index 0000000..fa4ac37
--- /dev/null
+++ b/src/test/suite/snap/cml/include.test.cml.snap
@@ -0,0 +1,15 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> include: [ "src/test.cml" ]
+#^^^^ source.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml meta.meta-array-block.cml
+# ^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-include-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/offer.test.cml b/src/test/suite/snap/cml/offer.test.cml
new file mode 100644
index 0000000..c18567a
--- /dev/null
+++ b/src/test/suite/snap/cml/offer.test.cml
@@ -0,0 +1,60 @@
+{
+ offer: [
+ {
+ service: "str",
+ service: ["str"],
+ protocol: "str",
+ protocol: ["str"],
+ directory: "str",
+ directory: ["str"],
+ runner: "str",
+ runner: ["str"],
+ resolver: "str",
+ resolver: ["str",],
+ storage: "str",
+ storage: ["str"],
+ event: "str",
+ event: ["str"],
+ from: "parent",
+ from: "self",
+ from: "framework",
+ from: "void",
+ from: "#test",
+ from: "invalid",
+ from: [
+ "parent",
+ "self",
+ "framework",
+ "void",
+ "#test",
+ "invalid"
+ ],
+ to: "#test_hello_world",
+ to: "invalid",
+ to: ["#test", "invalid", "#a-b"],
+ as: "str",
+ dependency: "strong",
+ dependency: "weak",
+ dependency: "weak_for_migration",
+ dependency: "invalid",
+ rights: "str",
+ subdir: "str",
+ //Any filter object
+ filter: {
+ a: "str",
+ b: true,
+ c: [],
+ d: {},
+ },
+ event_stream: "str",
+ event_stream: ["str"],
+ scope: "str",
+ scope: ["str"],
+ availability: "required",
+ availability: "optional",
+ availability: "same_as_target",
+ availability: "invalid",
+ source_availability: "str"
+ },
+ ],
+}
diff --git a/src/test/suite/snap/cml/offer.test.cml.snap b/src/test/suite/snap/cml/offer.test.cml.snap
new file mode 100644
index 0000000..9e1d69f
--- /dev/null
+++ b/src/test/suite/snap/cml/offer.test.cml.snap
@@ -0,0 +1,397 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> offer: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> service: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+> service: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+> protocol: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+> protocol: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+> directory: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml punctuation.separator
+> directory: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml punctuation.separator
+> runner: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+> runner: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+> resolver: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml punctuation.separator
+> resolver: ["str",],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml punctuation.separator
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-resolver-block.cml punctuation.separator
+> storage: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml punctuation.separator
+> storage: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml punctuation.separator
+> event: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml punctuation.separator
+> event: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml punctuation.separator
+> from: "parent",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "self",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "framework",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "void",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "#test",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: [
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> "parent",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.separator
+> "self",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.separator
+> "framework",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+# ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.separator
+> "void",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.separator
+> "#test",
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.separator
+> "invalid"
+#^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml invalid.illegal
+> ],
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> to: "#test_hello_world",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+# ^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml punctuation.separator
+> to: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml punctuation.separator
+> to: ["#test", "invalid", "#a-b"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml punctuation.separator
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml punctuation.separator
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-to-block.cml punctuation.separator
+> as: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml punctuation.separator
+> dependency: "strong",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+> dependency: "weak",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+> dependency: "weak_for_migration",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+> dependency: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+> rights: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml punctuation.separator
+> subdir: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml punctuation.separator
+> //Any filter object
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+> filter: {
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> a: "str",
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> b: true,
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml constant.language.true
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> c: [],
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> d: {},
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> },
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml punctuation.separator
+> event_stream: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+> event_stream: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+> scope: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml punctuation.separator
+> scope: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml punctuation.separator
+> availability: "required",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+> availability: "optional",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+> availability: "same_as_target",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+> availability: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+> source_availability: "str"
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-source_availability-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-source_availability-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-source_availability-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-source_availability-block.cml string.quoted.double
+> },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-source_availability-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml punctuation.separator
+> ],
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-offer-block.cml punctuation.separator
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/program.test.cml b/src/test/suite/snap/cml/program.test.cml
new file mode 100644
index 0000000..6a17a9e
--- /dev/null
+++ b/src/test/suite/snap/cml/program.test.cml
@@ -0,0 +1,7 @@
+{
+ program: {
+ runner: "elf",
+ binary: "bin/test",
+ args: ["Hello", "World!" ],
+ }
+}
diff --git a/src/test/suite/snap/cml/program.test.cml.snap b/src/test/suite/snap/cml/program.test.cml.snap
new file mode 100644
index 0000000..c60efd0
--- /dev/null
+++ b/src/test/suite/snap/cml/program.test.cml.snap
@@ -0,0 +1,41 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> program: {
+#^^^^ source.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> runner: "elf",
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-runner-block.cml punctuation.separator
+> binary: "bin/test",
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-binary-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-binary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-binary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-binary-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-binary-block.cml punctuation.separator
+> args: ["Hello", "World!" ],
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml punctuation.separator
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml meta.meta-args-block.cml punctuation.separator
+> }
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-program-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/src/test/suite/snap/cml/use.test.cml b/src/test/suite/snap/cml/use.test.cml
new file mode 100644
index 0000000..946a32e
--- /dev/null
+++ b/src/test/suite/snap/cml/use.test.cml
@@ -0,0 +1,44 @@
+{
+ use: [
+ {
+ service: "str",
+ service: ["str"],
+ protocol: "str",
+ protocol: ["str"],
+ directory: "str",
+ storage: "str",
+ event: "str",
+ event: ["str"],
+ event_stream_deprecated: "str",
+ event_stream: "str",
+ event_stream: ["str"],
+ from: "parent",
+ from: "debug",
+ from: "framework",
+ from: "self",
+ from: "#test-name",
+ from: "invalid",
+ path: "str",
+ rights: "str",
+ subdir: "str",
+ as: "str",
+ scope: "str",
+ scope: ["str"],
+ //Any filter object
+ filter: {
+ a: "str",
+ b: true,
+ c: [],
+ d: {},
+ },
+ subscriptions: "str",
+ dependency: "strong",
+ dependency: "weak",
+ dependency: "weak_for_migration",
+ dependency: "invalid",
+ availability: "required",
+ availability: "optional",
+ availability: "invalid",
+ },
+ ],
+}
diff --git a/src/test/suite/snap/cml/use.test.cml.snap b/src/test/suite/snap/cml/use.test.cml.snap
new file mode 100644
index 0000000..6e6557e
--- /dev/null
+++ b/src/test/suite/snap/cml/use.test.cml.snap
@@ -0,0 +1,292 @@
+>{
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> use: [
+#^^^^ source.cml meta.meta-dictionary-block.cml
+# ^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+> {
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> service: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+> service: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-service-block.cml punctuation.separator
+> protocol: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+> protocol: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-protocol-block.cml punctuation.separator
+> directory: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-directory-block.cml punctuation.separator
+> storage: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-storage-block.cml punctuation.separator
+> event: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml punctuation.separator
+> event: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event-block.cml punctuation.separator
+> event_stream_deprecated: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream_deprecated-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream_deprecated-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream_deprecated-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream_deprecated-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream_deprecated-block.cml punctuation.separator
+> event_stream: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+> event_stream: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-event_stream-block.cml punctuation.separator
+> from: "parent",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "debug",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "framework",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "self",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "#test-name",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> from: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-from-block.cml punctuation.separator
+> path: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-path-block.cml punctuation.separator
+> rights: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-rights-block.cml punctuation.separator
+> subdir: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subdir-block.cml punctuation.separator
+> as: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-as-block.cml punctuation.separator
+> scope: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml punctuation.separator
+> scope: ["str"],
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-scope-block.cml punctuation.separator
+> //Any filter object
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml comment.line.double-slash.cml
+> filter: {
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+> a: "str",
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> b: true,
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml constant.language.true
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> c: [],
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.begin
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> d: {},
+#^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.begin
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml meta.meta-any-key-value-block.cml punctuation.separator
+> },
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-filter-block.cml punctuation.separator
+> subscriptions: "str",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subscriptions-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subscriptions-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subscriptions-block.cml
+# ^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subscriptions-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-subscriptions-block.cml punctuation.separator
+> dependency: "strong",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+> dependency: "weak",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+> dependency: "weak_for_migration",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^^^^^^^^^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+> dependency: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-dependency-block.cml punctuation.separator
+> availability: "required",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+> availability: "optional",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml string.quoted.double
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+> availability: "invalid",
+#^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^^^^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml keyword.control
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml
+# ^^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml invalid.illegal
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml meta.meta-availability-block.cml punctuation.separator
+> },
+#^^^^^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml punctuation.separator
+> ],
+#^^^^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml meta.meta-array-block.cml punctuation.definition.array.end
+# ^ source.cml meta.meta-dictionary-block.cml meta.meta-use-block.cml punctuation.separator
+>}
+#^ source.cml meta.meta-dictionary-block.cml punctuation.definition.dictionary.end
+>
\ No newline at end of file
diff --git a/syntax/cml.ts b/syntax/cml.ts
new file mode 100644
index 0000000..789727a
--- /dev/null
+++ b/syntax/cml.ts
@@ -0,0 +1,825 @@
+// Copyright 2022 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This generates a language definition file because writing it by hand is too hard.
+
+import { OnigRegExp } from 'oniguruma';
+
+// Format of language definition JSON
+const tmSchema =
+ 'https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json';
+type TmCaptures = { [k: string]: { name: string } };
+type TmIncludePattern = { include: string };
+type TmMatchPattern = {
+ name?: string;
+ match: string;
+ captures?: TmCaptures;
+};
+type TmBlockPattern = {
+ name?: string;
+ begin: string;
+ beginCaptures?: TmCaptures;
+ end: string;
+ endCaptures?: TmCaptures;
+ patterns: TmPattern[];
+};
+type TmPattern = TmIncludePattern | TmMatchPattern | TmBlockPattern;
+type TmLanguage = {
+ $schema: string;
+ name: string;
+ scopeName: string;
+ patterns: TmPattern[];
+ repository: {
+ [key: string]: { patterns: TmPattern[] };
+ };
+};
+
+class NamedPattern {
+ readonly re: string;
+ readonly names: string[];
+ constructor(re: string, names?: string[]) {
+ this.re = re;
+ this.names = names || [];
+ // Hack to only validate if there are no unresolved recursive groups
+ const recursiveRE = /\\g<(.*?)>/g;
+ let match;
+ while ((match = recursiveRE.exec(re)) !== null) {
+ if (!re.includes(`(?<${match[1]}>`)) {
+ // Group definition not found, can't validate yet.
+ return;
+ }
+ }
+ this.validate();
+ }
+
+ validate() {
+ const groupCount = new OnigRegExp(this.re + '|').searchSync('')!.length - 1;
+ if (groupCount !== this.names.length) {
+ throw new Error(
+ `Found ${groupCount} but expected ${this.names.length} groups in ${this.re}`
+ );
+ }
+ }
+
+ toString() {
+ return this.re;
+ }
+
+ assert(s: string) {
+ const re = new OnigRegExp(this.re);
+ const m = re.searchSync(s);
+ if (!m) {
+ throw Error(
+ `${JSON.stringify(s)} did not match pattern ${JSON.stringify(this.re)}`
+ );
+ }
+ const c = m[0];
+ if (c.index !== 0 || c.start !== 0 || c.length !== s.length) {
+ throw Error(
+ `${JSON.stringify(s)} did not fully match pattern ${JSON.stringify(
+ this.re
+ )}, only matched ${JSON.stringify(m[0])}`
+ );
+ }
+ }
+}
+
+/**
+ * Create a dictionary of capture group names: <captureIdx, nameId>
+ * @param pattern input pattern
+ * @returns dictionary
+ */
+function getCaptures(pattern: Pattern): TmCaptures {
+ const captures: { [k: string]: { name: string } } = {};
+ const names = getPatternNames(pattern);
+ for (let i = 0; i < names.length; i++) {
+ captures[`${i + 1}`] = { name: names[i] };
+ }
+ return captures;
+}
+
+/**
+ * Create TmIncludePattern from name identifier
+ * @param name identifier
+ * @returns TmIncludePattern
+ */
+function include(name: string): TmIncludePattern {
+ return { include: `#${name}` };
+}
+
+/**
+ * Create a match pattern for the output json syntax.
+ * @param name
+ * @param pattern
+ * @returns pattern struct for the output json.
+ */
+function match(name: string, pattern: Pattern): TmMatchPattern {
+ return {
+ name: `${name}.cml`,
+ match: pattern.toString(),
+ captures: getCaptures(pattern),
+ };
+}
+
+/**
+ * Create a match pattern with no name for the output json syntax.
+ * @param pattern
+ * @returns pattern struct for the output json.
+ */
+function anonMatch(pattern: Pattern | TmPattern): TmPattern {
+ if (pattern instanceof String) {
+ return {
+ match: pattern.toString(),
+ };
+ }
+ if (pattern instanceof NamedPattern) {
+ return {
+ match: pattern.toString(),
+ captures: getCaptures(pattern),
+ };
+ }
+ return pattern;
+}
+
+/**
+ * Create block pattern for the output json syntax.
+ * @param args
+ * @returns pattern struct for the output json.
+ */
+function block(args: {
+ name: string;
+ begin: Pattern;
+ end: Pattern;
+ patterns: Array<Pattern | TmPattern>;
+}): TmBlockPattern {
+ const tmPatterns: TmPattern[] = args.patterns.map(anonMatch);
+ return {
+ name: `${args.name}.cml`,
+ begin: args.begin.toString(),
+ beginCaptures: getCaptures(args.begin),
+ end: args.end.toString(),
+ endCaptures: getCaptures(args.end),
+ patterns: tmPatterns,
+ };
+}
+
+/**
+ * Creates a key-value array dictionary, k: [{}]
+ * @param args
+ * @returns pattern struct for the output json.
+ */
+function kvArrayDictionary(args: {
+ name: string;
+ begin: Pattern;
+ inner: Array<Pattern | TmPattern>;
+}): TmBlockPattern {
+ return keyValue(
+ args.name,
+ [
+ ArrayBlock([DictionaryBlock(args.inner)])
+ ],
+ );
+}
+
+/**
+ * Creates a key-value dictionary, k: {}
+ * @param args
+ * @returns pattern struct for the output json.
+ */
+function kvDictionary(args: {
+ name: string;
+ begin: Pattern;
+ inner: Array<Pattern | TmPattern>;
+}): TmBlockPattern {
+ return keyValue(
+ args.name,
+ [DictionaryBlock(args.inner)],
+ );
+}
+
+/**
+ * Creates an array block
+ * @param pattern used for every array element
+ * @param valid is an array block a valid type?
+ * @returns pattern struct for the output json.
+ */
+function ArrayBlock(pattern?: Array<Pattern | TmPattern>, valid?: boolean): TmBlockPattern {
+ if (pattern === undefined) {
+ pattern = [patterns.anyString()];
+ }
+ valid = valid ?? true;
+ return block({
+ name: 'meta.meta-array-block',
+ begin: patterns.named('\\[', valid ? 'punctuation.definition.array.begin' : 'invalid.illegal'),
+ end: patterns.named('\\]', valid ? 'punctuation.definition.array.end' : 'invalid.illegal'),
+ patterns: [
+ ...pattern,
+ include('comments'),
+ //
+ patterns.named('(?<=,)[ ]*,', 'invalid.illegal'),
+ patterns.separator(','),
+ patterns.named('\\.', 'invalid.illegal'),
+ patterns.anyString('invalid.illegal'),
+ patterns.identifier('invalid.illegal'),
+ patterns.integer('invalid.illegal'),
+ patterns.boolValue('invalid.illegal'),
+ include('meta-invalid-array-block'),
+ include('meta-invalid-dictionary-block'),
+ ],
+ });
+}
+
+/**
+ * Creates a dictionary, {k:v,}
+ * @param pattern pattern for the key-value pair
+ * @param valid is the dictionary a valid value type?
+ * @returns
+ */
+function DictionaryBlock(pattern: Array<Pattern | TmPattern>, valid?: boolean): TmBlockPattern {
+ valid = valid ?? true;
+ return block({
+ name: 'meta.meta-dictionary-block',
+ begin: patterns.named('\\{', valid ? 'punctuation.definition.dictionary.begin' : 'invalid.illegal'),
+ end: patterns.named('\\}', valid ? 'punctuation.definition.dictionary.end' : 'invalid.illegal'),
+ patterns: [
+ ...pattern,
+ include('comments'),
+
+ include('meta-invalid-key-value-block'),
+ patterns.named(',', 'invalid.illegal'),
+ patterns.named('\\.', 'invalid.illegal'),
+ patterns.anyString('invalid.illegal'),
+ patterns.identifier('invalid.illegal'),
+ patterns.integer('invalid.illegal'),
+ patterns.boolValue('invalid.illegal'),
+ include('meta-invalid-array-block'),
+ include('meta-invalid-dictionary-block'),
+ ],
+ });
+}
+
+/**
+ * Creates a key-value block, k:v
+ * @param name block name
+ * @param pattern array pattern for values
+ * @param key pattern for key
+ * @returns pattern struct for the output json.
+ */
+function keyValue(name: string,
+ pattern?: Array<Pattern | TmPattern>,
+ key?: NamedPattern): TmBlockPattern {
+ if (pattern === undefined) {
+ pattern = [patterns.anyString()];
+ }
+ let keyPattern = key ?? patterns.oneFrom(
+ patterns.named(name, 'keyword.control'),
+ patterns.oneString(name, 'keyword.control')
+ );
+ return block({
+ name: `meta.meta-${name}-block`,
+ begin: patterns.seq(keyPattern, '\\:'),
+ end: patterns.oneFrom(patterns.separator(','), '(?=})'),
+ patterns: [
+ ...pattern,
+
+ patterns.named('\\.', 'invalid.illegal'),
+ patterns.anyString('invalid.illegal'),
+ patterns.identifier('invalid.illegal'),
+ patterns.integer('invalid.illegal'),
+ patterns.boolValue('invalid.illegal'),
+ include('meta-invalid-array-block'),
+ include('meta-invalid-dictionary-block'),
+ ],
+ });
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+type Pattern = NamedPattern | String;
+
+/** Return the names of the groups in the pattern. */
+function getPatternNames(pat: Pattern | Pattern[]): string[] {
+ if (pat instanceof Array) {
+ return pat.map(getPatternNames).reduce((prev, names) => [...(prev || []), ...names]);
+ }
+ if (pat instanceof NamedPattern) {
+ return pat.names;
+ } else {
+ return [];
+ }
+}
+
+/**
+ * Utility to create a NamedPattern by concatenating an input pattern array. Output =
+ * [prefix + (pat + separator?)* + suffix]
+ * @param pats input pattern array.
+ * @param prefix
+ * @param separator used to concatenate input patterns together.
+ * @param suffix
+ * @returns the resulting NamedPattern.
+ */
+function joinPattern(
+ pats: Pattern[],
+ prefix: string,
+ separator: string,
+ suffix: string
+): NamedPattern {
+ const re = pats.map((p) => p.toString()).join(separator);
+ return new NamedPattern(prefix + re + suffix, getPatternNames(pats));
+}
+
+// NamedPattern Factory.
+var patterns = {
+ /**
+ * Create a new pattern consisting of adjacent input patterns optionally separated by whitespaces.
+ * @param pats Patterns
+ */
+ seq: function (...pats: Pattern[]): NamedPattern {
+ return joinPattern(pats, '', '\\s*', '');
+ },
+
+ /**
+ * Create a word NamedPattern match by searching word boundaries.
+ * @param word input pattern
+ * @returns NamedPattern.
+ */
+ word: function (word: Pattern): NamedPattern {
+ return new NamedPattern(`\\b${word}\\b`, getPatternNames(word));
+ },
+
+ /**
+ * Create a double quoted string pattern matcher.
+ * @param word desired word pattern.
+ * @param type pattern name.
+ * @returns NamedPattern.
+ */
+ oneString: function (word: Pattern, type?: string): NamedPattern {
+ return patterns.named(`"${word}"`, type ?? 'string.quoted.double');
+ },
+
+ /**
+ * Create a non-capturing NamedPattern group that matches one item from the pattern input vector.
+ * @param pats pattern input vector
+ * @returns NamedPattern.
+ */
+ oneFrom: function (...pats: Pattern[]): NamedPattern {
+ return joinPattern(pats, '(?:', '|', ')');
+ },
+
+ /**
+ * Create a double quoted string pattern matcher from a word array.
+ * @param words that can match pattern.
+ * @returns NamedPattern.
+ */
+ oneStringFrom: function (...words: string[]) {
+ return patterns.oneString(patterns.oneFrom(...words));
+ },
+
+ /**
+ * Match true or false for boolean values
+ * @param type overrides the default type.
+ * @returns NamedPattern.
+ */
+ boolValue: function (type?: string) {
+ return patterns.oneFrom(
+ patterns.named('\\btrue\\b', type ?? 'constant.language.true'),
+ patterns.named('\\bfalse\\b', type ?? 'constant.language.false')
+ );
+ },
+
+ /**
+ * Match integer numbers
+ * @param type overrides the default type.
+ * @returns NamedPattern.
+ */
+ integer: function (type?: string) {
+ return patterns.named('\\b[0-9]+\\b', type ?? 'storage.type.int');
+ },
+
+ /**
+ * Match identifiers
+ * @param type overrides the default type.
+ * @returns NamedPattern.
+ */
+ identifier: function (type: string) {
+ return patterns.named('\\b[a-zA-Z_][0-9a-zA-Z_]*\\b', type);
+ },
+
+ /**
+ * Match any string
+ * @param type overrides the default type.
+ * @returns NamedPattern.
+ */
+ anyString: function (type?: string) {
+ type = type ?? 'string.quoted.double';
+ return patterns.named('"(?:[^\\"]|\\.)*"', type);
+ },
+
+ /**
+ * Match any component name
+ * @param type overrides the default type.
+ * @returns NamedPattern.
+ */
+ componentName: function (type?: string) {
+ type = type ?? 'string.quoted.double';
+ return patterns.named('"[0-9a-z_\\-\\.]*"', type);
+ },
+
+ /**
+ * Regular expression for references, e.g. #<child-name>, #<collection-name>
+ * @returns Pattern
+ */
+ nameReference: function () {
+ return patterns.named('"#[0-9a-z_\\-\\.]+"', 'string.quoted.double');
+ },
+
+ /**
+ * Create a NamedPattern.
+ * @param pattern
+ * @param name
+ * @returns NamedPattern
+ */
+ named: function (pattern: Pattern, name: string) {
+ return new NamedPattern(`(${pattern})`, [name, ...getPatternNames(pattern)]);
+ },
+
+ /**
+ * Create a NamedPattern for separators.
+ * @param separator
+ * @returns
+ */
+ separator: function (separator: string) {
+ return patterns.named(separator, 'punctuation.separator');
+ },
+
+ /**
+ * Create a word NamedPattern from a keyword string.
+ * @param keyword string
+ * @param name keyword identifier
+ * @returns NamedPattern
+ */
+ keyword: function (keyword: string, name: string = 'keyword.control') {
+ return patterns.word(patterns.named(keyword, name));
+ },
+};
+
+/**
+ * Value or Array block
+ * @param pattern for a single value or each element of an array, default pattern = anyString()
+ * @returns An array of patterns.
+ */
+function ValueOrArray(pattern: Array<Pattern | TmPattern> = [patterns.anyString()]): Array<Pattern | TmPattern> {
+ return [...pattern, ArrayBlock(pattern)];
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// CML language description.
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+const tmLanguage: TmLanguage = {
+ $schema: tmSchema,
+ name: 'CML',
+ scopeName: 'source.cml',
+
+ patterns: [
+ include('comments'),
+
+ DictionaryBlock([
+ keyValue('include', [ArrayBlock()]),
+ include('meta-program-block'),
+ include('meta-children-block'),
+ include('meta-collections-block'),
+ include('meta-environments-block'),
+ include('meta-capabilities-block'),
+ include('meta-use-block'),
+ include('meta-expose-block'),
+ include('meta-offer-block'),
+ keyValue('facets', [
+ include('meta-valid-array-block'),
+ include('meta-valid-dictionary-block'),
+ ]),
+ keyValue('config', [
+ include('meta-valid-array-block'),
+ include('meta-valid-dictionary-block'),
+ ]),
+ ]),
+ ],
+
+ repository: {
+ 'meta-program-block': {
+ patterns: [
+ kvDictionary({
+ name: 'program',
+ begin: patterns.keyword('program'),
+ inner: [
+ keyValue('runner'),
+ keyValue('binary'),
+ keyValue('args', [ArrayBlock()]),
+ // In case of using a runner other than elf.
+ include('meta-valid-key-value-block'),
+ ],
+ }),
+ ],
+ },
+
+ 'meta-children-block': {
+ patterns: [
+ kvArrayDictionary({
+ name: 'children',
+ begin: patterns.keyword('children'),
+ inner: [
+ keyValue('name', [patterns.componentName()]),
+ keyValue('url'),
+ keyValue('startup', [patterns.oneStringFrom('lazy', 'eager')]),
+ keyValue('on_terminate', [patterns.oneStringFrom('none', 'reboot')]),
+ keyValue('environment'),
+ ],
+ }),
+ ],
+ },
+
+ 'meta-collections-block': {
+ patterns: [
+ kvArrayDictionary({
+ name: 'collections',
+ begin: patterns.keyword('collections'),
+ inner: [
+ keyValue('name', [patterns.componentName()]),
+ keyValue('durability', [patterns.oneStringFrom('transient', 'single_run')]),
+ keyValue('environment'),
+ keyValue('allowed_offers', [patterns.oneStringFrom('static_only', 'static_and_dynamic')]),
+ keyValue('allow_long_names', [patterns.boolValue()]),
+ keyValue('persistent_storage', [patterns.boolValue()]),
+ ],
+ }),
+ ],
+ },
+
+ 'meta-environments-block': {
+ patterns: [
+ kvArrayDictionary({
+ name: 'environments',
+ begin: patterns.keyword('environments'),
+ inner: [
+ keyValue('name', [patterns.componentName()]),
+ keyValue('extends', [patterns.oneStringFrom('realm', 'none')]),
+ kvArrayDictionary({
+ name: 'runners',
+ begin: patterns.keyword('runners'),
+ inner: [
+ keyValue('runner'),
+ keyValue('from'),
+ keyValue('as'),
+ ],
+ }),
+ kvArrayDictionary({
+ name: 'resolvers',
+ begin: patterns.keyword('resolvers'),
+ inner: [
+ keyValue('resolver'),
+ keyValue('from'),
+ keyValue('scheme'),
+ ],
+ }),
+ kvArrayDictionary({
+ name: 'debug',
+ begin: patterns.keyword('debug'),
+ inner: [
+ keyValue('protocol', [ArrayBlock(), patterns.anyString()]),
+ keyValue('from'),
+ keyValue('as'),
+ ],
+ }),
+ keyValue('stop_timeout_ms', [patterns.integer()]),
+ ],
+ }),
+ ],
+ },
+
+ 'meta-capabilities-block': {
+ patterns: [
+ kvArrayDictionary({
+ name: 'capabilities',
+ begin: patterns.keyword('capabilities'),
+ inner: [
+ keyValue('service', [ArrayBlock(), patterns.anyString()]),
+ keyValue('protocol', [ArrayBlock(), patterns.anyString()]),
+ keyValue('directory'),
+ keyValue('storage'),
+ keyValue('runner'),
+ keyValue('resolver'),
+ keyValue('event'),
+ keyValue('event_stream', [ArrayBlock(), patterns.anyString()]),
+ keyValue('path'),
+ keyValue('rights', [ArrayBlock(), patterns.anyString()]),
+ keyValue('from'),
+ keyValue('backing_dir'),
+ keyValue('subdir'),
+ keyValue('storage_id', [patterns.oneStringFrom('static_instance_id', 'static_instance_id_or_moniker')]),
+ ],
+ }),
+ ],
+ },
+
+ 'meta-use-block': {
+ patterns: [
+ kvArrayDictionary({
+ name: 'use',
+ begin: patterns.keyword('use'),
+ inner: [
+ keyValue('service', [ArrayBlock(), patterns.anyString()]),
+ keyValue('protocol', [ArrayBlock(), patterns.anyString()]),
+ keyValue('directory'),
+ keyValue('storage'),
+ keyValue('event', [ArrayBlock(), patterns.anyString()]),
+ keyValue('event_stream_deprecated'),
+ keyValue('event_stream', [ArrayBlock(), patterns.anyString()]),
+ keyValue('from', [
+ patterns.oneStringFrom('self', 'framework', 'parent', 'debug'),
+ patterns.nameReference(),
+ ]),
+ keyValue('path'),
+ keyValue('rights', [ArrayBlock(), patterns.anyString()]),
+ keyValue('subdir'),
+ keyValue('as'),
+ keyValue('scope', [ArrayBlock(), patterns.anyString()]),
+ //TODO(fxbug.dev/109399): Narrow down the types of valid objects once documentation is
+ //provided in fxbug.dev/96705.
+ keyValue('filter', [
+ include('meta-valid-array-block'),
+ include('meta-valid-dictionary-block'),
+ ]),
+ keyValue('subscriptions'),
+ keyValue('dependency', [patterns.oneStringFrom('strong', 'weak_for_migration', 'weak')]),
+ keyValue('availability', [patterns.oneStringFrom('required', 'optional')]),
+ ],
+ }),
+ ],
+ },
+
+ 'meta-expose-block': {
+ patterns: [
+ kvArrayDictionary({
+ name: 'expose',
+ begin: patterns.keyword('expose'),
+ inner: [
+ keyValue('service', [ArrayBlock(), patterns.anyString()]),
+ keyValue('protocol', [ArrayBlock(), patterns.anyString()]),
+ keyValue('directory', [ArrayBlock(), patterns.anyString()]),
+ keyValue('runner', [ArrayBlock(), patterns.anyString()]),
+ keyValue('resolver', [ArrayBlock(), patterns.anyString()]),
+ keyValue('from', [
+ patterns.oneStringFrom('self', 'framework'),
+ patterns.nameReference(),
+ ]),
+ keyValue('as'),
+ keyValue('to', [
+ patterns.oneStringFrom('parent', 'framework'),
+ ]),
+ keyValue('rights', [ArrayBlock(), patterns.anyString()]),
+ keyValue('subdir'),
+ keyValue('event_stream', [ArrayBlock(), patterns.anyString()]),
+ keyValue('scope', [ArrayBlock(), patterns.anyString()]),
+ ],
+ }),
+ ],
+ },
+
+ 'meta-offer-block': {
+ patterns: [
+ kvArrayDictionary({
+ name: 'offer',
+ begin: patterns.keyword('offer'),
+ inner: [
+ keyValue('service', [ArrayBlock(), patterns.anyString()]),
+ keyValue('protocol', [ArrayBlock(), patterns.anyString()]),
+ keyValue('directory', [ArrayBlock(), patterns.anyString()]),
+ keyValue('runner', [ArrayBlock(), patterns.anyString()]),
+ keyValue('resolver', [ArrayBlock(), patterns.anyString()]),
+ keyValue('storage', [ArrayBlock(), patterns.anyString()]),
+ keyValue('event', [ArrayBlock(), patterns.anyString()]),
+ keyValue('from', ValueOrArray([
+ patterns.oneStringFrom('parent', 'self', 'framework', 'void'),
+ patterns.nameReference(),
+ ])),
+ keyValue('to', ValueOrArray([
+ patterns.oneStringFrom('parent', 'framework'),
+ patterns.nameReference(),
+ ])),
+ keyValue('as'),
+ keyValue('dependency', [patterns.oneStringFrom('strong', 'weak_for_migration', 'weak')]),
+ keyValue('rights', [ArrayBlock(), patterns.anyString()]),
+ keyValue('subdir'),
+ //TODO(fxbug.dev/109399): Narrow down the types of valid objects once documentation is
+ //provided in fxbug.dev/96705.
+ keyValue('filter', [
+ include('meta-valid-array-block'),
+ include('meta-valid-dictionary-block'),
+ ]),
+ keyValue('event_stream', [ArrayBlock(), patterns.anyString()]),
+ keyValue('scope', [ArrayBlock(), patterns.anyString()]),
+ keyValue('availability', [patterns.oneStringFrom('required', 'optional', 'same_as_target')]),
+ keyValue('source_availability'),
+ ],
+ }),
+ ],
+ },
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // General valid/invalid blocks
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ 'meta-invalid-array-block': {
+ patterns: [
+ ArrayBlock([
+ patterns.anyString(),
+ patterns.integer(),
+ patterns.boolValue(),
+ include('meta-valid-array-block'),
+ include('meta-valid-dictionary-block'),
+ ], false)
+ ],
+ },
+
+ 'meta-valid-array-block': {
+ patterns: [
+ ArrayBlock([
+ patterns.anyString(),
+ patterns.integer(),
+ patterns.boolValue(),
+ include('meta-valid-array-block'),
+ include('meta-valid-dictionary-block'),
+ ], true)
+ ],
+ },
+
+ 'meta-invalid-key-value-block': {
+ patterns: [
+ keyValue(
+ 'invalid-key-value',
+ [
+ patterns.anyString(),
+ patterns.integer(),
+ patterns.boolValue(),
+ include('meta-valid-array-block'),
+ include('meta-valid-dictionary-block'),
+ ],
+ patterns.oneFrom(
+ patterns.identifier('invalid.illegal'),
+ patterns.anyString('invalid.illegal'),
+ )
+ )
+ ],
+ },
+
+ 'meta-valid-key-value-block': {
+ patterns: [
+ keyValue(
+ 'any-key-value',
+ [
+ patterns.anyString(),
+ patterns.integer(),
+ patterns.boolValue(),
+ include('meta-valid-array-block'),
+ include('meta-valid-dictionary-block'),
+ ],
+ patterns.oneFrom(
+ patterns.identifier('keyword.control'),
+ patterns.anyString('keyword.control'),
+ )
+ )
+ ],
+ },
+
+ 'meta-invalid-dictionary-block': {
+ patterns: [
+ DictionaryBlock([
+ include('meta-valid-key-value-block'),
+ ], false)
+ ],
+ },
+
+ 'meta-valid-dictionary-block': {
+ patterns: [
+ DictionaryBlock([
+ include('meta-valid-key-value-block'),
+ ], true)
+ ],
+ },
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Comments
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ comments: {
+ patterns: [
+ match('invalid.illegal.stray-comment-end', '\\*/.*\\n'),
+ match('comment.line.documentation', '///.*\\n'),
+ match('comment.line.double-slash', '//.*\\n'),
+ ],
+ },
+
+ },
+};
+
+export default tmLanguage;