// This is a TextMate grammar distributed by `starry-night`. // This grammar is developed at // // and licensed `mit`. // See for more info. /** * @import {Grammar} from '@wooorm/starry-night' */ /** @type {Grammar} */ const grammar = { extensions: ['.brs'], names: ['brighterscript', 'brightscript'], patterns: [{include: '#entire_language'}], repository: { alias_statement: { captures: { 1: {name: 'keyword.declaration.alias.brs'}, 2: {name: 'entity.name.variable.brs'}, 3: {name: 'keyword.operator.assignment.brs'} }, match: '(?i:(alias)\\s+([a-z0-9_]+)\\s*(=)\\s*)' }, annotation: { patterns: [ { captures: { 1: {name: 'punctuation.decorator.brs'}, 2: {name: 'entity.name.function.brs meta.function-call.brs'} }, match: '^\\s*(@)\\s*([a-zA-Z0-9_]+)' }, { begin: '(@)\\s*([a-zA-Z0-9_]+)\\s*(\\()', beginCaptures: { 1: {name: 'punctuation.decorator.brs'}, 2: {name: 'entity.name.function.brs meta.function-call.brs'}, 3: {name: 'meta.brace.round.brs'} }, end: '(\\))', endCaptures: {1: {name: 'meta.brace.round.brs'}}, name: 'meta.decorator.brs', patterns: [{include: '#entire_language'}] } ] }, apostrophe_comment: { captures: {1: {name: 'punctuation.definition.comment.brs'}}, match: "('[^\\r\\n]*)$", name: 'comment.line.apostrophe.brs' }, bsdoc: { patterns: [ {include: '#bsdoc_param_and_type'}, {include: '#bsdoc_return_and_type'}, {include: '#bsdoc_generic'} ] }, bsdoc_generic: { captures: { 1: {name: 'comment.line.apostrophe.brs'}, 2: { name: 'punctuation.definition.block.tag.bsdoc storage.type.class.bsdoc' }, 3: { name: 'punctuation.definition.block.tag.bsdoc storage.type.class.bsdoc' }, 4: {name: 'comment.block.documentation.brs'} }, match: "(?i:\\s*(rem|'+)\\s*(@)(\\w+)(.*$))" }, bsdoc_param_and_type: { captures: { 1: {name: 'comment.line.apostrophe.brs'}, 2: { name: 'punctuation.definition.block.tag.bsdoc storage.type.class.bsdoc' }, 3: { name: 'punctuation.definition.block.tag.bsdoc storage.type.class.bsdoc' }, 4: {name: 'punctuation.definition.bracket.curly.begin.bsdoc'}, 5: { name: ' comment.block.documentation.brs entity.name.type.instance.bsdoc' }, 6: {name: 'punctuation.definition.bracket.curly.end.bsdoc'}, 7: {name: 'variable.other.bsdoc'}, 8: {name: 'comment.block.documentation.brs'} }, match: "(?i:\\s*(rem|'+)\\s*(@)(param|type)\\s+(?:(\\{)\\s*([^\\}]+)\\s*(\\}))?\\s*([a-z0-9_.]+)?(.*))" }, bsdoc_return_and_type: { captures: { 1: {name: 'comment.line.apostrophe.brs'}, 2: { name: 'punctuation.definition.block.tag.bsdoc storage.type.class.bsdoc' }, 3: { name: 'punctuation.definition.block.tag.bsdoc storage.type.class.bsdoc' }, 4: {name: 'punctuation.definition.bracket.curly.begin.bsdoc'}, 5: { name: ' comment.block.documentation.brs entity.name.type.instance.bsdoc' }, 6: {name: 'punctuation.definition.bracket.curly.end.bsdoc'}, 7: {name: 'comment.block.documentation.brs'} }, match: "(?i:\\s*(rem|'+)\\s*(@)(return|returns)\\s+(?:(\\{)\\s*([^\\}]+)\\s*(\\}))?\\s*([a-z0-9_.]+.*)?)" }, class_declaration: { captures: { 1: {name: 'keyword.other.class.brs'}, 2: {name: 'entity.name.type.class.brs'}, 3: {name: 'storage.modifier.brs'}, 4: {name: 'entity.name.type.class.brs'} }, match: '(?i:(class)\\s+([a-z0-9_]+)(?:\\s+(extends)(?:\\s+([a-z0-9_]+))?)?)' }, class_roku_builtin: { match: '(?i:(?<=")(roAppInfo|roAppManager|roAppMemoryMonitor|roAppMemoryMonitorEvent|roAppendFile|roArray|roAssetCollection|roAssetFetcher|roAssetFetcherEvent|roAssetFetcherProgressEvent|roAssetPool|roAssetPoolFiles|roAssetRealizer|roAssetRealizerEvent|roAssociativeArray|roAudioConfiguration|roAudioEvent|roAudioEventMx|roAudioGuide|roAudioMetadata|roAudioOutput|roAudioPlayer|roAudioPlayerEvent|roAudioPlayerMx|roAudioResource|roBitmap|roBlockCipher|roBoolean|roBrSub|roBrightPackage|roBtClient|roBtClientEvent|roBtClientManager|roBtClientManagerEvent|roBtManager|roByteArray|roCECStatus|roCECStatusEvent|roCanvasWidget|roCaptionRenderer|roCaptionRendererEvent|roCecInterface|roCecRxFrameEvent|roCecTxCompleteEvent|roChannelManager|roChannelStore|roChannelStoreEvent|roCharDisplay|roClockWidget|roCodeRegistrationScreen|roCodeRegistrationScreenEvent|roCompositor|roConfigurationElements|roControlDown|roControlPort|roControlUp|roCreateFile|roDataGramSocket|roDatagramEvent|roDatagramReceiver|roDatagramSender|roDatagramSocket|roDateTime|roDeviceCrypto|roDeviceCustomization|roDeviceInfo|roDeviceInfoEvent|roDiskErrorEvent|roDiskMonitor|roDouble|roDsa|roEVPCipher|roEVPDigest|roElectron|roElectronEvent|roFileSystem|roFileSystemEvent|roFloat|roFont|roFontMetrics|roFontRegistry|roFunction|roGPIOButton|roGPIOControlPort|roGlobal|roGpioButton|roGpioControlPort|roGridScreen|roGridScreenEvent|roHMAC|roHashGenerator|roHdmiHotPlugEvent|roHdmiInputChanged|roHdmiOutputChanged|roHdmiStatus|roHdmiStatusEvent|roHtmlWidget|roHtmlWidgetEvent|roHttpAgent|roHttpEvent|roHttpServer|roIRDownEvent|roIRRepeatEvent|roIRUpEvent|roIRReceiver|roIRRemote|roIRRemotePress|roIRTransmitCompleteEvent|roIRTransmitter|roImageBuffer|roImageCanvas|roImageCanvasEvent|roImageMetaData|roImageMetadata|roImagePlayer|roImageWidget|roInput|roInputEvent|roInt|roIntrinsicDouble|roInvalid|roJRE|roKeyStore|roKeyboard|roKeyboardPress|roKeyboardScreen|roKeyboardScreenEvent|roList|roListScreen|roListScreenEvent|roLocalization|roLongInteger|roMediaServer|roMediaStreamer|roMediaStreamerEvent|roMessageDialog|roMessageDialogEvent|roMessagePort|roMicrophone|roMicrophoneEvent|roMimeStream|roMimeStreamEvent|roNetworkAdvertisement|roNetworkAttached|roNetworkConfiguration|roNetworkDetached|roNetworkDiscovery|roNetworkHotplug|roNetworkStatistics|roNetworkTimeEvent|roNodeJs|roNodeJsEvent|roOneLineDialog|roOneLineDialogEvent|roOpenVpn|roParagraphScreen|roParagraphScreenEvent|roPassKey|roPath|roPinEntryDialog|roPinEntryDialogEvent|roPosterScreen|roPosterScreenEvent|roPowerEvent|roPowerManager|roProgramGuide|roPtp|roPtpEvent|roQuadravoxButton|roQuadravoxSNS5|roRSA|roRSSArticle|roRSSParser|roReadFile|roReadWriteFile|roRectangle|roRegex|roRegion|roRegistry|roRegistrySection|roRemoteInfo|roResourceManager|roRssArticle|roRssParser|roRtspStream|roRtspStreamEvent|roSGNode|roSGNodeEvent|roSGScreen|roSGScreenEvent|roScreen|roSearchHistory|roSearchScreen|roSearchScreenEvent|roSequenceMatchEvent|roSequenceMatcher|roSerialPort|roSlideShow|roSlideShowEvent|roSnmpAgent|roSnmpEvent|roSocketAddress|roSocketEvent|roSpringboardScreen|roSpringboardScreenEvent|roSprite|roSqliteDatabase|roSqliteEvent|roSqliteStatement|roStorageAttached|roStorageDetached|roStorageHotplug|roStorageInfo|roStreamByteEvent|roStreamConnectResultEvent|roStreamEndEvent|roStreamLineEvent|roStreamQueue|roStreamQueueEvent|roStreamSocket|roString|roSyncManager|roSyncManagerEvent|roSyncPool|roSyncPoolEvent|roSyncPoolFiles|roSyncPoolProgressEvent|roSyncSpec|roSystemLog|roSystemLogEvent|roSystemTime|roTCPConnectEvent|roTCPServer|roTCPStream|roTextField|roTextScreen|roTextScreenEvent|roTextToSpeech|roTextToSpeechEvent|roTextWidget|roTextWidgetEvent|roTextureManager|roTextureRequest|roTextureRequestEvent|roTimeSpan|roTimer|roTimerEvent|roTimespan|roTouchCalibrationEvent|roTouchEvent|roTouchScreen|roTuner|roTunerEvent|roUPnPActionResult|roUPnPController|roUPnPDevice|roUPnPSearchEvent|roUPnPService|roUPnPServiceEvent|roUniversalControlEvent|roUrlEvent|roUrlTransfer|roUsbFilesystem|roUsbHidEmulator|roUsbHidLedEmulatorEvent|roUsbPowerControl|roVideoEvent|roVideoInput|roVideoMode|roVideoPlayer|roVideoPlayerEvent|roVideoScreen|roVideoScreenEvent|roVirtualMemory|roWriteFile|roXMLElement|roXMLList)(?="))', name: 'support.class.brs' }, comment: { patterns: [{include: '#rem_comment'}, {include: '#apostrophe_comment'}] }, component_statement: { begin: '(?i)^[ \t]*(component)\\s+(?:([a-z0-9_]+)|(".*?"))(?:\\s+(extends)(?:\\s+(?:([a-z0-9_]+)|(".*?")))?)?\\s*', beginCaptures: { 1: {name: 'storage.type.component.brs'}, 2: {name: 'entity.name.type.component.brs'}, 3: {name: 'string.quoted.double.brs'}, 4: {name: 'storage.modifier.extends.brs'}, 5: {name: 'entity.name.type.component.brs'}, 6: {name: 'string.quoted.double.brs'} }, end: '(?i)(?=||<|<>|\\+|-|\\*|\\/|\\^|&|\\b(?i:(And|Not|Or|Mod))\\b', name: 'keyword.operator.brs' }, preprocessor_keywords: { patterns: [ {match: '(?i:(#[ \t]*const))', name: 'keyword.preprocessor.const.brs'}, {match: '(?i:(#[ \t]*if))', name: 'keyword.preprocessor.if.brs'}, { match: '(?i:(#[ \t]*else[ \t]*if))', name: 'keyword.preprocessor.elseif.brs' }, { match: '(?i:(#[ \t]*end[ \t]*if))', name: 'keyword.preprocessor.endif.brs' }, {match: '(?i:(#[ \t]*else))', name: 'keyword.preprocessor.else.brs'}, {match: '(?i:(#[ \t]*error))', name: 'keyword.preprocessor.error.brs'} ] }, primitive_literal_expression: { patterns: [ { begin: '"', end: '"', name: 'string.quoted.double.brs', patterns: [ {match: '""', name: 'constant.character.escape.brs'}, {include: '#class_roku_builtin'} ] }, {include: '#numeric_literal'}, { patterns: [ { match: '(?i)\\b(true)\\b', name: 'constant.language.boolean.true.brs' }, { match: '(?i)\\b(false)\\b', name: 'constant.language.boolean.false.brs' } ] }, { captures: {1: {name: 'constant.language.null.brs'}}, match: '(?i:\\b(invalid)\\b)' } ] }, program_statements: { match: '(?i:(?|&&|\\|\\||\\*\\/)\\s*(\\/)(?![\\/*])(?=(?:[^\\/\\\\\\[\\()]|\\\\.|\\[([^\\]\\\\]|\\\\.)+\\]|\\(([^\\)\\\\]|\\\\.)+\\))+\\/([gmixsuXUAJ]+|(?![\\/\\*])|(?=\\/\\*))(?!\\s*[a-zA-Z0-9_$]))', beginCaptures: {1: {name: 'punctuation.definition.string.begin.brs'}}, end: '(/)([gmixsuXUAJ]*)', endCaptures: { 1: {name: 'punctuation.definition.string.end.brs'}, 2: {name: 'keyword.other.brs'} }, name: 'string.regexp.brs', patterns: [{include: '#regexp'}] }, { begin: '((?' }, { match: '[?+*]|\\{(\\d+,\\d+|\\d+,|,\\d+|\\d+)\\}\\??', name: 'keyword.operator.quantifier.regexp' }, {match: '\\|', name: 'keyword.operator.or.regexp'}, { begin: '(\\()((\\?=)|(\\?!)|(\\?\\|)|(\\?<=)|(\\?])|(?:\\?<([a-zA-Z_$][\\w$]*)>))?', beginCaptures: { 0: {name: 'punctuation.definition.group.regexp'}, 1: {name: 'punctuation.definition.group.no-capture.regexp'}, 2: {name: 'variable.other.regexp'} }, end: '\\)', endCaptures: {0: {name: 'punctuation.definition.group.regexp'}}, name: 'meta.group.regexp', patterns: [{include: '#regexp'}] }, { begin: '(\\[)(\\^)?', beginCaptures: { 1: {name: 'punctuation.definition.character-class.regexp'}, 2: {name: 'keyword.operator.negation.regexp'} }, end: '(\\])', endCaptures: { 1: {name: 'punctuation.definition.character-class.regexp'} }, name: 'constant.other.character-class.set.regexp', patterns: [ { captures: { 1: {name: 'constant.character.numeric.regexp'}, 2: {name: 'constant.character.control.regexp'}, 3: {name: 'constant.character.escape.backslash.regexp'}, 4: {name: 'constant.character.numeric.regexp'}, 5: {name: 'constant.character.control.regexp'}, 6: {name: 'constant.character.escape.backslash.regexp'} }, match: '(?:.|(\\\\(?:[0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}))|(\\\\c[A-Z])|(\\\\.))\\-(?:[^\\]\\\\]|(\\\\(?:[0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}))|(\\\\c[A-Z])|(\\\\.))', name: 'constant.other.character-class.range.regexp' }, {include: '#regex-character-class'} ] }, {include: '#regex-character-class'} ] }, region_comment: { captures: { 1: {name: 'keyword.preprocessor.region.brs'}, 2: {name: 'string.unquoted.preprocessor.message.brs'} }, match: "(?i:^\\s*('\\s*#region)(?:(\\s+.*)?))$" }, rem_comment: { captures: {1: {name: 'punctuation.definition.comment.brs'}}, match: '^\\s*?(?i:rem\\s.*)$', name: 'comment.line.rem.brs' }, storage_types: { captures: {1: {name: 'storage.type.brs'}}, match: '(?i:\\b(boolean|integer|longinteger|float|double|string|object|function|sub|interface|dynamic|brsub|dim|const)\\b)' }, template_string: { begin: '(`)', beginCaptures: {1: {name: 'string.template.brs'}}, end: '(`)', endCaptures: {1: {name: 'string.template.brs'}}, patterns: [ { begin: '(\\$\\{)', beginCaptures: { 1: {name: 'punctuation.definition.template-expression.begin.brs'} }, end: '(\\})', endCaptures: { 1: {name: 'punctuation.definition.template-expression.end'} }, patterns: [{include: '#entire_language'}] }, {match: '(.)', name: 'string.template.brs'} ] }, try_catch: { match: '(?i:\\b(try|catch|(end[ \\t]*try))\\b)', name: 'keyword.control.trycatch.brs' }, type_expression: { patterns: [ { captures: {1: {name: 'storage.type.brs'}}, match: '(?i)(boolean|integer|longinteger|float|double|string)' }, { captures: {1: {name: 'support.type.brs entity.name.type.brs'}}, match: '(?i)\\b([a-z0-9_]+)' } ] }, variables_and_params: { captures: { 1: {name: 'keyword.operator.new.brs'}, 2: {name: 'entity.name.variable.local.brs'} }, match: '(?i:(?:\\b(new)\\s)?\\b(?