diff --git a/build/npm/update-all-grammars.js b/build/npm/update-all-grammars.js index 9f85530caf5..6d6ccc21982 100644 --- a/build/npm/update-all-grammars.js +++ b/build/npm/update-all-grammars.js @@ -18,7 +18,7 @@ function updateGrammar(location) { } const extensions = [ - // 'bat' Grammar no longer available + 'bat', 'clojure', 'coffeescript', 'cpp', diff --git a/extensions/bat/OSSREADME.json b/extensions/bat/OSSREADME.json index abfe7de67b6..58abee75f99 100644 --- a/extensions/bat/OSSREADME.json +++ b/extensions/bat/OSSREADME.json @@ -1,22 +1,7 @@ // ATTENTION - THIS DIRECTORY CONTAINS THIRD PARTY OPEN SOURCE MATERIALS: [{ - "name": "sublimehq/Packages", + "name": "mmims/language-batchfile", "version": "0.0.0", - "license": "TextMate Bundle License", - "repositoryURL": "https://github.com/sublimehq/Packages", - "licenseDetail": [ - "Copyright (c) Sublime Packages project authors", - "", - "If not otherwise specified (see below), files in this folder fall under the following license: ", - "", - "Permission to copy, use, modify, sell and distribute this", - "software is granted. This software is provided \"as is\" without", - "express or implied warranty, and with no claim as to its", - "suitability for any purpose.", - "", - "An exception is made for files in readable text which contain their own license information, ", - "or files where an accompanying file exists (in the same directory) with a \"-license\" suffix added ", - "to the base-name name of the original file, and an extension of txt, html, or similar. For example ", - "\"tidy\" is accompanied by \"tidy-license.txt\"." - ] + "license": "MIT", + "repositoryURL": "https://github.com/mmims/language-batchfile" }] diff --git a/extensions/bat/package.json b/extensions/bat/package.json index e015ef20396..8363d58ed04 100644 --- a/extensions/bat/package.json +++ b/extensions/bat/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "publisher": "vscode", "engines": { "vscode": "*" }, + "scripts": { + "update-grammar": "node ../../build/npm/update-grammar.js mmims/language-batchfile grammars/batchfile.cson ./syntaxes/batchfile.tmLanguage.json" + }, "contributes": { "languages": [{ "id": "bat", @@ -12,8 +15,8 @@ }], "grammars": [{ "language": "bat", - "scopeName": "source.dosbatch", - "path": "./syntaxes/Batch File.tmLanguage" + "scopeName": "source.batchfile", + "path": "./syntaxes/batchfile.tmLanguage.json" }] } } \ No newline at end of file diff --git a/extensions/bat/syntaxes/batchfile.tmLanguage.json b/extensions/bat/syntaxes/batchfile.tmLanguage.json new file mode 100644 index 00000000000..ce6870deea6 --- /dev/null +++ b/extensions/bat/syntaxes/batchfile.tmLanguage.json @@ -0,0 +1,693 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/mmims/language-batchfile/blob/master/grammars/batchfile.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/mmims/language-batchfile/commit/40b605c75db3967a24b7015f6d3a885360b84e28", + "scopeName": "source.batchfile", + "name": "Batch File", + "fileTypes": [ + "bat", + "cmd" + ], + "patterns": [ + { + "include": "#commands" + }, + { + "include": "#comments" + }, + { + "include": "#constants" + }, + { + "include": "#controls" + }, + { + "include": "#escaped_characters" + }, + { + "include": "#labels" + }, + { + "include": "#numbers" + }, + { + "include": "#operators" + }, + { + "include": "#parens" + }, + { + "include": "#strings" + }, + { + "include": "#variables" + } + ], + "repository": { + "commands": { + "patterns": [ + { + "match": "(?<=^|[\\s@])(?i:adprep|append|arp|assoc|at|atmadm|attrib|auditpol|autochk|autoconv|autofmt|bcdboot|bcdedit|bdehdcfg|bitsadmin|bootcfg|brea|cacls|cd|certreq|certutil|change|chcp|chdir|chglogon|chgport|chgusr|chkdsk|chkntfs|choice|cipher|clip|clscluadmin|cluster|cmd|cmdkey|cmstp|color|comp|compact|convert|copy|cprofile|cscript|csvde|date|dcdiag|dcgpofix|dcpromo|defra|del|dfscmd|dfsdiag|dfsrmig|diantz|dir|dirquota|diskcomp|diskcopy|diskpart|diskperf|diskraid|diskshadow|dispdiag|doin|dnscmd|doskey|driverquery|dsacls|dsadd|dsamain|dsdbutil|dsget|dsmgmt|dsmod|dsmove|dsquery|dsrm|edit|endlocal|eraseesentutl|eventcreate|eventquery|eventtriggers|evntcmd|expand|extract|fc|filescrn|find|findstr|finger|flattemp|fonde|forfiles|format|freedisk|fsutil|ftp|ftype|fveupdate|getmac|gettype|gpfixup|gpresult|gpupdate|graftabl|hashgen|hep|helpctr|hostname|icacls|iisreset|inuse|ipconfig|ipxroute|irftp|ismserv|jetpack|klist|ksetup|ktmutil|ktpass|label|ldifd|ldp|lodctr|logman|logoff|lpq|lpr|macfile|makecab|manage-bde|mapadmin|md|mkdir|mklink|mmc|mode|more|mount|mountvol|move|mqbup|mqsvc|mqtgsvc|msdt|msg|msiexec|msinfo32|mstsc|nbtstat|net computer|net group|net localgroup|net print|net session|net share|net start|net stop|net use|net user|net view|net|netcfg|netdiag|netdom|netsh|netstat|nfsadmin|nfsshare|nfsstat|nlb|nlbmgr|nltest|nslookup|ntackup|ntcmdprompt|ntdsutil|ntfrsutl|openfiles|pagefileconfig|path|pathping|pause|pbadmin|pentnt|perfmon|ping|pnpunatten|pnputil|popd|powercfg|powershell|powershell_ise|print|prncnfg|prndrvr|prnjobs|prnmngr|prnport|prnqctl|prompt|pubprn|pushd|pushprinterconnections|pwlauncher|qappsrv|qprocess|query|quser|qwinsta|rasdial|rcp|rd|rdpsign|regentc|recover|redircmp|redirusr|reg|regini|regsvr32|relog|ren|rename|rendom|repadmin|repair-bde|replace|reset session|rxec|risetup|rmdir|robocopy|route|rpcinfo|rpcping|rsh|runas|rundll32|rwinsta|sc|schtasks|scwcmd|secedit|serverceipoptin|servrmanagercmd|serverweroptin|setlocal|setspn|setx|sfc|shadow|shift|showmount|shutdown|sort|start|storrept|subst|sxstrace|ysocmgr|systeminfo|takeown|tapicfg|taskkill|tasklist|tcmsetup|telnet|tftp|time|timeout|title|tlntadmn|tpmvscmgr|tpmvscmgr|tacerpt|tracert|tree|tscon|tsdiscon|tsecimp|tskill|tsprof|type|typeperf|tzutil|uddiconfig|umount|unlodctr|ver|verifier|verif|vol|vssadmin|w32tm|waitfor|wbadmin|wdsutil|wecutil|wevtutil|where|whoami|winnt|winnt32|winpop|winrm|winrs|winsat|wlbs|mic|wscript|xcopy)(?=$|\\s)", + "name": "keyword.command.batchfile" + }, + { + "begin": "(?<=^|[\\s@])(?i:echo)(?=$|\\s|\\.)", + "beginCaptures": { + "0": { + "name": "keyword.command.batchfile" + } + }, + "end": "(?=$\\n|[&|><)])", + "patterns": [ + { + "include": "#escaped_characters" + }, + { + "include": "#variables" + }, + { + "include": "#numbers" + }, + { + "include": "#strings" + } + ] + }, + { + "include": "#command_set" + } + ] + }, + "command_set": { + "patterns": [ + { + "begin": "(?<=^|[\\s@])(?i:SET)(?=$|\\s)", + "beginCaptures": { + "0": { + "name": "keyword.command.batchfile" + } + }, + "end": "(?=$\\n|[&|><)])", + "patterns": [ + { + "include": "#command_set_inside" + } + ] + } + ] + }, + "command_set_inside": { + "patterns": [ + { + "include": "#escaped_characters" + }, + { + "include": "#variables" + }, + { + "include": "#numbers" + }, + { + "include": "#parens" + }, + { + "begin": "(\")\\s*([^ ][^=]*)(=)\"?", + "beginCaptures": { + "1": { + "name": "punctuation.definition.string.begin.batchfile" + }, + "2": { + "name": "variable.other.readwrite.batchfile" + }, + "3": { + "name": "keyword.operator.assignment.batchfile" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "string.quoted.double.batchfile" + } + }, + "patterns": [ + { + "include": "#variables" + }, + { + "include": "#numbers" + }, + { + "include": "#parens" + } + ] + }, + { + "include": "#strings" + }, + { + "begin": "([^ ][^=]*)(=)", + "beginCaptures": { + "1": { + "name": "variable.other.readwrite.batchfile" + }, + "2": { + "name": "keyword.operator.assignment.batchfile" + } + }, + "end": "(?=$\\n|[&|><)])", + "patterns": [ + { + "include": "#escaped_characters" + }, + { + "include": "#variables" + }, + { + "include": "#numbers" + }, + { + "include": "#parens" + }, + { + "include": "#strings" + } + ] + }, + { + "begin": "\\s+/[aA]\\s+", + "end": "(?=$\\n|[&|><)])", + "name": "meta.expression.set.batchfile", + "patterns": [ + { + "include": "#command_set_inside_arithmetic" + }, + { + "include": "#command_set_group" + }, + { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.batchfile" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.batchfile" + } + }, + "name": "string.quoted.double.batchfile", + "patterns": [ + { + "include": "#command_set_inside_arithmetic" + }, + { + "include": "#command_set_group" + }, + { + "include": "#variables" + } + ] + } + ] + }, + { + "begin": "\\s+/[pP]\\s+", + "end": "(?=$\\n|[&|><)])", + "patterns": [ + { + "begin": "([^ ][^=]*)(=)", + "beginCaptures": { + "1": { + "name": "variable.other.readwrite.batchfile" + }, + "2": { + "name": "keyword.operator.assignment.batchfile" + } + }, + "end": "(?=$\\n|[&|><)])", + "name": "meta.prompt.set.batchfile", + "patterns": [ + { + "include": "#strings" + } + ] + } + ] + } + ] + }, + "command_set_group": { + "patterns": [ + { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.section.group.begin.batchfile" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.section.group.end.batchfile" + } + }, + "patterns": [ + { + "include": "#command_set_inside_arithmetic" + } + ] + } + ] + }, + "command_set_inside_arithmetic": { + "patterns": [ + { + "include": "#command_set_operators" + }, + { + "include": "#numbers" + }, + { + "match": ",", + "name": "punctuation.separator.batchfile" + } + ] + }, + "command_set_operators": { + "patterns": [ + { + "match": "\\+\\=|\\-\\=|\\*\\=|/\\=|%%\\=|&\\=|\\|\\=|\\^\\=|<<\\=|>>\\=", + "name": "keyword.operator.assignment.augmented.batchfile" + }, + { + "match": "\\+|\\-|/|\\*|%%|\\||&|\\^|<<|>>|~", + "name": "keyword.operator.arithmetic.batchfile" + }, + { + "match": "!", + "name": "keyword.operator.logical.batchfile" + }, + { + "match": "=", + "name": "keyword.operator.assignment.batchfile" + } + ] + }, + "comments": { + "patterns": [ + { + "begin": "(?:^|(&))\\s*(?=((?::[+=,;: ])))", + "beginCaptures": { + "1": { + "name": "keyword.operator.conditional.batchfile" + } + }, + "end": "\\n", + "patterns": [ + { + "begin": "((?::[+=,;: ]))", + "beginCaptures": { + "1": { + "name": "punctuation.definition.comment.batchfile" + } + }, + "end": "(?=\\n)", + "name": "comment.line.colon.batchfile" + } + ] + }, + { + "begin": "(?<=^|[\\s@])(?i)(REM)(\\.)", + "beginCaptures": { + "1": { + "name": "keyword.command.rem.batchfile" + }, + "2": { + "name": "punctuation.separator.batchfile" + } + }, + "end": "(?=$\\n|[&|><)])", + "name": "comment.line.rem.batchfile" + }, + { + "begin": "(?<=^|[\\s@])(?i:rem)\\b", + "beginCaptures": { + "0": { + "name": "keyword.command.rem.batchfile" + } + }, + "end": "\\n", + "name": "comment.line.rem.batchfile", + "patterns": [ + { + "match": "[><|]", + "name": "invalid.illegal.unexpected-character.batchfile" + } + ] + } + ] + }, + "constants": { + "patterns": [ + { + "match": "\\b(?i:NUL)\\b", + "name": "constant.language.batchfile" + } + ] + }, + "controls": { + "patterns": [ + { + "match": "(?<=^|\\s)(?i)(?:goto|call|exit)(?=$|\\s)", + "name": "keyword.control.statement.batchfile" + }, + { + "match": "(?<=^|\\s)(?i)(if)\\s+(?:(not)\\s+)?(exist|defined|errorlevel|cmdextversion)(?=\\s)", + "captures": { + "1": { + "name": "keyword.control.conditional.batchfile" + }, + "2": { + "name": "keyword.operator.logical.batchfile" + }, + "3": { + "name": "keyword.other.special-method.batchfile" + } + } + }, + { + "match": "(?<=^|\\s)(?i)(?:if|else)(?=$|\\s)", + "name": "keyword.control.conditional.batchfile" + }, + { + "match": "(?<=^|\\s)(?i)for(?=\\s)", + "name": "keyword.control.repeat.batchfile" + } + ] + }, + "escaped_characters": { + "patterns": [ + { + "match": "%%|\\^\\^!|\\^.|\\^\\n", + "name": "constant.character.escape.batchfile" + } + ] + }, + "labels": { + "patterns": [ + { + "match": "^\\s*(:)([^+=,;:\\s].*)$", + "captures": { + "1": { + "name": "punctuation.separator.batchfile" + }, + "2": { + "name": "keyword.other.special-method.batchfile" + } + } + } + ] + }, + "numbers": { + "patterns": [ + { + "match": "(?<=^|\\s|=)(0[xX][0-9A-Fa-f]*|[+-]?\\d+)(?=$|\\s|<|>)", + "name": "constant.numeric.batchfile" + } + ] + }, + "operators": { + "patterns": [ + { + "match": "@(?=\\S)", + "name": "keyword.operator.at.batchfile" + }, + { + "match": "(?<=\\s)(?i:EQU|NEQ|LSS|LEQ|GTR|GEQ)(?=\\s)|==", + "name": "keyword.operator.comparison.batchfile" + }, + { + "match": "(?<=\\s)(?i)(NOT)(?=\\s)", + "name": "keyword.operator.logical.batchfile" + }, + { + "match": "&&?|\\|\\|", + "name": "keyword.operator.conditional.batchfile" + }, + { + "match": "\\|", + "name": "keyword.operator.pipe.batchfile" + }, + { + "match": "<&?|>[&>]?", + "name": "keyword.operator.redirection.batchfile" + } + ] + }, + "parens": { + "patterns": [ + { + "begin": "\\(", + "beginCaptures": { + "0": "punctuation.section.group.begin.batchfile" + }, + "end": "\\)", + "endCaptures": { + "0": "punctuation.section.group.end.batchfile" + }, + "name": "meta.group.batchfile", + "patterns": [ + { + "match": ",|;", + "name": "punctuation.separator.batchfile" + }, + { + "include": "$self" + } + ] + } + ] + }, + "strings": { + "patterns": [ + { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.batchfile" + } + }, + "end": "(\")|(\\n)", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.batchfile" + }, + "2": { + "name": "invalid.illegal.newline.batchfile" + } + }, + "name": "string.quoted.double.batchfile", + "patterns": [ + { + "include": "#variables" + } + ] + } + ] + }, + "variables": { + "patterns": [ + { + "match": "(%)((~([fdpnxsatz]|\\$PATH:)*)?\\d|\\*)", + "captures": { + "1": { + "name": "punctuation.definition.variable.batchfile" + } + }, + "name": "variable.parameter.batchfile" + }, + { + "include": "#variable" + }, + { + "include": "#variable_delayed_expansion" + } + ] + }, + "variable": { + "patterns": [ + { + "begin": "%(?=[^%]+%)", + "beginCaptures": { + "0": { + "name": "punctuation.definition.variable.begin.batchfile" + } + }, + "end": "(%)|\\n", + "endCaptures": { + "1": { + "name": "punctuation.definition.variable.end.batchfile" + } + }, + "name": "variable.other.readwrite.batchfile", + "patterns": [ + { + "begin": ":~", + "beginCaptures": { + "0": { + "name": "punctuation.separator.batchfile" + } + }, + "end": "(?=%|\\n)", + "name": "meta.variable.substring.batchfile", + "patterns": [ + { + "include": "#variable_substring" + } + ] + }, + { + "begin": ":", + "beginCaptures": { + "0": { + "name": "punctuation.separator.batchfile" + } + }, + "end": "(?=%|\\n)", + "name": "meta.variable.substitution.batchfile", + "patterns": [ + { + "include": "#variable_replace" + }, + { + "begin": "=", + "beginCaptures": { + "0": { + "name": "punctuation.separator.batchfile" + } + }, + "end": "(?=%|\\n)", + "patterns": [ + { + "include": "#variable_delayed_expansion" + }, + { + "match": "[^%]+", + "name": "string.unquoted.batchfile" + } + ] + } + ] + } + ] + } + ] + }, + "variable_delayed_expansion": { + "patterns": [ + { + "begin": "!(?=[^!]+!)", + "beginCaptures": { + "0": { + "name": "punctuation.definition.variable.begin.batchfile" + } + }, + "end": "(!)|\\n", + "endCaptures": { + "1": { + "name": "punctuation.definition.variable.end.batchfile" + } + }, + "name": "variable.other.readwrite.batchfile", + "patterns": [ + { + "begin": ":~", + "beginCaptures": { + "0": { + "name": "punctuation.separator.batchfile" + } + }, + "end": "(?=!|\\n)", + "name": "meta.variable.substring.batchfile", + "patterns": [ + { + "include": "#variable_substring" + } + ] + }, + { + "begin": ":", + "beginCaptures": { + "0": { + "name": "punctuation.separator.batchfile" + } + }, + "end": "(?=!|\\n)", + "name": "meta.variable.substitution.batchfile", + "patterns": [ + { + "include": "#escaped_characters" + }, + { + "include": "#variable_replace" + }, + { + "include": "#variable" + }, + { + "begin": "=", + "beginCaptures": { + "0": { + "name": "punctuation.separator.batchfile" + } + }, + "end": "(?=!|\\n)", + "patterns": [ + { + "include": "#variable" + }, + { + "match": "[^!]+", + "name": "string.unquoted.batchfile" + } + ] + } + ] + } + ] + } + ] + }, + "variable_replace": { + "patterns": [ + { + "match": "[^=%!\\n]+", + "name": "string.unquoted.batchfile" + } + ] + }, + "variable_substring": { + "patterns": [ + { + "match": "([+-]?\\d+)(?:(,)([+-]?\\d+))?", + "captures": { + "1": { + "name": "constant.numeric.batchfile" + }, + "2": { + "name": "punctuation.separator.batchfile" + }, + "3": { + "name": "constant.numeric.batchfile" + } + } + } + ] + } + } +} \ No newline at end of file diff --git a/extensions/bat/test/colorize-results/test_bat.json b/extensions/bat/test/colorize-results/test_bat.json index d0f381fc7f3..48d1a37299e 100644 --- a/extensions/bat/test/colorize-results/test_bat.json +++ b/extensions/bat/test/colorize-results/test_bat.json @@ -1,18 +1,18 @@ [ { "c": "@", - "t": "source.dosbatch", + "t": "source.batchfile keyword.operator.at.batchfile", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" } }, { "c": "echo", - "t": "source.dosbatch keyword.command.dosbatch", + "t": "source.batchfile keyword.command.batchfile", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -23,7 +23,7 @@ }, { "c": " off", - "t": "source.dosbatch", + "t": "source.batchfile", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -34,7 +34,7 @@ }, { "c": "setlocal", - "t": "source.dosbatch keyword.command.dosbatch", + "t": "source.batchfile keyword.command.batchfile", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -45,7 +45,7 @@ }, { "c": "title", - "t": "source.dosbatch keyword.command.dosbatch", + "t": "source.batchfile keyword.command.batchfile", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -56,7 +56,7 @@ }, { "c": " VSCode Dev", - "t": "source.dosbatch", + "t": "source.batchfile", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -67,7 +67,7 @@ }, { "c": "pushd", - "t": "source.dosbatch keyword.command.dosbatch", + "t": "source.batchfile keyword.command.batchfile", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -78,7 +78,7 @@ }, { "c": " ", - "t": "source.dosbatch", + "t": "source.batchfile", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -89,7 +89,7 @@ }, { "c": "%", - "t": "source.dosbatch variable.parameter.function.dosbatch variable.parameter.function.begin.shell", + "t": "source.batchfile variable.parameter.batchfile punctuation.definition.variable.batchfile", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -100,7 +100,7 @@ }, { "c": "~dp0", - "t": "source.dosbatch variable.parameter.function.dosbatch", + "t": "source.batchfile variable.parameter.batchfile", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -111,7 +111,7 @@ }, { "c": "\\..", - "t": "source.dosbatch", + "t": "source.batchfile", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -121,8 +121,8 @@ } }, { - "c": ":: Node modules", - "t": "source.dosbatch comment.line.colons.dosbatch", + "c": "::", + "t": "source.batchfile comment.line.colon.batchfile punctuation.definition.comment.batchfile", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -132,8 +132,19 @@ } }, { - "c": "if not exist", - "t": "source.dosbatch keyword.control.conditional.if.dosbatch", + "c": " Node modules", + "t": "source.batchfile comment.line.colon.batchfile", + "r": { + "dark_plus": "comment: #608B4E", + "light_plus": "comment: #008000", + "dark_vs": "comment: #608B4E", + "light_vs": "comment: #008000", + "hc_black": "comment: #7CA668" + } + }, + { + "c": "if", + "t": "source.batchfile keyword.control.conditional.batchfile", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -142,9 +153,53 @@ "hc_black": "keyword.control: #C586C0" } }, + { + "c": " ", + "t": "source.batchfile", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "not", + "t": "source.batchfile keyword.operator.logical.batchfile", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.batchfile", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "exist", + "t": "source.batchfile keyword.other.special-method.batchfile", + "r": { + "dark_plus": "keyword: #569CD6", + "light_plus": "keyword: #0000FF", + "dark_vs": "keyword: #569CD6", + "light_vs": "keyword: #0000FF", + "hc_black": "keyword: #569CD6" + } + }, { "c": " node_modules ", - "t": "source.dosbatch", + "t": "source.batchfile", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -155,7 +210,7 @@ }, { "c": "call", - "t": "source.dosbatch keyword.control.statement.dosbatch", + "t": "source.batchfile keyword.control.statement.batchfile", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -166,7 +221,7 @@ }, { "c": " .\\scripts\\npm.bat install", - "t": "source.dosbatch", + "t": "source.batchfile", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -176,8 +231,19 @@ } }, { - "c": ":: Get electron", - "t": "source.dosbatch comment.line.colons.dosbatch", + "c": "::", + "t": "source.batchfile comment.line.colon.batchfile punctuation.definition.comment.batchfile", + "r": { + "dark_plus": "comment: #608B4E", + "light_plus": "comment: #008000", + "dark_vs": "comment: #608B4E", + "light_vs": "comment: #008000", + "hc_black": "comment: #7CA668" + } + }, + { + "c": " Get electron", + "t": "source.batchfile comment.line.colon.batchfile", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -188,7 +254,7 @@ }, { "c": "node .\\node_modules\\gulp\\bin\\gulp.js electron", - "t": "source.dosbatch", + "t": "source.batchfile", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -198,8 +264,8 @@ } }, { - "c": ":: Build", - "t": "source.dosbatch comment.line.colons.dosbatch", + "c": "::", + "t": "source.batchfile comment.line.colon.batchfile punctuation.definition.comment.batchfile", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -209,8 +275,19 @@ } }, { - "c": "if not exist", - "t": "source.dosbatch keyword.control.conditional.if.dosbatch", + "c": " Build", + "t": "source.batchfile comment.line.colon.batchfile", + "r": { + "dark_plus": "comment: #608B4E", + "light_plus": "comment: #008000", + "dark_vs": "comment: #608B4E", + "light_vs": "comment: #008000", + "hc_black": "comment: #7CA668" + } + }, + { + "c": "if", + "t": "source.batchfile keyword.control.conditional.batchfile", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -220,8 +297,8 @@ } }, { - "c": " out node .\\node_modules\\gulp\\bin\\gulp.js compile", - "t": "source.dosbatch", + "c": " ", + "t": "source.batchfile", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -231,8 +308,63 @@ } }, { - "c": ":: Configuration", - "t": "source.dosbatch comment.line.colons.dosbatch", + "c": "not", + "t": "source.batchfile keyword.operator.logical.batchfile", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.batchfile", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "exist", + "t": "source.batchfile keyword.other.special-method.batchfile", + "r": { + "dark_plus": "keyword: #569CD6", + "light_plus": "keyword: #0000FF", + "dark_vs": "keyword: #569CD6", + "light_vs": "keyword: #0000FF", + "hc_black": "keyword: #569CD6" + } + }, + { + "c": " out node .\\node_modules\\gulp\\bin\\gulp.js compile", + "t": "source.batchfile", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "::", + "t": "source.batchfile comment.line.colon.batchfile punctuation.definition.comment.batchfile", + "r": { + "dark_plus": "comment: #608B4E", + "light_plus": "comment: #008000", + "dark_vs": "comment: #608B4E", + "light_vs": "comment: #008000", + "hc_black": "comment: #7CA668" + } + }, + { + "c": " Configuration", + "t": "source.batchfile comment.line.colon.batchfile", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -243,7 +375,7 @@ }, { "c": "set", - "t": "source.dosbatch keyword.command.dosbatch", + "t": "source.batchfile keyword.command.batchfile", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -253,8 +385,41 @@ } }, { - "c": " NODE_ENV=development", - "t": "source.dosbatch", + "c": " ", + "t": "source.batchfile", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "NODE_ENV", + "t": "source.batchfile variable.other.readwrite.batchfile", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": "=", + "t": "source.batchfile keyword.operator.assignment.batchfile", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "development", + "t": "source.batchfile", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -265,7 +430,7 @@ }, { "c": "call", - "t": "source.dosbatch keyword.control.statement.dosbatch", + "t": "source.batchfile keyword.control.statement.batchfile", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -276,7 +441,7 @@ }, { "c": " ", - "t": "source.dosbatch", + "t": "source.batchfile", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -287,7 +452,7 @@ }, { "c": "echo", - "t": "source.dosbatch keyword.command.dosbatch", + "t": "source.batchfile keyword.command.batchfile", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -298,7 +463,7 @@ }, { "c": " ", - "t": "source.dosbatch", + "t": "source.batchfile", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -308,19 +473,41 @@ } }, { - "c": "%%LINE:rem +=%%", - "t": "source.dosbatch variable.other.parsetime.dosbatch", + "c": "%%", + "t": "source.batchfile constant.character.escape.batchfile", "r": { - "dark_plus": "variable: #9CDCFE", - "light_plus": "variable: #001080", + "dark_plus": "constant.character.escape: #D7BA7D", + "light_plus": "constant.character.escape: #A31515", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "variable: #9CDCFE" + "hc_black": "constant.character: #569CD6" + } + }, + { + "c": "LINE:rem +=", + "t": "source.batchfile", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "%%", + "t": "source.batchfile constant.character.escape.batchfile", + "r": { + "dark_plus": "constant.character.escape: #D7BA7D", + "light_plus": "constant.character.escape: #A31515", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "constant.character: #569CD6" } }, { "c": "popd", - "t": "source.dosbatch keyword.command.dosbatch", + "t": "source.batchfile keyword.command.batchfile", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -331,7 +518,7 @@ }, { "c": "endlocal", - "t": "source.dosbatch keyword.command.dosbatch", + "t": "source.batchfile keyword.command.batchfile", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", diff --git a/extensions/css/package.json b/extensions/css/package.json index 559fdce9874..b0b9576bcc2 100644 --- a/extensions/css/package.json +++ b/extensions/css/package.json @@ -44,12 +44,6 @@ "path": "./syntaxes/css.tmLanguage.json" } ], - "snippets": [ - { - "language": "css", - "path": "./snippets/css.json" - } - ], "configuration": [ { "order": 22, diff --git a/extensions/css/server/src/cssServerMain.ts b/extensions/css/server/src/cssServerMain.ts index adb077bca1e..6609e5c54d0 100644 --- a/extensions/css/server/src/cssServerMain.ts +++ b/extensions/css/server/src/cssServerMain.ts @@ -165,13 +165,13 @@ function validateTextDocument(textDocument: TextDocument): void { connection.onCompletion(textDocumentPosition => { let document = documents.get(textDocumentPosition.textDocument.uri); let stylesheet = stylesheets.get(document); - return getLanguageService(document).doComplete(document, textDocumentPosition.position, stylesheet); + return getLanguageService(document).doComplete(document, textDocumentPosition.position, stylesheet)!; /* TODO: remove ! once LS has null annotations */ }); connection.onHover(textDocumentPosition => { let document = documents.get(textDocumentPosition.textDocument.uri); let styleSheet = stylesheets.get(document); - return getLanguageService(document).doHover(document, textDocumentPosition.position, styleSheet); + return getLanguageService(document).doHover(document, textDocumentPosition.position, styleSheet)!; /* TODO: remove ! once LS has null annotations */ }); connection.onDocumentSymbol(documentSymbolParams => { diff --git a/extensions/css/snippets/css.json b/extensions/css/snippets/css.json deleted file mode 100644 index c99e47b1d7e..00000000000 --- a/extensions/css/snippets/css.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "transition property": { - "prefix": "transition", - "body": [ - "-webkit-transition: ${1:property} ${2:duration} ${3:timing-function} ${4:delay};", - "-moz-transition: ${1:property} ${2:duration} ${3:timing-function} ${4:delay};", - "transition: ${1:property} ${2:duration} ${3:timing-function} ${4:delay};" - ], - "description": "The transition property across browsers" - }, - "border": { - "prefix": "border", - "body": [ - "border: ${1:width} ${2:border-style} ${3:color};$0" - ], - "description": "[width] [border-style] [color]" - }, - "gradient": { - "prefix": "gradient", - "body": [ - "background-image: -webkit-gradient(linear, left top, left bottom, from(${1:start-color}), to(${2:end-color}));", - "background-image: -webkit-linear-gradient(top, ${1:start-color}, ${2:end-color});", - "background-image: -moz-linear-gradient(top, ${1:start-color}, ${2:end-color});", - "background-image: linear-gradient(to bottom, ${1:start-color}, ${2:end-color});" - ], - "description": "Set the 'background-image' property to a linear gradient" - } -} - diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 0a9eea1b077..8abc9db9ddc 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -13,9 +13,9 @@ fi cd $ROOT # Integration Tests -./scripts/code.sh $ROOT/extensions/vscode-api-tests/testWorkspace --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out --disableExtensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started +#./scripts/code.sh $ROOT/extensions/vscode-api-tests/testWorkspace --extensionDevelopmentPath=$ROOT/extensions/vscode-api-tests --extensionTestsPath=$ROOT/extensions/vscode-api-tests/out --disableExtensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started ./scripts/code.sh $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started -./scripts/test-int-mocha.sh -./scripts/code.sh $ROOT/extensions/emmet/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disableExtensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started +#./scripts/test-int-mocha.sh +#./scripts/code.sh $ROOT/extensions/emmet/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disableExtensions --user-data-dir=$VSCODEUSERDATADIR --skip-getting-started rm -r $VSCODEUSERDATADIR diff --git a/src/vs/base/common/errorMessage.ts b/src/vs/base/common/errorMessage.ts index 80276f1de01..3e0faf812d8 100644 --- a/src/vs/base/common/errorMessage.ts +++ b/src/vs/base/common/errorMessage.ts @@ -5,157 +5,8 @@ 'use strict'; import nls = require('vs/nls'); -import objects = require('vs/base/common/objects'); import types = require('vs/base/common/types'); import arrays = require('vs/base/common/arrays'); -import strings = require('vs/base/common/strings'); -import { isUndefinedOrNull } from 'vs/base/common/types'; - -export interface IXHRResponse { - responseText: string; - status: number; - - readyState: number; - getResponseHeader: (header: string) => string; -} - -export interface IConnectionErrorData { - status: number; - statusText?: string; - responseText?: string; -} - -/** - * The base class for all connection errors originating from XHR requests. - */ -export class ConnectionError implements Error { - public status: number; - public statusText: string; - public responseText: string; - public errorMessage: string; - public errorCode: string; - public errorObject: any; - public name: string; - - constructor(mixin: IConnectionErrorData); - constructor(request: IXHRResponse); - constructor(arg: any) { - this.status = arg.status; - this.statusText = arg.statusText; - this.name = 'ConnectionError'; - - try { - this.responseText = arg.responseText; - } catch (e) { - this.responseText = ''; - } - - this.errorMessage = null; - this.errorCode = null; - this.errorObject = null; - - if (this.responseText) { - try { - let errorObj = JSON.parse(this.responseText); - this.errorMessage = errorObj.message; - this.errorCode = errorObj.code; - this.errorObject = errorObj; - } catch (error) { - // Ignore - } - } - } - - public get message(): string { - return this.connectionErrorToMessage(this, false); - } - - public get verboseMessage(): string { - return this.connectionErrorToMessage(this, true); - } - - private connectionErrorDetailsToMessage(error: ConnectionError, verbose: boolean): string { - let errorCode = error.errorCode; - let errorMessage = error.errorMessage; - - if (!isUndefinedOrNull(errorCode) && typeof errorMessage === 'string') { - return nls.localize( - { - key: 'message', - comment: [ - '{0} represents the error message', - '{1} represents the error code' - ] - }, - "{0}. Error code: {1}", - strings.rtrim(errorMessage, '.'), errorCode); - } - - if (typeof errorMessage === 'string') { - return errorMessage; - } - - if (verbose && typeof error.responseText === 'string') { - return error.responseText; - } - - return null; - } - - private connectionErrorToMessage(error: ConnectionError, verbose: boolean): string { - let details = this.connectionErrorDetailsToMessage(error, verbose); - - // Status Code based Error - if (error.status === 401) { - if (typeof details === 'string') { - return nls.localize( - { - key: 'error.permission.verbose', - comment: [ - '{0} represents detailed information why the permission got denied' - ] - }, - "Permission Denied (HTTP {0})", - details); - } - - return nls.localize('error.permission', "Permission Denied"); - } - - // Return error details if present - if (details) { - return details; - } - - // Fallback to HTTP Status and Code - if (error.status > 0 && typeof error.statusText === 'string') { - if (verbose && typeof error.responseText === 'string' && error.responseText.length > 0) { - return nls.localize('error.http.verbose', "{0} (HTTP {1}: {2})", error.statusText, error.status, error.responseText); - } - - return nls.localize('error.http', "{0} (HTTP {1})", error.statusText, error.status); - } - - // Finally its an Unknown Connection Error - if (verbose && typeof error.responseText === 'string' && error.responseText.length > 0) { - return nls.localize('error.connection.unknown.verbose', "Unknown Connection Error ({0})", error.responseText); - } - - return nls.localize('error.connection.unknown', "An unknown connection error occurred. Either you are no longer connected to the internet or the server you are connected to is offline."); - } -} - -// Bug: Can not subclass a JS Type. Do it manually (as done in WinJS.Class.derive) -objects.derive(Error, ConnectionError); - -function xhrToErrorMessage(xhr: IConnectionErrorData, verbose: boolean): string { - let ce = new ConnectionError(xhr); - if (verbose) { - return ce.verboseMessage; - } else { - return ce.message; - } -} function exceptionToErrorMessage(exception: any, verbose: boolean): string { if (exception.message) { @@ -182,6 +33,7 @@ function detectSystemErrorMessage(exception: any): string { /** * Tries to generate a human readable error message out of the error. If the verbose parameter * is set to true, the error message will include stacktrace details if provided. + * * @returns A string containing the error message. */ export function toErrorMessage(error: any = null, verbose: boolean = false): string { @@ -190,8 +42,8 @@ export function toErrorMessage(error: any = null, verbose: boolean = false): str } if (Array.isArray(error)) { - let errors: any[] = arrays.coalesce(error); - let msg = toErrorMessage(errors[0], verbose); + const errors: any[] = arrays.coalesce(error); + const msg = toErrorMessage(errors[0], verbose); if (errors.length > 1) { return nls.localize('error.moreErrors', "{0} ({1} errors in total)", msg, errors.length); @@ -204,36 +56,14 @@ export function toErrorMessage(error: any = null, verbose: boolean = false): str return error; } - if (!types.isUndefinedOrNull(error.status)) { - return xhrToErrorMessage(error, verbose); - } - if (error.detail) { - let detail = error.detail; + const detail = error.detail; if (detail.error) { - if (detail.error && !types.isUndefinedOrNull(detail.error.status)) { - return xhrToErrorMessage(detail.error, verbose); - } - - if (types.isArray(detail.error)) { - for (let i = 0; i < detail.error.length; i++) { - if (detail.error[i] && !types.isUndefinedOrNull(detail.error[i].status)) { - return xhrToErrorMessage(detail.error[i], verbose); - } - } - } - - else { - return exceptionToErrorMessage(detail.error, verbose); - } + return exceptionToErrorMessage(detail.error, verbose); } if (detail.exception) { - if (!types.isUndefinedOrNull(detail.exception.status)) { - return xhrToErrorMessage(detail.exception, verbose); - } - return exceptionToErrorMessage(detail.exception, verbose); } } diff --git a/src/vs/base/common/objects.ts b/src/vs/base/common/objects.ts index 7b41cbbb1af..a463a8e7c10 100644 --- a/src/vs/base/common/objects.ts +++ b/src/vs/base/common/objects.ts @@ -205,34 +205,6 @@ export function createKeywordMatcher(arr: string[], caseInsensitive: boolean = f } } -/** - * Started from TypeScript's __extends function to make a type a subclass of a specific class. - * Modified to work with properties already defined on the derivedClass, since we can't get TS - * to call this method before the constructor definition. - */ -export function derive(baseClass: any, derivedClass: any): void { - for (let prop in baseClass) { - if (baseClass.hasOwnProperty(prop)) { - derivedClass[prop] = baseClass[prop]; - } - } - - derivedClass = derivedClass || function () { }; - const basePrototype = baseClass.prototype; - const derivedPrototype = derivedClass.prototype; - derivedClass.prototype = Object.create(basePrototype); - - for (let prop in derivedPrototype) { - if (derivedPrototype.hasOwnProperty(prop)) { - // handle getters and setters properly - Object.defineProperty(derivedClass.prototype, prop, Object.getOwnPropertyDescriptor(derivedPrototype, prop)); - } - } - - // Cast to any due to Bug 16188:PropertyDescriptor set and get function should be optional. - Object.defineProperty(derivedClass.prototype, 'constructor', { value: derivedClass, writable: true, configurable: true, enumerable: true }); -} - /** * Calls JSON.Stringify with a replacer to break apart any circular references. * This prevents JSON.stringify from throwing the exception diff --git a/src/vs/base/common/winjs.polyfill.promise.ts b/src/vs/base/common/winjs.polyfill.promise.ts index 65d46c7f076..2b6483ae28b 100644 --- a/src/vs/base/common/winjs.polyfill.promise.ts +++ b/src/vs/base/common/winjs.polyfill.promise.ts @@ -42,14 +42,14 @@ export class PolyfillPromise implements Promise { constructor(winjsPromise: WinJSPromise); constructor(callback: (resolve: (value?: T) => void, reject: (err?: any) => void) => any); - constructor(callback: WinJSPromise | ((resolve: (value?: T) => void, reject: (err?: any) => void) => any)) { + constructor(initOrPromise: WinJSPromise | ((resolve: (value?: T) => void, reject: (err?: any) => void) => any)) { - if (WinJSPromise.is(callback)) { - this._winjsPromise = callback; + if (WinJSPromise.is(initOrPromise)) { + this._winjsPromise = initOrPromise; } else { this._winjsPromise = new WinJSPromise((resolve, reject) => { let initializing = true; - callback(function (value) { + initOrPromise(function (value) { if (!initializing) { resolve(value); } else { @@ -68,10 +68,28 @@ export class PolyfillPromise implements Promise { } then(onFulfilled?: any, onRejected?: any): PolyfillPromise { - return new PolyfillPromise(this._winjsPromise.then(onFulfilled, onRejected)); + let sync = true; + let promise = new PolyfillPromise(this._winjsPromise.then( + onFulfilled && function (value) { + if (!sync) { + onFulfilled(value); + } else { + setImmediate(onFulfilled, value); + } + }, + onRejected && function (err) { + if (!sync) { + onFulfilled(err); + } else { + setImmediate(onFulfilled, err); + } + } + )); + sync = false; + return promise; } catch(onRejected?: any): PolyfillPromise { - return new PolyfillPromise(this._winjsPromise.then(null, onRejected)); + return this.then(null, onRejected); } } diff --git a/src/vs/base/test/common/errors.test.ts b/src/vs/base/test/common/errors.test.ts index 04a4de98a5f..1b39dd55098 100644 --- a/src/vs/base/test/common/errors.test.ts +++ b/src/vs/base/test/common/errors.test.ts @@ -13,33 +13,12 @@ suite('Errors', () => { assert.strictEqual(toErrorMessage(new Error('Foo Bar')), 'Foo Bar'); let error: any = new Error(); - error.status = 404; - error.statusText = 'Not Found'; - assert.strictEqual(toErrorMessage(error), 'Not Found (HTTP 404)'); - error = new Error(); error.detail = {}; error.detail.exception = {}; error.detail.exception.message = 'Foo Bar'; assert.strictEqual(toErrorMessage(error), 'Foo Bar'); - error = new Error(); - error.detail = {}; - error.detail.error = {}; - error.detail.error.status = 404; - error.detail.error.statusText = 'Not Found'; - assert.strictEqual(toErrorMessage(error), 'Not Found (HTTP 404)'); - - error = new Error(); - error.detail = {}; - error.detail.error = []; - - let foo: any = {}; - error.detail.error.push(foo); - foo.status = 404; - foo.statusText = 'Not Found'; - assert.strictEqual(toErrorMessage(error), 'Not Found (HTTP 404)'); - assert(toErrorMessage()); assert(toErrorMessage(null)); assert(toErrorMessage({})); diff --git a/src/vs/base/test/common/objects.test.ts b/src/vs/base/test/common/objects.test.ts index 3ee70c7d407..5a05e1f5be4 100644 --- a/src/vs/base/test/common/objects.test.ts +++ b/src/vs/base/test/common/objects.test.ts @@ -138,42 +138,6 @@ suite('Objects', () => { }); }); - test('derive', function () { - - let someValue = 2; - - function Base(): void { - //example - } - (Base).favoriteColor = 'blue'; - Base.prototype.test = function () { return 42; }; - - function Child(): void { - //example - } - Child.prototype.test2 = function () { return 43; }; - Object.defineProperty(Child.prototype, 'getter', { - get: function () { return someValue; }, - enumerable: true, - configurable: true - }); - - objects.derive(Base, Child); - - let base = new Base(); - let child = new Child(); - - assert(base instanceof Base); - assert(child instanceof Child); - - assert.strictEqual(base.test, child.test); - assert.strictEqual(base.test(), 42); - assert.strictEqual(child.test2(), 43); - assert.strictEqual((Child).favoriteColor, 'blue'); - someValue = 4; - assert.strictEqual(child.getter, 4); - }); - test('distinct', function () { let base = { one: 'one', diff --git a/src/vs/base/test/common/winjs.polyfill.promise.test.ts b/src/vs/base/test/common/winjs.polyfill.promise.test.ts index 5114888d419..0b60154b345 100644 --- a/src/vs/base/test/common/winjs.polyfill.promise.test.ts +++ b/src/vs/base/test/common/winjs.polyfill.promise.test.ts @@ -51,6 +51,33 @@ suite('Polyfill Promise', function () { }); }); + test('sync-then, NativePromise', function () { + const actual: string[] = []; + const promise = Promise.resolve(123).then(() => actual.push('inThen')); + actual.push('afterThen'); + return promise.then(() => { + assert.deepEqual(actual, ['afterThen', 'inThen']); + }); + }); + + test('sync-then, WinJSPromise', function () { + const actual: string[] = []; + const promise = WinJSPromise.as(123).then(() => actual.push('inThen')); + actual.push('afterThen'); + return promise.then(() => { + assert.deepEqual(actual, ['inThen', 'afterThen']); + }); + }); + + test('sync-then, PolyfillPromise', function () { + const actual: string[] = []; + const promise = PolyfillPromise.resolve(123).then(() => actual.push('inThen')); + actual.push('afterThen'); + return promise.then(() => { + assert.deepEqual(actual, ['afterThen', 'inThen']); + }); + }); + test('PolyfillPromise, executor has two params', function () { return new PolyfillPromise(function () { assert.equal(arguments.length, 2); diff --git a/src/vs/editor/contrib/linesOperations/linesOperations.ts b/src/vs/editor/contrib/linesOperations/linesOperations.ts index 276f2801815..0adba6a3994 100644 --- a/src/vs/editor/contrib/linesOperations/linesOperations.ts +++ b/src/vs/editor/contrib/linesOperations/linesOperations.ts @@ -154,10 +154,15 @@ abstract class AbstractSortLinesAction extends EditorAction { return; } - var command = new SortLinesCommand(editor.getSelection(), this.descending); + var commands: ICommand[] = []; + var selections = editor.getSelections(); + + for (var i = 0; i < selections.length; i++) { + commands.push(new SortLinesCommand(selections[i], this.descending)); + } editor.pushUndoStop(); - editor.executeCommands(this.id, [command]); + editor.executeCommands(this.id, commands); editor.pushUndoStop(); } } diff --git a/src/vs/editor/contrib/quickFix/lightBulbWidget.css b/src/vs/editor/contrib/quickFix/lightBulbWidget.css index fdd8446630b..3608547dd98 100644 --- a/src/vs/editor/contrib/quickFix/lightBulbWidget.css +++ b/src/vs/editor/contrib/quickFix/lightBulbWidget.css @@ -12,11 +12,6 @@ padding-left: 2px; } -.monaco-editor .lightbulb-glyph.hidden { - display: none; - visibility: hidden; -} - .monaco-editor .lightbulb-glyph:hover { cursor: pointer; /* transform: scale(1.3, 1.3); */ diff --git a/src/vs/editor/contrib/quickFix/lightBulbWidget.ts b/src/vs/editor/contrib/quickFix/lightBulbWidget.ts index b920ccb714d..70859d7e5a0 100644 --- a/src/vs/editor/contrib/quickFix/lightBulbWidget.ts +++ b/src/vs/editor/contrib/quickFix/lightBulbWidget.ts @@ -62,11 +62,9 @@ export class LightBulbWidget implements IDisposable, IContentWidget { // is being pressed -> hide the lightbulb and block future // showings until mouse is released this.hide(); - dom.addClass(this._domNode, 'hidden'); const monitor = new GlobalMouseMoveMonitor(); monitor.startMonitoring(standardMouseMoveMerger, () => { }, () => { monitor.dispose(); - dom.removeClass(this._domNode, 'hidden'); }); })); this._disposables.push(this._editor.onDidChangeConfiguration(e => { diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 2d26d7d8f30..e5498798924 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -157,6 +157,7 @@ export interface IGalleryExtension { assets: IGalleryExtensionAssets; properties: IGalleryExtensionProperties; telemetryData: any; + preview: boolean; } export interface IGalleryMetadata { @@ -324,4 +325,4 @@ export interface IExtensionTipsService { export const ExtensionsLabel = localize('extensions', "Extensions"); export const ExtensionsChannelId = 'extensions'; -export const PreferencesLabel = localize('preferences', "Preferences"); \ No newline at end of file +export const PreferencesLabel = localize('preferences', "Preferences"); diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 2aea1427cd5..c46718b0640 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -54,6 +54,7 @@ interface IRawGalleryExtension { publisher: { displayName: string, publisherId: string, publisherName: string; }; versions: IRawGalleryExtensionVersion[]; statistics: IRawGalleryExtensionStatistics[]; + flags: string; } interface IRawGalleryQueryResult { @@ -252,6 +253,10 @@ function getEngine(version: IRawGalleryExtensionVersion): string { return (values.length > 0 && values[0].value) || ''; } +function getIsPreview(flags: string): boolean { + return flags.indexOf('preview') !== -1; +} + function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUrl: string, index: number, query: Query, querySource?: string): IGalleryExtension { const [version] = galleryExtension.versions; const assets = { @@ -296,7 +301,8 @@ function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUr index: ((query.pageNumber - 1) * query.pageSize) + index, searchText: query.searchText, querySource - } + }, + preview: getIsPreview(galleryExtension.flags) }; } diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index c655d1e74b7..335d49822f9 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -75,7 +75,7 @@ function readManifest(extensionPath: string): TPromise<{ manifest: IExtensionMan interface InstallableExtension { zipPath: string; id: string; - metadata: IGalleryMetadata; + metadata?: IGalleryMetadata; current?: ILocalExtension; } @@ -123,17 +123,14 @@ export class ExtensionManagementService implements IExtensionManagementService { this._onInstallExtension.fire({ identifier, zipPath }); - return this.galleryService.query({ names: [getGalleryExtensionId(manifest.publisher, manifest.name)], pageSize: 1 }) - .then(galleryResult => { - const galleryExtension = galleryResult.firstPage[0]; - const metadata = galleryExtension ? { id: galleryExtension.identifier.uuid, publisherDisplayName: galleryExtension.publisherDisplayName, publisherId: galleryExtension.publisherId } : null; - return this.installExtension({ zipPath, id: identifier.id, metadata }) - .then( - local => this._onDidInstallExtension.fire({ identifier, zipPath, local }), - error => { this._onDidInstallExtension.fire({ identifier, zipPath, error }); return TPromise.wrapError(error); } - ); - }); - + return this.getMetadata(getGalleryExtensionId(manifest.publisher, manifest.name)) + .then( + metadata => this.installExtension({ zipPath, id: identifier.id, metadata }), + error => this.installExtension({ zipPath, id: identifier.id })) + .then( + local => this._onDidInstallExtension.fire({ identifier, zipPath, local }), + error => { this._onDidInstallExtension.fire({ identifier, zipPath, error }); return TPromise.wrapError(error); } + ); }); }); } @@ -298,6 +295,14 @@ export class ExtensionManagementService implements IExtensionManagementService { .then(() => local); } + private getMetadata(extensionName: string): TPromise { + return this.galleryService.query({ names: [extensionName], pageSize: 1 }) + .then(galleryResult => { + const galleryExtension = galleryResult.firstPage[0]; + return galleryExtension ? { id: galleryExtension.identifier.uuid, publisherDisplayName: galleryExtension.publisherDisplayName, publisherId: galleryExtension.publisherId } : null; + }); + } + private checkForRename(currentExtension: ILocalExtension, newExtension: ILocalExtension): TPromise { // Check if the gallery id for current and new exensions are same, if not, remove the current one. if (currentExtension && getGalleryExtensionIdFromLocal(currentExtension) !== getGalleryExtensionIdFromLocal(newExtension)) { diff --git a/src/vs/platform/lifecycle/common/lifecycle.ts b/src/vs/platform/lifecycle/common/lifecycle.ts index 2e96135e9b6..4a4dfa4baec 100644 --- a/src/vs/platform/lifecycle/common/lifecycle.ts +++ b/src/vs/platform/lifecycle/common/lifecycle.ts @@ -49,7 +49,7 @@ export enum LifecyclePhase { Starting = 1, Restoring = 2, Running = 3, - RunningForABit = 4, + Eventually = 4, ShuttingDown = 5 } diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index 5c9d499cf76..6d1714379a5 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -64,7 +64,6 @@ export class TabsTitleControl extends TitleControl { private tabDisposeables: IDisposable[]; private blockRevealActiveTab: boolean; private dimension: Dimension; - private editorToolbarWidth: number; constructor( @IContextMenuService contextMenuService: IContextMenuService, @@ -87,7 +86,6 @@ export class TabsTitleControl extends TitleControl { this.tabDisposeables = []; this.editorLabels = []; - this.editorToolbarWidth = 0; } protected initActions(services: IInstantiationService): void { @@ -541,25 +539,6 @@ export class TabsTitleControl extends TitleControl { return tabContainer; } - public updateEditorActionsToolbar(): void { - super.updateEditorActionsToolbar(); - - this.editorToolbarWidth = this.getElementWidth(this.editorToolbarContainer); - } - - protected clearEditorActionsToolbar(): void { - super.clearEditorActionsToolbar(); - - this.editorToolbarWidth = this.getElementWidth(this.editorToolbarContainer); - } - - private getElementWidth(element: HTMLElement): number { - // We are using getBoundingClientRect() over offsetWidth for a reason: only the former will return subpixel sizes - // whereas the other (offsetWidth) will round the value to the nearest number. For our layout code we really need - // the sizes with their fractions to not cause rounding issues. - return element.getBoundingClientRect().width; - } - public layout(dimension: Dimension): void { if (!this.activeTab || !dimension) { return; @@ -567,7 +546,7 @@ export class TabsTitleControl extends TitleControl { this.dimension = dimension; - const visibleContainerWidth = this.dimension.width - this.editorToolbarWidth; + const visibleContainerWidth = this.tabsContainer.offsetWidth; const totalContainerWidth = this.tabsContainer.scrollWidth; // Update scrollbar diff --git a/src/vs/workbench/common/contributions.ts b/src/vs/workbench/common/contributions.ts index a9b752f982c..3d4122fcb32 100644 --- a/src/vs/workbench/common/contributions.ts +++ b/src/vs/workbench/common/contributions.ts @@ -72,20 +72,33 @@ export class WorkbenchContributionsRegistry implements IWorkbenchContributionsRe this.instantiationService = instantiationService; this.lifecycleService = lifecycleService; - [LifecyclePhase.Starting, LifecyclePhase.Restoring, LifecyclePhase.Running, LifecyclePhase.RunningForABit, LifecyclePhase.ShuttingDown].forEach(phase => { + [LifecyclePhase.Starting, LifecyclePhase.Restoring, LifecyclePhase.Running, LifecyclePhase.Eventually, LifecyclePhase.ShuttingDown].forEach(phase => { this.instantiateByPhase(instantiationService, lifecycleService, phase); }); } private instantiateByPhase(instantiationService: IInstantiationService, lifecycleService: ILifecycleService, phase: LifecyclePhase): void { - lifecycleService.when(phase).then(() => { - const toBeInstantiated = this.toBeInstantiated.get(phase); - if (toBeInstantiated) { - while (toBeInstantiated.length > 0) { - instantiationService.createInstance(toBeInstantiated.shift()); - } + + // Instantiate contributions directly when phase is already reached + if (lifecycleService.phase >= phase) { + this.doInstantiateByPhase(instantiationService, phase); + } + + // Otherwise wait for phase to be reached + else { + lifecycleService.when(phase).then(() => { + this.doInstantiateByPhase(instantiationService, phase); + }); + } + } + + private doInstantiateByPhase(instantiationService: IInstantiationService, phase: LifecyclePhase): void { + const toBeInstantiated = this.toBeInstantiated.get(phase); + if (toBeInstantiated) { + while (toBeInstantiated.length > 0) { + instantiationService.createInstance(toBeInstantiated.shift()); } - }); + } } } diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 215dfaf1822..5c79cd45050 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -205,7 +205,7 @@ export class WorkbenchShell { // Set lifecycle phase to `Runnning For A Bit` after a short delay let timeoutHandle = setTimeout(() => { timeoutHandle = void 0; - this.lifecycleService.phase = LifecyclePhase.RunningForABit; + this.lifecycleService.phase = LifecyclePhase.Eventually; }, 3000); this.toUnbind.push({ dispose: () => { diff --git a/src/vs/workbench/parts/cache/node/cache.contribution.ts b/src/vs/workbench/parts/cache/node/cache.contribution.ts index cfff67d93ed..06f4bd0392a 100644 --- a/src/vs/workbench/parts/cache/node/cache.contribution.ts +++ b/src/vs/workbench/parts/cache/node/cache.contribution.ts @@ -11,4 +11,4 @@ import { NodeCachedDataManager } from 'vs/workbench/parts/cache/node/nodeCachedD import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; // Register NodeCachedDataManager Contribution -Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(NodeCachedDataManager, LifecyclePhase.Running); \ No newline at end of file +Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(NodeCachedDataManager, LifecyclePhase.Eventually); \ No newline at end of file diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 0d9baaf5f7d..eb6472aae64 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -753,12 +753,13 @@ export class DebugService implements debug.IDebugService { return TPromise.wrapError(errors.create(message, { actions: [this.instantiationService.createInstance(debugactions.ConfigureAction, debugactions.ConfigureAction.ID, debugactions.ConfigureAction.LABEL), CloseAction] })); } + this.toDisposeOnSessionEnd.set(sessionId, []); const debugAnywayAction = new Action('debug.continue', nls.localize('debugAnyway', "Debug Anyway"), null, true, () => { this.messageService.hideAll(); return this.doCreateProcess(root, resolvedConfig, sessionId); }); - return this.runPreLaunchTask(root, resolvedConfig.preLaunchTask).then((taskSummary: ITaskSummary) => { + return this.runPreLaunchTask(sessionId, root, resolvedConfig.preLaunchTask).then((taskSummary: ITaskSummary) => { const errorCount = resolvedConfig.preLaunchTask ? this.markerService.getStatistics().errors : 0; const successExitCode = taskSummary && taskSummary.exitCode === 0; const failureExitCode = taskSummary && taskSummary.exitCode !== undefined && taskSummary.exitCode !== 0; @@ -845,7 +846,6 @@ export class DebugService implements debug.IDebugService { const process = this.model.addProcess(configuration, session); this.allProcesses.set(process.getId(), process); - this.toDisposeOnSessionEnd.set(session.getId(), []); if (client) { this.toDisposeOnSessionEnd.get(session.getId()).push(client); } @@ -946,7 +946,7 @@ export class DebugService implements debug.IDebugService { }); } - private runPreLaunchTask(root: IWorkspaceFolder, taskName: string): TPromise { + private runPreLaunchTask(sessionId: string, root: IWorkspaceFolder, taskName: string): TPromise { if (!taskName) { return TPromise.as(null); } @@ -957,29 +957,29 @@ export class DebugService implements debug.IDebugService { return TPromise.wrapError(errors.create(nls.localize('DebugTaskNotFound', "Could not find the preLaunchTask \'{0}\'.", taskName))); } + // If a task is missing the problem matcher the promise will never complete, so we need to have a workaround #35340 + let taskStarted = false; const promise = this.taskService.getActiveTasks().then(tasks => { if (tasks.filter(t => t._id === task._id).length) { // task is already running - nothing to do. return TPromise.as(null); } + this.toDisposeOnSessionEnd.get(sessionId).push(this.taskService.addOneTimeListener(TaskServiceEvents.Active, () => taskStarted = true)); const taskPromise = this.taskService.run(task); if (task.isBackground) { - return new TPromise((c, e) => this.toDispose.push(this.taskService.addOneTimeListener(TaskServiceEvents.Inactive, () => c(null)))); + return new TPromise((c, e) => this.toDisposeOnSessionEnd.get(sessionId).push(this.taskService.addOneTimeListener(TaskServiceEvents.Inactive, () => c(null)))); } return taskPromise; }); return new TPromise((c, e) => { - // If a task is missing the problem matcher the promise will never complete, so we need to have a workaround #35340 - let taskStarted = false; promise.then(result => { taskStarted = true; c(result); }, error => e(error)); - this.toDispose.push(this.taskService.addOneTimeListener(TaskServiceEvents.Active, () => taskStarted = true)); setTimeout(() => { if (!taskStarted) { e({ severity: severity.Error, message: nls.localize('taskNotTracked', "The preLaunchTask '{0}' cannot be tracked.", taskName) }); diff --git a/src/vs/workbench/parts/extensions/browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/browser/extensionEditor.ts index c3de8c37701..5a18d080734 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionEditor.ts @@ -153,6 +153,7 @@ export class ExtensionEditor extends BaseEditor { private icon: HTMLImageElement; private name: HTMLElement; private identifier: HTMLElement; + private preview: HTMLElement; private license: HTMLElement; private publisher: HTMLElement; private installCount: HTMLElement; @@ -215,6 +216,7 @@ export class ExtensionEditor extends BaseEditor { const title = append(details, $('.title')); this.name = append(title, $('span.name.clickable', { title: localize('name', "Extension name") })); this.identifier = append(title, $('span.identifier', { title: localize('extension id', "Extension identifier") })); + this.preview = append(title, $('span.preview', { title: localize('preview', "Preview") })); const subtitle = append(details, $('.subtitle')); this.publisher = append(subtitle, $('span.publisher.clickable', { title: localize('publisher', "Publisher name") })); @@ -286,6 +288,11 @@ export class ExtensionEditor extends BaseEditor { this.name.textContent = extension.displayName; this.identifier.textContent = extension.id; + if (extension.preview) { + this.preview.textContent = localize('preview', "Preview"); + } else { + this.preview.textContent = null; + } this.publisher.textContent = extension.publisherDisplayName; this.description.textContent = extension.description; diff --git a/src/vs/workbench/parts/extensions/browser/media/extensionEditor.css b/src/vs/workbench/parts/extensions/browser/media/extensionEditor.css index 424f575504b..5d8a88b28a9 100644 --- a/src/vs/workbench/parts/extensions/browser/media/extensionEditor.css +++ b/src/vs/workbench/parts/extensions/browser/media/extensionEditor.css @@ -62,6 +62,19 @@ white-space: nowrap; } +.vs .extension-editor > .header > .details > .title > .preview { + color: white; +} + +.extension-editor > .header > .details > .title > .preview { + background: rgb(214, 63, 38); + font-size: 10px; + font-style: italic; + margin-left: 10px; + padding: 0px 4px; + border-radius: 4px; +} + .extension-editor > .header > .details > .subtitle { padding-top: 6px; white-space: nowrap; @@ -324,4 +337,4 @@ font-size: 90%; font-weight: 600; opacity: 0.6; -} \ No newline at end of file +} diff --git a/src/vs/workbench/parts/extensions/common/extensions.ts b/src/vs/workbench/parts/extensions/common/extensions.ts index 77f73126299..6fa50545276 100644 --- a/src/vs/workbench/parts/extensions/common/extensions.ts +++ b/src/vs/workbench/parts/extensions/common/extensions.ts @@ -48,6 +48,7 @@ export interface IExtension { disabledForWorkspace: boolean; dependencies: string[]; telemetryData: any; + preview: boolean; getManifest(): TPromise; getReadme(): TPromise; getChangelog(): TPromise; @@ -88,4 +89,4 @@ export const AutoUpdateConfigurationKey = 'extensions.autoUpdate'; export interface IExtensionsConfiguration { autoUpdate: boolean; ignoreRecommendations: boolean; -} \ No newline at end of file +} diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts index ff925777e32..89aaf329396 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts @@ -179,6 +179,10 @@ class Extension implements IExtension { } } + get preview(): boolean { + return this.gallery ? this.gallery.preview : false; + } + getManifest(): TPromise { if (this.gallery) { if (this.gallery.assets.manifest) { @@ -935,4 +939,4 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { this.syncDelayer.cancel(); this.disposables = dispose(this.disposables); } -} \ No newline at end of file +} diff --git a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts index 43ae1f24075..2dc55faba6d 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts @@ -31,7 +31,7 @@ class OpenSCMViewletAction extends ToggleViewletAction { } Registry.as(WorkbenchExtensions.Workbench) - .registerWorkbenchContribution(DirtyDiffWorkbenchController, LifecyclePhase.Starting); + .registerWorkbenchContribution(DirtyDiffWorkbenchController, LifecyclePhase.Running); const viewletDescriptor = new ViewletDescriptor( SCMViewlet, @@ -45,10 +45,10 @@ Registry.as(ViewletExtensions.Viewlets) .registerViewlet(viewletDescriptor); Registry.as(WorkbenchExtensions.Workbench) - .registerWorkbenchContribution(StatusUpdater, LifecyclePhase.Starting); + .registerWorkbenchContribution(StatusUpdater, LifecyclePhase.Running); Registry.as(WorkbenchExtensions.Workbench) - .registerWorkbenchContribution(StatusBarController, LifecyclePhase.Starting); + .registerWorkbenchContribution(StatusBarController, LifecyclePhase.Running); // Register Action to Open Viewlet Registry.as(WorkbenchActionExtensions.WorkbenchActions).registerWorkbenchAction( diff --git a/src/vs/workbench/parts/stats/node/stats.contribution.ts b/src/vs/workbench/parts/stats/node/stats.contribution.ts index 1703314f940..b50700962fa 100644 --- a/src/vs/workbench/parts/stats/node/stats.contribution.ts +++ b/src/vs/workbench/parts/stats/node/stats.contribution.ts @@ -11,4 +11,4 @@ import { WorkspaceStats } from 'vs/workbench/parts/stats/node/workspaceStats'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; // Register Workspace Stats Contribution -Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(WorkspaceStats, LifecyclePhase.RunningForABit); \ No newline at end of file +Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(WorkspaceStats, LifecyclePhase.Eventually); \ No newline at end of file diff --git a/src/vs/workbench/services/files/node/fileService.ts b/src/vs/workbench/services/files/node/fileService.ts index 1a2e674d202..ff00f3e20b4 100644 --- a/src/vs/workbench/services/files/node/fileService.ts +++ b/src/vs/workbench/services/files/node/fileService.ts @@ -372,7 +372,11 @@ export class FileService implements IFileService { decoder.end(); } if (fd) { - fs.close(fd, err => { }); + fs.close(fd, err => { + if (err) { + this.options.errorLogger(err.toString()); + } + }); } }; diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/company.js b/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/company.js new file mode 100644 index 00000000000..107f3438401 --- /dev/null +++ b/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/company.js @@ -0,0 +1,23 @@ +'use strict'; +/// +var Workforce; +(function (Workforce_1) { + var Company = (function () { + function Company() { + } + return Company; + })(); + (function (property, Workforce, IEmployee) { + if (property === void 0) { property = employees; } + if (IEmployee === void 0) { IEmployee = []; } + property; + calculateMonthlyExpenses(); + { + var result = 0; + for (var i = 0; i < employees.length; i++) { + result += employees[i].calculatePay(); + } + return result; + } + }); +})(Workforce || (Workforce = {})); diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/conway.js b/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/conway.js new file mode 100644 index 00000000000..837ce84f503 --- /dev/null +++ b/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/conway.js @@ -0,0 +1,117 @@ +'use strict'; +var Conway; +(function (Conway) { + var Cell = (function () { + function Cell() { + } + return Cell; + })(); + (function (property, number, property, number, property, boolean) { + if (property === void 0) { property = row; } + if (property === void 0) { property = col; } + if (property === void 0) { property = live; } + }); + var GameOfLife = (function () { + function GameOfLife() { + } + return GameOfLife; + })(); + (function () { + property; + gridSize = 50; + property; + canvasSize = 600; + property; + lineColor = '#cdcdcd'; + property; + liveColor = '#666'; + property; + deadColor = '#eee'; + property; + initialLifeProbability = 0.5; + property; + animationRate = 60; + property; + cellSize = 0; + property; + context: ICanvasRenderingContext2D; + property; + world = createWorld(); + circleOfLife(); + function createWorld() { + return travelWorld(function (cell) { + cell.live = Math.random() < initialLifeProbability; + return cell; + }); + } + function circleOfLife() { + world = travelWorld(function (cell) { + cell = world[cell.row][cell.col]; + draw(cell); + return resolveNextGeneration(cell); + }); + setTimeout(function () { circleOfLife(); }, animationRate); + } + function resolveNextGeneration(cell) { + var count = countNeighbors(cell); + var newCell = new Cell(cell.row, cell.col, cell.live); + if (count < 2 || count > 3) + newCell.live = false; + else if (count == 3) + newCell.live = true; + return newCell; + } + function countNeighbors(cell) { + var neighbors = 0; + for (var row = -1; row <= 1; row++) { + for (var col = -1; col <= 1; col++) { + if (row == 0 && col == 0) + continue; + if (isAlive(cell.row + row, cell.col + col)) { + neighbors++; + } + } + } + return neighbors; + } + function isAlive(row, col) { + // todo - need to guard with worl[row] exists? + if (row < 0 || col < 0 || row >= gridSize || col >= gridSize) + return false; + return world[row][col].live; + } + function travelWorld(callback) { + var result = []; + for (var row = 0; row < gridSize; row++) { + var rowData = []; + for (var col = 0; col < gridSize; col++) { + rowData.push(callback(new Cell(row, col, false))); + } + result.push(rowData); + } + return result; + } + function draw(cell) { + if (context == null) + context = createDrawingContext(); + if (cellSize == 0) + cellSize = canvasSize / gridSize; + context.strokeStyle = lineColor; + context.strokeRect(cell.row * cellSize, cell.col * cellSize, cellSize, cellSize); + context.fillStyle = cell.live ? liveColor : deadColor; + context.fillRect(cell.row * cellSize, cell.col * cellSize, cellSize, cellSize); + } + function createDrawingContext() { + var canvas = document.getElementById('conway-canvas'); + if (canvas == null) { + canvas = document.createElement('canvas'); + canvas.id = "conway-canvas"; + canvas.width = canvasSize; + canvas.height = canvasSize; + document.body.appendChild(canvas); + } + return canvas.getContext('2d'); + } + }); +})(Conway || (Conway = {})); +var game = new Conway.GameOfLife(); diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/employee.js b/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/employee.js new file mode 100644 index 00000000000..1f4cc1b1ea7 --- /dev/null +++ b/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/employee.js @@ -0,0 +1,38 @@ +'use strict'; +var Workforce; +(function (Workforce) { + var Employee = (function () { + function Employee() { + } + return Employee; + })(); + (property); + name: string, property; + basepay: number; + implements; + IEmployee; + { + name; + basepay; + } + var SalesEmployee = (function () { + function SalesEmployee() { + } + return SalesEmployee; + })(); + (); + Employee(name, basepay); + { + function calculatePay() { + var multiplier = (document.getElementById("mult")), as = any, value; + return _super.calculatePay.call(this) * multiplier + bonus; + } + } + var employee = new Employee('Bob', 1000); + var salesEmployee = new SalesEmployee('Jim', 800, 400); + salesEmployee.calclatePay(); // error: No member 'calclatePay' on SalesEmployee +})(Workforce || (Workforce = {})); +extern; +var $; +var s = Workforce.salesEmployee.calculatePay(); +$('#results').text(s); diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/small.js b/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/small.js new file mode 100644 index 00000000000..ba777851242 --- /dev/null +++ b/src/vs/workbench/services/files/test/node/fixtures/resolver/examples/small.js @@ -0,0 +1,24 @@ +'use strict'; +var M; +(function (M) { + var C = (function () { + function C() { + } + return C; + })(); + (function (x, property, number) { + if (property === void 0) { property = w; } + var local = 1; + // unresolved symbol because x is local + //self.x++; + self.w--; // ok because w is a property + property; + f = function (y) { + return y + x + local + w + self.w; + }; + function sum(z) { + return z + f(z) + w + self.w; + } + }); +})(M || (M = {})); +var c = new M.C(12, 5); diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/index.html b/src/vs/workbench/services/files/test/node/fixtures/resolver/index.html new file mode 100644 index 00000000000..c037f44fb6c --- /dev/null +++ b/src/vs/workbench/services/files/test/node/fixtures/resolver/index.html @@ -0,0 +1,121 @@ + + + + + Strada + + + + + + + + +

TypeScript

+
+ + +
+ + +
+ +
Press 'run' to execute code...
+
...write your results into #results...
+
+ + + diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/company.js b/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/company.js new file mode 100644 index 00000000000..107f3438401 --- /dev/null +++ b/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/company.js @@ -0,0 +1,23 @@ +'use strict'; +/// +var Workforce; +(function (Workforce_1) { + var Company = (function () { + function Company() { + } + return Company; + })(); + (function (property, Workforce, IEmployee) { + if (property === void 0) { property = employees; } + if (IEmployee === void 0) { IEmployee = []; } + property; + calculateMonthlyExpenses(); + { + var result = 0; + for (var i = 0; i < employees.length; i++) { + result += employees[i].calculatePay(); + } + return result; + } + }); +})(Workforce || (Workforce = {})); diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/conway.js b/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/conway.js new file mode 100644 index 00000000000..837ce84f503 --- /dev/null +++ b/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/conway.js @@ -0,0 +1,117 @@ +'use strict'; +var Conway; +(function (Conway) { + var Cell = (function () { + function Cell() { + } + return Cell; + })(); + (function (property, number, property, number, property, boolean) { + if (property === void 0) { property = row; } + if (property === void 0) { property = col; } + if (property === void 0) { property = live; } + }); + var GameOfLife = (function () { + function GameOfLife() { + } + return GameOfLife; + })(); + (function () { + property; + gridSize = 50; + property; + canvasSize = 600; + property; + lineColor = '#cdcdcd'; + property; + liveColor = '#666'; + property; + deadColor = '#eee'; + property; + initialLifeProbability = 0.5; + property; + animationRate = 60; + property; + cellSize = 0; + property; + context: ICanvasRenderingContext2D; + property; + world = createWorld(); + circleOfLife(); + function createWorld() { + return travelWorld(function (cell) { + cell.live = Math.random() < initialLifeProbability; + return cell; + }); + } + function circleOfLife() { + world = travelWorld(function (cell) { + cell = world[cell.row][cell.col]; + draw(cell); + return resolveNextGeneration(cell); + }); + setTimeout(function () { circleOfLife(); }, animationRate); + } + function resolveNextGeneration(cell) { + var count = countNeighbors(cell); + var newCell = new Cell(cell.row, cell.col, cell.live); + if (count < 2 || count > 3) + newCell.live = false; + else if (count == 3) + newCell.live = true; + return newCell; + } + function countNeighbors(cell) { + var neighbors = 0; + for (var row = -1; row <= 1; row++) { + for (var col = -1; col <= 1; col++) { + if (row == 0 && col == 0) + continue; + if (isAlive(cell.row + row, cell.col + col)) { + neighbors++; + } + } + } + return neighbors; + } + function isAlive(row, col) { + // todo - need to guard with worl[row] exists? + if (row < 0 || col < 0 || row >= gridSize || col >= gridSize) + return false; + return world[row][col].live; + } + function travelWorld(callback) { + var result = []; + for (var row = 0; row < gridSize; row++) { + var rowData = []; + for (var col = 0; col < gridSize; col++) { + rowData.push(callback(new Cell(row, col, false))); + } + result.push(rowData); + } + return result; + } + function draw(cell) { + if (context == null) + context = createDrawingContext(); + if (cellSize == 0) + cellSize = canvasSize / gridSize; + context.strokeStyle = lineColor; + context.strokeRect(cell.row * cellSize, cell.col * cellSize, cellSize, cellSize); + context.fillStyle = cell.live ? liveColor : deadColor; + context.fillRect(cell.row * cellSize, cell.col * cellSize, cellSize, cellSize); + } + function createDrawingContext() { + var canvas = document.getElementById('conway-canvas'); + if (canvas == null) { + canvas = document.createElement('canvas'); + canvas.id = "conway-canvas"; + canvas.width = canvasSize; + canvas.height = canvasSize; + document.body.appendChild(canvas); + } + return canvas.getContext('2d'); + } + }); +})(Conway || (Conway = {})); +var game = new Conway.GameOfLife(); diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/employee.js b/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/employee.js new file mode 100644 index 00000000000..1f4cc1b1ea7 --- /dev/null +++ b/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/employee.js @@ -0,0 +1,38 @@ +'use strict'; +var Workforce; +(function (Workforce) { + var Employee = (function () { + function Employee() { + } + return Employee; + })(); + (property); + name: string, property; + basepay: number; + implements; + IEmployee; + { + name; + basepay; + } + var SalesEmployee = (function () { + function SalesEmployee() { + } + return SalesEmployee; + })(); + (); + Employee(name, basepay); + { + function calculatePay() { + var multiplier = (document.getElementById("mult")), as = any, value; + return _super.calculatePay.call(this) * multiplier + bonus; + } + } + var employee = new Employee('Bob', 1000); + var salesEmployee = new SalesEmployee('Jim', 800, 400); + salesEmployee.calclatePay(); // error: No member 'calclatePay' on SalesEmployee +})(Workforce || (Workforce = {})); +extern; +var $; +var s = Workforce.salesEmployee.calculatePay(); +$('#results').text(s); diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/small.js b/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/small.js new file mode 100644 index 00000000000..ba777851242 --- /dev/null +++ b/src/vs/workbench/services/files/test/node/fixtures/resolver/other/deep/small.js @@ -0,0 +1,24 @@ +'use strict'; +var M; +(function (M) { + var C = (function () { + function C() { + } + return C; + })(); + (function (x, property, number) { + if (property === void 0) { property = w; } + var local = 1; + // unresolved symbol because x is local + //self.x++; + self.w--; // ok because w is a property + property; + f = function (y) { + return y + x + local + w + self.w; + }; + function sum(z) { + return z + f(z) + w + self.w; + } + }); +})(M || (M = {})); +var c = new M.C(12, 5); diff --git a/src/vs/workbench/services/files/test/node/fixtures/resolver/site.css b/src/vs/workbench/services/files/test/node/fixtures/resolver/site.css new file mode 100644 index 00000000000..f7b51e752bb --- /dev/null +++ b/src/vs/workbench/services/files/test/node/fixtures/resolver/site.css @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/*---------------------------------------------------------- +The base color for this template is #5c87b2. If you'd like +to use a different color start by replacing all instances of +#5c87b2 with your new color. +----------------------------------------------------------*/ +body +{ + background-color: #5c87b2; + font-size: .75em; + font-family: Segoe UI, Verdana, Helvetica, Sans-Serif; + margin: 8px; + padding: 0; + color: #696969; +} + +h1, h2, h3, h4, h5, h6 +{ + color: #000; + font-size: 40px; + margin: 0px; +} + +textarea +{ + font-family: Consolas +} + +#results +{ + margin-top: 2em; + margin-left: 2em; + color: black; + font-size: medium; +} +