'use strict' ; import { relative } from 'path' ; import * as vscode from 'vscode' ; import { vscMockHtmlContent } from './htmlContent' ; import { vscMockStrings } from './strings' ; import { vscUri } from './uri' ; import { generateUuid } from './uuid' ; export namespace vscMockExtHostedTypes { export interface IRelativePattern { base : string ; pattern : string ; pathToRelative ( from , to ) : string ; } const illegalArgument = ( msg = 'Illegal Argument' ) => new Error ( msg ) ; export class Disposable { static from ( ... disposables ) { return new Disposable ( function ( ) { if ( disposables ) { for ( let disposable of disposables ) { if ( disposable && typeof disposable . dispose === 'function' ) { disposable . dispose ( ) ; } } disposables = undefined ; } } ) ; } private _callOnDispose : Function ; constructor ( callOnDispose ) { this . _callOnDispose = callOnDispose ; } dispose ( ) { if ( typeof this . _callOnDispose === 'function' ) { this . _callOnDispose ( ) ; this . _callOnDispose = undefined ; } } } export class Position { static Min ( ... positions ) { let result = positions . pop ( ) ; for ( let p of positions ) { if ( p . isBefore ( result ) ) { result = p ; } } return result ; } static Max ( ... positions ) { let result = positions . pop ( ) ; for ( let p of positions ) { if ( p . isAfter ( result ) ) { result = p ; } } return result ; } static isPosition ( other ) { if ( ! other ) { return false ; } if ( other instanceof Position ) { return true ; } let { line , character } = < Position > other ; if ( typeof line === 'number' && typeof character === 'number' ) { return true ; } return false ; } private _line : number ; private _character : number ; get line ( ) : number { return this . _line ; } get character ( ) : number { return this . _character ; } constructor ( line , character ) { if ( line < 0 ) { throw illegalArgument ( 'line must be non-negative' ) ; } if ( character < 0 ) { throw illegalArgument ( 'character must be non-negative' ) ; } this . _line = line ; this . _character = character ; } isBefore ( other ) { if ( this . _line < other . _line ) { return true ; } if ( other . _line < this . _line ) { return false ; } return this . _character < other . _character ; } isBeforeOrEqual ( other ) { if ( this . _line < other . _line ) { return true ; } if ( other . _line < this . _line ) { return false ; } return this . _character <= other . _character ; } isAfter ( other ) { return ! this . isBeforeOrEqual ( other ) ; } isAfterOrEqual ( other ) { return ! this . isBefore ( other ) ; } isEqual ( other ) { return this . _line === other . _line && this . _character === other . _character ; } compareTo ( other ) { if ( this . _line < other . _line ) { return - 1 ; } else if ( this . _line > other . line ) { return 1 ; } else { if ( this . _character < other . _character ) { return - 1 ; } else if ( this . _character > other . _character ) { return 1 ; } else { return 0 ; } } } translate ( change ) ; translate ( lineDelta ? , characterDelta ? ) ; translate ( lineDeltaOrChange , characterDelta = 0 ) { if ( lineDeltaOrChange === null || characterDelta === null ) { throw illegalArgument ( ) ; } let lineDelta ; if ( typeof lineDeltaOrChange === 'undefined' ) { lineDelta = 0 ; } else if ( typeof lineDeltaOrChange === 'number' ) { lineDelta = lineDeltaOrChange ; } else { lineDelta = typeof lineDeltaOrChange . lineDelta === 'number' ? lineDeltaOrChange . lineDelta : 0 ; characterDelta = typeof lineDeltaOrChange . characterDelta === 'number' ? lineDeltaOrChange . characterDelta : 0 ; } if ( lineDelta === 0 && characterDelta === 0 ) { return this ; } return new Position ( this . line + lineDelta , this . character + characterDelta ) ; } with ( change ) ; with ( line ? , character ? ) ; with ( lineOrChange , character = this . character ) { if ( lineOrChange === null || character === null ) { throw illegalArgument ( ) ; } let line ; if ( typeof lineOrChange === 'undefined' ) { line = this . line ; } else if ( typeof lineOrChange === 'number' ) { line = lineOrChange ; } else { line = typeof lineOrChange . line === 'number' ? lineOrChange . line : this . line ; character = typeof lineOrChange . character === 'number' ? lineOrChange . character : this . character ; } if ( line === this . line && character === this . character ) { return this ; } return new Position ( line , character ) ; } toJSON ( ) { return { line : this . line , character : this . character } ; } } export class Range { static isRange ( thing ) { if ( thing instanceof Range ) { return true ; } if ( ! thing ) { return false ; } return Position . isPosition ( ( < Range > thing ) . start ) && Position . isPosition ( < Range > thing . end ) ; } protected _start : Position ; protected _end : Position ; get start ( ) : Position { return this . _start ; } get end ( ) : Position { return this . _end ; } constructor ( start , end ) ; constructor ( startLine , startColumn , endLine , endColumn ) ; constructor ( startLineOrStart , startColumnOrEnd , endLine ? , endColumn ? ) { let start ; let end ; if ( typeof startLineOrStart === 'number' && typeof startColumnOrEnd === 'number' && typeof endLine === 'number' && typeof endColumn === 'number' ) { start = new Position ( startLineOrStart , startColumnOrEnd ) ; end = new Position ( endLine , endColumn ) ; } else if ( startLineOrStart instanceof Position && startColumnOrEnd instanceof Position ) { start = startLineOrStart ; end = startColumnOrEnd ; } if ( ! start || ! end ) { throw new Error ( 'Invalid arguments' ) ; } if ( start . isBefore ( end ) ) { this . _start = start ; this . _end = end ; } else { this . _start = end ; this . _end = start ; } } contains ( positionOrRange ) { if ( positionOrRange instanceof Range ) { return this . contains ( positionOrRange . _start ) && this . contains ( positionOrRange . _end ) ; } else if ( positionOrRange instanceof Position ) { if ( positionOrRange . isBefore ( this . _start ) ) { return false ; } if ( this . _end . isBefore ( positionOrRange ) ) { return false ; } return true ; } return false ; } isEqual ( other ) { return this . _start . isEqual ( other . _start ) && this . _end . isEqual ( other . _end ) ; } intersection ( other ) { let start = Position . Max ( other . start , this . _start ) ; let end = Position . Min ( other . end , this . _end ) ; if ( start . isAfter ( end ) ) { return undefined ; } return new Range ( start , end ) ; } union ( other ) { if ( this . contains ( other ) ) { return this ; } else if ( other . contains ( this ) ) { return other ; } let start = Position . Min ( other . start , this . _start ) ; let end = Position . Max ( other . end , this . end ) ; return new Range ( start , end ) ; } get isEmpty ( ) : boolean { return this . _start . isEqual ( this . _end ) ; } get isSingleLine ( ) : boolean { return this . _start . line === this . _end . line ; } with ( change ) ; with ( start ? , end ? ) ; with ( startOrChange , end = this . end ) { if ( startOrChange === null || end === null ) { throw illegalArgument ( ) ; } let start ; if ( ! startOrChange ) { start = this . start ; } else if ( Position . isPosition ( startOrChange ) ) { start = startOrChange ; } else { start = startOrChange . start || this . start ; end = startOrChange . end || this . end ; } if ( start . isEqual ( this . _start ) && end . isEqual ( this . end ) ) { return this ; } return new Range ( start , end ) ; } toJSON ( ) { return [ this . start , this . end ] ; } } export class Selection extends Range { static isSelection ( thing ) { if ( thing instanceof Selection ) { return true ; } if ( ! thing ) { return false ; } return ( Range . isRange ( thing ) && Position . isPosition ( ( < Selection > thing ) . anchor ) && Position . isPosition ( ( < Selection > thing ) . active ) && typeof ( < Selection > thing ) . isReversed === 'boolean' ) ; } private _anchor : Position ; public get anchor ( ) : Position { return this . _anchor ; } private _active : Position ; public get active ( ) : Position { return this . _active ; } constructor ( anchor , active ) ; constructor ( anchorLine , anchorColumn , activeLine , activeColumn ) ; constructor ( anchorLineOrAnchor , anchorColumnOrActive , activeLine ? , activeColumn ? ) { let anchor ; let active ; if ( typeof anchorLineOrAnchor === 'number' && typeof anchorColumnOrActive === 'number' && typeof activeLine === 'number' && typeof activeColumn === 'number' ) { anchor = new Position ( anchorLineOrAnchor , anchorColumnOrActive ) ; active = new Position ( activeLine , activeColumn ) ; } else if ( anchorLineOrAnchor instanceof Position && anchorColumnOrActive instanceof Position ) { anchor = anchorLineOrAnchor ; active = anchorColumnOrActive ; } if ( ! anchor || ! active ) { throw new Error ( 'Invalid arguments' ) ; } super ( anchor , active ) ; this . _anchor = anchor ; this . _active = active ; } get isReversed ( ) : boolean { return this . _anchor === this . _end ; } toJSON ( ) { return { start : this . start , end : this . end , active : this . active , anchor : this . anchor } ; } } export enum EndOfLine { LF = 1 , CRLF = 2 } export class TextEdit { static isTextEdit ( thing ) { if ( thing instanceof TextEdit ) { return true ; } if ( ! thing ) { return false ; } return Range . isRange ( < TextEdit > thing ) && typeof ( < TextEdit > thing ) . newText === 'string' ; } static replace ( range , newText ) { return new TextEdit ( range , newText ) ; } static insert ( position , newText ) { return TextEdit . replace ( new Range ( position , position ) , newText ) ; } static delete ( range ) { return TextEdit . replace ( range , '' ) ; } static setEndOfLine ( eol ) { let ret = new TextEdit ( undefined , undefined ) ; ret . newEol = eol ; return ret ; } protected _range : Range ; protected _newText : string ; protected _newEol : EndOfLine ; get range ( ) : Range { return this . _range ; } set range ( value ) { if ( value && ! Range . isRange ( value ) ) { throw illegalArgument ( 'range' ) ; } this . _range = value ; } get newText ( ) : string { return this . _newText || '' ; } set newText ( value ) { if ( value && typeof value !== 'string' ) { throw illegalArgument ( 'newText' ) ; } this . _newText = value ; } get newEol ( ) : EndOfLine { return this . _newEol ; } set newEol ( value ) { if ( value && typeof value !== 'number' ) { throw illegalArgument ( 'newEol' ) ; } this . _newEol = value ; } constructor ( range , newText ) { this . range = range ; this . newText = newText ; } toJSON ( ) { return { range : this . range , newText : this . newText , newEol : this . _newEol } ; } } export class WorkspaceEdit implements vscode . WorkspaceEdit { private _seqPool : number = 0 ; private _resourceEdits : { seq : number ; from : vscUri . URI ; to : vscUri . URI ; } [ ] = [ ] ; private _textEdits = new Map < string , { seq : number ; uri : vscUri . URI ; edits : TextEdit [ ] ; } > ( ) ; createFile ( _uri , _options ? ) { throw new Error ( 'Method not implemented.' ) ; } deleteFile ( _uri , _options ? ) { throw new Error ( 'Method not implemented.' ) ; } renameFile ( _oldUri , _newUri , _options ? ) { throw new Error ( 'Method not implemented.' ) ; } replace ( uri , range , newText ) { let edit = new TextEdit ( range , newText ) ; let array = this . get ( uri ) ; if ( array ) { array . push ( edit ) ; } else { array = [ edit ] ; } this . set ( uri , array ) ; } insert ( resource , position , newText ) { this . replace ( resource , new Range ( position , position ) , newText ) ; } delete ( resource , range ) { this . replace ( resource , range , '' ) ; } has ( uri ) { return this . _textEdits . has ( uri . toString ( ) ) ; } set ( uri , edits ) { let data = this . _textEdits . get ( uri . toString ( ) ) ; if ( ! data ) { data = { seq : this . _seqPool ++ , uri , edits : [ ] } ; this . _textEdits . set ( uri . toString ( ) , data ) ; } if ( ! edits ) { data . edits = undefined ; } else { data . edits = edits . slice ( 0 ) ; } } get ( uri ) { if ( ! this . _textEdits . has ( uri . toString ( ) ) ) { return undefined ; } const { edits } = this . _textEdits . get ( uri . toString ( ) ) ; return edits ? edits . slice ( ) : undefined ; } entries ( ) { const res = [ ] ; this . _textEdits . forEach ( value => res . push ( [ value . uri , value . edits ] ) ) ; return res . slice ( ) ; } allEntries ( ) { return this . entries ( ) ; } get size ( ) : number { return this . _textEdits . size + this . _resourceEdits . length ; } toJSON ( ) { return this . entries ( ) ; } } export class SnippetString { static isSnippetString ( thing ) { if ( thing instanceof SnippetString ) { return true ; } if ( ! thing ) { return false ; } return typeof ( < SnippetString > thing ) . value === 'string' ; } private static _escape ( value ) { return value . replace ( /\$|}|\\/g , '\\$&' ) ; } private _tabstop : number = 1 ; value : string ; constructor ( value ? ) { this . value = value || '' ; } appendText ( string ) { this . value += SnippetString . _escape ( string ) ; return this ; } appendTabstop ( number = this . _tabstop ++ ) { this . value += '$' ; this . value += number ; return this ; } appendPlaceholder ( value , number = this . _tabstop ++ ) { if ( typeof value === 'function' ) { const nested = new SnippetString ( ) ; nested . _tabstop = this . _tabstop ; value ( nested ) ; this . _tabstop = nested . _tabstop ; value = nested . value ; } else { value = SnippetString . _escape ( value ) ; } this . value += '${' ; this . value += number ; this . value += ':' ; this . value += value ; this . value += '}' ; return this ; } appendChoice ( values , number = this . _tabstop ++ ) { const value = SnippetString . _escape ( values . toString ( ) ) ; this . value += '${' ; this . value += number ; this . value += '|' ; this . value += value ; this . value += '|}' ; return this ; } appendVariable ( name , defaultValue ? ) { if ( typeof defaultValue === 'function' ) { const nested = new SnippetString ( ) ; nested . _tabstop = this . _tabstop ; defaultValue ( nested ) ; this . _tabstop = nested . _tabstop ; defaultValue = nested . value ; } else if ( typeof defaultValue === 'string' ) { defaultValue = defaultValue . replace ( /\$|}/g , '\\$&' ) ; } this . value += '${' ; this . value += name ; if ( defaultValue ) { this . value += ':' ; this . value += defaultValue ; } this . value += '}' ; return this ; } } export enum DiagnosticTag { Unnecessary = 1 } export enum DiagnosticSeverity { Hint = 3 , Information = 2 , Warning = 1 , Error = 0 } export class Location { static isLocation ( thing ) { if ( thing instanceof Location ) { return true ; } if ( ! thing ) { return false ; } return Range . isRange ( ( < Location > thing ) . range ) && vscUri . URI . isUri ( ( < Location > thing ) . uri ) ; } uri : vscUri . URI ; range : Range ; constructor ( uri , rangeOrPosition ) { this . uri = uri ; if ( ! rangeOrPosition ) { } else if ( rangeOrPosition instanceof Range ) { this . range = rangeOrPosition ; } else if ( rangeOrPosition instanceof Position ) { this . range = new Range ( rangeOrPosition , rangeOrPosition ) ; } else { throw new Error ( 'Illegal argument' ) ; } } toJSON ( ) { return { uri : this . uri , range : this . range } ; } } export class DiagnosticRelatedInformation { static is ( thing ) { if ( ! thing ) { return false ; } return ( typeof ( < DiagnosticRelatedInformation > thing ) . message === 'string' && ( < DiagnosticRelatedInformation > thing ) . location && Range . isRange ( ( < DiagnosticRelatedInformation > thing ) . location . range ) && vscUri . URI . isUri ( ( < DiagnosticRelatedInformation > thing ) . location . uri ) ) ; } location : Location ; message : string ; constructor ( location , message ) { this . location = location ; this . message = message ; } } export class Diagnostic { range : Range ; message : string ; source : string ; code : string | number ; severity : DiagnosticSeverity ; relatedInformation : DiagnosticRelatedInformation [ ] ; customTags ? : DiagnosticTag [ ] ; constructor ( range , message , severity = DiagnosticSeverity . Error ) { this . range = range ; this . message = message ; this . severity = severity ; } toJSON ( ) { return { severity : DiagnosticSeverity [ this . severity ] , message : this . message , range : this . range , source : this . source , code : this . code } ; } } export class Hover { public contents : vscode . MarkdownString [ ] | vscode . MarkedString [ ] ; public range : Range ; constructor ( contents , range ? ) { if ( ! contents ) { throw new Error ( 'Illegal argument, contents must be defined' ) ; } if ( Array . isArray ( contents ) ) { this . contents = < vscode . MarkdownString [ ] | vscode . MarkedString [ ] > contents ; } else if ( vscMockHtmlContent . isMarkdownString ( contents ) ) { this . contents = [ contents ] ; } else { this . contents = [ contents ] ; } this . range = range ; } } export enum DocumentHighlightKind { Text = 0 , Read = 1 , Write = 2 } export class DocumentHighlight { range : Range ; kind : DocumentHighlightKind ; constructor ( range , kind = DocumentHighlightKind . Text ) { this . range = range ; this . kind = kind ; } toJSON ( ) { return { range : this . range , kind : DocumentHighlightKind [ this . kind ] } ; } } export enum SymbolKind { File = 0 , Module = 1 , Namespace = 2 , Package = 3 , Class = 4 , Method = 5 , Property = 6 , Field = 7 , Constructor = 8 , Enum = 9 , Interface = 10 , Function = 11 , Variable = 12 , Constant = 13 , String = 14 , Number = 15 , Boolean = 16 , Array = 17 , Object = 18 , Key = 19 , Null = 20 , EnumMember = 21 , Struct = 22 , Event = 23 , Operator = 24 , TypeParameter = 25 } export class SymbolInformation { name : string ; location : Location ; kind : SymbolKind ; containerName : string ; constructor ( name , kind , containerName , location ) ; constructor ( name , kind , range , uri ? , containerName ? ) ; constructor ( name , kind , rangeOrContainer , locationOrUri ? , containerName ? ) { this . name = name ; this . kind = kind ; this . containerName = containerName ; if ( typeof rangeOrContainer === 'string' ) { this . containerName = rangeOrContainer ; } if ( locationOrUri instanceof Location ) { this . location = locationOrUri ; } else if ( rangeOrContainer instanceof Range ) { this . location = new Location ( locationOrUri , rangeOrContainer ) ; } } toJSON ( ) { return { name : this . name , kind : SymbolKind [ this . kind ] , location : this . location , containerName : this . containerName } ; } } export class SymbolInformation2 extends SymbolInformation { definingRange : Range ; children : SymbolInformation2 [ ] ; constructor ( name , kind , containerName , location ) { super ( name , kind , containerName , location ) ; this . children = [ ] ; this . definingRange = location . range ; } } export enum CodeActionTrigger { Automatic = 1 , Manual = 2 } export class CodeAction { title : string ; command ? : vscode . Command ; edit ? : WorkspaceEdit ; dianostics ? : Diagnostic [ ] ; kind ? : CodeActionKind ; constructor ( title , kind ? ) { this . title = title ; this . kind = kind ; } } export class CodeActionKind { private static readonly sep = '.' ; public static readonly Empty = new CodeActionKind ( '' ) ; public static readonly QuickFix = CodeActionKind . Empty . append ( 'quickfix' ) ; public static readonly Refactor = CodeActionKind . Empty . append ( 'refactor' ) ; public static readonly RefactorExtract = CodeActionKind . Refactor . append ( 'extract' ) ; public static readonly RefactorInline = CodeActionKind . Refactor . append ( 'inline' ) ; public static readonly RefactorRewrite = CodeActionKind . Refactor . append ( 'rewrite' ) ; public static readonly Source = CodeActionKind . Empty . append ( 'source' ) ; public static readonly SourceOrganizeImports = CodeActionKind . Source . append ( 'organizeImports' ) ; constructor ( public readonly value ) { } public append ( parts ) { return new CodeActionKind ( this . value ? this . value + CodeActionKind . sep + parts : parts ) ; } public contains ( other ) { return ( this . value === other . value || vscMockStrings . startsWith ( other . value , this . value + CodeActionKind . sep ) ) ; } } export class CodeLens { range : Range ; command : vscode . Command ; constructor ( range , command ? ) { this . range = range ; this . command = command ; } get isResolved ( ) : boolean { return ! ! this . command ; } } export class MarkdownString { value : string ; isTrusted ? : boolean ; constructor ( value ? ) { this . value = value || '' ; } appendText ( value ) { this . value += value . replace ( /[\\`*_{}[\]()#+\-.!]/g , '\\$&' ) ; return this ; } appendMarkdown ( value ) { this . value += value ; return this ; } appendCodeblock ( code , language = '' ) { this . value += '\n```' ; this . value += language ; this . value += '\n' ; this . value += code ; this . value += '\n```\n' ; return this ; } } export class ParameterInformation { label : string ; documentation ? : string | MarkdownString ; constructor ( label , documentation ? ) { this . label = label ; this . documentation = documentation ; } } export class SignatureInformation { label : string ; documentation ? : string | MarkdownString ; parameters : ParameterInformation [ ] ; constructor ( label , documentation ? ) { this . label = label ; this . documentation = documentation ; this . parameters = [ ] ; } } export class SignatureHelp { signatures : SignatureInformation [ ] ; activeSignature : number ; activeParameter : number ; constructor ( ) { this . signatures = [ ] ; } } export enum CompletionTriggerKind { Invoke = 0 , TriggerCharacter = 1 , TriggerForIncompleteCompletions = 2 } export interface CompletionContext { triggerKind : CompletionTriggerKind ; triggerCharacter : string ; } export enum CompletionItemKind { Text = 0 , Method = 1 , Function = 2 , Constructor = 3 , Field = 4 , Variable = 5 , Class = 6 , Interface = 7 , Module = 8 , Property = 9 , Unit = 10 , Value = 11 , Enum = 12 , Keyword = 13 , Snippet = 14 , Color = 15 , File = 16 , Reference = 17 , Folder = 18 , EnumMember = 19 , Constant = 20 , Struct = 21 , Event = 22 , Operator = 23 , TypeParameter = 24 } export enum CompletionItemTag { Deprecated = 1 } export interface CompletionItemLabel { name : string ; signature ? : string ; qualifier ? : string ; type ? : string ; } export class CompletionItem { label : string ; label2 ? : CompletionItemLabel ; kind ? : CompletionItemKind ; tags ? : CompletionItemTag [ ] ; detail ? : string ; documentation ? : string | MarkdownString ; sortText ? : string ; filterText ? : string ; preselect ? : boolean ; insertText ? : string | SnippetString ; keepWhitespace ? : boolean ; range ? : Range ; commitCharacters ? : string [ ] ; textEdit ? : TextEdit ; additionalTextEdits ? : TextEdit [ ] ; command ? : vscode . Command ; constructor ( label , kind ? ) { this . label = label ; this . kind = kind ; } toJSON ( ) { return { label : this . label , label2 : this . label2 , kind : this . kind && CompletionItemKind [ this . kind ] , detail : this . detail , documentation : this . documentation , sortText : this . sortText , filterText : this . filterText , preselect : this . preselect , insertText : this . insertText , textEdit : this . textEdit } ; } } export class CompletionList { isIncomplete ? : boolean ; items : vscode . CompletionItem [ ] ; constructor ( items = [ ] , isIncomplete = false ) { this . items = items ; this . isIncomplete = isIncomplete ; } } export enum ViewColumn { Active = - 1 , Beside = - 2 , One = 1 , Two = 2 , Three = 3 , Four = 4 , Five = 5 , Six = 6 , Seven = 7 , Eight = 8 , Nine = 9 } export enum StatusBarAlignment { Left = 1 , Right = 2 } export enum TextEditorLineNumbersStyle { Off = 0 , On = 1 , Relative = 2 } export enum TextDocumentSaveReason { Manual = 1 , AfterDelay = 2 , FocusOut = 3 } export enum TextEditorRevealType { Default = 0 , InCenter = 1 , InCenterIfOutsideViewport = 2 , AtTop = 3 } export enum TextEditorSelectionChangeKind { Keyboard = 1 , Mouse = 2 , Command = 3 } /**
     * These values match very carefully the values of `TrackedRangeStickiness`
     */ export enum DecorationRangeBehavior { /**
         * TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges
         */ OpenOpen = 0 , /**
         * TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges
         */ ClosedClosed = 1 , /**
         * TrackedRangeStickiness.GrowsOnlyWhenTypingBefore
         */ OpenClosed = 2 , /**
         * TrackedRangeStickiness.GrowsOnlyWhenTypingAfter
         */ ClosedOpen = 3 } export namespace TextEditorSelectionChangeKind { export function fromValue ( s ) { switch ( s ) { case 'keyboard' : return TextEditorSelectionChangeKind . Keyboard ; case 'mouse' : return TextEditorSelectionChangeKind . Mouse ; case 'api' : return TextEditorSelectionChangeKind . Command ; } return undefined ; } } export class DocumentLink { range : Range ; target : vscUri . URI ; constructor ( range , target ) { if ( target && ! ( target instanceof vscUri . URI ) ) { throw illegalArgument ( 'target' ) ; } if ( ! Range . isRange ( range ) || range . isEmpty ) { throw illegalArgument ( 'range' ) ; } this . range = range ; this . target = target ; } } export class Color { readonly red : number ; readonly green : number ; readonly blue : number ; readonly alpha : number ; constructor ( red , green , blue , alpha ) { this . red = red ; this . green = green ; this . blue = blue ; this . alpha = alpha ; } } export type IColorFormat = string | { opaque : string ; transparent : string ; } ; export class ColorInformation { range : Range ; color : Color ; constructor ( range , color ) { if ( color && ! ( color instanceof Color ) ) { throw illegalArgument ( 'color' ) ; } if ( ! Range . isRange ( range ) || range . isEmpty ) { throw illegalArgument ( 'range' ) ; } this . range = range ; this . color = color ; } } export class ColorPresentation { label : string ; textEdit ? : TextEdit ; additionalTextEdits ? : TextEdit [ ] ; constructor ( label ) { if ( ! label || typeof label !== 'string' ) { throw illegalArgument ( 'label' ) ; } this . label = label ; } } export enum ColorFormat { RGB = 0 , HEX = 1 , HSL = 2 } export enum SourceControlInputBoxValidationType { Error = 0 , Warning = 1 , Information = 2 } export enum TaskRevealKind { Always = 1 , Silent = 2 , Never = 3 } export enum TaskPanelKind { Shared = 1 , Dedicated = 2 , New = 3 } export class TaskGroup implements vscode . TaskGroup { private _id : string ; public static Clean : TaskGroup = new TaskGroup ( 'clean' , 'Clean' ) ; public static Build : TaskGroup = new TaskGroup ( 'build' , 'Build' ) ; public static Rebuild : TaskGroup = new TaskGroup ( 'rebuild' , 'Rebuild' ) ; public static Test : TaskGroup = new TaskGroup ( 'test' , 'Test' ) ; public static from ( value ) { switch ( value ) { case 'clean' : return TaskGroup . Clean ; case 'build' : return TaskGroup . Build ; case 'rebuild' : return TaskGroup . Rebuild ; case 'test' : return TaskGroup . Test ; default : return undefined ; } } constructor ( id , _label ) { if ( typeof id !== 'string' ) { throw illegalArgument ( 'name' ) ; } if ( typeof _label !== 'string' ) { throw illegalArgument ( 'name' ) ; } this . _id = id ; } get id ( ) : string { return this . _id ; } } export class ProcessExecution implements vscode . ProcessExecution { private _process : string ; private _args : string [ ] ; private _options : vscode . ProcessExecutionOptions ; constructor ( process , options ? ) ; constructor ( process , args , options ? ) ; constructor ( process , varg1 ? , varg2 ? ) { if ( typeof process !== 'string' ) { throw illegalArgument ( 'process' ) ; } this . _process = process ; if ( varg1 !== void 0 ) { if ( Array . isArray ( varg1 ) ) { this . _args = varg1 ; this . _options = varg2 ; } else { this . _options = varg1 ; } } if ( this . _args === void 0 ) { this . _args = [ ] ; } } get process ( ) : string { return this . _process ; } set process ( value ) { if ( typeof value !== 'string' ) { throw illegalArgument ( 'process' ) ; } this . _process = value ; } get args ( ) : string [ ] { return this . _args ; } set args ( value ) { if ( ! Array . isArray ( value ) ) { value = [ ] ; } this . _args = value ; } get options ( ) : vscode . ProcessExecutionOptions { return this . _options ; } set options ( value ) { this . _options = value ; } public computeId ( ) { throw new Error ( 'Not supported' ) ; } } export class ShellExecution implements vscode . ShellExecution { private _commandLine : string ; private _command : string | vscode . ShellQuotedString ; private _args : ( string | vscode . ShellQuotedString ) [ ] ; private _options : vscode . ShellExecutionOptions ; constructor ( commandLine , options ? ) ; constructor ( command , args , options ? ) ; constructor ( arg0 , arg1 ? , arg2 ? ) { if ( Array . isArray ( arg1 ) ) { if ( ! arg0 ) { throw illegalArgument ( "command can't be undefined or null" ) ; } if ( typeof arg0 !== 'string' && typeof arg0 . value !== 'string' ) { throw illegalArgument ( 'command' ) ; } this . _command = arg0 ; this . _args = arg1 as ( string | vscode . ShellQuotedString ) [ ] ; this . _options = arg2 ; } else { if ( typeof arg0 !== 'string' ) { throw illegalArgument ( 'commandLine' ) ; } this . _commandLine = arg0 ; this . _options = arg1 ; } } get commandLine ( ) : string { return this . _commandLine ; } set commandLine ( value ) { if ( typeof value !== 'string' ) { throw illegalArgument ( 'commandLine' ) ; } this . _commandLine = value ; } get command ( ) : string | vscode . ShellQuotedString { return this . _command ; } set command ( value ) { if ( typeof value !== 'string' && typeof value . value !== 'string' ) { throw illegalArgument ( 'command' ) ; } this . _command = value ; } get args ( ) : ( string | vscode . ShellQuotedString ) [ ] { return this . _args ; } set args ( value ) { this . _args = value || [ ] ; } get options ( ) : vscode . ShellExecutionOptions { return this . _options ; } set options ( value ) { this . _options = value ; } public computeId ( ) { throw new Error ( 'Not spported' ) ; } } export enum ShellQuoting { Escape = 1 , Strong = 2 , Weak = 3 } export enum TaskScope { Global = 1 , Workspace = 2 } export class Task implements vscode . Task { private static ProcessType : string = 'process' ; private static ShellType : string = 'shell' ; private static EmptyType : string = '$empty' ; private __id : string | undefined ; private _definition ! : vscode . TaskDefinition ; private _scope : vscode . TaskScope . Global | vscode . TaskScope . Workspace | vscode . WorkspaceFolder | undefined ; private _name ! : string ; private _execution : ProcessExecution | ShellExecution | undefined ; private _problemMatchers : string [ ] ; private _hasDefinedMatchers : boolean ; private _isBackground : boolean ; private _source ! : string ; private _group : TaskGroup | undefined ; private _presentationOptions : vscode . TaskPresentationOptions ; private _runOptions : vscode . RunOptions ; constructor ( definition , name , source , execution ? , problemMatchers ? ) ; constructor ( definition , scope , name , source , execution ? , problemMatchers ? ) ; constructor ( definition , arg2 , arg3 , arg4 ? , arg5 ? , arg6 ? ) { this . definition = definition ; let problemMatchers ; if ( typeof arg2 === 'string' ) { this . name = arg2 ; this . source = arg3 ; this . execution = arg4 ; problemMatchers = arg5 ; } else if ( arg2 === TaskScope . Global || arg2 === TaskScope . Workspace ) { this . target = arg2 ; this . name = arg3 ; this . source = arg4 ; this . execution = arg5 ; problemMatchers = arg6 ; } else { this . target = arg2 ; this . name = arg3 ; this . source = arg4 ; this . execution = arg5 ; problemMatchers = arg6 ; } if ( typeof problemMatchers === 'string' ) { this . _problemMatchers = [ problemMatchers ] ; this . _hasDefinedMatchers = true ; } else if ( Array . isArray ( problemMatchers ) ) { this . _problemMatchers = problemMatchers ; this . _hasDefinedMatchers = true ; } else { this . _problemMatchers = [ ] ; this . _hasDefinedMatchers = false ; } this . _isBackground = false ; this . _presentationOptions = Object . create ( null ) ; this . _runOptions = Object . create ( null ) ; } get _id ( ) : string | undefined { return this . __id ; } set _id ( value ) { this . __id = value ; } private clear ( ) { if ( this . __id === undefined ) { return ; } this . __id = undefined ; this . _scope = undefined ; this . computeDefinitionBasedOnExecution ( ) ; } private computeDefinitionBasedOnExecution ( ) { if ( this . _execution instanceof ProcessExecution ) { this . _definition = { type : Task . ProcessType , id : this . _execution . computeId ( ) } ; } else if ( this . _execution instanceof ShellExecution ) { this . _definition = { type : Task . ShellType , id : this . _execution . computeId ( ) } ; } else { this . _definition = { type : Task . EmptyType , id : generateUuid ( ) } ; } } get definition ( ) : vscode . TaskDefinition { return this . _definition ; } set definition ( value ) { if ( value === undefined || value === null ) { throw illegalArgument ( "Kind can't be undefined or null" ) ; } this . clear ( ) ; this . _definition = value ; } get scope ( ) : vscode . TaskScope . Global | vscode . TaskScope . Workspace | vscode . WorkspaceFolder | undefined { return this . _scope ; } set target ( value ) { this . clear ( ) ; this . _scope = value ; } get name ( ) : string { return this . _name ; } set name ( value ) { if ( typeof value !== 'string' ) { throw illegalArgument ( 'name' ) ; } this . clear ( ) ; this . _name = value ; } get execution ( ) : ProcessExecution | ShellExecution | undefined { return this . _execution ; } set execution ( value ) { if ( value === null ) { value = undefined ; } this . clear ( ) ; this . _execution = value ; let type = this . _definition . type ; if ( Task . EmptyType === type || Task . ProcessType === type || Task . ShellType === type ) { this . computeDefinitionBasedOnExecution ( ) ; } } get problemMatchers ( ) : string [ ] { return this . _problemMatchers ; } set problemMatchers ( value ) { if ( ! Array . isArray ( value ) ) { this . clear ( ) ; this . _problemMatchers = [ ] ; this . _hasDefinedMatchers = false ; return ; } else { this . clear ( ) ; this . _problemMatchers = value ; this . _hasDefinedMatchers = true ; } } get hasDefinedMatchers ( ) : boolean { return this . _hasDefinedMatchers ; } get isBackground ( ) : boolean { return this . _isBackground ; } set isBackground ( value ) { if ( value !== true && value !== false ) { value = false ; } this . clear ( ) ; this . _isBackground = value ; } get source ( ) : string { return this . _source ; } set source ( value ) { if ( typeof value !== 'string' || value . length === 0 ) { throw illegalArgument ( 'source must be a string of length > 0' ) ; } this . clear ( ) ; this . _source = value ; } get group ( ) : TaskGroup | undefined { return this . _group ; } set group ( value ) { if ( value === null ) { value = undefined ; } this . clear ( ) ; this . _group = value ; } get presentationOptions ( ) : vscode . TaskPresentationOptions { return this . _presentationOptions ; } set presentationOptions ( value ) { if ( value === null || value === undefined ) { value = Object . create ( null ) ; } this . clear ( ) ; this . _presentationOptions = value ; } get runOptions ( ) : vscode . RunOptions { return this . _runOptions ; } set runOptions ( value ) { if ( value === null || value === undefined ) { value = Object . create ( null ) ; } this . clear ( ) ; this . _runOptions = value ; } } export enum ProgressLocation { SourceControl = 1 , Window = 10 , Notification = 15 } export class TreeItem { label ? : string ; resourceUri ? : vscUri . URI ; iconPath ? : string | vscUri . URI | { light : string | vscUri . URI ; dark : string | vscUri . URI ; } ; command ? : vscode . Command ; contextValue ? : string ; tooltip ? : string ; constructor ( label , collapsibleState ? ) ; constructor ( resourceUri , collapsibleState ? ) ; constructor ( arg1 , public collapsibleState = TreeItemCollapsibleState . None ) { if ( arg1 instanceof vscUri . URI ) { this . resourceUri = arg1 ; } else { this . label = arg1 ; } } } export enum TreeItemCollapsibleState { None = 0 , Collapsed = 1 , Expanded = 2 } export class ThemeIcon { static readonly File = new ThemeIcon ( 'file' ) ; static readonly Folder = new ThemeIcon ( 'folder' ) ; readonly id : string ; private constructor ( id ) { this . id = id ; } } export class ThemeColor { id : string ; constructor ( id ) { this . id = id ; } } export enum ConfigurationTarget { Global = 1 , Workspace = 2 , WorkspaceFolder = 3 } export class RelativePattern implements IRelativePattern { base : string ; pattern : string ; constructor ( base , pattern ) { if ( typeof base !== 'string' ) { if ( ! base || ! vscUri . URI . isUri ( base . uri ) ) { throw illegalArgument ( 'base' ) ; } } if ( typeof pattern !== 'string' ) { throw illegalArgument ( 'pattern' ) ; } this . base = typeof base === 'string' ? base : base . uri . fsPath ; this . pattern = pattern ; } public pathToRelative ( from , to ) { return relative ( from , to ) ; } } export class Breakpoint { readonly enabled : boolean ; readonly condition ? : string ; readonly hitCondition ? : string ; readonly logMessage ? : string ; protected constructor ( enabled ? , condition ? , hitCondition ? , logMessage ? ) { this . enabled = typeof enabled === 'boolean' ? enabled : true ; if ( typeof condition === 'string' ) { this . condition = condition ; } if ( typeof hitCondition === 'string' ) { this . hitCondition = hitCondition ; } if ( typeof logMessage === 'string' ) { this . logMessage = logMessage ; } } } export class SourceBreakpoint extends Breakpoint { readonly location : Location ; constructor ( location , enabled ? , condition ? , hitCondition ? , logMessage ? ) { super ( enabled , condition , hitCondition , logMessage ) ; if ( location === null ) { throw illegalArgument ( 'location' ) ; } this . location = location ; } } export class FunctionBreakpoint extends Breakpoint { readonly functionName : string ; constructor ( functionName , enabled ? , condition ? , hitCondition ? , logMessage ? ) { super ( enabled , condition , hitCondition , logMessage ) ; if ( ! functionName ) { throw illegalArgument ( 'functionName' ) ; } this . functionName = functionName ; } } export class DebugAdapterExecutable { readonly command : string ; readonly args : string [ ] ; constructor ( command , args ? ) { this . command = command ; this . args = args ; } } export class DebugAdapterServer { readonly port : number ; readonly host ? : string ; constructor ( port , host ? ) { this . port = port ; this . host = host ; } } export enum LogLevel { Trace = 1 , Debug = 2 , Info = 3 , Warning = 4 , Error = 5 , Critical = 6 , Off = 7 } export enum FileChangeType { Changed = 1 , Created = 2 , Deleted = 3 } export class FileSystemError extends Error { static FileExists ( messageOrUri ? ) { return new FileSystemError ( messageOrUri , 'EntryExists' , FileSystemError . FileExists ) ; } static FileNotFound ( messageOrUri ? ) { return new FileSystemError ( messageOrUri , 'EntryNotFound' , FileSystemError . FileNotFound ) ; } static FileNotADirectory ( messageOrUri ? ) { return new FileSystemError ( messageOrUri , 'EntryNotADirectory' , FileSystemError . FileNotADirectory ) ; } static FileIsADirectory ( messageOrUri ? ) { return new FileSystemError ( messageOrUri , 'EntryIsADirectory' , FileSystemError . FileIsADirectory ) ; } static NoPermissions ( messageOrUri ? ) { return new FileSystemError ( messageOrUri , 'NoPermissions' , FileSystemError . NoPermissions ) ; } static Unavailable ( messageOrUri ? ) { return new FileSystemError ( messageOrUri , 'Unavailable' , FileSystemError . Unavailable ) ; } constructor ( uriOrMessage ? , code ? , terminator ? ) { super ( vscUri . URI . isUri ( uriOrMessage ) ? uriOrMessage . toString ( true ) : uriOrMessage ) ; this . name = code ? `${ code } (FileSystemError)` : `FileSystemError` ; if ( typeof ( < any > Object ) . setPrototypeOf === 'function' ) { ( < any > Object ) . setPrototypeOf ( this , FileSystemError . prototype ) ; } if ( typeof Error . captureStackTrace === 'function' && typeof terminator === 'function' ) { Error . captureStackTrace ( this , terminator ) ; } } } export class FoldingRange { start : number ; end : number ; kind ? : FoldingRangeKind ; constructor ( start , end , kind ? ) { this . start = start ; this . end = end ; this . kind = kind ; } } export enum FoldingRangeKind { Comment = 1 , Imports = 2 , Region = 3 } export enum CommentThreadCollapsibleState { /**
         * Determines an item is collapsed
         */ Collapsed = 0 , /**
         * Determines an item is expanded
         */ Expanded = 1 } }