From 4c142447c864240d8b03e2f6b933d6809ef71c83 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Tue, 16 Feb 2016 15:41:59 -0800 Subject: [PATCH 01/30] Recognize full resource syntaxes This commit looks for the beginning and end of a resource and only allowing certain patterns in between such as a title, parameters, and valid parameter values. --- grammars/puppet.cson | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 702b01f..47d62fe 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -114,13 +114,36 @@ ] } { - 'captures': + 'beginCaptures': '1': 'name': 'storage.type.puppet' - '2': - 'name': 'entity.name.section.puppet' - 'match': '^\\s*(\\w+)\\s*{\\s*([\'"].+[\'"]):' + 'begin': '(\\w+(?::{2}\\w+)*)\\s*{' 'name': 'meta.definition.resource.puppet' + 'end': '}' + 'patterns': [ + { + 'include': '#strings' + } + { + 'include': '#variables' + } + { + 'include': '#metaparameters' + } + { + 'beginCaptures': + '1': + 'name': 'name.parameter.resource.puppet' + 'begin': '(?:^|\\W)(\\w+)\\s*=>' + 'name': 'meta.parameter.resource.puppet' + 'end': '(,|\\n|;)' + 'patterns': [ + { + 'include': '#parameter-default-types' + } + ] + } + ] } { 'match': '\\b(case|if|else|elsif)(?!::)\\b' From 41f07fda016d521132e56a6a61a73acf0e8b994c Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Tue, 16 Feb 2016 15:49:05 -0800 Subject: [PATCH 02/30] Add conditionals to repository This commit adds conditionals to the repository and includes them in the global patterns. This will make it easier to maintain conditional logic over time. --- grammars/puppet.cson | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 47d62fe..9d4bd70 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -146,8 +146,7 @@ ] } { - 'match': '\\b(case|if|else|elsif)(?!::)\\b' - 'name': 'keyword.control.puppet' + 'include': '#conditionals' } { 'include': '#strings' @@ -437,3 +436,44 @@ 'name': 'variable.other.readwrite.global.puppet' } ] + 'conditionals': + 'patterns': [ + { + 'include': '#comparisons' + } + { + 'include': '#cases' + } + ] + 'comparisons': + 'beginCaptures': + '2': + 'name': 'keyword.control.puppet' + 'begin': '(^|\\s)\\s*(if|else|unless|elsif)\\s+' + 'end': '{' + 'patterns': [ + { + 'include': '#parameter-default-types' + } + { + 'include': '#comparisonoperators' + } + { + 'include': '#negationoperators' + } + ] + 'comparisonoperators': + 'match': '(?:\\s|^)(={2}|!=|>|<|>=|<=|=~|!~|in)(?:\\s|^)' + 'name': 'keyword.control.puppet' + 'negationoperators': + 'captures': + '1': + 'name': 'negation.keyword.control.puppet' + 'match': '(?:\\s|^)(not|!)(?:\\s|^)' + 'name': 'meta.keyword.control.puppet' + 'numbers': + 'captures': + '1': + 'name': 'number.constant.puppet' + 'match': '(?:(?:\\D&\\W)|\\s|^|\\[|\\{|,|;|\\()(\\d+([.]\\d+)?)(?!\\w)' + 'name': 'meta.control.puppet' From 35ec1f96d7a920987a297cca13030b577e3102a8 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Tue, 16 Feb 2016 15:51:21 -0800 Subject: [PATCH 03/30] Rename variable repo item to variables For consistency --- grammars/puppet.cson | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 9d4bd70..b934b7f 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -156,7 +156,7 @@ 'name': 'entity.name.section.puppet' } { - 'include': '#variable' + 'include': '#variables' } { 'begin': '(?i)\\b(import|include)\\b\\s*' @@ -206,7 +206,7 @@ 'include': '#escaped_char' } { - 'include': '#variable' + 'include': '#variables' } ] 'escaped_char': @@ -256,7 +256,7 @@ 'include': '#escaped_char' } { - 'include': '#variable' + 'include': '#variables' } { 'include': '#nested_braces_interpolated' @@ -287,7 +287,7 @@ 'include': '#escaped_char' } { - 'include': '#variable' + 'include': '#variables' } { 'include': '#nested_brackets_interpolated' @@ -318,7 +318,7 @@ 'include': '#escaped_char' } { - 'include': '#variable' + 'include': '#variables' } { 'include': '#nested_parens_interpolated' @@ -417,7 +417,7 @@ 'include': '#single-quoted-string' } ] - 'variable': + 'variables': 'patterns': [ { 'captures': From 1c74618f02481bfb8a37627790e1d1517e1acc21 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Tue, 16 Feb 2016 15:52:41 -0800 Subject: [PATCH 04/30] Add numbers as repository item Easier to maintain over time --- grammars/puppet.cson | 3 +++ 1 file changed, 3 insertions(+) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index b934b7f..d04e1ff 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -6,6 +6,9 @@ 'foldingStopMarker': '(\\*/|^\\s*(\\}|\\]|\\)))' 'name': 'Puppet' 'patterns': [ + { + 'include': '#numbers' + } { 'include': '#line_comment' } From 1d7da0a3b1e498e41035a67e17475d26b3e97707 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Tue, 16 Feb 2016 15:54:35 -0800 Subject: [PATCH 05/30] Improve function identification This commit makes functions a repository item and removes old ways of identifying them. --- grammars/puppet.cson | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index d04e1ff..68a412e 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -169,29 +169,28 @@ 'end': '(?=\\s|$)' 'name': 'meta.include.puppet' } - { - 'match': '\\b\\w+\\s*(?==>)\\s*' - 'name': 'constant.other.key.puppet' - } { 'match': '(?<={)\\s*\\w+\\s*(?=})' 'name': 'constant.other.bareword.puppet' } { - 'match': '(?i)\\b(alert|contain|crit|debug|defined|emerg|err|escape|fail|failed|file|generate|gsub|include|info|notice|package|realize|search|tag|tagged|template|warning)\\b' - 'name': 'support.function.puppet' - } - { - 'match': '=>' - 'name': 'punctuation.separator.key-value.puppet' + 'include': '#functions' } ] 'repository': - 'constants': + 'functions': + 'beginCaptures': + '0': + 'name': 'support.function.puppet' + 'endCaptures': + '0': + 'name': 'support.function.puppet' + 'begin': '(?:^|\\s|\\W)(\\w+)\\s*\\(' + 'end': '\\)' + 'name': 'meta.function.puppet' 'patterns': [ { - 'match': '(?i)\\b(absent|directory|false|file|present|running|stopped|true)\\b' - 'name': 'constant.language.puppet' + 'include': '#parameter-default-types' } ] 'double-quoted-string': @@ -345,14 +344,7 @@ 'include': '#array' } { - 'begin': '([a-zA-Z_][a-zA-Z0-9_]*)(\\()' - 'end': '(\\))' - 'name': 'meta.function.puppet' - 'patterns': [ - { - 'include': '#parameter-default-types' - } - ] + 'include': "#functions" } { 'include': '#constants' From a9f7440592fae0dfe0fb9f4cf64435b683f058d4 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Tue, 16 Feb 2016 15:59:56 -0800 Subject: [PATCH 06/30] Support new application puppet definition type --- grammars/puppet.cson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 68a412e..b24b64d 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -21,7 +21,7 @@ 'name': 'comment.block.puppet' } { - 'begin': '^\\s*(node|class)\\s+((?:[-_A-Za-z0-9"\'.]+::)*[-_A-Za-z0-9"\'.]+)\\s*' + 'begin': '^\\s*(node|class|application)\\s+((?:[-_A-Za-z0-9"\'.]+::)*[-_A-Za-z0-9"\'.]+)\\s*' 'captures': '1': 'name': 'storage.type.puppet' From 946d88dc5fa9100ea7d83b8139005cfbb4d64543 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Tue, 16 Feb 2016 16:00:43 -0800 Subject: [PATCH 07/30] Better identify constants --- grammars/puppet.cson | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index b24b64d..4296a9c 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -379,10 +379,6 @@ 'name': 'punctuation.definition.hash.end.puppet' 'name': 'meta.hash.puppet' 'patterns': [ - { - 'match': '\\b\\w+\\s*(?==>)\\s*' - 'name': 'constant.other.key.puppet' - } { 'include': '#parameter-default-types' } @@ -431,6 +427,9 @@ 'name': 'variable.other.readwrite.global.puppet' } ] + 'constants': + 'match': '(?:(?:\\D&\\W)|\\s|^|\\[|\\{|,|;|\\()[A-Z]\\w*', + 'name': 'constant.support.puppet' 'conditionals': 'patterns': [ { From 28f816143da059d7e49e027bb8c8ba4cf51514ff Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Wed, 17 Feb 2016 09:59:50 -0800 Subject: [PATCH 08/30] Don't match ending '{' for class definitiions This commit does not match the ending '{' character that signifies the end of a class metadata declaration, and the begining of the class content. Further, it treats the class name in the 'inherits' declaration the same as a class name --- grammars/puppet.cson | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 4296a9c..72a17f5 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -27,7 +27,7 @@ 'name': 'storage.type.puppet' '2': 'name': 'entity.name.type.class.puppet' - 'end': '(?={)' + 'end': '\\{' 'name': 'meta.definition.class.puppet' 'patterns': [ { @@ -35,12 +35,12 @@ 'captures': '1': 'name': 'storage.modifier.puppet' - 'end': '(?={)' + 'end': '\\{' 'name': 'meta.definition.class.inherits.puppet' 'patterns': [ { 'match': '\\b((?:[-_A-Za-z0-9".]+::)*[-_A-Za-z0-9".]+)\\b' - 'name': 'support.type.puppet' + 'name': 'entity.name.type.class.puppet' } ] } From 9df8e8b61912d9ce711155172faadfe91ababb5e Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Wed, 17 Feb 2016 10:02:18 -0800 Subject: [PATCH 09/30] Move definition parameter matching to repository This comit creates a 'defineparmaeters' repository item that is used for matching parameters in defined types, classes, and application definitions. --- grammars/puppet.cson | 65 ++++++++++++-------------------------------- 1 file changed, 17 insertions(+), 48 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 72a17f5..8efbffe 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -45,30 +45,7 @@ ] } { - 'captures': - '1': - 'name': 'variable.other.puppet' - '2': - 'name': 'punctuation.definition.variable.puppet' - 'match': '((\\$+)[a-zA-Z_][a-zA-Z0-9_]*)\\s*(?=,|\\))' - 'name': 'meta.function.argument.no-default.puppet' - } - { - 'begin': '((\\$+)[a-zA-Z_][a-zA-Z0-9_]*)(?:\\s*(=)\\s*)\\s*' - 'captures': - '1': - 'name': 'variable.other.puppet' - '2': - 'name': 'punctuation.definition.variable.puppet' - '3': - 'name': 'keyword.operator.assignment.puppet' - 'end': '(?=,|\\))' - 'name': 'meta.function.argument.default.puppet' - 'patterns': [ - { - 'include': '#parameter-default-types' - } - ] + 'include': '#defineparameters' } ] } @@ -89,30 +66,7 @@ 'name': 'meta.function.puppet' 'patterns': [ { - 'captures': - '1': - 'name': 'variable.other.puppet' - '2': - 'name': 'punctuation.definition.variable.puppet' - 'match': '((\\$+)[a-zA-Z_][a-zA-Z0-9_]*)\\s*(?=,|\\))' - 'name': 'meta.function.argument.no-default.puppet' - } - { - 'begin': '((\\$+)[a-zA-Z_][a-zA-Z0-9_]*)(?:\\s*(=)\\s*)\\s*' - 'captures': - '1': - 'name': 'variable.other.puppet' - '2': - 'name': 'punctuation.definition.variable.puppet' - '3': - 'name': 'keyword.operator.assignment.puppet' - 'end': '(?=,|\\))' - 'name': 'meta.function.argument.default.puppet' - 'patterns': [ - { - 'include': '#parameter-default-types' - } - ] + 'include': '#defineparameters' } ] } @@ -471,3 +425,18 @@ 'name': 'number.constant.puppet' 'match': '(?:(?:\\D&\\W)|\\s|^|\\[|\\{|,|;|\\()(\\d+([.]\\d+)?)(?!\\w)' 'name': 'meta.control.puppet' + 'defineparameters': + 'beginCaptures': + '0': + 'name': 'punctuation.definition.classparameter.begin.puppet' + 'begin': '\\(' + 'endCaptures': + '0': + 'name': 'punctuation.definition.classparameter.end.puppet' + 'end': '\\)' + 'name': 'meta.classparameter.language.puppet' + 'patterns': [ + { + 'include': '#parameter-default-types' + } + ] From b16aa7d73c66c9fbcf821e1e0804cd5cf6d1aa25 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Wed, 17 Feb 2016 10:03:39 -0800 Subject: [PATCH 10/30] Match assignment operations anywhere in Puppet code --- grammars/puppet.cson | 3 +++ 1 file changed, 3 insertions(+) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 8efbffe..d0cdaaa 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -127,6 +127,9 @@ 'match': '(?<={)\\s*\\w+\\s*(?=})' 'name': 'constant.other.bareword.puppet' } + { + 'include': '#assignments' + } { 'include': '#functions' } From 740c99b305ca9a44bbffb596408097c296247555 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Wed, 17 Feb 2016 16:54:25 -0800 Subject: [PATCH 11/30] Identify resource titles in a type block --- grammars/puppet.cson | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index d0cdaaa..63a81bb 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -74,10 +74,17 @@ 'beginCaptures': '1': 'name': 'storage.type.puppet' - 'begin': '(\\w+(?::{2}\\w+)*)\\s*{' + 'begin': '((?:[-_A-Za-z0-9".]+::)*[-_A-Za-z0-9".]+)\\s*{' 'name': 'meta.definition.resource.puppet' 'end': '}' 'patterns': [ + { + 'captures': + '1': + 'name': 'name.title.puppet' + 'match': '\\s*(.*):\\s*|\\n' + 'name': 'meta.title.puppet' + } { 'include': '#strings' } From 41f12dd630b9a2555e4c9ba437f5f1af81810582 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Wed, 17 Feb 2016 21:45:57 -0800 Subject: [PATCH 12/30] Properly tokenize resource parameters This commit properly parses resource parameters and adds new spec tests for resource tokenization --- grammars/puppet.cson | 19 ++++++++++++++----- spec/puppet-spec.coffee | 27 +++++++++++++++++++-------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 63a81bb..0ca0b98 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -82,7 +82,7 @@ 'captures': '1': 'name': 'name.title.puppet' - 'match': '\\s*(.*):\\s*|\\n' + 'match': '\\s*(.*):' 'name': 'meta.title.puppet' } { @@ -98,9 +98,11 @@ 'beginCaptures': '1': 'name': 'name.parameter.resource.puppet' - 'begin': '(?:^|\\W)(\\w+)\\s*=>' + '2': + 'name': 'punctuation.separator.key-value.puppet' + 'begin': '(\\w+)\\s*(=>)' 'name': 'meta.parameter.resource.puppet' - 'end': '(,|\\n|;)' + 'end': ',|\\n|;' 'patterns': [ { 'include': '#parameter-default-types' @@ -333,16 +335,23 @@ } 'hash': { - 'begin': '\\{' + 'begin': '{' 'beginCaptures': '0': 'name': 'punctuation.definition.hash.begin.puppet' - 'end': '\\}' + 'end': '}' 'endCaptures': '0': 'name': 'punctuation.definition.hash.end.puppet' 'name': 'meta.hash.puppet' 'patterns': [ + { + 'captures': + '0': + 'name': 'punctuation.separator.key-value.puppet' + 'match': '=>' + 'name': 'meta.punctuation.hash.puppet' + } { 'include': '#parameter-default-types' } diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index 5f6f791..9efe123 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -12,14 +12,25 @@ describe "Puppet grammar", -> expect(grammar).toBeTruthy() expect(grammar.scopeName).toBe "source.puppet" - describe "separators", -> - it "tokenizes attribute separator", -> - {tokens} = grammar.tokenizeLine('ensure => present') - expect(tokens[1]).toEqual value: '=>', scopes: ['source.puppet', 'punctuation.separator.key-value.puppet'] - - it "tokenizes attribute separator with string values", -> - {tokens} = grammar.tokenizeLine('ensure => "present"') - expect(tokens[1]).toEqual value: '=>', scopes: ['source.puppet', 'punctuation.separator.key-value.puppet'] + describe "resources", -> + manifest = "type { title: parameter1 => 'stringvalue', inlineparameter => Resource['reference']; }" + + it 'tokenizes resource types', -> + {tokens} = grammar.tokenizeLine(manifest) + expect(tokens[0]).toEqual value: 'type', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'storage.type.puppet'] + + it 'tokenizes resource titles', -> + {tokens} = grammar.tokenizeLine(manifest) + expect(tokens[3]).toEqual value: 'title', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'meta.title.puppet', 'name.title.puppet'] + + it 'tokenizes resource parameter', -> + {tokens} = grammar.tokenizeLine(manifest) + expect(tokens[6]).toEqual value: 'parameter1', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'meta.parameter.resource.puppet', 'name.parameter.resource.puppet'] + + it 'tokenizes resource parameter separators', -> + {tokens} = grammar.tokenizeLine(manifest) + expect(tokens[8]).toEqual value: '=>', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'meta.parameter.resource.puppet', 'punctuation.separator.key-value.puppet'] + describe "blocks", -> it "tokenizes single quoted node", -> From 99618311e0d81a6cc4263336ffdc0067ef5020a6 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Wed, 17 Feb 2016 22:29:01 -0800 Subject: [PATCH 13/30] Properly parse class definitions This commit properly parses class definitions with or without parameter and with or without class inheritance. Tests were also added --- grammars/puppet.cson | 9 ++++++--- spec/puppet-spec.coffee | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 0ca0b98..d0943ea 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -22,12 +22,15 @@ } { 'begin': '^\\s*(node|class|application)\\s+((?:[-_A-Za-z0-9"\'.]+::)*[-_A-Za-z0-9"\'.]+)\\s*' - 'captures': + 'beginCaptures': '1': 'name': 'storage.type.puppet' '2': 'name': 'entity.name.type.class.puppet' - 'end': '\\{' + 'endCaptures': + '0': + 'name': 'punctuation.definition.class.begin.puppet' + 'end': '{' 'name': 'meta.definition.class.puppet' 'patterns': [ { @@ -35,7 +38,7 @@ 'captures': '1': 'name': 'storage.modifier.puppet' - 'end': '\\{' + 'end': '{' 'name': 'meta.definition.class.inherits.puppet' 'patterns': [ { diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index 9efe123..fe85eab 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -32,6 +32,23 @@ describe "Puppet grammar", -> expect(tokens[8]).toEqual value: '=>', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'meta.parameter.resource.puppet', 'punctuation.separator.key-value.puppet'] + describe "classes", -> + it 'should tokenize a class without parameters', -> + {tokens} = grammar.tokenizeLine("class classname { }") + expect(tokens[0]).toEqual value: 'class', scopes: ['source.puppet', 'meta.definition.class.puppet', 'storage.type.puppet'] + expect(tokens[2]).toEqual value: 'classname', scopes: ['source.puppet', 'meta.definition.class.puppet', 'entity.name.type.class.puppet'] + expect(tokens[4]).toEqual value: '{', scopes: [ 'source.puppet', 'meta.definition.class.puppet', 'punctuation.definition.class.begin.puppet' ] + + it 'should tokenize a class with parameters', -> + {tokens} = grammar.tokenizeLine("class classname ( $parameter1, $parameter2 = 'value', $parameter3 = $classname::params) { }") + expect(tokens[4]).toEqual value: '(', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.classparameter.language.puppet', 'punctuation.definition.classparameter.begin.puppet'] + expect(tokens[21]).toEqual value: ')', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.classparameter.language.puppet', 'punctuation.definition.classparameter.end.puppet'] + + it 'should tokenize a class with ineritence', -> + {tokens} = grammar.tokenizeLine("class classname ( $parameter1, $parameter2 = 'value', $parameter3 = $classname::params) inherits another::class { }") + expect(tokens[23]).toEqual value: 'inherits', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.definition.class.inherits.puppet', 'storage.modifier.puppet'] + expect(tokens[25]).toEqual value: 'another::class', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.definition.class.inherits.puppet', 'entity.name.type.class.puppet'] + describe "blocks", -> it "tokenizes single quoted node", -> {tokens} = grammar.tokenizeLine("node 'hostname' {") From 0a0b64b272644af5377427790f67c1bb473a8586 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Wed, 17 Feb 2016 22:34:28 -0800 Subject: [PATCH 14/30] Add tests for application definitions --- spec/puppet-spec.coffee | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index fe85eab..df4c020 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -49,6 +49,18 @@ describe "Puppet grammar", -> expect(tokens[23]).toEqual value: 'inherits', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.definition.class.inherits.puppet', 'storage.modifier.puppet'] expect(tokens[25]).toEqual value: 'another::class', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.definition.class.inherits.puppet', 'entity.name.type.class.puppet'] + describe "applications", -> + it 'should tokenize an application without parameters', -> + {tokens} = grammar.tokenizeLine("application appname { }") + expect(tokens[0]).toEqual value: 'application', scopes: ['source.puppet', 'meta.definition.class.puppet', 'storage.type.puppet'] + expect(tokens[2]).toEqual value: 'appname', scopes: ['source.puppet', 'meta.definition.class.puppet', 'entity.name.type.class.puppet'] + expect(tokens[4]).toEqual value: '{', scopes: [ 'source.puppet', 'meta.definition.class.puppet', 'punctuation.definition.class.begin.puppet' ] + + it 'should tokenize an application with parameters', -> + {tokens} = grammar.tokenizeLine("application appname ( $parameter1, $parameter2 = 'value', $parameter3 = $classname::params) { }") + expect(tokens[4]).toEqual value: '(', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.classparameter.language.puppet', 'punctuation.definition.classparameter.begin.puppet'] + expect(tokens[21]).toEqual value: ')', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.classparameter.language.puppet', 'punctuation.definition.classparameter.end.puppet'] + describe "blocks", -> it "tokenizes single quoted node", -> {tokens} = grammar.tokenizeLine("node 'hostname' {") From 8ea250182ae40053fc5efbf14f1582b557698a28 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Wed, 17 Feb 2016 22:37:18 -0800 Subject: [PATCH 15/30] Support defined types the same as classes This commit replaces the defined type pattern with the class pattern since they're almost perfectly identical patterns --- grammars/puppet.cson | 23 +---------------------- spec/puppet-spec.coffee | 12 ++++++++++++ 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index d0943ea..38a46fb 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -21,7 +21,7 @@ 'name': 'comment.block.puppet' } { - 'begin': '^\\s*(node|class|application)\\s+((?:[-_A-Za-z0-9"\'.]+::)*[-_A-Za-z0-9"\'.]+)\\s*' + 'begin': '^\\s*(node|define|class|application)\\s+((?:[-_A-Za-z0-9"\'.]+::)*[-_A-Za-z0-9"\'.]+)\\s*' 'beginCaptures': '1': 'name': 'storage.type.puppet' @@ -52,27 +52,6 @@ } ] } - { - 'begin': '^\\s*(define)\\s+([a-zA-Z0-9_:]+)\\s*(\\()' - 'beginCaptures': - '1': - 'name': 'storage.type.function.puppet' - '2': - 'name': 'entity.name.function.puppet' - '3': - 'name': 'punctuation.definition.parameters.begin.puppet' - 'contentName': 'meta.function.arguments.puppet' - 'end': '\\)' - 'endCaptures': - '1': - 'name': 'punctuation.definition.parameters.end.puppet' - 'name': 'meta.function.puppet' - 'patterns': [ - { - 'include': '#defineparameters' - } - ] - } { 'beginCaptures': '1': diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index df4c020..5fa3d0b 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -61,6 +61,18 @@ describe "Puppet grammar", -> expect(tokens[4]).toEqual value: '(', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.classparameter.language.puppet', 'punctuation.definition.classparameter.begin.puppet'] expect(tokens[21]).toEqual value: ')', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.classparameter.language.puppet', 'punctuation.definition.classparameter.end.puppet'] + describe "defined types", -> + it 'should tokenize a defined type without parameters', -> + {tokens} = grammar.tokenizeLine("define typename { }") + expect(tokens[0]).toEqual value: 'define', scopes: ['source.puppet', 'meta.definition.class.puppet', 'storage.type.puppet'] + expect(tokens[2]).toEqual value: 'typename', scopes: ['source.puppet', 'meta.definition.class.puppet', 'entity.name.type.class.puppet'] + expect(tokens[4]).toEqual value: '{', scopes: [ 'source.puppet', 'meta.definition.class.puppet', 'punctuation.definition.class.begin.puppet' ] + + it 'should tokenize a defined type with parameters', -> + {tokens} = grammar.tokenizeLine("define typename ( $parameter1, $parameter2 = 'value', $parameter3 = $classname::params) { }") + expect(tokens[4]).toEqual value: '(', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.classparameter.language.puppet', 'punctuation.definition.classparameter.begin.puppet'] + expect(tokens[21]).toEqual value: ')', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.classparameter.language.puppet', 'punctuation.definition.classparameter.end.puppet'] + describe "blocks", -> it "tokenizes single quoted node", -> {tokens} = grammar.tokenizeLine("node 'hostname' {") From 14791535c9201abcce501e0607fe97b8532e9115 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Wed, 17 Feb 2016 23:23:36 -0800 Subject: [PATCH 16/30] Do not tokenize resource titles Tokenizing resource titles makes it impossible to have syntax highlighting for strings and variables for titles --- grammars/puppet.cson | 23 +++++++++++++++++++---- spec/puppet-spec.coffee | 8 ++++---- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 38a46fb..4fbee6e 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -63,8 +63,8 @@ { 'captures': '1': - 'name': 'name.title.puppet' - 'match': '\\s*(.*):' + 'name': 'punctuation.classtitle.puppet' + 'match': '(:)' 'name': 'meta.title.puppet' } { @@ -383,8 +383,23 @@ } ] 'constants': - 'match': '(?:(?:\\D&\\W)|\\s|^|\\[|\\{|,|;|\\()[A-Z]\\w*', - 'name': 'constant.support.puppet' + 'beginCaptures': + '0': + 'name': 'constant.support.puppet' + 'begin': '((?:[-_A-Za-z0-9"\'.]+::)*[-_A-Za-z0-9"\'.]+)\\[' + 'endCaptures': + '0': + 'name': 'constant.support.puppet' + 'end': '\\]' + 'patterns': [ + { + 'include': '#strings' + } + { + 'include': '#variables' + } + ] + 'conditionals': 'patterns': [ { diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index 5fa3d0b..4591782 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -19,17 +19,17 @@ describe "Puppet grammar", -> {tokens} = grammar.tokenizeLine(manifest) expect(tokens[0]).toEqual value: 'type', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'storage.type.puppet'] - it 'tokenizes resource titles', -> + it 'tokenizes resource title punctuation', -> {tokens} = grammar.tokenizeLine(manifest) - expect(tokens[3]).toEqual value: 'title', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'meta.title.puppet', 'name.title.puppet'] + expect(tokens[3]).toEqual value: ':', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'meta.title.puppet', 'punctuation.classtitle.puppet'] it 'tokenizes resource parameter', -> {tokens} = grammar.tokenizeLine(manifest) - expect(tokens[6]).toEqual value: 'parameter1', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'meta.parameter.resource.puppet', 'name.parameter.resource.puppet'] + expect(tokens[5]).toEqual value: 'parameter1', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'meta.parameter.resource.puppet', 'name.parameter.resource.puppet'] it 'tokenizes resource parameter separators', -> {tokens} = grammar.tokenizeLine(manifest) - expect(tokens[8]).toEqual value: '=>', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'meta.parameter.resource.puppet', 'punctuation.separator.key-value.puppet'] + expect(tokens[7]).toEqual value: '=>', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'meta.parameter.resource.puppet', 'punctuation.separator.key-value.puppet'] describe "classes", -> From 3b9b4da210a913f8b16d7df87fbadf0acadb361a Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Wed, 17 Feb 2016 23:34:02 -0800 Subject: [PATCH 17/30] Test resource reference tokenization --- spec/puppet-spec.coffee | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index 4591782..1801723 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -73,7 +73,13 @@ describe "Puppet grammar", -> expect(tokens[4]).toEqual value: '(', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.classparameter.language.puppet', 'punctuation.definition.classparameter.begin.puppet'] expect(tokens[21]).toEqual value: ')', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.classparameter.language.puppet', 'punctuation.definition.classparameter.end.puppet'] - describe "blocks", -> + describe "constants", -> + it 'should tokenize a resource reference', -> + {tokens} = grammar.tokenizeLine("Resource::Reference[title]") + expect(tokens[0]).toEqual value: "Resource::Reference[", scopes: ['source.puppet', 'constant.support.puppet'] + expect(tokens[2]).toEqual value: "]", scopes: ['source.puppet', 'constant.support.puppet'] + + describe "nodes", -> it "tokenizes single quoted node", -> {tokens} = grammar.tokenizeLine("node 'hostname' {") expect(tokens[0]).toEqual value: 'node', scopes: ['source.puppet', 'meta.definition.class.puppet', 'storage.type.puppet'] From bea13b8899f26913db09240cac0b3df765a2be88 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Wed, 17 Feb 2016 23:42:25 -0800 Subject: [PATCH 18/30] Add tests for functions --- spec/puppet-spec.coffee | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index 1801723..77a0d68 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -87,3 +87,9 @@ describe "Puppet grammar", -> it "tokenizes double quoted node", -> {tokens} = grammar.tokenizeLine('node "hostname" {') expect(tokens[0]).toEqual value: 'node', scopes: ['source.puppet', 'meta.definition.class.puppet', 'storage.type.puppet'] + + describe "functions", -> + it 'should tokenize a function with no space between name and (', -> + {tokens} = grammar.tokenizeLine('function()') + expect(tokens[0]).toEqual value: 'function(', scopes: [ 'source.puppet', 'meta.function.puppet', 'support.function.puppet' ] + expect(tokens[1]).toEqual value: ')', scopes: [ 'source.puppet', 'meta.function.puppet', 'support.function.puppet'] From 3f10a45af9fd682de8a064f77a96f4ab0043e75f Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Wed, 17 Feb 2016 23:43:52 -0800 Subject: [PATCH 19/30] Support numbers and hashes anywhere in the Puppet code --- grammars/puppet.cson | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 4fbee6e..17fd03d 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -6,15 +6,15 @@ 'foldingStopMarker': '(\\*/|^\\s*(\\}|\\]|\\)))' 'name': 'Puppet' 'patterns': [ - { - 'include': '#numbers' - } { 'include': '#line_comment' } { 'include': '#constants' } + { + 'include': '#hash' + } { 'begin': '^\\s*/\\*' 'end': '\\*/' From d11a95ffc22343583cd8a585b522a216b4bb9e6d Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Thu, 18 Feb 2016 10:07:23 -0800 Subject: [PATCH 20/30] Ensure defined types are tokenized properly --- spec/puppet-spec.coffee | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index 77a0d68..f9795ac 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -19,6 +19,11 @@ describe "Puppet grammar", -> {tokens} = grammar.tokenizeLine(manifest) expect(tokens[0]).toEqual value: 'type', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'storage.type.puppet'] + it 'tokenizes defined type resources', -> + manifest = "classname::type { title: parameter1 => 'stringvalue', inlineparameter => Resource['reference']; }" + {tokens} = grammar.tokenizeLine(manifest) + expect(tokens[0]).toEqual value: 'classname::type', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'storage.type.puppet'] + it 'tokenizes resource title punctuation', -> {tokens} = grammar.tokenizeLine(manifest) expect(tokens[3]).toEqual value: ':', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'meta.title.puppet', 'punctuation.classtitle.puppet'] From 29f56a8864a20a537b4de1d1442a6f4ad4b0048b Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Thu, 18 Feb 2016 10:07:37 -0800 Subject: [PATCH 21/30] Improve function testing --- spec/puppet-spec.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index f9795ac..484b859 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -95,6 +95,6 @@ describe "Puppet grammar", -> describe "functions", -> it 'should tokenize a function with no space between name and (', -> - {tokens} = grammar.tokenizeLine('function()') + {tokens} = grammar.tokenizeLine('function(parameter, parameter2)') expect(tokens[0]).toEqual value: 'function(', scopes: [ 'source.puppet', 'meta.function.puppet', 'support.function.puppet' ] - expect(tokens[1]).toEqual value: ')', scopes: [ 'source.puppet', 'meta.function.puppet', 'support.function.puppet'] + expect(tokens[2]).toEqual value: ')', scopes: [ 'source.puppet', 'meta.function.puppet', 'support.function.puppet'] From 8cfa4c5cf38177552d91aae4eca87cf7201c4363 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Thu, 18 Feb 2016 10:40:19 -0800 Subject: [PATCH 22/30] Support number tokenization anywhere in Puppet code This commit tokenizes integers and floats anywhere in the Puppet code. In the future, this should be reduced to only where numbers are allowed - as parameter values or assignment operation values. --- grammars/puppet.cson | 3 +++ spec/puppet-spec.coffee | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 17fd03d..db88a0b 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -12,6 +12,9 @@ { 'include': '#constants' } + { + 'include': '#numbers' + } { 'include': '#hash' } diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index 484b859..1316090 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -98,3 +98,12 @@ describe "Puppet grammar", -> {tokens} = grammar.tokenizeLine('function(parameter, parameter2)') expect(tokens[0]).toEqual value: 'function(', scopes: [ 'source.puppet', 'meta.function.puppet', 'support.function.puppet' ] expect(tokens[2]).toEqual value: ')', scopes: [ 'source.puppet', 'meta.function.puppet', 'support.function.puppet'] + + describe "numbers", -> + it "should tokenize floats", -> + {tokens} = grammar.tokenizeLine('883.111999') + expect(tokens[0]).toEqual value: '883.111999', scopes: [ 'source.puppet', 'meta.control.puppet', 'number.constant.puppet' ] + + it "should tokenize integers", -> + {tokens} = grammar.tokenizeLine('883') + expect(tokens[0]).toEqual value: '883', scopes: [ 'source.puppet', 'meta.control.puppet', 'number.constant.puppet' ] From ebbbc22f03845066293e452d7b3b061fdf353f6b Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Thu, 18 Feb 2016 10:46:20 -0800 Subject: [PATCH 23/30] Support line comments in resource declarations --- grammars/puppet.cson | 3 +++ 1 file changed, 3 insertions(+) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index db88a0b..ec3ca80 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -70,6 +70,9 @@ 'match': '(:)' 'name': 'meta.title.puppet' } + { + 'include': '#line_comment' + } { 'include': '#strings' } From 29c534a9eb6d7dfd5bfe4020eaa06e735e702b1a Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Mon, 22 Feb 2016 11:22:31 -0800 Subject: [PATCH 24/30] Fix syntax ordering and captures --- grammars/puppet.cson | 24 ++++++++++++++---------- spec/puppet-spec.coffee | 1 - 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index ec3ca80..dfedc04 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -30,18 +30,21 @@ 'name': 'storage.type.puppet' '2': 'name': 'entity.name.type.class.puppet' + 'end': '{' 'endCaptures': '0': 'name': 'punctuation.definition.class.begin.puppet' - 'end': '{' 'name': 'meta.definition.class.puppet' 'patterns': [ { 'begin': '\\b(inherits)\\b\\s+' - 'captures': + 'beginCaptures': '1': 'name': 'storage.modifier.puppet' 'end': '{' + 'endCaptures': + '0': + 'name': 'punctuation.definition.class.begin.puppet' 'name': 'meta.definition.class.inherits.puppet' 'patterns': [ { @@ -56,18 +59,18 @@ ] } { + 'begin': '((?:[-_A-Za-z0-9".]+::)*[-_A-Za-z0-9".]+)\\s*{' 'beginCaptures': '1': 'name': 'storage.type.puppet' - 'begin': '((?:[-_A-Za-z0-9".]+::)*[-_A-Za-z0-9".]+)\\s*{' 'name': 'meta.definition.resource.puppet' 'end': '}' 'patterns': [ { + 'match': ':' 'captures': - '1': + '0': 'name': 'punctuation.classtitle.puppet' - 'match': '(:)' 'name': 'meta.title.puppet' } { @@ -133,14 +136,16 @@ ] 'repository': 'functions': + 'begin': '(?:^|\\s|\\W)(\\w+)\\s*(\\()' 'beginCaptures': - '0': + '1': 'name': 'support.function.puppet' + '2': + 'name': 'punctuation.definition.function.begin.puppet' + 'end': '\\)' 'endCaptures': '0': - 'name': 'support.function.puppet' - 'begin': '(?:^|\\s|\\W)(\\w+)\\s*\\(' - 'end': '\\)' + 'name': 'punctuation.definition.function.end.puppet' 'name': 'meta.function.puppet' 'patterns': [ { @@ -405,7 +410,6 @@ 'include': '#variables' } ] - 'conditionals': 'patterns': [ { diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index 1316090..559ddb4 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -36,7 +36,6 @@ describe "Puppet grammar", -> {tokens} = grammar.tokenizeLine(manifest) expect(tokens[7]).toEqual value: '=>', scopes: ['source.puppet', 'meta.definition.resource.puppet', 'meta.parameter.resource.puppet', 'punctuation.separator.key-value.puppet'] - describe "classes", -> it 'should tokenize a class without parameters', -> {tokens} = grammar.tokenizeLine("class classname { }") From 96d96f36961a2bd5d79e3207731185c9a34bdd83 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Mon, 22 Feb 2016 11:38:55 -0800 Subject: [PATCH 25/30] Scope function begin and end parentheses --- grammars/puppet.cson | 2 +- spec/puppet-spec.coffee | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index dfedc04..2f6c6bf 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -136,7 +136,7 @@ ] 'repository': 'functions': - 'begin': '(?:^|\\s|\\W)(\\w+)\\s*(\\()' + 'begin': '(?:^|\\s|\\W|\\D)(\\w+)\\s*(\\()' 'beginCaptures': '1': 'name': 'support.function.puppet' diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index 559ddb4..e2a0929 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -95,8 +95,9 @@ describe "Puppet grammar", -> describe "functions", -> it 'should tokenize a function with no space between name and (', -> {tokens} = grammar.tokenizeLine('function(parameter, parameter2)') - expect(tokens[0]).toEqual value: 'function(', scopes: [ 'source.puppet', 'meta.function.puppet', 'support.function.puppet' ] - expect(tokens[2]).toEqual value: ')', scopes: [ 'source.puppet', 'meta.function.puppet', 'support.function.puppet'] + expect(tokens[0]).toEqual value: 'function', scopes: [ 'source.puppet', 'meta.function.puppet', 'support.function.puppet' ] + expect(tokens[1]).toEqual value: '(', scopes: [ 'source.puppet', 'meta.function.puppet', 'punctuation.definition.function.begin.puppet' ] + expect(tokens[3]).toEqual value: ')', scopes: [ 'source.puppet', 'meta.function.puppet', 'punctuation.definition.function.end.puppet' ] describe "numbers", -> it "should tokenize floats", -> From 4a06bad7a4f395467e6f3c94fed8c88d9df91e6c Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Mon, 22 Feb 2016 11:42:10 -0800 Subject: [PATCH 26/30] Use repository naming conventions This commit adds '-' characters to repository item names that contain two words --- grammars/puppet.cson | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 2f6c6bf..c1313a4 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -54,7 +54,7 @@ ] } { - 'include': '#defineparameters' + 'include': '#define-parameters' } ] } @@ -394,14 +394,14 @@ } ] 'constants': + 'begin': '((?:[-_A-Za-z0-9"\'.]+::)*[-_A-Za-z0-9"\'.]+)\\[' 'beginCaptures': '0': 'name': 'constant.support.puppet' - 'begin': '((?:[-_A-Za-z0-9"\'.]+::)*[-_A-Za-z0-9"\'.]+)\\[' + 'end': '\\]' 'endCaptures': '0': 'name': 'constant.support.puppet' - 'end': '\\]' 'patterns': [ { 'include': '#strings' @@ -420,26 +420,26 @@ } ] 'comparisons': + 'begin': '(^|\\s)\\s*(if|else|unless|elsif)\\s+' 'beginCaptures': '2': 'name': 'keyword.control.puppet' - 'begin': '(^|\\s)\\s*(if|else|unless|elsif)\\s+' 'end': '{' 'patterns': [ { 'include': '#parameter-default-types' } { - 'include': '#comparisonoperators' + 'include': '#comparison-operators' } { - 'include': '#negationoperators' + 'include': '#negation-operators' } ] - 'comparisonoperators': + 'comparison-operators': 'match': '(?:\\s|^)(={2}|!=|>|<|>=|<=|=~|!~|in)(?:\\s|^)' 'name': 'keyword.control.puppet' - 'negationoperators': + 'negation-operators': 'captures': '1': 'name': 'negation.keyword.control.puppet' @@ -451,15 +451,15 @@ 'name': 'number.constant.puppet' 'match': '(?:(?:\\D&\\W)|\\s|^|\\[|\\{|,|;|\\()(\\d+([.]\\d+)?)(?!\\w)' 'name': 'meta.control.puppet' - 'defineparameters': + 'define-parameters': + 'begin': '\\(' 'beginCaptures': '0': 'name': 'punctuation.definition.classparameter.begin.puppet' - 'begin': '\\(' + 'end': '\\)' 'endCaptures': '0': 'name': 'punctuation.definition.classparameter.end.puppet' - 'end': '\\)' 'name': 'meta.classparameter.language.puppet' 'patterns': [ { From 9eb735fdc016b792e3615d231cdd74ec86970204 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Mon, 22 Feb 2016 14:07:08 -0800 Subject: [PATCH 27/30] Fix function parameter matching --- grammars/puppet.cson | 8 ++++++-- spec/puppet-spec.coffee | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index c1313a4..371da85 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -148,6 +148,10 @@ 'name': 'punctuation.definition.function.end.puppet' 'name': 'meta.function.puppet' 'patterns': [ + { + 'match': ',' + 'name': 'punctuation.separator.parameter.puppet' + } { 'include': '#parameter-default-types' } @@ -380,16 +384,16 @@ 'captures': '1': 'name': 'punctuation.definition.variable.puppet' - 'match': '(\\$)([a-zA-Zx7f-xff\\$]|::)([a-zA-Z0-9_x7f-xff\\$]|::)*\\b' + 'match': '(\\${*)([a-zA-Zx7f-xff\\$]|::)([a-zA-Z0-9_x7f-xff\\$]|::)*\\b' 'name': 'variable.other.readwrite.global.puppet' } { + 'match': '(\\$\\{)(?:[a-zA-Zx7f-xff\\$]|::)(?:[a-zA-Z0-9_x7f-xff\\$]|::)*(\\})' 'captures': '1': 'name': 'punctuation.definition.variable.puppet' '2': 'name': 'punctuation.definition.variable.puppet' - 'match': '(\\$\\{)(?:[a-zA-Zx7f-xff\\$]|::)(?:[a-zA-Z0-9_x7f-xff\\$]|::)*(\\})' 'name': 'variable.other.readwrite.global.puppet' } ] diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index e2a0929..ef44ada 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -97,7 +97,8 @@ describe "Puppet grammar", -> {tokens} = grammar.tokenizeLine('function(parameter, parameter2)') expect(tokens[0]).toEqual value: 'function', scopes: [ 'source.puppet', 'meta.function.puppet', 'support.function.puppet' ] expect(tokens[1]).toEqual value: '(', scopes: [ 'source.puppet', 'meta.function.puppet', 'punctuation.definition.function.begin.puppet' ] - expect(tokens[3]).toEqual value: ')', scopes: [ 'source.puppet', 'meta.function.puppet', 'punctuation.definition.function.end.puppet' ] + expect(tokens[3]).toEqual value: ',', scopes: [ 'source.puppet', 'meta.function.puppet', 'punctuation.separator.parameter.puppet' ] + expect(tokens[5]).toEqual value: ')', scopes: [ 'source.puppet', 'meta.function.puppet', 'punctuation.definition.function.end.puppet' ] describe "numbers", -> it "should tokenize floats", -> From b2bab8d88d6ebd218bf787c0b56c87b160894a98 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Mon, 22 Feb 2016 16:52:33 -0800 Subject: [PATCH 28/30] Use proper scoping conventions for numbers and classes --- grammars/puppet.cson | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index 371da85..ce4861d 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -49,7 +49,7 @@ 'patterns': [ { 'match': '\\b((?:[-_A-Za-z0-9".]+::)*[-_A-Za-z0-9".]+)\\b' - 'name': 'entity.name.type.class.puppet' + 'name': 'entity.other.inherited-class.puppet' } ] } @@ -452,7 +452,7 @@ 'numbers': 'captures': '1': - 'name': 'number.constant.puppet' + 'name': 'constant.numeric.puppet' 'match': '(?:(?:\\D&\\W)|\\s|^|\\[|\\{|,|;|\\()(\\d+([.]\\d+)?)(?!\\w)' 'name': 'meta.control.puppet' 'define-parameters': From fb01c5fb0c53dcf59640ecaf74bfac75f909fc34 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Tue, 23 Feb 2016 10:30:15 -0800 Subject: [PATCH 29/30] Fix tests for number and class scoping changes --- spec/puppet-spec.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/puppet-spec.coffee b/spec/puppet-spec.coffee index ef44ada..d0a6d10 100644 --- a/spec/puppet-spec.coffee +++ b/spec/puppet-spec.coffee @@ -51,7 +51,7 @@ describe "Puppet grammar", -> it 'should tokenize a class with ineritence', -> {tokens} = grammar.tokenizeLine("class classname ( $parameter1, $parameter2 = 'value', $parameter3 = $classname::params) inherits another::class { }") expect(tokens[23]).toEqual value: 'inherits', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.definition.class.inherits.puppet', 'storage.modifier.puppet'] - expect(tokens[25]).toEqual value: 'another::class', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.definition.class.inherits.puppet', 'entity.name.type.class.puppet'] + expect(tokens[25]).toEqual value: 'another::class', scopes: ['source.puppet', 'meta.definition.class.puppet', 'meta.definition.class.inherits.puppet', 'entity.other.inherited-class.puppet'] describe "applications", -> it 'should tokenize an application without parameters', -> @@ -103,8 +103,8 @@ describe "Puppet grammar", -> describe "numbers", -> it "should tokenize floats", -> {tokens} = grammar.tokenizeLine('883.111999') - expect(tokens[0]).toEqual value: '883.111999', scopes: [ 'source.puppet', 'meta.control.puppet', 'number.constant.puppet' ] + expect(tokens[0]).toEqual value: '883.111999', scopes: [ 'source.puppet', 'meta.control.puppet', 'constant.numeric.puppet'] it "should tokenize integers", -> {tokens} = grammar.tokenizeLine('883') - expect(tokens[0]).toEqual value: '883', scopes: [ 'source.puppet', 'meta.control.puppet', 'number.constant.puppet' ] + expect(tokens[0]).toEqual value: '883', scopes: [ 'source.puppet', 'meta.control.puppet', 'constant.numeric.puppet'] From 3bf19725a94c746ede6b26560c9ea81623dbf6a0 Mon Sep 17 00:00:00 2001 From: Carl Caum Date: Tue, 23 Feb 2016 10:30:29 -0800 Subject: [PATCH 30/30] Support case statements This commit adds scoping for case statements. Case statements are really tricky since their parameter syntax structure is unique, but are easy to parse as hash parameters. This causes problems. Since each parameter can contain any valid Puppet code, and we need to parse each parameter explicitly, all valid Puppet code has been moved to a repository item called '#puppet'. This will give the rest of the parser quite a bit of flexibility as we can use this to fully match conditionals blocks --- grammars/puppet.cson | 281 ++++++++++++++++++++++++------------------- 1 file changed, 158 insertions(+), 123 deletions(-) diff --git a/grammars/puppet.cson b/grammars/puppet.cson index ce4861d..b2182c3 100644 --- a/grammars/puppet.cson +++ b/grammars/puppet.cson @@ -7,131 +7,10 @@ 'name': 'Puppet' 'patterns': [ { - 'include': '#line_comment' + 'include': '#puppet' } { - 'include': '#constants' - } - { - 'include': '#numbers' - } - { - 'include': '#hash' - } - { - 'begin': '^\\s*/\\*' - 'end': '\\*/' - 'name': 'comment.block.puppet' - } - { - 'begin': '^\\s*(node|define|class|application)\\s+((?:[-_A-Za-z0-9"\'.]+::)*[-_A-Za-z0-9"\'.]+)\\s*' - 'beginCaptures': - '1': - 'name': 'storage.type.puppet' - '2': - 'name': 'entity.name.type.class.puppet' - 'end': '{' - 'endCaptures': - '0': - 'name': 'punctuation.definition.class.begin.puppet' - 'name': 'meta.definition.class.puppet' - 'patterns': [ - { - 'begin': '\\b(inherits)\\b\\s+' - 'beginCaptures': - '1': - 'name': 'storage.modifier.puppet' - 'end': '{' - 'endCaptures': - '0': - 'name': 'punctuation.definition.class.begin.puppet' - 'name': 'meta.definition.class.inherits.puppet' - 'patterns': [ - { - 'match': '\\b((?:[-_A-Za-z0-9".]+::)*[-_A-Za-z0-9".]+)\\b' - 'name': 'entity.other.inherited-class.puppet' - } - ] - } - { - 'include': '#define-parameters' - } - ] - } - { - 'begin': '((?:[-_A-Za-z0-9".]+::)*[-_A-Za-z0-9".]+)\\s*{' - 'beginCaptures': - '1': - 'name': 'storage.type.puppet' - 'name': 'meta.definition.resource.puppet' - 'end': '}' - 'patterns': [ - { - 'match': ':' - 'captures': - '0': - 'name': 'punctuation.classtitle.puppet' - 'name': 'meta.title.puppet' - } - { - 'include': '#line_comment' - } - { - 'include': '#strings' - } - { - 'include': '#variables' - } - { - 'include': '#metaparameters' - } - { - 'beginCaptures': - '1': - 'name': 'name.parameter.resource.puppet' - '2': - 'name': 'punctuation.separator.key-value.puppet' - 'begin': '(\\w+)\\s*(=>)' - 'name': 'meta.parameter.resource.puppet' - 'end': ',|\\n|;' - 'patterns': [ - { - 'include': '#parameter-default-types' - } - ] - } - ] - } - { - 'include': '#conditionals' - } - { - 'include': '#strings' - } - { - 'match': '((\\$?)"?[a-zA-Z_\\x{7f}-\\x{ff}][a-zA-Z0-9_\\x{7f}-\\x{ff}]*"?):(?=\\s+|$)' - 'name': 'entity.name.section.puppet' - } - { - 'include': '#variables' - } - { - 'begin': '(?i)\\b(import|include)\\b\\s*' - 'beginCaptures': - '1': - 'name': 'keyword.control.import.include.puppet' - 'end': '(?=\\s|$)' - 'name': 'meta.include.puppet' - } - { - 'match': '(?<={)\\s*\\w+\\s*(?=})' - 'name': 'constant.other.bareword.puppet' - } - { - 'include': '#assignments' - } - { - 'include': '#functions' + 'include': '#definitions' } ] 'repository': @@ -377,7 +256,13 @@ { 'include': '#single-quoted-string' } + { + 'include': '#bareword' + } ] + 'bareword': + 'match': '(?<={)\\s*\\w+\\s*(?=})' + 'name': 'constant.other.bareword.puppet' 'variables': 'patterns': [ { @@ -423,6 +308,51 @@ 'include': '#cases' } ] + 'cases': + 'begin': '(case)\\s+((\\${*)([a-zA-Zx7f-xff\\$]|::)([a-zA-Z0-9_x7f-xff\\$]|::)*\\b)\\s*({)' + 'beginCaptures': + '1': + 'name': 'keyword.control.puppet' + '2': + 'name': 'variable.other.readwrite.global.puppet' + '3': + 'name': 'punctuation.conditional.case.begin.puppet' + 'end': '}' + 'endCaptures': + '0': + 'name': 'punctuation.conditional.case.end.puppet' + 'name': 'meta.conditional.case.puppet' + 'patterns': [ + { + 'include': '#case-parameters' + } + ] + 'case-parameters': + 'patterns': [ + { + 'begin': '(=>)\\s*({)' + 'beginCaptures': + '0': + 'name': 'punctuation.separator.key-value.puppet' + '2': + 'name': 'punctuation.parameter.begin.puppet' + 'end': '(})(?:,|$)' + 'endCaptures': + '1': + 'name': 'punctuation.parameter.end.puppet' + 'patterns': [ + { + 'include': '#puppet' + } + ] + } + { + 'include': '#variables' + } + { + 'include': '#strings' + } + ] 'comparisons': 'begin': '(^|\\s)\\s*(if|else|unless|elsif)\\s+' 'beginCaptures': @@ -470,3 +400,108 @@ 'include': '#parameter-default-types' } ] + + 'definitions': + 'begin': '^\\s*(node|define|class|application)\\s+((?:[-_A-Za-z0-9"\'.]+::)*[-_A-Za-z0-9"\'.]+)\\s*' + 'beginCaptures': + '1': + 'name': 'storage.type.puppet' + '2': + 'name': 'entity.name.type.class.puppet' + 'end': '{' + 'endCaptures': + '0': + 'name': 'punctuation.definition.class.begin.puppet' + 'name': 'meta.definition.class.puppet' + 'patterns': [ + { + 'begin': '\\b(inherits)\\b\\s+' + 'beginCaptures': + '1': + 'name': 'storage.modifier.puppet' + 'end': '{' + 'endCaptures': + + 'name': 'punctuation.definition.class.begin.puppet' + 'name': 'meta.definition.class.inherits.puppet' + 'patterns': [ + { + 'match': '\\b((?:[-_A-Za-z0-9".]+::)*[-_A-Za-z0-9".]+)\\b' + 'name': 'entity.other.inherited-class.puppet' + } + ] + } + { + 'include': '#define-parameters' + } + ] + 'resources': + 'begin': '((?:[-_A-Za-z0-9".]+::)*[-_A-Za-z0-9".]+)\\s*{' + 'beginCaptures': + '1': + 'name': 'storage.type.puppet' + 'name': 'meta.definition.resource.puppet' + 'end': '}' + 'patterns': [ + { + 'match': ':' + 'captures': + '0': + 'name': 'punctuation.classtitle.puppet' + 'name': 'meta.title.puppet' + } + { + 'include': '#line_comment' + } + { + 'include': '#strings' + } + { + 'include': '#variables' + } + { + 'include': '#metaparameters' + } + { + 'beginCaptures': + '1': + 'name': 'name.parameter.resource.puppet' + '2': + 'name': 'punctuation.separator.key-value.puppet' + 'begin': '(\\w+)\\s*(=>)' + 'name': 'meta.parameter.resource.puppet' + 'end': ',|\\n|;' + 'patterns': [ + { + 'include': '#parameter-default-types' + } + ] + } + ] + 'puppet': + 'patterns': [ + { + 'include': '#parameter-default-types' + } + { + 'include': '#resources' + } + { + 'include': '#conditionals' + } + { + 'match': '((\\$?)"?[a-zA-Z_\\x{7f}-\\x{ff}][a-zA-Z0-9_\\x{7f}-\\x{ff}]*"?):(?=\\s+|$)' + 'name': 'entity.name.section.puppet' + } + { + 'begin': '(?i)\\b(import|include)\\b\\s*' + 'beginCaptures': + '1': + 'name': 'keyword.control.import.include.puppet' + 'end': '(?=\\s|$)' + 'name': 'meta.include.puppet' + } + { + 'include': '#functions' + } + ]