From 9d8a7bdf6023eaf679d50aa2cb6915cdb0f973c5 Mon Sep 17 00:00:00 2001 From: Valeriia Date: Wed, 28 Jul 2021 19:36:15 +0300 Subject: [PATCH] Implement syntax highlighting for Flow9 --- src/flow9/flow9.contribution.ts | 13 +++ src/flow9/flow9.test.ts | 149 +++++++++++++++++++++++++++++ src/flow9/flow9.ts | 163 ++++++++++++++++++++++++++++++++ src/monaco.contribution.ts | 1 + 4 files changed, 326 insertions(+) create mode 100644 src/flow9/flow9.contribution.ts create mode 100644 src/flow9/flow9.test.ts create mode 100644 src/flow9/flow9.ts diff --git a/src/flow9/flow9.contribution.ts b/src/flow9/flow9.contribution.ts new file mode 100644 index 00000000..649114b4 --- /dev/null +++ b/src/flow9/flow9.contribution.ts @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { registerLanguage } from '../_.contribution'; + +registerLanguage({ + id: 'flow9', + extensions: ['.flow'], + aliases: ['Flow9', 'Flow', 'flow9', 'flow'], + loader: () => import('./flow9') +}); diff --git a/src/flow9/flow9.test.ts b/src/flow9/flow9.test.ts new file mode 100644 index 00000000..bafd559a --- /dev/null +++ b/src/flow9/flow9.test.ts @@ -0,0 +1,149 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { testTokenization } from '../test/testRunner'; + +testTokenization('flow9', [ + [ + { + line: '//', + tokens: [{ startIndex: 0, type: 'comment.flow' }] + } + ], + + [ + { + line: ' // a comment', + tokens: [ + { startIndex: 0, type: '' }, + { startIndex: 4, type: 'comment.flow' } + ] + } + ], + + [ + { + line: '/* //*/ a', + tokens: [ + { startIndex: 0, type: 'comment.flow' }, + { startIndex: 7, type: '' }, + { startIndex: 8, type: 'identifier.flow' } + ] + } + ], + + [ + { + line: '/import file 1', + tokens: [ + { startIndex: 0, type: 'delimiter.flow' }, + { startIndex: 1, type: 'keyword.flow' }, + { startIndex: 7, type: '' }, + { startIndex: 8, type: 'identifier.flow' }, + { startIndex: 13, type: '' }, + { startIndex: 14, type: 'number.flow' } + ] + } + ], + + [ + { + line: 'getDefaults() -> [int] {}', + tokens: [ + { startIndex: 0, type: 'identifier.flow' }, + { startIndex: 11, type: 'delimiter.flow' }, + { startIndex: 13, type: '' }, + { startIndex: 14, type: 'delimiter.flow' }, + { startIndex: 16, type: '' }, + { startIndex: 17, type: 'delimiter.flow' }, + { startIndex: 18, type: 'type.flow' }, + { startIndex: 21, type: 'delimiter.flow' }, + { startIndex: 22, type: '' }, + { startIndex: 23, type: 'delimiter.flow' } + ] + } + ], + + // Numbers + [ + { + line: '0', + tokens: [{ startIndex: 0, type: 'number.flow' }] + } + ], + + [ + { + line: '0.10', + tokens: [{ startIndex: 0, type: 'number.flow' }] + } + ], + + [ + { + line: '0x123', + tokens: [{ startIndex: 0, type: 'number.flow' }] + } + ], + + [ + { + line: '052_', + tokens: [ + { startIndex: 0, type: 'number.flow' }, + { startIndex: 3, type: 'identifier.flow' } + ] + } + ], + + [ + { + line: '0+0', + tokens: [ + { startIndex: 0, type: 'number.flow' }, + { startIndex: 1, type: 'delimiter.flow' }, + { startIndex: 2, type: 'number.flow' } + ] + } + ], + + [ + { + line: '0 + 0', + tokens: [ + { startIndex: 0, type: 'number.flow' }, + { startIndex: 1, type: '' }, + { startIndex: 2, type: 'delimiter.flow' }, + { startIndex: 3, type: '' }, + { startIndex: 4, type: 'number.flow' } + ] + } + ], + + [ + { + line: '"simple string"', + tokens: [{ startIndex: 0, type: 'string.flow' }] + } + ], + + [ + { + line: '"""', + tokens: [ + { startIndex: 0, type: 'string.flow' }, + { startIndex: 1, type: 'string.escape.flow' }, + { startIndex: 3, type: 'string.flow' } + ] + } + ], + + [ + { + line: '""', + tokens: [{ startIndex: 0, type: 'string.invalid.flow' }] + } + ] +]); diff --git a/src/flow9/flow9.ts b/src/flow9/flow9.ts new file mode 100644 index 00000000..2cea3b50 --- /dev/null +++ b/src/flow9/flow9.ts @@ -0,0 +1,163 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { languages } from '../fillers/monaco-editor-core'; + +export const conf: languages.LanguageConfiguration = { + comments: { + blockComment: ['/*', '*/'], + lineComment: '//' + }, + brackets: [ + ['{', '}'], + ['[', ']'], + ['(', ')'] + ], + autoClosingPairs: [ + { open: '{', close: '}', notIn: ['string'] }, + { open: '[', close: ']', notIn: ['string'] }, + { open: '(', close: ')', notIn: ['string'] }, + { open: '"', close: '"', notIn: ['string'] }, + { open: "'", close: "'", notIn: ['string'] } + ], + surroundingPairs: [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '(', close: ')' }, + { open: '"', close: '"' }, + { open: "'", close: "'" }, + { open: '<', close: '>' } + ] +}; + +export const language = { + defaultToken: '', + tokenPostfix: '.flow', + + keywords: [ + 'import', + 'require', + 'export', + 'forbid', + 'native', + 'if', + 'else', + 'cast', + 'unsafe', + 'switch', + 'default' + ], + + types: [ + 'io', + 'mutable', + 'bool', + 'int', + 'double', + 'string', + 'flow', + 'void', + 'ref', + 'true', + 'false', + 'with' + ], + + operators: [ + '=', + '>', + '<', + '<=', + '>=', + '==', + '!', + '!=', + ':=', + '::=', + '&&', + '||', + '+', + '-', + '*', + '/', + '@', + '&', + '%', + ':', + '->', + '\\', + '$', + '??', + '^' + ], + + symbols: /[@$=>](?!@symbols)/, 'delimiter'], + [ + /@symbols/, + { + cases: { + '@operators': 'delimiter', + '@default': '' + } + } + ], + + // numbers + [ + /((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)/, + 'number' + ], + + // delimiter: after number because of .\d floats + [/[;,.]/, 'delimiter'], + + // strings + [/"([^"\\]|\\.)*$/, 'string.invalid'], + [/"/, 'string', '@string'] + ], + + whitespace: [ + [/[ \t\r\n]+/, ''], + [/\/\*/, 'comment', '@comment'], + [/\/\/.*$/, 'comment'] + ], + + comment: [ + [/[^\/*]+/, 'comment'], + [/\*\//, 'comment', '@pop'], + [/[\/*]/, 'comment'] + ], + + string: [ + [/[^\\"]+/, 'string'], + [/@escapes/, 'string.escape'], + [/\\./, 'string.escape.invalid'], + [/"/, 'string', '@pop'] + ] + } +}; diff --git a/src/monaco.contribution.ts b/src/monaco.contribution.ts index 18c90abd..17f4e0df 100644 --- a/src/monaco.contribution.ts +++ b/src/monaco.contribution.ts @@ -19,6 +19,7 @@ import './dart/dart.contribution'; import './dockerfile/dockerfile.contribution'; import './ecl/ecl.contribution'; import './elixir/elixir.contribution'; +import './flow9/flow9.contribution'; import './fsharp/fsharp.contribution'; import './go/go.contribution'; import './graphql/graphql.contribution';