From 2a47f847a4207450cb3df578d673e0cadfcce183 Mon Sep 17 00:00:00 2001 From: alpyre Date: Sun, 12 Feb 2017 16:17:27 +0200 Subject: [PATCH 1/7] Changes for PR #206 - re-implement function patterns - re-implement #define patterns - prevent unnecessary nesting of section scopes - tokenize all parentheses - highlight #include_next - introduce meta.preprocessor.pragma.c scope - include hyphens in #pragma identifiers - create specs for the changes --- grammars/c.cson | 725 +++++++++++++++++++++++++++++++++++++++++---- spec/c-spec.coffee | 200 ++++++++----- 2 files changed, 790 insertions(+), 135 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index 6a5914f..82302d8 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -58,8 +58,8 @@ } { 'begin': '''(?x) - ^\\s* ((\\#)\\s*define) \\s+ # define - ((?[a-zA-Z_$][\\w$]*)) # macro name + ^\\s* ((\\#)\\s*define) \\s+ # define + ((?[a-zA-Z_$][\\w$]*)) # macro name (?: (\\() ( @@ -89,7 +89,7 @@ 'name': 'meta.preprocessor.macro.c' 'patterns': [ { - 'include': '$base' + 'include': '#preprocessor-rule-define-line-contents' } ] } @@ -115,7 +115,7 @@ ] } { - 'begin': '^\\s*((#)\\s*(include|import))\\b\\s*' + 'begin': '^\\s*((#)\\s*(include(?:_next)?|import))\\b\\s*' 'beginCaptures': '1': 'name': 'keyword.control.directive.$3.c' @@ -202,13 +202,13 @@ '2': 'name': 'punctuation.definition.directive.c' 'end': '(?=(?://|/\\*))|(?]) # type modifier before name - ) - ) - (\\s*)(?!(while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate)\\s*\\() - ( - (?:[A-Za-z_][A-Za-z0-9_]*+|::)++ # actual name + (?!(?:while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate|asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\s*\\() + (?= + (?:[A-Za-z_][A-Za-z0-9_]*+|::)++\\s*\\( # actual name | - (?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\])) + (?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\]))\\s*\\( ) - \\s*(?=\\() ''' - 'beginCaptures': - '1': - 'name': 'punctuation.whitespace.function.leading.c' - '3': - 'name': 'entity.name.function.c' - '4': - 'name': 'punctuation.definition.parameters.c' - 'end': '(?<=\\})|(?=#)|(;)' + 'end': '(?<=\\))(?!\\w)' 'name': 'meta.function.c' 'patterns': [ { - 'include': '#comments' - } - { - 'include': '#parens' - } - { - 'match': '\\b(const)\\b' - 'name': 'storage.modifier.c' - } - { - 'include': '#block' + # NOW CONSUME TOKENS + 'include': '#meta-function-scope-innards' } ] } @@ -380,38 +360,48 @@ 'name': 'meta.initialization.c' } { - 'include': '#block' + # Prevent unnecessary nesting of meta.block.c scope + 'begin': '\\{' + 'beginCaptures': + '0': + 'name': 'punctuation.section.block.begin.c' + 'end': '\\}|(?=\\s*#\\s*(?:elif|else|endif)\\b)' + 'endCaptures': + '0': + 'name': 'punctuation.section.block.end.c' + #'name': 'meta.block.c' + 'patterns': [ + { + 'include': '#block_innards' + } + ] + } + { + 'include': '#parens-block' } { 'include': '$base' } ] 'c_function_call': - 'captures': - '1': - 'name': 'punctuation.whitespace.function-call.leading.c' - '2': - 'name': 'support.function.any-method.c' - '4': - 'name': 'punctuation.definition.parameters.c' - 'match': '''(?x) - (?: - (?=\\s) - (?:(?<=else|new|return) | (?=+!]+|\\(\\)|\\[\\]))\\s*\\( ) - \\s*(\\() # Opening bracket ''' + 'end': '(?<=\\))(?!\\w)' 'name': 'meta.function-call.c' + 'patterns': [ + { + # NOW CONSUME TOKENS + 'include': '#meta-function-call-scope-innards' + } + ] 'comments': 'patterns': [ { @@ -537,14 +527,85 @@ 'name': 'punctuation.section.parens.end.c' 'name': 'meta.parens.c' 'patterns': [ + { + 'include': '#functions-inparens' + } + { + # Provides right matching of inner paranthesis couples + 'include': '#parens-inner' + } { 'include': '$base' } ] + 'parens-inner': + 'begin': '\\(' + 'beginCaptures': + '0': + 'name': 'punctuation.section.parens.begin.c' + 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.section.parens.end.c' + #'name': 'meta.parens.c' <-- PREVENTS UNNECESSARY NESTING OF meta.parens + 'patterns': [ + { + 'include': '#functions-inparens' + } + { + 'include': '#parens-inner' + } + { + 'include': '$base' + } + ] + 'parens-block': + 'begin': '\\(' + 'beginCaptures': + '0': + 'name': 'punctuation.section.parens.begin.c' + 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.section.parens.end.c' + 'name': 'meta.parens.c' + 'patterns': [ + { + 'include': '#c_function_call-inparens' + } + { + # Provides right matching of inner paranthesis couples + 'include': '#parens-inner-block' + } + { + 'include': '#block_innards' + } + ] + 'parens-inner-block': + 'begin': '\\(' + 'beginCaptures': + '0': + 'name': 'punctuation.section.parens.begin.c' + 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.section.parens.end.c' + #'name': 'meta.parens.c' <-- PREVENTS UNNECESSARY NESTING OF meta.parens + 'patterns': [ + { + 'include': '#c_function_call-inparens' + } + { + 'include': '#parens-inner-block' + } + { + 'include': '#block_innards' + } + ] 'pragma-mark': 'captures': '1': - 'name': 'meta.preprocessor.c' + 'name': 'meta.preprocessor.pragma.c' '2': 'name': 'keyword.control.directive.pragma.pragma-mark.c' '3': @@ -1490,3 +1551,543 @@ 'include': '#block_innards' } ] + 'preprocessor-rule-define-line-contents': + 'patterns': [ + { + # block pattern for #define lines (terminates at newline w/o line_continuation_character) + 'begin': '\\{' + 'beginCaptures': + '0': + 'name': 'punctuation.section.block.begin.c' + 'end': '\\}|(?=\\s*#\\s*(?:elif|else|endif)\\b)|(?=+!]+|\\(\\)|\\[\\]))\\s*\\( + ) + ''' + 'end': '(?<=\\))(?!\\w)|(?=+!]+|\\(\\)|\\[\\])) + ) + \\s*(\\() + ''' + 'beginCaptures': + '1': + 'name': 'entity.name.function.c' + '2': + 'name': 'punctuation.section.parameters.begin.c' + 'end': '(\\))|(?=+!]+|\\(\\)|\\[\\])) + ) + \\s*(\\() + ''' + 'beginCaptures': + '1': + 'name': 'entity.name.function.c' + '2': + 'name': 'punctuation.section.parameters.begin.c' + 'end': '(\\))|(?=+!]+|\\(\\)|\\[\\]))\\s*\\( + ) + ''' + 'end': '(?<=\\))(?!\\w)' + 'name': 'meta.function.c' + 'patterns': [ + { + # NOW CONSUME TOKENS + 'include': '#meta-function-scope-innards-inparens' + } + { + 'include': '$base' + } + ] + 'c_function_call-inparens': + # NEW FUNCTION/MACRO IMPLEMENTATION + # FIRST CAPTURE meta.function-call.c scope (provides an injectable scope, balanced paranthesis and prevents unnecessary scope nesting) + 'begin': '''(?x) + (?!(?:while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate)\\s*\\() + (?= + (?:[A-Za-z_][A-Za-z0-9_]*+|::)++\\s*\\( # actual name + | + (?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\]))\\s*\\( + ) + ''' + 'end': '(?<=\\))(?!\\w)' + 'name': 'meta.function-call.c' + 'patterns': [ + { + # NOW CONSUME TOKENS + 'include': '#meta-function-call-scope-innards-inparens' + } + ] + 'meta-function-scope-innards': + 'patterns': [ + { + 'match': '\\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\b' + 'name': 'storage.type.c' + } + { + 'include': '#operators' + } + { + 'begin': '''(?x) + (?!(?:while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate)\\s*\\() + ( + (?:[A-Za-z_][A-Za-z0-9_]*+|::)++ # actual name + | + (?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\])) + ) + \\s*(\\() + ''' + 'beginCaptures': + '1': + 'name': 'entity.name.function.c' + '2': + 'name': 'punctuation.section.parameters.begin.c' + 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.section.parameters.end.c' + 'patterns': [ + { + 'include': '#meta-function-scope-innards' + } + ] + } + { + # Capture paranthesis' + 'begin': '\\(' + 'beginCaptures': + '0': + 'name': 'punctuation.section.parens.begin.c' + 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.section.parens.end.c' + 'name': 'meta.parens.c' + 'patterns': [ + { + # Provides right matching of inner paranthesis couples + 'include': '#meta-function-scope-innards-inparens' + } + ] + } + { + 'include': '$base' + } + ] + 'meta-function-scope-innards-inparens': + 'patterns': [ + { + 'match': '\\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\b' + 'name': 'storage.type.c' + } + { + 'include': '#operators' + } + { + 'begin': '''(?x) + (?!(?:while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate)\\s*\\() + ( + (?:[A-Za-z_][A-Za-z0-9_]*+|::)++ # actual name + | + (?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\])) + ) + \\s*(\\() + ''' + 'beginCaptures': + '1': + 'name': 'entity.name.function.c' + '2': + 'name': 'punctuation.section.parameters.begin.c' + 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.section.parameters.end.c' + 'patterns': [ + { + 'include': '#meta-function-scope-innards-inparens' + } + ] + } + { + # Capture paranthesis' + 'begin': '\\(' + 'beginCaptures': + '0': + 'name': 'punctuation.section.parens.begin.c' + 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.section.parens.end.c' + #'name': 'meta.parens.c' <--Provides unnecessary nesting of parens scope. + 'patterns': [ + { + 'include': '#meta-function-scope-innards-inparens' + } + ] + } + { + 'include': "$base" + } + ] + 'meta-function-call-scope-innards': + 'patterns': [ + { + 'match': '\\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\b' + 'name': 'storage.type.c' + } + { + 'include': '#operators' + } + { + 'begin': '''(?x) + (?!(?:while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate)\\s*\\() + ( + (?:[A-Za-z_][A-Za-z0-9_]*+|::)++ # actual name + | + (?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\])) + ) + \\s*(\\() + ''' + 'beginCaptures': + '1': + 'name': 'entity.name.function.c' + '2': + 'name': 'punctuation.section.parameters.begin.c' + 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.section.parameters.end.c' + 'patterns': [ + { + 'include': '#meta-function-call-scope-innards' + } + ] + } + { + # Capture paranthesis' + 'begin': '\\(' + 'beginCaptures': + '0': + 'name': 'punctuation.section.parens.begin.c' + 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.section.parens.end.c' + 'name': 'meta.parens.c' + 'patterns': [ + { + # Provides right matching of inner paranthesis couples + 'include': '#meta-function-call-scope-innards-inparens' + } + ] + } + { + 'include': '#block_innards' + } + ] + 'meta-function-call-scope-innards-inparens': + 'patterns': [ + { + 'match': '\\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\b' + 'name': 'storage.type.c' + } + { + 'include': '#operators' + } + { + 'begin': '''(?x) + (?!(?:while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate)\\s*\\() + ( + (?:[A-Za-z_][A-Za-z0-9_]*+|::)++ # actual name + | + (?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\])) + ) + \\s*(\\() + ''' + 'beginCaptures': + '1': + 'name': 'entity.name.function.c' + '2': + 'name': 'punctuation.section.parameters.begin.c' + 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.section.parameters.end.c' + 'patterns': [ + { + 'include': '#meta-function-call-scope-innards-inparens' + } + ] + } + { + # Capture paranthesis' + 'begin': '\\(' + 'beginCaptures': + '0': + 'name': 'punctuation.section.parens.begin.c' + 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.section.parens.end.c' + #'name': 'meta.parens.c' <--Provides unnecessary nesting of parens scope. + 'patterns': [ + { + # Provides right matching of inner paranthesis couples + 'include': '#meta-function-call-scope-innards-inparens' + } + ] + } + { + 'include': '#block_innards' + } + ] diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index f7f77a0..1b14e70 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -29,13 +29,13 @@ describe "Language-C", -> ''' expect(lines[0][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] expect(lines[0][2]).toEqual value: 'something', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(lines[0][4]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'storage.type.c'] - expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] - expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'punctuation.section.block.begin.c'] - expect(lines[1][1]).toEqual value: 'return', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'keyword.control.c'] - expect(lines[1][3]).toEqual value: '0', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'constant.numeric.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] + expect(lines[0][4]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'storage.type.c'] + expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] + expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.block.c', 'punctuation.section.block.begin.c'] + expect(lines[1][1]).toEqual value: 'return', scopes: ['source.c', 'meta.block.c', 'keyword.control.c'] + expect(lines[1][3]).toEqual value: '0', scopes: ['source.c', 'meta.block.c', 'constant.numeric.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.block.c', 'punctuation.section.block.end.c'] it "tokenizes various _t types", -> {tokens} = grammar.tokenizeLine 'size_t var;' @@ -145,24 +145,24 @@ describe "Language-C", -> it "tokenizes '#pragma'", -> {tokens} = grammar.tokenizeLine '#pragma once' - expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.pragma.c', 'punctuation.definition.directive.c'] - expect(tokens[1]).toEqual value: 'pragma', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.pragma.c'] - expect(tokens[2]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.c'] - expect(tokens[3]).toEqual value: 'once', scopes: ['source.c', 'meta.preprocessor.c', 'entity.other.attribute-name.pragma.preprocessor.c'] + expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.pragma.c', 'keyword.control.directive.pragma.c', 'punctuation.definition.directive.c'] + expect(tokens[1]).toEqual value: 'pragma', scopes: ['source.c', 'meta.preprocessor.pragma.c', 'keyword.control.directive.pragma.c'] + expect(tokens[2]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.pragma.c'] + expect(tokens[3]).toEqual value: 'once', scopes: ['source.c', 'meta.preprocessor.pragma.c', 'entity.other.attribute-name.pragma.preprocessor.c'] {tokens} = grammar.tokenizeLine '#pragma clang diagnostic ignored "-Wunused-variable"' - expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.pragma.c', 'punctuation.definition.directive.c'] - expect(tokens[1]).toEqual value: 'pragma', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.pragma.c'] - expect(tokens[2]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.c'] - expect(tokens[3]).toEqual value: 'clang', scopes: ['source.c', 'meta.preprocessor.c', 'entity.other.attribute-name.pragma.preprocessor.c'] - expect(tokens[5]).toEqual value: 'diagnostic', scopes: ['source.c', 'meta.preprocessor.c', 'entity.other.attribute-name.pragma.preprocessor.c'] - expect(tokens[7]).toEqual value: 'ignored', scopes: ['source.c', 'meta.preprocessor.c', 'entity.other.attribute-name.pragma.preprocessor.c'] - expect(tokens[10]).toEqual value: '-Wunused-variable', scopes: ['source.c', 'meta.preprocessor.c', 'string.quoted.double.c'] + expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.pragma.c', 'keyword.control.directive.pragma.c', 'punctuation.definition.directive.c'] + expect(tokens[1]).toEqual value: 'pragma', scopes: ['source.c', 'meta.preprocessor.pragma.c', 'keyword.control.directive.pragma.c'] + expect(tokens[2]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.pragma.c'] + expect(tokens[3]).toEqual value: 'clang', scopes: ['source.c', 'meta.preprocessor.pragma.c', 'entity.other.attribute-name.pragma.preprocessor.c'] + expect(tokens[5]).toEqual value: 'diagnostic', scopes: ['source.c', 'meta.preprocessor.pragma.c', 'entity.other.attribute-name.pragma.preprocessor.c'] + expect(tokens[7]).toEqual value: 'ignored', scopes: ['source.c', 'meta.preprocessor.pragma.c', 'entity.other.attribute-name.pragma.preprocessor.c'] + expect(tokens[10]).toEqual value: '-Wunused-variable', scopes: ['source.c', 'meta.preprocessor.pragma.c', 'string.quoted.double.c'] {tokens} = grammar.tokenizeLine '#pragma mark – Initialization' - expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.section', 'meta.preprocessor.c', 'keyword.control.directive.pragma.pragma-mark.c', 'punctuation.definition.directive.c'] - expect(tokens[1]).toEqual value: 'pragma mark', scopes: ['source.c', 'meta.section', 'meta.preprocessor.c', 'keyword.control.directive.pragma.pragma-mark.c'] - expect(tokens[3]).toEqual value: '– Initialization', scopes: ['source.c', 'meta.section', 'meta.preprocessor.c', 'entity.name.tag.pragma-mark.c'] + expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.section', 'meta.preprocessor.pragma.c', 'keyword.control.directive.pragma.pragma-mark.c', 'punctuation.definition.directive.c'] + expect(tokens[1]).toEqual value: 'pragma mark', scopes: ['source.c', 'meta.section', 'meta.preprocessor.pragma.c', 'keyword.control.directive.pragma.pragma-mark.c'] + expect(tokens[3]).toEqual value: '– Initialization', scopes: ['source.c', 'meta.section', 'meta.preprocessor.pragma.c', 'entity.name.tag.pragma-mark.c'] describe "define", -> it "tokenizes '#define [identifier name]'", -> @@ -182,21 +182,22 @@ describe "Language-C", -> expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] expect(tokens[1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] expect(tokens[3]).toEqual value: 'ABC', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] - expect(tokens[4]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'punctuation.whitespace.function.leading.c'] + expect(tokens[4]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[5]).toEqual value: 'XYZ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'entity.name.function.c'] - expect(tokens[6]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(tokens[7]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parens.c', 'constant.numeric.c'] - expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(tokens[6]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] + expect(tokens[7]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'constant.numeric.c'] + expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] {tokens} = grammar.tokenizeLine '#define PI_PLUS_ONE (3.14 + 1)' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] expect(tokens[1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] expect(tokens[3]).toEqual value: 'PI_PLUS_ONE', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] - expect(tokens[4]).toEqual value: ' (', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[5]).toEqual value: '3.14', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[7]).toEqual value: '+', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.operator.c'] - expect(tokens[9]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[10]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[4]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[5]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] + expect(tokens[6]).toEqual value: '3.14', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'constant.numeric.c'] + expect(tokens[8]).toEqual value: '+', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'keyword.operator.c'] + expect(tokens[10]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'constant.numeric.c'] + expect(tokens[11]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] describe "macros", -> it "tokenizes them", -> @@ -219,9 +220,16 @@ describe "Language-C", -> expect(tokens[6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(tokens[7]).toEqual value: ' y', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] - expect(tokens[9]).toEqual value: ' (x) ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[10]).toEqual value: '*', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.operator.c'] - expect(tokens[11]).toEqual value: ' (y)', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[9]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] + expect(tokens[11]).toEqual value: 'x', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c'] + expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(tokens[13]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[14]).toEqual value: '*', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.operator.c'] + expect(tokens[15]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[16]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] + expect(tokens[17]).toEqual value: 'y', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c'] + expect(tokens[18]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] {tokens} = grammar.tokenizeLine '#define SWAP(a, b) do { a ^= b; b ^= a; a ^= b; } while ( 0 )' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] @@ -243,16 +251,17 @@ describe "Language-C", -> expect(tokens[19]).toEqual value: ' b; ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] expect(tokens[22]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] - expect(tokens[23]).toEqual value: ' ( ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[24]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[25]).toEqual value: ' )', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[23]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] + expect(tokens[26]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'constant.numeric.c'] + expect(tokens[28]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] it "tokenizes multiline macros", -> lines = grammar.tokenizeLines ''' #define max(a,b) (a>b)? \\ a:b ''' - expect(lines[0][14]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] + expect(lines[0][17]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] lines = grammar.tokenizeLines ''' #define SWAP(a, b) { \\ @@ -279,6 +288,40 @@ describe "Language-C", -> expect(lines[3][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] + it "tokenizes complex definitions", -> + lines = grammar.tokenizeLines ''' + #define MakeHook(name) struct HOOK name = {{false, 0L}, \\ + ((HOOKF)(*HookEnt)), ID("hook")} + ''' + expect(lines[0][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] + expect(lines[0][1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] + expect(lines[0][3]).toEqual value: 'MakeHook', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] + expect(lines[0][4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.begin.c'] + expect(lines[0][5]).toEqual value: 'name', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] + expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] + expect(lines[0][8]).toEqual value: 'struct', scopes: ['source.c', 'meta.preprocessor.macro.c', 'storage.type.c'] + expect(lines[0][10]).toEqual value: '=', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.operator.assignment.c'] + expect(lines[0][12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.c'] + expect(lines[0][13]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.c'] + expect(lines[0][14]).toEqual value: 'false', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.language.c'] + expect(lines[0][16]).toEqual value: '0L', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.numeric.c'] + expect(lines[0][17]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(lines[0][19]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] + expect(lines[1][0]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] + expect(lines[1][1]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] + expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(lines[1][4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] + expect(lines[1][5]).toEqual value: '*', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'keyword.operator.c'] + expect(lines[1][7]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(lines[1][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(lines[1][10]).toEqual value: 'ID', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'entity.name.function.c'] + expect(lines[1][11]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] + expect(lines[1][12]).toEqual value: '"', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'string.quoted.double.c', "punctuation.definition.string.begin.c"] + expect(lines[1][13]).toEqual value: 'hook', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'string.quoted.double.c'] + expect(lines[1][14]).toEqual value: '"', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'string.quoted.double.c', "punctuation.definition.string.end.c"] + expect(lines[1][15]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] + expect(lines[1][16]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] + describe "includes", -> it "tokenizes '#include'", -> {tokens} = grammar.tokenizeLine '#include ' @@ -313,6 +356,14 @@ describe "Language-C", -> expect(tokens[4]).toEqual value: 'file', scopes: ['source.c', 'meta.preprocessor.include.c', 'string.quoted.double.include.c'] expect(tokens[5]).toEqual value: '"', scopes: ['source.c', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.end.c'] + it "tokenizes '#include_next'", -> + {tokens} = grammar.tokenizeLine '#include_next "next.h"' + expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.include.c', 'keyword.control.directive.include_next.c', 'punctuation.definition.directive.c'] + expect(tokens[1]).toEqual value: 'include_next', scopes: ['source.c', 'meta.preprocessor.include.c', 'keyword.control.directive.include_next.c'] + expect(tokens[3]).toEqual value: '"', scopes: ['source.c', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.begin.c'] + expect(tokens[4]).toEqual value: 'next.h', scopes: ['source.c', 'meta.preprocessor.include.c', 'string.quoted.double.include.c'] + expect(tokens[5]).toEqual value: '"', scopes: ['source.c', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.end.c'] + describe "diagnostics", -> it "tokenizes '#error'", -> {tokens} = grammar.tokenizeLine '#error "C++ compiler required."' @@ -342,20 +393,20 @@ describe "Language-C", -> expect(lines[0][3]).toEqual value: 'defined', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[0][5]).toEqual value: 'CREDIT', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'entity.name.function.preprocessor.c'] expect(lines[1][1]).toEqual value: 'credit', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[1][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(lines[1][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] + expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] expect(lines[2][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[2][1]).toEqual value: 'elif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[2][3]).toEqual value: 'defined', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[2][5]).toEqual value: 'DEBIT', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'entity.name.function.preprocessor.c'] expect(lines[3][1]).toEqual value: 'debit', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[3][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(lines[3][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(lines[3][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] + expect(lines[3][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] expect(lines[4][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[4][1]).toEqual value: 'else', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[5][1]).toEqual value: 'printerror', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[5][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(lines[5][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(lines[5][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] + expect(lines[5][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] expect(lines[6][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[6][1]).toEqual value: 'endif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] @@ -380,16 +431,16 @@ describe "Language-C", -> expect(lines[0][3]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.c', 'constant.numeric.c'] expect(lines[1][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] expect(lines[1][2]).toEqual value: 'something', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[2][1]).toEqual value: '#', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[2][2]).toEqual value: 'if', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[2][4]).toEqual value: '1', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'constant.numeric.c'] - expect(lines[3][1]).toEqual value: 'return', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'keyword.control.c'] - expect(lines[3][3]).toEqual value: '1', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'constant.numeric.c'] - expect(lines[4][1]).toEqual value: '#', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[4][2]).toEqual value: 'else', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[5][0]).toEqual value: ' return 0;', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'comment.block.preprocessor.else-branch.in-block.c'] - expect(lines[6][1]).toEqual value: '#', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[6][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[2][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[2][2]).toEqual value: 'if', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[2][4]).toEqual value: '1', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'constant.numeric.c'] + expect(lines[3][1]).toEqual value: 'return', scopes: ['source.c', 'meta.block.c', 'keyword.control.c'] + expect(lines[3][3]).toEqual value: '1', scopes: ['source.c', 'meta.block.c', 'constant.numeric.c'] + expect(lines[4][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[4][2]).toEqual value: 'else', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[5][0]).toEqual value: ' return 0;', scopes: ['source.c', 'meta.block.c', 'comment.block.preprocessor.else-branch.in-block.c'] + expect(lines[6][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[6][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[8][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[8][1]).toEqual value: 'else', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[9][0]).toEqual value: 'int something() {', scopes: ['source.c', 'comment.block.preprocessor.else-branch.c'] @@ -408,16 +459,16 @@ describe "Language-C", -> ''' expect(lines[0][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] expect(lines[0][2]).toEqual value: 'something', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[1][1]).toEqual value: '#', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[1][2]).toEqual value: 'if', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[1][4]).toEqual value: '0', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'constant.numeric.c'] - expect(lines[2][0]).toEqual value: ' return 1;', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'comment.block.preprocessor.if-branch.in-block.c'] - expect(lines[3][1]).toEqual value: '#', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[3][2]).toEqual value: 'else', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[4][1]).toEqual value: 'return', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'keyword.control.c'] - expect(lines[4][3]).toEqual value: '0', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'constant.numeric.c'] - expect(lines[5][1]).toEqual value: '#', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[5][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[1][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[1][2]).toEqual value: 'if', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[1][4]).toEqual value: '0', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'constant.numeric.c'] + expect(lines[2][0]).toEqual value: ' return 1;', scopes: ['source.c', 'meta.block.c', 'comment.block.preprocessor.if-branch.in-block.c'] + expect(lines[3][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[3][2]).toEqual value: 'else', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[4][1]).toEqual value: 'return', scopes: ['source.c', 'meta.block.c', 'keyword.control.c'] + expect(lines[4][3]).toEqual value: '0', scopes: ['source.c', 'meta.block.c', 'constant.numeric.c'] + expect(lines[5][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[5][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] lines = grammar.tokenizeLines ''' #if 0 @@ -639,7 +690,7 @@ describe "Language-C", -> ''' expect(lines[1][0]).toEqual value: ' a', scopes: ['source.c', 'meta.block.c'] expect(lines[1][1]).toEqual value: '.', scopes: ['source.c', 'meta.block.c', 'punctuation.separator.dot-access.c'] - expect(lines[1][2]).toEqual value: 'b', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'support.function.any-method.c'] + expect(lines[1][2]).toEqual value: 'b', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'entity.name.function.c'] lines = grammar.tokenizeLines ''' { @@ -722,9 +773,10 @@ describe "Language-C", -> {tokens} = grammar.tokenizeLine('sizeof (int)') expect(tokens[0]).toEqual value: 'sizeof', scopes: ['source.c', 'keyword.operator.sizeof.c'] - expect(tokens[1]).toEqual value: ' (', scopes: ['source.c'] - expect(tokens[2]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] - expect(tokens[3]).toEqual value: ')', scopes: ['source.c'] + expect(tokens[1]).toEqual value: ' ', scopes: ['source.c'] + expect(tokens[2]).toEqual value: '(', scopes: ['source.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] + expect(tokens[3]).toEqual value: 'int', scopes: ['source.c', 'meta.parens.c', 'storage.type.c'] + expect(tokens[4]).toEqual value: ')', scopes: ['source.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] {tokens} = grammar.tokenizeLine('$sizeof') expect(tokens[1]).not.toEqual value: 'sizeof', scopes: ['source.c', 'keyword.operator.sizeof.c'] @@ -817,12 +869,14 @@ describe "Language-C", -> {tokens} = grammar.tokenizeLine('a ? f(b) : c') expect(tokens[0]).toEqual value: 'a ', scopes: ['source.c'] expect(tokens[1]).toEqual value: '?', scopes: ['source.c', 'keyword.operator.ternary.c'] - expect(tokens[2]).toEqual value: ' ', scopes: ['source.c', 'meta.function-call.c', 'punctuation.whitespace.function-call.leading.c'] - expect(tokens[3]).toEqual value: 'f', scopes: ['source.c', 'meta.function-call.c', 'support.function.any-method.c'] - expect(tokens[4]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'punctuation.definition.parameters.c'] - expect(tokens[5]).toEqual value: 'b) ', scopes: ['source.c'] - expect(tokens[6]).toEqual value: ':', scopes: ['source.c', 'keyword.operator.ternary.c'] - expect(tokens[7]).toEqual value: ' c', scopes: ['source.c'] + expect(tokens[2]).toEqual value: ' ', scopes: ['source.c'] + expect(tokens[3]).toEqual value: 'f', scopes: ['source.c', 'meta.function-call.c', 'entity.name.function.c'] + expect(tokens[4]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'punctuation.section.parameters.begin.c'] + expect(tokens[5]).toEqual value: 'b', scopes: ['source.c', 'meta.function-call.c'] + expect(tokens[6]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'punctuation.section.parameters.end.c'] + expect(tokens[7]).toEqual value: ' ', scopes: ['source.c'] + expect(tokens[8]).toEqual value: ':', scopes: ['source.c', 'keyword.operator.ternary.c'] + expect(tokens[9]).toEqual value: ' c', scopes: ['source.c'] describe "bitwise", -> it "tokenizes bitwise 'not'", -> From 27c167324b349808aa53f995f2d9bb202d4dea11 Mon Sep 17 00:00:00 2001 From: alpyre Date: Sun, 12 Feb 2017 19:57:40 +0200 Subject: [PATCH 2/7] A bug fix and a code optimization - Included Access patterns for functions in blocks. - Moved the storage_types patterns into repository to provide modularization. --- grammars/c.cson | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index 82302d8..b7b7c42 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -23,8 +23,7 @@ 'name': 'keyword.control.c' } { - 'match': '\\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\b' - 'name': 'storage.type.c' + 'include': '#storage_types' } { 'match': '\\b(const|extern|register|restrict|static|volatile|inline)\\b' @@ -769,6 +768,13 @@ 'name': 'invalid.illegal.placeholder.c' } ] + 'storage_types': + 'patterns': [ + { + 'match': '\\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\b' + 'name': 'storage.type.c' + } + ] 'preprocessor-rule-conditional': 'patterns': [ { @@ -1716,8 +1722,10 @@ 'preprocessor-rule-define-line-functions': 'patterns': [ { - 'match': '\\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\b' - 'name': 'storage.type.c' + 'include': '#storage_types' + } + { + 'include': '#access' } { 'include': '#operators' @@ -1773,8 +1781,10 @@ 'preprocessor-rule-define-line-functions-inparens': 'patterns': [ { - 'match': '\\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\b' - 'name': 'storage.type.c' + 'include': '#storage_types' + } + { + 'include': '#access' } { 'include': '#operators' @@ -1871,8 +1881,7 @@ 'meta-function-scope-innards': 'patterns': [ { - 'match': '\\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\b' - 'name': 'storage.type.c' + 'include': '#storage_types' } { 'include': '#operators' @@ -1927,8 +1936,7 @@ 'meta-function-scope-innards-inparens': 'patterns': [ { - 'match': '\\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\b' - 'name': 'storage.type.c' + 'include': '#storage_types' } { 'include': '#operators' @@ -1982,8 +1990,10 @@ 'meta-function-call-scope-innards': 'patterns': [ { - 'match': '\\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\b' - 'name': 'storage.type.c' + 'include': '#storage_types' + } + { + 'include': '#access' } { 'include': '#operators' @@ -2038,8 +2048,10 @@ 'meta-function-call-scope-innards-inparens': 'patterns': [ { - 'match': '\\b(asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\b' - 'name': 'storage.type.c' + 'include': '#storage_types' + } + { + 'include': '#access' } { 'include': '#operators' From f12434daea4e476aaca35526b04bb93c775780be Mon Sep 17 00:00:00 2001 From: alpyre Date: Mon, 13 Feb 2017 10:16:10 +0200 Subject: [PATCH 3/7] Bug fix Highlight the comments inside function sections. --- grammars/c.cson | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/grammars/c.cson b/grammars/c.cson index b7b7c42..b4b27bd 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -1721,6 +1721,9 @@ ] 'preprocessor-rule-define-line-functions': 'patterns': [ + { + 'include': '#comments' + } { 'include': '#storage_types' } @@ -1780,6 +1783,9 @@ ] 'preprocessor-rule-define-line-functions-inparens': 'patterns': [ + { + 'include': '#comments' + } { 'include': '#storage_types' } @@ -1880,6 +1886,9 @@ ] 'meta-function-scope-innards': 'patterns': [ + { + 'include': '#comments' + } { 'include': '#storage_types' } @@ -1935,6 +1944,9 @@ ] 'meta-function-scope-innards-inparens': 'patterns': [ + { + 'include': '#comments' + } { 'include': '#storage_types' } @@ -1989,6 +2001,9 @@ ] 'meta-function-call-scope-innards': 'patterns': [ + { + 'include': '#comments' + } { 'include': '#storage_types' } @@ -2047,6 +2062,9 @@ ] 'meta-function-call-scope-innards-inparens': 'patterns': [ + { + 'include': '#comments' + } { 'include': '#storage_types' } From 314f4ee53ede0adc91f56ef91b13d43e66771cd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20S=C3=B6nmez?= Date: Sat, 25 Feb 2017 21:46:10 +0200 Subject: [PATCH 4/7] Changes requested by 50Wliu - Implements tokenization for vararg ellipses. - Unnecessary escape characters in curly bracket regexes removed. - punctuation.section.block.XXXX.c scopes are renamed as punctuation.section.block.XXXX.bracket.curly.c - New spec added for vararg ellipses, and failing specs because of the above two changes fixed. --- grammars/c++.cson | 12 ++++++------ grammars/c.cson | 44 ++++++++++++++++++++++++++++---------------- spec/c-spec.coffee | 42 +++++++++++++++++++++++++----------------- 3 files changed, 59 insertions(+), 39 deletions(-) diff --git a/grammars/c++.cson b/grammars/c++.cson index 6d40a4c..2be5c5f 100644 --- a/grammars/c++.cson +++ b/grammars/c++.cson @@ -147,11 +147,11 @@ 'begin': '\\{' 'beginCaptures': '0': - 'name': 'punctuation.section.block.begin.c' + 'name': 'punctuation.section.block.begin.bracket.curly.c' 'end': '\\}' 'endCaptures': '0': - 'name': 'punctuation.section.block.end.c' + 'name': 'punctuation.section.block.end.bracket.curly.c' 'name': 'meta.block.cpp' 'patterns': [ { @@ -308,11 +308,11 @@ 'begin': '\\{' 'beginCaptures': '0': - 'name': 'punctuation.section.block.begin.cpp' + 'name': 'punctuation.section.block.begin.bracket.curly.cpp' 'end': '(\\})(\\s*\\n)?' 'endCaptures': '1': - 'name': 'punctuation.section.block.end.cpp' + 'name': 'punctuation.section.block.end.bracket.curly.cpp' '2': 'name': 'invalid.illegal.you-forgot-semicolon.cpp' 'patterns': [ @@ -344,11 +344,11 @@ 'begin': '\\{' 'beginCaptures': '0': - 'name': 'punctuation.section.block.begin.c' + 'name': 'punctuation.section.block.begin.bracket.curly.c' 'end': '\\}|(?=\\s*#\\s*endif\\b)' 'endCaptures': '0': - 'name': 'punctuation.section.block.end.c' + 'name': 'punctuation.section.block.end.bracket.curly.c' 'patterns': [ { 'include': '#special_block' diff --git a/grammars/c.cson b/grammars/c.cson index b4b27bd..dd9368a 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -300,14 +300,14 @@ 'block': 'patterns': [ { - 'begin': '\\{' + 'begin': '{' 'beginCaptures': '0': - 'name': 'punctuation.section.block.begin.c' - 'end': '\\}|(?=\\s*#\\s*(?:elif|else|endif)\\b)' + 'name': 'punctuation.section.block.begin.bracket.curly.c' + 'end': '}|(?=\\s*#\\s*(?:elif|else|endif)\\b)' 'endCaptures': '0': - 'name': 'punctuation.section.block.end.c' + 'name': 'punctuation.section.block.end.bracket.curly.c' 'name': 'meta.block.c' 'patterns': [ { @@ -360,14 +360,14 @@ } { # Prevent unnecessary nesting of meta.block.c scope - 'begin': '\\{' + 'begin': '{' 'beginCaptures': '0': - 'name': 'punctuation.section.block.begin.c' - 'end': '\\}|(?=\\s*#\\s*(?:elif|else|endif)\\b)' + 'name': 'punctuation.section.block.begin.bracket.curly.c' + 'end': '}|(?=\\s*#\\s*(?:elif|else|endif)\\b)' 'endCaptures': '0': - 'name': 'punctuation.section.block.end.c' + 'name': 'punctuation.section.block.end.bracket.curly.c' #'name': 'meta.block.c' 'patterns': [ { @@ -775,6 +775,9 @@ 'name': 'storage.type.c' } ] + 'vararg_ellipses': + 'match': '(? expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] expect(lines[0][4]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'storage.type.c'] expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] - expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.block.c', 'punctuation.section.block.begin.c'] + expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.block.c', 'punctuation.section.block.begin.bracket.curly.c'] expect(lines[1][1]).toEqual value: 'return', scopes: ['source.c', 'meta.block.c', 'keyword.control.c'] expect(lines[1][3]).toEqual value: '0', scopes: ['source.c', 'meta.block.c', 'constant.numeric.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.block.c', 'punctuation.section.block.end.bracket.curly.c'] + + it "tokenizes varargs ellipses", -> + {tokens} = grammar.tokenizeLine 'void function(...);' + expect(tokens[0]).toEqual value: 'void', scopes: ['source.c', 'storage.type.c'] + expect(tokens[2]).toEqual value: 'function', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] + expect(tokens[3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] + expect(tokens[4]).toEqual value: '...', scopes: ['source.c', 'meta.function.c', 'punctuation.vararg-ellipses.c'] + expect(tokens[5]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] it "tokenizes various _t types", -> {tokens} = grammar.tokenizeLine 'size_t var;' @@ -241,7 +249,7 @@ describe "Language-C", -> expect(tokens[7]).toEqual value: ' b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] expect(tokens[10]).toEqual value: 'do', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] - expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.c'] + expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.bracket.curly.c'] expect(tokens[13]).toEqual value: ' a ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] expect(tokens[14]).toEqual value: '^=', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'keyword.operator.assignment.compound.bitwise.c'] expect(tokens[15]).toEqual value: ' b; b ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] @@ -249,7 +257,7 @@ describe "Language-C", -> expect(tokens[17]).toEqual value: ' a; a ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] expect(tokens[18]).toEqual value: '^=', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'keyword.operator.assignment.compound.bitwise.c'] expect(tokens[19]).toEqual value: ' b; ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.bracket.curly.c'] expect(tokens[22]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] expect(tokens[23]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] @@ -278,7 +286,7 @@ describe "Language-C", -> expect(lines[0][6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(lines[0][7]).toEqual value: ' b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(lines[0][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] - expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.c'] + expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.bracket.curly.c'] expect(lines[0][12]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] expect(lines[1][1]).toEqual value: '^=', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'keyword.operator.assignment.compound.bitwise.c'] expect(lines[1][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] @@ -286,7 +294,7 @@ describe "Language-C", -> expect(lines[2][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] expect(lines[3][1]).toEqual value: '^=', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'keyword.operator.assignment.compound.bitwise.c'] expect(lines[3][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] - expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.bracket.curly.c'] it "tokenizes complex definitions", -> lines = grammar.tokenizeLines ''' @@ -301,11 +309,11 @@ describe "Language-C", -> expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] expect(lines[0][8]).toEqual value: 'struct', scopes: ['source.c', 'meta.preprocessor.macro.c', 'storage.type.c'] expect(lines[0][10]).toEqual value: '=', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.operator.assignment.c'] - expect(lines[0][12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.c'] - expect(lines[0][13]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.c'] + expect(lines[0][12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.bracket.curly.c'] + expect(lines[0][13]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.bracket.curly.c'] expect(lines[0][14]).toEqual value: 'false', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.language.c'] expect(lines[0][16]).toEqual value: '0L', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.numeric.c'] - expect(lines[0][17]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(lines[0][17]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.bracket.curly.c'] expect(lines[0][19]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] expect(lines[1][0]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] expect(lines[1][1]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] @@ -320,7 +328,7 @@ describe "Language-C", -> expect(lines[1][13]).toEqual value: 'hook', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'string.quoted.double.c'] expect(lines[1][14]).toEqual value: '"', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'string.quoted.double.c', "punctuation.definition.string.end.c"] expect(lines[1][15]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] - expect(lines[1][16]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(lines[1][16]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.bracket.curly.c'] describe "includes", -> it "tokenizes '#include'", -> @@ -954,13 +962,13 @@ describe "Language-C", -> expect(lines[0][2]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.cpp', 'punctuation.definition.string.begin.cpp'] expect(lines[0][3]).toEqual value: 'C', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.cpp'] expect(lines[0][4]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.cpp', 'punctuation.definition.string.end.cpp'] - expect(lines[0][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.section.block.begin.c'] + expect(lines[0][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.section.block.begin.bracket.curly.c'] expect(lines[1][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c', 'punctuation.definition.directive.c'] expect(lines[1][1]).toEqual value: 'include', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c'] expect(lines[1][3]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.begin.c'] expect(lines[1][4]).toEqual value: 'legacy_C_header.h', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c'] expect(lines[1][5]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.end.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.section.block.end.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.section.block.end.bracket.curly.c'] lines = grammar.tokenizeLines ''' #ifdef __cplusplus @@ -978,7 +986,7 @@ describe "Language-C", -> expect(lines[1][2]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.cpp', 'punctuation.definition.string.begin.cpp'] expect(lines[1][3]).toEqual value: 'C', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.cpp'] expect(lines[1][4]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.cpp', 'punctuation.definition.string.end.cpp'] - expect(lines[1][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.section.block.begin.c'] + expect(lines[1][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.section.block.begin.bracket.curly.c'] expect(lines[2][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[2][1]).toEqual value: 'endif', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[3][1]).toEqual value: '//', scopes: ['source.cpp', 'comment.line.double-slash.cpp', 'punctuation.definition.comment.cpp'] @@ -1036,15 +1044,15 @@ describe "Language-C", -> expect(tokens[0]).toEqual value: '~Foo', scopes: ['source.cpp', 'meta.function.destructor.cpp', 'entity.name.function.cpp'] expect(tokens[1]).toEqual value: '(', scopes: ['source.cpp', 'meta.function.destructor.cpp', 'punctuation.definition.parameters.begin.c'] expect(tokens[2]).toEqual value: ')', scopes: ['source.cpp', 'meta.function.destructor.cpp', 'punctuation.definition.parameters.end.c'] - expect(tokens[4]).toEqual value: '{', scopes: ['source.cpp', 'meta.block.c', 'punctuation.section.block.begin.c'] - expect(tokens[5]).toEqual value: '}', scopes: ['source.cpp', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(tokens[4]).toEqual value: '{', scopes: ['source.cpp', 'meta.block.c', 'punctuation.section.block.begin.bracket.curly.c'] + expect(tokens[5]).toEqual value: '}', scopes: ['source.cpp', 'meta.block.c', 'punctuation.section.block.end.bracket.curly.c'] {tokens} = grammar.tokenizeLine('Foo::~Bar() {}') expect(tokens[0]).toEqual value: 'Foo::~Bar', scopes: ['source.cpp', 'meta.function.destructor.cpp', 'entity.name.function.cpp'] expect(tokens[1]).toEqual value: '(', scopes: ['source.cpp', 'meta.function.destructor.cpp', 'punctuation.definition.parameters.begin.c'] expect(tokens[2]).toEqual value: ')', scopes: ['source.cpp', 'meta.function.destructor.cpp', 'punctuation.definition.parameters.end.c'] - expect(tokens[4]).toEqual value: '{', scopes: ['source.cpp', 'meta.block.c', 'punctuation.section.block.begin.c'] - expect(tokens[5]).toEqual value: '}', scopes: ['source.cpp', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(tokens[4]).toEqual value: '{', scopes: ['source.cpp', 'meta.block.c', 'punctuation.section.block.begin.bracket.curly.c'] + expect(tokens[5]).toEqual value: '}', scopes: ['source.cpp', 'meta.block.c', 'punctuation.section.block.end.bracket.curly.c'] describe "comments", -> it "tokenizes them", -> From 230cb4eaf42f55d7add0d79c01451841a6cf2193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20S=C3=B6nmez?= Date: Wed, 1 Mar 2017 09:46:05 +0200 Subject: [PATCH 5/7] Remove meta.parens.c scope - Removes all implementations for the tokenization of the section scope meta.parens.c together with all the code tricks to provide unnecessary nesting of it in the scopes array. - Fix the failing specs because of this drawback. --- grammars/c.cson | 344 +-------------------------------------------- spec/c-spec.coffee | 78 +++++----- 2 files changed, 44 insertions(+), 378 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index dd9368a..8060968 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -524,36 +524,7 @@ 'endCaptures': '0': 'name': 'punctuation.section.parens.end.c' - 'name': 'meta.parens.c' 'patterns': [ - { - 'include': '#functions-inparens' - } - { - # Provides right matching of inner paranthesis couples - 'include': '#parens-inner' - } - { - 'include': '$base' - } - ] - 'parens-inner': - 'begin': '\\(' - 'beginCaptures': - '0': - 'name': 'punctuation.section.parens.begin.c' - 'end': '\\)' - 'endCaptures': - '0': - 'name': 'punctuation.section.parens.end.c' - #'name': 'meta.parens.c' <-- PREVENTS UNNECESSARY NESTING OF meta.parens - 'patterns': [ - { - 'include': '#functions-inparens' - } - { - 'include': '#parens-inner' - } { 'include': '$base' } @@ -567,36 +538,7 @@ 'endCaptures': '0': 'name': 'punctuation.section.parens.end.c' - 'name': 'meta.parens.c' 'patterns': [ - { - 'include': '#c_function_call-inparens' - } - { - # Provides right matching of inner paranthesis couples - 'include': '#parens-inner-block' - } - { - 'include': '#block_innards' - } - ] - 'parens-inner-block': - 'begin': '\\(' - 'beginCaptures': - '0': - 'name': 'punctuation.section.parens.begin.c' - 'end': '\\)' - 'endCaptures': - '0': - 'name': 'punctuation.section.parens.end.c' - #'name': 'meta.parens.c' <-- PREVENTS UNNECESSARY NESTING OF meta.parens - 'patterns': [ - { - 'include': '#c_function_call-inparens' - } - { - 'include': '#parens-inner-block' - } { 'include': '#block_innards' } @@ -913,30 +855,6 @@ } ] 'preprocessor-rule-conditional-line': - 'patterns': [ - { - #first capture all root parenthesis' - 'begin': '\\(' - 'beginCaptures': - '0': - 'name': 'punctuation.section.parens.begin.c' - 'end': '\\)|(?=//)|(?=/\\*(?!.*\\\\\\s*\\n))|(?=+!]+|\\(\\)|\\[\\])) - ) - \\s*(\\() - ''' - 'beginCaptures': - '1': - 'name': 'entity.name.function.c' - '2': - 'name': 'punctuation.section.parameters.begin.c' - 'end': '(\\))|(?=+!]+|\\(\\)|\\[\\]))\\s*\\( - ) - ''' - 'end': '(?<=\\))(?!\\w)' - 'name': 'meta.function.c' - 'patterns': [ - { - # NOW CONSUME TOKENS - 'include': '#meta-function-scope-innards-inparens' - } - { - 'include': '$base' - } - ] - 'c_function_call-inparens': - # NEW FUNCTION/MACRO IMPLEMENTATION - # FIRST CAPTURE meta.function-call.c scope (provides an injectable scope, balanced paranthesis and prevents unnecessary scope nesting) - 'begin': '''(?x) - (?!(?:while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate)\\s*\\() - (?= - (?:[A-Za-z_][A-Za-z0-9_]*+|::)++\\s*\\( # actual name - | - (?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\]))\\s*\\( - ) - ''' - 'end': '(?<=\\))(?!\\w)' - 'name': 'meta.function-call.c' - 'patterns': [ - { - # NOW CONSUME TOKENS - 'include': '#meta-function-call-scope-innards-inparens' - } - ] 'meta-function-scope-innards': 'patterns': [ { @@ -1942,11 +1730,9 @@ 'endCaptures': '0': 'name': 'punctuation.section.parens.end.c' - 'name': 'meta.parens.c' 'patterns': [ { - # Provides right matching of inner paranthesis couples - 'include': '#meta-function-scope-innards-inparens' + 'include': '#meta-function-scope-innards' } ] } @@ -1954,63 +1740,6 @@ 'include': '$base' } ] - 'meta-function-scope-innards-inparens': - 'patterns': [ - { - 'include': '#comments' - } - { - 'include': '#storage_types' - } - { - 'include': '#operators' - } - { - 'begin': '''(?x) - (?!(?:while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate)\\s*\\() - ( - (?:[A-Za-z_][A-Za-z0-9_]*+|::)++ # actual name - | - (?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\])) - ) - \\s*(\\() - ''' - 'beginCaptures': - '1': - 'name': 'entity.name.function.c' - '2': - 'name': 'punctuation.section.parameters.begin.c' - 'end': '\\)' - 'endCaptures': - '0': - 'name': 'punctuation.section.parameters.end.c' - 'patterns': [ - { - 'include': '#meta-function-scope-innards-inparens' - } - ] - } - { - # Capture paranthesis' - 'begin': '\\(' - 'beginCaptures': - '0': - 'name': 'punctuation.section.parens.begin.c' - 'end': '\\)' - 'endCaptures': - '0': - 'name': 'punctuation.section.parens.end.c' - #'name': 'meta.parens.c' <--Provides unnecessary nesting of parens scope. - 'patterns': [ - { - 'include': '#meta-function-scope-innards-inparens' - } - ] - } - { - 'include': "$base" - } - ] 'meta-function-call-scope-innards': 'patterns': [ { @@ -2060,72 +1789,9 @@ 'endCaptures': '0': 'name': 'punctuation.section.parens.end.c' - 'name': 'meta.parens.c' - 'patterns': [ - { - # Provides right matching of inner paranthesis couples - 'include': '#meta-function-call-scope-innards-inparens' - } - ] - } - { - 'include': '#block_innards' - } - ] - 'meta-function-call-scope-innards-inparens': - 'patterns': [ - { - 'include': '#comments' - } - { - 'include': '#storage_types' - } - { - 'include': '#access' - } - { - 'include': '#operators' - } - { - 'begin': '''(?x) - (?!(?:while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate)\\s*\\() - ( - (?:[A-Za-z_][A-Za-z0-9_]*+|::)++ # actual name - | - (?:(?<=operator)(?:[-*&<>=+!]+|\\(\\)|\\[\\])) - ) - \\s*(\\() - ''' - 'beginCaptures': - '1': - 'name': 'entity.name.function.c' - '2': - 'name': 'punctuation.section.parameters.begin.c' - 'end': '\\)' - 'endCaptures': - '0': - 'name': 'punctuation.section.parameters.end.c' - 'patterns': [ - { - 'include': '#meta-function-call-scope-innards-inparens' - } - ] - } - { - # Capture paranthesis' - 'begin': '\\(' - 'beginCaptures': - '0': - 'name': 'punctuation.section.parens.begin.c' - 'end': '\\)' - 'endCaptures': - '0': - 'name': 'punctuation.section.parens.end.c' - #'name': 'meta.parens.c' <--Provides unnecessary nesting of parens scope. 'patterns': [ { - # Provides right matching of inner paranthesis couples - 'include': '#meta-function-call-scope-innards-inparens' + 'include': '#meta-function-call-scope-innards' } ] } diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index 2d89dfb..10516c9 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -201,11 +201,11 @@ describe "Language-C", -> expect(tokens[1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] expect(tokens[3]).toEqual value: 'PI_PLUS_ONE', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] expect(tokens[4]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[5]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(tokens[6]).toEqual value: '3.14', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'constant.numeric.c'] - expect(tokens[8]).toEqual value: '+', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'keyword.operator.c'] - expect(tokens[10]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'constant.numeric.c'] - expect(tokens[11]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(tokens[5]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.begin.c'] + expect(tokens[6]).toEqual value: '3.14', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] + expect(tokens[8]).toEqual value: '+', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.operator.c'] + expect(tokens[10]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] + expect(tokens[11]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.end.c'] describe "macros", -> it "tokenizes them", -> @@ -229,15 +229,15 @@ describe "Language-C", -> expect(tokens[7]).toEqual value: ' y', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] expect(tokens[9]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(tokens[11]).toEqual value: 'x', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c'] - expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.begin.c'] + expect(tokens[11]).toEqual value: 'x', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.end.c'] expect(tokens[13]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[14]).toEqual value: '*', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.operator.c'] expect(tokens[15]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[16]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(tokens[17]).toEqual value: 'y', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c'] - expect(tokens[18]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(tokens[16]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.begin.c'] + expect(tokens[17]).toEqual value: 'y', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[18]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.end.c'] {tokens} = grammar.tokenizeLine '#define SWAP(a, b) do { a ^= b; b ^= a; a ^= b; } while ( 0 )' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] @@ -260,9 +260,9 @@ describe "Language-C", -> expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.bracket.curly.c'] expect(tokens[22]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] expect(tokens[23]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(tokens[26]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'constant.numeric.c'] - expect(tokens[28]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.begin.c'] + expect(tokens[26]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] + expect(tokens[28]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.end.c'] it "tokenizes multiline macros", -> lines = grammar.tokenizeLines ''' @@ -315,13 +315,13 @@ describe "Language-C", -> expect(lines[0][16]).toEqual value: '0L', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.numeric.c'] expect(lines[0][17]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.bracket.curly.c'] expect(lines[0][19]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] - expect(lines[1][0]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(lines[1][1]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] - expect(lines[1][4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(lines[1][5]).toEqual value: '*', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'keyword.operator.c'] - expect(lines[1][7]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] - expect(lines[1][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(lines[1][0]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.begin.c'] + expect(lines[1][1]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.begin.c'] + expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.end.c'] + expect(lines[1][4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.begin.c'] + expect(lines[1][5]).toEqual value: '*', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'keyword.operator.c'] + expect(lines[1][7]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.end.c'] + expect(lines[1][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.end.c'] expect(lines[1][10]).toEqual value: 'ID', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'entity.name.function.c'] expect(lines[1][11]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] expect(lines[1][12]).toEqual value: '"', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'string.quoted.double.c', "punctuation.definition.string.begin.c"] @@ -399,14 +399,14 @@ describe "Language-C", -> expect(lines[0][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[0][1]).toEqual value: 'if', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[0][3]).toEqual value: 'defined', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[0][5]).toEqual value: 'CREDIT', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'entity.name.function.preprocessor.c'] + expect(lines[0][5]).toEqual value: 'CREDIT', scopes: ['source.c', 'meta.preprocessor.c', 'entity.name.function.preprocessor.c'] expect(lines[1][1]).toEqual value: 'credit', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] expect(lines[1][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] expect(lines[2][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[2][1]).toEqual value: 'elif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[2][3]).toEqual value: 'defined', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[2][5]).toEqual value: 'DEBIT', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'entity.name.function.preprocessor.c'] + expect(lines[2][5]).toEqual value: 'DEBIT', scopes: ['source.c', 'meta.preprocessor.c', 'entity.name.function.preprocessor.c'] expect(lines[3][1]).toEqual value: 'debit', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] expect(lines[3][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] expect(lines[3][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] @@ -567,7 +567,7 @@ describe "Language-C", -> ''' expect(lines[0][2]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.c'] expect(lines[0][3]).toEqual value: '!', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.operator.logical.c'] - expect(lines[0][7]).toEqual value: 'MACRO_A', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'entity.name.function.preprocessor.c'] + expect(lines[0][7]).toEqual value: 'MACRO_A', scopes: ['source.c', 'meta.preprocessor.c', 'entity.name.function.preprocessor.c'] expect(lines[0][10]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.c', 'constant.character.escape.line-continuation.c'] expect(lines[1][1]).toEqual value: '||', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.operator.logical.c'] expect(lines[1][3]).toEqual value: '!', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.operator.logical.c'] @@ -576,18 +576,18 @@ describe "Language-C", -> expect(lines[3][2]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.c'] expect(lines[3][3]).toEqual value: 'MACRO_C', scopes: ['source.c', 'meta.preprocessor.c', 'entity.name.function.preprocessor.c'] expect(lines[3][5]).toEqual value: '==', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.operator.comparison.c'] - expect(lines[3][7]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(lines[3][8]).toEqual value: '5', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'constant.numeric.c'] - expect(lines[3][10]).toEqual value: '+', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'keyword.operator.c'] - expect(lines[3][14]).toEqual value: '-', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'keyword.operator.c'] - expect(lines[3][16]).toEqual value: '/*', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'comment.block.c', 'punctuation.definition.comment.begin.c'] - expect(lines[3][17]).toEqual value: ' multi line comment ', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'comment.block.c'] - expect(lines[3][18]).toEqual value: '*/', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'comment.block.c', 'punctuation.definition.comment.end.c'] - expect(lines[3][20]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'constant.character.escape.line-continuation.c'] - expect(lines[4][1]).toEqual value: 'SOMEMACRO', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'entity.name.function.preprocessor.c'] - expect(lines[4][3]).toEqual value: 'TRUE', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'constant.language.c'] - expect(lines[4][6]).toEqual value: '*', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'keyword.operator.c'] - expect(lines[4][9]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(lines[3][7]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.c', 'punctuation.section.parens.begin.c'] + expect(lines[3][8]).toEqual value: '5', scopes: ['source.c', 'meta.preprocessor.c', 'constant.numeric.c'] + expect(lines[3][10]).toEqual value: '+', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.operator.c'] + expect(lines[3][14]).toEqual value: '-', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.operator.c'] + expect(lines[3][16]).toEqual value: '/*', scopes: ['source.c', 'meta.preprocessor.c', 'comment.block.c', 'punctuation.definition.comment.begin.c'] + expect(lines[3][17]).toEqual value: ' multi line comment ', scopes: ['source.c', 'meta.preprocessor.c', 'comment.block.c'] + expect(lines[3][18]).toEqual value: '*/', scopes: ['source.c', 'meta.preprocessor.c', 'comment.block.c', 'punctuation.definition.comment.end.c'] + expect(lines[3][20]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.c', 'constant.character.escape.line-continuation.c'] + expect(lines[4][1]).toEqual value: 'SOMEMACRO', scopes: ['source.c', 'meta.preprocessor.c', 'entity.name.function.preprocessor.c'] + expect(lines[4][3]).toEqual value: 'TRUE', scopes: ['source.c', 'meta.preprocessor.c', 'constant.language.c'] + expect(lines[4][6]).toEqual value: '*', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.operator.c'] + expect(lines[4][9]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.c', 'punctuation.section.parens.end.c'] expect(lines[4][11]).toEqual value: '//', scopes: ['source.c', 'comment.line.double-slash.cpp', 'punctuation.definition.comment.cpp'] expect(lines[4][12]).toEqual value: ' single line comment', scopes: ['source.c', 'comment.line.double-slash.cpp'] @@ -782,9 +782,9 @@ describe "Language-C", -> {tokens} = grammar.tokenizeLine('sizeof (int)') expect(tokens[0]).toEqual value: 'sizeof', scopes: ['source.c', 'keyword.operator.sizeof.c'] expect(tokens[1]).toEqual value: ' ', scopes: ['source.c'] - expect(tokens[2]).toEqual value: '(', scopes: ['source.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(tokens[3]).toEqual value: 'int', scopes: ['source.c', 'meta.parens.c', 'storage.type.c'] - expect(tokens[4]).toEqual value: ')', scopes: ['source.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(tokens[2]).toEqual value: '(', scopes: ['source.c', 'punctuation.section.parens.begin.c'] + expect(tokens[3]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] + expect(tokens[4]).toEqual value: ')', scopes: ['source.c', 'punctuation.section.parens.end.c'] {tokens} = grammar.tokenizeLine('$sizeof') expect(tokens[1]).not.toEqual value: 'sizeof', scopes: ['source.c', 'keyword.operator.sizeof.c'] From 917945a27ba5359281be24ee690db8610de0923a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20S=C3=B6nmez?= Date: Thu, 2 Mar 2017 22:15:51 +0200 Subject: [PATCH 6/7] Simplify #define line rules Simplifications in #define line rules according to the absence of meta.parens.c scope. --- grammars/c.cson | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index 8060968..36beb04 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -1500,7 +1500,12 @@ ] } { - 'include': '#preprocessor-rule-define-line-parens' + 'match': '\\(' + 'name': 'punctuation.section.parens.begin.c' + } + { + 'match': '\\)' + 'name': 'punctuation.section.parens.end.c' } { # Function scope patterns for #define lines (terminates at newline w/o line_continuation_character) @@ -1602,21 +1607,6 @@ 'include': '#preprocessor-rule-define-line-contents' } ] - 'preprocessor-rule-define-line-parens': - # provides un-balanced paranthesis' in #define lines (terminates at newline w/o line_continuation_character) - 'begin': '\\(' - 'beginCaptures': - '0': - 'name': 'punctuation.section.parens.begin.c' - 'end': '\\)|(? Date: Mon, 6 Mar 2017 22:04:48 +0200 Subject: [PATCH 7/7] Changes requested by 50Wliu - Typo fixes. - Removal of unnecessary comments - Addition of .bracket.round to scope names of all parentheses. --- grammars/c.cson | 74 ++++++++++++++++++++-------------------------- spec/c-spec.coffee | 68 +++++++++++++++++++++--------------------- 2 files changed, 66 insertions(+), 76 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index 36beb04..4d67412 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -264,8 +264,7 @@ 'include': '#parens' } { - # NEW FUNCTION/MACRO IMPLEMENTATION - # FIRST CAPTURE meta.function.c scope (provides an injectable scope, balanced paranthesis and prevents unnecessary scope nesting) + # FIRST CAPTURE meta.function.c scope (provides an injectable scope, balanced parentheses and prevents unnecessary scope nesting) 'begin': '''(?x) (?!(?:while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate|asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void)\\s*\\() (?= @@ -278,8 +277,7 @@ 'name': 'meta.function.c' 'patterns': [ { - # NOW CONSUME TOKENS - 'include': '#meta-function-scope-innards' + 'include': '#function-innards' } ] } @@ -368,7 +366,6 @@ 'endCaptures': '0': 'name': 'punctuation.section.block.end.bracket.curly.c' - #'name': 'meta.block.c' 'patterns': [ { 'include': '#block_innards' @@ -383,8 +380,7 @@ } ] 'c_function_call': - # NEW FUNCTION/MACRO IMPLEMENTATION - # FIRST CAPTURE meta.function-call.c scope (provides an injectable scope, balanced paranthesis and prevents unnecessary scope nesting) + # FIRST CAPTURE meta.function-call.c scope (provides an injectable scope, balanced parentheses and prevents unnecessary scope nesting) 'begin': '''(?x) (?!(?:while|for|do|if|else|switch|catch|enumerate|return|sizeof|[cr]?iterate)\\s*\\() (?= @@ -397,8 +393,7 @@ 'name': 'meta.function-call.c' 'patterns': [ { - # NOW CONSUME TOKENS - 'include': '#meta-function-call-scope-innards' + 'include': '#function-call-innards' } ] 'comments': @@ -519,11 +514,11 @@ 'begin': '\\(' 'beginCaptures': '0': - 'name': 'punctuation.section.parens.begin.c' + 'name': 'punctuation.section.parens.begin.bracket.round.c' 'end': '\\)' 'endCaptures': '0': - 'name': 'punctuation.section.parens.end.c' + 'name': 'punctuation.section.parens.end.bracket.round.c' 'patterns': [ { 'include': '$base' @@ -533,11 +528,11 @@ 'begin': '\\(' 'beginCaptures': '0': - 'name': 'punctuation.section.parens.begin.c' + 'name': 'punctuation.section.parens.begin.bracket.round.c' 'end': '\\)' 'endCaptures': '0': - 'name': 'punctuation.section.parens.end.c' + 'name': 'punctuation.section.parens.end.bracket.round.c' 'patterns': [ { 'include': '#block_innards' @@ -909,11 +904,11 @@ 'begin': '\\(' 'beginCaptures': '0': - 'name': 'punctuation.section.parens.begin.c' + 'name': 'punctuation.section.parens.begin.bracket.round.c' 'end': '\\)|(?=//)|(?=/\\*(?!.*\\\\\\s*\\n))|(? ''' expect(lines[0][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] expect(lines[0][2]).toEqual value: 'something', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] + expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.arguments.begin.bracket.round.c'] expect(lines[0][4]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'storage.type.c'] - expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] + expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.arguments.end.bracket.round.c'] expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.block.c', 'punctuation.section.block.begin.bracket.curly.c'] expect(lines[1][1]).toEqual value: 'return', scopes: ['source.c', 'meta.block.c', 'keyword.control.c'] expect(lines[1][3]).toEqual value: '0', scopes: ['source.c', 'meta.block.c', 'constant.numeric.c'] @@ -41,9 +41,9 @@ describe "Language-C", -> {tokens} = grammar.tokenizeLine 'void function(...);' expect(tokens[0]).toEqual value: 'void', scopes: ['source.c', 'storage.type.c'] expect(tokens[2]).toEqual value: 'function', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(tokens[3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] + expect(tokens[3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.arguments.begin.bracket.round.c'] expect(tokens[4]).toEqual value: '...', scopes: ['source.c', 'meta.function.c', 'punctuation.vararg-ellipses.c'] - expect(tokens[5]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] + expect(tokens[5]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.arguments.end.bracket.round.c'] it "tokenizes various _t types", -> {tokens} = grammar.tokenizeLine 'size_t var;' @@ -192,20 +192,20 @@ describe "Language-C", -> expect(tokens[3]).toEqual value: 'ABC', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] expect(tokens[4]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[5]).toEqual value: 'XYZ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'entity.name.function.c'] - expect(tokens[6]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] + expect(tokens[6]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'punctuation.section.arguments.begin.bracket.round.c'] expect(tokens[7]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'constant.numeric.c'] - expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] + expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'punctuation.section.arguments.end.bracket.round.c'] {tokens} = grammar.tokenizeLine '#define PI_PLUS_ONE (3.14 + 1)' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] expect(tokens[1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] expect(tokens[3]).toEqual value: 'PI_PLUS_ONE', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] expect(tokens[4]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[5]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.begin.c'] + expect(tokens[5]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.begin.bracket.round.c'] expect(tokens[6]).toEqual value: '3.14', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] expect(tokens[8]).toEqual value: '+', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.operator.c'] expect(tokens[10]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[11]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.end.c'] + expect(tokens[11]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.end.bracket.round.c'] describe "macros", -> it "tokenizes them", -> @@ -229,15 +229,15 @@ describe "Language-C", -> expect(tokens[7]).toEqual value: ' y', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] expect(tokens[9]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.begin.c'] + expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.begin.bracket.round.c'] expect(tokens[11]).toEqual value: 'x', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.end.c'] + expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.end.bracket.round.c'] expect(tokens[13]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[14]).toEqual value: '*', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.operator.c'] expect(tokens[15]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[16]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.begin.c'] + expect(tokens[16]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.begin.bracket.round.c'] expect(tokens[17]).toEqual value: 'y', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[18]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.end.c'] + expect(tokens[18]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.end.bracket.round.c'] {tokens} = grammar.tokenizeLine '#define SWAP(a, b) do { a ^= b; b ^= a; a ^= b; } while ( 0 )' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] @@ -260,9 +260,9 @@ describe "Language-C", -> expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.bracket.curly.c'] expect(tokens[22]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] expect(tokens[23]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.begin.c'] + expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.begin.bracket.round.c'] expect(tokens[26]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[28]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.end.c'] + expect(tokens[28]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.section.parens.end.bracket.round.c'] it "tokenizes multiline macros", -> lines = grammar.tokenizeLines ''' @@ -315,19 +315,19 @@ describe "Language-C", -> expect(lines[0][16]).toEqual value: '0L', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.numeric.c'] expect(lines[0][17]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.bracket.curly.c'] expect(lines[0][19]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] - expect(lines[1][0]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.begin.c'] - expect(lines[1][1]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.begin.c'] - expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.end.c'] - expect(lines[1][4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.begin.c'] + expect(lines[1][0]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.begin.bracket.round.c'] + expect(lines[1][1]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.begin.bracket.round.c'] + expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.end.bracket.round.c'] + expect(lines[1][4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.begin.bracket.round.c'] expect(lines[1][5]).toEqual value: '*', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'keyword.operator.c'] - expect(lines[1][7]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.end.c'] - expect(lines[1][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.end.c'] + expect(lines[1][7]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.end.bracket.round.c'] + expect(lines[1][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.parens.end.bracket.round.c'] expect(lines[1][10]).toEqual value: 'ID', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[1][11]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] + expect(lines[1][11]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'punctuation.section.arguments.begin.bracket.round.c'] expect(lines[1][12]).toEqual value: '"', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'string.quoted.double.c', "punctuation.definition.string.begin.c"] expect(lines[1][13]).toEqual value: 'hook', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'string.quoted.double.c'] expect(lines[1][14]).toEqual value: '"', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'string.quoted.double.c', "punctuation.definition.string.end.c"] - expect(lines[1][15]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] + expect(lines[1][15]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'meta.function.c', 'punctuation.section.arguments.end.bracket.round.c'] expect(lines[1][16]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.bracket.curly.c'] describe "includes", -> @@ -401,20 +401,20 @@ describe "Language-C", -> expect(lines[0][3]).toEqual value: 'defined', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[0][5]).toEqual value: 'CREDIT', scopes: ['source.c', 'meta.preprocessor.c', 'entity.name.function.preprocessor.c'] expect(lines[1][1]).toEqual value: 'credit', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[1][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] - expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] + expect(lines[1][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.arguments.begin.bracket.round.c'] + expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.arguments.end.bracket.round.c'] expect(lines[2][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[2][1]).toEqual value: 'elif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[2][3]).toEqual value: 'defined', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[2][5]).toEqual value: 'DEBIT', scopes: ['source.c', 'meta.preprocessor.c', 'entity.name.function.preprocessor.c'] expect(lines[3][1]).toEqual value: 'debit', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[3][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] - expect(lines[3][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] + expect(lines[3][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.arguments.begin.bracket.round.c'] + expect(lines[3][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.arguments.end.bracket.round.c'] expect(lines[4][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[4][1]).toEqual value: 'else', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[5][1]).toEqual value: 'printerror', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[5][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.begin.c'] - expect(lines[5][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.parameters.end.c'] + expect(lines[5][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'punctuation.section.arguments.begin.bracket.round.c'] + expect(lines[5][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'punctuation.section.arguments.end.bracket.round.c'] expect(lines[6][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[6][1]).toEqual value: 'endif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] @@ -576,7 +576,7 @@ describe "Language-C", -> expect(lines[3][2]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.c'] expect(lines[3][3]).toEqual value: 'MACRO_C', scopes: ['source.c', 'meta.preprocessor.c', 'entity.name.function.preprocessor.c'] expect(lines[3][5]).toEqual value: '==', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.operator.comparison.c'] - expect(lines[3][7]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.c', 'punctuation.section.parens.begin.c'] + expect(lines[3][7]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.c', 'punctuation.section.parens.begin.bracket.round.c'] expect(lines[3][8]).toEqual value: '5', scopes: ['source.c', 'meta.preprocessor.c', 'constant.numeric.c'] expect(lines[3][10]).toEqual value: '+', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.operator.c'] expect(lines[3][14]).toEqual value: '-', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.operator.c'] @@ -587,7 +587,7 @@ describe "Language-C", -> expect(lines[4][1]).toEqual value: 'SOMEMACRO', scopes: ['source.c', 'meta.preprocessor.c', 'entity.name.function.preprocessor.c'] expect(lines[4][3]).toEqual value: 'TRUE', scopes: ['source.c', 'meta.preprocessor.c', 'constant.language.c'] expect(lines[4][6]).toEqual value: '*', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.operator.c'] - expect(lines[4][9]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.c', 'punctuation.section.parens.end.c'] + expect(lines[4][9]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.c', 'punctuation.section.parens.end.bracket.round.c'] expect(lines[4][11]).toEqual value: '//', scopes: ['source.c', 'comment.line.double-slash.cpp', 'punctuation.definition.comment.cpp'] expect(lines[4][12]).toEqual value: ' single line comment', scopes: ['source.c', 'comment.line.double-slash.cpp'] @@ -782,9 +782,9 @@ describe "Language-C", -> {tokens} = grammar.tokenizeLine('sizeof (int)') expect(tokens[0]).toEqual value: 'sizeof', scopes: ['source.c', 'keyword.operator.sizeof.c'] expect(tokens[1]).toEqual value: ' ', scopes: ['source.c'] - expect(tokens[2]).toEqual value: '(', scopes: ['source.c', 'punctuation.section.parens.begin.c'] + expect(tokens[2]).toEqual value: '(', scopes: ['source.c', 'punctuation.section.parens.begin.bracket.round.c'] expect(tokens[3]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] - expect(tokens[4]).toEqual value: ')', scopes: ['source.c', 'punctuation.section.parens.end.c'] + expect(tokens[4]).toEqual value: ')', scopes: ['source.c', 'punctuation.section.parens.end.bracket.round.c'] {tokens} = grammar.tokenizeLine('$sizeof') expect(tokens[1]).not.toEqual value: 'sizeof', scopes: ['source.c', 'keyword.operator.sizeof.c'] @@ -879,9 +879,9 @@ describe "Language-C", -> expect(tokens[1]).toEqual value: '?', scopes: ['source.c', 'keyword.operator.ternary.c'] expect(tokens[2]).toEqual value: ' ', scopes: ['source.c'] expect(tokens[3]).toEqual value: 'f', scopes: ['source.c', 'meta.function-call.c', 'entity.name.function.c'] - expect(tokens[4]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'punctuation.section.parameters.begin.c'] + expect(tokens[4]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'punctuation.section.arguments.begin.bracket.round.c'] expect(tokens[5]).toEqual value: 'b', scopes: ['source.c', 'meta.function-call.c'] - expect(tokens[6]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'punctuation.section.parameters.end.c'] + expect(tokens[6]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'punctuation.section.arguments.end.bracket.round.c'] expect(tokens[7]).toEqual value: ' ', scopes: ['source.c'] expect(tokens[8]).toEqual value: ':', scopes: ['source.c', 'keyword.operator.ternary.c'] expect(tokens[9]).toEqual value: ' c', scopes: ['source.c']