diff --git a/scripts/bundle.js b/scripts/bundle.js index 1b8ae91f..6303c7aa 100644 --- a/scripts/bundle.js +++ b/scripts/bundle.js @@ -67,10 +67,11 @@ bundleOne('csp/csp'); bundleOne('scheme/scheme'); bundleOne('clojure/clojure'); bundleOne('shell/shell'); -bundleOne('perl/perl'), -bundleOne('powerquery/powerquery') -bundleOne('azcli/azcli') +bundleOne('perl/perl'); +bundleOne('powerquery/powerquery'); +bundleOne('azcli/azcli'); bundleOne('apex/apex'); +bundleOne('tcl/tcl'); bundleOne('graphql/graphql'); function bundleOne(moduleId, exclude) { diff --git a/src/monaco.contribution.ts b/src/monaco.contribution.ts index 702989c7..0192e10f 100644 --- a/src/monaco.contribution.ts +++ b/src/monaco.contribution.ts @@ -44,6 +44,7 @@ import './solidity/solidity.contribution'; import './sql/sql.contribution'; import './st/st.contribution'; import './swift/swift.contribution'; +import './tcl/tcl.contribution'; import './typescript/typescript.contribution'; import './vb/vb.contribution'; import './xml/xml.contribution'; diff --git a/src/tcl/tcl.contribution.ts b/src/tcl/tcl.contribution.ts new file mode 100644 index 00000000..ea3b992d --- /dev/null +++ b/src/tcl/tcl.contribution.ts @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import {registerLanguage} from '../_.contribution'; + +registerLanguage({ + id: 'tcl', + extensions: ['.tcl'], + aliases: ['tcl', 'Tcl', 'tcltk', 'TclTk', 'tcl/tk', 'Tcl/Tk'], + loader: () => import('./tcl') +}); diff --git a/src/tcl/tcl.test.ts b/src/tcl/tcl.test.ts new file mode 100644 index 00000000..6e85aaee --- /dev/null +++ b/src/tcl/tcl.test.ts @@ -0,0 +1,100 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import {testTokenization} from '../test/testRunner'; + +testTokenization('tcl', [ + // Definitions + [{ + line: 'set var 1', + tokens: [ + {startIndex: 0, type: 'keyword.flow.tcl'}, // `set` + {startIndex: 3, type: 'source.tcl'}, // ` ` + {startIndex: 4, type: 'type.tcl'}, // `var` + {startIndex: 7, type: 'white.tcl'}, // ` ` + {startIndex: 8, type: 'number.tcl'} // `1` + ] + }], + + [{ + line: 'proc func {a b} {}', + tokens: [ + {startIndex: 0, type: 'keyword.flow.tcl'}, // `proc` + {startIndex: 4, type: 'source.tcl'}, // ` ` + {startIndex: 5, type: 'type.tcl'}, // `func` + {startIndex: 9, type: 'white.tcl'}, // ` ` + {startIndex: 10, type: 'delimiter.curly.tcl'}, // `{` + {startIndex: 11, type: 'operator.scss.tcl'}, // `a` + {startIndex: 12, type: 'white.tcl'}, // ` ` + {startIndex: 13, type: 'operator.scss.tcl'}, // `b` + {startIndex: 14, type: 'delimiter.curly.tcl'}, // `}` + {startIndex: 15, type: 'white.tcl'}, // ` ` + {startIndex: 16, type: 'delimiter.curly.tcl'} // `{}` + ] + }], + + // Keywords + [{ + line: 'if 1 return', + tokens: [ + {startIndex: 0, type: 'keyword.tcl'}, + {startIndex: 2, type: 'white.tcl'}, + {startIndex: 3, type: 'number.tcl'}, + {startIndex: 4, type: 'white.tcl'}, + {startIndex: 5, type: 'keyword.tcl'} + ] + }], + + + // Variables + [{ + line: '$var1 $::var2 $$var3 ${var 4} $::{var 5}', + tokens: [ + {startIndex: 0, type: 'type.identifier.tcl'}, + {startIndex: 5, type: 'white.tcl'}, + {startIndex: 6, type: 'type.identifier.tcl'}, + {startIndex: 13, type: 'white.tcl'}, + {startIndex: 14, type: 'type.identifier.tcl'}, + {startIndex: 20, type: 'white.tcl'}, + {startIndex: 21, type: 'identifier.tcl'}, + {startIndex: 23, type: 'type.identifier.tcl'}, + {startIndex: 28, type: 'identifier.tcl'}, + {startIndex: 29, type: 'white.tcl'}, + {startIndex: 30, type: 'identifier.tcl'}, + {startIndex: 34, type: 'type.identifier.tcl'}, + {startIndex: 39, type: 'identifier.tcl'} + ] + }], + + // Function and variable string interpolation + [{ + line: 'puts "$var1 + ${var 2} = [expr $var1 + ${var 2}]"', + tokens: [ + {startIndex: 0, type: 'variable.tcl'}, + {startIndex: 4, type: 'white.tcl'}, + {startIndex: 5, type: 'string.quote.tcl'}, + {startIndex: 6, type: 'type.identifier.tcl'}, + {startIndex: 11, type: 'string.tcl'}, + {startIndex: 14, type: 'identifier.tcl'}, + {startIndex: 16, type: 'type.identifier.tcl'}, + {startIndex: 21, type: 'identifier.tcl'}, + {startIndex: 22, type: 'string.tcl'}, + {startIndex: 25, type: 'delimiter.square.tcl'}, + {startIndex: 26, type: 'keyword.tcl'}, + {startIndex: 30, type: 'white.tcl'}, + {startIndex: 31, type: 'type.identifier.tcl'}, + {startIndex: 36, type: 'white.tcl'}, + {startIndex: 37, type: 'operator.tcl'}, + {startIndex: 38, type: 'white.tcl'}, + {startIndex: 39, type: 'identifier.tcl'}, + {startIndex: 41, type: 'type.identifier.tcl'}, + {startIndex: 46, type: 'identifier.tcl'}, + {startIndex: 47, type: 'delimiter.square.tcl'}, + {startIndex: 48, type: 'string.quote.tcl'} + ] + }] +]); diff --git a/src/tcl/tcl.ts b/src/tcl/tcl.ts new file mode 100644 index 00000000..7fbf84df --- /dev/null +++ b/src/tcl/tcl.ts @@ -0,0 +1,159 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import IRichLanguageConfiguration = monaco.languages.LanguageConfiguration; +import ILanguage = monaco.languages.IMonarchLanguage; + +export const conf: IRichLanguageConfiguration = { + brackets: [ + ['{', '}'], + ['[', ']'], + ['(', ')'] + ], + autoClosingPairs: [ + {open: '{', close: '}'}, + {open: '[', close: ']'}, + {open: '(', close: ')'}, + {open: '"', close: '"'}, + {open: '\'', close: '\''}, + ], + surroundingPairs: [ + {open: '{', close: '}'}, + {open: '[', close: ']'}, + {open: '(', close: ')'}, + {open: '"', close: '"'}, + {open: '\'', close: '\''}, + ] +}; + +export const language = { + tokenPostfix: '.tcl', + + specialFunctions: [ + 'set', 'unset', 'rename', 'variable', 'proc', 'coroutine', + 'foreach', + 'incr', 'append', + 'lappend', 'linsert', 'lreplace' + ], + + mainFunctions: [ + 'if', 'then', 'elseif', 'else', 'case', 'switch', 'while', 'for', + 'break', 'continue', 'return', + 'package', 'namespace', + 'catch', 'exit', + 'eval', 'expr', 'uplevel', 'upvar' + ], + + builtinFunctions: [ + 'file', 'info', 'concat', 'join', 'lindex', + 'list', 'llength', 'lrange', 'lsearch', 'lsort', 'split', + 'array', 'parray', 'binary', 'format', 'regexp', 'regsub', 'scan', 'string', + 'subst', 'dict', 'cd', 'clock', 'exec', 'glob', 'pid', 'pwd', 'close', 'eof', 'fblocked', + 'fconfigure', 'fcopy', 'fileevent', 'flush', 'gets', 'open', 'puts', 'read', 'seek', + 'socket', 'tell', 'interp', 'after', 'auto_execok', + 'auto_load', 'auto_mkindex', 'auto_reset', 'bgerror', 'error', + 'global', 'history', 'load', 'source', 'time', 'trace', + 'unknown', 'unset', 'update', 'vwait', 'winfo', 'wm', 'bind', 'event', + 'pack', 'place', 'grid', 'font', 'bell', 'clipboard', 'destroy', 'focus', 'grab', 'lower', + 'option', 'raise', 'selection', 'send', 'tk', 'tkwait', 'tk_bisque', 'tk_focusNext', + 'tk_focusPrev', 'tk_focusFollowsMouse', 'tk_popup', 'tk_setPalette' + ], + + symbols: /[=>