diff --git a/PHP/tests/syntax_test_php.php b/PHP/tests/syntax_test_php.php index d6d05371a2..3673a09b20 100644 --- a/PHP/tests/syntax_test_php.php +++ b/PHP/tests/syntax_test_php.php @@ -1935,12 +1935,12 @@ function generate2() // ^^^ entity.name.tag.heredoc one: two //^^^^^^ meta.embedded.yaml source.yaml -//^ string.unquoted.plain.out entity.name.tag +//^ meta.mapping.key string // ^ punctuation.separator.key-value.mapping -// ^^^ string.unquoted.plain.out +// ^^^ string three: "$four" //^^^^^^^^^^^^ meta.embedded.yaml source.yaml -//^^^ string.unquoted.plain.out entity.name.tag +//^^^ meta.mapping.key string // ^ punctuation.separator.key-value.mapping // ^^^^^^^ string.quoted.double // ^^^^^ variable.other.php diff --git a/YAML/YAML.sublime-syntax b/YAML/YAML.sublime-syntax index 4adfe72e4f..6729e55f26 100644 --- a/YAML/YAML.sublime-syntax +++ b/YAML/YAML.sublime-syntax @@ -37,6 +37,7 @@ --- name: YAML scope: source.yaml +version: 2 file_extensions: - yaml @@ -110,12 +111,48 @@ variables: ) ) + _flow_key_in_lookahead: |- + (?x: + (?= + ( + {{ns_plain_first_plain_in}} + ( [^\s:{{c_flow_indicator}}] + | : [^\s{{c_flow_indicator}}] + | \s+ (?![#\s]) + )* + | \".*\" # simplified + | \'.*\' + ) + \s* + : + (\s|$) + ) + ) + + _flow_key_out_lookahead: |- + (?x: + (?= + ( + {{ns_plain_first_plain_out}} + ( [^\s:] + | : \S + | \s+ (?![#\s]) + )* + | \".*\" # simplified + | \'.*\' + ) + \s* + : + (\s|$) + ) + ) + # patterns for plain scalars of implicit different types # (for the Core Schema: http://www.yaml.org/spec/1.2/spec.html#schema/core/) - + # http://yaml.org/type/null.html _type_null: (?:null|Null|NULL|~) - + # http://yaml.org/type/bool.html _type_bool_11: |- (?x: @@ -188,13 +225,32 @@ contexts: # ns-flow-yaml-node(n,c) - include: flow-alias - include: flow-collection - - include: flow-scalar + - include: flow-scalar-11 + + flow-node-12: + # http://yaml.org/spec/1.2/spec.html#style/flow/ + # ns-flow-yaml-node(n,c) + - include: flow-alias + - include: flow-collection + - include: flow-scalar-12 + + flow-scalar-11: + # http://yaml.org/spec/1.2/spec.html#style/flow/scalar + - include: flow-scalar-double-quoted + - include: flow-scalar-single-quoted + - include: flow-scalar-plain-in-11 - flow-scalar: + flow-scalar-12: # http://yaml.org/spec/1.2/spec.html#style/flow/scalar - include: flow-scalar-double-quoted - include: flow-scalar-single-quoted - - include: flow-scalar-plain-in + - include: flow-scalar-plain-in-12 + + flow-scalar-out-12: + # for block keys + - include: flow-scalar-double-quoted + - include: flow-scalar-single-quoted + - include: flow-scalar-plain-out-12 flow-collection: # http://yaml.org/spec/1.2/spec.html#style/flow/collection @@ -208,6 +264,13 @@ contexts: - include: flow-scalar-plain-out # needs higher priority than flow-node, which includes flow-scalar-plain-in - include: flow-node + block-node-12: + # http://yaml.org/spec/1.2/spec.html#style/block/ + - include: block-scalar + - include: block-collection + - include: flow-scalar-plain-out-12 + - include: flow-node-12 # the -12 variant should not make a difference + block-collection: # http://yaml.org/spec/1.2/spec.html#style/block/collection - include: block-sequence @@ -266,23 +329,23 @@ contexts: # http://yaml.org/spec/1.2/spec.html#node/property/ - match: (?=!|&) push: - - meta_scope: meta.property.yaml - # &Anchor - # http://yaml.org/spec/1.2/spec.html#&%20anchor// - - match: (&)({{ns_anchor_name}})(\S+)? - captures: - 1: keyword.control.property.anchor.yaml punctuation.definition.anchor.yaml - 2: entity.name.other.anchor.yaml - 3: invalid.illegal.character.anchor.yaml - pop: true - # !Tag Handle - # http://yaml.org/spec/1.2/spec.html#tag/property/ - - match: '{{c_ns_tag_property}}(?=\ |\t|$)' - scope: storage.type.tag-handle.yaml - pop: true - - match: \S+ - scope: invalid.illegal.tag-handle.yaml - pop: true + - meta_scope: meta.property.yaml + # &Anchor + # http://yaml.org/spec/1.2/spec.html#&%20anchor// + - match: (&)({{ns_anchor_name}})(\S+)? + captures: + 1: keyword.control.property.anchor.yaml punctuation.definition.anchor.yaml + 2: entity.name.other.anchor.yaml + 3: invalid.illegal.character.anchor.yaml + pop: true + # !Tag Handle + # http://yaml.org/spec/1.2/spec.html#tag/property/ + - match: '{{c_ns_tag_property}}(?=\ |\t|$)' + scope: storage.type.tag-handle.yaml + pop: true + - match: \S+ + scope: invalid.illegal.tag-handle.yaml + pop: true flow-alias: # http://yaml.org/spec/1.2/spec.html#alias// @@ -404,6 +467,28 @@ contexts: 7: punctuation.separator.time.yaml 8: punctuation.separator.time.yaml + flow-scalar-plain-in-11: + # http://yaml.org/spec/1.2/spec.html#style/flow/plain + # ns-plain(n,c) (c=flow-in, c=flow-key) + - include: flow-scalar-plain-in-implicit-type-11 + - include: flow-scalar-plain-in-common + + flow-scalar-plain-in-12: + # http://yaml.org/spec/1.2/spec.html#style/flow/plain + # ns-plain(n,c) (c=flow-in, c=flow-key) + - include: flow-scalar-plain-in-implicit-type-12 + - include: flow-scalar-plain-in-common + + flow-scalar-plain-in-common: + - match: (?={{ns_plain_first_plain_in}}) + push: flow-scalar-plain-in-content + + flow-scalar-plain-in-content: + - meta_scope: string.unquoted.plain.in.yaml + - meta_include_prototype: false + - match: '{{_flow_scalar_end_plain_in}}' + pop: true + flow-scalar-plain-out-implicit-type-11: - match: '{{_type_bool_11}}{{_flow_scalar_end_plain_out}}' scope: constant.language.boolean.yaml @@ -489,22 +574,20 @@ contexts: # ns-plain(n,c) (c=flow-out, c=block-key) - include: flow-scalar-plain-out-implicit-type-11 - match: (?={{ns_plain_first_plain_out}}) - push: - - meta_scope: string.unquoted.plain.out.yaml - - meta_include_prototype: false - - match: '{{_flow_scalar_end_plain_out}}' - pop: true + push: flow-scalar-plain-out-content - flow-scalar-plain-in: + flow-scalar-plain-out-12: # http://yaml.org/spec/1.2/spec.html#style/flow/plain - # ns-plain(n,c) (c=flow-in, c=flow-key) - - include: flow-scalar-plain-in-implicit-type-11 - - match: (?={{ns_plain_first_plain_in}}) - push: - - meta_scope: string.unquoted.plain.in.yaml - - meta_include_prototype: false - - match: '{{_flow_scalar_end_plain_in}}' - pop: true + # ns-plain(n,c) (c=flow-out, c=block-key) + - include: flow-scalar-plain-out-implicit-type-12 + - match: (?={{ns_plain_first_plain_out}}) + push: flow-scalar-plain-out-content + + flow-scalar-plain-out-content: + - meta_scope: string.unquoted.plain.out.yaml + - meta_include_prototype: false + - match: '{{_flow_scalar_end_plain_out}}' + pop: true flow-sequence: # http://yaml.org/spec/1.2/spec.html#style/flow/sequence @@ -512,75 +595,76 @@ contexts: - match: \[ scope: punctuation.definition.sequence.begin.yaml push: - - meta_scope: meta.flow-sequence.yaml + - meta_scope: meta.sequence.flow.yaml - match: \] scope: punctuation.definition.sequence.end.yaml pop: true - match: ',' scope: punctuation.separator.sequence.yaml - - include: flow-pair + - include: flow-pair-no-clear - include: flow-node flow-mapping: - match: \{ scope: punctuation.definition.mapping.begin.yaml push: - - meta_scope: meta.flow-mapping.yaml + - meta_scope: meta.mapping.yaml - match: \} scope: punctuation.definition.mapping.end.yaml pop: true - match: ',' scope: punctuation.separator.mapping.yaml - include: flow-pair + - include: flow-node # for sets flow-pair: - match: \? - scope: punctuation.definition.key-value.begin.yaml + scope: meta.mapping.key.yaml punctuation.definition.key.begin.yaml push: - - meta_scope: meta.flow-pair.explicit.yaml - - match: (?=[},\]]) # Empty mapping keys & values are allowed - pop: true - - include: flow-pair - - include: flow-node - - match: :(?=\s|$|{{c_flow_indicator}}) - scope: punctuation.separator.key-value.mapping.yaml - set: flow-pair-value - # Attempt to match plain-in scalars and highlight as "entity.name.tag", - # if followed by a colon - - match: | - (?x) - (?= - {{ns_plain_first_plain_in}} - ( - [^\s:{{c_flow_indicator}}] - | : [^\s{{c_flow_indicator}}] - | \s+ (?![#\s]) - )* - \s* - : - (\s|$) - ) + - flow-pair-clear-1 + - flow-pair-key + # Attempt to match plain-in scalars followed by a colon + - match: '{{_flow_key_in_lookahead}}' push: - # TODO Use a merge type here and add "pop: true" and "scope: entity.name.tag.yaml"; - # https://github.com/SublimeTextIssues/Core/issues/966 - - meta_scope: meta.flow-pair.key.yaml - - include: flow-scalar-plain-in-implicit-type-12 - - match: '{{_flow_scalar_end_plain_in}}' - pop: true - - match: (?={{ns_plain_first_plain_in}}) - set: - - meta_scope: meta.flow-pair.key.yaml string.unquoted.plain.in.yaml entity.name.tag.yaml - - meta_include_prototype: false - - match: '{{_flow_scalar_end_plain_in}}' - pop: true - - include: flow-node + - flow-pair-clear-1 + - flow-pair-key - match: :(?=\s|$|{{c_flow_indicator}}) # Empty mapping keys allowed - scope: meta.flow-pair.yaml punctuation.separator.key-value.mapping.yaml + scope: meta.mapping.yaml punctuation.separator.key-value.mapping.yaml + push: + - flow-pair-clear-1 + - flow-pair-value + + # Variant without clearing the parent scope for pairs in a sequence + flow-pair-no-clear: + - match: \? + scope: meta.mapping.key.yaml punctuation.definition.key.begin.yaml + push: flow-pair-key + - match: '{{_flow_key_in_lookahead}}' + push: flow-pair-key + - match: :(?=\s|$|{{c_flow_indicator}}) + scope: meta.mapping.yaml punctuation.separator.key-value.mapping.yaml push: flow-pair-value + flow-pair-key: + - meta_content_scope: meta.mapping.key.yaml + - match: :(?=\s|$|{{c_flow_indicator}}) + scope: meta.mapping.yaml punctuation.separator.key-value.mapping.yaml + set: flow-pair-value + - include: flow-pair-end # Empty mapping keys & values are allowed + - include: flow-node-12 + flow-pair-value: - - meta_content_scope: meta.flow-pair.value.yaml + - meta_content_scope: meta.mapping.value.yaml + - include: flow-pair-end - include: flow-node + + flow-pair-clear-1: + - meta_include_prototype: false + - clear_scopes: 1 + - match: '' + pop: true + + flow-pair-end: - match: (?=[},\]]) pop: true @@ -620,47 +704,34 @@ contexts: - include: block-pair block-pair: - - match: \? - scope: punctuation.definition.key-value.begin.yaml - push: - - meta_scope: meta.block-mapping.yaml - - match: (?=\?) # Empty mapping keys & values are allowed - pop: true - - match: ^ *(:) - captures: - 1: punctuation.separator.key-value.mapping.yaml - pop: true - - match: ':' - scope: invalid.illegal.expected-newline.yaml - pop: true - - include: block-node - # Attempt to match plain-out scalars and highlight as "entity.name.tag", + - match: \?(?=\s|$) + scope: meta.mapping.yaml punctuation.definition.key-value.begin.yaml + push: block-key-explicit + # Attempt to match plain-out scalars and highlight as "meta.mapping.key", # if followed by a colon - - match: | - (?x) - (?= - {{ns_plain_first_plain_out}} - ( - [^\s:] - | : \S - | \s+ (?![#\s]) - )* - \s* - : - (\s|$) - ) - push: - - include: flow-scalar-plain-out-implicit-type-12 - - match: '{{_flow_scalar_end_plain_out}}' - pop: true - - match: (?={{ns_plain_first_plain_out}}) - set: - - meta_scope: string.unquoted.plain.out.yaml entity.name.tag.yaml - - meta_include_prototype: false - - match: '{{_flow_scalar_end_plain_out}}' - pop: true + - match: '{{_flow_key_out_lookahead}}' + push: block-key-implicit - match: :(?=\s|$) - scope: punctuation.separator.key-value.mapping.yaml + scope: meta.mapping.yaml punctuation.separator.key-value.mapping.yaml + + block-key-implicit: + - meta_content_scope: meta.mapping.key.yaml + - match: :(?=\s|$) + scope: meta.mapping.yaml punctuation.separator.key-value.mapping.yaml + pop: true + - include: flow-scalar-out-12 + + block-key-explicit: + - meta_content_scope: meta.mapping.key.yaml + # the colon *must* be on a new line + - match: ^ *(:) + scope: meta.mapping.yaml + captures: + 1: punctuation.separator.key-value.mapping.yaml + pop: true + - match: (?=\?(?=\s|$)) # Empty mapping keys & values are allowed + pop: true + - include: block-node-12 comment: # http://www.yaml.org/spec/1.2/spec.html#comment// @@ -673,7 +744,7 @@ contexts: - match: '#' scope: punctuation.definition.comment.line.number-sign.yaml set: - - meta_scope: comment.line.number-sign.yaml - - match: \n|\z - pop: true + - meta_scope: comment.line.number-sign.yaml + - match: \n|\z + pop: true ... diff --git a/YAML/tests/syntax_test_block.yaml b/YAML/tests/syntax_test_block.yaml index 8d3a3ead83..3c712328ed 100644 --- a/YAML/tests/syntax_test_block.yaml +++ b/YAML/tests/syntax_test_block.yaml @@ -83,11 +83,11 @@ plain # http://yaml.org/spec/1.2/spec.html#style/block/mapping key: value -#^^ string.unquoted.plain.out entity.name.tag +#^^ meta.mapping.key string.unquoted.plain.out # ^ punctuation.separator.key-value.mapping, -entity # ^^^^^ string.unquoted.plain.out key# : value -#^^^ string.unquoted.plain.out entity.name.tag +#^^^ meta.mapping.key string.unquoted.plain.out # ^ -string # ^ punctuation.separator.key-value.mapping # ^^^^^ string.unquoted.plain.out @@ -95,37 +95,51 @@ key# : value # <- punctuation.separator.key-value.mapping _type_null: (?:null|Null|NULL|~) # http://yaml.org/type/null.html -#^^^^^^^^^ entity.name.tag -# ^^^^^^^^^^^^^^^^^^^^ -entity.name.tag +#^^^^^^^^^ meta.mapping.key +# ^^^^^^^^^^^^^^^^^^^^ -meta.mapping.key # ^ comment key on line one: -#^^^^^^^^^^^^^^ entity.name.tag +#^^^^^^^^^^^^^^ meta.mapping.key string.unquoted.plain value on line two +# ^^^^^^^^^^^^^^^^^ string.unquoted.plain.out - meta.mapping.key + + +"quoted key": value +#^^^^^^^^^^^ meta.mapping.key string.quoted.double +# ^ punctuation.definition.string.end ? explicit key # Empty value -#^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block-mapping +#^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.mapping.key # ^^^^^^^^^^^^ string.unquoted.plain.out # ^^^^^^^^^^^^^ comment -# <- meta.block-mapping punctuation.definition.key-value.begin +# <- meta.mapping punctuation.definition.key-value.begin ? | block key -# ^^^^^^^^^ meta.block-mapping string.unquoted.block -# ^^^^^^^^^ -meta.block-mapping meta.block-mapping +# ^^^^^^^^^ meta.mapping string.unquoted.block +# ^^^^^^^^^ -meta.mapping meta.mapping : - one # Explicit compact -# <- meta.block-mapping punctuation.separator.key-value.mapping +# <- meta.mapping punctuation.separator.key-value.mapping - two: :three # block value # ^ punctuation.definition.block.sequence -# ^^^ string.unquoted.plain.out entity.name.tag +# ^^^ meta.mapping.key string.unquoted.plain.out # ^ punctuation.separator.key-value.mapping # ^^^^^^ string.unquoted.plain.out +# the entire first line is the key (as a mapping with one entry) ? a key : not a value -# ^ meta.block-mapping invalid.illegal.expected-newline +# ^^^^^^^^^^^^^^^^^^^ meta.mapping.key +# ^ meta.mapping.key meta.mapping punctuation.separator.key-value.mapping +: +# <- meta.mapping punctuation.separator.key-value.mapping - meta.mapping meta.mapping scalar -# <- -meta.block-mapping +# <- -meta.mapping + + ?not a key +#^^^^^^^^^^ - meta.mapping + x: - #1 diff --git a/YAML/tests/syntax_test_flow.yaml b/YAML/tests/syntax_test_flow.yaml index 7cf372544f..ed5428e747 100644 --- a/YAML/tests/syntax_test_flow.yaml +++ b/YAML/tests/syntax_test_flow.yaml @@ -86,22 +86,23 @@ continuation" # http://yaml.org/spec/1.2/spec.html#style/flow/sequence [a, b, c, -# <- meta.flow-sequence punctuation.definition.sequence.begin +# <- meta.sequence.flow punctuation.definition.sequence.begin #^ string.unquoted.plain.in # ^ punctuation.separator.sequence # ^ punctuation.separator.sequence *alias] #^^^^^ variable.other.alias -# ^ meta.flow-sequence punctuation.definition.sequence.end +# ^ meta.sequence.flow punctuation.definition.sequence.end [a: b, c,'d', e: f, g:h] -#^ meta.flow-pair.key string.unquoted.plain.in entity.name.tag -# ^ meta.flow-pair punctuation.separator.key-value.mapping -meta.flow-pair.value -# ^ meta.flow-pair.value string.unquoted.plain.in -entity.name.tag +#^^^^^^^^^^^^^^^^^^^^^^^ meta.sequence.flow.yaml +#^ meta.mapping.key string.unquoted.plain.in +# ^ meta.mapping punctuation.separator.key-value.mapping -meta.mapping.value +# ^ meta.mapping.value string.unquoted.plain.in # ^ string.unquoted.plain.in # ^ punctuation.separator.sequence # ^^^ string.quoted.single -# ^ string.unquoted.plain.in entity.name.tag +# ^ meta.mapping.key string.unquoted.plain.in # ^ punctuation.separator.key-value.mapping # ^ punctuation.separator.sequence # ^^^ string.unquoted.plain.in - entity.name.tag @@ -112,47 +113,74 @@ continuation" # http://yaml.org/spec/1.2/spec.html#style/flow/sequence {a: b, :c: :d, -#^ meta.flow-pair.key string.unquoted.plain.in entity.name.tag -# ^ meta.flow-pair punctuation.separator.key-value.mapping -# ^ meta.flow-pair.value string.unquoted.plain.in -entity.name.tag -# ^ punctuation.separator.mapping -# ^^ string.unquoted.plain.in entity.name.tag -# ^ punctuation.separator.key-value.mapping -# ^^ string.unquoted.plain.in, -entity.name.tag +#^^^^^^^^^^^^^^ meta.mapping - meta.mapping meta.mapping +#^ meta.mapping.key.yaml string.unquoted.plain.in.yaml +# ^ meta.mapping.yaml punctuation.separator.key-value.mapping.yaml +# ^ meta.mapping.value string.unquoted.plain.in -entity.name.tag +# ^ meta.mapping.yaml punctuation.separator.mapping +# ^^ meta.mapping.key.yaml string.unquoted.plain.in +# ^ meta.mapping.yaml punctuation.separator.key-value.mapping +# ^^ meta.mapping.value.yaml string.unquoted.plain.in # ^ punctuation.separator.mapping -# <- meta.flow-mapping punctuation.definition.mapping.begin -*alias, e : f } -#^^^^^ variable.other.alias -# ^ punctuation.separator.mapping -# ^ string.unquoted.plain.in entity.name.tag -# ^ -string -# ^ punctuation.separator.key-value.mapping -# ^ string.unquoted.plain.in, -entity.name.tag -# ^ meta.flow-mapping punctuation.definition.mapping.end +# <- meta.mapping.yaml punctuation.definition.mapping.begin +*alias, true : false } +#^^^^^^^^^^^^^^^^^^^^^ meta.mapping - meta.mapping meta.mapping +#^^^^^ variable.other.alias +# ^ punctuation.separator.mapping +# ^^^^ meta.mapping.key.yaml constant.language.boolean.yaml - string +# ^ punctuation.separator.key-value.mapping +# ^^^^^ meta.mapping.value.yaml constant.language.boolean.yaml +# ^ meta.mapping.yaml punctuation.definition.mapping.end + + { 1: 2 } +#^^^^^^^^ meta.mapping - meta.mapping meta.mapping - string +# ^ meta.mapping.key.yaml constant.numeric +# ^ meta.mapping.yaml punctuation.separator.key-value.mapping.yaml +# ^^^ meta.mapping.value.yaml +# ^ constant.numeric + +{ "key": "value", 'key': 0 } +#^^^^^^^^^^^^^^^^^^^^^^^^^^^ source.yaml +# <- source.yaml meta.mapping.yaml punctuation.definition.mapping.begin.yaml +#^ meta.mapping.yaml +# ^^^^^ meta.mapping.key string.quoted.double.yaml +# ^ meta.mapping.yaml punctuation.separator.key-value.mapping.yaml +# ^^^^^^^^ meta.mapping.value.yaml +# ^^^^^^^ string.quoted.double.yaml +# ^^ meta.mapping.yaml +# ^ punctuation.separator.mapping.yaml +# ^^^^^ meta.mapping.key.yaml string.quoted.single.yaml +# ^ punctuation.separator.key-value.mapping.yaml +# ^^^ meta.mapping.value.yaml +# ^ meta.number.integer.decimal.yaml constant.numeric.value.yaml +# ^ meta.mapping.yaml punctuation.definition.mapping.end.yaml {? !!str 'key' : !!str value, -#^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.flow-pair.explicit -# ^^^^^^^^^^^^ meta.flow-pair.value -# ^ punctuation.separator.mapping -meta.flow-pair -#^ punctuation.definition.key-value.begin -# ^^^^^ storage -# ^^^^^ string -# ^ punctuation -# ^ punctuation -# ^ punctuation.separator.key-value.mapping -# ^^^^^ storage -# ^^^^^ string +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.mapping - meta.mapping meta.mapping +# ^^^^^^^^^^^^ meta.mapping.value +# ^ punctuation.separator.mapping - meta.mapping.value +#^ punctuation.definition.key.begin.yaml +#^^^^^^^^^^^^^^ meta.mapping.key.yaml +# ^^^^^ storage +# ^^^^^ string +# ^ punctuation +# ^ punctuation +# ^ meta.mapping.yaml punctuation.separator.key-value.mapping +# ^^^^^ storage +# ^^^^^ string ? !!str foo : :bar -#^ punctuation.definition.key-value.begin +#^^^^^^^^^^^^ meta.mapping.key.yaml +#^ punctuation.definition.key.begin.yaml # ^^^^^ storage -# ^^^ string entity.name.tag -# ^ punctuation.separator.key-value.mapping -string -# ^ string.unquoted.plain.in +# ^^^ string.unquoted.plain.in.yaml +# ^ meta.mapping.yaml punctuation.separator.key-value.mapping.yaml +# ^^^^ meta.mapping.value.yaml string.unquoted.plain.in.yaml } +# TODO catch `!!set` and set meta.set scope !!set {this, is, a, set} # ^ storage -# ^ string -entity -# ^ string -entity -# ^ string -entity -# ^ string -entity +# ^ string - meta.mapping.key +# ^ string - meta.mapping.key +# ^ string - meta.mapping.key +# ^ string - meta.mapping.key