mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-12 02:58:31 -05:00
* Initial port of release/0.24 source code * Fix additional headers * Fix a typo in launch.json
266 lines
7.1 KiB
TypeScript
266 lines
7.1 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
'use strict';
|
|
|
|
import { StandardTokenType } from 'vs/editor/common/modes';
|
|
|
|
/**
|
|
* Describes how comments for a language work.
|
|
*/
|
|
export interface CommentRule {
|
|
/**
|
|
* The line comment token, like `// this is a comment`
|
|
*/
|
|
lineComment?: string;
|
|
/**
|
|
* The block comment character pair, like `/* block comment */`
|
|
*/
|
|
blockComment?: CharacterPair;
|
|
}
|
|
|
|
/**
|
|
* The language configuration interface defines the contract between extensions and
|
|
* various editor features, like automatic bracket insertion, automatic indentation etc.
|
|
*/
|
|
export interface LanguageConfiguration {
|
|
/**
|
|
* The language's comment settings.
|
|
*/
|
|
comments?: CommentRule;
|
|
/**
|
|
* The language's brackets.
|
|
* This configuration implicitly affects pressing Enter around these brackets.
|
|
*/
|
|
brackets?: CharacterPair[];
|
|
/**
|
|
* The language's word definition.
|
|
* If the language supports Unicode identifiers (e.g. JavaScript), it is preferable
|
|
* to provide a word definition that uses exclusion of known separators.
|
|
* e.g.: A regex that matches anything except known separators (and dot is allowed to occur in a floating point number):
|
|
* /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g
|
|
*/
|
|
wordPattern?: RegExp;
|
|
/**
|
|
* The language's indentation settings.
|
|
*/
|
|
indentationRules?: IndentationRule;
|
|
/**
|
|
* The language's rules to be evaluated when pressing Enter.
|
|
*/
|
|
onEnterRules?: OnEnterRule[];
|
|
/**
|
|
* The language's auto closing pairs. The 'close' character is automatically inserted with the
|
|
* 'open' character is typed. If not set, the configured brackets will be used.
|
|
*/
|
|
autoClosingPairs?: IAutoClosingPairConditional[];
|
|
/**
|
|
* The language's surrounding pairs. When the 'open' character is typed on a selection, the
|
|
* selected string is surrounded by the open and close characters. If not set, the autoclosing pairs
|
|
* settings will be used.
|
|
*/
|
|
surroundingPairs?: IAutoClosingPair[];
|
|
|
|
/**
|
|
* The language's folding rules.
|
|
*/
|
|
folding?: FoldingRules;
|
|
|
|
/**
|
|
* **Deprecated** Do not use.
|
|
*
|
|
* @deprecated Will be replaced by a better API soon.
|
|
*/
|
|
__electricCharacterSupport?: IBracketElectricCharacterContribution;
|
|
}
|
|
|
|
/**
|
|
* Describes indentation rules for a language.
|
|
*/
|
|
export interface IndentationRule {
|
|
/**
|
|
* If a line matches this pattern, then all the lines after it should be unindendented once (until another rule matches).
|
|
*/
|
|
decreaseIndentPattern: RegExp;
|
|
/**
|
|
* If a line matches this pattern, then all the lines after it should be indented once (until another rule matches).
|
|
*/
|
|
increaseIndentPattern: RegExp;
|
|
/**
|
|
* If a line matches this pattern, then **only the next line** after it should be indented once.
|
|
*/
|
|
indentNextLinePattern?: RegExp;
|
|
/**
|
|
* If a line matches this pattern, then its indentation should not be changed and it should not be evaluated against the other rules.
|
|
*/
|
|
unIndentedLinePattern?: RegExp;
|
|
|
|
}
|
|
|
|
/**
|
|
* Describes language specific folding markers such as '#region' and '#endregion'.
|
|
* The start and end regexes will be tested against the contents of all lines and must be designed efficiently:
|
|
* - the regex should start with '^'
|
|
* - regexp flags (i, g) are ignored
|
|
*/
|
|
export interface FoldingMarkers {
|
|
start: RegExp;
|
|
end: RegExp;
|
|
}
|
|
|
|
/**
|
|
* Describes folding rules for a language.
|
|
*/
|
|
export interface FoldingRules {
|
|
/**
|
|
* Used by the indentation based strategy to decide wheter empty lines belong to the previous or the next block.
|
|
* A language adheres to the off-side rule if blocks in that language are expressed by their indentation.
|
|
* See [wikipedia](https://en.wikipedia.org/wiki/Off-side_rule) for more information.
|
|
* If not set, `false` is used and empty lines belong to the previous block.
|
|
*/
|
|
offSide?: boolean;
|
|
|
|
/**
|
|
* Region markers used by the language.
|
|
*/
|
|
markers?: FoldingMarkers;
|
|
}
|
|
|
|
/**
|
|
* Describes a rule to be evaluated when pressing Enter.
|
|
*/
|
|
export interface OnEnterRule {
|
|
/**
|
|
* This rule will only execute if the text before the cursor matches this regular expression.
|
|
*/
|
|
beforeText: RegExp;
|
|
/**
|
|
* This rule will only execute if the text after the cursor matches this regular expression.
|
|
*/
|
|
afterText?: RegExp;
|
|
/**
|
|
* The action to execute.
|
|
*/
|
|
action: EnterAction;
|
|
}
|
|
|
|
export interface IBracketElectricCharacterContribution {
|
|
docComment?: IDocComment;
|
|
}
|
|
|
|
/**
|
|
* Definition of documentation comments (e.g. Javadoc/JSdoc)
|
|
*/
|
|
export interface IDocComment {
|
|
/**
|
|
* The string that starts a doc comment (e.g. '/**')
|
|
*/
|
|
open: string;
|
|
/**
|
|
* The string that appears on the last line and closes the doc comment (e.g. ' * /').
|
|
*/
|
|
close: string;
|
|
}
|
|
|
|
/**
|
|
* A tuple of two characters, like a pair of
|
|
* opening and closing brackets.
|
|
*/
|
|
export type CharacterPair = [string, string];
|
|
|
|
export interface IAutoClosingPair {
|
|
open: string;
|
|
close: string;
|
|
}
|
|
|
|
export interface IAutoClosingPairConditional extends IAutoClosingPair {
|
|
notIn?: string[];
|
|
}
|
|
|
|
/**
|
|
* Describes what to do with the indentation when pressing Enter.
|
|
*/
|
|
export enum IndentAction {
|
|
/**
|
|
* Insert new line and copy the previous line's indentation.
|
|
*/
|
|
None = 0,
|
|
/**
|
|
* Insert new line and indent once (relative to the previous line's indentation).
|
|
*/
|
|
Indent = 1,
|
|
/**
|
|
* Insert two new lines:
|
|
* - the first one indented which will hold the cursor
|
|
* - the second one at the same indentation level
|
|
*/
|
|
IndentOutdent = 2,
|
|
/**
|
|
* Insert new line and outdent once (relative to the previous line's indentation).
|
|
*/
|
|
Outdent = 3
|
|
}
|
|
|
|
/**
|
|
* Describes what to do when pressing Enter.
|
|
*/
|
|
export interface EnterAction {
|
|
/**
|
|
* Describe what to do with the indentation.
|
|
*/
|
|
indentAction: IndentAction;
|
|
/**
|
|
* Describe whether to outdent current line.
|
|
*/
|
|
outdentCurrentLine?: boolean;
|
|
/**
|
|
* Describes text to be appended after the new line and after the indentation.
|
|
*/
|
|
appendText?: string;
|
|
/**
|
|
* Describes the number of characters to remove from the new line's indentation.
|
|
*/
|
|
removeText?: number;
|
|
}
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
export class StandardAutoClosingPairConditional {
|
|
_standardAutoClosingPairConditionalBrand: void;
|
|
|
|
readonly open: string;
|
|
readonly close: string;
|
|
private readonly _standardTokenMask: number;
|
|
|
|
constructor(source: IAutoClosingPairConditional) {
|
|
this.open = source.open;
|
|
this.close = source.close;
|
|
|
|
// initially allowed in all tokens
|
|
this._standardTokenMask = 0;
|
|
|
|
if (Array.isArray(source.notIn)) {
|
|
for (let i = 0, len = source.notIn.length; i < len; i++) {
|
|
let notIn = source.notIn[i];
|
|
switch (notIn) {
|
|
case 'string':
|
|
this._standardTokenMask |= StandardTokenType.String;
|
|
break;
|
|
case 'comment':
|
|
this._standardTokenMask |= StandardTokenType.Comment;
|
|
break;
|
|
case 'regex':
|
|
this._standardTokenMask |= StandardTokenType.RegEx;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public isOK(standardToken: StandardTokenType): boolean {
|
|
return (this._standardTokenMask & <number>standardToken) === 0;
|
|
}
|
|
}
|