mirror of
				https://github.com/fmtlib/fmt.git
				synced 2025-11-04 08:01:40 +01:00 
			
		
		
		
	
		
			
	
	
		
			2062 lines
		
	
	
		
			71 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			2062 lines
		
	
	
		
			71 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								%YAML 1.2
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								# http://www.sublimetext.com/docs/3/syntax.html
							 | 
						||
| 
								 | 
							
								name: C++ (fmt)
							 | 
						||
| 
								 | 
							
								comment: I don't think anyone uses .hp. .cp tends to be paired with .h. (I could be wrong. :) -- chris
							 | 
						||
| 
								 | 
							
								file_extensions:
							 | 
						||
| 
								 | 
							
								  - cpp
							 | 
						||
| 
								 | 
							
								  - cc
							 | 
						||
| 
								 | 
							
								  - cp
							 | 
						||
| 
								 | 
							
								  - cxx
							 | 
						||
| 
								 | 
							
								  - c++
							 | 
						||
| 
								 | 
							
								  - C
							 | 
						||
| 
								 | 
							
								  - h
							 | 
						||
| 
								 | 
							
								  - hh
							 | 
						||
| 
								 | 
							
								  - hpp
							 | 
						||
| 
								 | 
							
								  - hxx
							 | 
						||
| 
								 | 
							
								  - h++
							 | 
						||
| 
								 | 
							
								  - inl
							 | 
						||
| 
								 | 
							
								  - ipp
							 | 
						||
| 
								 | 
							
								first_line_match: '-\*- C\+\+ -\*-'
							 | 
						||
| 
								 | 
							
								scope: source.c++
							 | 
						||
| 
								 | 
							
								variables:
							 | 
						||
| 
								 | 
							
								  identifier: \b[[:alpha:]_][[:alnum:]_]*\b # upper and lowercase
							 | 
						||
| 
								 | 
							
								  macro_identifier: \b[[:upper:]_][[:upper:][:digit:]_]{2,}\b # only uppercase, at least 3 chars
							 | 
						||
| 
								 | 
							
								  path_lookahead: '(?:::\s*)?(?:{{identifier}}\s*::\s*)*(?:template\s+)?{{identifier}}'
							 | 
						||
| 
								 | 
							
								  operator_method_name: '\boperator\s*(?:[-+*/%^&|~!=<>]|[-+*/%^&|=!<>]=|<<=?|>>=?|&&|\|\||\+\+|--|,|->\*?|\(\)|\[\]|""\s*{{identifier}})'
							 | 
						||
| 
								 | 
							
								  casts: 'const_cast|dynamic_cast|reinterpret_cast|static_cast'
							 | 
						||
| 
								 | 
							
								  operator_keywords: 'and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|xor|xor_eq|noexcept'
							 | 
						||
| 
								 | 
							
								  control_keywords: 'break|case|catch|continue|default|do|else|for|goto|if|_Pragma|return|switch|throw|try|while'
							 | 
						||
| 
								 | 
							
								  memory_operators: 'new|delete'
							 | 
						||
| 
								 | 
							
								  basic_types: 'asm|__asm__|auto|bool|_Bool|char|_Complex|double|float|_Imaginary|int|long|short|signed|unsigned|void'
							 | 
						||
| 
								 | 
							
								  before_tag: 'struct|union|enum\s+class|enum\s+struct|enum|class'
							 | 
						||
| 
								 | 
							
								  declspec: '__declspec\(\s*\w+(?:\([^)]+\))?\s*\)'
							 | 
						||
| 
								 | 
							
								  storage_classes: 'static|export|extern|friend|explicit|virtual|register|thread_local'
							 | 
						||
| 
								 | 
							
								  type_qualifier: 'const|constexpr|mutable|typename|volatile'
							 | 
						||
| 
								 | 
							
								  compiler_directive: 'inline|restrict|__restrict__|__restrict'
							 | 
						||
| 
								 | 
							
								  visibility_modifiers: 'private|protected|public'
							 | 
						||
| 
								 | 
							
								  other_keywords: 'typedef|nullptr|{{visibility_modifiers}}|static_assert|sizeof|using|typeid|alignof|alignas|namespace|template'
							 | 
						||
| 
								 | 
							
								  modifiers: '{{storage_classes}}|{{type_qualifier}}|{{compiler_directive}}'
							 | 
						||
| 
								 | 
							
								  non_angle_brackets: '(?=<<|<=)'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  regular: '[^(){}&;*^%=<>-]*'
							 | 
						||
