Sfoglia il codice sorgente

Merge pull request #154 from valeriia-melnychuk/main

Implement syntax highlighting for Flow9
Alexandru Dima 3 anni fa
parent
commit
4848249f37
4 ha cambiato i file con 325 aggiunte e 0 eliminazioni
  1. 13 0
      src/flow9/flow9.contribution.ts
  2. 148 0
      src/flow9/flow9.test.ts
  3. 163 0
      src/flow9/flow9.ts
  4. 1 0
      src/monaco.contribution.ts

+ 13 - 0
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')
+});

+ 148 - 0
src/flow9/flow9.test.ts

@@ -0,0 +1,148 @@
+/*---------------------------------------------------------------------------------------------
+ *  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: 12, type: '' },
+				{ startIndex: 13, 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' }]
+		}
+	],
+
+	[
+		{
+			line: '"""',
+			tokens: [
+				{ startIndex: 0, type: 'string.flow' },
+				{ startIndex: 2, type: 'string.invalid.flow' }
+			]
+		}
+	]
+]);

+ 163 - 0
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 = <languages.IMonarchLanguage>{
+	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: /[@$=><!~?:&|+\-*\\\/\^%]+/,
+	escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
+
+	// The main tokenizer for our languages
+	tokenizer: {
+		root: [
+			// identifiers and keywords
+			[
+				/[a-zA-Z_]\w*/,
+				{
+					cases: {
+						'@keywords': 'keyword',
+						'@types': 'type',
+						'@default': 'identifier'
+					}
+				}
+			],
+
+			// whitespace
+			{ include: '@whitespace' },
+
+			// delimiters and operators
+			[/[{}()\[\]]/, 'delimiter'],
+			[/[<>](?!@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']
+		]
+	}
+};

+ 1 - 0
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';