xref: /aosp_15_r20/external/fmtlib/support/C++.sublime-syntax (revision 5c90c05cd622c0a81b57953a4d343e0e489f2e08)
1*5c90c05cSAndroid Build Coastguard Worker%YAML 1.2
2*5c90c05cSAndroid Build Coastguard Worker---
3*5c90c05cSAndroid Build Coastguard Worker# http://www.sublimetext.com/docs/3/syntax.html
4*5c90c05cSAndroid Build Coastguard Workername: C++ (fmt)
5*5c90c05cSAndroid Build Coastguard Workercomment: I don't think anyone uses .hp. .cp tends to be paired with .h. (I could be wrong. :) -- chris
6*5c90c05cSAndroid Build Coastguard Workerfile_extensions:
7*5c90c05cSAndroid Build Coastguard Worker  - cpp
8*5c90c05cSAndroid Build Coastguard Worker  - cc
9*5c90c05cSAndroid Build Coastguard Worker  - cp
10*5c90c05cSAndroid Build Coastguard Worker  - cxx
11*5c90c05cSAndroid Build Coastguard Worker  - c++
12*5c90c05cSAndroid Build Coastguard Worker  - C
13*5c90c05cSAndroid Build Coastguard Worker  - h
14*5c90c05cSAndroid Build Coastguard Worker  - hh
15*5c90c05cSAndroid Build Coastguard Worker  - hpp
16*5c90c05cSAndroid Build Coastguard Worker  - hxx
17*5c90c05cSAndroid Build Coastguard Worker  - h++
18*5c90c05cSAndroid Build Coastguard Worker  - inl
19*5c90c05cSAndroid Build Coastguard Worker  - ipp
20*5c90c05cSAndroid Build Coastguard Workerfirst_line_match: '-\*- C\+\+ -\*-'
21*5c90c05cSAndroid Build Coastguard Workerscope: source.c++
22*5c90c05cSAndroid Build Coastguard Workervariables:
23*5c90c05cSAndroid Build Coastguard Worker  identifier: \b[[:alpha:]_][[:alnum:]_]*\b # upper and lowercase
24*5c90c05cSAndroid Build Coastguard Worker  macro_identifier: \b[[:upper:]_][[:upper:][:digit:]_]{2,}\b # only uppercase, at least 3 chars
25*5c90c05cSAndroid Build Coastguard Worker  path_lookahead: '(?:::\s*)?(?:{{identifier}}\s*::\s*)*(?:template\s+)?{{identifier}}'
26*5c90c05cSAndroid Build Coastguard Worker  operator_method_name: '\boperator\s*(?:[-+*/%^&|~!=<>]|[-+*/%^&|=!<>]=|<<=?|>>=?|&&|\|\||\+\+|--|,|->\*?|\(\)|\[\]|""\s*{{identifier}})'
27*5c90c05cSAndroid Build Coastguard Worker  casts: 'const_cast|dynamic_cast|reinterpret_cast|static_cast'
28*5c90c05cSAndroid Build Coastguard Worker  operator_keywords: 'and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|xor|xor_eq|noexcept'
29*5c90c05cSAndroid Build Coastguard Worker  control_keywords: 'break|case|catch|continue|default|do|else|for|goto|if|_Pragma|return|switch|throw|try|while'
30*5c90c05cSAndroid Build Coastguard Worker  memory_operators: 'new|delete'
31*5c90c05cSAndroid Build Coastguard Worker  basic_types: 'asm|__asm__|auto|bool|_Bool|char|_Complex|double|float|_Imaginary|int|long|short|signed|unsigned|void'
32*5c90c05cSAndroid Build Coastguard Worker  before_tag: 'struct|union|enum\s+class|enum\s+struct|enum|class'
33*5c90c05cSAndroid Build Coastguard Worker  declspec: '__declspec\(\s*\w+(?:\([^)]+\))?\s*\)'
34*5c90c05cSAndroid Build Coastguard Worker  storage_classes: 'static|export|extern|friend|explicit|virtual|register|thread_local'
35*5c90c05cSAndroid Build Coastguard Worker  type_qualifier: 'const|constexpr|mutable|typename|volatile'
36*5c90c05cSAndroid Build Coastguard Worker  compiler_directive: 'inline|restrict|__restrict__|__restrict'
37*5c90c05cSAndroid Build Coastguard Worker  visibility_modifiers: 'private|protected|public'
38*5c90c05cSAndroid Build Coastguard Worker  other_keywords: 'typedef|nullptr|{{visibility_modifiers}}|static_assert|sizeof|using|typeid|alignof|alignas|namespace|template'
39*5c90c05cSAndroid Build Coastguard Worker  modifiers: '{{storage_classes}}|{{type_qualifier}}|{{compiler_directive}}'
40*5c90c05cSAndroid Build Coastguard Worker  non_angle_brackets: '(?=<<|<=)'
41*5c90c05cSAndroid Build Coastguard Worker
42*5c90c05cSAndroid Build Coastguard Worker  regular: '[^(){}&;*^%=<>-]*'
43*5c90c05cSAndroid Build Coastguard Worker  paren_open: (?:\(
44*5c90c05cSAndroid Build Coastguard Worker  paren_close: '\))?'
45*5c90c05cSAndroid Build Coastguard Worker  generic_open: (?:<
46*5c90c05cSAndroid Build Coastguard Worker  generic_close: '>)?'
47*5c90c05cSAndroid Build Coastguard Worker  balance_parentheses: '{{regular}}{{paren_open}}{{regular}}{{paren_close}}{{regular}}'
48*5c90c05cSAndroid Build Coastguard Worker  generic_lookahead: <{{regular}}{{generic_open}}{{regular}}{{generic_open}}{{regular}}{{generic_close}}\s*{{generic_close}}{{balance_parentheses}}>
49*5c90c05cSAndroid Build Coastguard Worker
50*5c90c05cSAndroid Build Coastguard Worker  data_structures_forward_decl_lookahead: '(\s+{{macro_identifier}})*\s*(:\s*({{path_lookahead}}|{{visibility_modifiers}}|,|\s|<[^;]*>)+)?;'
51*5c90c05cSAndroid Build Coastguard Worker  non_func_keywords: 'if|for|switch|while|decltype|sizeof|__declspec|__attribute__|typeid|alignof|alignas|static_assert'
52*5c90c05cSAndroid Build Coastguard Worker
53*5c90c05cSAndroid Build Coastguard Worker  format_spec: |-
54*5c90c05cSAndroid Build Coastguard Worker    (?x:
55*5c90c05cSAndroid Build Coastguard Worker      (?:.? [<>=^])?     # fill align
56*5c90c05cSAndroid Build Coastguard Worker      [ +-]?             # sign
57*5c90c05cSAndroid Build Coastguard Worker      \#?                # alternate form
58*5c90c05cSAndroid Build Coastguard Worker      # technically, octal and hexadecimal integers are also supported as 'width', but rarely used
59*5c90c05cSAndroid Build Coastguard Worker      \d*                # width
60*5c90c05cSAndroid Build Coastguard Worker      ,?                 # thousands separator
61*5c90c05cSAndroid Build Coastguard Worker      (?:\.\d+)?         # precision
62*5c90c05cSAndroid Build Coastguard Worker      [bcdeEfFgGnosxX%]? # type
63*5c90c05cSAndroid Build Coastguard Worker    )
64*5c90c05cSAndroid Build Coastguard Worker
65*5c90c05cSAndroid Build Coastguard Workercontexts:
66*5c90c05cSAndroid Build Coastguard Worker  main:
67*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-global
68*5c90c05cSAndroid Build Coastguard Worker    - include: global
69*5c90c05cSAndroid Build Coastguard Worker
70*5c90c05cSAndroid Build Coastguard Worker  #############################################################################
71*5c90c05cSAndroid Build Coastguard Worker  # Reusable contexts
72*5c90c05cSAndroid Build Coastguard Worker  #
73*5c90c05cSAndroid Build Coastguard Worker  # The follow contexts are currently constructed to be reused in the
74*5c90c05cSAndroid Build Coastguard Worker  # Objetive-C++ syntax. They are specifically constructed to not push into
75*5c90c05cSAndroid Build Coastguard Worker  # sub-contexts, which ensures that Objective-C++ code isn't accidentally
76*5c90c05cSAndroid Build Coastguard Worker  # lexed as plain C++.
77*5c90c05cSAndroid Build Coastguard Worker  #
78*5c90c05cSAndroid Build Coastguard Worker  # The "unique-*" contexts are additions that C++ makes over C, and thus can
79*5c90c05cSAndroid Build Coastguard Worker  # be directly reused in Objective-C++ along with contexts from Objective-C
80*5c90c05cSAndroid Build Coastguard Worker  # and C.
81*5c90c05cSAndroid Build Coastguard Worker  #############################################################################
82*5c90c05cSAndroid Build Coastguard Worker
83*5c90c05cSAndroid Build Coastguard Worker  unique-late-expressions:
84*5c90c05cSAndroid Build Coastguard Worker    # This is highlighted after all of the other control keywords
85*5c90c05cSAndroid Build Coastguard Worker    # to allow operator overloading to be lexed properly
86*5c90c05cSAndroid Build Coastguard Worker    - match: \boperator\b
87*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.control.c++
88*5c90c05cSAndroid Build Coastguard Worker
89*5c90c05cSAndroid Build Coastguard Worker  unique-modifiers:
90*5c90c05cSAndroid Build Coastguard Worker    - match: \b({{modifiers}})\b
91*5c90c05cSAndroid Build Coastguard Worker      scope: storage.modifier.c++
92*5c90c05cSAndroid Build Coastguard Worker
93*5c90c05cSAndroid Build Coastguard Worker  unique-variables:
94*5c90c05cSAndroid Build Coastguard Worker    - match: \bthis\b
95*5c90c05cSAndroid Build Coastguard Worker      scope: variable.language.c++
96*5c90c05cSAndroid Build Coastguard Worker    # common C++ instance var naming idiom -- fMemberName
97*5c90c05cSAndroid Build Coastguard Worker    - match: '\b(f|m)[[:upper:]]\w*\b'
98*5c90c05cSAndroid Build Coastguard Worker      scope: variable.other.readwrite.member.c++
99*5c90c05cSAndroid Build Coastguard Worker    # common C++ instance var naming idiom -- m_member_name
100*5c90c05cSAndroid Build Coastguard Worker    - match: '\bm_[[:alnum:]_]+\b'
101*5c90c05cSAndroid Build Coastguard Worker      scope: variable.other.readwrite.member.c++
102*5c90c05cSAndroid Build Coastguard Worker
103*5c90c05cSAndroid Build Coastguard Worker  unique-constants:
104*5c90c05cSAndroid Build Coastguard Worker    - match: \bnullptr\b
105*5c90c05cSAndroid Build Coastguard Worker      scope: constant.language.c++
106*5c90c05cSAndroid Build Coastguard Worker
107*5c90c05cSAndroid Build Coastguard Worker  unique-keywords:
108*5c90c05cSAndroid Build Coastguard Worker    - match: \busing\b
109*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.control.c++
110*5c90c05cSAndroid Build Coastguard Worker    - match: \bbreak\b
111*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.control.flow.break.c++
112*5c90c05cSAndroid Build Coastguard Worker    - match: \bcontinue\b
113*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.control.flow.continue.c++
114*5c90c05cSAndroid Build Coastguard Worker    - match: \bgoto\b
115*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.control.flow.goto.c++
116*5c90c05cSAndroid Build Coastguard Worker    - match: \breturn\b
117*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.control.flow.return.c++
118*5c90c05cSAndroid Build Coastguard Worker    - match: \bthrow\b
119*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.control.flow.throw.c++
120*5c90c05cSAndroid Build Coastguard Worker    - match: \b({{control_keywords}})\b
121*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.control.c++
122*5c90c05cSAndroid Build Coastguard Worker    - match: '\bdelete\b(\s*\[\])?|\bnew\b(?!])'
123*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.control.c++
124*5c90c05cSAndroid Build Coastguard Worker    - match: \b({{operator_keywords}})\b
125*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.word.c++
126*5c90c05cSAndroid Build Coastguard Worker
127*5c90c05cSAndroid Build Coastguard Worker  unique-types:
128*5c90c05cSAndroid Build Coastguard Worker    - match: \b(char16_t|char32_t|wchar_t|nullptr_t)\b
129*5c90c05cSAndroid Build Coastguard Worker      scope: storage.type.c++
130*5c90c05cSAndroid Build Coastguard Worker    - match: \bclass\b
131*5c90c05cSAndroid Build Coastguard Worker      scope: storage.type.c++
132*5c90c05cSAndroid Build Coastguard Worker
133*5c90c05cSAndroid Build Coastguard Worker  unique-strings:
134*5c90c05cSAndroid Build Coastguard Worker    - match: '((?:L|u8|u|U)?R)("([^\(\)\\ ]{0,16})\()'
135*5c90c05cSAndroid Build Coastguard Worker      captures:
136*5c90c05cSAndroid Build Coastguard Worker        1: storage.type.string.c++
137*5c90c05cSAndroid Build Coastguard Worker        2: punctuation.definition.string.begin.c++
138*5c90c05cSAndroid Build Coastguard Worker      push:
139*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: string.quoted.double.c++
140*5c90c05cSAndroid Build Coastguard Worker        - match: '\)\3"'
141*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.definition.string.end.c++
142*5c90c05cSAndroid Build Coastguard Worker          pop: true
143*5c90c05cSAndroid Build Coastguard Worker        - match: '\{\{|\}\}'
144*5c90c05cSAndroid Build Coastguard Worker          scope: constant.character.escape.c++
145*5c90c05cSAndroid Build Coastguard Worker        - include: formatting-syntax
146*5c90c05cSAndroid Build Coastguard Worker
147*5c90c05cSAndroid Build Coastguard Worker  unique-numbers:
148*5c90c05cSAndroid Build Coastguard Worker    - match: |-
149*5c90c05cSAndroid Build Coastguard Worker        (?x)
150*5c90c05cSAndroid Build Coastguard Worker        (?:
151*5c90c05cSAndroid Build Coastguard Worker        # floats
152*5c90c05cSAndroid Build Coastguard Worker          (?:
153*5c90c05cSAndroid Build Coastguard Worker          (?:\b\d(?:[\d']*\d)?\.\d(?:[\d']*\d)?|\B\.\d(?:[\d']*\d)?)(?:[Ee][+-]?\d(?:[\d']*\d)?)?(?:[fFlL]|(?:i[fl]?|h|min|[mun]?s|_\w*))?\b
154*5c90c05cSAndroid Build Coastguard Worker          |
155*5c90c05cSAndroid Build Coastguard Worker          (?:\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)
156*5c90c05cSAndroid Build Coastguard Worker          |
157*5c90c05cSAndroid Build Coastguard Worker          \b\d(?:[\d']*\d)?(?:[Ee][+-]?\d(?:[\d']*\d)?)(?:[fFlL]|(?:i[fl]?|h|min|[mun]?s|_\w*))?\b
158*5c90c05cSAndroid Build Coastguard Worker          )
159*5c90c05cSAndroid Build Coastguard Worker        |
160*5c90c05cSAndroid Build Coastguard Worker        # ints
161*5c90c05cSAndroid Build Coastguard Worker          \b(?:
162*5c90c05cSAndroid Build Coastguard Worker          (?:
163*5c90c05cSAndroid Build Coastguard Worker          # dec
164*5c90c05cSAndroid Build Coastguard Worker          [1-9](?:[\d']*\d)?
165*5c90c05cSAndroid Build Coastguard Worker          |
166*5c90c05cSAndroid Build Coastguard Worker          # oct
167*5c90c05cSAndroid Build Coastguard Worker          0(?:[0-7']*[0-7])?
168*5c90c05cSAndroid Build Coastguard Worker          |
169*5c90c05cSAndroid Build Coastguard Worker          # hex
170*5c90c05cSAndroid Build Coastguard Worker          0[Xx][\da-fA-F](?:[\da-fA-F']*[\da-fA-F])?
171*5c90c05cSAndroid Build Coastguard Worker          |
172*5c90c05cSAndroid Build Coastguard Worker          # bin
173*5c90c05cSAndroid Build Coastguard Worker          0[Bb][01](?:[01']*[01])?
174*5c90c05cSAndroid Build Coastguard Worker          )
175*5c90c05cSAndroid Build Coastguard Worker          # int suffixes
176*5c90c05cSAndroid Build Coastguard Worker          (?:(?:l{1,2}|L{1,2})[uU]?|[uU](?:l{0,2}|L{0,2})|(?:i[fl]?|h|min|[mun]?s|_\w*))?)\b
177*5c90c05cSAndroid Build Coastguard Worker        )
178*5c90c05cSAndroid Build Coastguard Worker        (?!\.) # Number must not be followed by a decimal point
179*5c90c05cSAndroid Build Coastguard Worker      scope: constant.numeric.c++
180*5c90c05cSAndroid Build Coastguard Worker
181*5c90c05cSAndroid Build Coastguard Worker  identifiers:
182*5c90c05cSAndroid Build Coastguard Worker    - match: '{{identifier}}\s*(::)\s*'
183*5c90c05cSAndroid Build Coastguard Worker      captures:
184*5c90c05cSAndroid Build Coastguard Worker        1: punctuation.accessor.c++
185*5c90c05cSAndroid Build Coastguard Worker    - match: '(?:(::)\s*)?{{identifier}}'
186*5c90c05cSAndroid Build Coastguard Worker      captures:
187*5c90c05cSAndroid Build Coastguard Worker        1: punctuation.accessor.c++
188*5c90c05cSAndroid Build Coastguard Worker
189*5c90c05cSAndroid Build Coastguard Worker  function-specifiers:
190*5c90c05cSAndroid Build Coastguard Worker    - match: \b(const|final|noexcept|override)\b
191*5c90c05cSAndroid Build Coastguard Worker      scope: storage.modifier.c++
192*5c90c05cSAndroid Build Coastguard Worker
193*5c90c05cSAndroid Build Coastguard Worker  #############################################################################
194*5c90c05cSAndroid Build Coastguard Worker  # The following are C++-specific contexts that should not be reused. This is
195*5c90c05cSAndroid Build Coastguard Worker  # because they push into subcontexts and use variables that are C++-specific.
196*5c90c05cSAndroid Build Coastguard Worker  #############################################################################
197*5c90c05cSAndroid Build Coastguard Worker
198*5c90c05cSAndroid Build Coastguard Worker  ## Common context layout
199*5c90c05cSAndroid Build Coastguard Worker
200*5c90c05cSAndroid Build Coastguard Worker  global:
201*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\btemplate\b)'
202*5c90c05cSAndroid Build Coastguard Worker      push:
203*5c90c05cSAndroid Build Coastguard Worker        - include: template
204*5c90c05cSAndroid Build Coastguard Worker        - match: (?=\S)
205*5c90c05cSAndroid Build Coastguard Worker          set: global-modifier
206*5c90c05cSAndroid Build Coastguard Worker    - include: namespace
207*5c90c05cSAndroid Build Coastguard Worker    - include: keywords-angle-brackets
208*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}\s*<)'
209*5c90c05cSAndroid Build Coastguard Worker      push: global-modifier
210*5c90c05cSAndroid Build Coastguard Worker    # Take care of comments just before a function definition.
211*5c90c05cSAndroid Build Coastguard Worker    - match: /\*
212*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.definition.comment.c
213*5c90c05cSAndroid Build Coastguard Worker      push:
214*5c90c05cSAndroid Build Coastguard Worker        - - match: \s*(?=\w)
215*5c90c05cSAndroid Build Coastguard Worker            set: global-modifier
216*5c90c05cSAndroid Build Coastguard Worker          - match: ""
217*5c90c05cSAndroid Build Coastguard Worker            pop: true
218*5c90c05cSAndroid Build Coastguard Worker        - - meta_scope: comment.block.c
219*5c90c05cSAndroid Build Coastguard Worker          - match: \*/
220*5c90c05cSAndroid Build Coastguard Worker            scope: punctuation.definition.comment.c
221*5c90c05cSAndroid Build Coastguard Worker            pop: true
222*5c90c05cSAndroid Build Coastguard Worker    - include: early-expressions
223*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*\b(extern)(?=\s+"C(\+\+)?")
224*5c90c05cSAndroid Build Coastguard Worker      scope: storage.modifier.c++
225*5c90c05cSAndroid Build Coastguard Worker      push:
226*5c90c05cSAndroid Build Coastguard Worker        - include: comments
227*5c90c05cSAndroid Build Coastguard Worker        - include: strings
228*5c90c05cSAndroid Build Coastguard Worker        - match: '\{'
229*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.block.begin.c++
230*5c90c05cSAndroid Build Coastguard Worker          set:
231*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: meta.extern-c.c++
232*5c90c05cSAndroid Build Coastguard Worker            - match: '^\s*(#\s*ifdef)\s*__cplusplus\s*'
233*5c90c05cSAndroid Build Coastguard Worker              scope: meta.preprocessor.c++
234*5c90c05cSAndroid Build Coastguard Worker              captures:
235*5c90c05cSAndroid Build Coastguard Worker                1: keyword.control.import.c++
236*5c90c05cSAndroid Build Coastguard Worker              set:
237*5c90c05cSAndroid Build Coastguard Worker                - match: '\}'
238*5c90c05cSAndroid Build Coastguard Worker                  scope: punctuation.section.block.end.c++
239*5c90c05cSAndroid Build Coastguard Worker                  pop: true
240*5c90c05cSAndroid Build Coastguard Worker                - include: preprocessor-global
241*5c90c05cSAndroid Build Coastguard Worker                - include: global
242*5c90c05cSAndroid Build Coastguard Worker            - match: '\}'
243*5c90c05cSAndroid Build Coastguard Worker              scope: punctuation.section.block.end.c++
244*5c90c05cSAndroid Build Coastguard Worker              pop: true
245*5c90c05cSAndroid Build Coastguard Worker            - include: preprocessor-global
246*5c90c05cSAndroid Build Coastguard Worker            - include: global
247*5c90c05cSAndroid Build Coastguard Worker        - match: (?=\S)
248*5c90c05cSAndroid Build Coastguard Worker          set: global-modifier
249*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(?=\w)
250*5c90c05cSAndroid Build Coastguard Worker      push: global-modifier
251*5c90c05cSAndroid Build Coastguard Worker    - include: late-expressions
252*5c90c05cSAndroid Build Coastguard Worker
253*5c90c05cSAndroid Build Coastguard Worker  statements:
254*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-statements
255*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#label
256*5c90c05cSAndroid Build Coastguard Worker    - include: expressions
257*5c90c05cSAndroid Build Coastguard Worker
258*5c90c05cSAndroid Build Coastguard Worker  expressions:
259*5c90c05cSAndroid Build Coastguard Worker    - include: early-expressions
260*5c90c05cSAndroid Build Coastguard Worker    - include: late-expressions
261*5c90c05cSAndroid Build Coastguard Worker
262*5c90c05cSAndroid Build Coastguard Worker  early-expressions:
263*5c90c05cSAndroid Build Coastguard Worker    - include: early-expressions-before-generic-type
264*5c90c05cSAndroid Build Coastguard Worker    - include: generic-type
265*5c90c05cSAndroid Build Coastguard Worker    - include: early-expressions-after-generic-type
266*5c90c05cSAndroid Build Coastguard Worker
267*5c90c05cSAndroid Build Coastguard Worker  early-expressions-before-generic-type:
268*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-expressions
269*5c90c05cSAndroid Build Coastguard Worker    - include: comments
270*5c90c05cSAndroid Build Coastguard Worker    - include: case-default
271*5c90c05cSAndroid Build Coastguard Worker    - include: typedef
272*5c90c05cSAndroid Build Coastguard Worker    - include: keywords-angle-brackets
273*5c90c05cSAndroid Build Coastguard Worker    - include: keywords-parens
274*5c90c05cSAndroid Build Coastguard Worker    - include: keywords
275*5c90c05cSAndroid Build Coastguard Worker    - include: numbers
276*5c90c05cSAndroid Build Coastguard Worker    # Prevent a '<' from getting scoped as the start of another template
277*5c90c05cSAndroid Build Coastguard Worker    # parameter list, if in reality a less-than-or-equals sign is meant.
278*5c90c05cSAndroid Build Coastguard Worker    - match: <=
279*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.comparison.c
280*5c90c05cSAndroid Build Coastguard Worker
281*5c90c05cSAndroid Build Coastguard Worker  early-expressions-after-generic-type:
282*5c90c05cSAndroid Build Coastguard Worker    - include: members-arrow
283*5c90c05cSAndroid Build Coastguard Worker    - include: operators
284*5c90c05cSAndroid Build Coastguard Worker    - include: members-dot
285*5c90c05cSAndroid Build Coastguard Worker    - include: strings
286*5c90c05cSAndroid Build Coastguard Worker    - include: parens
287*5c90c05cSAndroid Build Coastguard Worker    - include: brackets
288*5c90c05cSAndroid Build Coastguard Worker    - include: block
289*5c90c05cSAndroid Build Coastguard Worker    - include: variables
290*5c90c05cSAndroid Build Coastguard Worker    - include: constants
291*5c90c05cSAndroid Build Coastguard Worker    - match: ','
292*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.separator.c++
293*5c90c05cSAndroid Build Coastguard Worker    - match: '\)|\}'
294*5c90c05cSAndroid Build Coastguard Worker      scope: invalid.illegal.stray-bracket-end.c++
295*5c90c05cSAndroid Build Coastguard Worker
296*5c90c05cSAndroid Build Coastguard Worker  expressions-minus-generic-type:
297*5c90c05cSAndroid Build Coastguard Worker    - include: early-expressions-before-generic-type
298*5c90c05cSAndroid Build Coastguard Worker    - include: angle-brackets
299*5c90c05cSAndroid Build Coastguard Worker    - include: early-expressions-after-generic-type
300*5c90c05cSAndroid Build Coastguard Worker    - include: late-expressions
301*5c90c05cSAndroid Build Coastguard Worker
302*5c90c05cSAndroid Build Coastguard Worker  expressions-minus-generic-type-function-call:
303*5c90c05cSAndroid Build Coastguard Worker    - include: early-expressions-before-generic-type
304*5c90c05cSAndroid Build Coastguard Worker    - include: angle-brackets
305*5c90c05cSAndroid Build Coastguard Worker    - include: early-expressions-after-generic-type
306*5c90c05cSAndroid Build Coastguard Worker    - include: late-expressions-before-function-call
307*5c90c05cSAndroid Build Coastguard Worker    - include: identifiers
308*5c90c05cSAndroid Build Coastguard Worker    - match: ';'
309*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.terminator.c++
310*5c90c05cSAndroid Build Coastguard Worker
311*5c90c05cSAndroid Build Coastguard Worker  late-expressions:
312*5c90c05cSAndroid Build Coastguard Worker    - include: late-expressions-before-function-call
313*5c90c05cSAndroid Build Coastguard Worker    - include: function-call
314*5c90c05cSAndroid Build Coastguard Worker    - include: identifiers
315*5c90c05cSAndroid Build Coastguard Worker    - match: ';'
316*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.terminator.c++
317*5c90c05cSAndroid Build Coastguard Worker
318*5c90c05cSAndroid Build Coastguard Worker  late-expressions-before-function-call:
319*5c90c05cSAndroid Build Coastguard Worker    - include: unique-late-expressions
320*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers-parens
321*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers
322*5c90c05cSAndroid Build Coastguard Worker    - include: types
323*5c90c05cSAndroid Build Coastguard Worker
324*5c90c05cSAndroid Build Coastguard Worker  expressions-minus-function-call:
325*5c90c05cSAndroid Build Coastguard Worker    - include: early-expressions
326*5c90c05cSAndroid Build Coastguard Worker    - include: late-expressions-before-function-call
327*5c90c05cSAndroid Build Coastguard Worker    - include: identifiers
328*5c90c05cSAndroid Build Coastguard Worker    - match: ';'
329*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.terminator.c++
330*5c90c05cSAndroid Build Coastguard Worker
331*5c90c05cSAndroid Build Coastguard Worker  comments:
332*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#comments
333*5c90c05cSAndroid Build Coastguard Worker
334*5c90c05cSAndroid Build Coastguard Worker  operators:
335*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#operators
336*5c90c05cSAndroid Build Coastguard Worker
337*5c90c05cSAndroid Build Coastguard Worker  modifiers:
338*5c90c05cSAndroid Build Coastguard Worker    - include: unique-modifiers
339*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#modifiers
340*5c90c05cSAndroid Build Coastguard Worker
341*5c90c05cSAndroid Build Coastguard Worker  variables:
342*5c90c05cSAndroid Build Coastguard Worker    - include: unique-variables
343*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#variables
344*5c90c05cSAndroid Build Coastguard Worker
345*5c90c05cSAndroid Build Coastguard Worker  constants:
346*5c90c05cSAndroid Build Coastguard Worker    - include: unique-constants
347*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#constants
348*5c90c05cSAndroid Build Coastguard Worker
349*5c90c05cSAndroid Build Coastguard Worker  keywords:
350*5c90c05cSAndroid Build Coastguard Worker    - include: unique-keywords
351*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#keywords
352*5c90c05cSAndroid Build Coastguard Worker
353*5c90c05cSAndroid Build Coastguard Worker  types:
354*5c90c05cSAndroid Build Coastguard Worker    - include: unique-types
355*5c90c05cSAndroid Build Coastguard Worker    - include: types-parens
356*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#types
357*5c90c05cSAndroid Build Coastguard Worker
358*5c90c05cSAndroid Build Coastguard Worker  strings:
359*5c90c05cSAndroid Build Coastguard Worker    - include: unique-strings
360*5c90c05cSAndroid Build Coastguard Worker    - match: '(L|u8|u|U)?(")'
361*5c90c05cSAndroid Build Coastguard Worker      captures:
362*5c90c05cSAndroid Build Coastguard Worker        1: storage.type.string.c++
363*5c90c05cSAndroid Build Coastguard Worker        2: punctuation.definition.string.begin.c++
364*5c90c05cSAndroid Build Coastguard Worker      push:
365*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: string.quoted.double.c++
366*5c90c05cSAndroid Build Coastguard Worker        - match: '"'
367*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.definition.string.end.c++
368*5c90c05cSAndroid Build Coastguard Worker          pop: true
369*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#string_escaped_char
370*5c90c05cSAndroid Build Coastguard Worker        - match: |-
371*5c90c05cSAndroid Build Coastguard Worker            (?x)%
372*5c90c05cSAndroid Build Coastguard Worker              (\d+\$)?                                      # field (argument #)
373*5c90c05cSAndroid Build Coastguard Worker              [#0\- +']*                                    # flags
374*5c90c05cSAndroid Build Coastguard Worker              [,;:_]?                                       # separator character (AltiVec)
375*5c90c05cSAndroid Build Coastguard Worker              ((-?\d+)|\*(-?\d+\$)?)?                       # minimum field width
376*5c90c05cSAndroid Build Coastguard Worker              (\.((-?\d+)|\*(-?\d+\$)?)?)?                  # precision
377*5c90c05cSAndroid Build Coastguard Worker              (hh|h|ll|l|j|t|z|q|L|vh|vl|v|hv|hl)?          # length modifier
378*5c90c05cSAndroid Build Coastguard Worker              (\[[^\]]+\]|[am]s|[diouxXDOUeEfFgGaACcSspn%]) # conversion type
379*5c90c05cSAndroid Build Coastguard Worker          scope: constant.other.placeholder.c++
380*5c90c05cSAndroid Build Coastguard Worker        - match: '\{\{|\}\}'
381*5c90c05cSAndroid Build Coastguard Worker          scope: constant.character.escape.c++
382*5c90c05cSAndroid Build Coastguard Worker        - include: formatting-syntax
383*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#strings
384*5c90c05cSAndroid Build Coastguard Worker
385*5c90c05cSAndroid Build Coastguard Worker  formatting-syntax:
386*5c90c05cSAndroid Build Coastguard Worker    # https://docs.python.org/3.6/library/string.html#formatstrings
387*5c90c05cSAndroid Build Coastguard Worker    - match: |- # simple form
388*5c90c05cSAndroid Build Coastguard Worker        (?x)
389*5c90c05cSAndroid Build Coastguard Worker        (\{)
390*5c90c05cSAndroid Build Coastguard Worker          (?: [\w.\[\]]+)?             # field_name
391*5c90c05cSAndroid Build Coastguard Worker          (   ! [ars])?                # conversion
392*5c90c05cSAndroid Build Coastguard Worker          (   : (?:{{format_spec}}|    # format_spec OR
393*5c90c05cSAndroid Build Coastguard Worker                   [^}%]*%.[^}]*)      # any format-like string
394*5c90c05cSAndroid Build Coastguard Worker          )?
395*5c90c05cSAndroid Build Coastguard Worker        (\})
396*5c90c05cSAndroid Build Coastguard Worker      scope: constant.other.placeholder.c++
397*5c90c05cSAndroid Build Coastguard Worker      captures:
398*5c90c05cSAndroid Build Coastguard Worker        1: punctuation.definition.placeholder.begin.c++
399*5c90c05cSAndroid Build Coastguard Worker        2: storage.modifier.c++onversion.c++
400*5c90c05cSAndroid Build Coastguard Worker        3: constant.other.format-spec.c++
401*5c90c05cSAndroid Build Coastguard Worker        4: punctuation.definition.placeholder.end.c++
402*5c90c05cSAndroid Build Coastguard Worker    - match: \{(?=[^\}"']+\{[^"']*\}) # complex (nested) form
403*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.definition.placeholder.begin.c++
404*5c90c05cSAndroid Build Coastguard Worker      push:
405*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: constant.other.placeholder.c++
406*5c90c05cSAndroid Build Coastguard Worker        - match: \}
407*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.definition.placeholder.end.c++
408*5c90c05cSAndroid Build Coastguard Worker          pop: true
409*5c90c05cSAndroid Build Coastguard Worker        - match: '[\w.\[\]]+'
410*5c90c05cSAndroid Build Coastguard Worker        - match: '![ars]'
411*5c90c05cSAndroid Build Coastguard Worker          scope: storage.modifier.conversion.c++
412*5c90c05cSAndroid Build Coastguard Worker        - match: ':'
413*5c90c05cSAndroid Build Coastguard Worker          push:
414*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: meta.format-spec.c++ constant.other.format-spec.c++
415*5c90c05cSAndroid Build Coastguard Worker            - match: (?=\})
416*5c90c05cSAndroid Build Coastguard Worker              pop: true
417*5c90c05cSAndroid Build Coastguard Worker            - include: formatting-syntax
418*5c90c05cSAndroid Build Coastguard Worker
419*5c90c05cSAndroid Build Coastguard Worker  numbers:
420*5c90c05cSAndroid Build Coastguard Worker    - include: unique-numbers
421*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#numbers
422*5c90c05cSAndroid Build Coastguard Worker
423*5c90c05cSAndroid Build Coastguard Worker  ## C++-specific contexts
424*5c90c05cSAndroid Build Coastguard Worker
425*5c90c05cSAndroid Build Coastguard Worker  case-default:
426*5c90c05cSAndroid Build Coastguard Worker    - match: '\b(default|case)\b'
427*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.control.c++
428*5c90c05cSAndroid Build Coastguard Worker      push:
429*5c90c05cSAndroid Build Coastguard Worker        - match: (?=[);,])
430*5c90c05cSAndroid Build Coastguard Worker          pop: true
431*5c90c05cSAndroid Build Coastguard Worker        - match: ':'
432*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.separator.c++
433*5c90c05cSAndroid Build Coastguard Worker          pop: true
434*5c90c05cSAndroid Build Coastguard Worker        - include: expressions
435*5c90c05cSAndroid Build Coastguard Worker
436*5c90c05cSAndroid Build Coastguard Worker  modifiers-parens:
437*5c90c05cSAndroid Build Coastguard Worker    - match: '\b(alignas)\b\s*(\()'
438*5c90c05cSAndroid Build Coastguard Worker      captures:
439*5c90c05cSAndroid Build Coastguard Worker        1: storage.modifier.c++
440*5c90c05cSAndroid Build Coastguard Worker        2: meta.group.c++ punctuation.section.group.begin.c++
441*5c90c05cSAndroid Build Coastguard Worker      push:
442*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.group.c++
443*5c90c05cSAndroid Build Coastguard Worker        - match: '\)'
444*5c90c05cSAndroid Build Coastguard Worker          scope: meta.group.c++ punctuation.section.group.end.c++
445*5c90c05cSAndroid Build Coastguard Worker          pop: true
446*5c90c05cSAndroid Build Coastguard Worker        - include: expressions
447*5c90c05cSAndroid Build Coastguard Worker    - match: \b(__attribute__)\s*(\(\()
448*5c90c05cSAndroid Build Coastguard Worker      captures:
449*5c90c05cSAndroid Build Coastguard Worker        1: storage.modifier.c++
450*5c90c05cSAndroid Build Coastguard Worker        2: meta.group.c++ punctuation.section.group.begin.c++
451*5c90c05cSAndroid Build Coastguard Worker      push :
452*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.attribute.c++
453*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.group.c++
454*5c90c05cSAndroid Build Coastguard Worker        - include: parens
455*5c90c05cSAndroid Build Coastguard Worker        - include: strings
456*5c90c05cSAndroid Build Coastguard Worker        - match: \)\)
457*5c90c05cSAndroid Build Coastguard Worker          scope: meta.group.c++ punctuation.section.group.end.c++
458*5c90c05cSAndroid Build Coastguard Worker          pop: true
459*5c90c05cSAndroid Build Coastguard Worker    - match: \b(__declspec)(\()
460*5c90c05cSAndroid Build Coastguard Worker      captures:
461*5c90c05cSAndroid Build Coastguard Worker        1: storage.modifier.c++
462*5c90c05cSAndroid Build Coastguard Worker        2: meta.group.c++ punctuation.section.group.begin.c++
463*5c90c05cSAndroid Build Coastguard Worker      push:
464*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.group.c++
465*5c90c05cSAndroid Build Coastguard Worker        - match: '\)'
466*5c90c05cSAndroid Build Coastguard Worker          scope: meta.group.c++ punctuation.section.group.end.c++
467*5c90c05cSAndroid Build Coastguard Worker          pop: true
468*5c90c05cSAndroid Build Coastguard Worker        - match: '\b(align|allocate|code_seg|deprecated|property|uuid)\b\s*(\()'
469*5c90c05cSAndroid Build Coastguard Worker          captures:
470*5c90c05cSAndroid Build Coastguard Worker            1: storage.modifier.c++
471*5c90c05cSAndroid Build Coastguard Worker            2: meta.group.c++ punctuation.section.group.begin.c++
472*5c90c05cSAndroid Build Coastguard Worker          push:
473*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: meta.group.c++
474*5c90c05cSAndroid Build Coastguard Worker            - match: '\)'
475*5c90c05cSAndroid Build Coastguard Worker              scope: meta.group.c++ punctuation.section.group.end.c++
476*5c90c05cSAndroid Build Coastguard Worker              pop: true
477*5c90c05cSAndroid Build Coastguard Worker            - include: numbers
478*5c90c05cSAndroid Build Coastguard Worker            - include: strings
479*5c90c05cSAndroid Build Coastguard Worker            - match: \b(get|put)\b
480*5c90c05cSAndroid Build Coastguard Worker              scope: variable.parameter.c++
481*5c90c05cSAndroid Build Coastguard Worker            - match: ','
482*5c90c05cSAndroid Build Coastguard Worker              scope: punctuation.separator.c++
483*5c90c05cSAndroid Build Coastguard Worker            - match: '='
484*5c90c05cSAndroid Build Coastguard Worker              scope: keyword.operator.assignment.c++
485*5c90c05cSAndroid Build Coastguard Worker        - match: '\b(appdomain|deprecated|dllimport|dllexport|jintrinsic|naked|noalias|noinline|noreturn|nothrow|novtable|process|restrict|safebuffers|selectany|thread)\b'
486*5c90c05cSAndroid Build Coastguard Worker          scope: constant.other.c++
487*5c90c05cSAndroid Build Coastguard Worker
488*5c90c05cSAndroid Build Coastguard Worker  types-parens:
489*5c90c05cSAndroid Build Coastguard Worker    - match: '\b(decltype)\b\s*(\()'
490*5c90c05cSAndroid Build Coastguard Worker      captures:
491*5c90c05cSAndroid Build Coastguard Worker        1: storage.type.c++
492*5c90c05cSAndroid Build Coastguard Worker        2: meta.group.c++ punctuation.section.group.begin.c++
493*5c90c05cSAndroid Build Coastguard Worker      push:
494*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.group.c++
495*5c90c05cSAndroid Build Coastguard Worker        - match: '\)'
496*5c90c05cSAndroid Build Coastguard Worker          scope: meta.group.c++ punctuation.section.group.end.c++
497*5c90c05cSAndroid Build Coastguard Worker          pop: true
498*5c90c05cSAndroid Build Coastguard Worker        - include: expressions
499*5c90c05cSAndroid Build Coastguard Worker
500*5c90c05cSAndroid Build Coastguard Worker  keywords-angle-brackets:
501*5c90c05cSAndroid Build Coastguard Worker    - match: \b({{casts}})\b\s*
502*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.word.cast.c++
503*5c90c05cSAndroid Build Coastguard Worker      push:
504*5c90c05cSAndroid Build Coastguard Worker        - match: '>'
505*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.generic.end.c++
506*5c90c05cSAndroid Build Coastguard Worker          pop: true
507*5c90c05cSAndroid Build Coastguard Worker        - match: '<'
508*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.generic.begin.c++
509*5c90c05cSAndroid Build Coastguard Worker          push:
510*5c90c05cSAndroid Build Coastguard Worker            - match: '(?=>)'
511*5c90c05cSAndroid Build Coastguard Worker              pop: true
512*5c90c05cSAndroid Build Coastguard Worker            - include: expressions-minus-generic-type-function-call
513*5c90c05cSAndroid Build Coastguard Worker
514*5c90c05cSAndroid Build Coastguard Worker  keywords-parens:
515*5c90c05cSAndroid Build Coastguard Worker    - match: '\b(alignof|typeid|static_assert|sizeof)\b\s*(\()'
516*5c90c05cSAndroid Build Coastguard Worker      captures:
517*5c90c05cSAndroid Build Coastguard Worker        1: keyword.operator.word.c++
518*5c90c05cSAndroid Build Coastguard Worker        2: meta.group.c++ punctuation.section.group.begin.c++
519*5c90c05cSAndroid Build Coastguard Worker      push:
520*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.group.c++
521*5c90c05cSAndroid Build Coastguard Worker        - match: '\)'
522*5c90c05cSAndroid Build Coastguard Worker          scope: meta.group.c++ punctuation.section.group.end.c++
523*5c90c05cSAndroid Build Coastguard Worker          pop: true
524*5c90c05cSAndroid Build Coastguard Worker        - include: expressions
525*5c90c05cSAndroid Build Coastguard Worker
526*5c90c05cSAndroid Build Coastguard Worker  namespace:
527*5c90c05cSAndroid Build Coastguard Worker    - match: '\b(using)\s+(namespace)\s+(?={{path_lookahead}})'
528*5c90c05cSAndroid Build Coastguard Worker      captures:
529*5c90c05cSAndroid Build Coastguard Worker        1: keyword.control.c++
530*5c90c05cSAndroid Build Coastguard Worker        2: keyword.control.c++
531*5c90c05cSAndroid Build Coastguard Worker      push:
532*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
533*5c90c05cSAndroid Build Coastguard Worker        - match: ''
534*5c90c05cSAndroid Build Coastguard Worker          pop: true
535*5c90c05cSAndroid Build Coastguard Worker    - match: '\b(namespace)\s+(?=({{path_lookahead}})?(?!\s*[;,]))'
536*5c90c05cSAndroid Build Coastguard Worker      scope: meta.namespace.c++
537*5c90c05cSAndroid Build Coastguard Worker      captures:
538*5c90c05cSAndroid Build Coastguard Worker        1: keyword.control.c++
539*5c90c05cSAndroid Build Coastguard Worker      push:
540*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.namespace.c++ entity.name.namespace.c++
541*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
542*5c90c05cSAndroid Build Coastguard Worker        - match: ''
543*5c90c05cSAndroid Build Coastguard Worker          set:
544*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: meta.namespace.c++
545*5c90c05cSAndroid Build Coastguard Worker            - include: comments
546*5c90c05cSAndroid Build Coastguard Worker            - match: '='
547*5c90c05cSAndroid Build Coastguard Worker              scope: keyword.operator.alias.c++
548*5c90c05cSAndroid Build Coastguard Worker            - match: '(?=;)'
549*5c90c05cSAndroid Build Coastguard Worker              pop: true
550*5c90c05cSAndroid Build Coastguard Worker            - match: '\}'
551*5c90c05cSAndroid Build Coastguard Worker              scope: meta.block.c++ punctuation.section.block.end.c++
552*5c90c05cSAndroid Build Coastguard Worker              pop: true
553*5c90c05cSAndroid Build Coastguard Worker            - match: '\{'
554*5c90c05cSAndroid Build Coastguard Worker              scope: punctuation.section.block.begin.c++
555*5c90c05cSAndroid Build Coastguard Worker              push:
556*5c90c05cSAndroid Build Coastguard Worker                - meta_scope: meta.block.c++
557*5c90c05cSAndroid Build Coastguard Worker                - match: '(?=\})'
558*5c90c05cSAndroid Build Coastguard Worker                  pop: true
559*5c90c05cSAndroid Build Coastguard Worker                - include: preprocessor-global
560*5c90c05cSAndroid Build Coastguard Worker                - include: global
561*5c90c05cSAndroid Build Coastguard Worker            - include: expressions
562*5c90c05cSAndroid Build Coastguard Worker
563*5c90c05cSAndroid Build Coastguard Worker  template-common:
564*5c90c05cSAndroid Build Coastguard Worker    # Exit the template scope if we hit some basic invalid characters. This
565*5c90c05cSAndroid Build Coastguard Worker    # helps when a user is in the middle of typing their template types and
566*5c90c05cSAndroid Build Coastguard Worker    # prevents re-highlighting the whole file until the next > is found.
567*5c90c05cSAndroid Build Coastguard Worker    - match: (?=[{};])
568*5c90c05cSAndroid Build Coastguard Worker      pop: true
569*5c90c05cSAndroid Build Coastguard Worker    - include: expressions
570*5c90c05cSAndroid Build Coastguard Worker
571*5c90c05cSAndroid Build Coastguard Worker  template:
572*5c90c05cSAndroid Build Coastguard Worker    - match: \btemplate\b
573*5c90c05cSAndroid Build Coastguard Worker      scope: storage.type.template.c++
574*5c90c05cSAndroid Build Coastguard Worker      push:
575*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.template.c++
576*5c90c05cSAndroid Build Coastguard Worker        # Explicitly include comments here at the top, in order to NOT match the
577*5c90c05cSAndroid Build Coastguard Worker        # \S lookahead in the case of comments.
578*5c90c05cSAndroid Build Coastguard Worker        - include: comments
579*5c90c05cSAndroid Build Coastguard Worker        - match: <
580*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.generic.begin.c++
581*5c90c05cSAndroid Build Coastguard Worker          set:
582*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: meta.template.c++
583*5c90c05cSAndroid Build Coastguard Worker            - match: '>'
584*5c90c05cSAndroid Build Coastguard Worker              scope: meta.template.c++ punctuation.section.generic.end.c++
585*5c90c05cSAndroid Build Coastguard Worker              pop: true
586*5c90c05cSAndroid Build Coastguard Worker            - match: \.{3}
587*5c90c05cSAndroid Build Coastguard Worker              scope: keyword.operator.variadic.c++
588*5c90c05cSAndroid Build Coastguard Worker            - match: \b(typename|{{before_tag}})\b
589*5c90c05cSAndroid Build Coastguard Worker              scope: storage.type.c++
590*5c90c05cSAndroid Build Coastguard Worker            - include: template # include template here for nested templates
591*5c90c05cSAndroid Build Coastguard Worker            - include: template-common
592*5c90c05cSAndroid Build Coastguard Worker        - match: (?=\S)
593*5c90c05cSAndroid Build Coastguard Worker          set:
594*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: meta.template.c++
595*5c90c05cSAndroid Build Coastguard Worker            - match: \b({{before_tag}})\b
596*5c90c05cSAndroid Build Coastguard Worker              scope: storage.type.c++
597*5c90c05cSAndroid Build Coastguard Worker            - include: template-common
598*5c90c05cSAndroid Build Coastguard Worker
599*5c90c05cSAndroid Build Coastguard Worker  generic-type:
600*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=(?!template){{path_lookahead}}\s*{{generic_lookahead}}\s*\()'
601*5c90c05cSAndroid Build Coastguard Worker      push:
602*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.function-call.c++
603*5c90c05cSAndroid Build Coastguard Worker        - match: \btemplate\b
604*5c90c05cSAndroid Build Coastguard Worker          scope: storage.type.template.c++
605*5c90c05cSAndroid Build Coastguard Worker        - match: '(?:(::)\s*)?{{identifier}}\s*(::)\s*'
606*5c90c05cSAndroid Build Coastguard Worker          captures:
607*5c90c05cSAndroid Build Coastguard Worker            1: punctuation.accessor.double-colon.c++
608*5c90c05cSAndroid Build Coastguard Worker            2: punctuation.accessor.double-colon.c++
609*5c90c05cSAndroid Build Coastguard Worker        - match: (?:(::)\s*)?({{identifier}})\s*(<)
610*5c90c05cSAndroid Build Coastguard Worker          captures:
611*5c90c05cSAndroid Build Coastguard Worker            1: punctuation.accessor.double-colon.c++
612*5c90c05cSAndroid Build Coastguard Worker            2: variable.function.c++
613*5c90c05cSAndroid Build Coastguard Worker            3: punctuation.section.generic.begin.c++
614*5c90c05cSAndroid Build Coastguard Worker          push:
615*5c90c05cSAndroid Build Coastguard Worker            - match: '>'
616*5c90c05cSAndroid Build Coastguard Worker              scope: punctuation.section.generic.end.c++
617*5c90c05cSAndroid Build Coastguard Worker              pop: true
618*5c90c05cSAndroid Build Coastguard Worker            - include: expressions-minus-generic-type-function-call
619*5c90c05cSAndroid Build Coastguard Worker        - match: (?:(::)\s*)?({{identifier}})\s*(\()
620*5c90c05cSAndroid Build Coastguard Worker          captures:
621*5c90c05cSAndroid Build Coastguard Worker            1: punctuation.accessor.double-colon.c++
622*5c90c05cSAndroid Build Coastguard Worker            2: variable.function.c++
623*5c90c05cSAndroid Build Coastguard Worker            3: punctuation.section.group.begin.c++
624*5c90c05cSAndroid Build Coastguard Worker          set:
625*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: meta.function-call.c++
626*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: meta.group.c++
627*5c90c05cSAndroid Build Coastguard Worker            - match: '\)'
628*5c90c05cSAndroid Build Coastguard Worker              scope: meta.group.c++ punctuation.section.group.end.c++
629*5c90c05cSAndroid Build Coastguard Worker              pop: true
630*5c90c05cSAndroid Build Coastguard Worker            - include: expressions
631*5c90c05cSAndroid Build Coastguard Worker        - include: angle-brackets
632*5c90c05cSAndroid Build Coastguard Worker        - match: '\('
633*5c90c05cSAndroid Build Coastguard Worker          scope: meta.group.c++ punctuation.section.group.begin.c++
634*5c90c05cSAndroid Build Coastguard Worker          set:
635*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: meta.function-call.c++
636*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: meta.group.c++
637*5c90c05cSAndroid Build Coastguard Worker            - match: '\)'
638*5c90c05cSAndroid Build Coastguard Worker              scope: meta.group.c++ punctuation.section.group.end.c++
639*5c90c05cSAndroid Build Coastguard Worker              pop: true
640*5c90c05cSAndroid Build Coastguard Worker            - include: expressions
641*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=(?!template){{path_lookahead}}\s*{{generic_lookahead}})'
642*5c90c05cSAndroid Build Coastguard Worker      push:
643*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
644*5c90c05cSAndroid Build Coastguard Worker        - match: '<'
645*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.generic.begin.c++
646*5c90c05cSAndroid Build Coastguard Worker          set:
647*5c90c05cSAndroid Build Coastguard Worker            - match: '>'
648*5c90c05cSAndroid Build Coastguard Worker              scope: punctuation.section.generic.end.c++
649*5c90c05cSAndroid Build Coastguard Worker              pop: true
650*5c90c05cSAndroid Build Coastguard Worker            - include: expressions-minus-generic-type-function-call
651*5c90c05cSAndroid Build Coastguard Worker
652*5c90c05cSAndroid Build Coastguard Worker  angle-brackets:
653*5c90c05cSAndroid Build Coastguard Worker    - match: '<(?!<)'
654*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.generic.begin.c++
655*5c90c05cSAndroid Build Coastguard Worker      push:
656*5c90c05cSAndroid Build Coastguard Worker        - match: '>'
657*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.generic.end.c++
658*5c90c05cSAndroid Build Coastguard Worker          pop: true
659*5c90c05cSAndroid Build Coastguard Worker        - include: expressions-minus-generic-type-function-call
660*5c90c05cSAndroid Build Coastguard Worker
661*5c90c05cSAndroid Build Coastguard Worker  block:
662*5c90c05cSAndroid Build Coastguard Worker    - match: '\{'
663*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.begin.c++
664*5c90c05cSAndroid Build Coastguard Worker      push:
665*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.block.c++
666*5c90c05cSAndroid Build Coastguard Worker        - match: (?=^\s*#\s*(elif|else|endif)\b)
667*5c90c05cSAndroid Build Coastguard Worker          pop: true
668*5c90c05cSAndroid Build Coastguard Worker        - match: '\}'
669*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.block.end.c++
670*5c90c05cSAndroid Build Coastguard Worker          pop: true
671*5c90c05cSAndroid Build Coastguard Worker        - include: statements
672*5c90c05cSAndroid Build Coastguard Worker
673*5c90c05cSAndroid Build Coastguard Worker  function-call:
674*5c90c05cSAndroid Build Coastguard Worker    - match: (?={{path_lookahead}}\s*\()
675*5c90c05cSAndroid Build Coastguard Worker      push:
676*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.function-call.c++
677*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#c99
678*5c90c05cSAndroid Build Coastguard Worker        - match: '(?:(::)\s*)?{{identifier}}\s*(::)\s*'
679*5c90c05cSAndroid Build Coastguard Worker          scope: variable.function.c++
680*5c90c05cSAndroid Build Coastguard Worker          captures:
681*5c90c05cSAndroid Build Coastguard Worker            1: punctuation.accessor.c++
682*5c90c05cSAndroid Build Coastguard Worker            2: punctuation.accessor.c++
683*5c90c05cSAndroid Build Coastguard Worker        - match: '(?:(::)\s*)?{{identifier}}'
684*5c90c05cSAndroid Build Coastguard Worker          scope: variable.function.c++
685*5c90c05cSAndroid Build Coastguard Worker          captures:
686*5c90c05cSAndroid Build Coastguard Worker            1: punctuation.accessor.c++
687*5c90c05cSAndroid Build Coastguard Worker        - match: '\('
688*5c90c05cSAndroid Build Coastguard Worker          scope: meta.group.c++ punctuation.section.group.begin.c++
689*5c90c05cSAndroid Build Coastguard Worker          set:
690*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: meta.function-call.c++ meta.group.c++
691*5c90c05cSAndroid Build Coastguard Worker            - match: '\)'
692*5c90c05cSAndroid Build Coastguard Worker              scope: meta.function-call.c++ meta.group.c++ punctuation.section.group.end.c++
693*5c90c05cSAndroid Build Coastguard Worker              pop: true
694*5c90c05cSAndroid Build Coastguard Worker            - include: expressions
695*5c90c05cSAndroid Build Coastguard Worker
696*5c90c05cSAndroid Build Coastguard Worker  members-inside-function-call:
697*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.method-call.c++ meta.group.c++
698*5c90c05cSAndroid Build Coastguard Worker    - match: \)
699*5c90c05cSAndroid Build Coastguard Worker      scope: meta.method-call.c++ meta.group.c++ punctuation.section.group.end.c++
700*5c90c05cSAndroid Build Coastguard Worker      pop: true
701*5c90c05cSAndroid Build Coastguard Worker    - include: expressions
702*5c90c05cSAndroid Build Coastguard Worker
703*5c90c05cSAndroid Build Coastguard Worker  members-after-accessor-junction:
704*5c90c05cSAndroid Build Coastguard Worker    # After we've seen an accessor (dot or arrow), this context decides what
705*5c90c05cSAndroid Build Coastguard Worker    # kind of entity we're accessing.
706*5c90c05cSAndroid Build Coastguard Worker    - include: comments
707*5c90c05cSAndroid Build Coastguard Worker    - match: \btemplate\b
708*5c90c05cSAndroid Build Coastguard Worker      scope: meta.method-call.c++ storage.type.template.c++
709*5c90c05cSAndroid Build Coastguard Worker      # Guaranteed to be a template member function call after we match this
710*5c90c05cSAndroid Build Coastguard Worker      set:
711*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.method-call.c++
712*5c90c05cSAndroid Build Coastguard Worker        - include: comments
713*5c90c05cSAndroid Build Coastguard Worker        - match: '{{identifier}}'
714*5c90c05cSAndroid Build Coastguard Worker          scope: variable.function.member.c++
715*5c90c05cSAndroid Build Coastguard Worker          set:
716*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: meta.method-call.c++
717*5c90c05cSAndroid Build Coastguard Worker            - match: \(
718*5c90c05cSAndroid Build Coastguard Worker              scope: meta.group.c++ punctuation.section.group.begin.c++
719*5c90c05cSAndroid Build Coastguard Worker              set: members-inside-function-call
720*5c90c05cSAndroid Build Coastguard Worker            - include: comments
721*5c90c05cSAndroid Build Coastguard Worker            - include: angle-brackets
722*5c90c05cSAndroid Build Coastguard Worker            - match: (?=\S) # safety pop
723*5c90c05cSAndroid Build Coastguard Worker              pop: true
724*5c90c05cSAndroid Build Coastguard Worker        - match: (?=\S) # safety pop
725*5c90c05cSAndroid Build Coastguard Worker          pop: true
726*5c90c05cSAndroid Build Coastguard Worker    # Operator overloading
727*5c90c05cSAndroid Build Coastguard Worker    - match: '({{operator_method_name}})\s*(\()'
728*5c90c05cSAndroid Build Coastguard Worker      captures:
729*5c90c05cSAndroid Build Coastguard Worker        0: meta.method-call.c++
730*5c90c05cSAndroid Build Coastguard Worker        1: variable.function.member.c++
731*5c90c05cSAndroid Build Coastguard Worker        2: meta.group.c++ punctuation.section.group.begin.c++
732*5c90c05cSAndroid Build Coastguard Worker      set: members-inside-function-call
733*5c90c05cSAndroid Build Coastguard Worker    # Non-templated member function call
734*5c90c05cSAndroid Build Coastguard Worker    - match: (~?{{identifier}})\s*(\()
735*5c90c05cSAndroid Build Coastguard Worker      captures:
736*5c90c05cSAndroid Build Coastguard Worker        0: meta.method-call.c++
737*5c90c05cSAndroid Build Coastguard Worker        1: variable.function.member.c++
738*5c90c05cSAndroid Build Coastguard Worker        2: meta.group.c++ punctuation.section.group.begin.c++
739*5c90c05cSAndroid Build Coastguard Worker      set: members-inside-function-call
740*5c90c05cSAndroid Build Coastguard Worker    # Templated member function call
741*5c90c05cSAndroid Build Coastguard Worker    - match: (~?{{identifier}})\s*(?={{generic_lookahead}})
742*5c90c05cSAndroid Build Coastguard Worker      captures:
743*5c90c05cSAndroid Build Coastguard Worker        1: variable.function.member.c++
744*5c90c05cSAndroid Build Coastguard Worker      set:
745*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.method-call.c++
746*5c90c05cSAndroid Build Coastguard Worker        - match: <
747*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.generic.begin.c++
748*5c90c05cSAndroid Build Coastguard Worker          set:
749*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: meta.method-call.c++
750*5c90c05cSAndroid Build Coastguard Worker            - match: '>'
751*5c90c05cSAndroid Build Coastguard Worker              scope: punctuation.section.generic.end.c++
752*5c90c05cSAndroid Build Coastguard Worker              set:
753*5c90c05cSAndroid Build Coastguard Worker                - meta_content_scope: meta.method-call.c++
754*5c90c05cSAndroid Build Coastguard Worker                - include: comments
755*5c90c05cSAndroid Build Coastguard Worker                - match: \(
756*5c90c05cSAndroid Build Coastguard Worker                  scope: punctuation.section.group.begin.c++
757*5c90c05cSAndroid Build Coastguard Worker                  set: members-inside-function-call
758*5c90c05cSAndroid Build Coastguard Worker                - match: (?=\S) # safety pop
759*5c90c05cSAndroid Build Coastguard Worker                  pop: true
760*5c90c05cSAndroid Build Coastguard Worker            - include: expressions
761*5c90c05cSAndroid Build Coastguard Worker    # Explicit base-class access
762*5c90c05cSAndroid Build Coastguard Worker    - match: ({{identifier}})\s*(::)
763*5c90c05cSAndroid Build Coastguard Worker      captures:
764*5c90c05cSAndroid Build Coastguard Worker        1: variable.other.base-class.c++
765*5c90c05cSAndroid Build Coastguard Worker        2: punctuation.accessor.double-colon.c++
766*5c90c05cSAndroid Build Coastguard Worker      set: members-after-accessor-junction # reset
767*5c90c05cSAndroid Build Coastguard Worker    # Just a regular member variable
768*5c90c05cSAndroid Build Coastguard Worker    - match: '{{identifier}}'
769*5c90c05cSAndroid Build Coastguard Worker      scope: variable.other.readwrite.member.c++
770*5c90c05cSAndroid Build Coastguard Worker      pop: true
771*5c90c05cSAndroid Build Coastguard Worker
772*5c90c05cSAndroid Build Coastguard Worker  members-dot:
773*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#access-illegal
774*5c90c05cSAndroid Build Coastguard Worker    # No lookahead required because members-dot goes after operators in the
775*5c90c05cSAndroid Build Coastguard Worker    # early-expressions-after-generic-type context. This means triple dots
776*5c90c05cSAndroid Build Coastguard Worker    # (i.e. "..." or "variadic") is attempted first.
777*5c90c05cSAndroid Build Coastguard Worker    - match: \.
778*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.accessor.dot.c++
779*5c90c05cSAndroid Build Coastguard Worker      push: members-after-accessor-junction
780*5c90c05cSAndroid Build Coastguard Worker
781*5c90c05cSAndroid Build Coastguard Worker  members-arrow:
782*5c90c05cSAndroid Build Coastguard Worker    # This needs to be before operators in the
783*5c90c05cSAndroid Build Coastguard Worker    # early-expressions-after-generic-type context because otherwise the "->"
784*5c90c05cSAndroid Build Coastguard Worker    # from the C language will match.
785*5c90c05cSAndroid Build Coastguard Worker    - match: ->
786*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.accessor.arrow.c++
787*5c90c05cSAndroid Build Coastguard Worker      push: members-after-accessor-junction
788*5c90c05cSAndroid Build Coastguard Worker
789*5c90c05cSAndroid Build Coastguard Worker  typedef:
790*5c90c05cSAndroid Build Coastguard Worker    - match: \btypedef\b
791*5c90c05cSAndroid Build Coastguard Worker      scope: storage.type.c++
792*5c90c05cSAndroid Build Coastguard Worker      push:
793*5c90c05cSAndroid Build Coastguard Worker        - match: ({{identifier}})?\s*(?=;)
794*5c90c05cSAndroid Build Coastguard Worker          captures:
795*5c90c05cSAndroid Build Coastguard Worker            1: entity.name.type.typedef.c++
796*5c90c05cSAndroid Build Coastguard Worker          pop: true
797*5c90c05cSAndroid Build Coastguard Worker        - match: \b(struct)\s+({{identifier}})\b
798*5c90c05cSAndroid Build Coastguard Worker          captures:
799*5c90c05cSAndroid Build Coastguard Worker            1: storage.type.c++
800*5c90c05cSAndroid Build Coastguard Worker        - include: expressions-minus-generic-type
801*5c90c05cSAndroid Build Coastguard Worker
802*5c90c05cSAndroid Build Coastguard Worker  parens:
803*5c90c05cSAndroid Build Coastguard Worker    - match: \(
804*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.group.begin.c++
805*5c90c05cSAndroid Build Coastguard Worker      push:
806*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.group.c++
807*5c90c05cSAndroid Build Coastguard Worker        - match: \)
808*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.group.end.c++
809*5c90c05cSAndroid Build Coastguard Worker          pop: true
810*5c90c05cSAndroid Build Coastguard Worker        - include: expressions
811*5c90c05cSAndroid Build Coastguard Worker
812*5c90c05cSAndroid Build Coastguard Worker  brackets:
813*5c90c05cSAndroid Build Coastguard Worker    - match: \[
814*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.brackets.begin.c++
815*5c90c05cSAndroid Build Coastguard Worker      push:
816*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.brackets.c++
817*5c90c05cSAndroid Build Coastguard Worker        - match: \]
818*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.brackets.end.c++
819*5c90c05cSAndroid Build Coastguard Worker          pop: true
820*5c90c05cSAndroid Build Coastguard Worker        - include: expressions
821*5c90c05cSAndroid Build Coastguard Worker
822*5c90c05cSAndroid Build Coastguard Worker  function-trailing-return-type:
823*5c90c05cSAndroid Build Coastguard Worker    - match: '{{non_angle_brackets}}'
824*5c90c05cSAndroid Build Coastguard Worker      pop: true
825*5c90c05cSAndroid Build Coastguard Worker    - include: angle-brackets
826*5c90c05cSAndroid Build Coastguard Worker    - include: types
827*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers-parens
828*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers
829*5c90c05cSAndroid Build Coastguard Worker    - include: identifiers
830*5c90c05cSAndroid Build Coastguard Worker    - match: \*|&
831*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.c++
832*5c90c05cSAndroid Build Coastguard Worker    - include: function-trailing-return-type-parens
833*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\S)'
834*5c90c05cSAndroid Build Coastguard Worker      pop: true
835*5c90c05cSAndroid Build Coastguard Worker
836*5c90c05cSAndroid Build Coastguard Worker  function-trailing-return-type-parens:
837*5c90c05cSAndroid Build Coastguard Worker    - match: \(
838*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.group.begin.c++
839*5c90c05cSAndroid Build Coastguard Worker      push:
840*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.group.c++
841*5c90c05cSAndroid Build Coastguard Worker        - match: \)
842*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.group.end.c++
843*5c90c05cSAndroid Build Coastguard Worker          pop: true
844*5c90c05cSAndroid Build Coastguard Worker        - include: function-trailing-return-type
845*5c90c05cSAndroid Build Coastguard Worker
846*5c90c05cSAndroid Build Coastguard Worker  ## Detection of function and data structure definitions at the global level
847*5c90c05cSAndroid Build Coastguard Worker
848*5c90c05cSAndroid Build Coastguard Worker  global-modifier:
849*5c90c05cSAndroid Build Coastguard Worker    - include: comments
850*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers-parens
851*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers
852*5c90c05cSAndroid Build Coastguard Worker    # Constructors and destructors don't have a type
853*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}\s*::\s*{{identifier}}\s*(\(|$))'
854*5c90c05cSAndroid Build Coastguard Worker      set:
855*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.function.c++ entity.name.function.constructor.c++
856*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
857*5c90c05cSAndroid Build Coastguard Worker        - match: '(?=[^\w\s])'
858*5c90c05cSAndroid Build Coastguard Worker          set: function-definition-params
859*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}\s*::\s*~{{identifier}}\s*(\(|$))'
860*5c90c05cSAndroid Build Coastguard Worker      set:
861*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.function.c++ entity.name.function.destructor.c++
862*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
863*5c90c05cSAndroid Build Coastguard Worker        - match: '~{{identifier}}'
864*5c90c05cSAndroid Build Coastguard Worker        - match: '(?=[^\w\s])'
865*5c90c05cSAndroid Build Coastguard Worker          set: function-definition-params
866*5c90c05cSAndroid Build Coastguard Worker    # If we see a path ending in :: before a newline, we don't know if it is
867*5c90c05cSAndroid Build Coastguard Worker    # a constructor or destructor, or a long return type, so we are just going
868*5c90c05cSAndroid Build Coastguard Worker    # to treat it like a regular function. Most likely it is a constructor,
869*5c90c05cSAndroid Build Coastguard Worker    # since it doesn't seem most developers would create such a long typename.
870*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}\s*::\s*$)'
871*5c90c05cSAndroid Build Coastguard Worker      set:
872*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.function.c++ entity.name.function.c++
873*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
874*5c90c05cSAndroid Build Coastguard Worker        - match: '~{{identifier}}'
875*5c90c05cSAndroid Build Coastguard Worker        - match: '(?=[^\w\s])'
876*5c90c05cSAndroid Build Coastguard Worker          set: function-definition-params
877*5c90c05cSAndroid Build Coastguard Worker    - include: unique-strings
878*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\S)'
879*5c90c05cSAndroid Build Coastguard Worker      set: global-type
880*5c90c05cSAndroid Build Coastguard Worker
881*5c90c05cSAndroid Build Coastguard Worker  global-type:
882*5c90c05cSAndroid Build Coastguard Worker    - include: comments
883*5c90c05cSAndroid Build Coastguard Worker    - match: \*|&
884*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.c++
885*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\b({{control_keywords}}|{{operator_keywords}}|{{casts}}|{{memory_operators}}|{{other_keywords}}|operator)\b)'
886*5c90c05cSAndroid Build Coastguard Worker      pop: true
887*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\s)'
888*5c90c05cSAndroid Build Coastguard Worker      set: global-maybe-function
889*5c90c05cSAndroid Build Coastguard Worker    # If a class/struct/enum followed by a name that is not a macro or declspec
890*5c90c05cSAndroid Build Coastguard Worker    # then this is likely a return type of a function. This is uncommon.
891*5c90c05cSAndroid Build Coastguard Worker    - match: |-
892*5c90c05cSAndroid Build Coastguard Worker        (?x:
893*5c90c05cSAndroid Build Coastguard Worker          ({{before_tag}})
894*5c90c05cSAndroid Build Coastguard Worker          \s+
895*5c90c05cSAndroid Build Coastguard Worker          (?=
896*5c90c05cSAndroid Build Coastguard Worker            (?![[:upper:][:digit:]_]+\b|__declspec|{{before_tag}})
897*5c90c05cSAndroid Build Coastguard Worker            {{path_lookahead}}
898*5c90c05cSAndroid Build Coastguard Worker            (\s+{{identifier}}\s*\(|\s*[*&])
899*5c90c05cSAndroid Build Coastguard Worker          )
900*5c90c05cSAndroid Build Coastguard Worker        )
901*5c90c05cSAndroid Build Coastguard Worker      captures:
902*5c90c05cSAndroid Build Coastguard Worker        1: storage.type.c++
903*5c90c05cSAndroid Build Coastguard Worker      set:
904*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
905*5c90c05cSAndroid Build Coastguard Worker        - match: ''
906*5c90c05cSAndroid Build Coastguard Worker          set: global-maybe-function
907*5c90c05cSAndroid Build Coastguard Worker    # The previous match handles return types of struct/enum/etc from a func,
908*5c90c05cSAndroid Build Coastguard Worker    # there this one exits the context to allow matching an actual struct/class
909*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\b({{before_tag}})\b)'
910*5c90c05cSAndroid Build Coastguard Worker      set: data-structures
911*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\b({{casts}})\b\s*<)'
912*5c90c05cSAndroid Build Coastguard Worker      pop: true
913*5c90c05cSAndroid Build Coastguard Worker    - match: '{{non_angle_brackets}}'
914*5c90c05cSAndroid Build Coastguard Worker      pop: true
915*5c90c05cSAndroid Build Coastguard Worker    - include: angle-brackets
916*5c90c05cSAndroid Build Coastguard Worker    - include: types
917*5c90c05cSAndroid Build Coastguard Worker    # Allow a macro call
918*5c90c05cSAndroid Build Coastguard Worker    - match: '({{identifier}})\s*(\()(?=[^\)]+\))'
919*5c90c05cSAndroid Build Coastguard Worker      captures:
920*5c90c05cSAndroid Build Coastguard Worker        1: variable.function.c++
921*5c90c05cSAndroid Build Coastguard Worker        2: meta.group.c++ punctuation.section.group.begin.c++
922*5c90c05cSAndroid Build Coastguard Worker      push:
923*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.function-call.c++
924*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.group.c++
925*5c90c05cSAndroid Build Coastguard Worker        - match: '\)'
926*5c90c05cSAndroid Build Coastguard Worker          scope: meta.group.c++ punctuation.section.group.end.c++
927*5c90c05cSAndroid Build Coastguard Worker          pop: true
928*5c90c05cSAndroid Build Coastguard Worker        - include: expressions
929*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}\s*\()'
930*5c90c05cSAndroid Build Coastguard Worker      set:
931*5c90c05cSAndroid Build Coastguard Worker        - include: function-call
932*5c90c05cSAndroid Build Coastguard Worker        - match: ''
933*5c90c05cSAndroid Build Coastguard Worker          pop: true
934*5c90c05cSAndroid Build Coastguard Worker    - include: variables
935*5c90c05cSAndroid Build Coastguard Worker    - include: constants
936*5c90c05cSAndroid Build Coastguard Worker    - include: identifiers
937*5c90c05cSAndroid Build Coastguard Worker    - match: (?=\W)
938*5c90c05cSAndroid Build Coastguard Worker      pop: true
939*5c90c05cSAndroid Build Coastguard Worker
940*5c90c05cSAndroid Build Coastguard Worker  global-maybe-function:
941*5c90c05cSAndroid Build Coastguard Worker    - include: comments
942*5c90c05cSAndroid Build Coastguard Worker    # Consume pointer info, macros and any type info that was offset by macros
943*5c90c05cSAndroid Build Coastguard Worker    - match: \*|&
944*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.c++
945*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\b({{control_keywords}}|{{operator_keywords}}|{{casts}}|{{memory_operators}}|{{other_keywords}})\b)'
946*5c90c05cSAndroid Build Coastguard Worker      pop: true
947*5c90c05cSAndroid Build Coastguard Worker    - match: '\b({{type_qualifier}})\b'
948*5c90c05cSAndroid Build Coastguard Worker      scope: storage.modifier.c++
949*5c90c05cSAndroid Build Coastguard Worker    - match: '{{non_angle_brackets}}'
950*5c90c05cSAndroid Build Coastguard Worker      pop: true
951*5c90c05cSAndroid Build Coastguard Worker    - include: angle-brackets
952*5c90c05cSAndroid Build Coastguard Worker    - include: types
953*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers-parens
954*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers
955*5c90c05cSAndroid Build Coastguard Worker    # All uppercase identifier just before a newline is most likely a macro
956*5c90c05cSAndroid Build Coastguard Worker    - match: '[[:upper:][:digit:]_]+\s*$'
957*5c90c05cSAndroid Build Coastguard Worker    # Operator overloading
958*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=({{path_lookahead}}\s*(?:{{generic_lookahead}})?::\s*)?{{operator_method_name}}\s*(\(|$))'
959*5c90c05cSAndroid Build Coastguard Worker      set:
960*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.function.c++ entity.name.function.c++
961*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
962*5c90c05cSAndroid Build Coastguard Worker        - match: '(?=\s*(\(|$))'
963*5c90c05cSAndroid Build Coastguard Worker          set: function-definition-params
964*5c90c05cSAndroid Build Coastguard Worker    # Identifier that is not the function name - likely a macro or type
965*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}([ \t]+|[*&])(?!\s*(<|::|\(|$)))'
966*5c90c05cSAndroid Build Coastguard Worker      push:
967*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
968*5c90c05cSAndroid Build Coastguard Worker        - match: ''
969*5c90c05cSAndroid Build Coastguard Worker          pop: true
970*5c90c05cSAndroid Build Coastguard Worker    # Real function definition
971*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}({{generic_lookahead}}({{path_lookahead}})?)\s*(\(|$))'
972*5c90c05cSAndroid Build Coastguard Worker      set: [function-definition-params, global-function-identifier-generic]
973*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}\s*(\(|$))'
974*5c90c05cSAndroid Build Coastguard Worker      set: [function-definition-params, global-function-identifier]
975*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}\s*::\s*$)'
976*5c90c05cSAndroid Build Coastguard Worker      set: [function-definition-params, global-function-identifier]
977*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\S)'
978*5c90c05cSAndroid Build Coastguard Worker      pop: true
979*5c90c05cSAndroid Build Coastguard Worker
980*5c90c05cSAndroid Build Coastguard Worker  global-function-identifier-generic:
981*5c90c05cSAndroid Build Coastguard Worker    - include: angle-brackets
982*5c90c05cSAndroid Build Coastguard Worker    - match: '::'
983*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.accessor.c++
984*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{identifier}}<.*>\s*\()'
985*5c90c05cSAndroid Build Coastguard Worker      push:
986*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: entity.name.function.c++
987*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
988*5c90c05cSAndroid Build Coastguard Worker        - match: '(?=<)'
989*5c90c05cSAndroid Build Coastguard Worker          pop: true
990*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{identifier}}\s*\()'
991*5c90c05cSAndroid Build Coastguard Worker      push:
992*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: entity.name.function.c++
993*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
994*5c90c05cSAndroid Build Coastguard Worker        - match: ''
995*5c90c05cSAndroid Build Coastguard Worker          pop: true
996*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\()'
997*5c90c05cSAndroid Build Coastguard Worker      pop: true
998*5c90c05cSAndroid Build Coastguard Worker
999*5c90c05cSAndroid Build Coastguard Worker  global-function-identifier:
1000*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: entity.name.function.c++
1001*5c90c05cSAndroid Build Coastguard Worker    - include: identifiers
1002*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\S)'
1003*5c90c05cSAndroid Build Coastguard Worker      pop: true
1004*5c90c05cSAndroid Build Coastguard Worker
1005*5c90c05cSAndroid Build Coastguard Worker  function-definition-params:
1006*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.function.c++
1007*5c90c05cSAndroid Build Coastguard Worker    - include: comments
1008*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\()'
1009*5c90c05cSAndroid Build Coastguard Worker      set:
1010*5c90c05cSAndroid Build Coastguard Worker        - match: \(
1011*5c90c05cSAndroid Build Coastguard Worker          scope: meta.function.parameters.c++ meta.group.c++ punctuation.section.group.begin.c++
1012*5c90c05cSAndroid Build Coastguard Worker          set:
1013*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: meta.function.parameters.c++ meta.group.c++
1014*5c90c05cSAndroid Build Coastguard Worker            - match : \)
1015*5c90c05cSAndroid Build Coastguard Worker              scope: punctuation.section.group.end.c++
1016*5c90c05cSAndroid Build Coastguard Worker              set: function-definition-continue
1017*5c90c05cSAndroid Build Coastguard Worker            - match: '\bvoid\b'
1018*5c90c05cSAndroid Build Coastguard Worker              scope: storage.type.c++
1019*5c90c05cSAndroid Build Coastguard Worker            - match: '{{identifier}}(?=\s*(\[|,|\)|=))'
1020*5c90c05cSAndroid Build Coastguard Worker              scope: variable.parameter.c++
1021*5c90c05cSAndroid Build Coastguard Worker            - match: '='
1022*5c90c05cSAndroid Build Coastguard Worker              scope: keyword.operator.assignment.c++
1023*5c90c05cSAndroid Build Coastguard Worker              push:
1024*5c90c05cSAndroid Build Coastguard Worker                - match: '(?=,|\))'
1025*5c90c05cSAndroid Build Coastguard Worker                  pop: true
1026*5c90c05cSAndroid Build Coastguard Worker                - include: expressions-minus-generic-type
1027*5c90c05cSAndroid Build Coastguard Worker                - include: scope:source.c#preprocessor-line-continuation
1028*5c90c05cSAndroid Build Coastguard Worker            - include: expressions-minus-generic-type
1029*5c90c05cSAndroid Build Coastguard Worker            - include: scope:source.c#preprocessor-line-continuation
1030*5c90c05cSAndroid Build Coastguard Worker    - match: (?=\S)
1031*5c90c05cSAndroid Build Coastguard Worker      pop: true
1032*5c90c05cSAndroid Build Coastguard Worker
1033*5c90c05cSAndroid Build Coastguard Worker  function-definition-continue:
1034*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.function.c++
1035*5c90c05cSAndroid Build Coastguard Worker    - include: comments
1036*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=;)'
1037*5c90c05cSAndroid Build Coastguard Worker      pop: true
1038*5c90c05cSAndroid Build Coastguard Worker    - match: '->'
1039*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.separator.c++
1040*5c90c05cSAndroid Build Coastguard Worker      set: function-definition-trailing-return
1041*5c90c05cSAndroid Build Coastguard Worker    - include: function-specifiers
1042*5c90c05cSAndroid Build Coastguard Worker    - match: '='
1043*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.assignment.c++
1044*5c90c05cSAndroid Build Coastguard Worker    - match: '&'
1045*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.c++
1046*5c90c05cSAndroid Build Coastguard Worker    - match: \b0\b
1047*5c90c05cSAndroid Build Coastguard Worker      scope: constant.numeric.c++
1048*5c90c05cSAndroid Build Coastguard Worker    - match: \b(default|delete)\b
1049*5c90c05cSAndroid Build Coastguard Worker      scope: storage.modifier.c++
1050*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\{)'
1051*5c90c05cSAndroid Build Coastguard Worker      set: function-definition-body
1052*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\S)'
1053*5c90c05cSAndroid Build Coastguard Worker      pop: true
1054*5c90c05cSAndroid Build Coastguard Worker
1055*5c90c05cSAndroid Build Coastguard Worker  function-definition-trailing-return:
1056*5c90c05cSAndroid Build Coastguard Worker    - include: comments
1057*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=;)'
1058*5c90c05cSAndroid Build Coastguard Worker      pop: true
1059*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\{)'
1060*5c90c05cSAndroid Build Coastguard Worker      set: function-definition-body
1061*5c90c05cSAndroid Build Coastguard Worker    - include: function-specifiers
1062*5c90c05cSAndroid Build Coastguard Worker    - include: function-trailing-return-type
1063*5c90c05cSAndroid Build Coastguard Worker
1064*5c90c05cSAndroid Build Coastguard Worker  function-definition-body:
1065*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.function.c++ meta.block.c++
1066*5c90c05cSAndroid Build Coastguard Worker    - match: '\{'
1067*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.begin.c++
1068*5c90c05cSAndroid Build Coastguard Worker      set:
1069*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.function.c++ meta.block.c++
1070*5c90c05cSAndroid Build Coastguard Worker        - match: '\}'
1071*5c90c05cSAndroid Build Coastguard Worker          scope: meta.function.c++ meta.block.c++ punctuation.section.block.end.c++
1072*5c90c05cSAndroid Build Coastguard Worker          pop: true
1073*5c90c05cSAndroid Build Coastguard Worker        - match: (?=^\s*#\s*(elif|else|endif)\b)
1074*5c90c05cSAndroid Build Coastguard Worker          pop: true
1075*5c90c05cSAndroid Build Coastguard Worker        - match: '(?=({{before_tag}})([^(;]+$|.*\{))'
1076*5c90c05cSAndroid Build Coastguard Worker          push: data-structures
1077*5c90c05cSAndroid Build Coastguard Worker        - include: statements
1078*5c90c05cSAndroid Build Coastguard Worker
1079*5c90c05cSAndroid Build Coastguard Worker  ## Data structures including classes, structs, unions and enums
1080*5c90c05cSAndroid Build Coastguard Worker
1081*5c90c05cSAndroid Build Coastguard Worker  data-structures:
1082*5c90c05cSAndroid Build Coastguard Worker    - match: '\bclass\b'
1083*5c90c05cSAndroid Build Coastguard Worker      scope: storage.type.c++
1084*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-class-definition
1085*5c90c05cSAndroid Build Coastguard Worker    # Detect variable type definitions using struct/enum/union followed by a tag
1086*5c90c05cSAndroid Build Coastguard Worker    - match: '\b({{before_tag}})(?=\s+{{path_lookahead}}\s+{{path_lookahead}}\s*[=;\[])'
1087*5c90c05cSAndroid Build Coastguard Worker      scope: storage.type.c++
1088*5c90c05cSAndroid Build Coastguard Worker    - match: '\bstruct\b'
1089*5c90c05cSAndroid Build Coastguard Worker      scope: storage.type.c++
1090*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-struct-definition
1091*5c90c05cSAndroid Build Coastguard Worker    - match: '\benum(\s+(class|struct))?\b'
1092*5c90c05cSAndroid Build Coastguard Worker      scope: storage.type.c++
1093*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-enum-definition
1094*5c90c05cSAndroid Build Coastguard Worker    - match: '\bunion\b'
1095*5c90c05cSAndroid Build Coastguard Worker      scope: storage.type.c++
1096*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-union-definition
1097*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\S)'
1098*5c90c05cSAndroid Build Coastguard Worker      pop: true
1099*5c90c05cSAndroid Build Coastguard Worker
1100*5c90c05cSAndroid Build Coastguard Worker  preprocessor-workaround-eat-macro-before-identifier:
1101*5c90c05cSAndroid Build Coastguard Worker    # Handle macros so they aren't matched as the class name
1102*5c90c05cSAndroid Build Coastguard Worker    - match: ({{macro_identifier}})(?=\s+~?{{identifier}})
1103*5c90c05cSAndroid Build Coastguard Worker      captures:
1104*5c90c05cSAndroid Build Coastguard Worker        1: meta.assumed-macro.c
1105*5c90c05cSAndroid Build Coastguard Worker
1106*5c90c05cSAndroid Build Coastguard Worker  data-structures-class-definition:
1107*5c90c05cSAndroid Build Coastguard Worker    - meta_scope: meta.class.c++
1108*5c90c05cSAndroid Build Coastguard Worker    - include: data-structures-definition-common-begin
1109*5c90c05cSAndroid Build Coastguard Worker    - match: '{{identifier}}(?={{data_structures_forward_decl_lookahead}})'
1110*5c90c05cSAndroid Build Coastguard Worker      scope: entity.name.class.forward-decl.c++
1111*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-class-definition-after-identifier
1112*5c90c05cSAndroid Build Coastguard Worker    - match: '{{identifier}}'
1113*5c90c05cSAndroid Build Coastguard Worker      scope: entity.name.class.c++
1114*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-class-definition-after-identifier
1115*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=[:{])'
1116*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-class-definition-after-identifier
1117*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=;)'
1118*5c90c05cSAndroid Build Coastguard Worker      pop: true
1119*5c90c05cSAndroid Build Coastguard Worker
1120*5c90c05cSAndroid Build Coastguard Worker  data-structures-class-definition-after-identifier:
1121*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.class.c++
1122*5c90c05cSAndroid Build Coastguard Worker    - include: data-structures-definition-common-begin
1123*5c90c05cSAndroid Build Coastguard Worker    # No matching of identifiers since they should all be macros at this point
1124*5c90c05cSAndroid Build Coastguard Worker    - include: data-structures-definition-common-end
1125*5c90c05cSAndroid Build Coastguard Worker    - match: '\{'
1126*5c90c05cSAndroid Build Coastguard Worker      scope: meta.block.c++ punctuation.section.block.begin.c++
1127*5c90c05cSAndroid Build Coastguard Worker      set:
1128*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.class.c++ meta.block.c++
1129*5c90c05cSAndroid Build Coastguard Worker        - match: '\}'
1130*5c90c05cSAndroid Build Coastguard Worker          scope: meta.class.c++ meta.block.c++ punctuation.section.block.end.c++
1131*5c90c05cSAndroid Build Coastguard Worker          pop: true
1132*5c90c05cSAndroid Build Coastguard Worker        - include: data-structures-body
1133*5c90c05cSAndroid Build Coastguard Worker
1134*5c90c05cSAndroid Build Coastguard Worker  data-structures-struct-definition:
1135*5c90c05cSAndroid Build Coastguard Worker    - meta_scope: meta.struct.c++
1136*5c90c05cSAndroid Build Coastguard Worker    - include: data-structures-definition-common-begin
1137*5c90c05cSAndroid Build Coastguard Worker    - match: '{{identifier}}(?={{data_structures_forward_decl_lookahead}})'
1138*5c90c05cSAndroid Build Coastguard Worker      scope: entity.name.struct.forward-decl.c++
1139*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-struct-definition-after-identifier
1140*5c90c05cSAndroid Build Coastguard Worker    - match: '{{identifier}}'
1141*5c90c05cSAndroid Build Coastguard Worker      scope: entity.name.struct.c++
1142*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-struct-definition-after-identifier
1143*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=[:{])'
1144*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-struct-definition-after-identifier
1145*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=;)'
1146*5c90c05cSAndroid Build Coastguard Worker      pop: true
1147*5c90c05cSAndroid Build Coastguard Worker
1148*5c90c05cSAndroid Build Coastguard Worker  data-structures-struct-definition-after-identifier:
1149*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.struct.c++
1150*5c90c05cSAndroid Build Coastguard Worker    - include: data-structures-definition-common-begin
1151*5c90c05cSAndroid Build Coastguard Worker    # No matching of identifiers since they should all be macros at this point
1152*5c90c05cSAndroid Build Coastguard Worker    - include: data-structures-definition-common-end
1153*5c90c05cSAndroid Build Coastguard Worker    - match: '\{'
1154*5c90c05cSAndroid Build Coastguard Worker      scope: meta.block.c++ punctuation.section.block.begin.c++
1155*5c90c05cSAndroid Build Coastguard Worker      set:
1156*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.struct.c++ meta.block.c++
1157*5c90c05cSAndroid Build Coastguard Worker        - match: '\}'
1158*5c90c05cSAndroid Build Coastguard Worker          scope: meta.struct.c++ meta.block.c++ punctuation.section.block.end.c++
1159*5c90c05cSAndroid Build Coastguard Worker          pop: true
1160*5c90c05cSAndroid Build Coastguard Worker        - include: data-structures-body
1161*5c90c05cSAndroid Build Coastguard Worker
1162*5c90c05cSAndroid Build Coastguard Worker  data-structures-enum-definition:
1163*5c90c05cSAndroid Build Coastguard Worker    - meta_scope: meta.enum.c++
1164*5c90c05cSAndroid Build Coastguard Worker    - include: data-structures-definition-common-begin
1165*5c90c05cSAndroid Build Coastguard Worker    - match: '{{identifier}}(?={{data_structures_forward_decl_lookahead}})'
1166*5c90c05cSAndroid Build Coastguard Worker      scope: entity.name.enum.forward-decl.c++
1167*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-enum-definition-after-identifier
1168*5c90c05cSAndroid Build Coastguard Worker    - match: '{{identifier}}'
1169*5c90c05cSAndroid Build Coastguard Worker      scope: entity.name.enum.c++
1170*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-enum-definition-after-identifier
1171*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=[:{])'
1172*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-enum-definition-after-identifier
1173*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=;)'
1174*5c90c05cSAndroid Build Coastguard Worker      pop: true
1175*5c90c05cSAndroid Build Coastguard Worker
1176*5c90c05cSAndroid Build Coastguard Worker  data-structures-enum-definition-after-identifier:
1177*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.enum.c++
1178*5c90c05cSAndroid Build Coastguard Worker    - include: data-structures-definition-common-begin
1179*5c90c05cSAndroid Build Coastguard Worker    # No matching of identifiers since they should all be macros at this point
1180*5c90c05cSAndroid Build Coastguard Worker    - include: data-structures-definition-common-end
1181*5c90c05cSAndroid Build Coastguard Worker    - match: '\{'
1182*5c90c05cSAndroid Build Coastguard Worker      scope: meta.block.c++ punctuation.section.block.begin.c++
1183*5c90c05cSAndroid Build Coastguard Worker      set:
1184*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.enum.c++ meta.block.c++
1185*5c90c05cSAndroid Build Coastguard Worker        # Enums don't support methods so we have a simplified body
1186*5c90c05cSAndroid Build Coastguard Worker        - match: '\}'
1187*5c90c05cSAndroid Build Coastguard Worker          scope: meta.enum.c++ meta.block.c++ punctuation.section.block.end.c++
1188*5c90c05cSAndroid Build Coastguard Worker          pop: true
1189*5c90c05cSAndroid Build Coastguard Worker        - include: statements
1190*5c90c05cSAndroid Build Coastguard Worker
1191*5c90c05cSAndroid Build Coastguard Worker  data-structures-union-definition:
1192*5c90c05cSAndroid Build Coastguard Worker    - meta_scope: meta.union.c++
1193*5c90c05cSAndroid Build Coastguard Worker    - include: data-structures-definition-common-begin
1194*5c90c05cSAndroid Build Coastguard Worker    - match: '{{identifier}}(?={{data_structures_forward_decl_lookahead}})'
1195*5c90c05cSAndroid Build Coastguard Worker      scope: entity.name.union.forward-decl.c++
1196*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-union-definition-after-identifier
1197*5c90c05cSAndroid Build Coastguard Worker    - match: '{{identifier}}'
1198*5c90c05cSAndroid Build Coastguard Worker      scope: entity.name.union.c++
1199*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-union-definition-after-identifier
1200*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=[{])'
1201*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-union-definition-after-identifier
1202*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=;)'
1203*5c90c05cSAndroid Build Coastguard Worker      pop: true
1204*5c90c05cSAndroid Build Coastguard Worker
1205*5c90c05cSAndroid Build Coastguard Worker  data-structures-union-definition-after-identifier:
1206*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.union.c++
1207*5c90c05cSAndroid Build Coastguard Worker    - include: data-structures-definition-common-begin
1208*5c90c05cSAndroid Build Coastguard Worker    # No matching of identifiers since they should all be macros at this point
1209*5c90c05cSAndroid Build Coastguard Worker    # Unions don't support base classes
1210*5c90c05cSAndroid Build Coastguard Worker    - include: angle-brackets
1211*5c90c05cSAndroid Build Coastguard Worker    - match: '\{'
1212*5c90c05cSAndroid Build Coastguard Worker      scope: meta.block.c++ punctuation.section.block.begin.c++
1213*5c90c05cSAndroid Build Coastguard Worker      set:
1214*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.union.c++ meta.block.c++
1215*5c90c05cSAndroid Build Coastguard Worker        - match: '\}'
1216*5c90c05cSAndroid Build Coastguard Worker          scope: meta.union.c++ meta.block.c++ punctuation.section.block.end.c++
1217*5c90c05cSAndroid Build Coastguard Worker          pop: true
1218*5c90c05cSAndroid Build Coastguard Worker        - include: data-structures-body
1219*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=;)'
1220*5c90c05cSAndroid Build Coastguard Worker      pop: true
1221*5c90c05cSAndroid Build Coastguard Worker
1222*5c90c05cSAndroid Build Coastguard Worker  data-structures-definition-common-begin:
1223*5c90c05cSAndroid Build Coastguard Worker    - include: comments
1224*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\b(?:{{before_tag}}|{{control_keywords}})\b)'
1225*5c90c05cSAndroid Build Coastguard Worker      pop: true
1226*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-other
1227*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers-parens
1228*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers
1229*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-workaround-eat-macro-before-identifier
1230*5c90c05cSAndroid Build Coastguard Worker
1231*5c90c05cSAndroid Build Coastguard Worker  data-structures-definition-common-end:
1232*5c90c05cSAndroid Build Coastguard Worker    - include: angle-brackets
1233*5c90c05cSAndroid Build Coastguard Worker    - match: \bfinal\b
1234*5c90c05cSAndroid Build Coastguard Worker      scope: storage.modifier.c++
1235*5c90c05cSAndroid Build Coastguard Worker    - match: ':'
1236*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.separator.c++
1237*5c90c05cSAndroid Build Coastguard Worker      push:
1238*5c90c05cSAndroid Build Coastguard Worker        - include: comments
1239*5c90c05cSAndroid Build Coastguard Worker        - include: preprocessor-other
1240*5c90c05cSAndroid Build Coastguard Worker        - include: modifiers-parens
1241*5c90c05cSAndroid Build Coastguard Worker        - include: modifiers
1242*5c90c05cSAndroid Build Coastguard Worker        - match: '\b(virtual|{{visibility_modifiers}})\b'
1243*5c90c05cSAndroid Build Coastguard Worker          scope: storage.modifier.c++
1244*5c90c05cSAndroid Build Coastguard Worker        - match: (?={{path_lookahead}})
1245*5c90c05cSAndroid Build Coastguard Worker          push:
1246*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: entity.other.inherited-class.c++
1247*5c90c05cSAndroid Build Coastguard Worker            - include: identifiers
1248*5c90c05cSAndroid Build Coastguard Worker            - match: ''
1249*5c90c05cSAndroid Build Coastguard Worker              pop: true
1250*5c90c05cSAndroid Build Coastguard Worker        - include: angle-brackets
1251*5c90c05cSAndroid Build Coastguard Worker        - match: ','
1252*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.separator.c++
1253*5c90c05cSAndroid Build Coastguard Worker        - match: (?=\{|;)
1254*5c90c05cSAndroid Build Coastguard Worker          pop: true
1255*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=;)'
1256*5c90c05cSAndroid Build Coastguard Worker      pop: true
1257*5c90c05cSAndroid Build Coastguard Worker
1258*5c90c05cSAndroid Build Coastguard Worker  data-structures-body:
1259*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-data-structures
1260*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\btemplate\b)'
1261*5c90c05cSAndroid Build Coastguard Worker      push:
1262*5c90c05cSAndroid Build Coastguard Worker        - include: template
1263*5c90c05cSAndroid Build Coastguard Worker        - match: (?=\S)
1264*5c90c05cSAndroid Build Coastguard Worker          set: data-structures-modifier
1265*5c90c05cSAndroid Build Coastguard Worker    - include: typedef
1266*5c90c05cSAndroid Build Coastguard Worker    - match: \b({{visibility_modifiers}})\s*(:)(?!:)
1267*5c90c05cSAndroid Build Coastguard Worker      captures:
1268*5c90c05cSAndroid Build Coastguard Worker        1: storage.modifier.c++
1269*5c90c05cSAndroid Build Coastguard Worker        2: punctuation.section.class.c++
1270*5c90c05cSAndroid Build Coastguard Worker    - match: '^\s*(?=(?:~?\w+|::))'
1271*5c90c05cSAndroid Build Coastguard Worker      push: data-structures-modifier
1272*5c90c05cSAndroid Build Coastguard Worker    - include: expressions-minus-generic-type
1273*5c90c05cSAndroid Build Coastguard Worker
1274*5c90c05cSAndroid Build Coastguard Worker  data-structures-modifier:
1275*5c90c05cSAndroid Build Coastguard Worker    - match: '\bfriend\b'
1276*5c90c05cSAndroid Build Coastguard Worker      scope: storage.modifier.c++
1277*5c90c05cSAndroid Build Coastguard Worker      push:
1278*5c90c05cSAndroid Build Coastguard Worker        - match: (?=;)
1279*5c90c05cSAndroid Build Coastguard Worker          pop: true
1280*5c90c05cSAndroid Build Coastguard Worker        - match: '\{'
1281*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.block.begin.c++
1282*5c90c05cSAndroid Build Coastguard Worker          set:
1283*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: meta.block.c++
1284*5c90c05cSAndroid Build Coastguard Worker            - match: '\}'
1285*5c90c05cSAndroid Build Coastguard Worker              scope: punctuation.section.block.end.c++
1286*5c90c05cSAndroid Build Coastguard Worker              pop: true
1287*5c90c05cSAndroid Build Coastguard Worker            - include: statements
1288*5c90c05cSAndroid Build Coastguard Worker        - match: '\b({{before_tag}})\b'
1289*5c90c05cSAndroid Build Coastguard Worker          scope: storage.type.c++
1290*5c90c05cSAndroid Build Coastguard Worker        - include: expressions-minus-function-call
1291*5c90c05cSAndroid Build Coastguard Worker    - include: comments
1292*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers-parens
1293*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers
1294*5c90c05cSAndroid Build Coastguard Worker    - match: '\bstatic_assert(?=\s*\()'
1295*5c90c05cSAndroid Build Coastguard Worker      scope: meta.static-assert.c++ keyword.operator.word.c++
1296*5c90c05cSAndroid Build Coastguard Worker      push:
1297*5c90c05cSAndroid Build Coastguard Worker        - match: '\('
1298*5c90c05cSAndroid Build Coastguard Worker          scope: meta.group.c++ punctuation.section.group.begin.c++
1299*5c90c05cSAndroid Build Coastguard Worker          set:
1300*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: meta.function-call.c++ meta.group.c++
1301*5c90c05cSAndroid Build Coastguard Worker            - match: '\)'
1302*5c90c05cSAndroid Build Coastguard Worker              scope: meta.function-call.c++ meta.group.c++ punctuation.section.group.end.c++
1303*5c90c05cSAndroid Build Coastguard Worker              pop: true
1304*5c90c05cSAndroid Build Coastguard Worker            - include: expressions
1305*5c90c05cSAndroid Build Coastguard Worker    # Destructor
1306*5c90c05cSAndroid Build Coastguard Worker    - match: '(?:{{identifier}}\s*(::)\s*)?~{{identifier}}(?=\s*(\(|$))'
1307*5c90c05cSAndroid Build Coastguard Worker      scope: meta.method.destructor.c++ entity.name.function.destructor.c++
1308*5c90c05cSAndroid Build Coastguard Worker      captures:
1309*5c90c05cSAndroid Build Coastguard Worker        1: punctuation.accessor.c++
1310*5c90c05cSAndroid Build Coastguard Worker      set: method-definition-params
1311*5c90c05cSAndroid Build Coastguard Worker    # It's a macro, not a constructor if there is no type in the first param
1312*5c90c05cSAndroid Build Coastguard Worker    - match: '({{identifier}})\s*(\()(?=\s*(?!void){{identifier}}\s*[),])'
1313*5c90c05cSAndroid Build Coastguard Worker      captures:
1314*5c90c05cSAndroid Build Coastguard Worker        1: variable.function.c++
1315*5c90c05cSAndroid Build Coastguard Worker        2: meta.group.c++ punctuation.section.group.begin.c++
1316*5c90c05cSAndroid Build Coastguard Worker      push:
1317*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.function-call.c++
1318*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.group.c++
1319*5c90c05cSAndroid Build Coastguard Worker        - match: '\)'
1320*5c90c05cSAndroid Build Coastguard Worker          scope: meta.group.c++ punctuation.section.group.end.c++
1321*5c90c05cSAndroid Build Coastguard Worker          pop: true
1322*5c90c05cSAndroid Build Coastguard Worker        - include: expressions
1323*5c90c05cSAndroid Build Coastguard Worker    # Constructor
1324*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-workaround-eat-macro-before-identifier
1325*5c90c05cSAndroid Build Coastguard Worker    - match: '((?!{{before_tag}}|template){{identifier}})(?=\s*\()'
1326*5c90c05cSAndroid Build Coastguard Worker      scope: meta.method.constructor.c++ entity.name.function.constructor.c++
1327*5c90c05cSAndroid Build Coastguard Worker      set: method-definition-params
1328*5c90c05cSAndroid Build Coastguard Worker    # Long form constructor
1329*5c90c05cSAndroid Build Coastguard Worker    - match: '({{identifier}}\s*(::)\s*{{identifier}})(?=\s*\()'
1330*5c90c05cSAndroid Build Coastguard Worker      captures:
1331*5c90c05cSAndroid Build Coastguard Worker        1: meta.method.constructor.c++ entity.name.function.constructor.c++
1332*5c90c05cSAndroid Build Coastguard Worker        2: punctuation.accessor.c++
1333*5c90c05cSAndroid Build Coastguard Worker      push: method-definition-params
1334*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\S)'
1335*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-type
1336*5c90c05cSAndroid Build Coastguard Worker
1337*5c90c05cSAndroid Build Coastguard Worker  data-structures-type:
1338*5c90c05cSAndroid Build Coastguard Worker    - include: comments
1339*5c90c05cSAndroid Build Coastguard Worker    - match: \*|&
1340*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.c++
1341*5c90c05cSAndroid Build Coastguard Worker      # Cast methods
1342*5c90c05cSAndroid Build Coastguard Worker    - match: '(operator)\s+({{identifier}})(?=\s*(\(|$))'
1343*5c90c05cSAndroid Build Coastguard Worker      captures:
1344*5c90c05cSAndroid Build Coastguard Worker        1: keyword.control.c++
1345*5c90c05cSAndroid Build Coastguard Worker        2: meta.method.c++ entity.name.function.c++
1346*5c90c05cSAndroid Build Coastguard Worker      set: method-definition-params
1347*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\b({{control_keywords}}|{{operator_keywords}}|{{casts}}|{{memory_operators}}|{{other_keywords}}|operator)\b)'
1348*5c90c05cSAndroid Build Coastguard Worker      pop: true
1349*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\s)'
1350*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-maybe-method
1351*5c90c05cSAndroid Build Coastguard Worker    # If a class/struct/enum followed by a name that is not a macro or declspec
1352*5c90c05cSAndroid Build Coastguard Worker    # then this is likely a return type of a function. This is uncommon.
1353*5c90c05cSAndroid Build Coastguard Worker    - match: |-
1354*5c90c05cSAndroid Build Coastguard Worker        (?x:
1355*5c90c05cSAndroid Build Coastguard Worker          ({{before_tag}})
1356*5c90c05cSAndroid Build Coastguard Worker          \s+
1357*5c90c05cSAndroid Build Coastguard Worker          (?=
1358*5c90c05cSAndroid Build Coastguard Worker            (?![[:upper:][:digit:]_]+\b|__declspec|{{before_tag}})
1359*5c90c05cSAndroid Build Coastguard Worker            {{path_lookahead}}
1360*5c90c05cSAndroid Build Coastguard Worker            (\s+{{identifier}}\s*\(|\s*[*&])
1361*5c90c05cSAndroid Build Coastguard Worker          )
1362*5c90c05cSAndroid Build Coastguard Worker        )
1363*5c90c05cSAndroid Build Coastguard Worker      captures:
1364*5c90c05cSAndroid Build Coastguard Worker        1: storage.type.c++
1365*5c90c05cSAndroid Build Coastguard Worker      set:
1366*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
1367*5c90c05cSAndroid Build Coastguard Worker        - match: ''
1368*5c90c05cSAndroid Build Coastguard Worker          set: data-structures-maybe-method
1369*5c90c05cSAndroid Build Coastguard Worker    # The previous match handles return types of struct/enum/etc from a func,
1370*5c90c05cSAndroid Build Coastguard Worker    # there this one exits the context to allow matching an actual struct/class
1371*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\b({{before_tag}})\b)'
1372*5c90c05cSAndroid Build Coastguard Worker      set: data-structures
1373*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\b({{casts}})\b\s*<)'
1374*5c90c05cSAndroid Build Coastguard Worker      pop: true
1375*5c90c05cSAndroid Build Coastguard Worker    - match: '{{non_angle_brackets}}'
1376*5c90c05cSAndroid Build Coastguard Worker      pop: true
1377*5c90c05cSAndroid Build Coastguard Worker    - include: angle-brackets
1378*5c90c05cSAndroid Build Coastguard Worker    - include: types
1379*5c90c05cSAndroid Build Coastguard Worker    - include: variables
1380*5c90c05cSAndroid Build Coastguard Worker    - include: constants
1381*5c90c05cSAndroid Build Coastguard Worker    - include: identifiers
1382*5c90c05cSAndroid Build Coastguard Worker    - match: (?=[&*])
1383*5c90c05cSAndroid Build Coastguard Worker      set: data-structures-maybe-method
1384*5c90c05cSAndroid Build Coastguard Worker    - match: (?=\W)
1385*5c90c05cSAndroid Build Coastguard Worker      pop: true
1386*5c90c05cSAndroid Build Coastguard Worker
1387*5c90c05cSAndroid Build Coastguard Worker  data-structures-maybe-method:
1388*5c90c05cSAndroid Build Coastguard Worker    - include: comments
1389*5c90c05cSAndroid Build Coastguard Worker    # Consume pointer info, macros and any type info that was offset by macros
1390*5c90c05cSAndroid Build Coastguard Worker    - match: \*|&
1391*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.c++
1392*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\b({{control_keywords}}|{{operator_keywords}}|{{casts}}|{{memory_operators}}|{{other_keywords}})\b)'
1393*5c90c05cSAndroid Build Coastguard Worker      pop: true
1394*5c90c05cSAndroid Build Coastguard Worker    - match: '\b({{type_qualifier}})\b'
1395*5c90c05cSAndroid Build Coastguard Worker      scope: storage.modifier.c++
1396*5c90c05cSAndroid Build Coastguard Worker    - match: '{{non_angle_brackets}}'
1397*5c90c05cSAndroid Build Coastguard Worker      pop: true
1398*5c90c05cSAndroid Build Coastguard Worker    - include: angle-brackets
1399*5c90c05cSAndroid Build Coastguard Worker    - include: types
1400*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers-parens
1401*5c90c05cSAndroid Build Coastguard Worker    - include: modifiers
1402*5c90c05cSAndroid Build Coastguard Worker    # Operator overloading
1403*5c90c05cSAndroid Build Coastguard Worker    - match: '{{operator_method_name}}(?=\s*(\(|$))'
1404*5c90c05cSAndroid Build Coastguard Worker      scope: meta.method.c++ entity.name.function.c++
1405*5c90c05cSAndroid Build Coastguard Worker      set: method-definition-params
1406*5c90c05cSAndroid Build Coastguard Worker    # Identifier that is not the function name - likely a macro or type
1407*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}([ \t]+|[*&])(?!\s*(<|::|\()))'
1408*5c90c05cSAndroid Build Coastguard Worker      push:
1409*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
1410*5c90c05cSAndroid Build Coastguard Worker        - match: ''
1411*5c90c05cSAndroid Build Coastguard Worker          pop: true
1412*5c90c05cSAndroid Build Coastguard Worker    # Real function definition
1413*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}({{generic_lookahead}})\s*(\())'
1414*5c90c05cSAndroid Build Coastguard Worker      set: [method-definition-params, data-structures-function-identifier-generic]
1415*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}\s*(\())'
1416*5c90c05cSAndroid Build Coastguard Worker      set: [method-definition-params, data-structures-function-identifier]
1417*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{path_lookahead}}\s*::\s*$)'
1418*5c90c05cSAndroid Build Coastguard Worker      set: [method-definition-params, data-structures-function-identifier]
1419*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\S)'
1420*5c90c05cSAndroid Build Coastguard Worker      pop: true
1421*5c90c05cSAndroid Build Coastguard Worker
1422*5c90c05cSAndroid Build Coastguard Worker  data-structures-function-identifier-generic:
1423*5c90c05cSAndroid Build Coastguard Worker    - include: angle-brackets
1424*5c90c05cSAndroid Build Coastguard Worker    - match: '(?={{identifier}})'
1425*5c90c05cSAndroid Build Coastguard Worker      push:
1426*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: entity.name.function.c++
1427*5c90c05cSAndroid Build Coastguard Worker        - include: identifiers
1428*5c90c05cSAndroid Build Coastguard Worker        - match: '(?=<)'
1429*5c90c05cSAndroid Build Coastguard Worker          pop: true
1430*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\()'
1431*5c90c05cSAndroid Build Coastguard Worker      pop: true
1432*5c90c05cSAndroid Build Coastguard Worker
1433*5c90c05cSAndroid Build Coastguard Worker  data-structures-function-identifier:
1434*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: entity.name.function.c++
1435*5c90c05cSAndroid Build Coastguard Worker    - include: identifiers
1436*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\S)'
1437*5c90c05cSAndroid Build Coastguard Worker      pop: true
1438*5c90c05cSAndroid Build Coastguard Worker
1439*5c90c05cSAndroid Build Coastguard Worker  method-definition-params:
1440*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.method.c++
1441*5c90c05cSAndroid Build Coastguard Worker    - include: comments
1442*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\()'
1443*5c90c05cSAndroid Build Coastguard Worker      set:
1444*5c90c05cSAndroid Build Coastguard Worker        - match: \(
1445*5c90c05cSAndroid Build Coastguard Worker          scope: meta.method.parameters.c++ meta.group.c++ punctuation.section.group.begin.c++
1446*5c90c05cSAndroid Build Coastguard Worker          set:
1447*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: meta.method.parameters.c++ meta.group.c++
1448*5c90c05cSAndroid Build Coastguard Worker            - match : \)
1449*5c90c05cSAndroid Build Coastguard Worker              scope: punctuation.section.group.end.c++
1450*5c90c05cSAndroid Build Coastguard Worker              set: method-definition-continue
1451*5c90c05cSAndroid Build Coastguard Worker            - match: '\bvoid\b'
1452*5c90c05cSAndroid Build Coastguard Worker              scope: storage.type.c++
1453*5c90c05cSAndroid Build Coastguard Worker            - match: '{{identifier}}(?=\s*(\[|,|\)|=))'
1454*5c90c05cSAndroid Build Coastguard Worker              scope: variable.parameter.c++
1455*5c90c05cSAndroid Build Coastguard Worker            - match: '='
1456*5c90c05cSAndroid Build Coastguard Worker              scope: keyword.operator.assignment.c++
1457*5c90c05cSAndroid Build Coastguard Worker              push:
1458*5c90c05cSAndroid Build Coastguard Worker                - match: '(?=,|\))'
1459*5c90c05cSAndroid Build Coastguard Worker                  pop: true
1460*5c90c05cSAndroid Build Coastguard Worker                - include: expressions-minus-generic-type
1461*5c90c05cSAndroid Build Coastguard Worker            - include: expressions-minus-generic-type
1462*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\S)'
1463*5c90c05cSAndroid Build Coastguard Worker      pop: true
1464*5c90c05cSAndroid Build Coastguard Worker
1465*5c90c05cSAndroid Build Coastguard Worker  method-definition-continue:
1466*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.method.c++
1467*5c90c05cSAndroid Build Coastguard Worker    - include: comments
1468*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=;)'
1469*5c90c05cSAndroid Build Coastguard Worker      pop: true
1470*5c90c05cSAndroid Build Coastguard Worker    - match: '->'
1471*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.separator.c++
1472*5c90c05cSAndroid Build Coastguard Worker      set: method-definition-trailing-return
1473*5c90c05cSAndroid Build Coastguard Worker    - include: function-specifiers
1474*5c90c05cSAndroid Build Coastguard Worker    - match: '='
1475*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.assignment.c++
1476*5c90c05cSAndroid Build Coastguard Worker    - match: '&'
1477*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.c++
1478*5c90c05cSAndroid Build Coastguard Worker    - match: \b0\b
1479*5c90c05cSAndroid Build Coastguard Worker      scope: constant.numeric.c++
1480*5c90c05cSAndroid Build Coastguard Worker    - match: \b(default|delete)\b
1481*5c90c05cSAndroid Build Coastguard Worker      scope: storage.modifier.c++
1482*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=:)'
1483*5c90c05cSAndroid Build Coastguard Worker      set:
1484*5c90c05cSAndroid Build Coastguard Worker        - match: ':'
1485*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.separator.initializer-list.c++
1486*5c90c05cSAndroid Build Coastguard Worker          set:
1487*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: meta.method.constructor.initializer-list.c++
1488*5c90c05cSAndroid Build Coastguard Worker            - match: '{{identifier}}'
1489*5c90c05cSAndroid Build Coastguard Worker              scope: variable.other.readwrite.member.c++
1490*5c90c05cSAndroid Build Coastguard Worker              push:
1491*5c90c05cSAndroid Build Coastguard Worker                - match: \(
1492*5c90c05cSAndroid Build Coastguard Worker                  scope: meta.group.c++ punctuation.section.group.begin.c++
1493*5c90c05cSAndroid Build Coastguard Worker                  set:
1494*5c90c05cSAndroid Build Coastguard Worker                    - meta_content_scope: meta.group.c++
1495*5c90c05cSAndroid Build Coastguard Worker                    - match: \)
1496*5c90c05cSAndroid Build Coastguard Worker                      scope: meta.group.c++ punctuation.section.group.end.c++
1497*5c90c05cSAndroid Build Coastguard Worker                      pop: true
1498*5c90c05cSAndroid Build Coastguard Worker                    - include: expressions
1499*5c90c05cSAndroid Build Coastguard Worker                - match: \{
1500*5c90c05cSAndroid Build Coastguard Worker                  scope: meta.group.c++ punctuation.section.group.begin.c++
1501*5c90c05cSAndroid Build Coastguard Worker                  set:
1502*5c90c05cSAndroid Build Coastguard Worker                    - meta_content_scope: meta.group.c++
1503*5c90c05cSAndroid Build Coastguard Worker                    - match: \}
1504*5c90c05cSAndroid Build Coastguard Worker                      scope: meta.group.c++ punctuation.section.group.end.c++
1505*5c90c05cSAndroid Build Coastguard Worker                      pop: true
1506*5c90c05cSAndroid Build Coastguard Worker                    - include: expressions
1507*5c90c05cSAndroid Build Coastguard Worker                - include: comments
1508*5c90c05cSAndroid Build Coastguard Worker            - match: (?=\{|;)
1509*5c90c05cSAndroid Build Coastguard Worker              set: method-definition-continue
1510*5c90c05cSAndroid Build Coastguard Worker            - include: expressions
1511*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\{)'
1512*5c90c05cSAndroid Build Coastguard Worker      set: method-definition-body
1513*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\S)'
1514*5c90c05cSAndroid Build Coastguard Worker      pop: true
1515*5c90c05cSAndroid Build Coastguard Worker
1516*5c90c05cSAndroid Build Coastguard Worker  method-definition-trailing-return:
1517*5c90c05cSAndroid Build Coastguard Worker    - include: comments
1518*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=;)'
1519*5c90c05cSAndroid Build Coastguard Worker      pop: true
1520*5c90c05cSAndroid Build Coastguard Worker    - match: '(?=\{)'
1521*5c90c05cSAndroid Build Coastguard Worker      set: method-definition-body
1522*5c90c05cSAndroid Build Coastguard Worker    - include: function-specifiers
1523*5c90c05cSAndroid Build Coastguard Worker    - include: function-trailing-return-type
1524*5c90c05cSAndroid Build Coastguard Worker
1525*5c90c05cSAndroid Build Coastguard Worker  method-definition-body:
1526*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.method.c++ meta.block.c++
1527*5c90c05cSAndroid Build Coastguard Worker    - match: '\{'
1528*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.begin.c++
1529*5c90c05cSAndroid Build Coastguard Worker      set:
1530*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.method.c++ meta.block.c++
1531*5c90c05cSAndroid Build Coastguard Worker        - match: '\}'
1532*5c90c05cSAndroid Build Coastguard Worker          scope: meta.method.c++ meta.block.c++ punctuation.section.block.end.c++
1533*5c90c05cSAndroid Build Coastguard Worker          pop: true
1534*5c90c05cSAndroid Build Coastguard Worker        - match: (?=^\s*#\s*(elif|else|endif)\b)
1535*5c90c05cSAndroid Build Coastguard Worker          pop: true
1536*5c90c05cSAndroid Build Coastguard Worker        - match: '(?=({{before_tag}})([^(;]+$|.*\{))'
1537*5c90c05cSAndroid Build Coastguard Worker          push: data-structures
1538*5c90c05cSAndroid Build Coastguard Worker        - include: statements
1539*5c90c05cSAndroid Build Coastguard Worker
1540*5c90c05cSAndroid Build Coastguard Worker  ## Preprocessor for data-structures
1541*5c90c05cSAndroid Build Coastguard Worker
1542*5c90c05cSAndroid Build Coastguard Worker  preprocessor-data-structures:
1543*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-rule-enabled-data-structures
1544*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-rule-disabled-data-structures
1545*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-practical-workarounds
1546*5c90c05cSAndroid Build Coastguard Worker
1547*5c90c05cSAndroid Build Coastguard Worker  preprocessor-rule-disabled-data-structures:
1548*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*((#if)\s+(0))\b
1549*5c90c05cSAndroid Build Coastguard Worker      captures:
1550*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++
1551*5c90c05cSAndroid Build Coastguard Worker        2: keyword.control.import.c++
1552*5c90c05cSAndroid Build Coastguard Worker        3: constant.numeric.preprocessor.c++
1553*5c90c05cSAndroid Build Coastguard Worker      push:
1554*5c90c05cSAndroid Build Coastguard Worker        - match: ^\s*(#\s*endif)\b
1555*5c90c05cSAndroid Build Coastguard Worker          captures:
1556*5c90c05cSAndroid Build Coastguard Worker            1: meta.preprocessor.c++ keyword.control.import.c++
1557*5c90c05cSAndroid Build Coastguard Worker          pop: true
1558*5c90c05cSAndroid Build Coastguard Worker        - match: ^\s*(#\s*else)\b
1559*5c90c05cSAndroid Build Coastguard Worker          captures:
1560*5c90c05cSAndroid Build Coastguard Worker            1: meta.preprocessor.c++ keyword.control.import.else.c++
1561*5c90c05cSAndroid Build Coastguard Worker          push:
1562*5c90c05cSAndroid Build Coastguard Worker            - match: (?=^\s*#\s*endif\b)
1563*5c90c05cSAndroid Build Coastguard Worker              pop: true
1564*5c90c05cSAndroid Build Coastguard Worker            - include: negated-block
1565*5c90c05cSAndroid Build Coastguard Worker            - include: data-structures-body
1566*5c90c05cSAndroid Build Coastguard Worker        - match: ""
1567*5c90c05cSAndroid Build Coastguard Worker          push:
1568*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: comment.block.preprocessor.if-branch.c++
1569*5c90c05cSAndroid Build Coastguard Worker            - match: (?=^\s*#\s*(else|endif)\b)
1570*5c90c05cSAndroid Build Coastguard Worker              pop: true
1571*5c90c05cSAndroid Build Coastguard Worker            - include: scope:source.c#preprocessor-disabled
1572*5c90c05cSAndroid Build Coastguard Worker
1573*5c90c05cSAndroid Build Coastguard Worker  preprocessor-rule-enabled-data-structures:
1574*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*((#if)\s+(0*1))\b
1575*5c90c05cSAndroid Build Coastguard Worker      captures:
1576*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++
1577*5c90c05cSAndroid Build Coastguard Worker        2: keyword.control.import.c++
1578*5c90c05cSAndroid Build Coastguard Worker        3: constant.numeric.preprocessor.c++
1579*5c90c05cSAndroid Build Coastguard Worker      push:
1580*5c90c05cSAndroid Build Coastguard Worker        - match: ^\s*(#\s*endif)\b
1581*5c90c05cSAndroid Build Coastguard Worker          captures:
1582*5c90c05cSAndroid Build Coastguard Worker            1: meta.preprocessor.c++ keyword.control.import.c++
1583*5c90c05cSAndroid Build Coastguard Worker          pop: true
1584*5c90c05cSAndroid Build Coastguard Worker        - match: ^\s*(#\s*else)\b
1585*5c90c05cSAndroid Build Coastguard Worker          captures:
1586*5c90c05cSAndroid Build Coastguard Worker            1: meta.preprocessor.c++ keyword.control.import.else.c++
1587*5c90c05cSAndroid Build Coastguard Worker          push:
1588*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: comment.block.preprocessor.else-branch.c++
1589*5c90c05cSAndroid Build Coastguard Worker            - match: (?=^\s*#\s*endif\b)
1590*5c90c05cSAndroid Build Coastguard Worker              pop: true
1591*5c90c05cSAndroid Build Coastguard Worker            - include: scope:source.c#preprocessor-disabled
1592*5c90c05cSAndroid Build Coastguard Worker        - match: ""
1593*5c90c05cSAndroid Build Coastguard Worker          push:
1594*5c90c05cSAndroid Build Coastguard Worker            - match: (?=^\s*#\s*(else|endif)\b)
1595*5c90c05cSAndroid Build Coastguard Worker              pop: true
1596*5c90c05cSAndroid Build Coastguard Worker            - include: negated-block
1597*5c90c05cSAndroid Build Coastguard Worker            - include: data-structures-body
1598*5c90c05cSAndroid Build Coastguard Worker
1599*5c90c05cSAndroid Build Coastguard Worker  ## Preprocessor for global
1600*5c90c05cSAndroid Build Coastguard Worker
1601*5c90c05cSAndroid Build Coastguard Worker  preprocessor-global:
1602*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-rule-enabled-global
1603*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-rule-disabled-global
1604*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-rule-other-global
1605*5c90c05cSAndroid Build Coastguard Worker
1606*5c90c05cSAndroid Build Coastguard Worker  preprocessor-statements:
1607*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-rule-enabled-statements
1608*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-rule-disabled-statements
1609*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-rule-other-statements
1610*5c90c05cSAndroid Build Coastguard Worker
1611*5c90c05cSAndroid Build Coastguard Worker  preprocessor-expressions:
1612*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#incomplete-inc
1613*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-macro-define
1614*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#pragma-mark
1615*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-other
1616*5c90c05cSAndroid Build Coastguard Worker
1617*5c90c05cSAndroid Build Coastguard Worker  preprocessor-rule-disabled-global:
1618*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*((#if)\s+(0))\b
1619*5c90c05cSAndroid Build Coastguard Worker      captures:
1620*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++
1621*5c90c05cSAndroid Build Coastguard Worker        2: keyword.control.import.c++
1622*5c90c05cSAndroid Build Coastguard Worker        3: constant.numeric.preprocessor.c++
1623*5c90c05cSAndroid Build Coastguard Worker      push:
1624*5c90c05cSAndroid Build Coastguard Worker        - match: ^\s*(#\s*endif)\b
1625*5c90c05cSAndroid Build Coastguard Worker          captures:
1626*5c90c05cSAndroid Build Coastguard Worker            1: meta.preprocessor.c++ keyword.control.import.c++
1627*5c90c05cSAndroid Build Coastguard Worker          pop: true
1628*5c90c05cSAndroid Build Coastguard Worker        - match: ^\s*(#\s*else)\b
1629*5c90c05cSAndroid Build Coastguard Worker          captures:
1630*5c90c05cSAndroid Build Coastguard Worker            1: meta.preprocessor.c++ keyword.control.import.else.c++
1631*5c90c05cSAndroid Build Coastguard Worker          push:
1632*5c90c05cSAndroid Build Coastguard Worker            - match: (?=^\s*#\s*endif\b)
1633*5c90c05cSAndroid Build Coastguard Worker              pop: true
1634*5c90c05cSAndroid Build Coastguard Worker            - include: preprocessor-global
1635*5c90c05cSAndroid Build Coastguard Worker            - include: negated-block
1636*5c90c05cSAndroid Build Coastguard Worker            - include: global
1637*5c90c05cSAndroid Build Coastguard Worker        - match: ""
1638*5c90c05cSAndroid Build Coastguard Worker          push:
1639*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: comment.block.preprocessor.if-branch.c++
1640*5c90c05cSAndroid Build Coastguard Worker            - match: (?=^\s*#\s*(else|endif)\b)
1641*5c90c05cSAndroid Build Coastguard Worker              pop: true
1642*5c90c05cSAndroid Build Coastguard Worker            - include: scope:source.c#preprocessor-disabled
1643*5c90c05cSAndroid Build Coastguard Worker
1644*5c90c05cSAndroid Build Coastguard Worker  preprocessor-rule-enabled-global:
1645*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*((#if)\s+(0*1))\b
1646*5c90c05cSAndroid Build Coastguard Worker      captures:
1647*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++
1648*5c90c05cSAndroid Build Coastguard Worker        2: keyword.control.import.c++
1649*5c90c05cSAndroid Build Coastguard Worker        3: constant.numeric.preprocessor.c++
1650*5c90c05cSAndroid Build Coastguard Worker      push:
1651*5c90c05cSAndroid Build Coastguard Worker        - match: ^\s*(#\s*endif)\b
1652*5c90c05cSAndroid Build Coastguard Worker          captures:
1653*5c90c05cSAndroid Build Coastguard Worker            1: meta.preprocessor.c++ keyword.control.import.c++
1654*5c90c05cSAndroid Build Coastguard Worker          pop: true
1655*5c90c05cSAndroid Build Coastguard Worker        - match: ^\s*(#\s*else)\b
1656*5c90c05cSAndroid Build Coastguard Worker          captures:
1657*5c90c05cSAndroid Build Coastguard Worker            1: meta.preprocessor.c++ keyword.control.import.else.c++
1658*5c90c05cSAndroid Build Coastguard Worker          push:
1659*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: comment.block.preprocessor.else-branch.c++
1660*5c90c05cSAndroid Build Coastguard Worker            - match: (?=^\s*#\s*endif\b)
1661*5c90c05cSAndroid Build Coastguard Worker              pop: true
1662*5c90c05cSAndroid Build Coastguard Worker            - include: scope:source.c#preprocessor-disabled
1663*5c90c05cSAndroid Build Coastguard Worker        - match: ""
1664*5c90c05cSAndroid Build Coastguard Worker          push:
1665*5c90c05cSAndroid Build Coastguard Worker            - match: (?=^\s*#\s*(else|endif)\b)
1666*5c90c05cSAndroid Build Coastguard Worker              pop: true
1667*5c90c05cSAndroid Build Coastguard Worker            - include: preprocessor-global
1668*5c90c05cSAndroid Build Coastguard Worker            - include: negated-block
1669*5c90c05cSAndroid Build Coastguard Worker            - include: global
1670*5c90c05cSAndroid Build Coastguard Worker
1671*5c90c05cSAndroid Build Coastguard Worker  preprocessor-rule-other-global:
1672*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*(?:if|ifdef|ifndef))\b
1673*5c90c05cSAndroid Build Coastguard Worker      captures:
1674*5c90c05cSAndroid Build Coastguard Worker        1: keyword.control.import.c++
1675*5c90c05cSAndroid Build Coastguard Worker      push:
1676*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.preprocessor.c++
1677*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-line-continuation
1678*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-comments
1679*5c90c05cSAndroid Build Coastguard Worker        - match: \bdefined\b
1680*5c90c05cSAndroid Build Coastguard Worker          scope: keyword.control.c++
1681*5c90c05cSAndroid Build Coastguard Worker        # Enter a new scope where all elif/else branches have their
1682*5c90c05cSAndroid Build Coastguard Worker        # contexts popped by a subsequent elif/else/endif. This ensures that
1683*5c90c05cSAndroid Build Coastguard Worker        # preprocessor branches don't push multiple meta.block scopes on
1684*5c90c05cSAndroid Build Coastguard Worker        # the stack, thus messing up the "global" context's detection of
1685*5c90c05cSAndroid Build Coastguard Worker        # functions.
1686*5c90c05cSAndroid Build Coastguard Worker        - match: $\n
1687*5c90c05cSAndroid Build Coastguard Worker          set: preprocessor-if-branch-global
1688*5c90c05cSAndroid Build Coastguard Worker
1689*5c90c05cSAndroid Build Coastguard Worker  # These gymnastics here ensure that we are properly handling scope even
1690*5c90c05cSAndroid Build Coastguard Worker  # when the preprocessor is used to create different scope beginnings, such
1691*5c90c05cSAndroid Build Coastguard Worker  # as a different if/while condition
1692*5c90c05cSAndroid Build Coastguard Worker  preprocessor-if-branch-global:
1693*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*endif)\b
1694*5c90c05cSAndroid Build Coastguard Worker      captures:
1695*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++ keyword.control.import.c++
1696*5c90c05cSAndroid Build Coastguard Worker      pop: true
1697*5c90c05cSAndroid Build Coastguard Worker    - match: (?=^\s*#\s*(elif|else)\b)
1698*5c90c05cSAndroid Build Coastguard Worker      push: preprocessor-elif-else-branch-global
1699*5c90c05cSAndroid Build Coastguard Worker    - match: \{
1700*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.begin.c++
1701*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-block-if-branch-global
1702*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-global
1703*5c90c05cSAndroid Build Coastguard Worker    - include: negated-block
1704*5c90c05cSAndroid Build Coastguard Worker    - include: global
1705*5c90c05cSAndroid Build Coastguard Worker
1706*5c90c05cSAndroid Build Coastguard Worker  preprocessor-block-if-branch-global:
1707*5c90c05cSAndroid Build Coastguard Worker    - meta_scope: meta.block.c++
1708*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*endif)\b
1709*5c90c05cSAndroid Build Coastguard Worker      captures:
1710*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++ keyword.control.import.c++
1711*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-block-finish-global
1712*5c90c05cSAndroid Build Coastguard Worker    - match: (?=^\s*#\s*(elif|else)\b)
1713*5c90c05cSAndroid Build Coastguard Worker      push: preprocessor-elif-else-branch-global
1714*5c90c05cSAndroid Build Coastguard Worker    - match: \}
1715*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.end.c++
1716*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-if-branch-global
1717*5c90c05cSAndroid Build Coastguard Worker    - include: statements
1718*5c90c05cSAndroid Build Coastguard Worker
1719*5c90c05cSAndroid Build Coastguard Worker  preprocessor-block-finish-global:
1720*5c90c05cSAndroid Build Coastguard Worker    - meta_scope: meta.block.c++
1721*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*(?:if|ifdef|ifndef))\b
1722*5c90c05cSAndroid Build Coastguard Worker      captures:
1723*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++ keyword.control.import.c++
1724*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-block-finish-if-branch-global
1725*5c90c05cSAndroid Build Coastguard Worker    - match: \}
1726*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.end.c++
1727*5c90c05cSAndroid Build Coastguard Worker      pop: true
1728*5c90c05cSAndroid Build Coastguard Worker    - include: statements
1729*5c90c05cSAndroid Build Coastguard Worker
1730*5c90c05cSAndroid Build Coastguard Worker  preprocessor-block-finish-if-branch-global:
1731*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*endif)\b
1732*5c90c05cSAndroid Build Coastguard Worker      captures:
1733*5c90c05cSAndroid Build Coastguard Worker        1: keyword.control.import.c++
1734*5c90c05cSAndroid Build Coastguard Worker      pop: true
1735*5c90c05cSAndroid Build Coastguard Worker    - match: \}
1736*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.end.c++
1737*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-if-branch-global
1738*5c90c05cSAndroid Build Coastguard Worker    - include: statements
1739*5c90c05cSAndroid Build Coastguard Worker
1740*5c90c05cSAndroid Build Coastguard Worker  preprocessor-elif-else-branch-global:
1741*5c90c05cSAndroid Build Coastguard Worker    - match: (?=^\s*#\s*(endif)\b)
1742*5c90c05cSAndroid Build Coastguard Worker      pop: true
1743*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-global
1744*5c90c05cSAndroid Build Coastguard Worker    - include: negated-block
1745*5c90c05cSAndroid Build Coastguard Worker    - include: global
1746*5c90c05cSAndroid Build Coastguard Worker
1747*5c90c05cSAndroid Build Coastguard Worker  ## Preprocessor for statements
1748*5c90c05cSAndroid Build Coastguard Worker
1749*5c90c05cSAndroid Build Coastguard Worker  preprocessor-rule-disabled-statements:
1750*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*((#if)\s+(0))\b
1751*5c90c05cSAndroid Build Coastguard Worker      captures:
1752*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++
1753*5c90c05cSAndroid Build Coastguard Worker        2: keyword.control.import.c++
1754*5c90c05cSAndroid Build Coastguard Worker        3: constant.numeric.preprocessor.c++
1755*5c90c05cSAndroid Build Coastguard Worker      push:
1756*5c90c05cSAndroid Build Coastguard Worker        - match: ^\s*(#\s*endif)\b
1757*5c90c05cSAndroid Build Coastguard Worker          captures:
1758*5c90c05cSAndroid Build Coastguard Worker            1: meta.preprocessor.c++ keyword.control.import.c++
1759*5c90c05cSAndroid Build Coastguard Worker          pop: true
1760*5c90c05cSAndroid Build Coastguard Worker        - match: ^\s*(#\s*else)\b
1761*5c90c05cSAndroid Build Coastguard Worker          captures:
1762*5c90c05cSAndroid Build Coastguard Worker            1: meta.preprocessor.c++ keyword.control.import.else.c++
1763*5c90c05cSAndroid Build Coastguard Worker          push:
1764*5c90c05cSAndroid Build Coastguard Worker            - match: (?=^\s*#\s*endif\b)
1765*5c90c05cSAndroid Build Coastguard Worker              pop: true
1766*5c90c05cSAndroid Build Coastguard Worker            - include: negated-block
1767*5c90c05cSAndroid Build Coastguard Worker            - include: statements
1768*5c90c05cSAndroid Build Coastguard Worker        - match: ""
1769*5c90c05cSAndroid Build Coastguard Worker          push:
1770*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: comment.block.preprocessor.if-branch.c++
1771*5c90c05cSAndroid Build Coastguard Worker            - match: (?=^\s*#\s*(else|endif)\b)
1772*5c90c05cSAndroid Build Coastguard Worker              pop: true
1773*5c90c05cSAndroid Build Coastguard Worker            - include: scope:source.c#preprocessor-disabled
1774*5c90c05cSAndroid Build Coastguard Worker
1775*5c90c05cSAndroid Build Coastguard Worker  preprocessor-rule-enabled-statements:
1776*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*((#if)\s+(0*1))\b
1777*5c90c05cSAndroid Build Coastguard Worker      captures:
1778*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++
1779*5c90c05cSAndroid Build Coastguard Worker        2: keyword.control.import.c++
1780*5c90c05cSAndroid Build Coastguard Worker        3: constant.numeric.preprocessor.c++
1781*5c90c05cSAndroid Build Coastguard Worker      push:
1782*5c90c05cSAndroid Build Coastguard Worker        - match: ^\s*(#\s*endif)\b
1783*5c90c05cSAndroid Build Coastguard Worker          captures:
1784*5c90c05cSAndroid Build Coastguard Worker            1: meta.preprocessor.c++ keyword.control.import.c++
1785*5c90c05cSAndroid Build Coastguard Worker          pop: true
1786*5c90c05cSAndroid Build Coastguard Worker        - match: ^\s*(#\s*else)\b
1787*5c90c05cSAndroid Build Coastguard Worker          captures:
1788*5c90c05cSAndroid Build Coastguard Worker            1: meta.preprocessor.c++ keyword.control.import.else.c++
1789*5c90c05cSAndroid Build Coastguard Worker          push:
1790*5c90c05cSAndroid Build Coastguard Worker            - meta_content_scope: comment.block.preprocessor.else-branch.c++
1791*5c90c05cSAndroid Build Coastguard Worker            - match: (?=^\s*#\s*endif\b)
1792*5c90c05cSAndroid Build Coastguard Worker              pop: true
1793*5c90c05cSAndroid Build Coastguard Worker            - include: scope:source.c#preprocessor-disabled
1794*5c90c05cSAndroid Build Coastguard Worker        - match: ""
1795*5c90c05cSAndroid Build Coastguard Worker          push:
1796*5c90c05cSAndroid Build Coastguard Worker            - match: (?=^\s*#\s*(else|endif)\b)
1797*5c90c05cSAndroid Build Coastguard Worker              pop: true
1798*5c90c05cSAndroid Build Coastguard Worker            - include: negated-block
1799*5c90c05cSAndroid Build Coastguard Worker            - include: statements
1800*5c90c05cSAndroid Build Coastguard Worker
1801*5c90c05cSAndroid Build Coastguard Worker  preprocessor-rule-other-statements:
1802*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*(?:if|ifdef|ifndef))\b
1803*5c90c05cSAndroid Build Coastguard Worker      captures:
1804*5c90c05cSAndroid Build Coastguard Worker        1: keyword.control.import.c++
1805*5c90c05cSAndroid Build Coastguard Worker      push:
1806*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.preprocessor.c++
1807*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-line-continuation
1808*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-comments
1809*5c90c05cSAndroid Build Coastguard Worker        - match: \bdefined\b
1810*5c90c05cSAndroid Build Coastguard Worker          scope: keyword.control.c++
1811*5c90c05cSAndroid Build Coastguard Worker        # Enter a new scope where all elif/else branches have their
1812*5c90c05cSAndroid Build Coastguard Worker        # contexts popped by a subsequent elif/else/endif. This ensures that
1813*5c90c05cSAndroid Build Coastguard Worker        # preprocessor branches don't push multiple meta.block scopes on
1814*5c90c05cSAndroid Build Coastguard Worker        # the stack, thus messing up the "global" context's detection of
1815*5c90c05cSAndroid Build Coastguard Worker        # functions.
1816*5c90c05cSAndroid Build Coastguard Worker        - match: $\n
1817*5c90c05cSAndroid Build Coastguard Worker          set: preprocessor-if-branch-statements
1818*5c90c05cSAndroid Build Coastguard Worker
1819*5c90c05cSAndroid Build Coastguard Worker  # These gymnastics here ensure that we are properly handling scope even
1820*5c90c05cSAndroid Build Coastguard Worker  # when the preprocessor is used to create different scope beginnings, such
1821*5c90c05cSAndroid Build Coastguard Worker  # as a different if/while condition
1822*5c90c05cSAndroid Build Coastguard Worker  preprocessor-if-branch-statements:
1823*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*endif)\b
1824*5c90c05cSAndroid Build Coastguard Worker      captures:
1825*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++ keyword.control.import.c++
1826*5c90c05cSAndroid Build Coastguard Worker      pop: true
1827*5c90c05cSAndroid Build Coastguard Worker    - match: (?=^\s*#\s*(elif|else)\b)
1828*5c90c05cSAndroid Build Coastguard Worker      push: preprocessor-elif-else-branch-statements
1829*5c90c05cSAndroid Build Coastguard Worker    - match: \{
1830*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.begin.c++
1831*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-block-if-branch-statements
1832*5c90c05cSAndroid Build Coastguard Worker    - match: (?=(?!{{non_func_keywords}}){{path_lookahead}}\s*\()
1833*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-if-branch-function-call
1834*5c90c05cSAndroid Build Coastguard Worker    - include: negated-block
1835*5c90c05cSAndroid Build Coastguard Worker    - include: statements
1836*5c90c05cSAndroid Build Coastguard Worker
1837*5c90c05cSAndroid Build Coastguard Worker  preprocessor-if-branch-function-call:
1838*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.function-call.c++
1839*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#c99
1840*5c90c05cSAndroid Build Coastguard Worker    - match: '(?:(::)\s*)?{{identifier}}\s*(::)\s*'
1841*5c90c05cSAndroid Build Coastguard Worker      scope: variable.function.c++
1842*5c90c05cSAndroid Build Coastguard Worker      captures:
1843*5c90c05cSAndroid Build Coastguard Worker        1: punctuation.accessor.c++
1844*5c90c05cSAndroid Build Coastguard Worker        2: punctuation.accessor.c++
1845*5c90c05cSAndroid Build Coastguard Worker    - match: '(?:(::)\s*)?{{identifier}}'
1846*5c90c05cSAndroid Build Coastguard Worker      scope: variable.function.c++
1847*5c90c05cSAndroid Build Coastguard Worker      captures:
1848*5c90c05cSAndroid Build Coastguard Worker        1: punctuation.accessor.c++
1849*5c90c05cSAndroid Build Coastguard Worker    - match: '\('
1850*5c90c05cSAndroid Build Coastguard Worker      scope: meta.group.c++ punctuation.section.group.begin.c++
1851*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-if-branch-function-call-arguments
1852*5c90c05cSAndroid Build Coastguard Worker
1853*5c90c05cSAndroid Build Coastguard Worker  preprocessor-if-branch-function-call-arguments:
1854*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.function-call.c++ meta.group.c++
1855*5c90c05cSAndroid Build Coastguard Worker    - match : \)
1856*5c90c05cSAndroid Build Coastguard Worker      scope: meta.function-call.c++ meta.group.c++ punctuation.section.group.end.c++
1857*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-if-branch-statements
1858*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*(?:elif|else))\b
1859*5c90c05cSAndroid Build Coastguard Worker      captures:
1860*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++ keyword.control.import.c++
1861*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-if-branch-statements
1862*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*endif)\b
1863*5c90c05cSAndroid Build Coastguard Worker      captures:
1864*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++ keyword.control.import.c++
1865*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-if-branch-function-call-arguments-finish
1866*5c90c05cSAndroid Build Coastguard Worker    - include: expressions
1867*5c90c05cSAndroid Build Coastguard Worker
1868*5c90c05cSAndroid Build Coastguard Worker  preprocessor-if-branch-function-call-arguments-finish:
1869*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.function-call.c++ meta.group.c++
1870*5c90c05cSAndroid Build Coastguard Worker    - match: \)
1871*5c90c05cSAndroid Build Coastguard Worker      scope: meta.function-call.c++ meta.group.c++ punctuation.section.group.end.c++
1872*5c90c05cSAndroid Build Coastguard Worker      pop: true
1873*5c90c05cSAndroid Build Coastguard Worker    - include: expressions
1874*5c90c05cSAndroid Build Coastguard Worker
1875*5c90c05cSAndroid Build Coastguard Worker  preprocessor-block-if-branch-statements:
1876*5c90c05cSAndroid Build Coastguard Worker    - meta_scope: meta.block.c++
1877*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*endif)\b
1878*5c90c05cSAndroid Build Coastguard Worker      captures:
1879*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++ keyword.control.import.c++
1880*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-block-finish-statements
1881*5c90c05cSAndroid Build Coastguard Worker    - match: (?=^\s*#\s*(elif|else)\b)
1882*5c90c05cSAndroid Build Coastguard Worker      push: preprocessor-elif-else-branch-statements
1883*5c90c05cSAndroid Build Coastguard Worker    - match: \}
1884*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.end.c++
1885*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-if-branch-statements
1886*5c90c05cSAndroid Build Coastguard Worker    - include: statements
1887*5c90c05cSAndroid Build Coastguard Worker
1888*5c90c05cSAndroid Build Coastguard Worker  preprocessor-block-finish-statements:
1889*5c90c05cSAndroid Build Coastguard Worker    - meta_scope: meta.block.c++
1890*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*(?:if|ifdef|ifndef))\b
1891*5c90c05cSAndroid Build Coastguard Worker      captures:
1892*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++ keyword.control.import.c++
1893*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-block-finish-if-branch-statements
1894*5c90c05cSAndroid Build Coastguard Worker    - match: \}
1895*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.end.c++
1896*5c90c05cSAndroid Build Coastguard Worker      pop: true
1897*5c90c05cSAndroid Build Coastguard Worker    - include: statements
1898*5c90c05cSAndroid Build Coastguard Worker
1899*5c90c05cSAndroid Build Coastguard Worker  preprocessor-block-finish-if-branch-statements:
1900*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*endif)\b
1901*5c90c05cSAndroid Build Coastguard Worker      captures:
1902*5c90c05cSAndroid Build Coastguard Worker        1: keyword.control.import.c++
1903*5c90c05cSAndroid Build Coastguard Worker      pop: true
1904*5c90c05cSAndroid Build Coastguard Worker    - match: \}
1905*5c90c05cSAndroid Build Coastguard Worker      scope: meta.block.c++ punctuation.section.block.end.c++
1906*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-if-branch-statements
1907*5c90c05cSAndroid Build Coastguard Worker    - include: statements
1908*5c90c05cSAndroid Build Coastguard Worker
1909*5c90c05cSAndroid Build Coastguard Worker  preprocessor-elif-else-branch-statements:
1910*5c90c05cSAndroid Build Coastguard Worker    - match: (?=^\s*#\s*endif\b)
1911*5c90c05cSAndroid Build Coastguard Worker      pop: true
1912*5c90c05cSAndroid Build Coastguard Worker    - include: negated-block
1913*5c90c05cSAndroid Build Coastguard Worker    - include: statements
1914*5c90c05cSAndroid Build Coastguard Worker
1915*5c90c05cSAndroid Build Coastguard Worker  ## Preprocessor other
1916*5c90c05cSAndroid Build Coastguard Worker
1917*5c90c05cSAndroid Build Coastguard Worker  negated-block:
1918*5c90c05cSAndroid Build Coastguard Worker    - match: '\}'
1919*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.end.c++
1920*5c90c05cSAndroid Build Coastguard Worker      push:
1921*5c90c05cSAndroid Build Coastguard Worker        - match: '\{'
1922*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.section.block.begin.c++
1923*5c90c05cSAndroid Build Coastguard Worker          pop: true
1924*5c90c05cSAndroid Build Coastguard Worker        - match: (?=^\s*#\s*(elif|else|endif)\b)
1925*5c90c05cSAndroid Build Coastguard Worker          pop: true
1926*5c90c05cSAndroid Build Coastguard Worker        - include: statements
1927*5c90c05cSAndroid Build Coastguard Worker
1928*5c90c05cSAndroid Build Coastguard Worker  preprocessor-macro-define:
1929*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(\#\s*define)\b
1930*5c90c05cSAndroid Build Coastguard Worker      captures:
1931*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.macro.c++ keyword.control.import.define.c++
1932*5c90c05cSAndroid Build Coastguard Worker      push:
1933*5c90c05cSAndroid Build Coastguard Worker        - meta_content_scope: meta.preprocessor.macro.c++
1934*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-line-continuation
1935*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-line-ending
1936*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-comments
1937*5c90c05cSAndroid Build Coastguard Worker        - match: '({{identifier}})(?=\()'
1938*5c90c05cSAndroid Build Coastguard Worker          scope: entity.name.function.preprocessor.c++
1939*5c90c05cSAndroid Build Coastguard Worker          set:
1940*5c90c05cSAndroid Build Coastguard Worker            - match: '\('
1941*5c90c05cSAndroid Build Coastguard Worker              scope: punctuation.section.group.begin.c++
1942*5c90c05cSAndroid Build Coastguard Worker              set: preprocessor-macro-params
1943*5c90c05cSAndroid Build Coastguard Worker        - match: '{{identifier}}'
1944*5c90c05cSAndroid Build Coastguard Worker          scope: entity.name.constant.preprocessor.c++
1945*5c90c05cSAndroid Build Coastguard Worker          set: preprocessor-macro-definition
1946*5c90c05cSAndroid Build Coastguard Worker
1947*5c90c05cSAndroid Build Coastguard Worker  preprocessor-macro-params:
1948*5c90c05cSAndroid Build Coastguard Worker    - meta_scope: meta.preprocessor.macro.parameters.c++ meta.group.c++
1949*5c90c05cSAndroid Build Coastguard Worker    - match: '{{identifier}}'
1950*5c90c05cSAndroid Build Coastguard Worker      scope: variable.parameter.c++
1951*5c90c05cSAndroid Build Coastguard Worker    - match: \)
1952*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.group.end.c++
1953*5c90c05cSAndroid Build Coastguard Worker      set: preprocessor-macro-definition
1954*5c90c05cSAndroid Build Coastguard Worker    - match: ','
1955*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.separator.c++
1956*5c90c05cSAndroid Build Coastguard Worker      push:
1957*5c90c05cSAndroid Build Coastguard Worker        - match: '{{identifier}}'
1958*5c90c05cSAndroid Build Coastguard Worker          scope: variable.parameter.c++
1959*5c90c05cSAndroid Build Coastguard Worker          pop: true
1960*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-line-continuation
1961*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-comments
1962*5c90c05cSAndroid Build Coastguard Worker        - match: '\.\.\.'
1963*5c90c05cSAndroid Build Coastguard Worker          scope: keyword.operator.variadic.c++
1964*5c90c05cSAndroid Build Coastguard Worker        - match: '(?=\))'
1965*5c90c05cSAndroid Build Coastguard Worker          pop: true
1966*5c90c05cSAndroid Build Coastguard Worker        - match: (/\*).*(\*/)
1967*5c90c05cSAndroid Build Coastguard Worker          scope: comment.block.c++
1968*5c90c05cSAndroid Build Coastguard Worker          captures:
1969*5c90c05cSAndroid Build Coastguard Worker            1: punctuation.definition.comment.c++
1970*5c90c05cSAndroid Build Coastguard Worker            2: punctuation.definition.comment.c++
1971*5c90c05cSAndroid Build Coastguard Worker        - match: '\S+'
1972*5c90c05cSAndroid Build Coastguard Worker          scope: invalid.illegal.unexpected-character.c++
1973*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#preprocessor-line-continuation
1974*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#preprocessor-comments
1975*5c90c05cSAndroid Build Coastguard Worker    - match: '\.\.\.'
1976*5c90c05cSAndroid Build Coastguard Worker      scope: keyword.operator.variadic.c++
1977*5c90c05cSAndroid Build Coastguard Worker    - match: (/\*).*(\*/)
1978*5c90c05cSAndroid Build Coastguard Worker      scope: comment.block.c++
1979*5c90c05cSAndroid Build Coastguard Worker      captures:
1980*5c90c05cSAndroid Build Coastguard Worker        1: punctuation.definition.comment.c++
1981*5c90c05cSAndroid Build Coastguard Worker        2: punctuation.definition.comment.c++
1982*5c90c05cSAndroid Build Coastguard Worker    - match: $\n
1983*5c90c05cSAndroid Build Coastguard Worker      scope: invalid.illegal.unexpected-end-of-line.c++
1984*5c90c05cSAndroid Build Coastguard Worker
1985*5c90c05cSAndroid Build Coastguard Worker  preprocessor-macro-definition:
1986*5c90c05cSAndroid Build Coastguard Worker    - meta_content_scope: meta.preprocessor.macro.c++
1987*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#preprocessor-line-continuation
1988*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#preprocessor-line-ending
1989*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#preprocessor-comments
1990*5c90c05cSAndroid Build Coastguard Worker    # Don't define blocks in define statements
1991*5c90c05cSAndroid Build Coastguard Worker    - match: '\{'
1992*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.begin.c++
1993*5c90c05cSAndroid Build Coastguard Worker    - match: '\}'
1994*5c90c05cSAndroid Build Coastguard Worker      scope: punctuation.section.block.end.c++
1995*5c90c05cSAndroid Build Coastguard Worker    - include: expressions
1996*5c90c05cSAndroid Build Coastguard Worker
1997*5c90c05cSAndroid Build Coastguard Worker  preprocessor-practical-workarounds:
1998*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-convention-ignore-uppercase-ident-lines
1999*5c90c05cSAndroid Build Coastguard Worker    - include: scope:source.c#preprocessor-convention-ignore-uppercase-calls-without-semicolon
2000*5c90c05cSAndroid Build Coastguard Worker
2001*5c90c05cSAndroid Build Coastguard Worker  preprocessor-convention-ignore-uppercase-ident-lines:
2002*5c90c05cSAndroid Build Coastguard Worker    - match: ^(\s*{{macro_identifier}})+\s*$
2003*5c90c05cSAndroid Build Coastguard Worker      scope: meta.assumed-macro.c++
2004*5c90c05cSAndroid Build Coastguard Worker      push:
2005*5c90c05cSAndroid Build Coastguard Worker        # It's possible that we are dealing with a function return type on its own line, and the
2006*5c90c05cSAndroid Build Coastguard Worker        # name of the function is on the subsequent line.
2007*5c90c05cSAndroid Build Coastguard Worker        - match: '(?={{path_lookahead}}({{generic_lookahead}}({{path_lookahead}})?)\s*\()'
2008*5c90c05cSAndroid Build Coastguard Worker          set: [function-definition-params, global-function-identifier-generic]
2009*5c90c05cSAndroid Build Coastguard Worker        - match: '(?={{path_lookahead}}\s*\()'
2010*5c90c05cSAndroid Build Coastguard Worker          set: [function-definition-params, global-function-identifier]
2011*5c90c05cSAndroid Build Coastguard Worker        - match: ^
2012*5c90c05cSAndroid Build Coastguard Worker          pop: true
2013*5c90c05cSAndroid Build Coastguard Worker
2014*5c90c05cSAndroid Build Coastguard Worker  preprocessor-other:
2015*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*(?:if|ifdef|ifndef|elif|else|line|pragma|undef))\b
2016*5c90c05cSAndroid Build Coastguard Worker      captures:
2017*5c90c05cSAndroid Build Coastguard Worker        1: keyword.control.import.c++
2018*5c90c05cSAndroid Build Coastguard Worker      push:
2019*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.preprocessor.c++
2020*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-line-continuation
2021*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-line-ending
2022*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-comments
2023*5c90c05cSAndroid Build Coastguard Worker        - match: \bdefined\b
2024*5c90c05cSAndroid Build Coastguard Worker          scope: keyword.control.c++
2025*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*endif)\b
2026*5c90c05cSAndroid Build Coastguard Worker      captures:
2027*5c90c05cSAndroid Build Coastguard Worker        1: meta.preprocessor.c++ keyword.control.import.c++
2028*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*(?:error|warning))\b
2029*5c90c05cSAndroid Build Coastguard Worker      captures:
2030*5c90c05cSAndroid Build Coastguard Worker        1: keyword.control.import.error.c++
2031*5c90c05cSAndroid Build Coastguard Worker      push:
2032*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.preprocessor.diagnostic.c++
2033*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-line-continuation
2034*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-line-ending
2035*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-comments
2036*5c90c05cSAndroid Build Coastguard Worker        - include: strings
2037*5c90c05cSAndroid Build Coastguard Worker        - match: '\S+'
2038*5c90c05cSAndroid Build Coastguard Worker          scope: string.unquoted.c++
2039*5c90c05cSAndroid Build Coastguard Worker    - match: ^\s*(#\s*(?:include|include_next|import))\b
2040*5c90c05cSAndroid Build Coastguard Worker      captures:
2041*5c90c05cSAndroid Build Coastguard Worker        1: keyword.control.import.include.c++
2042*5c90c05cSAndroid Build Coastguard Worker      push:
2043*5c90c05cSAndroid Build Coastguard Worker        - meta_scope: meta.preprocessor.include.c++
2044*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-line-continuation
2045*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-line-ending
2046*5c90c05cSAndroid Build Coastguard Worker        - include: scope:source.c#preprocessor-comments
2047*5c90c05cSAndroid Build Coastguard Worker        - match: '"'
2048*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.definition.string.begin.c++
2049*5c90c05cSAndroid Build Coastguard Worker          push:
2050*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: string.quoted.double.include.c++
2051*5c90c05cSAndroid Build Coastguard Worker            - match: '"'
2052*5c90c05cSAndroid Build Coastguard Worker              scope: punctuation.definition.string.end.c++
2053*5c90c05cSAndroid Build Coastguard Worker              pop: true
2054*5c90c05cSAndroid Build Coastguard Worker        - match: <
2055*5c90c05cSAndroid Build Coastguard Worker          scope: punctuation.definition.string.begin.c++
2056*5c90c05cSAndroid Build Coastguard Worker          push:
2057*5c90c05cSAndroid Build Coastguard Worker            - meta_scope: string.quoted.other.lt-gt.include.c++
2058*5c90c05cSAndroid Build Coastguard Worker            - match: '>'
2059*5c90c05cSAndroid Build Coastguard Worker              scope: punctuation.definition.string.end.c++
2060*5c90c05cSAndroid Build Coastguard Worker              pop: true
2061*5c90c05cSAndroid Build Coastguard Worker    - include: preprocessor-practical-workarounds
2062