| 
								 | 
							
								  paren_open: (?:\(
							 | 
						||
| 
								 | 
							
								  paren_close: '\))?'
							 | 
						||
| 
								 | 
							
								  generic_open: (?:<
							 | 
						||
| 
								 | 
							
								  generic_close: '>)?'
							 | 
						||
| 
								 | 
							
								  balance_parentheses: '{{regular}}{{paren_open}}{{regular}}{{paren_close}}{{regular}}'
							 | 
						||
| 
								 | 
							
								  generic_lookahead: <{{regular}}{{generic_open}}{{regular}}{{generic_open}}{{regular}}{{generic_close}}\s*{{generic_close}}{{balance_parentheses}}>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data_structures_forward_decl_lookahead: '(\s+{{macro_identifier}})*\s*(:\s*({{path_lookahead}}|{{visibility_modifiers}}|,|\s|<[^;]*>)+)?;'
							 | 
						||
| 
								 | 
							
								  non_func_keywords: 'if|for|switch|while|decltype|sizeof|__declspec|__attribute__|typeid|alignof|alignas|static_assert'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  format_spec: |-
							 | 
						||
| 
								 | 
							
								    (?x:
							 | 
						||
| 
								 | 
							
								      (?:.? [<>=^])?     # fill align
							 | 
						||
| 
								 | 
							
								      [ +-]?             # sign
							 | 
						||
| 
								 | 
							
								      \#?                # alternate form
							 | 
						||
| 
								 | 
							
								      # technically, octal and hexadecimal integers are also supported as 'width', but rarely used
							 | 
						||
| 
								 | 
							
								      \d*                # width
							 | 
						||
| 
								 | 
							
								      ,?                 # thousands separator
							 | 
						||
| 
								 | 
							
								      (?:\.\d+)?         # precision
							 | 
						||
| 
								 | 
							
								      [bcdeEfFgGnosxX%]? # type
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								contexts:
							 | 
						||
| 
								 | 
							
								  main:
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-global
							 | 
						||
| 
								 | 
							
								    - include: global
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  #############################################################################
							 | 
						||
| 
								 | 
							
								  # Reusable contexts
							 | 
						||
| 
								 | 
							
								  #
							 | 
						||
| 
								 | 
							
								  # The follow contexts are currently constructed to be reused in the
							 | 
						||
| 
								 | 
							
								  # Objetive-C++ syntax. They are specifically constructed to not push into
							 | 
						||
| 
								 | 
							
								  # sub-contexts, which ensures that Objective-C++ code isn't accidentally
							 | 
						||
| 
								 | 
							
								  # lexed as plain C++.
							 | 
						||
| 
								 | 
							
								  #
							 | 
						||
| 
								 | 
							
								  # The "unique-*" contexts are additions that C++ makes over C, and thus can
							 | 
						||
| 
								 | 
							
								  # be directly reused in Objective-C++ along with contexts from Objective-C
							 | 
						||
| 
								 | 
							
								  # and C.
							 | 
						||
| 
								 | 
							
								  #############################################################################
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unique-late-expressions:
							 | 
						||
| 
								 | 
							
								    # This is highlighted after all of the other control keywords
							 | 
						||
| 
								 | 
							
								    # to allow operator overloading to be lexed properly
							 | 
						||
| 
								 | 
							
								    - match: \boperator\b
							 | 
						||
| 
								 | 
							
								      scope: keyword.control.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unique-modifiers:
							 | 
						||
| 
								 | 
							
								    - match: \b({{modifiers}})\b
							 | 
						||
| 
								 | 
							
								      scope: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unique-variables:
							 | 
						||
| 
								 | 
							
								    - match: \bthis\b
							 | 
						||
| 
								 | 
							
								      scope: variable.language.c++
							 | 
						||
| 
								 | 
							
								    # common C++ instance var naming idiom -- fMemberName
							 | 
						||
| 
								 | 
							
								    - match: '\b(f|m)[[:upper:]]\w*\b'
							 | 
						||
| 
								 | 
							
								      scope: variable.other.readwrite.member.c++
							 | 
						||
| 
								 | 
							
								    # common C++ instance var naming idiom -- m_member_name
							 | 
						||
| 
								 | 
							
								    - match: '\bm_[[:alnum:]_]+\b'
							 | 
						||
| 
								 | 
							
								      scope: variable.other.readwrite.member.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unique-constants:
							 | 
						||
| 
								 | 
							
								    - match: \bnullptr\b
							 | 
						||
| 
								 | 
							
								      scope: constant.language.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unique-keywords:
							 | 
						||
| 
								 | 
							
								    - match: \busing\b
							 | 
						||
| 
								 | 
							
								      scope: keyword.control.c++
							 | 
						||
| 
								 | 
							
								    - match: \bbreak\b
							 | 
						||
| 
								 | 
							
								      scope: keyword.control.flow.break.c++
							 | 
						||
| 
								 | 
							
								    - match: \bcontinue\b
							 | 
						||
| 
								 | 
							
								      scope: keyword.control.flow.continue.c++
							 | 
						||
| 
								 | 
							
								    - match: \bgoto\b
							 | 
						||
| 
								 | 
							
								      scope: keyword.control.flow.goto.c++
							 | 
						||
| 
								 | 
							
								    - match: \breturn\b
							 | 
						||
| 
								 | 
							
								      scope: keyword.control.flow.return.c++
							 | 
						||
| 
								 | 
							
								    - match: \bthrow\b
							 | 
						||
| 
								 | 
							
								      scope: keyword.control.flow.throw.c++
							 | 
						||
| 
								 | 
							
								    - match: \b({{control_keywords}})\b
							 | 
						||
| 
								 | 
							
								      scope: keyword.control.c++
							 | 
						||
| 
								 | 
							
								    - match: '\bdelete\b(\s*\[\])?|\bnew\b(?!])'
							 | 
						||
| 
								 | 
							
								      scope: keyword.control.c++
							 | 
						||
| 
								 | 
							
								    - match: \b({{operator_keywords}})\b
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.word.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unique-types:
							 | 
						||
| 
								 | 
							
								    - match: \b(char16_t|char32_t|wchar_t|nullptr_t)\b
							 | 
						||
| 
								 | 
							
								      scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								    - match: \bclass\b
							 | 
						||
| 
								 | 
							
								      scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unique-strings:
							 | 
						||
| 
								 | 
							
								    - match: '((?:L|u8|u|U)?R)("([^\(\)\\ ]{0,16})\()'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: storage.type.string.c++
							 | 
						||
| 
								 | 
							
								        2: punctuation.definition.string.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: string.quoted.double.c++
							 | 
						||
| 
								 | 
							
								        - match: '\)\3"'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.definition.string.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: '\{\{|\}\}'
							 | 
						||
| 
								 | 
							
								          scope: constant.character.escape.c++
							 | 
						||
| 
								 | 
							
								        - include: formatting-syntax
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unique-numbers:
							 | 
						||
| 
								 | 
							
								    - match: |-
							 | 
						||
| 
								 | 
							
								        (?x)
							 | 
						||
| 
								 | 
							
								        (?:
							 | 
						||
| 
								 | 
							
								        # floats
							 | 
						||
| 
								 | 
							
								          (?:
							 | 
						||
| 
								 | 
							
								          (?:\b\d(?:[\d']*\d)?\.\d(?:[\d']*\d)?|\B\.\d(?:[\d']*\d)?)(?:[Ee][+-]?\d(?:[\d']*\d)?)?(?:[fFlL]|(?:i[fl]?|h|min|[mun]?s|_\w*))?\b
							 | 
						||
| 
								 | 
							
								          |
							 | 
						||
| 
								 | 
							
								          (?:\b\d(?:[\d']*\d)?\.)(?:\B|(?:[fFlL]|(?:i[fl]?|h|min|[mun]?s|_\w*))\b|(?:[Ee][+-]?\d(?:[\d']*\d)?)(?:[fFlL]|(?:i[fl]?|h|min|[mun]?s|_\w*))?\b)
							 | 
						||
| 
								 | 
							
								          |
							 | 
						||
| 
								 | 
							
								          \b\d(?:[\d']*\d)?(?:[Ee][+-]?\d(?:[\d']*\d)?)(?:[fFlL]|(?:i[fl]?|h|min|[mun]?s|_\w*))?\b
							 | 
						||
| 
								 | 
							
								          )
							 | 
						||
| 
								 | 
							
								        |
							 | 
						||
| 
								 | 
							
								        # ints
							 | 
						||
| 
								 | 
							
								          \b(?:
							 | 
						||
| 
								 | 
							
								          (?:
							 | 
						||
| 
								 | 
							
								          # dec
							 | 
						||
| 
								 | 
							
								          [1-9](?:[\d']*\d)?
							 | 
						||
| 
								 | 
							
								          |
							 | 
						||
| 
								 | 
							
								          # oct
							 | 
						||
| 
								 | 
							
								          0(?:[0-7']*[0-7])?
							 | 
						||
| 
								 | 
							
								          |
							 | 
						||
| 
								 | 
							
								          # hex
							 | 
						||
| 
								 | 
							
								          0[Xx][\da-fA-F](?:[\da-fA-F']*[\da-fA-F])?
							 | 
						||
| 
								 | 
							
								          |
							 | 
						||
| 
								 | 
							
								          # bin
							 | 
						||
| 
								 | 
							
								          0[Bb][01](?:[01']*[01])?
							 | 
						||
| 
								 | 
							
								          )
							 | 
						||
| 
								 | 
							
								          # int suffixes
							 | 
						||
| 
								 | 
							
								          (?:(?:l{1,2}|L{1,2})[uU]?|[uU](?:l{0,2}|L{0,2})|(?:i[fl]?|h|min|[mun]?s|_\w*))?)\b
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								        (?!\.) # Number must not be followed by a decimal point
							 | 
						||
| 
								 | 
							
								      scope: constant.numeric.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  identifiers:
							 | 
						||
| 
								 | 
							
								    - match: '{{identifier}}\s*(::)\s*'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: punctuation.accessor.c++
							 | 
						||
| 
								 | 
							
								    - match: '(?:(::)\s*)?{{identifier}}'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: punctuation.accessor.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function-specifiers:
							 | 
						||
| 
								 | 
							
								    - match: \b(const|final|noexcept|override)\b
							 | 
						||
| 
								 | 
							
								      scope: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  #############################################################################
							 | 
						||
| 
								 | 
							
								  # The following are C++-specific contexts that should not be reused. This is
							 | 
						||
| 
								 | 
							
								  # because they push into subcontexts and use variables that are C++-specific.
							 | 
						||
| 
								 | 
							
								  #############################################################################
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ## Common context layout
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  global:
							 | 
						||
| 
								 | 
							
								    - match: '(?=\btemplate\b)'
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - include: template
							 | 
						||
| 
								 | 
							
								        - match: (?=\S)
							 | 
						||
| 
								 | 
							
								          set: global-modifier
							 | 
						||
| 
								 | 
							
								    - include: namespace
							 | 
						||
| 
								 | 
							
								    - include: keywords-angle-brackets
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}\s*<)'
							 | 
						||
| 
								 | 
							
								      push: global-modifier
							 | 
						||
| 
								 | 
							
								    # Take care of comments just before a function definition.
							 | 
						||
| 
								 | 
							
								    - match: /\*
							 | 
						||
| 
								 | 
							
								      scope: punctuation.definition.comment.c
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - - match: \s*(?=\w)
							 | 
						||
| 
								 | 
							
								            set: global-modifier
							 | 
						||
| 
								 | 
							
								          - match: ""
							 | 
						||
| 
								 | 
							
								            pop: true
							 | 
						||
| 
								 | 
							
								        - - meta_scope: comment.block.c
							 | 
						||
| 
								 | 
							
								          - match: \*/
							 | 
						||
| 
								 | 
							
								            scope: punctuation.definition.comment.c
							 | 
						||
| 
								 | 
							
								            pop: true
							 | 
						||
| 
								 | 
							
								    - include: early-expressions
							 | 
						||
| 
								 | 
							
								    - match: ^\s*\b(extern)(?=\s+"C(\+\+)?")
							 | 
						||
| 
								 | 
							
								      scope: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - include: comments
							 | 
						||
| 
								 | 
							
								        - include: strings
							 | 
						||
| 
								 | 
							
								        - match: '\{'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_scope: meta.extern-c.c++
							 | 
						||
| 
								 | 
							
								            - match: '^\s*(#\s*ifdef)\s*__cplusplus\s*'
							 | 
						||
| 
								 | 
							
								              scope: meta.preprocessor.c++
							 | 
						||
| 
								 | 
							
								              captures:
							 | 
						||
| 
								 | 
							
								                1: keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								              set:
							 | 
						||
| 
								 | 
							
								                - match: '\}'
							 | 
						||
| 
								 | 
							
								                  scope: punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								                  pop: true
							 | 
						||
| 
								 | 
							
								                - include: preprocessor-global
							 | 
						||
| 
								 | 
							
								                - include: global
							 | 
						||
| 
								 | 
							
								            - match: '\}'
							 | 
						||
| 
								 | 
							
								              scope: punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: preprocessor-global
							 | 
						||
| 
								 | 
							
								            - include: global
							 | 
						||
| 
								 | 
							
								        - match: (?=\S)
							 | 
						||
| 
								 | 
							
								          set: global-modifier
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(?=\w)
							 | 
						||
| 
								 | 
							
								      push: global-modifier
							 | 
						||
| 
								 | 
							
								    - include: late-expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  statements:
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-statements
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#label
							 | 
						||
| 
								 | 
							
								    - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  expressions:
							 | 
						||
| 
								 | 
							
								    - include: early-expressions
							 | 
						||
| 
								 | 
							
								    - include: late-expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  early-expressions:
							 | 
						||
| 
								 | 
							
								    - include: early-expressions-before-generic-type
							 | 
						||
| 
								 | 
							
								    - include: generic-type
							 | 
						||
| 
								 | 
							
								    - include: early-expressions-after-generic-type
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  early-expressions-before-generic-type:
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-expressions
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - include: case-default
							 | 
						||
| 
								 | 
							
								    - include: typedef
							 | 
						||
| 
								 | 
							
								    - include: keywords-angle-brackets
							 | 
						||
| 
								 | 
							
								    - include: keywords-parens
							 | 
						||
| 
								 | 
							
								    - include: keywords
							 | 
						||
| 
								 | 
							
								    - include: numbers
							 | 
						||
| 
								 | 
							
								    # Prevent a '<' from getting scoped as the start of another template
							 | 
						||
| 
								 | 
							
								    # parameter list, if in reality a less-than-or-equals sign is meant.
							 | 
						||
| 
								 | 
							
								    - match: <=
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.comparison.c
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  early-expressions-after-generic-type:
							 | 
						||
| 
								 | 
							
								    - include: members-arrow
							 | 
						||
| 
								 | 
							
								    - include: operators
							 | 
						||
| 
								 | 
							
								    - include: members-dot
							 | 
						||
| 
								 | 
							
								    - include: strings
							 | 
						||
| 
								 | 
							
								    - include: parens
							 | 
						||
| 
								 | 
							
								    - include: brackets
							 | 
						||
| 
								 | 
							
								    - include: block
							 | 
						||
| 
								 | 
							
								    - include: variables
							 | 
						||
| 
								 | 
							
								    - include: constants
							 | 
						||
| 
								 | 
							
								    - match: ','
							 | 
						||
| 
								 | 
							
								      scope: punctuation.separator.c++
							 | 
						||
| 
								 | 
							
								    - match: '\)|\}'
							 | 
						||
| 
								 | 
							
								      scope: invalid.illegal.stray-bracket-end.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  expressions-minus-generic-type:
							 | 
						||
| 
								 | 
							
								    - include: early-expressions-before-generic-type
							 | 
						||
| 
								 | 
							
								    - include: angle-brackets
							 | 
						||
| 
								 | 
							
								    - include: early-expressions-after-generic-type
							 | 
						||
| 
								 | 
							
								    - include: late-expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  expressions-minus-generic-type-function-call:
							 | 
						||
| 
								 | 
							
								    - include: early-expressions-before-generic-type
							 | 
						||
| 
								 | 
							
								    - include: angle-brackets
							 | 
						||
| 
								 | 
							
								    - include: early-expressions-after-generic-type
							 | 
						||
| 
								 | 
							
								    - include: late-expressions-before-function-call
							 | 
						||
| 
								 | 
							
								    - include: identifiers
							 | 
						||
| 
								 | 
							
								    - match: ';'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.terminator.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  late-expressions:
							 | 
						||
| 
								 | 
							
								    - include: late-expressions-before-function-call
							 | 
						||
| 
								 | 
							
								    - include: function-call
							 | 
						||
| 
								 | 
							
								    - include: identifiers
							 | 
						||
| 
								 | 
							
								    - match: ';'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.terminator.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  late-expressions-before-function-call:
							 | 
						||
| 
								 | 
							
								    - include: unique-late-expressions
							 | 
						||
| 
								 | 
							
								    - include: modifiers-parens
							 | 
						||
| 
								 | 
							
								    - include: modifiers
							 | 
						||
| 
								 | 
							
								    - include: types
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  expressions-minus-function-call:
							 | 
						||
| 
								 | 
							
								    - include: early-expressions
							 | 
						||
| 
								 | 
							
								    - include: late-expressions-before-function-call
							 | 
						||
| 
								 | 
							
								    - include: identifiers
							 | 
						||
| 
								 | 
							
								    - match: ';'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.terminator.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  comments:
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#comments
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  operators:
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#operators
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  modifiers:
							 | 
						||
| 
								 | 
							
								    - include: unique-modifiers
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#modifiers
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  variables:
							 | 
						||
| 
								 | 
							
								    - include: unique-variables
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#variables
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  constants:
							 | 
						||
| 
								 | 
							
								    - include: unique-constants
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#constants
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  keywords:
							 | 
						||
| 
								 | 
							
								    - include: unique-keywords
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#keywords
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  types:
							 | 
						||
| 
								 | 
							
								    - include: unique-types
							 | 
						||
| 
								 | 
							
								    - include: types-parens
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#types
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  strings:
							 | 
						||
| 
								 | 
							
								    - include: unique-strings
							 | 
						||
| 
								 | 
							
								    - match: '(L|u8|u|U)?(")'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: storage.type.string.c++
							 | 
						||
| 
								 | 
							
								        2: punctuation.definition.string.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: string.quoted.double.c++
							 | 
						||
| 
								 | 
							
								        - match: '"'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.definition.string.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#string_escaped_char
							 | 
						||
| 
								 | 
							
								        - match: |-
							 | 
						||
| 
								 | 
							
								            (?x)%
							 | 
						||
| 
								 | 
							
								              (\d+\$)?                                      # field (argument #)
							 | 
						||
| 
								 | 
							
								              [#0\- +']*                                    # flags
							 | 
						||
| 
								 | 
							
								              [,;:_]?                                       # separator character (AltiVec)
							 | 
						||
| 
								 | 
							
								              ((-?\d+)|\*(-?\d+\$)?)?                       # minimum field width
							 | 
						||
| 
								 | 
							
								              (\.((-?\d+)|\*(-?\d+\$)?)?)?                  # precision
							 | 
						||
| 
								 | 
							
								              (hh|h|ll|l|j|t|z|q|L|vh|vl|v|hv|hl)?          # length modifier
							 | 
						||
| 
								 | 
							
								              (\[[^\]]+\]|[am]s|[diouxXDOUeEfFgGaACcSspn%]) # conversion type
							 | 
						||
| 
								 | 
							
								          scope: constant.other.placeholder.c++
							 | 
						||
| 
								 | 
							
								        - match: '\{\{|\}\}'
							 | 
						||
| 
								 | 
							
								          scope: constant.character.escape.c++
							 | 
						||
| 
								 | 
							
								        - include: formatting-syntax
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#strings
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  formatting-syntax:
							 | 
						||
| 
								 | 
							
								    # https://docs.python.org/3.6/library/string.html#formatstrings
							 | 
						||
| 
								 | 
							
								    - match: |- # simple form
							 | 
						||
| 
								 | 
							
								        (?x)
							 | 
						||
| 
								 | 
							
								        (\{)
							 | 
						||
| 
								 | 
							
								          (?: [\w.\[\]]+)?             # field_name
							 | 
						||
| 
								 | 
							
								          (   ! [ars])?                # conversion
							 | 
						||
| 
								 | 
							
								          (   : (?:{{format_spec}}|    # format_spec OR
							 | 
						||
| 
								 | 
							
								                   [^}%]*%.[^}]*)      # any format-like string
							 | 
						||
| 
								 | 
							
								          )?
							 | 
						||
| 
								 | 
							
								        (\})
							 | 
						||
| 
								 | 
							
								      scope: constant.other.placeholder.c++
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: punctuation.definition.placeholder.begin.c++
							 | 
						||
| 
								 | 
							
								        2: storage.modifier.c++onversion.c++
							 | 
						||
| 
								 | 
							
								        3: constant.other.format-spec.c++
							 | 
						||
| 
								 | 
							
								        4: punctuation.definition.placeholder.end.c++
							 | 
						||
| 
								 | 
							
								    - match: \{(?=[^\}"']+\{[^"']*\}) # complex (nested) form
							 | 
						||
| 
								 | 
							
								      scope: punctuation.definition.placeholder.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: constant.other.placeholder.c++
							 | 
						||
| 
								 | 
							
								        - match: \}
							 | 
						||
| 
								 | 
							
								          scope: punctuation.definition.placeholder.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: '[\w.\[\]]+'
							 | 
						||
| 
								 | 
							
								        - match: '![ars]'
							 | 
						||
| 
								 | 
							
								          scope: storage.modifier.conversion.c++
							 | 
						||
| 
								 | 
							
								        - match: ':'
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - meta_scope: meta.format-spec.c++ constant.other.format-spec.c++
							 | 
						||
| 
								 | 
							
								            - match: (?=\})
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: formatting-syntax
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  numbers:
							 | 
						||
| 
								 | 
							
								    - include: unique-numbers
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#numbers
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ## C++-specific contexts
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  case-default:
							 | 
						||
| 
								 | 
							
								    - match: '\b(default|case)\b'
							 | 
						||
| 
								 | 
							
								      scope: keyword.control.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: (?=[);,])
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: ':'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.separator.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  modifiers-parens:
							 | 
						||
| 
								 | 
							
								    - match: '\b(alignas)\b\s*(\()'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								        2: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								        - match: '\)'
							 | 
						||
| 
								 | 
							
								          scope: meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: expressions
							 | 
						||
| 
								 | 
							
								    - match: \b(__attribute__)\s*(\(\()
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								        2: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								      push :
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.attribute.c++
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								        - include: parens
							 | 
						||
| 
								 | 
							
								        - include: strings
							 | 
						||
| 
								 | 
							
								        - match: \)\)
							 | 
						||
| 
								 | 
							
								          scope: meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								    - match: \b(__declspec)(\()
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								        2: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								        - match: '\)'
							 | 
						||
| 
								 | 
							
								          scope: meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: '\b(align|allocate|code_seg|deprecated|property|uuid)\b\s*(\()'
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								            2: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								            - match: '\)'
							 | 
						||
| 
								 | 
							
								              scope: meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: numbers
							 | 
						||
| 
								 | 
							
								            - include: strings
							 | 
						||
| 
								 | 
							
								            - match: \b(get|put)\b
							 | 
						||
| 
								 | 
							
								              scope: variable.parameter.c++
							 | 
						||
| 
								 | 
							
								            - match: ','
							 | 
						||
| 
								 | 
							
								              scope: punctuation.separator.c++
							 | 
						||
| 
								 | 
							
								            - match: '='
							 | 
						||
| 
								 | 
							
								              scope: keyword.operator.assignment.c++
							 | 
						||
| 
								 | 
							
								        - match: '\b(appdomain|deprecated|dllimport|dllexport|jintrinsic|naked|noalias|noinline|noreturn|nothrow|novtable|process|restrict|safebuffers|selectany|thread)\b'
							 | 
						||
| 
								 | 
							
								          scope: constant.other.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  types-parens:
							 | 
						||
| 
								 | 
							
								    - match: '\b(decltype)\b\s*(\()'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: storage.type.c++
							 | 
						||
| 
								 | 
							
								        2: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								        - match: '\)'
							 | 
						||
| 
								 | 
							
								          scope: meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  keywords-angle-brackets:
							 | 
						||
| 
								 | 
							
								    - match: \b({{casts}})\b\s*
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.word.cast.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: '>'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.generic.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: '<'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.generic.begin.c++
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - match: '(?=>)'
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: expressions-minus-generic-type-function-call
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  keywords-parens:
							 | 
						||
| 
								 | 
							
								    - match: '\b(alignof|typeid|static_assert|sizeof)\b\s*(\()'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: keyword.operator.word.c++
							 | 
						||
| 
								 | 
							
								        2: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								        - match: '\)'
							 | 
						||
| 
								 | 
							
								          scope: meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  namespace:
							 | 
						||
| 
								 | 
							
								    - match: '\b(using)\s+(namespace)\s+(?={{path_lookahead}})'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: keyword.control.c++
							 | 
						||
| 
								 | 
							
								        2: keyword.control.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: ''
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								    - match: '\b(namespace)\s+(?=({{path_lookahead}})?(?!\s*[;,]))'
							 | 
						||
| 
								 | 
							
								      scope: meta.namespace.c++
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: keyword.control.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.namespace.c++ entity.name.namespace.c++
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: ''
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_scope: meta.namespace.c++
							 | 
						||
| 
								 | 
							
								            - include: comments
							 | 
						||
| 
								 | 
							
								            - match: '='
							 | 
						||
| 
								 | 
							
								              scope: keyword.operator.alias.c++
							 | 
						||
| 
								 | 
							
								            - match: '(?=;)'
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - match: '\}'
							 | 
						||
| 
								 | 
							
								              scope: meta.block.c++ punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - match: '\{'
							 | 
						||
| 
								 | 
							
								              scope: punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								              push:
							 | 
						||
| 
								 | 
							
								                - meta_scope: meta.block.c++
							 | 
						||
| 
								 | 
							
								                - match: '(?=\})'
							 | 
						||
| 
								 | 
							
								                  pop: true
							 | 
						||
| 
								 | 
							
								                - include: preprocessor-global
							 | 
						||
| 
								 | 
							
								                - include: global
							 | 
						||
| 
								 | 
							
								            - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template-common:
							 | 
						||
| 
								 | 
							
								    # Exit the template scope if we hit some basic invalid characters. This
							 | 
						||
| 
								 | 
							
								    # helps when a user is in the middle of typing their template types and
							 | 
						||
| 
								 | 
							
								    # prevents re-highlighting the whole file until the next > is found.
							 | 
						||
| 
								 | 
							
								    - match: (?=[{};])
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template:
							 | 
						||
| 
								 | 
							
								    - match: \btemplate\b
							 | 
						||
| 
								 | 
							
								      scope: storage.type.template.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.template.c++
							 | 
						||
| 
								 | 
							
								        # Explicitly include comments here at the top, in order to NOT match the
							 | 
						||
| 
								 | 
							
								        # \S lookahead in the case of comments.
							 | 
						||
| 
								 | 
							
								        - include: comments
							 | 
						||
| 
								 | 
							
								        - match: <
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.generic.begin.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: meta.template.c++
							 | 
						||
| 
								 | 
							
								            - match: '>'
							 | 
						||
| 
								 | 
							
								              scope: meta.template.c++ punctuation.section.generic.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - match: \.{3}
							 | 
						||
| 
								 | 
							
								              scope: keyword.operator.variadic.c++
							 | 
						||
| 
								 | 
							
								            - match: \b(typename|{{before_tag}})\b
							 | 
						||
| 
								 | 
							
								              scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								            - include: template # include template here for nested templates
							 | 
						||
| 
								 | 
							
								            - include: template-common
							 | 
						||
| 
								 | 
							
								        - match: (?=\S)
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: meta.template.c++
							 | 
						||
| 
								 | 
							
								            - match: \b({{before_tag}})\b
							 | 
						||
| 
								 | 
							
								              scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								            - include: template-common
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  generic-type:
							 | 
						||
| 
								 | 
							
								    - match: '(?=(?!template){{path_lookahead}}\s*{{generic_lookahead}}\s*\()'
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.function-call.c++
							 | 
						||
| 
								 | 
							
								        - match: \btemplate\b
							 | 
						||
| 
								 | 
							
								          scope: storage.type.template.c++
							 | 
						||
| 
								 | 
							
								        - match: '(?:(::)\s*)?{{identifier}}\s*(::)\s*'
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: punctuation.accessor.double-colon.c++
							 | 
						||
| 
								 | 
							
								            2: punctuation.accessor.double-colon.c++
							 | 
						||
| 
								 | 
							
								        - match: (?:(::)\s*)?({{identifier}})\s*(<)
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: punctuation.accessor.double-colon.c++
							 | 
						||
| 
								 | 
							
								            2: variable.function.c++
							 | 
						||
| 
								 | 
							
								            3: punctuation.section.generic.begin.c++
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - match: '>'
							 | 
						||
| 
								 | 
							
								              scope: punctuation.section.generic.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: expressions-minus-generic-type-function-call
							 | 
						||
| 
								 | 
							
								        - match: (?:(::)\s*)?({{identifier}})\s*(\()
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: punctuation.accessor.double-colon.c++
							 | 
						||
| 
								 | 
							
								            2: variable.function.c++
							 | 
						||
| 
								 | 
							
								            3: punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_scope: meta.function-call.c++
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								            - match: '\)'
							 | 
						||
| 
								 | 
							
								              scope: meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: expressions
							 | 
						||
| 
								 | 
							
								        - include: angle-brackets
							 | 
						||
| 
								 | 
							
								        - match: '\('
							 | 
						||
| 
								 | 
							
								          scope: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_scope: meta.function-call.c++
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								            - match: '\)'
							 | 
						||
| 
								 | 
							
								              scope: meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: expressions
							 | 
						||
| 
								 | 
							
								    - match: '(?=(?!template){{path_lookahead}}\s*{{generic_lookahead}})'
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: '<'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.generic.begin.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - match: '>'
							 | 
						||
| 
								 | 
							
								              scope: punctuation.section.generic.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: expressions-minus-generic-type-function-call
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  angle-brackets:
							 | 
						||
| 
								 | 
							
								    - match: '<(?!<)'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.generic.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: '>'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.generic.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: expressions-minus-generic-type-function-call
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  block:
							 | 
						||
| 
								 | 
							
								    - match: '\{'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.block.c++
							 | 
						||
| 
								 | 
							
								        - match: (?=^\s*#\s*(elif|else|endif)\b)
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: '\}'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function-call:
							 | 
						||
| 
								 | 
							
								    - match: (?={{path_lookahead}}\s*\()
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.function-call.c++
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#c99
							 | 
						||
| 
								 | 
							
								        - match: '(?:(::)\s*)?{{identifier}}\s*(::)\s*'
							 | 
						||
| 
								 | 
							
								          scope: variable.function.c++
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: punctuation.accessor.c++
							 | 
						||
| 
								 | 
							
								            2: punctuation.accessor.c++
							 | 
						||
| 
								 | 
							
								        - match: '(?:(::)\s*)?{{identifier}}'
							 | 
						||
| 
								 | 
							
								          scope: variable.function.c++
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: punctuation.accessor.c++
							 | 
						||
| 
								 | 
							
								        - match: '\('
							 | 
						||
| 
								 | 
							
								          scope: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: meta.function-call.c++ meta.group.c++
							 | 
						||
| 
								 | 
							
								            - match: '\)'
							 | 
						||
| 
								 | 
							
								              scope: meta.function-call.c++ meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  members-inside-function-call:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.method-call.c++ meta.group.c++
							 | 
						||
| 
								 | 
							
								    - match: \)
							 | 
						||
| 
								 | 
							
								      scope: meta.method-call.c++ meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  members-after-accessor-junction:
							 | 
						||
| 
								 | 
							
								    # After we've seen an accessor (dot or arrow), this context decides what
							 | 
						||
| 
								 | 
							
								    # kind of entity we're accessing.
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - match: \btemplate\b
							 | 
						||
| 
								 | 
							
								      scope: meta.method-call.c++ storage.type.template.c++
							 | 
						||
| 
								 | 
							
								      # Guaranteed to be a template member function call after we match this
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.method-call.c++
							 | 
						||
| 
								 | 
							
								        - include: comments
							 | 
						||
| 
								 | 
							
								        - match: '{{identifier}}'
							 | 
						||
| 
								 | 
							
								          scope: variable.function.member.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: meta.method-call.c++
							 | 
						||
| 
								 | 
							
								            - match: \(
							 | 
						||
| 
								 | 
							
								              scope: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								              set: members-inside-function-call
							 | 
						||
| 
								 | 
							
								            - include: comments
							 | 
						||
| 
								 | 
							
								            - include: angle-brackets
							 | 
						||
| 
								 | 
							
								            - match: (?=\S) # safety pop
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								        - match: (?=\S) # safety pop
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								    # Operator overloading
							 | 
						||
| 
								 | 
							
								    - match: '({{operator_method_name}})\s*(\()'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        0: meta.method-call.c++
							 | 
						||
| 
								 | 
							
								        1: variable.function.member.c++
							 | 
						||
| 
								 | 
							
								        2: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								      set: members-inside-function-call
							 | 
						||
| 
								 | 
							
								    # Non-templated member function call
							 | 
						||
| 
								 | 
							
								    - match: (~?{{identifier}})\s*(\()
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        0: meta.method-call.c++
							 | 
						||
| 
								 | 
							
								        1: variable.function.member.c++
							 | 
						||
| 
								 | 
							
								        2: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								      set: members-inside-function-call
							 | 
						||
| 
								 | 
							
								    # Templated member function call
							 | 
						||
| 
								 | 
							
								    - match: (~?{{identifier}})\s*(?={{generic_lookahead}})
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: variable.function.member.c++
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.method-call.c++
							 | 
						||
| 
								 | 
							
								        - match: <
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.generic.begin.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: meta.method-call.c++
							 | 
						||
| 
								 | 
							
								            - match: '>'
							 | 
						||
| 
								 | 
							
								              scope: punctuation.section.generic.end.c++
							 | 
						||
| 
								 | 
							
								              set:
							 | 
						||
| 
								 | 
							
								                - meta_content_scope: meta.method-call.c++
							 | 
						||
| 
								 | 
							
								                - include: comments
							 | 
						||
| 
								 | 
							
								                - match: \(
							 | 
						||
| 
								 | 
							
								                  scope: punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								                  set: members-inside-function-call
							 | 
						||
| 
								 | 
							
								                - match: (?=\S) # safety pop
							 | 
						||
| 
								 | 
							
								                  pop: true
							 | 
						||
| 
								 | 
							
								            - include: expressions
							 | 
						||
| 
								 | 
							
								    # Explicit base-class access
							 | 
						||
| 
								 | 
							
								    - match: ({{identifier}})\s*(::)
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: variable.other.base-class.c++
							 | 
						||
| 
								 | 
							
								        2: punctuation.accessor.double-colon.c++
							 | 
						||
| 
								 | 
							
								      set: members-after-accessor-junction # reset
							 | 
						||
| 
								 | 
							
								    # Just a regular member variable
							 | 
						||
| 
								 | 
							
								    - match: '{{identifier}}'
							 | 
						||
| 
								 | 
							
								      scope: variable.other.readwrite.member.c++
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  members-dot:
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#access-illegal
							 | 
						||
| 
								 | 
							
								    # No lookahead required because members-dot goes after operators in the
							 | 
						||
| 
								 | 
							
								    # early-expressions-after-generic-type context. This means triple dots
							 | 
						||
| 
								 | 
							
								    # (i.e. "..." or "variadic") is attempted first.
							 | 
						||
| 
								 | 
							
								    - match: \.
							 | 
						||
| 
								 | 
							
								      scope: punctuation.accessor.dot.c++
							 | 
						||
| 
								 | 
							
								      push: members-after-accessor-junction
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  members-arrow:
							 | 
						||
| 
								 | 
							
								    # This needs to be before operators in the
							 | 
						||
| 
								 | 
							
								    # early-expressions-after-generic-type context because otherwise the "->"
							 | 
						||
| 
								 | 
							
								    # from the C language will match.
							 | 
						||
| 
								 | 
							
								    - match: ->
							 | 
						||
| 
								 | 
							
								      scope: punctuation.accessor.arrow.c++
							 | 
						||
| 
								 | 
							
								      push: members-after-accessor-junction
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  typedef:
							 | 
						||
| 
								 | 
							
								    - match: \btypedef\b
							 | 
						||
| 
								 | 
							
								      scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: ({{identifier}})?\s*(?=;)
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: entity.name.type.typedef.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: \b(struct)\s+({{identifier}})\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: storage.type.c++
							 | 
						||
| 
								 | 
							
								        - include: expressions-minus-generic-type
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  parens:
							 | 
						||
| 
								 | 
							
								    - match: \(
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								        - match: \)
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  brackets:
							 | 
						||
| 
								 | 
							
								    - match: \[
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.brackets.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.brackets.c++
							 | 
						||
| 
								 | 
							
								        - match: \]
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.brackets.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function-trailing-return-type:
							 | 
						||
| 
								 | 
							
								    - match: '{{non_angle_brackets}}'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: angle-brackets
							 | 
						||
| 
								 | 
							
								    - include: types
							 | 
						||
| 
								 | 
							
								    - include: modifiers-parens
							 | 
						||
| 
								 | 
							
								    - include: modifiers
							 | 
						||
| 
								 | 
							
								    - include: identifiers
							 | 
						||
| 
								 | 
							
								    - match: \*|&
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.c++
							 | 
						||
| 
								 | 
							
								    - include: function-trailing-return-type-parens
							 | 
						||
| 
								 | 
							
								    - match: '(?=\S)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function-trailing-return-type-parens:
							 | 
						||
| 
								 | 
							
								    - match: \(
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								        - match: \)
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: function-trailing-return-type
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ## Detection of function and data structure definitions at the global level
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  global-modifier:
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - include: modifiers-parens
							 | 
						||
| 
								 | 
							
								    - include: modifiers
							 | 
						||
| 
								 | 
							
								    # Constructors and destructors don't have a type
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}\s*::\s*{{identifier}}\s*(\(|$))'
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.function.c++ entity.name.function.constructor.c++
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: '(?=[^\w\s])'
							 | 
						||
| 
								 | 
							
								          set: function-definition-params
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}\s*::\s*~{{identifier}}\s*(\(|$))'
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.function.c++ entity.name.function.destructor.c++
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: '~{{identifier}}'
							 | 
						||
| 
								 | 
							
								        - match: '(?=[^\w\s])'
							 | 
						||
| 
								 | 
							
								          set: function-definition-params
							 | 
						||
| 
								 | 
							
								    # If we see a path ending in :: before a newline, we don't know if it is
							 | 
						||
| 
								 | 
							
								    # a constructor or destructor, or a long return type, so we are just going
							 | 
						||
| 
								 | 
							
								    # to treat it like a regular function. Most likely it is a constructor,
							 | 
						||
| 
								 | 
							
								    # since it doesn't seem most developers would create such a long typename.
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}\s*::\s*$)'
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.function.c++ entity.name.function.c++
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: '~{{identifier}}'
							 | 
						||
| 
								 | 
							
								        - match: '(?=[^\w\s])'
							 | 
						||
| 
								 | 
							
								          set: function-definition-params
							 | 
						||
| 
								 | 
							
								    - include: unique-strings
							 | 
						||
| 
								 | 
							
								    - match: '(?=\S)'
							 | 
						||
| 
								 | 
							
								      set: global-type
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  global-type:
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - match: \*|&
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.c++
							 | 
						||
| 
								 | 
							
								    - match: '(?=\b({{control_keywords}}|{{operator_keywords}}|{{casts}}|{{memory_operators}}|{{other_keywords}}|operator)\b)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: '(?=\s)'
							 | 
						||
| 
								 | 
							
								      set: global-maybe-function
							 | 
						||
| 
								 | 
							
								    # If a class/struct/enum followed by a name that is not a macro or declspec
							 | 
						||
| 
								 | 
							
								    # then this is likely a return type of a function. This is uncommon.
							 | 
						||
| 
								 | 
							
								    - match: |-
							 | 
						||
| 
								 | 
							
								        (?x:
							 | 
						||
| 
								 | 
							
								          ({{before_tag}})
							 | 
						||
| 
								 | 
							
								          \s+
							 | 
						||
| 
								 | 
							
								          (?=
							 | 
						||
| 
								 | 
							
								            (?![[:upper:][:digit:]_]+\b|__declspec|{{before_tag}})
							 | 
						||
| 
								 | 
							
								            {{path_lookahead}}
							 | 
						||
| 
								 | 
							
								            (\s+{{identifier}}\s*\(|\s*[*&])
							 | 
						||
| 
								 | 
							
								          )
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: storage.type.c++
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: ''
							 | 
						||
| 
								 | 
							
								          set: global-maybe-function
							 | 
						||
| 
								 | 
							
								    # The previous match handles return types of struct/enum/etc from a func,
							 | 
						||
| 
								 | 
							
								    # there this one exits the context to allow matching an actual struct/class
							 | 
						||
| 
								 | 
							
								    - match: '(?=\b({{before_tag}})\b)'
							 | 
						||
| 
								 | 
							
								      set: data-structures
							 | 
						||
| 
								 | 
							
								    - match: '(?=\b({{casts}})\b\s*<)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: '{{non_angle_brackets}}'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: angle-brackets
							 | 
						||
| 
								 | 
							
								    - include: types
							 | 
						||
| 
								 | 
							
								    # Allow a macro call
							 | 
						||
| 
								 | 
							
								    - match: '({{identifier}})\s*(\()(?=[^\)]+\))'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: variable.function.c++
							 | 
						||
| 
								 | 
							
								        2: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.function-call.c++
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								        - match: '\)'
							 | 
						||
| 
								 | 
							
								          scope: meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: expressions
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}\s*\()'
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - include: function-call
							 | 
						||
| 
								 | 
							
								        - match: ''
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								    - include: variables
							 | 
						||
| 
								 | 
							
								    - include: constants
							 | 
						||
| 
								 | 
							
								    - include: identifiers
							 | 
						||
| 
								 | 
							
								    - match: (?=\W)
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  global-maybe-function:
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    # Consume pointer info, macros and any type info that was offset by macros
							 | 
						||
| 
								 | 
							
								    - match: \*|&
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.c++
							 | 
						||
| 
								 | 
							
								    - match: '(?=\b({{control_keywords}}|{{operator_keywords}}|{{casts}}|{{memory_operators}}|{{other_keywords}})\b)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: '\b({{type_qualifier}})\b'
							 | 
						||
| 
								 | 
							
								      scope: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								    - match: '{{non_angle_brackets}}'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: angle-brackets
							 | 
						||
| 
								 | 
							
								    - include: types
							 | 
						||
| 
								 | 
							
								    - include: modifiers-parens
							 | 
						||
| 
								 | 
							
								    - include: modifiers
							 | 
						||
| 
								 | 
							
								    # All uppercase identifier just before a newline is most likely a macro
							 | 
						||
| 
								 | 
							
								    - match: '[[:upper:][:digit:]_]+\s*$'
							 | 
						||
| 
								 | 
							
								    # Operator overloading
							 | 
						||
| 
								 | 
							
								    - match: '(?=({{path_lookahead}}\s*(?:{{generic_lookahead}})?::\s*)?{{operator_method_name}}\s*(\(|$))'
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.function.c++ entity.name.function.c++
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: '(?=\s*(\(|$))'
							 | 
						||
| 
								 | 
							
								          set: function-definition-params
							 | 
						||
| 
								 | 
							
								    # Identifier that is not the function name - likely a macro or type
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}([ \t]+|[*&])(?!\s*(<|::|\(|$)))'
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: ''
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								    # Real function definition
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}({{generic_lookahead}}({{path_lookahead}})?)\s*(\(|$))'
							 | 
						||
| 
								 | 
							
								      set: [function-definition-params, global-function-identifier-generic]
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}\s*(\(|$))'
							 | 
						||
| 
								 | 
							
								      set: [function-definition-params, global-function-identifier]
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}\s*::\s*$)'
							 | 
						||
| 
								 | 
							
								      set: [function-definition-params, global-function-identifier]
							 | 
						||
| 
								 | 
							
								    - match: '(?=\S)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  global-function-identifier-generic:
							 | 
						||
| 
								 | 
							
								    - include: angle-brackets
							 | 
						||
| 
								 | 
							
								    - match: '::'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.accessor.c++
							 | 
						||
| 
								 | 
							
								    - match: '(?={{identifier}}<.*>\s*\()'
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: entity.name.function.c++
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: '(?=<)'
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								    - match: '(?={{identifier}}\s*\()'
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: entity.name.function.c++
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: ''
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								    - match: '(?=\()'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  global-function-identifier:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: entity.name.function.c++
							 | 
						||
| 
								 | 
							
								    - include: identifiers
							 | 
						||
| 
								 | 
							
								    - match: '(?=\S)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function-definition-params:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.function.c++
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - match: '(?=\()'
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - match: \(
							 | 
						||
| 
								 | 
							
								          scope: meta.function.parameters.c++ meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: meta.function.parameters.c++ meta.group.c++
							 | 
						||
| 
								 | 
							
								            - match : \)
							 | 
						||
| 
								 | 
							
								              scope: punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								              set: function-definition-continue
							 | 
						||
| 
								 | 
							
								            - match: '\bvoid\b'
							 | 
						||
| 
								 | 
							
								              scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								            - match: '{{identifier}}(?=\s*(\[|,|\)|=))'
							 | 
						||
| 
								 | 
							
								              scope: variable.parameter.c++
							 | 
						||
| 
								 | 
							
								            - match: '='
							 | 
						||
| 
								 | 
							
								              scope: keyword.operator.assignment.c++
							 | 
						||
| 
								 | 
							
								              push:
							 | 
						||
| 
								 | 
							
								                - match: '(?=,|\))'
							 | 
						||
| 
								 | 
							
								                  pop: true
							 | 
						||
| 
								 | 
							
								                - include: expressions-minus-generic-type
							 | 
						||
| 
								 | 
							
								                - include: scope:source.c#preprocessor-line-continuation
							 | 
						||
| 
								 | 
							
								            - include: expressions-minus-generic-type
							 | 
						||
| 
								 | 
							
								            - include: scope:source.c#preprocessor-line-continuation
							 | 
						||
| 
								 | 
							
								    - match: (?=\S)
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function-definition-continue:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.function.c++
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - match: '(?=;)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: '->'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.separator.c++
							 | 
						||
| 
								 | 
							
								      set: function-definition-trailing-return
							 | 
						||
| 
								 | 
							
								    - include: function-specifiers
							 | 
						||
| 
								 | 
							
								    - match: '='
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.assignment.c++
							 | 
						||
| 
								 | 
							
								    - match: '&'
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.c++
							 | 
						||
| 
								 | 
							
								    - match: \b0\b
							 | 
						||
| 
								 | 
							
								      scope: constant.numeric.c++
							 | 
						||
| 
								 | 
							
								    - match: \b(default|delete)\b
							 | 
						||
| 
								 | 
							
								      scope: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								    - match: '(?=\{)'
							 | 
						||
| 
								 | 
							
								      set: function-definition-body
							 | 
						||
| 
								 | 
							
								    - match: '(?=\S)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function-definition-trailing-return:
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - match: '(?=;)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: '(?=\{)'
							 | 
						||
| 
								 | 
							
								      set: function-definition-body
							 | 
						||
| 
								 | 
							
								    - include: function-specifiers
							 | 
						||
| 
								 | 
							
								    - include: function-trailing-return-type
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function-definition-body:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.function.c++ meta.block.c++
							 | 
						||
| 
								 | 
							
								    - match: '\{'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.function.c++ meta.block.c++
							 | 
						||
| 
								 | 
							
								        - match: '\}'
							 | 
						||
| 
								 | 
							
								          scope: meta.function.c++ meta.block.c++ punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: (?=^\s*#\s*(elif|else|endif)\b)
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: '(?=({{before_tag}})([^(;]+$|.*\{))'
							 | 
						||
| 
								 | 
							
								          push: data-structures
							 | 
						||
| 
								 | 
							
								        - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ## Data structures including classes, structs, unions and enums
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures:
							 | 
						||
| 
								 | 
							
								    - match: '\bclass\b'
							 | 
						||
| 
								 | 
							
								      scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								      set: data-structures-class-definition
							 | 
						||
| 
								 | 
							
								    # Detect variable type definitions using struct/enum/union followed by a tag
							 | 
						||
| 
								 | 
							
								    - match: '\b({{before_tag}})(?=\s+{{path_lookahead}}\s+{{path_lookahead}}\s*[=;\[])'
							 | 
						||
| 
								 | 
							
								      scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								    - match: '\bstruct\b'
							 | 
						||
| 
								 | 
							
								      scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								      set: data-structures-struct-definition
							 | 
						||
| 
								 | 
							
								    - match: '\benum(\s+(class|struct))?\b'
							 | 
						||
| 
								 | 
							
								      scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								      set: data-structures-enum-definition
							 | 
						||
| 
								 | 
							
								    - match: '\bunion\b'
							 | 
						||
| 
								 | 
							
								      scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								      set: data-structures-union-definition
							 | 
						||
| 
								 | 
							
								    - match: '(?=\S)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-workaround-eat-macro-before-identifier:
							 | 
						||
| 
								 | 
							
								    # Handle macros so they aren't matched as the class name
							 | 
						||
| 
								 | 
							
								    - match: ({{macro_identifier}})(?=\s+~?{{identifier}})
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.assumed-macro.c
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-class-definition:
							 | 
						||
| 
								 | 
							
								    - meta_scope: meta.class.c++
							 | 
						||
| 
								 | 
							
								    - include: data-structures-definition-common-begin
							 | 
						||
| 
								 | 
							
								    - match: '{{identifier}}(?={{data_structures_forward_decl_lookahead}})'
							 | 
						||
| 
								 | 
							
								      scope: entity.name.class.forward-decl.c++
							 | 
						||
| 
								 | 
							
								      set: data-structures-class-definition-after-identifier
							 | 
						||
| 
								 | 
							
								    - match: '{{identifier}}'
							 | 
						||
| 
								 | 
							
								      scope: entity.name.class.c++
							 | 
						||
| 
								 | 
							
								      set: data-structures-class-definition-after-identifier
							 | 
						||
| 
								 | 
							
								    - match: '(?=[:{])'
							 | 
						||
| 
								 | 
							
								      set: data-structures-class-definition-after-identifier
							 | 
						||
| 
								 | 
							
								    - match: '(?=;)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-class-definition-after-identifier:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.class.c++
							 | 
						||
| 
								 | 
							
								    - include: data-structures-definition-common-begin
							 | 
						||
| 
								 | 
							
								    # No matching of identifiers since they should all be macros at this point
							 | 
						||
| 
								 | 
							
								    - include: data-structures-definition-common-end
							 | 
						||
| 
								 | 
							
								    - match: '\{'
							 | 
						||
| 
								 | 
							
								      scope: meta.block.c++ punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.class.c++ meta.block.c++
							 | 
						||
| 
								 | 
							
								        - match: '\}'
							 | 
						||
| 
								 | 
							
								          scope: meta.class.c++ meta.block.c++ punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: data-structures-body
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-struct-definition:
							 | 
						||
| 
								 | 
							
								    - meta_scope: meta.struct.c++
							 | 
						||
| 
								 | 
							
								    - include: data-structures-definition-common-begin
							 | 
						||
| 
								 | 
							
								    - match: '{{identifier}}(?={{data_structures_forward_decl_lookahead}})'
							 | 
						||
| 
								 | 
							
								      scope: entity.name.struct.forward-decl.c++
							 | 
						||
| 
								 | 
							
								      set: data-structures-struct-definition-after-identifier
							 | 
						||
| 
								 | 
							
								    - match: '{{identifier}}'
							 | 
						||
| 
								 | 
							
								      scope: entity.name.struct.c++
							 | 
						||
| 
								 | 
							
								      set: data-structures-struct-definition-after-identifier
							 | 
						||
| 
								 | 
							
								    - match: '(?=[:{])'
							 | 
						||
| 
								 | 
							
								      set: data-structures-struct-definition-after-identifier
							 | 
						||
| 
								 | 
							
								    - match: '(?=;)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-struct-definition-after-identifier:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.struct.c++
							 | 
						||
| 
								 | 
							
								    - include: data-structures-definition-common-begin
							 | 
						||
| 
								 | 
							
								    # No matching of identifiers since they should all be macros at this point
							 | 
						||
| 
								 | 
							
								    - include: data-structures-definition-common-end
							 | 
						||
| 
								 | 
							
								    - match: '\{'
							 | 
						||
| 
								 | 
							
								      scope: meta.block.c++ punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.struct.c++ meta.block.c++
							 | 
						||
| 
								 | 
							
								        - match: '\}'
							 | 
						||
| 
								 | 
							
								          scope: meta.struct.c++ meta.block.c++ punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: data-structures-body
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-enum-definition:
							 | 
						||
| 
								 | 
							
								    - meta_scope: meta.enum.c++
							 | 
						||
| 
								 | 
							
								    - include: data-structures-definition-common-begin
							 | 
						||
| 
								 | 
							
								    - match: '{{identifier}}(?={{data_structures_forward_decl_lookahead}})'
							 | 
						||
| 
								 | 
							
								      scope: entity.name.enum.forward-decl.c++
							 | 
						||
| 
								 | 
							
								      set: data-structures-enum-definition-after-identifier
							 | 
						||
| 
								 | 
							
								    - match: '{{identifier}}'
							 | 
						||
| 
								 | 
							
								      scope: entity.name.enum.c++
							 | 
						||
| 
								 | 
							
								      set: data-structures-enum-definition-after-identifier
							 | 
						||
| 
								 | 
							
								    - match: '(?=[:{])'
							 | 
						||
| 
								 | 
							
								      set: data-structures-enum-definition-after-identifier
							 | 
						||
| 
								 | 
							
								    - match: '(?=;)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-enum-definition-after-identifier:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.enum.c++
							 | 
						||
| 
								 | 
							
								    - include: data-structures-definition-common-begin
							 | 
						||
| 
								 | 
							
								    # No matching of identifiers since they should all be macros at this point
							 | 
						||
| 
								 | 
							
								    - include: data-structures-definition-common-end
							 | 
						||
| 
								 | 
							
								    - match: '\{'
							 | 
						||
| 
								 | 
							
								      scope: meta.block.c++ punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.enum.c++ meta.block.c++
							 | 
						||
| 
								 | 
							
								        # Enums don't support methods so we have a simplified body
							 | 
						||
| 
								 | 
							
								        - match: '\}'
							 | 
						||
| 
								 | 
							
								          scope: meta.enum.c++ meta.block.c++ punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-union-definition:
							 | 
						||
| 
								 | 
							
								    - meta_scope: meta.union.c++
							 | 
						||
| 
								 | 
							
								    - include: data-structures-definition-common-begin
							 | 
						||
| 
								 | 
							
								    - match: '{{identifier}}(?={{data_structures_forward_decl_lookahead}})'
							 | 
						||
| 
								 | 
							
								      scope: entity.name.union.forward-decl.c++
							 | 
						||
| 
								 | 
							
								      set: data-structures-union-definition-after-identifier
							 | 
						||
| 
								 | 
							
								    - match: '{{identifier}}'
							 | 
						||
| 
								 | 
							
								      scope: entity.name.union.c++
							 | 
						||
| 
								 | 
							
								      set: data-structures-union-definition-after-identifier
							 | 
						||
| 
								 | 
							
								    - match: '(?=[{])'
							 | 
						||
| 
								 | 
							
								      set: data-structures-union-definition-after-identifier
							 | 
						||
| 
								 | 
							
								    - match: '(?=;)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-union-definition-after-identifier:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.union.c++
							 | 
						||
| 
								 | 
							
								    - include: data-structures-definition-common-begin
							 | 
						||
| 
								 | 
							
								    # No matching of identifiers since they should all be macros at this point
							 | 
						||
| 
								 | 
							
								    # Unions don't support base classes
							 | 
						||
| 
								 | 
							
								    - include: angle-brackets
							 | 
						||
| 
								 | 
							
								    - match: '\{'
							 | 
						||
| 
								 | 
							
								      scope: meta.block.c++ punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.union.c++ meta.block.c++
							 | 
						||
| 
								 | 
							
								        - match: '\}'
							 | 
						||
| 
								 | 
							
								          scope: meta.union.c++ meta.block.c++ punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: data-structures-body
							 | 
						||
| 
								 | 
							
								    - match: '(?=;)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-definition-common-begin:
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - match: '(?=\b(?:{{before_tag}}|{{control_keywords}})\b)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-other
							 | 
						||
| 
								 | 
							
								    - include: modifiers-parens
							 | 
						||
| 
								 | 
							
								    - include: modifiers
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-workaround-eat-macro-before-identifier
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-definition-common-end:
							 | 
						||
| 
								 | 
							
								    - include: angle-brackets
							 | 
						||
| 
								 | 
							
								    - match: \bfinal\b
							 | 
						||
| 
								 | 
							
								      scope: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								    - match: ':'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.separator.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - include: comments
							 | 
						||
| 
								 | 
							
								        - include: preprocessor-other
							 | 
						||
| 
								 | 
							
								        - include: modifiers-parens
							 | 
						||
| 
								 | 
							
								        - include: modifiers
							 | 
						||
| 
								 | 
							
								        - match: '\b(virtual|{{visibility_modifiers}})\b'
							 | 
						||
| 
								 | 
							
								          scope: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								        - match: (?={{path_lookahead}})
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - meta_scope: entity.other.inherited-class.c++
							 | 
						||
| 
								 | 
							
								            - include: identifiers
							 | 
						||
| 
								 | 
							
								            - match: ''
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								        - include: angle-brackets
							 | 
						||
| 
								 | 
							
								        - match: ','
							 | 
						||
| 
								 | 
							
								          scope: punctuation.separator.c++
							 | 
						||
| 
								 | 
							
								        - match: (?=\{|;)
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								    - match: '(?=;)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-body:
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-data-structures
							 | 
						||
| 
								 | 
							
								    - match: '(?=\btemplate\b)'
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - include: template
							 | 
						||
| 
								 | 
							
								        - match: (?=\S)
							 | 
						||
| 
								 | 
							
								          set: data-structures-modifier
							 | 
						||
| 
								 | 
							
								    - include: typedef
							 | 
						||
| 
								 | 
							
								    - match: \b({{visibility_modifiers}})\s*(:)(?!:)
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								        2: punctuation.section.class.c++
							 | 
						||
| 
								 | 
							
								    - match: '^\s*(?=(?:~?\w+|::))'
							 | 
						||
| 
								 | 
							
								      push: data-structures-modifier
							 | 
						||
| 
								 | 
							
								    - include: expressions-minus-generic-type
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-modifier:
							 | 
						||
| 
								 | 
							
								    - match: '\bfriend\b'
							 | 
						||
| 
								 | 
							
								      scope: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: (?=;)
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: '\{'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_scope: meta.block.c++
							 | 
						||
| 
								 | 
							
								            - match: '\}'
							 | 
						||
| 
								 | 
							
								              scope: punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: statements
							 | 
						||
| 
								 | 
							
								        - match: '\b({{before_tag}})\b'
							 | 
						||
| 
								 | 
							
								          scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								        - include: expressions-minus-function-call
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - include: modifiers-parens
							 | 
						||
| 
								 | 
							
								    - include: modifiers
							 | 
						||
| 
								 | 
							
								    - match: '\bstatic_assert(?=\s*\()'
							 | 
						||
| 
								 | 
							
								      scope: meta.static-assert.c++ keyword.operator.word.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: '\('
							 | 
						||
| 
								 | 
							
								          scope: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: meta.function-call.c++ meta.group.c++
							 | 
						||
| 
								 | 
							
								            - match: '\)'
							 | 
						||
| 
								 | 
							
								              scope: meta.function-call.c++ meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: expressions
							 | 
						||
| 
								 | 
							
								    # Destructor
							 | 
						||
| 
								 | 
							
								    - match: '(?:{{identifier}}\s*(::)\s*)?~{{identifier}}(?=\s*(\(|$))'
							 | 
						||
| 
								 | 
							
								      scope: meta.method.destructor.c++ entity.name.function.destructor.c++
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: punctuation.accessor.c++
							 | 
						||
| 
								 | 
							
								      set: method-definition-params
							 | 
						||
| 
								 | 
							
								    # It's a macro, not a constructor if there is no type in the first param
							 | 
						||
| 
								 | 
							
								    - match: '({{identifier}})\s*(\()(?=\s*(?!void){{identifier}}\s*[),])'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: variable.function.c++
							 | 
						||
| 
								 | 
							
								        2: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.function-call.c++
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								        - match: '\)'
							 | 
						||
| 
								 | 
							
								          scope: meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: expressions
							 | 
						||
| 
								 | 
							
								    # Constructor
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-workaround-eat-macro-before-identifier
							 | 
						||
| 
								 | 
							
								    - match: '((?!{{before_tag}}|template){{identifier}})(?=\s*\()'
							 | 
						||
| 
								 | 
							
								      scope: meta.method.constructor.c++ entity.name.function.constructor.c++
							 | 
						||
| 
								 | 
							
								      set: method-definition-params
							 | 
						||
| 
								 | 
							
								    # Long form constructor
							 | 
						||
| 
								 | 
							
								    - match: '({{identifier}}\s*(::)\s*{{identifier}})(?=\s*\()'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.method.constructor.c++ entity.name.function.constructor.c++
							 | 
						||
| 
								 | 
							
								        2: punctuation.accessor.c++
							 | 
						||
| 
								 | 
							
								      push: method-definition-params
							 | 
						||
| 
								 | 
							
								    - match: '(?=\S)'
							 | 
						||
| 
								 | 
							
								      set: data-structures-type
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-type:
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - match: \*|&
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.c++
							 | 
						||
| 
								 | 
							
								      # Cast methods
							 | 
						||
| 
								 | 
							
								    - match: '(operator)\s+({{identifier}})(?=\s*(\(|$))'
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: keyword.control.c++
							 | 
						||
| 
								 | 
							
								        2: meta.method.c++ entity.name.function.c++
							 | 
						||
| 
								 | 
							
								      set: method-definition-params
							 | 
						||
| 
								 | 
							
								    - match: '(?=\b({{control_keywords}}|{{operator_keywords}}|{{casts}}|{{memory_operators}}|{{other_keywords}}|operator)\b)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: '(?=\s)'
							 | 
						||
| 
								 | 
							
								      set: data-structures-maybe-method
							 | 
						||
| 
								 | 
							
								    # If a class/struct/enum followed by a name that is not a macro or declspec
							 | 
						||
| 
								 | 
							
								    # then this is likely a return type of a function. This is uncommon.
							 | 
						||
| 
								 | 
							
								    - match: |-
							 | 
						||
| 
								 | 
							
								        (?x:
							 | 
						||
| 
								 | 
							
								          ({{before_tag}})
							 | 
						||
| 
								 | 
							
								          \s+
							 | 
						||
| 
								 | 
							
								          (?=
							 | 
						||
| 
								 | 
							
								            (?![[:upper:][:digit:]_]+\b|__declspec|{{before_tag}})
							 | 
						||
| 
								 | 
							
								            {{path_lookahead}}
							 | 
						||
| 
								 | 
							
								            (\s+{{identifier}}\s*\(|\s*[*&])
							 | 
						||
| 
								 | 
							
								          )
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: storage.type.c++
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: ''
							 | 
						||
| 
								 | 
							
								          set: data-structures-maybe-method
							 | 
						||
| 
								 | 
							
								    # The previous match handles return types of struct/enum/etc from a func,
							 | 
						||
| 
								 | 
							
								    # there this one exits the context to allow matching an actual struct/class
							 | 
						||
| 
								 | 
							
								    - match: '(?=\b({{before_tag}})\b)'
							 | 
						||
| 
								 | 
							
								      set: data-structures
							 | 
						||
| 
								 | 
							
								    - match: '(?=\b({{casts}})\b\s*<)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: '{{non_angle_brackets}}'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: angle-brackets
							 | 
						||
| 
								 | 
							
								    - include: types
							 | 
						||
| 
								 | 
							
								    - include: variables
							 | 
						||
| 
								 | 
							
								    - include: constants
							 | 
						||
| 
								 | 
							
								    - include: identifiers
							 | 
						||
| 
								 | 
							
								    - match: (?=[&*])
							 | 
						||
| 
								 | 
							
								      set: data-structures-maybe-method
							 | 
						||
| 
								 | 
							
								    - match: (?=\W)
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-maybe-method:
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    # Consume pointer info, macros and any type info that was offset by macros
							 | 
						||
| 
								 | 
							
								    - match: \*|&
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.c++
							 | 
						||
| 
								 | 
							
								    - match: '(?=\b({{control_keywords}}|{{operator_keywords}}|{{casts}}|{{memory_operators}}|{{other_keywords}})\b)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: '\b({{type_qualifier}})\b'
							 | 
						||
| 
								 | 
							
								      scope: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								    - match: '{{non_angle_brackets}}'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: angle-brackets
							 | 
						||
| 
								 | 
							
								    - include: types
							 | 
						||
| 
								 | 
							
								    - include: modifiers-parens
							 | 
						||
| 
								 | 
							
								    - include: modifiers
							 | 
						||
| 
								 | 
							
								    # Operator overloading
							 | 
						||
| 
								 | 
							
								    - match: '{{operator_method_name}}(?=\s*(\(|$))'
							 | 
						||
| 
								 | 
							
								      scope: meta.method.c++ entity.name.function.c++
							 | 
						||
| 
								 | 
							
								      set: method-definition-params
							 | 
						||
| 
								 | 
							
								    # Identifier that is not the function name - likely a macro or type
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}([ \t]+|[*&])(?!\s*(<|::|\()))'
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: ''
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								    # Real function definition
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}({{generic_lookahead}})\s*(\())'
							 | 
						||
| 
								 | 
							
								      set: [method-definition-params, data-structures-function-identifier-generic]
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}\s*(\())'
							 | 
						||
| 
								 | 
							
								      set: [method-definition-params, data-structures-function-identifier]
							 | 
						||
| 
								 | 
							
								    - match: '(?={{path_lookahead}}\s*::\s*$)'
							 | 
						||
| 
								 | 
							
								      set: [method-definition-params, data-structures-function-identifier]
							 | 
						||
| 
								 | 
							
								    - match: '(?=\S)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-function-identifier-generic:
							 | 
						||
| 
								 | 
							
								    - include: angle-brackets
							 | 
						||
| 
								 | 
							
								    - match: '(?={{identifier}})'
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: entity.name.function.c++
							 | 
						||
| 
								 | 
							
								        - include: identifiers
							 | 
						||
| 
								 | 
							
								        - match: '(?=<)'
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								    - match: '(?=\()'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  data-structures-function-identifier:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: entity.name.function.c++
							 | 
						||
| 
								 | 
							
								    - include: identifiers
							 | 
						||
| 
								 | 
							
								    - match: '(?=\S)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  method-definition-params:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.method.c++
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - match: '(?=\()'
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - match: \(
							 | 
						||
| 
								 | 
							
								          scope: meta.method.parameters.c++ meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: meta.method.parameters.c++ meta.group.c++
							 | 
						||
| 
								 | 
							
								            - match : \)
							 | 
						||
| 
								 | 
							
								              scope: punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								              set: method-definition-continue
							 | 
						||
| 
								 | 
							
								            - match: '\bvoid\b'
							 | 
						||
| 
								 | 
							
								              scope: storage.type.c++
							 | 
						||
| 
								 | 
							
								            - match: '{{identifier}}(?=\s*(\[|,|\)|=))'
							 | 
						||
| 
								 | 
							
								              scope: variable.parameter.c++
							 | 
						||
| 
								 | 
							
								            - match: '='
							 | 
						||
| 
								 | 
							
								              scope: keyword.operator.assignment.c++
							 | 
						||
| 
								 | 
							
								              push:
							 | 
						||
| 
								 | 
							
								                - match: '(?=,|\))'
							 | 
						||
| 
								 | 
							
								                  pop: true
							 | 
						||
| 
								 | 
							
								                - include: expressions-minus-generic-type
							 | 
						||
| 
								 | 
							
								            - include: expressions-minus-generic-type
							 | 
						||
| 
								 | 
							
								    - match: '(?=\S)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  method-definition-continue:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.method.c++
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - match: '(?=;)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: '->'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.separator.c++
							 | 
						||
| 
								 | 
							
								      set: method-definition-trailing-return
							 | 
						||
| 
								 | 
							
								    - include: function-specifiers
							 | 
						||
| 
								 | 
							
								    - match: '='
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.assignment.c++
							 | 
						||
| 
								 | 
							
								    - match: '&'
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.c++
							 | 
						||
| 
								 | 
							
								    - match: \b0\b
							 | 
						||
| 
								 | 
							
								      scope: constant.numeric.c++
							 | 
						||
| 
								 | 
							
								    - match: \b(default|delete)\b
							 | 
						||
| 
								 | 
							
								      scope: storage.modifier.c++
							 | 
						||
| 
								 | 
							
								    - match: '(?=:)'
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - match: ':'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.separator.initializer-list.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - meta_scope: meta.method.constructor.initializer-list.c++
							 | 
						||
| 
								 | 
							
								            - match: '{{identifier}}'
							 | 
						||
| 
								 | 
							
								              scope: variable.other.readwrite.member.c++
							 | 
						||
| 
								 | 
							
								              push:
							 | 
						||
| 
								 | 
							
								                - match: \(
							 | 
						||
| 
								 | 
							
								                  scope: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								                  set:
							 | 
						||
| 
								 | 
							
								                    - meta_content_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								                    - match: \)
							 | 
						||
| 
								 | 
							
								                      scope: meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								                      pop: true
							 | 
						||
| 
								 | 
							
								                    - include: expressions
							 | 
						||
| 
								 | 
							
								                - match: \{
							 | 
						||
| 
								 | 
							
								                  scope: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								                  set:
							 | 
						||
| 
								 | 
							
								                    - meta_content_scope: meta.group.c++
							 | 
						||
| 
								 | 
							
								                    - match: \}
							 | 
						||
| 
								 | 
							
								                      scope: meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								                      pop: true
							 | 
						||
| 
								 | 
							
								                    - include: expressions
							 | 
						||
| 
								 | 
							
								                - include: comments
							 | 
						||
| 
								 | 
							
								            - match: (?=\{|;)
							 | 
						||
| 
								 | 
							
								              set: method-definition-continue
							 | 
						||
| 
								 | 
							
								            - include: expressions
							 | 
						||
| 
								 | 
							
								    - match: '(?=\{)'
							 | 
						||
| 
								 | 
							
								      set: method-definition-body
							 | 
						||
| 
								 | 
							
								    - match: '(?=\S)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  method-definition-trailing-return:
							 | 
						||
| 
								 | 
							
								    - include: comments
							 | 
						||
| 
								 | 
							
								    - match: '(?=;)'
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: '(?=\{)'
							 | 
						||
| 
								 | 
							
								      set: method-definition-body
							 | 
						||
| 
								 | 
							
								    - include: function-specifiers
							 | 
						||
| 
								 | 
							
								    - include: function-trailing-return-type
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  method-definition-body:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.method.c++ meta.block.c++
							 | 
						||
| 
								 | 
							
								    - match: '\{'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								      set:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.method.c++ meta.block.c++
							 | 
						||
| 
								 | 
							
								        - match: '\}'
							 | 
						||
| 
								 | 
							
								          scope: meta.method.c++ meta.block.c++ punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: (?=^\s*#\s*(elif|else|endif)\b)
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: '(?=({{before_tag}})([^(;]+$|.*\{))'
							 | 
						||
| 
								 | 
							
								          push: data-structures
							 | 
						||
| 
								 | 
							
								        - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ## Preprocessor for data-structures
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-data-structures:
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-rule-enabled-data-structures
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-rule-disabled-data-structures
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-practical-workarounds
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-rule-disabled-data-structures:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*((#if)\s+(0))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++
							 | 
						||
| 
								 | 
							
								        2: keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								        3: constant.numeric.preprocessor.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: ^\s*(#\s*else)\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: meta.preprocessor.c++ keyword.control.import.else.c++
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - match: (?=^\s*#\s*endif\b)
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: negated-block
							 | 
						||
| 
								 | 
							
								            - include: data-structures-body
							 | 
						||
| 
								 | 
							
								        - match: ""
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - meta_scope: comment.block.preprocessor.if-branch.c++
							 | 
						||
| 
								 | 
							
								            - match: (?=^\s*#\s*(else|endif)\b)
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: scope:source.c#preprocessor-disabled
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-rule-enabled-data-structures:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*((#if)\s+(0*1))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++
							 | 
						||
| 
								 | 
							
								        2: keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								        3: constant.numeric.preprocessor.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: ^\s*(#\s*else)\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: meta.preprocessor.c++ keyword.control.import.else.c++
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: comment.block.preprocessor.else-branch.c++
							 | 
						||
| 
								 | 
							
								            - match: (?=^\s*#\s*endif\b)
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: scope:source.c#preprocessor-disabled
							 | 
						||
| 
								 | 
							
								        - match: ""
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - match: (?=^\s*#\s*(else|endif)\b)
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: negated-block
							 | 
						||
| 
								 | 
							
								            - include: data-structures-body
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ## Preprocessor for global
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-global:
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-rule-enabled-global
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-rule-disabled-global
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-rule-other-global
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-statements:
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-rule-enabled-statements
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-rule-disabled-statements
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-rule-other-statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-expressions:
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#incomplete-inc
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-macro-define
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#pragma-mark
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-other
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-rule-disabled-global:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*((#if)\s+(0))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++
							 | 
						||
| 
								 | 
							
								        2: keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								        3: constant.numeric.preprocessor.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: ^\s*(#\s*else)\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: meta.preprocessor.c++ keyword.control.import.else.c++
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - match: (?=^\s*#\s*endif\b)
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: preprocessor-global
							 | 
						||
| 
								 | 
							
								            - include: negated-block
							 | 
						||
| 
								 | 
							
								            - include: global
							 | 
						||
| 
								 | 
							
								        - match: ""
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - meta_scope: comment.block.preprocessor.if-branch.c++
							 | 
						||
| 
								 | 
							
								            - match: (?=^\s*#\s*(else|endif)\b)
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: scope:source.c#preprocessor-disabled
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-rule-enabled-global:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*((#if)\s+(0*1))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++
							 | 
						||
| 
								 | 
							
								        2: keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								        3: constant.numeric.preprocessor.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: ^\s*(#\s*else)\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: meta.preprocessor.c++ keyword.control.import.else.c++
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: comment.block.preprocessor.else-branch.c++
							 | 
						||
| 
								 | 
							
								            - match: (?=^\s*#\s*endif\b)
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: scope:source.c#preprocessor-disabled
							 | 
						||
| 
								 | 
							
								        - match: ""
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - match: (?=^\s*#\s*(else|endif)\b)
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: preprocessor-global
							 | 
						||
| 
								 | 
							
								            - include: negated-block
							 | 
						||
| 
								 | 
							
								            - include: global
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-rule-other-global:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*(?:if|ifdef|ifndef))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.preprocessor.c++
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-line-continuation
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-comments
							 | 
						||
| 
								 | 
							
								        - match: \bdefined\b
							 | 
						||
| 
								 | 
							
								          scope: keyword.control.c++
							 | 
						||
| 
								 | 
							
								        # Enter a new scope where all elif/else branches have their
							 | 
						||
| 
								 | 
							
								        # contexts popped by a subsequent elif/else/endif. This ensures that
							 | 
						||
| 
								 | 
							
								        # preprocessor branches don't push multiple meta.block scopes on
							 | 
						||
| 
								 | 
							
								        # the stack, thus messing up the "global" context's detection of
							 | 
						||
| 
								 | 
							
								        # functions.
							 | 
						||
| 
								 | 
							
								        - match: $\n
							 | 
						||
| 
								 | 
							
								          set: preprocessor-if-branch-global
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  # These gymnastics here ensure that we are properly handling scope even
							 | 
						||
| 
								 | 
							
								  # when the preprocessor is used to create different scope beginnings, such
							 | 
						||
| 
								 | 
							
								  # as a different if/while condition
							 | 
						||
| 
								 | 
							
								  preprocessor-if-branch-global:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: (?=^\s*#\s*(elif|else)\b)
							 | 
						||
| 
								 | 
							
								      push: preprocessor-elif-else-branch-global
							 | 
						||
| 
								 | 
							
								    - match: \{
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-block-if-branch-global
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-global
							 | 
						||
| 
								 | 
							
								    - include: negated-block
							 | 
						||
| 
								 | 
							
								    - include: global
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-block-if-branch-global:
							 | 
						||
| 
								 | 
							
								    - meta_scope: meta.block.c++
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-block-finish-global
							 | 
						||
| 
								 | 
							
								    - match: (?=^\s*#\s*(elif|else)\b)
							 | 
						||
| 
								 | 
							
								      push: preprocessor-elif-else-branch-global
							 | 
						||
| 
								 | 
							
								    - match: \}
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-if-branch-global
							 | 
						||
| 
								 | 
							
								    - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-block-finish-global:
							 | 
						||
| 
								 | 
							
								    - meta_scope: meta.block.c++
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*(?:if|ifdef|ifndef))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-block-finish-if-branch-global
							 | 
						||
| 
								 | 
							
								    - match: \}
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-block-finish-if-branch-global:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: \}
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-if-branch-global
							 | 
						||
| 
								 | 
							
								    - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-elif-else-branch-global:
							 | 
						||
| 
								 | 
							
								    - match: (?=^\s*#\s*(endif)\b)
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-global
							 | 
						||
| 
								 | 
							
								    - include: negated-block
							 | 
						||
| 
								 | 
							
								    - include: global
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ## Preprocessor for statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-rule-disabled-statements:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*((#if)\s+(0))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++
							 | 
						||
| 
								 | 
							
								        2: keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								        3: constant.numeric.preprocessor.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: ^\s*(#\s*else)\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: meta.preprocessor.c++ keyword.control.import.else.c++
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - match: (?=^\s*#\s*endif\b)
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: negated-block
							 | 
						||
| 
								 | 
							
								            - include: statements
							 | 
						||
| 
								 | 
							
								        - match: ""
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - meta_scope: comment.block.preprocessor.if-branch.c++
							 | 
						||
| 
								 | 
							
								            - match: (?=^\s*#\s*(else|endif)\b)
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: scope:source.c#preprocessor-disabled
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-rule-enabled-statements:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*((#if)\s+(0*1))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++
							 | 
						||
| 
								 | 
							
								        2: keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								        3: constant.numeric.preprocessor.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: ^\s*(#\s*else)\b
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: meta.preprocessor.c++ keyword.control.import.else.c++
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - meta_content_scope: comment.block.preprocessor.else-branch.c++
							 | 
						||
| 
								 | 
							
								            - match: (?=^\s*#\s*endif\b)
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: scope:source.c#preprocessor-disabled
							 | 
						||
| 
								 | 
							
								        - match: ""
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - match: (?=^\s*#\s*(else|endif)\b)
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								            - include: negated-block
							 | 
						||
| 
								 | 
							
								            - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-rule-other-statements:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*(?:if|ifdef|ifndef))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.preprocessor.c++
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-line-continuation
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-comments
							 | 
						||
| 
								 | 
							
								        - match: \bdefined\b
							 | 
						||
| 
								 | 
							
								          scope: keyword.control.c++
							 | 
						||
| 
								 | 
							
								        # Enter a new scope where all elif/else branches have their
							 | 
						||
| 
								 | 
							
								        # contexts popped by a subsequent elif/else/endif. This ensures that
							 | 
						||
| 
								 | 
							
								        # preprocessor branches don't push multiple meta.block scopes on
							 | 
						||
| 
								 | 
							
								        # the stack, thus messing up the "global" context's detection of
							 | 
						||
| 
								 | 
							
								        # functions.
							 | 
						||
| 
								 | 
							
								        - match: $\n
							 | 
						||
| 
								 | 
							
								          set: preprocessor-if-branch-statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  # These gymnastics here ensure that we are properly handling scope even
							 | 
						||
| 
								 | 
							
								  # when the preprocessor is used to create different scope beginnings, such
							 | 
						||
| 
								 | 
							
								  # as a different if/while condition
							 | 
						||
| 
								 | 
							
								  preprocessor-if-branch-statements:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: (?=^\s*#\s*(elif|else)\b)
							 | 
						||
| 
								 | 
							
								      push: preprocessor-elif-else-branch-statements
							 | 
						||
| 
								 | 
							
								    - match: \{
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-block-if-branch-statements
							 | 
						||
| 
								 | 
							
								    - match: (?=(?!{{non_func_keywords}}){{path_lookahead}}\s*\()
							 | 
						||
| 
								 | 
							
								      set: preprocessor-if-branch-function-call
							 | 
						||
| 
								 | 
							
								    - include: negated-block
							 | 
						||
| 
								 | 
							
								    - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-if-branch-function-call:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.function-call.c++
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#c99
							 | 
						||
| 
								 | 
							
								    - match: '(?:(::)\s*)?{{identifier}}\s*(::)\s*'
							 | 
						||
| 
								 | 
							
								      scope: variable.function.c++
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: punctuation.accessor.c++
							 | 
						||
| 
								 | 
							
								        2: punctuation.accessor.c++
							 | 
						||
| 
								 | 
							
								    - match: '(?:(::)\s*)?{{identifier}}'
							 | 
						||
| 
								 | 
							
								      scope: variable.function.c++
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: punctuation.accessor.c++
							 | 
						||
| 
								 | 
							
								    - match: '\('
							 | 
						||
| 
								 | 
							
								      scope: meta.group.c++ punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-if-branch-function-call-arguments
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-if-branch-function-call-arguments:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.function-call.c++ meta.group.c++
							 | 
						||
| 
								 | 
							
								    - match : \)
							 | 
						||
| 
								 | 
							
								      scope: meta.function-call.c++ meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-if-branch-statements
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*(?:elif|else))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-if-branch-statements
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-if-branch-function-call-arguments-finish
							 | 
						||
| 
								 | 
							
								    - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-if-branch-function-call-arguments-finish:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.function-call.c++ meta.group.c++
							 | 
						||
| 
								 | 
							
								    - match: \)
							 | 
						||
| 
								 | 
							
								      scope: meta.function-call.c++ meta.group.c++ punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-block-if-branch-statements:
							 | 
						||
| 
								 | 
							
								    - meta_scope: meta.block.c++
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-block-finish-statements
							 | 
						||
| 
								 | 
							
								    - match: (?=^\s*#\s*(elif|else)\b)
							 | 
						||
| 
								 | 
							
								      push: preprocessor-elif-else-branch-statements
							 | 
						||
| 
								 | 
							
								    - match: \}
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-if-branch-statements
							 | 
						||
| 
								 | 
							
								    - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-block-finish-statements:
							 | 
						||
| 
								 | 
							
								    - meta_scope: meta.block.c++
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*(?:if|ifdef|ifndef))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-block-finish-if-branch-statements
							 | 
						||
| 
								 | 
							
								    - match: \}
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-block-finish-if-branch-statements:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - match: \}
							 | 
						||
| 
								 | 
							
								      scope: meta.block.c++ punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-if-branch-statements
							 | 
						||
| 
								 | 
							
								    - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-elif-else-branch-statements:
							 | 
						||
| 
								 | 
							
								    - match: (?=^\s*#\s*endif\b)
							 | 
						||
| 
								 | 
							
								      pop: true
							 | 
						||
| 
								 | 
							
								    - include: negated-block
							 | 
						||
| 
								 | 
							
								    - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ## Preprocessor other
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  negated-block:
							 | 
						||
| 
								 | 
							
								    - match: '\}'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: '\{'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: (?=^\s*#\s*(elif|else|endif)\b)
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: statements
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-macro-define:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(\#\s*define)\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.macro.c++ keyword.control.import.define.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_content_scope: meta.preprocessor.macro.c++
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-line-continuation
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-line-ending
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-comments
							 | 
						||
| 
								 | 
							
								        - match: '({{identifier}})(?=\()'
							 | 
						||
| 
								 | 
							
								          scope: entity.name.function.preprocessor.c++
							 | 
						||
| 
								 | 
							
								          set:
							 | 
						||
| 
								 | 
							
								            - match: '\('
							 | 
						||
| 
								 | 
							
								              scope: punctuation.section.group.begin.c++
							 | 
						||
| 
								 | 
							
								              set: preprocessor-macro-params
							 | 
						||
| 
								 | 
							
								        - match: '{{identifier}}'
							 | 
						||
| 
								 | 
							
								          scope: entity.name.constant.preprocessor.c++
							 | 
						||
| 
								 | 
							
								          set: preprocessor-macro-definition
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-macro-params:
							 | 
						||
| 
								 | 
							
								    - meta_scope: meta.preprocessor.macro.parameters.c++ meta.group.c++
							 | 
						||
| 
								 | 
							
								    - match: '{{identifier}}'
							 | 
						||
| 
								 | 
							
								      scope: variable.parameter.c++
							 | 
						||
| 
								 | 
							
								    - match: \)
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.group.end.c++
							 | 
						||
| 
								 | 
							
								      set: preprocessor-macro-definition
							 | 
						||
| 
								 | 
							
								    - match: ','
							 | 
						||
| 
								 | 
							
								      scope: punctuation.separator.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - match: '{{identifier}}'
							 | 
						||
| 
								 | 
							
								          scope: variable.parameter.c++
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-line-continuation
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-comments
							 | 
						||
| 
								 | 
							
								        - match: '\.\.\.'
							 | 
						||
| 
								 | 
							
								          scope: keyword.operator.variadic.c++
							 | 
						||
| 
								 | 
							
								        - match: '(?=\))'
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								        - match: (/\*).*(\*/)
							 | 
						||
| 
								 | 
							
								          scope: comment.block.c++
							 | 
						||
| 
								 | 
							
								          captures:
							 | 
						||
| 
								 | 
							
								            1: punctuation.definition.comment.c++
							 | 
						||
| 
								 | 
							
								            2: punctuation.definition.comment.c++
							 | 
						||
| 
								 | 
							
								        - match: '\S+'
							 | 
						||
| 
								 | 
							
								          scope: invalid.illegal.unexpected-character.c++
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#preprocessor-line-continuation
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#preprocessor-comments
							 | 
						||
| 
								 | 
							
								    - match: '\.\.\.'
							 | 
						||
| 
								 | 
							
								      scope: keyword.operator.variadic.c++
							 | 
						||
| 
								 | 
							
								    - match: (/\*).*(\*/)
							 | 
						||
| 
								 | 
							
								      scope: comment.block.c++
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: punctuation.definition.comment.c++
							 | 
						||
| 
								 | 
							
								        2: punctuation.definition.comment.c++
							 | 
						||
| 
								 | 
							
								    - match: $\n
							 | 
						||
| 
								 | 
							
								      scope: invalid.illegal.unexpected-end-of-line.c++
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-macro-definition:
							 | 
						||
| 
								 | 
							
								    - meta_content_scope: meta.preprocessor.macro.c++
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#preprocessor-line-continuation
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#preprocessor-line-ending
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#preprocessor-comments
							 | 
						||
| 
								 | 
							
								    # Don't define blocks in define statements
							 | 
						||
| 
								 | 
							
								    - match: '\{'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.begin.c++
							 | 
						||
| 
								 | 
							
								    - match: '\}'
							 | 
						||
| 
								 | 
							
								      scope: punctuation.section.block.end.c++
							 | 
						||
| 
								 | 
							
								    - include: expressions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-practical-workarounds:
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-convention-ignore-uppercase-ident-lines
							 | 
						||
| 
								 | 
							
								    - include: scope:source.c#preprocessor-convention-ignore-uppercase-calls-without-semicolon
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-convention-ignore-uppercase-ident-lines:
							 | 
						||
| 
								 | 
							
								    - match: ^(\s*{{macro_identifier}})+\s*$
							 | 
						||
| 
								 | 
							
								      scope: meta.assumed-macro.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        # It's possible that we are dealing with a function return type on its own line, and the
							 | 
						||
| 
								 | 
							
								        # name of the function is on the subsequent line.
							 | 
						||
| 
								 | 
							
								        - match: '(?={{path_lookahead}}({{generic_lookahead}}({{path_lookahead}})?)\s*\()'
							 | 
						||
| 
								 | 
							
								          set: [function-definition-params, global-function-identifier-generic]
							 | 
						||
| 
								 | 
							
								        - match: '(?={{path_lookahead}}\s*\()'
							 | 
						||
| 
								 | 
							
								          set: [function-definition-params, global-function-identifier]
							 | 
						||
| 
								 | 
							
								        - match: ^
							 | 
						||
| 
								 | 
							
								          pop: true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  preprocessor-other:
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*(?:if|ifdef|ifndef|elif|else|line|pragma|undef))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.preprocessor.c++
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-line-continuation
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-line-ending
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-comments
							 | 
						||
| 
								 | 
							
								        - match: \bdefined\b
							 | 
						||
| 
								 | 
							
								          scope: keyword.control.c++
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*endif)\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: meta.preprocessor.c++ keyword.control.import.c++
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*(?:error|warning))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: keyword.control.import.error.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.preprocessor.diagnostic.c++
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-line-continuation
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-line-ending
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-comments
							 | 
						||
| 
								 | 
							
								        - include: strings
							 | 
						||
| 
								 | 
							
								        - match: '\S+'
							 | 
						||
| 
								 | 
							
								          scope: string.unquoted.c++
							 | 
						||
| 
								 | 
							
								    - match: ^\s*(#\s*(?:include|include_next|import))\b
							 | 
						||
| 
								 | 
							
								      captures:
							 | 
						||
| 
								 | 
							
								        1: keyword.control.import.include.c++
							 | 
						||
| 
								 | 
							
								      push:
							 | 
						||
| 
								 | 
							
								        - meta_scope: meta.preprocessor.include.c++
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-line-continuation
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-line-ending
							 | 
						||
| 
								 | 
							
								        - include: scope:source.c#preprocessor-comments
							 | 
						||
| 
								 | 
							
								        - match: '"'
							 | 
						||
| 
								 | 
							
								          scope: punctuation.definition.string.begin.c++
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - meta_scope: string.quoted.double.include.c++
							 | 
						||
| 
								 | 
							
								            - match: '"'
							 | 
						||
| 
								 | 
							
								              scope: punctuation.definition.string.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								        - match: <
							 | 
						||
| 
								 | 
							
								          scope: punctuation.definition.string.begin.c++
							 | 
						||
| 
								 | 
							
								          push:
							 | 
						||
| 
								 | 
							
								            - meta_scope: string.quoted.other.lt-gt.include.c++
							 | 
						||
| 
								 | 
							
								            - match: '>'
							 | 
						||
| 
								 | 
							
								              scope: punctuation.definition.string.end.c++
							 | 
						||
| 
								 | 
							
								              pop: true
							 | 
						||
| 
								 | 
							
								    - include: preprocessor-practical-workarounds
							 |