mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-10-26 11:08:40 +03:00
c2963a383e
incorporates: https://github.com/atom/language-c/pull/252 Note that this particular change was modified. `class public virtual : public virtual Example` is invalid I think, but I don't see a good way to prevent that because the detection must be moved into `patterns > include` because textmate is not multiline regex. See also https://github.com/jeff-hykin/better-cpp-syntax/issues/14 (In fact that whole repostory probably has some improvements) I changed it to include the angle brackets because types can have those https://github.com/atom/language-c/pull/263 https://github.com/atom/language-c/pull/311 https://github.com/atom/language-c/pull/368 For tree-sitter, kinda fix the Discord reported issue (In #support M1 Mac C++ Syntax highlighting) Note that I syntax color only the last function name and not the namespace or colon. But that could easily be changed. For future me, the relevant tree-sitter namespace identifier scopes are: `call_expression > qualified_identifier > identifier` and `function_declarator > qualified_identifier > identifier` I don't know anything about template functions so I left that untouched. So this is probably an incomplete fix. Finally, add the `static_assert` operator. It's technically a directive so it'll appear purple, not blue. Again this could easily be changed so don't hesitate about feedback, idk anything about c++
436 lines
11 KiB
Plaintext
436 lines
11 KiB
Plaintext
'scopeName': 'source.cpp'
|
|
'fileTypes': [
|
|
'cc'
|
|
'cpp'
|
|
'cp'
|
|
'cxx'
|
|
'c++'
|
|
'cu'
|
|
'cuh'
|
|
'h'
|
|
'hh'
|
|
'hpp'
|
|
'hxx'
|
|
'h++'
|
|
'inl'
|
|
'ino'
|
|
'ipp'
|
|
'tcc'
|
|
'tpp'
|
|
]
|
|
'firstLineMatch': '(?i)-\\*-[^*]*(Mode:\\s*)?C\\+\\+(\\s*;.*?)?\\s*-\\*-'
|
|
'name': 'C++'
|
|
'patterns': [
|
|
{
|
|
'include': '#special_block'
|
|
}
|
|
{
|
|
'include': '#strings'
|
|
}
|
|
{
|
|
'match': '\\b(friend|explicit|virtual|override|final|noexcept)\\b'
|
|
'name': 'storage.modifier.cpp'
|
|
}
|
|
{
|
|
'match': '\\b(private:|protected:|public:)'
|
|
'name': 'storage.modifier.cpp'
|
|
}
|
|
{
|
|
'match': '\\b(catch|operator|try|throw|using)\\b'
|
|
'name': 'keyword.control.cpp'
|
|
}
|
|
{
|
|
'match': '\\bdelete\\b(\\s*\\[\\])?|\\bnew\\b(?!])'
|
|
'name': 'keyword.control.cpp'
|
|
}
|
|
{
|
|
# Common naming idiom for C++ instanced vars: "fMemberName"
|
|
'match': '\\b(f|m)[A-Z]\\w*\\b'
|
|
'name': 'variable.other.readwrite.member.cpp'
|
|
}
|
|
{
|
|
'match': '\\bthis\\b'
|
|
'name': 'variable.language.this.cpp'
|
|
}
|
|
{
|
|
'match': '\\bnullptr\\b'
|
|
'name': 'constant.language.cpp'
|
|
}
|
|
{
|
|
'match': '\\btemplate\\b\\s*'
|
|
'name': 'storage.type.template.cpp'
|
|
}
|
|
{
|
|
'match': '\\b(const_cast|dynamic_cast|reinterpret_cast|static_cast)\\b\\s*'
|
|
'name': 'keyword.operator.cast.cpp'
|
|
}
|
|
{
|
|
'match': '::'
|
|
'name': 'punctuation.separator.namespace.access.cpp'
|
|
}
|
|
{
|
|
'match': '\\b(typeid|alignof|alignas)\\b'
|
|
'name': 'keyword.operator.cpp'
|
|
}
|
|
{
|
|
'match': '\\b(and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|xor|xor_eq)\\b'
|
|
'name': 'keyword.operator.alias.cpp'
|
|
}
|
|
{
|
|
'match': '\\bstatic_assert\\b'
|
|
'name': 'keyword.static-assert.cpp'
|
|
}
|
|
{
|
|
'match': '\\b(class|decltype|wchar_t|char16_t|char32_t)\\b'
|
|
'name': 'storage.type.cpp'
|
|
}
|
|
{
|
|
'match': '\\b(constexpr|export|mutable|typename|thread_local)\\b'
|
|
'name': 'storage.modifier.cpp'
|
|
}
|
|
{
|
|
'begin': '''(?x)
|
|
(?:
|
|
^ | # beginning of line
|
|
(?:(?<!else|new|=)) # or word + space before name
|
|
)
|
|
((?:[A-Za-z_][A-Za-z0-9_]*::)*+~[A-Za-z_][A-Za-z0-9_]*) # actual name
|
|
\\s*(\\() # opening bracket
|
|
'''
|
|
'beginCaptures':
|
|
'1':
|
|
'name': 'entity.name.function.cpp'
|
|
'2':
|
|
'name': 'punctuation.definition.parameters.begin.c'
|
|
'end': '\\)'
|
|
'endCaptures':
|
|
'0':
|
|
'name': 'punctuation.definition.parameters.end.c'
|
|
'name': 'meta.function.destructor.cpp'
|
|
'patterns': [
|
|
{
|
|
'include': '$base'
|
|
}
|
|
]
|
|
}
|
|
{
|
|
'begin': '''(?x)
|
|
(?:
|
|
^ | # beginning of line
|
|
(?:(?<!else|new|=)) # or word + space before name
|
|
)
|
|
((?:[A-Za-z_][A-Za-z0-9_]*::)*+~[A-Za-z_][A-Za-z0-9_]*) # actual name
|
|
\\s*(\\() # opening bracket
|
|
'''
|
|
'beginCaptures':
|
|
'1':
|
|
'name': 'entity.name.function.cpp'
|
|
'2':
|
|
'name': 'punctuation.definition.parameters.begin.c'
|
|
'end': '\\)'
|
|
'endCaptures':
|
|
'0':
|
|
'name': 'punctuation.definition.parameters.end.c'
|
|
'name': 'meta.function.destructor.prototype.cpp'
|
|
'patterns': [
|
|
{
|
|
'include': '$base'
|
|
}
|
|
]
|
|
}
|
|
{
|
|
'include': 'source.c'
|
|
}
|
|
]
|
|
'repository':
|
|
'angle_brackets':
|
|
'begin': '<'
|
|
'end': '>'
|
|
'name': 'meta.angle-brackets.cpp'
|
|
'patterns': [
|
|
{
|
|
'include': '#angle_brackets'
|
|
}
|
|
{
|
|
'include': '$base'
|
|
}
|
|
]
|
|
'block':
|
|
'begin': '\\{'
|
|
'beginCaptures':
|
|
'0':
|
|
'name': 'punctuation.section.block.begin.bracket.curly.c'
|
|
'end': '\\}'
|
|
'endCaptures':
|
|
'0':
|
|
'name': 'punctuation.section.block.end.bracket.curly.c'
|
|
'name': 'meta.block.cpp'
|
|
'patterns': [
|
|
{
|
|
'captures':
|
|
'1':
|
|
'name': 'support.function.any-method.c'
|
|
'2':
|
|
'name': 'punctuation.definition.parameters.c'
|
|
'match': '''(?x)
|
|
(
|
|
(?!while|for|do|if|else|switch|catch|enumerate|return|r?iterate)
|
|
(?:\\b[A-Za-z_][A-Za-z0-9_]*+\\b|::)*+ # actual name
|
|
)
|
|
\\s*(\\() # opening bracket
|
|
'''
|
|
'name': 'meta.function-call.c'
|
|
}
|
|
{
|
|
'include': '$base'
|
|
}
|
|
]
|
|
'constructor':
|
|
'patterns': [
|
|
{
|
|
'begin': '''(?x)
|
|
(?:^\\s*) # beginning of line
|
|
((?!while|for|do|if|else|switch|catch|enumerate|r?iterate)[A-Za-z_][A-Za-z0-9_:]*) # actual name
|
|
\\s*(\\() # opening bracket
|
|
'''
|
|
'beginCaptures':
|
|
'1':
|
|
'name': 'entity.name.function.cpp'
|
|
'2':
|
|
'name': 'punctuation.definition.parameters.begin.c'
|
|
'end': '\\)'
|
|
'endCaptures':
|
|
'0':
|
|
'name': 'punctuation.definition.parameters.end.c'
|
|
'name': 'meta.function.constructor.cpp'
|
|
'patterns': [
|
|
{
|
|
'include': '$base'
|
|
}
|
|
]
|
|
}
|
|
{
|
|
'begin': '''(?x)
|
|
(:)
|
|
(
|
|
(?=
|
|
\\s*[A-Za-z_][A-Za-z0-9_:]* # actual name
|
|
\\s* (\\() # opening bracket
|
|
)
|
|
)
|
|
'''
|
|
'beginCaptures':
|
|
'1':
|
|
'name': 'punctuation.definition.parameters.c'
|
|
'end': '(?=\\{)'
|
|
'name': 'meta.function.constructor.initializer-list.cpp'
|
|
'patterns': [
|
|
{
|
|
'include': '$base'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
'special_block':
|
|
'patterns': [
|
|
{
|
|
"begin": "\\b(using)\\b\\s*(namespace)\\b\\s*((?:[_A-Za-z][_A-Za-z0-9]*\\b(::)?)*)",
|
|
"beginCaptures": {
|
|
"1": {
|
|
"name": "keyword.control.cpp"
|
|
},
|
|
"2": {
|
|
"name": "storage.type.cpp"
|
|
},
|
|
"3": {
|
|
"name": "entity.name.type.cpp"
|
|
}
|
|
},
|
|
"end": "(;)",
|
|
"name": "meta.using-namespace-declaration.cpp"
|
|
},
|
|
{
|
|
'begin': '\\b(namespace)\\b\\s*((?:[_A-Za-z][_A-Za-z0-9]*\\b(::)?)*)?+'
|
|
'beginCaptures':
|
|
'1':
|
|
'name': 'storage.type.cpp'
|
|
'2':
|
|
'name': 'entity.name.type.cpp'
|
|
'captures':
|
|
'1':
|
|
'name': 'keyword.control.namespace.$2'
|
|
'end': '(?<=\\})|(?=(;|,|\\(|\\)|>|\\[|\\]|=))'
|
|
'name': 'meta.namespace-block.cpp'
|
|
'patterns': [
|
|
{
|
|
'begin': '\\{'
|
|
'beginCaptures':
|
|
'0':
|
|
'name': 'punctuation.definition.scope.cpp'
|
|
'end': '\\}'
|
|
'endCaptures':
|
|
'0':
|
|
'name': 'punctuation.definition.scope.cpp'
|
|
'patterns': [
|
|
{
|
|
'include': '#special_block'
|
|
}
|
|
{
|
|
'include': '#constructor'
|
|
}
|
|
{
|
|
'include': '$base'
|
|
}
|
|
]
|
|
}
|
|
{
|
|
'include': '$base'
|
|
}
|
|
]
|
|
}
|
|
{
|
|
'begin': '\\b(class|struct)\\b\\s*([_A-Za-z][_A-Za-z0-9]*\\b)?+(\\s*:\\s)?'
|
|
'beginCaptures':
|
|
'1':
|
|
'name': 'storage.type.cpp'
|
|
'2':
|
|
'name': 'entity.name.type.cpp'
|
|
'end': '(?<=\\})|(?=(;|\\(|\\)|>|\\[|\\]|=))'
|
|
'name': 'meta.class-struct-block.cpp'
|
|
'patterns': [
|
|
{
|
|
'include': '#angle_brackets'
|
|
}
|
|
{
|
|
'begin': '(virtual\\s*)?(public|protected|private)\\s*(virtual\\s*)?([_A-Za-z][_A-Za-z0-9]*)\\b'
|
|
'beginCaptures':
|
|
'1':
|
|
'name': 'storage.type.modifier.cpp'
|
|
'2':
|
|
'name': 'storage.type.modifier.cpp'
|
|
'3':
|
|
'name': 'storage.type.modifier.cpp'
|
|
'4':
|
|
'name': 'entity.name.type.inherited.cpp'
|
|
'end': '(\\{)|(\\s*\\n)|(,)?'
|
|
'patterns': [
|
|
{
|
|
'include': '#angle_brackets'
|
|
}
|
|
]
|
|
}
|
|
{
|
|
'begin': '\\{'
|
|
'beginCaptures':
|
|
'0':
|
|
'name': 'punctuation.section.block.begin.bracket.curly.cpp'
|
|
'end': '(\\})(\\s*\\n)?'
|
|
'endCaptures':
|
|
'1':
|
|
'name': 'punctuation.section.block.end.bracket.curly.cpp'
|
|
'2':
|
|
'name': 'invalid.illegal.you-forgot-semicolon.cpp'
|
|
'patterns': [
|
|
{
|
|
'include': '#special_block'
|
|
}
|
|
{
|
|
'include': '#constructor'
|
|
}
|
|
{
|
|
'include': '$base'
|
|
}
|
|
]
|
|
}
|
|
{
|
|
'include': '$base'
|
|
}
|
|
]
|
|
}
|
|
{
|
|
'begin': '\\b(extern)(?=\\s*")'
|
|
'beginCaptures':
|
|
'1':
|
|
'name': 'storage.modifier.cpp'
|
|
'end': '(?<=\\})|(?=\\w)|(?=\\s*#\\s*endif\\b)'
|
|
'name': 'meta.extern-block.cpp'
|
|
'patterns': [
|
|
{
|
|
'begin': '\\{'
|
|
'beginCaptures':
|
|
'0':
|
|
'name': 'punctuation.section.block.begin.bracket.curly.c'
|
|
'end': '\\}|(?=\\s*#\\s*endif\\b)'
|
|
'endCaptures':
|
|
'0':
|
|
'name': 'punctuation.section.block.end.bracket.curly.c'
|
|
'patterns': [
|
|
{
|
|
'include': '#special_block'
|
|
}
|
|
{
|
|
'include': '$base'
|
|
}
|
|
]
|
|
}
|
|
{
|
|
'include': '$base'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
'strings':
|
|
'patterns': [
|
|
{
|
|
'begin': '(u|u8|U|L)?"'
|
|
'beginCaptures':
|
|
'0':
|
|
'name': 'punctuation.definition.string.begin.cpp'
|
|
'1':
|
|
'name': 'meta.encoding.cpp'
|
|
'end': '"'
|
|
'endCaptures':
|
|
'0':
|
|
'name': 'punctuation.definition.string.end.cpp'
|
|
'name': 'string.quoted.double.cpp'
|
|
'patterns': [
|
|
{
|
|
'match': '\\\\u\\h{4}|\\\\U\\h{8}'
|
|
'name': 'constant.character.escape.cpp'
|
|
}
|
|
{
|
|
'match': '\\\\[\'"?\\\\abfnrtv]'
|
|
'name': 'constant.character.escape.cpp'
|
|
}
|
|
{
|
|
'match': '\\\\[0-7]{1,3}'
|
|
'name': 'constant.character.escape.cpp'
|
|
}
|
|
{
|
|
'match': '\\\\x\\h+'
|
|
'name': 'constant.character.escape.cpp'
|
|
}
|
|
{
|
|
'include': 'source.c#string_placeholder'
|
|
}
|
|
]
|
|
}
|
|
{
|
|
'begin': '(u|u8|U|L)?R"(?:([^ ()\\\\\\t]{0,16})|([^ ()\\\\\\t]*))\\('
|
|
'beginCaptures':
|
|
'0':
|
|
'name': 'punctuation.definition.string.begin.cpp'
|
|
'1':
|
|
'name': 'meta.encoding.cpp'
|
|
'3':
|
|
'name': 'invalid.illegal.delimiter-too-long.cpp'
|
|
'end': '\\)\\2(\\3)"'
|
|
'endCaptures':
|
|
'0':
|
|
'name': 'punctuation.definition.string.end.cpp'
|
|
'1':
|
|
'name': 'invalid.illegal.delimiter-too-long.cpp'
|
|
'name': 'string.quoted.double.raw.cpp'
|
|
}
|
|
]
|