diff --git a/src/grammar/brightscript.tmLanguage.spec.ts b/src/grammar/brightscript.tmLanguage.spec.ts index 49612667..0924f43d 100644 --- a/src/grammar/brightscript.tmLanguage.spec.ts +++ b/src/grammar/brightscript.tmLanguage.spec.ts @@ -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() diff --git a/syntaxes/brightscript.tmLanguage.json b/syntaxes/brightscript.tmLanguage.json index ea371cb1..712698f6 100644 --- a/syntaxes/brightscript.tmLanguage.json +++ b/syntaxes/brightscript.tmLanguage.json @@ -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" } }, @@ -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" } }, @@ -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:(?