Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions src/grammar/brightscript.tmLanguage.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -822,6 +822,60 @@ describe('brightscript.tmlanguage.json', () => {
`);
});

it(`handles standalone comment inside enum block`, async () => {
await testGrammar(`
enum DeviceContext
' ^^^^^^^^^^^^^ entity.name.type.enum.brs
'^^^^ storage.type.enum.brs

' This is a standalone comment
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ comment.line.apostrophe.brs

value = 1
' ^ constant.numeric.brs
' ^ keyword.operator.assignment.brs
'^^^^^ variable.object.enummember.brs

end enum
'^^^^^^^^ storage.type.enum.brs
`);
});

it('handles `end sub` preceded by a colon', async () => {
await testGrammar(`
if true then doSomething() : end sub
' ^^^^^^^^^ keyword.declaration.function.brs
`);

await testGrammar(`
if true then doSomething() : end function
' ^^^^^^^^^^^^^ keyword.declaration.function.brs
`);
});

it('handles optional keyword in interface fields', async () => {
await testGrammar(`
interface Person
optional name as string
' ^^^^^^ storage.type.brs
' ^^ keyword.control.as.brs
' ^^^^ variable.object.property.brs
'^^^^^^^^ storage.modifier.brs
`);
});

it('handles optional keyword in interface functions', async () => {
await testGrammar(`
interface Person
optional sub test() as string
' ^^^^^^ storage.type.brs
' ^^ keyword.control.as.brs
' ^^^^ entity.name.function.member.brs
' ^^^ storage.type.function.brs
'^^^^^^^^ storage.modifier.brs
`);
});

it('handles named function declarations', async () => {
await testGrammar(`
sub write()
Expand Down
34 changes: 20 additions & 14 deletions syntaxes/brightscript.tmLanguage.json
Original file line number Diff line number Diff line change
Expand Up @@ -792,12 +792,15 @@
}
},
"interface_field": {
"begin": "(?i)\\s*\\b([a-z0-9_]+)(?:[\\s\\t]*(as))?",
"begin": "(?i)\\s*\\b(?:(optional)[\\s\\t]+)?\\b([a-z0-9_]+)(?:[\\s\\t]*(as))?",
"beginCaptures": {
"1": {
"name": "variable.object.property.brs"
"name": "storage.modifier.brs"
},
"2": {
"name": "variable.object.property.brs"
},
"3": {
"name": "keyword.control.as.brs"
}
},
Expand All @@ -822,41 +825,44 @@
]
},
"interface_function_plain": {
"match": "(?i:\\s*\\b(function|sub)[\\s\\t]+([a-z0-9_]+)(\\())(\\))[\\s\\t]",
"match": "(?i:\\s*\\b(?:(optional)[\\s\\t]+)?(function|sub)[\\s\\t]+([a-z0-9_]+)(\\())(\\))[\\s\\t]",
"captures": {
"1": {
"name": "storage.type.function.brs"
"name": "storage.modifier.brs"
},
"2": {
"name": "entity.name.function.member.brs"
"name": "storage.type.function.brs"
},
"3": {
"name": "punctuation.definition.parameters.begin.brs"
"name": "entity.name.function.member.brs"
},
"4": {
"name": "punctuation.definition.parameters.end.brs"
"name": "punctuation.definition.parameters.begin.brs"
},
"5": {
"name": "keyword.control.as.brs"
"name": "punctuation.definition.parameters.end.brs"
}
}
},
"interface_function_with_return_type": {
"begin": "(?i:\\s*\\b(function|sub)[\\s\\t]+([a-z0-9_]+)(\\()).*?(\\))[\\s\\t]+(as)",
"begin": "(?i:\\s*\\b(?:(optional)[\\s\\t]+)?(function|sub)[\\s\\t]+([a-z0-9_]+)(\\()).*?(\\))[\\s\\t]+(as)",
"beginCaptures": {
"1": {
"name": "storage.type.function.brs"
"name": "storage.modifier.brs"
},
"2": {
"name": "entity.name.function.member.brs"
"name": "storage.type.function.brs"
},
"3": {
"name": "punctuation.definition.parameters.begin.brs"
"name": "entity.name.function.member.brs"
},
"4": {
"name": "punctuation.definition.parameters.end.brs"
"name": "punctuation.definition.parameters.begin.brs"
},
"5": {
"name": "punctuation.definition.parameters.end.brs"
},
"6": {
"name": "keyword.control.as.brs"
}
},
Expand Down Expand Up @@ -949,7 +955,7 @@
"name": "keyword.control.brs"
}
},
"match": "(?i:[^\\.\\w\\\"](then|stop|run|end|each|next|throw)(?!(\\s*:)|[\\d\\w_]))"
"match": "(?i:[^\\.\\w\\\"](then|stop|run|end(?!\\s+(?:sub|function))|each|next|throw)(?!(\\s*:)|[\\d\\w_]))"
},
"loop_keywords": {
"match": "(?i:(?<!\\.)(continue\\s+(for|while)\\b))",
Expand Down
Loading